/* Replayable replacements for global functions */

/***************************************************************
 * BEGIN STABLE.JS
 **************************************************************/
//! stable.js 0.1.3, https://github.com/Two-Screen/stable
//! © 2012 Stéphan Kochen, Angry Bytes. MIT licensed.
(function() {

// A stable array sort, because `Array#sort()` is not guaranteed stable.
// This is an implementation of merge sort, without recursion.

var stable = function(arr, comp) {
    if (typeof(comp) !== 'function') {
        comp = function(a, b) {
            a = String(a);
            b = String(b);
            if (a < b) return -1;
            if (a > b) return 1;
            return 0;
        };
    }

    var len = arr.length;

    if (len <= 1) return arr;

    // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.
    // Chunks are the size of the left or right hand in merge sort.
    // Stop when the left-hand covers all of the array.
    var oarr = arr;
    for (var chk = 1; chk < len; chk *= 2) {
        arr = pass(arr, comp, chk);
    }
    for (var i = 0; i < len; i++) {
        oarr[i] = arr[i];
    }
    return oarr;
};

// Run a single pass with the given chunk size. Returns a new array.
var pass = function(arr, comp, chk) {
    var len = arr.length;
    // Output, and position.
    var result = new Array(len);
    var i = 0;
    // Step size / double chunk size.
    var dbl = chk * 2;
    // Bounds of the left and right chunks.
    var l, r, e;
    // Iterators over the left and right chunk.
    var li, ri;

    // Iterate over pairs of chunks.
    for (l = 0; l < len; l += dbl) {
        r = l + chk;
        e = r + chk;
        if (r > len) r = len;
        if (e > len) e = len;

        // Iterate both chunks in parallel.
        li = l;
        ri = r;
        while (true) {
            // Compare the chunks.
            if (li < r && ri < e) {
                // This works for a regular `sort()` compatible comparator,
                // but also for a simple comparator like: `a > b`
                if (comp(arr[li], arr[ri]) <= 0) {
                    result[i++] = arr[li++];
                }
                else {
                    result[i++] = arr[ri++];
                }
            }
            // Nothing to compare, just flush what's left.
            else if (li < r) {
                result[i++] = arr[li++];
            }
            else if (ri < e) {
                result[i++] = arr[ri++];
            }
            // Both iterators are at the chunk ends.
            else {
                break;
            }
        }
    }

    return result;
};

var arrsort = function(comp) {
    return stable(this, comp);
};

if (Object.defineProperty) {
    Object.defineProperty(Array.prototype, "sort", {
        configurable: true, writable: true, enumerable: false,
        value: arrsort
    });
} else {
    Array.prototype.sort = arrsort;
}

})();
/***************************************************************
 * END STABLE.JS
 **************************************************************/

/*
 * In a generated replay, this file is partially common, boilerplate code
 * included in every replay, and partially generated replay code. The following
 * header applies to the boilerplate code. A comment indicating "Auto-generated
 * below this comment" marks the separation between these two parts.
 *
 * Copyright (C) 2011, 2012 Purdue University
 * Written by Gregor Richards
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

(function() {
    // global eval alias
    var geval = eval;

    // detect if we're in a browser or not
    var inbrowser = false;
    var inharness = false;
    var finished = false;
    if (typeof window !== "undefined" && "document" in window) {
        inbrowser = true;
        if (window.parent && "JSBNG_handleResult" in window.parent) {
            inharness = true;
        }
    } else if (typeof global !== "undefined") {
        window = global;
        window.top = window;
    } else {
        window = (function() { return this; })();
        window.top = window;
    }

    if ("console" in window) {
        window.JSBNG_Console = window.console;
    }

    var callpath = [];

    // global state
    var JSBNG_Replay = window.top.JSBNG_Replay = {
        push: function(arr, fun) {
            arr.push(fun);
            return fun;
        },

        path: function(str) {
            verifyPath(str);
        },

        forInKeys: function(of) {
            var keys = [];
            for (var k in of)
                keys.push(k);
            return keys.sort();
        }
    };

    var currentTimeInMS;
    if (inharness) {
        currentTimeInMS = window.parent.currentTimeInMS;
    } else {
        if (window.performance && window.performance.now)
            currentTimeInMS = function() { return window.performance.now() };
        else if (typeof preciseTime !== 'undefined')
            currentTimeInMS = function() { return preciseTime() * 1000; };
        else
            currentTimeInMS = function() { return Date.now(); };
    }

    // the actual replay runner
    function onload() {
        try {
            delete window.onload;
        } catch (ex) {}

        var jr = JSBNG_Replay$;
        var cb = function() {
            var end = currentTimeInMS();
            finished = true;

            var msg = "Time: " + (end - st) + "ms";
    
            if (inharness) {
                window.parent.JSBNG_handleResult({error:false, time:(end - st)});
            } else if (inbrowser) {
                var res = document.createElement("div");
    
                res.style.position = "fixed";
                res.style.left = "1em";
                res.style.top = "1em";
                res.style.width = "35em";
                res.style.height = "5em";
                res.style.padding = "1em";
                res.style.backgroundColor = "white";
                res.style.color = "black";
                res.appendChild(document.createTextNode(msg));
    
                document.body.appendChild(res);
            } else if (typeof console !== "undefined") {
                console.log(msg);
            } else if (typeof print !== "undefined") {
                // hopefully not the browser print() function :)
                print(msg);
            }
        };

        // force it to JIT
        jr(false);

        // then time it
        var st = currentTimeInMS();
        while (jr !== null) {
            jr = jr(true, cb);
        }
    }

    // add a frame at replay time
    function iframe(pageid) {
        var iw;
        if (inbrowser) {
            // represent the iframe as an iframe (of course)
            var iframe = document.createElement("iframe");
            iframe.style.display = "none";
            document.body.appendChild(iframe);
            iw = iframe.contentWindow;
            iw.document.write("<script type=\"text/javascript\">var JSBNG_Replay_geval = eval;</script>");
            iw.document.close();
        } else {
            // no general way, just lie and do horrible things
            var topwin = window;
            (function() {
                var window = {};
                window.window = window;
                window.top = topwin;
                window.JSBNG_Replay_geval = function(str) {
                    eval(str);
                }
                iw = window;
            })();
        }
        return iw;
    }

    // called at the end of the replay stuff
    function finalize() {
        if (inbrowser) {
            setTimeout(onload, 0);
        } else {
            onload();
        }
    }

    // verify this recorded value and this replayed value are close enough
    function verify(rep, rec) {
        if (rec !== rep &&
            (rep === rep || rec === rec) /* NaN test */) {
            // FIXME?
            if (typeof rec === "function" && typeof rep === "function") {
                return true;
            }
            if (typeof rec !== "object" || rec === null ||
                !(("__JSBNG_unknown_" + typeof(rep)) in rec)) {
                return false;
            }
        }
        return true;
    }

    // general message
    var firstMessage = true;
    function replayMessage(msg) {
        if (inbrowser) {
            if (firstMessage)
                document.open();
            firstMessage = false;
            document.write(msg);
        } else {
            console.log(msg);
        }
    }

    // complain when there's an error
    function verificationError(msg) {
        if (finished) return;
        if (inharness) {
            window.parent.JSBNG_handleResult({error:true, msg: msg});
        } else replayMessage(msg);
        throw new Error();
    }

    // to verify a set
    function verifySet(objstr, obj, prop, gvalstr, gval) {
        if (/^on/.test(prop)) {
            // these aren't instrumented compatibly
            return;
        }

        if (!verify(obj[prop], gval)) {
            var bval = obj[prop];
            var msg = "Verification failure! " + objstr + "." + prop + " is not " + gvalstr + ", it's " + bval + "!";
            verificationError(msg);
        }
    }

    // to verify a call or new
    function verifyCall(iscall, func, cthis, cargs) {
        var ok = true;
        var callArgs = func.callArgs[func.inst];
        iscall = iscall ? 1 : 0;
        if (cargs.length !== callArgs.length - 1) {
            ok = false;
        } else {
            if (iscall && !verify(cthis, callArgs[0])) ok = false;
            for (var i = 0; i < cargs.length; i++) {
                if (!verify(cargs[i], callArgs[i+1])) ok = false;
            }
        }
        if (!ok) {
            var msg = "Call verification failure!";
            verificationError(msg);
        }

        return func.returns[func.inst++];
    }

    // to verify the callpath
    function verifyPath(func) {
        var real = callpath.shift();
        if (real !== func) {
            var msg = "Call path verification failure! Expected " + real + ", found " + func;
            verificationError(msg);
        }
    }

    // figure out how to define getters
    var defineGetter;
    if (Object.defineProperty) {
        var odp = Object.defineProperty;
        defineGetter = function(obj, prop, getter, setter) {
            if (typeof setter === "undefined") setter = function(){};
            odp(obj, prop, {"enumerable": true, "configurable": true, "get": getter, "set": setter});
        };
    } else if (Object.prototype.__defineGetter__) {
        var opdg = Object.prototype.__defineGetter__;
        var opds = Object.prototype.__defineSetter__;
        defineGetter = function(obj, prop, getter, setter) {
            if (typeof setter === "undefined") setter = function(){};
            opdg.call(obj, prop, getter);
            opds.call(obj, prop, setter);
        };
    } else {
        defineGetter = function() {
            verificationError("This replay requires getters for correct behavior, and your JS engine appears to be incapable of defining getters. Sorry!");
        };
    }

    var defineRegetter = function(obj, prop, getter, setter) {
        defineGetter(obj, prop, function() {
            return getter.call(this, prop);
        }, function(val) {
            // once it's set by the client, it's claimed
            setter.call(this, prop, val);
            Object.defineProperty(obj, prop, {
                "enumerable": true, "configurable": true, "writable": true,
                "value": val
            });
        });
    }

    // for calling events
    var fpc = Function.prototype.call;

// resist the urge, don't put a })(); here!
/******************************************************************************
 * Auto-generated below this comment
 *****************************************************************************/
var ow81632121 = window;
var f81632121_0;
var o0;
var o1;
var o2;
var f81632121_4;
var f81632121_7;
var f81632121_11;
var f81632121_12;
var f81632121_13;
var f81632121_14;
var f81632121_15;
var o3;
var o4;
var o5;
var f81632121_49;
var o6;
var f81632121_51;
var o7;
var f81632121_53;
var f81632121_54;
var f81632121_57;
var f81632121_59;
var f81632121_60;
var f81632121_61;
var f81632121_62;
var f81632121_70;
var f81632121_71;
var f81632121_151;
var f81632121_156;
var f81632121_270;
var f81632121_417;
var f81632121_463;
var f81632121_466;
var f81632121_467;
var f81632121_468;
var f81632121_469;
var f81632121_471;
var o8;
var o9;
var f81632121_474;
var f81632121_476;
var o10;
var f81632121_478;
var f81632121_481;
var f81632121_482;
var o11;
var o12;
var o13;
var o14;
var o15;
var o16;
var o17;
var f81632121_502;
var f81632121_503;
var f81632121_504;
var f81632121_506;
var f81632121_507;
var f81632121_508;
var o18;
var o19;
var f81632121_513;
var o20;
var o21;
var o22;
var o23;
var o24;
var f81632121_521;
var o25;
var o26;
var o27;
var o28;
var o29;
var o30;
var o31;
var o32;
var o33;
var o34;
var fo81632121_553_firstChild;
var o35;
var o36;
var o37;
var o38;
var fo81632121_563_firstChild;
var f81632121_572;
var f81632121_575;
var f81632121_576;
var o39;
var o40;
var fo81632121_582_firstChild;
var f81632121_585;
var f81632121_598;
var o41;
var f81632121_602;
var o42;
var o43;
var f81632121_645;
var fo81632121_700_firstChild;
var o44;
var o45;
var o46;
var o47;
var fo81632121_795_firstChild;
var o48;
var o49;
var o50;
var o51;
var fo81632121_897_firstChild;
var o52;
var o53;
var o54;
var o55;
var o56;
var o57;
var o58;
var o59;
var f81632121_1000;
var fo81632121_1_cookie;
var o60;
var f81632121_1002;
var o61;
var f81632121_1005;
var o62;
var f81632121_1007;
var o63;
var o64;
var o65;
var o66;
var o67;
var o68;
var o69;
var o70;
var o71;
var o72;
var o73;
var o74;
var o75;
var o76;
var o77;
var o78;
var o79;
var o80;
var o81;
var o82;
var o83;
var o84;
var o85;
var f81632121_1110;
var f81632121_1111;
var f81632121_1112;
var f81632121_1114;
var f81632121_1117;
var f81632121_1118;
var f81632121_1122;
var f81632121_1123;
var f81632121_1124;
var f81632121_1126;
var f81632121_1127;
var f81632121_1156;
var f81632121_1157;
var fo81632121_1165_firstChild;
var o86;
var o87;
var fo81632121_1201_firstChild;
var o88;
var o89;
var o90;
var o91;
var o92;
var o93;
var o94;
var o95;
var fo81632121_1218_firstChild;
var o96;
var o97;
var f81632121_1294;
var f81632121_1295;
var f81632121_1296;
var f81632121_1298;
var o98;
var o99;
var o100;
var o101;
var o102;
var o103;
var o104;
var o105;
var o106;
var o107;
var o108;
var o109;
var o110;
var o111;
var o112;
var o113;
var o114;
var o115;
var o116;
var o117;
var f81632121_1332;
var f81632121_1333;
var f81632121_1334;
var o118;
var f81632121_1336;
var f81632121_1337;
var f81632121_1338;
var f81632121_1339;
var f81632121_1340;
var f81632121_1341;
var f81632121_1342;
var o119;
var f81632121_1344;
var o120;
var f81632121_1347;
var f81632121_1348;
var f81632121_1349;
var f81632121_1350;
var f81632121_1351;
var f81632121_1352;
var f81632121_1353;
var f81632121_1355;
var o121;
var o122;
var o123;
var o124;
var o125;
var o126;
var o127;
var o128;
var o129;
var o130;
var o131;
var o132;
var o133;
var f81632121_1398;
var f81632121_1413;
var f81632121_1417;
var f81632121_1418;
var o134;
var o135;
var o136;
var o137;
var o138;
var fo81632121_1423_firstChild;
var o139;
var f81632121_1442;
var o140;
var o141;
var o142;
var o143;
var o144;
var f81632121_1457;
var o145;
var o146;
var fo81632121_1467_style;
var fo81632121_1465_style;
var f81632121_1481;
var o147;
var o148;
var fo81632121_1527_firstChild;
var fo81632121_1562_firstChild;
var f81632121_1608;
var f81632121_1610;
var f81632121_1611;
var f81632121_1612;
var f81632121_1613;
var f81632121_1615;
var f81632121_1616;
var f81632121_1617;
var f81632121_1619;
var f81632121_1620;
var f81632121_1622;
var f81632121_1624;
var f81632121_1626;
var f81632121_1629;
var f81632121_1630;
var f81632121_1631;
var f81632121_1632;
var f81632121_1633;
var f81632121_1634;
var f81632121_1636;
var f81632121_1638;
var o149;
var f81632121_1640;
var f81632121_1642;
var f81632121_1644;
var o150;
var f81632121_1646;
var o151;
var f81632121_1648;
var f81632121_1659;
var f81632121_1662;
var o152;
var o153;
var o154;
var o155;
var f81632121_1669;
var o156;
var o157;
var o158;
var f81632121_1673;
var f81632121_1674;
var o159;
var o160;
var o161;
var o162;
var o163;
var o164;
var o165;
var o166;
var o167;
var o168;
var o169;
var o170;
var f81632121_1731;
var o171;
var o172;
var o173;
var o174;
var o175;
var o176;
var f81632121_1740;
var o177;
var o178;
var o179;
var o180;
var f81632121_1746;
var o181;
var f81632121_1756;
var o182;
var o183;
var o184;
var o185;
var o186;
var o187;
var o188;
var o189;
var fo81632121_1605_readyState;
var f81632121_1821;
var f81632121_1852;
var f81632121_1871;
var o190;
var f81632121_2117;
var f81632121_2118;
var f81632121_2129;
var f81632121_2135;
var f81632121_2141;
var f81632121_2143;
var o191;
var o192;
var o193;
var o194;
var o195;
var o196;
var f81632121_2152;
var f81632121_2153;
var f81632121_2154;
var f81632121_2155;
var f81632121_2156;
var f81632121_2160;
var o197;
var o198;
var o199;
var o200;
var f81632121_2241;
var fo81632121_2264_firstChild;
var f81632121_2270;
var fo81632121_2240_Shockwave_Flash;
var fo81632121_2273_application_x_shockwave_flash;
var f81632121_2281;
var f81632121_2446;
var f81632121_2447;
var f81632121_2709;
var f81632121_2710;
var f81632121_2711;
var f81632121_2758;
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_175 = [];
JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_565 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_178 = [];
JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_104 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_231 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_234 = [];
JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_55 = [];
JSBNG_Replay.sb400e2fc5b4578cec05af7646f5430d8d67f9e1b_61 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_413 = [];
JSBNG_Replay.s5f7fb1571d9ddaabf0918a66ba121ad96869441c_256 = [];
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379 = [];
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_361 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_404 = [];
JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148 = [];
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_235 = [];
// 1
// record generated by JSBench 59c4c1419900 at 2013-07-26T15:05:50.801Z
// 2
// 3
f81632121_0 = function() { return f81632121_0.returns[f81632121_0.inst++]; };
f81632121_0.returns = [];
f81632121_0.inst = 0;
// 4
ow81632121.JSBNG__Date = f81632121_0;
// 5
o0 = {};
// 6
ow81632121.JSBNG__document = o0;
// 7
o1 = {};
// 8
ow81632121.JSBNG__sessionStorage = o1;
// 9
o2 = {};
// 10
ow81632121.JSBNG__localStorage = o2;
// 11
f81632121_4 = function() { return f81632121_4.returns[f81632121_4.inst++]; };
f81632121_4.returns = [];
f81632121_4.inst = 0;
// 12
ow81632121.JSBNG__getComputedStyle = f81632121_4;
// 17
f81632121_7 = function() { return f81632121_7.returns[f81632121_7.inst++]; };
f81632121_7.returns = [];
f81632121_7.inst = 0;
// 18
ow81632121.JSBNG__addEventListener = f81632121_7;
// 19
ow81632121.JSBNG__top = ow81632121;
// 24
ow81632121.JSBNG__scrollX = 0;
// 25
ow81632121.JSBNG__scrollY = 0;
// 28
f81632121_11 = function() { return f81632121_11.returns[f81632121_11.inst++]; };
f81632121_11.returns = [];
f81632121_11.inst = 0;
// 29
ow81632121.JSBNG__scrollBy = f81632121_11;
// 30
f81632121_12 = function() { return f81632121_12.returns[f81632121_12.inst++]; };
f81632121_12.returns = [];
f81632121_12.inst = 0;
// 31
ow81632121.JSBNG__setTimeout = f81632121_12;
// 32
f81632121_13 = function() { return f81632121_13.returns[f81632121_13.inst++]; };
f81632121_13.returns = [];
f81632121_13.inst = 0;
// 33
ow81632121.JSBNG__setInterval = f81632121_13;
// 34
f81632121_14 = function() { return f81632121_14.returns[f81632121_14.inst++]; };
f81632121_14.returns = [];
f81632121_14.inst = 0;
// 35
ow81632121.JSBNG__clearTimeout = f81632121_14;
// 36
f81632121_15 = function() { return f81632121_15.returns[f81632121_15.inst++]; };
f81632121_15.returns = [];
f81632121_15.inst = 0;
// 37
ow81632121.JSBNG__clearInterval = f81632121_15;
// 42
ow81632121.JSBNG__frames = ow81632121;
// 45
ow81632121.JSBNG__self = ow81632121;
// 46
o3 = {};
// 47
ow81632121.JSBNG__navigator = o3;
// 50
o4 = {};
// 51
ow81632121.JSBNG__history = o4;
// 62
ow81632121.JSBNG__closed = false;
// 65
ow81632121.JSBNG__opener = null;
// 66
ow81632121.JSBNG__defaultStatus = "";
// 67
o5 = {};
// 68
ow81632121.JSBNG__location = o5;
// 69
ow81632121.JSBNG__innerWidth = 1034;
// 70
ow81632121.JSBNG__innerHeight = 727;
// 71
ow81632121.JSBNG__outerWidth = 1050;
// 72
ow81632121.JSBNG__outerHeight = 840;
// 73
ow81632121.JSBNG__screenX = 60;
// 74
ow81632121.JSBNG__screenY = 60;
// 75
ow81632121.JSBNG__pageXOffset = 0;
// 76
ow81632121.JSBNG__pageYOffset = 0;
// 101
ow81632121.JSBNG__frameElement = null;
// 118
f81632121_49 = function() { return f81632121_49.returns[f81632121_49.inst++]; };
f81632121_49.returns = [];
f81632121_49.inst = 0;
// 119
ow81632121.JSBNG__webkitIDBTransaction = f81632121_49;
// 120
o6 = {};
// 121
ow81632121.JSBNG__webkitNotifications = o6;
// 122
f81632121_51 = function() { return f81632121_51.returns[f81632121_51.inst++]; };
f81632121_51.returns = [];
f81632121_51.inst = 0;
// 123
ow81632121.JSBNG__webkitIDBIndex = f81632121_51;
// 124
o7 = {};
// 125
ow81632121.JSBNG__webkitIndexedDB = o7;
// 126
ow81632121.JSBNG__screenLeft = 60;
// 127
f81632121_53 = function() { return f81632121_53.returns[f81632121_53.inst++]; };
f81632121_53.returns = [];
f81632121_53.inst = 0;
// 128
ow81632121.JSBNG__webkitIDBFactory = f81632121_53;
// 129
ow81632121.JSBNG__clientInformation = o3;
// 130
f81632121_54 = function() { return f81632121_54.returns[f81632121_54.inst++]; };
f81632121_54.returns = [];
f81632121_54.inst = 0;
// 131
ow81632121.JSBNG__webkitIDBCursor = f81632121_54;
// 132
ow81632121.JSBNG__defaultstatus = "";
// 137
f81632121_57 = function() { return f81632121_57.returns[f81632121_57.inst++]; };
f81632121_57.returns = [];
f81632121_57.inst = 0;
// 138
ow81632121.JSBNG__webkitIDBDatabase = f81632121_57;
// 141
f81632121_59 = function() { return f81632121_59.returns[f81632121_59.inst++]; };
f81632121_59.returns = [];
f81632121_59.inst = 0;
// 142
ow81632121.JSBNG__webkitIDBRequest = f81632121_59;
// 143
f81632121_60 = function() { return f81632121_60.returns[f81632121_60.inst++]; };
f81632121_60.returns = [];
f81632121_60.inst = 0;
// 144
ow81632121.JSBNG__webkitIDBObjectStore = f81632121_60;
// 145
ow81632121.JSBNG__devicePixelRatio = 1;
// 146
f81632121_61 = function() { return f81632121_61.returns[f81632121_61.inst++]; };
f81632121_61.returns = [];
f81632121_61.inst = 0;
// 147
ow81632121.JSBNG__webkitURL = f81632121_61;
// 148
f81632121_62 = function() { return f81632121_62.returns[f81632121_62.inst++]; };
f81632121_62.returns = [];
f81632121_62.inst = 0;
// 149
ow81632121.JSBNG__webkitIDBKeyRange = f81632121_62;
// 150
ow81632121.JSBNG__offscreenBuffering = true;
// 151
ow81632121.JSBNG__screenTop = 60;
// 166
f81632121_70 = function() { return f81632121_70.returns[f81632121_70.inst++]; };
f81632121_70.returns = [];
f81632121_70.inst = 0;
// 167
ow81632121.JSBNG__XMLHttpRequest = f81632121_70;
// 168
f81632121_71 = function() { return f81632121_71.returns[f81632121_71.inst++]; };
f81632121_71.returns = [];
f81632121_71.inst = 0;
// 169
ow81632121.JSBNG__Image = f81632121_71;
// 170
ow81632121.JSBNG__URL = f81632121_61;
// 171
ow81632121.JSBNG__name = "";
// 178
ow81632121.JSBNG__status = "";
// 331
f81632121_151 = function() { return f81632121_151.returns[f81632121_151.inst++]; };
f81632121_151.returns = [];
f81632121_151.inst = 0;
// 332
ow81632121.JSBNG__WebKitTransitionEvent = f81632121_151;
// 341
f81632121_156 = function() { return f81632121_156.returns[f81632121_156.inst++]; };
f81632121_156.returns = [];
f81632121_156.inst = 0;
// 342
ow81632121.JSBNG__Document = f81632121_156;
// 569
f81632121_270 = function() { return f81632121_270.returns[f81632121_270.inst++]; };
f81632121_270.returns = [];
f81632121_270.inst = 0;
// 570
ow81632121.JSBNG__Event = f81632121_270;
// 615
ow81632121.JSBNG__XMLDocument = f81632121_156;
// 834
ow81632121.JSBNG__TEMPORARY = 0;
// 835
ow81632121.JSBNG__PERSISTENT = 1;
// 866
f81632121_417 = function() { return f81632121_417.returns[f81632121_417.inst++]; };
f81632121_417.returns = [];
f81632121_417.inst = 0;
// 867
ow81632121.JSBNG__WebKitMutationObserver = f81632121_417;
// 886
ow81632121.JSBNG__indexedDB = o7;
// undefined
o7 = null;
// 887
o7 = {};
// 888
ow81632121.JSBNG__Intl = o7;
// 889
ow81632121.JSBNG__v8Intl = o7;
// undefined
o7 = null;
// 940
ow81632121.JSBNG__IDBTransaction = f81632121_49;
// 941
ow81632121.JSBNG__IDBRequest = f81632121_59;
// 944
ow81632121.JSBNG__IDBObjectStore = f81632121_60;
// 945
ow81632121.JSBNG__IDBKeyRange = f81632121_62;
// 946
ow81632121.JSBNG__IDBIndex = f81632121_51;
// 947
ow81632121.JSBNG__IDBFactory = f81632121_53;
// 948
ow81632121.JSBNG__IDBDatabase = f81632121_57;
// 951
ow81632121.JSBNG__IDBCursor = f81632121_54;
// 952
ow81632121.JSBNG__MutationObserver = f81632121_417;
// 953
ow81632121.JSBNG__TransitionEvent = f81632121_151;
// 970
f81632121_463 = function() { return f81632121_463.returns[f81632121_463.inst++]; };
f81632121_463.returns = [];
f81632121_463.inst = 0;
// 971
ow81632121.JSBNG__requestAnimationFrame = f81632121_463;
// 974
ow81632121.JSBNG__onerror = null;
// 977
f81632121_466 = function() { return f81632121_466.returns[f81632121_466.inst++]; };
f81632121_466.returns = [];
f81632121_466.inst = 0;
// 978
ow81632121.Math.JSBNG__random = f81632121_466;
// 979
// 983
f81632121_467 = function() { return f81632121_467.returns[f81632121_467.inst++]; };
f81632121_467.returns = [];
f81632121_467.inst = 0;
// 984
f81632121_0.now = f81632121_467;
// 985
f81632121_467.returns.push(1374851210822);
// 986
o5.search = "";
// 1001
// 1002
// 1004
f81632121_468 = function() { return f81632121_468.returns[f81632121_468.inst++]; };
f81632121_468.returns = [];
f81632121_468.inst = 0;
// 1005
o0.JSBNG__addEventListener = f81632121_468;
// 1006
o3.userAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36";
// 1008
f81632121_468.returns.push(undefined);
// 1009
f81632121_469 = function() { return f81632121_469.returns[f81632121_469.inst++]; };
f81632121_469.returns = [];
f81632121_469.inst = 0;
// 1010
ow81632121.JSBNG__onload = f81632121_469;
// 1018
o7 = {};
// 1025
o0.documentMode = void 0;
// 1027
f81632121_471 = function() { return f81632121_471.returns[f81632121_471.inst++]; };
f81632121_471.returns = [];
f81632121_471.inst = 0;
// 1028
o0.getElementsByTagName = f81632121_471;
// 1029
o8 = {};
// 1030
f81632121_471.returns.push(o8);
// 1031
o8.length = 1;
// 1032
o9 = {};
// 1033
o8["0"] = o9;
// undefined
o8 = null;
// 1034
f81632121_474 = function() { return f81632121_474.returns[f81632121_474.inst++]; };
f81632121_474.returns = [];
f81632121_474.inst = 0;
// 1035
o0.createDocumentFragment = f81632121_474;
// 1036
o8 = {};
// 1037
f81632121_474.returns.push(o8);
// 1039
f81632121_467.returns.push(1374851210834);
// 1040
f81632121_476 = function() { return f81632121_476.returns[f81632121_476.inst++]; };
f81632121_476.returns = [];
f81632121_476.inst = 0;
// 1041
o0.createElement = f81632121_476;
// 1042
o10 = {};
// 1043
f81632121_476.returns.push(o10);
// 1044
// 1045
// 1046
// 1047
// 1048
// 1049
// 1050
f81632121_478 = function() { return f81632121_478.returns[f81632121_478.inst++]; };
f81632121_478.returns = [];
f81632121_478.inst = 0;
// 1051
o8.appendChild = f81632121_478;
// 1052
f81632121_478.returns.push(o10);
// undefined
o10 = null;
// 1054
f81632121_467.returns.push(1374851210835);
// 1056
o10 = {};
// 1057
f81632121_476.returns.push(o10);
// 1058
// 1059
// 1060
// 1061
// 1062
// 1063
// 1065
f81632121_478.returns.push(o10);
// undefined
o10 = null;
// 1067
f81632121_467.returns.push(1374851210835);
// 1069
o10 = {};
// 1070
f81632121_476.returns.push(o10);
// 1071
// 1072
// 1073
// 1074
// 1075
// 1076
// 1078
f81632121_478.returns.push(o10);
// undefined
o10 = null;
// 1079
o9.appendChild = f81632121_478;
// 1080
f81632121_478.returns.push(o8);
// undefined
o8 = null;
// 1089
f81632121_466.returns.push(0.8583255198318511);
// 1090
f81632121_481 = function() { return f81632121_481.returns[f81632121_481.inst++]; };
f81632121_481.returns = [];
f81632121_481.inst = 0;
// 1091
ow81632121.JSBNG__onunload = f81632121_481;
// 1093
f81632121_467.returns.push(1374851212533);
// 1094
f81632121_482 = function() { return f81632121_482.returns[f81632121_482.inst++]; };
f81632121_482.returns = [];
f81632121_482.inst = 0;
// 1095
o1.getItem = f81632121_482;
// 1096
f81632121_482.returns.push(null);
// 1098
f81632121_467.returns.push(1374851212534);
// 1099
f81632121_14.returns.push(undefined);
// 1100
f81632121_12.returns.push(1);
// 1104
o8 = {};
// 1105
o0.documentElement = o8;
// 1106
o8.className = "highContrast no_js";
// 1107
// 1109
o0.domain = "jsbngssl.www.facebook.com";
// 1110
// 1112
o5.href = "https://www.facebook.com/LawlabeeTheWallaby";
// 1117
// 1118
o10 = {};
// 1119
f81632121_270.prototype = o10;
// 1121
// 1122
// 1123
// 1124
// 1125
// 1126
// 1128
// 1129
// 1130
// 1131
// 1132
// 1133
// undefined
o10 = null;
// 1134
// 1135
// 1136
// 1137
// 1138
// 1139
// 1140
// 1141
// 1142
// 1143
// 1144
// 1145
o3.msPointerEnabled = void 0;
// 1147
// 1148
// 1149
o10 = {};
// 1150
o11 = {};
// 1152
o10.nodeType = void 0;
// 1153
o10.length = 1;
// 1154
o10["0"] = "OH3xD";
// 1159
o12 = {};
// 1160
o13 = {};
// 1162
o12.nodeType = void 0;
// 1163
o12.length = 1;
// 1164
o12["0"] = "XH2Cu";
// 1169
o14 = {};
// 1170
o15 = {};
// 1172
o14.nodeType = void 0;
// 1173
o14.length = 1;
// 1174
o14["0"] = "ociRJ";
// 1205
o16 = {};
// 1206
f81632121_471.returns.push(o16);
// 1207
o16.length = 9;
// 1208
o17 = {};
// 1209
o16["0"] = o17;
// 1210
o17.rel = "alternate";
// undefined
o17 = null;
// 1212
o17 = {};
// 1213
o16["1"] = o17;
// 1214
o17.rel = "stylesheet";
// 1216
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/IqonxdwHUtT.css";
// undefined
o17 = null;
// 1225
o17 = {};
// 1226
o16["2"] = o17;
// 1227
o17.rel = "stylesheet";
// 1229
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/9mw4nQDxDC9.css";
// undefined
o17 = null;
// 1238
o17 = {};
// 1239
o16["3"] = o17;
// 1240
o17.rel = "stylesheet";
// 1242
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/i2fjJiK4liE.css";
// undefined
o17 = null;
// 1245
o17 = {};
// 1246
o16["4"] = o17;
// 1247
o17.rel = "stylesheet";
// 1249
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yL/r/OO7ppcHlCNm.css";
// undefined
o17 = null;
// 1254
o17 = {};
// 1255
o16["5"] = o17;
// 1256
o17.rel = "stylesheet";
// 1258
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/4oH7eQzJjdc.css";
// undefined
o17 = null;
// 1263
o17 = {};
// 1264
o16["6"] = o17;
// 1265
o17.rel = "stylesheet";
// 1267
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/1DOzCljCl3K.css";
// undefined
o17 = null;
// 1272
o17 = {};
// 1273
o16["7"] = o17;
// 1274
o17.rel = "shortcut icon";
// undefined
o17 = null;
// 1276
o17 = {};
// 1277
o16["8"] = o17;
// undefined
o16 = null;
// 1278
o17.rel = "stylesheet";
// 1280
o17.href = "http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css";
// undefined
o17 = null;
// 1360
f81632121_467.returns.push(1374851214075);
// 1362
f81632121_467.returns.push(1374851214075);
// 1363
f81632121_14.returns.push(undefined);
// 1364
f81632121_12.returns.push(2);
// 1369
f81632121_467.returns.push(1374851214076);
// 1370
o16 = {};
// 1371
o0.body = o16;
// 1372
f81632121_502 = function() { return f81632121_502.returns[f81632121_502.inst++]; };
f81632121_502.returns = [];
f81632121_502.inst = 0;
// 1373
o16.getElementsByTagName = f81632121_502;
// 1374
f81632121_503 = function() { return f81632121_503.returns[f81632121_503.inst++]; };
f81632121_503.returns = [];
f81632121_503.inst = 0;
// 1375
o0.querySelectorAll = f81632121_503;
// 1376
f81632121_504 = function() { return f81632121_504.returns[f81632121_504.inst++]; };
f81632121_504.returns = [];
f81632121_504.inst = 0;
// 1377
o16.querySelectorAll = f81632121_504;
// 1378
o17 = {};
// 1379
f81632121_504.returns.push(o17);
// 1380
o17.length = 0;
// undefined
o17 = null;
// 1381
f81632121_14.returns.push(undefined);
// 1382
f81632121_12.returns.push(3);
// 1388
o8.clientWidth = 1017;
// 1404
o8.nodeName = "HTML";
// 1405
o8.__FB_TOKEN = void 0;
// 1406
// 1407
f81632121_506 = function() { return f81632121_506.returns[f81632121_506.inst++]; };
f81632121_506.returns = [];
f81632121_506.inst = 0;
// 1408
o8.getAttribute = f81632121_506;
// 1409
f81632121_507 = function() { return f81632121_507.returns[f81632121_507.inst++]; };
f81632121_507.returns = [];
f81632121_507.inst = 0;
// 1410
o8.hasAttribute = f81632121_507;
// 1412
f81632121_507.returns.push(false);
// 1413
o8.JSBNG__addEventListener = f81632121_468;
// 1415
f81632121_468.returns.push(undefined);
// 1416
o8.JSBNG__onmousewheel = null;
// 1421
f81632121_508 = function() { return f81632121_508.returns[f81632121_508.inst++]; };
f81632121_508.returns = [];
f81632121_508.inst = 0;
// 1422
o0.getElementById = f81632121_508;
// 1423
o17 = {};
// 1424
f81632121_508.returns.push(o17);
// 1425
o17.getElementsByTagName = f81632121_502;
// 1427
o17.querySelectorAll = f81632121_504;
// 1428
o18 = {};
// 1429
f81632121_504.returns.push(o18);
// 1430
o18.length = 1;
// 1431
o19 = {};
// 1432
o18["0"] = o19;
// undefined
o18 = null;
// 1433
o19.value = "Gregor Richards";
// 1434
o18 = {};
// 1435
o19.classList = o18;
// 1437
f81632121_513 = function() { return f81632121_513.returns[f81632121_513.inst++]; };
f81632121_513.returns = [];
f81632121_513.inst = 0;
// 1438
o18.contains = f81632121_513;
// 1439
f81632121_513.returns.push(false);
// 1445
o0.activeElement = o16;
// 1447
o16.getAttribute = f81632121_506;
// 1448
f81632121_506.returns.push(null);
// 1450
f81632121_506.returns.push(null);
// 1454
f81632121_468.returns.push(undefined);
// 1456
f81632121_468.returns.push(undefined);
// 1469
// 1470
// 1471
// 1474
f81632121_468.returns.push(undefined);
// 1484
f81632121_467.returns.push(1374851214103);
// 1490
f81632121_467.returns.push(1374851214104);
// 1492
f81632121_467.returns.push(1374851214104);
// 1496
f81632121_467.returns.push(1374851214105);
// 1499
f81632121_467.returns.push(1374851214105);
// 1502
f81632121_467.returns.push(1374851214105);
// 1504
f81632121_467.returns.push(1374851214105);
// 1508
o20 = {};
// 1509
f81632121_474.returns.push(o20);
// 1511
f81632121_467.returns.push(1374851214106);
// 1512
o0.createStyleSheet = void 0;
// 1514
o21 = {};
// 1515
f81632121_476.returns.push(o21);
// 1516
// 1517
// 1518
// 1520
o22 = {};
// 1521
f81632121_476.returns.push(o22);
// 1522
// 1523
o20.appendChild = f81632121_478;
// 1524
f81632121_478.returns.push(o22);
// 1526
f81632121_467.returns.push(1374851214112);
// 1527
f81632121_13.returns.push(4);
// 1529
o23 = {};
// 1530
f81632121_476.returns.push(o23);
// 1531
// 1532
// 1533
// 1535
f81632121_478.returns.push(o23);
// 1537
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 1539
f81632121_478.returns.push(o20);
// undefined
o20 = null;
// 1542
f81632121_467.returns.push(1374851214114);
// 1548
f81632121_467.returns.push(1374851214115);
// 1550
f81632121_467.returns.push(1374851214115);
// 1554
f81632121_467.returns.push(1374851214116);
// 1557
f81632121_467.returns.push(1374851214119);
// 1560
f81632121_467.returns.push(1374851214119);
// 1562
o20 = {};
// 1563
f81632121_508.returns.push(o20);
// 1565
o21 = {};
// 1566
f81632121_508.returns.push(o21);
// 1567
o24 = {};
// 1568
o21.firstChild = o24;
// 1570
o24.nodeType = 8;
// 1572
o24.nodeValue = " <div id=\"pagelet_main_column_personal\" data-referrer=\"pagelet_main_column_personal_timeline\"></div> ";
// undefined
o24 = null;
// 1573
o21.parentNode = o16;
// 1574
f81632121_521 = function() { return f81632121_521.returns[f81632121_521.inst++]; };
f81632121_521.returns = [];
f81632121_521.inst = 0;
// 1575
o16.removeChild = f81632121_521;
// 1576
f81632121_521.returns.push(o21);
// undefined
o21 = null;
// 1577
// 1578
o20.getAttribute = f81632121_506;
// 1579
f81632121_506.returns.push("pagelet_timeline_main_column");
// 1582
f81632121_467.returns.push(1374851214121);
// 1586
o21 = {};
// 1587
f81632121_474.returns.push(o21);
// 1589
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 1595
f81632121_467.returns.push(1374851214131);
// 1597
f81632121_467.returns.push(1374851214132);
// 1601
f81632121_467.returns.push(1374851214132);
// 1604
f81632121_467.returns.push(1374851214132);
// 1607
f81632121_467.returns.push(1374851214132);
// 1609
o21 = {};
// 1610
f81632121_508.returns.push(o21);
// 1612
o24 = {};
// 1613
f81632121_508.returns.push(o24);
// 1614
o25 = {};
// 1615
o24.firstChild = o25;
// 1617
o25.nodeType = 8;
// 1619
o25.nodeValue = " <div class=\"fbTimelineTopSectionBase -cx-PRIVATE-fbTimelineLightHeader__root -cx-PUBLIC-fbTimelineLightHeader__loading\"><div id=\"pagelet_above_header_timeline\" data-referrer=\"pagelet_above_header_timeline\"></div><div id=\"above_header_timeline_placeholder\"></div><div class=\"fbTimelineSection mtm fbTimelineTopSection\"><div id=\"fbProfileCover\"><div class=\"cover\" id=\"u_0_j\"><a class=\"coverWrap coverImage\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a-iad.xx.fbcdn.net%2Fhphotos-ash3%2F1017486_10200268472248551_842609840_n.jpg&amp;size=851%2C315&amp;source=10\" id=\"fbCoverImageContainer\"><img class=\"coverPhotoImg photo img\" src=\"http://jsbngssl.sphotos-a-iad.xx.fbcdn.net/hphotos-ash3/1017486_10200268472248551_842609840_n.jpg\" alt=\"Cover Photo\" style=\"top:0px;width:100%\" data-fbid=\"10200268472248551\" /><div class=\"coverBorder\"></div><img class=\"coverChangeThrobber img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\" alt=\"\" width=\"16\" height=\"16\" /></a><div class=\"-cx-PRIVATE-fbTimelineLightHeader__headline\"><h2 class=\"-cx-PRIVATE-fbTimelineLightHeader__name\"><a class=\"-cx-PRIVATE-fbTimelineLightHeader__namelink\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\">Gregor Richards</a></h2></div></div><div id=\"fbTimelineHeadline\" class=\"clearfix\"><div class=\"-cx-PRIVATE-fbTimelineLightHeader__actionbuttonswrap\"><div class=\"actions -cx-PRIVATE-fbTimelineLightHeader__actionbuttons\"><div class=\"actionsDropdown\" id=\"pagelet_timeline_profile_actions\" data-referrer=\"pagelet_timeline_profile_actions\"></div></div></div><div class=\"-cx-PRIVATE-fbTimelineLightHeader__navwrapper\"><div class=\"-cx-PRIVATE-fbTimelineNavLight__root clearfix\" data-referrer=\"timeline_light_nav_top\" id=\"u_0_k\"><a class=\"-cx-PRIVATE-fbTimelineNavLight__item -cx-PRIVATE-fbTimelineNavLight__activeitem\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\">Timeline<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><a class=\"-cx-PRIVATE-fbTimelineNavLight__item\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/about\" data-medley-id=\"pagelet_timeline_medley_about\">About<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><a class=\"-cx-PRIVATE-fbTimelineNavLight__item\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\" data-medley-id=\"pagelet_timeline_medley_photos\">Photos<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><a class=\"-cx-PRIVATE-fbTimelineNavLight__item\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/friends\" data-medley-id=\"pagelet_timeline_medley_friends\">Friends<span class=\"-cx-PRIVATE-fbTimelineNavLight__tabnub\"></span></a><div class=\"-cx-PRIVATE-uiInlineBlock__root uiPopover -cx-PRIVATE-fbTimelineNavLight__item -cx-PRIVATE-fbTimelineNavLight__itemdropdown\" id=\"u_0_l\"><a class=\"-cx-PRIVATE-fbTimelineNavLight__dropdownitembutton -cx-PRIVATE-uiPopover__trigger\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_m\">More<i class=\"-cx-PRIVATE-fbTimelineNavLight__dropdownitemarrow img sp_4p6kmz sx_4f53fc\"></i></a></div></div></div><div class=\"name\"><div class=\"photoContainer\"><a class=\"profilePicThumb\" id=\"profile_pic_education\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1&amp;source=11\" rel=\"theater\"><img class=\"profilePic img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/c55.0.552.552/s160x160/993004_10200268473688587_517108607_n.jpg\" alt=\"Gregor Richards\" /></a><meta itemprop=\"image\" content=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" /></div></div></div><div id=\"timeline_sticky_header\" data-referrer=\"timeline_sticky_header\"></div></div><div id=\"fbSuggestionsPlaceHolder\"></div></div><div id=\"pagelet_escape_hatch\" data-referrer=\"pagelet_escape_hatch\"></div></div><div id=\"timeline_tab_content\"><div id=\"pagelet_timeline_recent\" data-referrer=\"pagelet_timeline_recent\"></div><div id=\"timeline_tab_content_extra\"></div></div> ";
// undefined
o25 = null;
// 1620
o24.parentNode = o16;
// 1622
f81632121_521.returns.push(o24);
// undefined
o24 = null;
// 1623
// 1624
o21.getAttribute = f81632121_506;
// 1625
f81632121_506.returns.push("pagelet_main_column_personal_timeline");
// 1633
o24 = {};
// 1634
f81632121_476.returns.push(o24);
// 1635
// 1636
// 1637
o24.getElementsByTagName = f81632121_502;
// 1638
o25 = {};
// 1639
f81632121_502.returns.push(o25);
// 1640
o25.length = 0;
// undefined
o25 = null;
// 1642
o25 = {};
// 1643
o24.childNodes = o25;
// undefined
o24 = null;
// 1644
o25.nodeType = void 0;
// 1645
o25.getAttributeNode = void 0;
// 1646
o25.getElementsByTagName = void 0;
// 1647
o25.childNodes = void 0;
// 1659
o24 = {};
// 1660
f81632121_508.returns.push(o24);
// 1664
o16.scrollWidth = 1017;
// 1665
o16.scrollHeight = 727;
// 1667
f81632121_508.returns.push(o20);
// 1668
o26 = {};
// 1669
o20.style = o26;
// 1670
// undefined
o26 = null;
// 1671
f81632121_11.returns.push(undefined);
// 1683
f81632121_467.returns.push(1374851214231);
// 1687
o26 = {};
// 1688
f81632121_474.returns.push(o26);
// 1690
f81632121_478.returns.push(o26);
// undefined
o26 = null;
// 1696
f81632121_467.returns.push(1374851214232);
// 1698
f81632121_467.returns.push(1374851214232);
// 1702
f81632121_467.returns.push(1374851214232);
// 1705
f81632121_467.returns.push(1374851214233);
// 1708
f81632121_467.returns.push(1374851214233);
// 1710
o26 = {};
// 1711
f81632121_508.returns.push(o26);
// 1713
o27 = {};
// 1714
f81632121_508.returns.push(o27);
// 1715
o28 = {};
// 1716
o27.firstChild = o28;
// 1718
o28.nodeType = 8;
// 1720
o28.nodeValue = " <div class=\"escapeHatchMinimal -cx-PRIVATE-fbTimelineEscapeHatch__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root -cx-PRIVATE-fbTimelineEscapeHatch__header\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><div class=\"fsm fwn fcg\"><span class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\"><span>Do you know Gregor?</span></span></div></div></div><div class=\"pam uiBoxWhite noborder\"><div><div class=\"-cx-PRIVATE-fbTimelineEscapeHatch__addfriendbutton\"><div class=\"FriendButton\" id=\"u_0_q\"><label class=\"FriendRequestAdd addButton selected uiButton uiButtonSpecial uiButtonLarge\" for=\"u_0_r\"><i class=\"mrs img sp_at8kd9 sx_aad3a2\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_r\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem selected uiButton uiButtonSpecial uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"escape_hatch\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_at8kd9 sx_aad3a2\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></div><div class=\"phs pbs -cx-PRIVATE-fbTimelineEscapeHatch__noticetext\"><div class=\"pbs prm fsl\"></div><span class=\"fsl fcg\"><span id=\"u_0_s\"><span class=\"addFriendText\">To see what he shares with friends, <a class=\"addButton\" href=\"#\" role=\"button\">send him a friend request.</a></span><span class=\"hidden_elem enableFriendListFlyout outgoingButton\" data-profileid=\"1055580469\">Request Sent.</span></span></span></div></div></div><div id=\"fbSuggestionsHatchPlaceHolder\"></div></div> ";
// undefined
o28 = null;
// 1721
o27.parentNode = o16;
// 1723
f81632121_521.returns.push(o27);
// undefined
o27 = null;
// 1724
// 1725
o26.getAttribute = f81632121_506;
// 1726
f81632121_506.returns.push("pagelet_escape_hatch");
// 1737
f81632121_467.returns.push(1374851214252);
// 1741
o27 = {};
// 1742
f81632121_474.returns.push(o27);
// 1744
f81632121_478.returns.push(o27);
// undefined
o27 = null;
// 1750
f81632121_467.returns.push(1374851214263);
// 1752
f81632121_467.returns.push(1374851214263);
// 1756
f81632121_467.returns.push(1374851214264);
// 1759
f81632121_467.returns.push(1374851214264);
// 1762
f81632121_467.returns.push(1374851214264);
// 1764
o27 = {};
// 1765
f81632121_508.returns.push(o27);
// 1766
o27.getAttribute = f81632121_506;
// 1767
f81632121_506.returns.push("pagelet_above_header_timeline");
// 1783
f81632121_467.returns.push(1374851214270);
// 1787
o28 = {};
// 1788
f81632121_474.returns.push(o28);
// 1790
f81632121_478.returns.push(o28);
// undefined
o28 = null;
// 1796
f81632121_467.returns.push(1374851214276);
// 1798
f81632121_467.returns.push(1374851214277);
// 1802
f81632121_467.returns.push(1374851214277);
// 1805
f81632121_467.returns.push(1374851214277);
// 1808
f81632121_467.returns.push(1374851214277);
// 1810
o28 = {};
// 1811
f81632121_508.returns.push(o28);
// 1813
o29 = {};
// 1814
f81632121_508.returns.push(o29);
// 1815
o30 = {};
// 1816
o29.firstChild = o30;
// 1818
o30.nodeType = 8;
// 1820
o30.nodeValue = " <span class=\"uiButtonGroup uiButtonGroupOverlay\" id=\"u_0_u\"><span class=\"firstItem lastItem uiButtonGroupItem buttonItem\"><div class=\"profileHeaderButton FriendButton\" id=\"u_0_16\"><label class=\"FriendRequestAdd addButton uiButton uiButtonOverlay uiButtonLarge\" for=\"u_0_17\"><i class=\"mrs img sp_at8kd9 sx_aad3a2\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_17\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"fbx_top_bar\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_at8kd9 sx_aad3a2\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></span></span><span class=\"uiButtonGroup uiButtonGroupOverlay\" id=\"u_0_v\"><span class=\"firstItem lastItem uiButtonGroupItem buttonItem\"><span class=\"-cx-PRIVATE-uiSwapButton__root -cx-PRIVATE-fbSubscribeButton__root profileHeaderButton\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" ajaxify=\"/ajax/follow/follow_profile.php?profile_id=1055580469&amp;location=1\" rel=\"async-post\" id=\"u_0_12\"><i class=\"mrs img sp_at8kd9 sx_dedf3e\"></i><span class=\"uiButtonText\">Follow</span></a><label class=\"profileFollowButton -cx-PUBLIC-uiHoverButton__root -cx-PRIVATE-uiSwapButton__secondbutton hidden_elem uiButton uiButtonOverlay uiButtonLarge\" id=\"u_0_13\" for=\"u_0_15\"><i class=\"mrs img sp_at8kd9 sx_d4ea38\"></i><input value=\"Following\" aria-haspopup=\"1\" data-profileid=\"1055580469\" type=\"submit\" id=\"u_0_15\" /></label></span></span></span><span class=\"uiButtonGroup actionsContents uiButtonGroupOverlay\" id=\"u_0_w\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"/messages/LawlabeeTheWallaby\" role=\"button\" ajaxify=\"/ajax/messaging/composer.php?ids%5B0%5D=1055580469&amp;ref=timeline\" rel=\"dialog\"><span class=\"uiButtonText\">Message</span></a></span><span class=\"lastItem uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock fbTimelineActionSelector uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"fbTimelineActionSelectorButton uiSelectorButton uiButton uiButtonOverlay uiButtonLarge uiButtonNoText\" href=\"#\" role=\"button\" aria-label=\"Other actions\" aria-haspopup=\"1\" rel=\"toggle\"><i class=\"mrs img sp_at8kd9 sx_7e8063\"></i><span class=\"uiButtonText\"></span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div class=\"uiMenuContainer uiSelectorMenu\"><div role=\"menu\" class=\"uiMenu\" id=\"u_0_y\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem\" data-label=\"Add to Interest Lists...\" id=\"u_0_z\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"#\"><span class=\"itemLabel fsm\">Add to Interest Lists...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem\" data-label=\"Report/Block...\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"-1\" href=\"/ajax/report/social.php?content_type=0&amp;cid=1055580469&amp;rid=1055580469&amp;from_gear=timeline\" rel=\"dialog\"><span class=\"itemLabel fsm\">Report/Block...</span></a></li></ul></div><div role=\"menu\" class=\"uiMenu hidden_elem\" id=\"u_0_x\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem\" data-label=\"Go Back\" id=\"u_0_10\"><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"#\"><span class=\"itemLabel fsm\">Go Back</span></a></li><li class=\"uiMenuSeparator\"></li><img class=\"mal pal center img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\" alt=\"\" id=\"u_0_11\" width=\"16\" height=\"16\" /></ul></div></div></div></div></div></span></span> ";
// undefined
o30 = null;
// 1821
o29.parentNode = o16;
// 1823
f81632121_521.returns.push(o29);
// undefined
o29 = null;
// 1824
// 1825
o28.getAttribute = f81632121_506;
// 1826
f81632121_506.returns.push("pagelet_timeline_profile_actions");
// 1834
o29 = {};
// 1835
f81632121_476.returns.push(o29);
// 1836
// 1837
// 1838
o29.getElementsByTagName = f81632121_502;
// 1839
o30 = {};
// 1840
f81632121_502.returns.push(o30);
// 1841
o30.length = 0;
// undefined
o30 = null;
// 1843
o30 = {};
// 1844
o29.childNodes = o30;
// undefined
o29 = null;
// 1845
o30.nodeType = void 0;
// 1846
o30.getAttributeNode = void 0;
// 1847
o30.getElementsByTagName = void 0;
// 1848
o30.childNodes = void 0;
// 1876
f81632121_467.returns.push(1374851214307);
// 1880
o29 = {};
// 1881
f81632121_474.returns.push(o29);
// 1883
f81632121_478.returns.push(o29);
// undefined
o29 = null;
// 1886
f81632121_467.returns.push(1374851214307);
// 1892
f81632121_467.returns.push(1374851214308);
// 1894
f81632121_467.returns.push(1374851214308);
// 1898
f81632121_467.returns.push(1374851214309);
// 1901
f81632121_467.returns.push(1374851214309);
// 1904
f81632121_467.returns.push(1374851214309);
// 1906
o29 = {};
// 1907
f81632121_508.returns.push(o29);
// 1909
o31 = {};
// 1910
f81632121_508.returns.push(o31);
// 1911
o32 = {};
// 1912
o31.firstChild = o32;
// 1914
o32.nodeType = 8;
// 1916
o32.nodeValue = " <div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\" id=\"u_0_1a\"><div class=\"fbTimelineCapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" data-start=\"1359397174\" data-end=\"1375340399\" id=\"u_0_19\"><div class=\"-cx-PUBLIC-timelineOneColMin__leftcapsulecontainer\"><ol class=\"-cx-PUBLIC-timelineOneColMin__leftcapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" id=\"u_0_19_left\"></ol><div id=\"pagelet_timeline_recent_more_pager\"></div></div><div class=\"-cx-PUBLIC-timelineOneColMin__rightcapsulecontainer\"><ol class=\"-cx-PUBLIC-timelineOneColMin__rightcapsule clearfix\" data-referrer=\"pagelet_timeline_recent_ocm\" id=\"u_0_19_right\"></ol></div></div><div class=\"fbTimelineSubSections\"></div></div><div class=\"hidden_elem fbTimelineSectionExpandPager fbTimelineShowOlderSections\" id=\"u_0_1a_scroll_trigger\"><div class=\"uiMorePager\"><a class=\"uiMorePagerPrimary\" href=\"#\" role=\"button\">Show Older Stories</a></div></div> ";
// undefined
o32 = null;
// 1917
o31.parentNode = o16;
// 1919
f81632121_521.returns.push(o31);
// undefined
o31 = null;
// 1920
// 1921
o29.getAttribute = f81632121_506;
// 1922
f81632121_506.returns.push("pagelet_timeline_recent");
// 1930
f81632121_467.returns.push(1374851214320);
// 1934
o31 = {};
// 1935
f81632121_474.returns.push(o31);
// 1937
f81632121_478.returns.push(o31);
// undefined
o31 = null;
// 1943
f81632121_467.returns.push(1374851214322);
// 1945
f81632121_467.returns.push(1374851214323);
// 1949
f81632121_467.returns.push(1374851214323);
// 1952
f81632121_467.returns.push(1374851214324);
// 1955
f81632121_467.returns.push(1374851214324);
// 1957
o31 = {};
// 1958
f81632121_508.returns.push(o31);
// 1959
o31.getAttribute = f81632121_506;
// 1960
f81632121_506.returns.push("pagelet_timeline_recent_ocm");
// 1962
f81632121_467.returns.push(1374851214325);
// 1966
o32 = {};
// 1967
f81632121_474.returns.push(o32);
// 1969
f81632121_478.returns.push(o32);
// undefined
o32 = null;
// 1975
f81632121_467.returns.push(1374851214353);
// 1977
f81632121_467.returns.push(1374851214353);
// 1981
f81632121_467.returns.push(1374851214354);
// 1984
f81632121_467.returns.push(1374851214354);
// 1987
f81632121_467.returns.push(1374851214354);
// 1989
f81632121_508.returns.push(o31);
// 1991
o32 = {};
// 1992
f81632121_508.returns.push(o32);
// 1993
o33 = {};
// 1994
o32.firstChild = o33;
// 1996
o33.nodeType = 8;
// 1998
o33.nodeValue = " <li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_1267290328123522761\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1l\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851147&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;1267290328123522761&quot;,&quot;timeline_unit_type&quot;:&quot;AddSinglePhotoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1374637162\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\"><abbr title=\"Tuesday, July 23, 2013 at 11:39pm\" data-utime=\"1374647962\">Tuesday</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_at8kd9 sx_7236dd\"></i></a></div></div></div><div class=\"aboveUnitContent\"><div class=\"userContentWrapper\"><div class=\"-cx-PRIVATE-fbTimelineText__featured\"><span class=\"userContent\">Dammit Steam sale...</span> </div></div></div><div class=\"photoUnit clearfix\"><div class=\"-cx-PUBLIC-fbInlineActions__container uiScaledThumb photo photoWidth1\" data-gt=\"&#123;&quot;fbid&quot;:&quot;10200453104264236&quot;&#125;\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><a class=\"-cx-PUBLIC-fbInlineActions__photolink\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;relevant_count=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;relevant_count=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-prn2%2F1069167_10200453104264236_1772112196_n.jpg&amp;size=652%2C800&amp;theater&amp;source=9\"><div class=\"uiScaledImageContainer photoWrap\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-prn2/p480x480/1069167_10200453104264236_1772112196_n.jpg\" alt=\"Photo: Dammit Steam sale...\" width=\"504\" height=\"618\" /></div></a></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef0e1392a4bcb2d0e3238da53a0cec251408776ad(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s772cabb23e047788ade71caa5fa2e1b1ffcf8e72\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef0e1392a4bcb2d0e3238da53a0cec251408776ad(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s772cabb23e047788ade71caa5fa2e1b1ffcf8e72_0\"), (s772cabb23e047788ade71caa5fa2e1b1ffcf8e72_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s772cabb23e047788ade71caa5fa2e1b1ffcf8e72_0_instance;\n    ((s772cabb23e047788ade71caa5fa2e1b1ffcf8e72_0_instance) = ((JSBNG_Record.eventInstance)((\"s772cabb23e047788ade71caa5fa2e1b1ffcf8e72_0\"))));\n    ((JSBNG_Record.markFunction)((ef0e1392a4bcb2d0e3238da53a0cec251408776ad)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200453104264236_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200453104264236_3198160&quot;&#125;\" id=\"u_0_1r\" onsubmit=\"return ef0e1392a4bcb2d0e3238da53a0cec251408776ad.call(this, event);\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQApxIm6\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200453104264236&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;7&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1374637148&quot;,&quot;check_hash&quot;:&quot;AQCPr0Rvhc8ZTjjR&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQBNptZHHmcHSBHH338FbJIldzhdcVkA422y6Sejlj24O_ESfCpT1dhcH8BotHbB73c3HUp4765d0qfNUgarP7Vf2rTTbV5euFgCJSt9-8B4i86TjWur6gJ3K29twN6V9lo7fU3rQepgiuZt5KILXg7MqgN_w213GHwJL6FGgcWbUZlVBhXGuoklz4varOFzrDvH_-rITQWylbk82zJBzOEix9PGZ6QnysZWTe0NbHgtmvvEgOVVTF_JPYYKjGJasYG-JYrNmL-tbERXVcwbZ5iFNz9l0M26pG6TZqE6wNK0_l10ScDeVnFbXwhuV6wk73AHZ58nAtgqevhrI3rGzBuPUx02KACTcf1ScQRa2UwIeybAIzG6SY3-kSka4I-DhWD1-EPGDFc5Ff7eeuTE6lPB\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=2&amp;appid=2305272732&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=1073741829&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1t\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-fbTimelineLightStarButton__root lfloat\"><i class=\"-cx-PRIVATE-fbTimelineLightStarButton__icon\"></i></div><div class=\"-cx-PRIVATE-uiInlineBlock__root uiPopover -cx-PRIVATE-fbTimelineLightCurationControl__options\" id=\"u_0_1m\"><a class=\"-cx-PRIVATE-fbEntstreamFeedObjectOptions__button -cx-PRIVATE-uiPopover__trigger\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_1n\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_5791137008599102559\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1i\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851147&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;5791137008599102559&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1373991800\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200407437602598\"><abbr title=\"Tuesday, July 16, 2013 at 12:23pm\" data-utime=\"1374002600\">July 16</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_at8kd9 sx_7236dd\"></i></a></div></div></div><div class=\"-cx-PRIVATE-fbTimelineStatusUnit__root\"><div class=\"userContentWrapper\"><div class=\"-cx-PRIVATE-fbTimelineText__featured\"><div id=\"id_51f2904bb941a6d40448274\" class=\"text_exposed_root\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">(Guess what time it is!)<br /> <br /> Tomorrow marks the beginning of my 28th circumnavigation of the sun. Because we are a primitive, sun worshiping people, we feel the need to mark this event in various ways.<br /> <br /> As of the posting of this status and effective for forty-eight hours, all content-free birthday-related posts on my wall will be deleted. Comments on this status to that effect will also be deleted.<br /> <br /> <span class=\"text_exposed_hide\">...</span><span class=\"text_exposed_show\">You must consider what it is that you are doing. This is Facebook. It is a repository of information, it is a communication medium, it is many things. I prefer to keep my communication of a higher caliber. Plus the occasional misanthropic screed. Also ponies. Mostly communication of a higher caliber. But that&#039;s somewhat of an aside from the real crux of the issue.<br /> <br /> There is perhaps no gesture less sincere than the Facebook birthday well-wishing. You have been requested by a machine to post two words on my wall, likely followed by an obscene number of exclamation points. As a machine yourself, you have obeyed its request. This is not a polite salutation, it is a vacuous one. It is considerably worse than no gesture whatsoever. I neither require nor desire your mechanistic platitudes, and will, as such, react to eliminate them.<br /> <br /> I will keep note of who posts them before my deletion. If you&#039;re posting this without even bothering to read my own status, and hence see this rather unfriendly message, then that just emphasizes further the vapidity of the sentiment.<br /> <br /> Tomorrow marks the beginning of my 28th circumnavigation of the sun. I celebrate it by being a misanthrope.</span></span><span class=\"text_exposed_hide\"><span class=\"text_exposed_link\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ed42996c769cb06dfc355d1c314974c5d5c8b9bf6(event) {\\u000a    CSS.addClass($(\\\"id_51f2904bb941a6d40448274\\\"), \\\"text_exposed\\\");\\u000a    Arbiter.inform(\\\"reflow\\\");\\u000a};\"), (\"sf96098d0f7c18cedea4747f29c3aa1b5b9d89936\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ed42996c769cb06dfc355d1c314974c5d5c8b9bf6(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sf96098d0f7c18cedea4747f29c3aa1b5b9d89936_0\"), (sf96098d0f7c18cedea4747f29c3aa1b5b9d89936_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(JSBNG__CSS, (\"addClass\")))[(\"addClass\")])($(\"id_51f2904bb941a6d40448274\"), \"text_exposed\");\n        (((JSBNG_Record.get)(Arbiter, (\"inform\")))[(\"inform\")])(\"reflow\");\n    };\n    var sf96098d0f7c18cedea4747f29c3aa1b5b9d89936_0_instance;\n    ((sf96098d0f7c18cedea4747f29c3aa1b5b9d89936_0_instance) = ((JSBNG_Record.eventInstance)((\"sf96098d0f7c18cedea4747f29c3aa1b5b9d89936_0\"))));\n    ((JSBNG_Record.markFunction)((ed42996c769cb06dfc355d1c314974c5d5c8b9bf6)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a onclick=\"return ed42996c769cb06dfc355d1c314974c5d5c8b9bf6.call(this, event);\" data-ft=\"&#123;&quot;tn&quot;:&quot;e&quot;&#125;\">See More</a></span></span></div></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ebba824ec8d66aa790e1b61baae7d64397386f739(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s3b0629883c3e506a08ac0cf99f0ba4cba461dbfb\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ebba824ec8d66aa790e1b61baae7d64397386f739(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3b0629883c3e506a08ac0cf99f0ba4cba461dbfb_0\"), (s3b0629883c3e506a08ac0cf99f0ba4cba461dbfb_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s3b0629883c3e506a08ac0cf99f0ba4cba461dbfb_0_instance;\n    ((s3b0629883c3e506a08ac0cf99f0ba4cba461dbfb_0_instance) = ((JSBNG_Record.eventInstance)((\"s3b0629883c3e506a08ac0cf99f0ba4cba461dbfb_0\"))));\n    ((JSBNG_Record.markFunction)((ebba824ec8d66aa790e1b61baae7d64397386f739)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200407437602598_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200407437602598_4996311&quot;&#125;\" id=\"u_0_1q\" onsubmit=\"return ebba824ec8d66aa790e1b61baae7d64397386f739.call(this, event);\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQApxIm6\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200407437602598&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1373991799&quot;,&quot;check_hash&quot;:&quot;AQA-jiNzd4pG_lck&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQDQFbb-noUffn08-wYWq3sqYkrBn6PemZTva6mbp5t66h4yjEavOAYdkUoacT9VWRl0uDEW7vDbks_tWcJUANE75miHVSFsRLzVp0z6QRS8A-6U-bxgPk4MluQZyAw547yznIXQx6K5k79h3Q5XWXZCoLRpUsMobuUIt5V7QrU3wrLvqhL5bMnzwHbz3QzSYT6d5SwYbBLB-UDRNhNwiVw-SMynyyl0eYXm5Sh70OjHuBFTR0b0dpGqqRbsfSmcbiDTCwszsk-U82fECniRaqHQxpG7Kl5ystDd2c73YJ7j85bFpA6-N8fT1jM32e0sJM7oSj21k3xAu4cp7omIf5ObzedtL5uoB9-D2VKTHaFWRhDg-CzF1cwJDRSRPvlhZ5sWyw1hjgpeB2bGwZymew_x\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200407437602598&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1x\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-fbTimelineLightStarButton__root lfloat\"><i class=\"-cx-PRIVATE-fbTimelineLightStarButton__icon\"></i></div><div class=\"-cx-PRIVATE-uiInlineBlock__root uiPopover -cx-PRIVATE-fbTimelineLightCurationControl__options\" id=\"u_0_1j\"><a class=\"-cx-PRIVATE-fbEntstreamFeedObjectOptions__button -cx-PRIVATE-uiPopover__trigger\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_1k\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_2953496614934485437\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1f\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851147&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;2953496614934485437&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1373055341\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200350995551582\"><abbr title=\"Friday, July 5, 2013 at 4:15pm\" data-utime=\"1373066141\">July 5</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_at8kd9 sx_7236dd\"></i></a></div></div></div><div class=\"-cx-PRIVATE-fbTimelineStatusUnit__root\"><div class=\"userContentWrapper\"><div class=\"-cx-PRIVATE-fbTimelineText__featured\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">In the Place de la Comédie, there was an accordionist with a very nice, presumably authentic French, Musette accordion. A very French scene.<br /> <br /> This man could not play the Musette if his life depended on it. It made me sad. The twit didn&#039;t even TOUCH the bass manual. What an incompetent imbecile.</span></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ea50c220f0c56f9626ed836465287113b604bb8c2(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"s5d477cde23cb1a7f57a088737efffe8a30cfd7d4\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ea50c220f0c56f9626ed836465287113b604bb8c2(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s5d477cde23cb1a7f57a088737efffe8a30cfd7d4_0\"), (s5d477cde23cb1a7f57a088737efffe8a30cfd7d4_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var s5d477cde23cb1a7f57a088737efffe8a30cfd7d4_0_instance;\n    ((s5d477cde23cb1a7f57a088737efffe8a30cfd7d4_0_instance) = ((JSBNG_Record.eventInstance)((\"s5d477cde23cb1a7f57a088737efffe8a30cfd7d4_0\"))));\n    ((JSBNG_Record.markFunction)((ea50c220f0c56f9626ed836465287113b604bb8c2)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200350995551582_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200350995551582_4955918&quot;&#125;\" id=\"u_0_1p\" onsubmit=\"return ea50c220f0c56f9626ed836465287113b604bb8c2.call(this, event);\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQApxIm6\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200350995551582&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1373055341&quot;,&quot;check_hash&quot;:&quot;AQCBBladrqmNC16S&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQAlgopmGq0ZHy3R2kG5GCpd5xIfDZrje41Cn5hx-UlsHHRAwheTYxSzlwYwMpREMCS1JzMspOsjwHMvtkLT5mevdKJ5cVCAvAuX27rrKowEqOkMfTMLZUPN1rAxw6MGGS4mPIFncGunb2x4Zvciyb1ByglygI1yMRvuoa0v4NOWz9oh4WDi2m6Yy88oHchGKfGyFif0A5kPret2iWpsleSHzYdahUXoAaZMKVWrob8i3juFAvTKWa-tKVBuqqiY5_tJc35Sx0baaluOD2TWxJk6gE6A0q-OqdD3ula2NuhAZsxRB372jbu-OT-yYpSXLZvKCLeWcqezaITd_2k9ZLyRDI2-ZyHmhsluREWOeZsnozHStiTfaGOkH_uKR5zOCvqJMygffpWg7KXJ8QMncKZt\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200350995551582&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1v\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-fbTimelineLightStarButton__root lfloat\"><i class=\"-cx-PRIVATE-fbTimelineLightStarButton__icon\"></i></div><div class=\"-cx-PRIVATE-uiInlineBlock__root uiPopover -cx-PRIVATE-fbTimelineLightCurationControl__options\" id=\"u_0_1g\"><a class=\"-cx-PRIVATE-fbEntstreamFeedObjectOptions__button -cx-PRIVATE-uiPopover__trigger\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_1h\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"l\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_4498726532280095426\"><div class=\"topBorder\"></div><div class=\"timelineUnitContainer\" id=\"u_0_1c\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851147&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;4498726532280095426&quot;,&quot;timeline_unit_type&quot;:&quot;StatusMessageUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"1372923465\"><div class=\"\"><div role=\"article\"><div class=\"clearfix mbs pbs -cx-PRIVATE-fbTimelineUnitActor__root\"><a class=\"-cx-PUBLIC-fbTimelineUnitActor__imagewrap -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__smallimage\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u003C&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\"><img class=\"-cx-PRIVATE-fbTimelineUnitActor__image img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiImageBlockDeprecated__smallcontent -cx-PRIVATE-uiImageBlockDeprecated__content\"><h5 class=\"-cx-PRIVATE-fbTimelineUnitActor__header\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><span class=\"fcg\"><span class=\"fwb\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?hc_location=timeline\" data-hovercard=\"/ajax/hovercard/user.php?id=1055580469&amp;extragetparams=%7B%22hc_location%22%3A%22timeline%22%7D\">Gregor Richards</a></span></span> </h5><div class=\"-cx-PRIVATE-fbTimelineUnitActor__timestamp fsm fwn fcg\"><a class=\"uiLinkSubtle\" href=\"/LawlabeeTheWallaby/posts/10200343222477260\"><abbr title=\"Thursday, July 4, 2013 at 3:37am\" data-utime=\"1372934265\">July 4</abbr></a><a data-hover=\"tooltip\" aria-label=\"Public\" class=\"uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator -cx-PRIVATE-fbTimelineUnitActor__privacy\" href=\"#\" role=\"button\"><i class=\"lock img sp_at8kd9 sx_7236dd\"></i></a></div></div></div><div class=\"-cx-PRIVATE-fbTimelineStatusUnit__root\"><div class=\"userContentWrapper\"><div class=\"-cx-PRIVATE-fbTimelineText__featured\"><span data-ft=\"&#123;&quot;tn&quot;:&quot;K&quot;&#125;\" class=\"userContent\">This is the second time I&#039;ve been in France on American Independence Day...</span></div></div></div></div><div class=\"fbTimelineUFI uiCommentContainer\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2e5acfc36cc20d373a9d0d0e9e3546adb0bbe5af(event) {\\u000a    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\\u000a};\"), (\"sebf71c05c97e4e230be0ee4c1136c69e88ab589a\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2e5acfc36cc20d373a9d0d0e9e3546adb0bbe5af(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sebf71c05c97e4e230be0ee4c1136c69e88ab589a_0\"), (sebf71c05c97e4e230be0ee4c1136c69e88ab589a_0_instance), (this), (arguments)))\n        };\n        (null);\n        return (((((JSBNG_Record.get)(window, (\"JSBNG__Event\")))[(\"JSBNG__Event\")]) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])) && (((JSBNG_Record.get)(JSBNG__Event, (\"__inlineSubmit\")))[(\"__inlineSubmit\")])(this, JSBNG__event));\n    };\n    var sebf71c05c97e4e230be0ee4c1136c69e88ab589a_0_instance;\n    ((sebf71c05c97e4e230be0ee4c1136c69e88ab589a_0_instance) = ((JSBNG_Record.eventInstance)((\"sebf71c05c97e4e230be0ee4c1136c69e88ab589a_0\"))));\n    ((JSBNG_Record.markFunction)((e2e5acfc36cc20d373a9d0d0e9e3546adb0bbe5af)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><form rel=\"async\" class=\"live_10200343222477260_316526391751760 commentable_item autoexpand_mode\" method=\"post\" action=\"/ajax/ufi/modify.php\" data-live=\"&#123;&quot;seq&quot;:&quot;10200343222477260_4950571&quot;&#125;\" id=\"u_0_1o\" onsubmit=\"return e2e5acfc36cc20d373a9d0d0e9e3546adb0bbe5af.call(this, event);\"><input type=\"hidden\" name=\"charset_test\" value=\"&euro;,&acute;,€,´,水,Д,Є\" /><input type=\"hidden\" name=\"fb_dtsg\" value=\"AQApxIm6\" autocomplete=\"off\" /><input type=\"hidden\" autocomplete=\"off\" name=\"feedback_params\" value=\"&#123;&quot;actor&quot;:&quot;1055580469&quot;,&quot;target_fbid&quot;:&quot;10200343222477260&quot;,&quot;target_profile_id&quot;:&quot;1055580469&quot;,&quot;type_id&quot;:&quot;22&quot;,&quot;assoc_obj_id&quot;:&quot;&quot;,&quot;source_app_id&quot;:&quot;0&quot;,&quot;extra_story_params&quot;:[],&quot;content_timestamp&quot;:&quot;1372923465&quot;,&quot;check_hash&quot;:&quot;AQA0MfY19rbYGyj6&quot;,&quot;source&quot;:&quot;13&quot;&#125;\" /><input type=\"hidden\" autocomplete=\"off\" name=\"data_only_response\" value=\"1\" /><input type=\"hidden\" autocomplete=\"off\" name=\"timeline_ufi\" value=\"1\" /><input type=\"hidden\" name=\"timeline_log_data\" value=\"AQAr9lR2vZdldJ-VKsQo7OWaxXGctSzumkX_OWY9tMv34KoO2FztCqmqb8QBDYnKVWW99VqdbOskntjWhjy7W_MUFXYbmHi4oEJJ321uNu0XUYOzGWm_7u7pnY0zKn9thJ5ghe3h9Y4OukyraP07GphpWlsRiSVa_A-1EMIWIdeKmf-CJmEKmfCxEsM18xb2jjadO65ng8zpr6Dn3Z4o7hjV6OmtF3SCq3PgmXDdmdeFwvX8OgXFZncq4jrAd-dd1qH-0sddZKJuEM2b9WV5eyh_PipSNsi3uC6SpYHby30MLarSM5sgjVZxzOxLhdYkWGiF5kRqMgD0DZdRN5FoDtL6gTy-\\-\\Mt8pP_wYiB8kl7IExZc3NIFNruO-xiWNXHnSp7mFJ4K4onngXPGTiY4s_d4\" /><div class=\"fbTimelineFeedbackHeader\"><div class=\"fbTimelineFeedbackActions clearfix\"><span></span><span class=\"UIActionLinks UIActionLinks_bottom\" data-ft=\"&#123;&quot;tn&quot;:&quot;=&quot;,&quot;type&quot;:20&#125;\"><button title=\"Like this item\" type=\"submit\" name=\"like\" class=\"like_link stat_elem as_link\" data-ft=\"&#123;&quot;tn&quot;:&quot;&gt;&quot;,&quot;type&quot;:22&#125;\"><span class=\"default_message\">Like</span><span class=\"saving_message\">Unlike</span></button> &#183; <a class=\"share_action_link\" href=\"/ajax/sharer/?s=22&amp;appid=25554907596&amp;p%5B0%5D=1055580469&amp;p%5B1%5D=10200343222477260&amp;profile_id=1055580469&amp;share_source_type=unknown\" rel=\"dialog\" data-ft=\"&#123;&quot;tn&quot;:&quot;J&quot;,&quot;type&quot;:25&#125;\" title=\"Send this to friends or post it on your timeline.\" role=\"button\">Share</a></span></div></div><div><div class=\"uiUfi UFIContainer\" id=\"u_0_1z\"></div></div></form></div><div class=\"-cx-PRIVATE-fbTimelineLightCurationControl__root\"><div class=\"-cx-PRIVATE-fbTimelineLightStarButton__root lfloat\"><i class=\"-cx-PRIVATE-fbTimelineLightStarButton__icon\"></i></div><div class=\"-cx-PRIVATE-uiInlineBlock__root uiPopover -cx-PRIVATE-fbTimelineLightCurationControl__options\" id=\"u_0_1d\"><a class=\"-cx-PRIVATE-fbEntstreamFeedObjectOptions__button -cx-PRIVATE-uiPopover__trigger\" href=\"#\" aria-haspopup=\"true\" aria-expanded=\"false\" rel=\"toggle\" role=\"button\" id=\"u_0_1e\"></a></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li> ";
// undefined
o33 = null;
// 1999
o32.parentNode = o16;
// 2001
f81632121_521.returns.push(o32);
// undefined
o32 = null;
// 2003
o32 = {};
// 2004
f81632121_476.returns.push(o32);
// 2005
// 2007
o33 = {};
// 2008
f81632121_474.returns.push(o33);
// 2009
o34 = {};
// undefined
fo81632121_553_firstChild = function() { return fo81632121_553_firstChild.returns[fo81632121_553_firstChild.inst++]; };
fo81632121_553_firstChild.returns = [];
fo81632121_553_firstChild.inst = 0;
defineGetter(o32, "firstChild", fo81632121_553_firstChild, undefined);
// undefined
o32 = null;
// undefined
fo81632121_553_firstChild.returns.push(o34);
// 2011
o33.appendChild = f81632121_478;
// undefined
fo81632121_553_firstChild.returns.push(o34);
// 2013
f81632121_478.returns.push(o34);
// 2014
o32 = {};
// undefined
fo81632121_553_firstChild.returns.push(o32);
// undefined
fo81632121_553_firstChild.returns.push(o32);
// 2018
f81632121_478.returns.push(o32);
// undefined
o32 = null;
// 2019
o32 = {};
// undefined
fo81632121_553_firstChild.returns.push(o32);
// undefined
fo81632121_553_firstChild.returns.push(o32);
// 2023
f81632121_478.returns.push(o32);
// undefined
o32 = null;
// 2024
o32 = {};
// undefined
fo81632121_553_firstChild.returns.push(o32);
// undefined
fo81632121_553_firstChild.returns.push(o32);
// 2028
f81632121_478.returns.push(o32);
// undefined
o32 = null;
// undefined
fo81632121_553_firstChild.returns.push(null);
// 2030
o31.appendChild = f81632121_478;
// 2031
f81632121_478.returns.push(o33);
// undefined
o33 = null;
// 2033
f81632121_506.returns.push("pagelet_timeline_recent_ocm");
// 2098
o32 = {};
// 2099
f81632121_508.returns.push(o32);
// 2100
o32.id = "u_0_1o";
// 2104
o33 = {};
// 2105
f81632121_508.returns.push(o33);
// 2106
o33.id = "u_0_1p";
// 2110
o35 = {};
// 2111
f81632121_508.returns.push(o35);
// 2112
o35.id = "u_0_1q";
// 2116
o36 = {};
// 2117
f81632121_508.returns.push(o36);
// 2118
o36.id = "u_0_1r";
// 2121
o37 = {};
// 2122
f81632121_476.returns.push(o37);
// 2123
// 2124
o38 = {};
// undefined
fo81632121_563_firstChild = function() { return fo81632121_563_firstChild.returns[fo81632121_563_firstChild.inst++]; };
fo81632121_563_firstChild.returns = [];
fo81632121_563_firstChild.inst = 0;
defineGetter(o37, "firstChild", fo81632121_563_firstChild, undefined);
// undefined
fo81632121_563_firstChild.returns.push(o38);
// undefined
o38 = null;
// 2126
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2128
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2130
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2132
// 2133
o38 = {};
// undefined
fo81632121_563_firstChild.returns.push(o38);
// undefined
o38 = null;
// 2135
// 2136
o38 = {};
// undefined
fo81632121_563_firstChild.returns.push(o38);
// undefined
o38 = null;
// 2138
// 2139
o38 = {};
// undefined
fo81632121_563_firstChild.returns.push(o38);
// undefined
o38 = null;
// 2141
// 2142
o38 = {};
// undefined
fo81632121_563_firstChild.returns.push(o38);
// undefined
o38 = null;
// 2144
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2146
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2148
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2150
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2152
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2154
// undefined
fo81632121_563_firstChild.returns.push(null);
// 2156
// undefined
o37 = null;
// 2157
o37 = {};
// undefined
fo81632121_563_firstChild.returns.push(o37);
// undefined
o37 = null;
// 2160
o37 = {};
// 2161
f81632121_476.returns.push(o37);
// 2162
o38 = {};
// 2163
o0.implementation = o38;
// 2165
f81632121_572 = function() { return f81632121_572.returns[f81632121_572.inst++]; };
f81632121_572.returns = [];
f81632121_572.inst = 0;
// 2166
o38.hasFeature = f81632121_572;
// undefined
o38 = null;
// 2169
f81632121_572.returns.push(false);
// 2171
o38 = {};
// 2172
f81632121_476.returns.push(o38);
// undefined
o38 = null;
// 2174
o38 = {};
// 2175
f81632121_476.returns.push(o38);
// 2176
f81632121_575 = function() { return f81632121_575.returns[f81632121_575.inst++]; };
f81632121_575.returns = [];
f81632121_575.inst = 0;
// 2177
o38.setAttribute = f81632121_575;
// 2178
f81632121_575.returns.push(undefined);
// 2179
o38.JSBNG__onchange = null;
// 2181
// 2182
f81632121_576 = function() { return f81632121_576.returns[f81632121_576.inst++]; };
f81632121_576.returns = [];
f81632121_576.inst = 0;
// 2183
o38.removeAttribute = f81632121_576;
// undefined
o38 = null;
// 2184
f81632121_576.returns.push(undefined);
// 2186
o38 = {};
// 2187
f81632121_476.returns.push(o38);
// 2188
o38.setAttribute = f81632121_575;
// 2189
f81632121_575.returns.push(undefined);
// 2190
o38.JSBNG__oninput = null;
// 2192
// 2193
o38.removeAttribute = f81632121_576;
// undefined
o38 = null;
// 2194
f81632121_576.returns.push(undefined);
// 2195
o38 = {};
// 2196
f81632121_70.returns.push(o38);
// undefined
o38 = null;
// 2197
ow81632121.JSBNG__attachEvent = undefined;
// 2198
f81632121_466.returns.push(0.7659583722706884);
// 2200
o38 = {};
// 2201
f81632121_476.returns.push(o38);
// 2202
// 2203
// 2204
o38.getElementsByTagName = f81632121_502;
// 2205
o39 = {};
// 2206
f81632121_502.returns.push(o39);
// 2207
o39.length = 0;
// undefined
o39 = null;
// 2209
o39 = {};
// 2210
o38.childNodes = o39;
// undefined
o38 = null;
// 2211
o39.nodeType = void 0;
// undefined
o39 = null;
// 2213
o38 = {};
// 2214
f81632121_508.returns.push(o38);
// 2215
o38.id = "u_0_1t";
// 2216
o38.getElementsByTagName = f81632121_502;
// 2217
o39 = {};
// 2218
o38.parentNode = o39;
// 2236
f81632121_467.returns.push(1374851214506);
// 2241
o40 = {};
// 2242
f81632121_504.returns.push(o40);
// 2243
o40.length = 0;
// undefined
o40 = null;
// 2244
f81632121_14.returns.push(undefined);
// 2245
f81632121_12.returns.push(5);
// undefined
fo81632121_582_firstChild = function() { return fo81632121_582_firstChild.returns[fo81632121_582_firstChild.inst++]; };
fo81632121_582_firstChild.returns = [];
fo81632121_582_firstChild.inst = 0;
defineGetter(o38, "firstChild", fo81632121_582_firstChild, undefined);
// undefined
fo81632121_582_firstChild.returns.push(null);
// undefined
fo81632121_582_firstChild.returns.push(null);
// 2258
f81632121_7.returns.push(undefined);
// 2259
ow81632121.JSBNG__onJSBNG__scroll = undefined;
// 2260
f81632121_7.returns.push(undefined);
// 2261
f81632121_585 = function() { return f81632121_585.returns[f81632121_585.inst++]; };
f81632121_585.returns = [];
f81632121_585.inst = 0;
// 2262
ow81632121.JSBNG__onresize = f81632121_585;
// 2265
o0.nodeName = "#document";
// 2266
o0.__FB_TOKEN = void 0;
// 2267
// 2268
o0.getAttribute = void 0;
// 2271
f81632121_468.returns.push(undefined);
// 2272
o0.JSBNG__onmouseover = null;
// 2277
f81632121_468.returns.push(undefined);
// 2278
o0.JSBNG__onmousedown = null;
// 2283
f81632121_468.returns.push(undefined);
// 2284
o0.JSBNG__onmouseup = null;
// 2289
f81632121_468.returns.push(undefined);
// 2290
o0.JSBNG__onmousemove = null;
// 2295
f81632121_468.returns.push(undefined);
// 2296
o0.JSBNG__onmouseout = null;
// 2301
f81632121_468.returns.push(undefined);
// 2302
o0.JSBNG__onclick = null;
// 2307
f81632121_468.returns.push(undefined);
// 2308
o0.JSBNG__ondblclick = null;
// 2313
f81632121_468.returns.push(undefined);
// 2314
o0.JSBNG__onkeyup = null;
// 2319
f81632121_468.returns.push(undefined);
// 2320
o0.JSBNG__onkeypress = null;
// 2325
f81632121_468.returns.push(undefined);
// 2326
o0.JSBNG__onkeydown = null;
// 2331
f81632121_468.returns.push(undefined);
// 2332
o0.JSBNG__oninput = null;
// 2337
f81632121_468.returns.push(undefined);
// 2338
o0.JSBNG__onchange = null;
// 2343
f81632121_468.returns.push(undefined);
// 2344
o0.JSBNG__onselectionchange = null;
// 2349
f81632121_468.returns.push(undefined);
// 2350
o0.JSBNG__onDOMCharacterDataModified = void 0;
// 2353
o40 = {};
// 2354
f81632121_476.returns.push(o40);
// 2355
o40.setAttribute = f81632121_575;
// 2356
f81632121_575.returns.push(undefined);
// 2357
o40.JSBNG__ondrag = null;
// 2359
// 2360
o40.removeAttribute = f81632121_576;
// undefined
o40 = null;
// 2361
f81632121_576.returns.push(undefined);
// 2363
o40 = {};
// 2364
f81632121_476.returns.push(o40);
// 2365
o40.setAttribute = f81632121_575;
// 2366
f81632121_575.returns.push(undefined);
// 2367
o40.JSBNG__onwheel = void 0;
// 2369
o40.removeAttribute = f81632121_576;
// undefined
o40 = null;
// 2370
f81632121_576.returns.push(undefined);
// 2373
f81632121_572.returns.push(false);
// 2375
o40 = {};
// 2376
f81632121_476.returns.push(o40);
// 2377
o40.setAttribute = f81632121_575;
// 2378
f81632121_575.returns.push(undefined);
// 2379
o40.JSBNG__onmousewheel = null;
// 2381
// 2382
o40.removeAttribute = f81632121_576;
// undefined
o40 = null;
// 2383
f81632121_576.returns.push(undefined);
// 2387
f81632121_468.returns.push(undefined);
// 2388
o0.JSBNG__onDOMMouseScroll = void 0;
// 2390
o37.JSBNG__addEventListener = f81632121_468;
// undefined
o37 = null;
// 2392
o37 = {};
// 2393
f81632121_476.returns.push(o37);
// 2394
o37.setAttribute = f81632121_575;
// 2395
f81632121_575.returns.push(undefined);
// 2396
o37.JSBNG__onJSBNG__scroll = void 0;
// 2398
o37.removeAttribute = f81632121_576;
// undefined
o37 = null;
// 2399
f81632121_576.returns.push(undefined);
// 2405
o37 = {};
// 2406
f81632121_476.returns.push(o37);
// 2407
o37.setAttribute = f81632121_575;
// 2408
f81632121_575.returns.push(undefined);
// 2409
o37.JSBNG__onJSBNG__focus = void 0;
// 2411
o37.removeAttribute = f81632121_576;
// undefined
o37 = null;
// 2412
f81632121_576.returns.push(undefined);
// 2414
o37 = {};
// 2415
f81632121_476.returns.push(o37);
// 2416
o37.setAttribute = f81632121_575;
// 2417
f81632121_575.returns.push(undefined);
// 2418
o37.JSBNG__onfocusin = void 0;
// 2420
o37.removeAttribute = f81632121_576;
// undefined
o37 = null;
// 2421
f81632121_576.returns.push(undefined);
// undefined
fo81632121_582_firstChild.returns.push(null);
// 2423
f81632121_466.returns.push(0.982902241172269);
// 2425
f81632121_467.returns.push(1374851214525);
// 2427
f81632121_467.returns.push(1374851214526);
// 2429
o16.nodeName = "BODY";
// 2431
o16.contentEditable = "inherit";
// 2433
f81632121_467.returns.push(1374851214540);
// 2435
f81632121_467.returns.push(1374851214540);
// 2437
f81632121_467.returns.push(1374851214540);
// 2439
f81632121_467.returns.push(1374851214540);
// 2441
f81632121_467.returns.push(1374851214540);
// 2442
o38.nodeType = 1;
// 2446
o37 = {};
// 2447
f81632121_474.returns.push(o37);
// 2449
f81632121_467.returns.push(1374851214554);
// 2451
o40 = {};
// 2452
f81632121_476.returns.push(o40);
// 2453
// 2454
// 2455
// 2456
// 2457
// 2458
// 2459
o37.appendChild = f81632121_478;
// 2460
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2462
f81632121_467.returns.push(1374851214554);
// 2464
o40 = {};
// 2465
f81632121_476.returns.push(o40);
// 2466
// 2467
// 2468
// 2469
// 2470
// 2471
// 2473
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2475
f81632121_467.returns.push(1374851214555);
// 2477
o40 = {};
// 2478
f81632121_476.returns.push(o40);
// 2479
// 2480
// 2481
// 2482
// 2483
// 2484
// 2486
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2488
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 2490
o37 = {};
// 2491
f81632121_476.returns.push(o37);
// 2492
o37.setAttribute = f81632121_575;
// 2494
f81632121_575.returns.push(undefined);
// 2495
// 2496
o37.firstChild = null;
// 2498
o40 = {};
// 2499
f81632121_474.returns.push(o40);
// 2500
f81632121_598 = function() { return f81632121_598.returns[f81632121_598.inst++]; };
f81632121_598.returns = [];
f81632121_598.inst = 0;
// 2501
o0.createTextNode = f81632121_598;
// 2502
o41 = {};
// 2503
f81632121_598.returns.push(o41);
// 2504
o40.appendChild = f81632121_478;
// 2505
f81632121_478.returns.push(o41);
// undefined
o41 = null;
// 2506
o37.appendChild = f81632121_478;
// 2507
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2509
o40 = {};
// 2510
f81632121_476.returns.push(o40);
// 2511
// 2512
// 2513
o41 = {};
// 2514
o40.classList = o41;
// 2516
f81632121_602 = function() { return f81632121_602.returns[f81632121_602.inst++]; };
f81632121_602.returns = [];
f81632121_602.inst = 0;
// 2517
o41.add = f81632121_602;
// undefined
o41 = null;
// 2518
f81632121_602.returns.push(undefined);
// 2520
o41 = {};
// 2521
f81632121_476.returns.push(o41);
// 2522
o41.firstChild = null;
// 2524
o42 = {};
// 2525
f81632121_474.returns.push(o42);
// 2527
o43 = {};
// 2528
f81632121_598.returns.push(o43);
// 2529
o42.appendChild = f81632121_478;
// 2530
f81632121_478.returns.push(o43);
// undefined
o43 = null;
// 2531
o37.__html = void 0;
// undefined
o37 = null;
// 2532
o40.__html = void 0;
// undefined
o40 = null;
// 2533
o41.appendChild = f81632121_478;
// 2534
f81632121_478.returns.push(o42);
// undefined
o42 = null;
// 2535
o41.innerHTML = "When you add a hat it removes the long hair ";
// undefined
o41 = null;
// 2537
f81632121_467.returns.push(1374851214574);
// 2541
o37 = {};
// 2542
f81632121_474.returns.push(o37);
// 2544
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 2546
o37 = {};
// 2547
f81632121_476.returns.push(o37);
// 2548
o37.firstChild = null;
// 2550
o40 = {};
// 2551
f81632121_474.returns.push(o40);
// 2553
o41 = {};
// 2554
f81632121_598.returns.push(o41);
// 2555
o40.appendChild = f81632121_478;
// 2556
f81632121_478.returns.push(o41);
// undefined
o41 = null;
// 2557
o37.appendChild = f81632121_478;
// 2558
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2559
o37.innerHTML = "so.. the hair is a hat?  steam's not down with hats on hats?";
// undefined
o37 = null;
// 2561
f81632121_467.returns.push(1374851214586);
// 2565
o37 = {};
// 2566
f81632121_474.returns.push(o37);
// 2568
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 2570
o37 = {};
// 2571
f81632121_476.returns.push(o37);
// 2572
o37.firstChild = null;
// 2574
o40 = {};
// 2575
f81632121_474.returns.push(o40);
// 2577
o41 = {};
// 2578
f81632121_598.returns.push(o41);
// 2579
o40.appendChild = f81632121_478;
// 2580
f81632121_478.returns.push(o41);
// undefined
o41 = null;
// 2581
o37.appendChild = f81632121_478;
// 2582
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2583
o37.innerHTML = "(This is Saints Row the Third, so can't really blame Steam)";
// undefined
o37 = null;
// 2585
o37 = {};
// 2586
f81632121_476.returns.push(o37);
// 2587
o37.firstChild = null;
// 2589
o40 = {};
// 2590
f81632121_474.returns.push(o40);
// 2592
o41 = {};
// 2593
f81632121_598.returns.push(o41);
// 2594
o40.appendChild = f81632121_478;
// 2595
f81632121_478.returns.push(o41);
// undefined
o41 = null;
// 2596
o37.appendChild = f81632121_478;
// 2597
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2598
o37.innerHTML = "No, hats are a separate customization option, but it wouldn't let you combine long hair with the hat. It's like he stuffed all the hair into his hat.";
// undefined
o37 = null;
// 2600
f81632121_467.returns.push(1374851214595);
// 2604
o37 = {};
// 2605
f81632121_474.returns.push(o37);
// 2607
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 2609
o37 = {};
// 2610
f81632121_476.returns.push(o37);
// 2611
o37.setAttribute = f81632121_575;
// 2613
f81632121_575.returns.push(undefined);
// 2614
// 2615
o37.firstChild = null;
// 2617
o40 = {};
// 2618
f81632121_474.returns.push(o40);
// 2620
o41 = {};
// 2621
f81632121_598.returns.push(o41);
// 2622
o40.appendChild = f81632121_478;
// 2623
f81632121_478.returns.push(o41);
// undefined
o41 = null;
// 2624
o37.appendChild = f81632121_478;
// 2625
f81632121_478.returns.push(o40);
// undefined
o40 = null;
// 2627
o40 = {};
// 2628
f81632121_476.returns.push(o40);
// 2629
// 2630
// 2631
o41 = {};
// 2632
o40.classList = o41;
// 2634
o41.add = f81632121_602;
// undefined
o41 = null;
// 2635
f81632121_602.returns.push(undefined);
// 2637
o41 = {};
// 2638
f81632121_476.returns.push(o41);
// 2639
o41.firstChild = null;
// 2641
o42 = {};
// 2642
f81632121_474.returns.push(o42);
// 2644
o43 = {};
// 2645
f81632121_598.returns.push(o43);
// 2646
o42.appendChild = f81632121_478;
// 2647
f81632121_478.returns.push(o43);
// undefined
o43 = null;
// 2648
o37.__html = void 0;
// undefined
o37 = null;
// 2649
o40.__html = void 0;
// undefined
o40 = null;
// 2650
o41.appendChild = f81632121_478;
// 2651
f81632121_478.returns.push(o42);
// undefined
o42 = null;
// 2652
o41.innerHTML = "You finally tried Saints Row the Third? ";
// undefined
o41 = null;
// 2654
f81632121_467.returns.push(1374851214609);
// 2656
o38.nextSibling = null;
// 2657
o39.removeChild = f81632121_521;
// 2658
f81632121_521.returns.push(o38);
// 2659
// 2660
o39.appendChild = f81632121_478;
// 2661
f81632121_478.returns.push(o38);
// 2663
f81632121_467.returns.push(1374851214619);
// 2665
f81632121_467.returns.push(1374851214619);
// 2668
f81632121_467.returns.push(1374851214619);
// 2670
f81632121_467.returns.push(1374851214620);
// 2672
f81632121_467.returns.push(1374851214620);
// 2674
f81632121_467.returns.push(1374851214620);
// 2675
o37 = {};
// undefined
fo81632121_582_firstChild.returns.push(o37);
// 2677
o37.getAttribute = f81632121_506;
// 2679
f81632121_506.returns.push(".r[5uo4e]");
// 2680
o40 = {};
// 2681
o37.firstChild = o40;
// 2682
o40.getAttribute = f81632121_506;
// 2684
f81632121_506.returns.push(".r[5uo4e].[1][4][0]");
// 2685
o41 = {};
// 2686
o40.firstChild = o41;
// undefined
o41 = null;
// 2687
o41 = {};
// 2688
o40.nextSibling = o41;
// undefined
o40 = null;
// 2689
o41.getAttribute = f81632121_506;
// 2691
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}");
// 2692
o40 = {};
// 2693
o41.firstChild = o40;
// 2694
o40.getAttribute = f81632121_506;
// 2696
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0]");
// 2697
o42 = {};
// 2698
o40.firstChild = o42;
// undefined
o40 = null;
// 2699
o42.getAttribute = f81632121_506;
// 2701
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[left]");
// 2702
o40 = {};
// 2703
o42.firstChild = o40;
// undefined
o40 = null;
// 2704
o40 = {};
// 2705
o42.nextSibling = o40;
// undefined
o42 = null;
// 2706
o40.getAttribute = f81632121_506;
// 2708
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right]");
// 2709
o42 = {};
// 2710
o40.firstChild = o42;
// undefined
o40 = null;
// 2711
o42.getAttribute = f81632121_506;
// 2713
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0]");
// 2714
o40 = {};
// 2715
o42.firstChild = o40;
// undefined
o42 = null;
// 2716
o40.getAttribute = f81632121_506;
// 2718
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left]");
// 2719
o42 = {};
// 2720
o40.firstChild = o42;
// undefined
o40 = null;
// 2721
o42.getAttribute = f81632121_506;
// 2723
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left].[0]");
// 2724
o40 = {};
// 2725
o42.firstChild = o40;
// undefined
o42 = null;
// 2726
o40.getAttribute = f81632121_506;
// 2728
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left].[0].[0]");
// 2729
o42 = {};
// 2730
o40.firstChild = o42;
// undefined
o40 = null;
// 2731
o42.getAttribute = f81632121_506;
// 2733
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left].[0].[0].[0][0]");
// 2734
o40 = {};
// 2735
o42.firstChild = o40;
// undefined
o40 = null;
// 2736
o40 = {};
// 2737
o42.nextSibling = o40;
// undefined
o42 = null;
// 2738
o40.getAttribute = f81632121_506;
// 2740
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left].[0].[0].[0][1]");
// 2741
o42 = {};
// 2742
o40.firstChild = o42;
// undefined
o42 = null;
// 2743
o42 = {};
// 2744
o40.nextSibling = o42;
// undefined
o40 = null;
// 2745
o42.getAttribute = f81632121_506;
// 2747
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left].[0].[0].[0][2]");
// 2748
o40 = {};
// 2749
o42.firstChild = o40;
// undefined
o40 = null;
// 2750
o40 = {};
// 2751
o42.nextSibling = o40;
// undefined
o42 = null;
// 2752
o40.getAttribute = f81632121_506;
// undefined
o40 = null;
// 2754
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}.[0].[right].[0].[left].[0].[0].[3]");
// 2757
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}");
// 2758
f81632121_645 = function() { return f81632121_645.returns[f81632121_645.inst++]; };
f81632121_645.returns = [];
f81632121_645.inst = 0;
// 2759
o38.contains = f81632121_645;
// 2761
f81632121_645.returns.push(true);
// undefined
fo81632121_582_firstChild.returns.push(o37);
// 2765
f81632121_506.returns.push(".r[5uo4e]");
// 2769
f81632121_506.returns.push(".r[5uo4e].[1][4][0]");
// 2774
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}");
// 2776
o40 = {};
// 2777
o41.nextSibling = o40;
// undefined
o41 = null;
// 2778
o40.getAttribute = f81632121_506;
// 2780
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}");
// 2781
o41 = {};
// 2782
o40.firstChild = o41;
// 2783
o41.getAttribute = f81632121_506;
// 2785
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0]");
// 2786
o42 = {};
// 2787
o41.firstChild = o42;
// undefined
o41 = null;
// 2788
o42.getAttribute = f81632121_506;
// 2790
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[left]");
// 2791
o41 = {};
// 2792
o42.firstChild = o41;
// undefined
o41 = null;
// 2793
o41 = {};
// 2794
o42.nextSibling = o41;
// undefined
o42 = null;
// 2795
o41.getAttribute = f81632121_506;
// 2797
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right]");
// 2798
o42 = {};
// 2799
o41.firstChild = o42;
// undefined
o41 = null;
// 2800
o42.getAttribute = f81632121_506;
// 2802
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0]");
// 2803
o41 = {};
// 2804
o42.firstChild = o41;
// undefined
o42 = null;
// 2805
o41.getAttribute = f81632121_506;
// 2807
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left]");
// 2808
o42 = {};
// 2809
o41.firstChild = o42;
// undefined
o41 = null;
// 2810
o42.getAttribute = f81632121_506;
// 2812
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left].[0]");
// 2813
o41 = {};
// 2814
o42.firstChild = o41;
// undefined
o42 = null;
// 2815
o41.getAttribute = f81632121_506;
// 2817
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left].[0].[0]");
// 2818
o42 = {};
// 2819
o41.firstChild = o42;
// undefined
o41 = null;
// 2820
o42.getAttribute = f81632121_506;
// 2822
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left].[0].[0].[0][0]");
// 2823
o41 = {};
// 2824
o42.firstChild = o41;
// undefined
o41 = null;
// 2825
o41 = {};
// 2826
o42.nextSibling = o41;
// undefined
o42 = null;
// 2827
o41.getAttribute = f81632121_506;
// 2829
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left].[0].[0].[0][1]");
// 2830
o42 = {};
// 2831
o41.firstChild = o42;
// undefined
o42 = null;
// 2832
o42 = {};
// 2833
o41.nextSibling = o42;
// undefined
o41 = null;
// 2834
o42.getAttribute = f81632121_506;
// 2836
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left].[0].[0].[0][2]");
// 2837
o41 = {};
// 2838
o42.firstChild = o41;
// undefined
o41 = null;
// 2839
o41 = {};
// 2840
o42.nextSibling = o41;
// undefined
o42 = null;
// 2841
o41.getAttribute = f81632121_506;
// undefined
o41 = null;
// 2843
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}.[0].[right].[0].[left].[0].[0].[3]");
// 2846
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}");
// 2849
f81632121_645.returns.push(true);
// undefined
fo81632121_582_firstChild.returns.push(o37);
// 2853
f81632121_506.returns.push(".r[5uo4e]");
// 2857
f81632121_506.returns.push(".r[5uo4e].[1][4][0]");
// 2862
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}");
// 2867
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}");
// 2869
o41 = {};
// 2870
o40.nextSibling = o41;
// undefined
o40 = null;
// 2871
o41.getAttribute = f81632121_506;
// 2873
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}");
// 2874
o40 = {};
// 2875
o41.firstChild = o40;
// 2876
o40.getAttribute = f81632121_506;
// 2878
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0]");
// 2879
o42 = {};
// 2880
o40.firstChild = o42;
// undefined
o40 = null;
// 2881
o42.getAttribute = f81632121_506;
// 2883
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[left]");
// 2884
o40 = {};
// 2885
o42.firstChild = o40;
// undefined
o40 = null;
// 2886
o40 = {};
// 2887
o42.nextSibling = o40;
// undefined
o42 = null;
// 2888
o40.getAttribute = f81632121_506;
// 2890
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right]");
// 2891
o42 = {};
// 2892
o40.firstChild = o42;
// undefined
o40 = null;
// 2893
o42.getAttribute = f81632121_506;
// 2895
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0]");
// 2896
o40 = {};
// 2897
o42.firstChild = o40;
// undefined
o42 = null;
// 2898
o40.getAttribute = f81632121_506;
// 2900
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left]");
// 2901
o42 = {};
// 2902
o40.firstChild = o42;
// undefined
o40 = null;
// 2903
o42.getAttribute = f81632121_506;
// 2905
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left].[0]");
// 2906
o40 = {};
// 2907
o42.firstChild = o40;
// undefined
o42 = null;
// 2908
o40.getAttribute = f81632121_506;
// 2910
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left].[0].[0]");
// 2911
o42 = {};
// 2912
o40.firstChild = o42;
// undefined
o40 = null;
// 2913
o42.getAttribute = f81632121_506;
// 2915
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left].[0].[0].[0][0]");
// 2916
o40 = {};
// 2917
o42.firstChild = o40;
// undefined
o40 = null;
// 2918
o40 = {};
// 2919
o42.nextSibling = o40;
// undefined
o42 = null;
// 2920
o40.getAttribute = f81632121_506;
// 2922
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left].[0].[0].[0][1]");
// 2923
o42 = {};
// 2924
o40.firstChild = o42;
// undefined
o42 = null;
// 2925
o42 = {};
// 2926
o40.nextSibling = o42;
// undefined
o40 = null;
// 2927
o42.getAttribute = f81632121_506;
// 2929
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left].[0].[0].[0][2]");
// 2930
o40 = {};
// 2931
o42.firstChild = o40;
// undefined
o40 = null;
// 2932
o40 = {};
// 2933
o42.nextSibling = o40;
// undefined
o42 = null;
// 2934
o40.getAttribute = f81632121_506;
// undefined
o40 = null;
// 2936
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}.[0].[right].[0].[left].[0].[0].[3]");
// 2939
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}");
// 2942
f81632121_645.returns.push(true);
// undefined
fo81632121_582_firstChild.returns.push(o37);
// undefined
o37 = null;
// 2946
f81632121_506.returns.push(".r[5uo4e]");
// 2950
f81632121_506.returns.push(".r[5uo4e].[1][4][0]");
// 2955
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195897}");
// 2960
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195898}");
// 2965
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3195907}");
// 2967
o37 = {};
// 2968
o41.nextSibling = o37;
// undefined
o41 = null;
// 2969
o37.getAttribute = f81632121_506;
// 2971
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}");
// 2972
o40 = {};
// 2973
o37.firstChild = o40;
// undefined
o37 = null;
// 2974
o40.getAttribute = f81632121_506;
// 2976
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0]");
// 2977
o37 = {};
// 2978
o40.firstChild = o37;
// undefined
o40 = null;
// 2979
o37.getAttribute = f81632121_506;
// 2981
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[left]");
// 2982
o40 = {};
// 2983
o37.firstChild = o40;
// undefined
o40 = null;
// 2984
o40 = {};
// 2985
o37.nextSibling = o40;
// undefined
o37 = null;
// 2986
o40.getAttribute = f81632121_506;
// 2988
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right]");
// 2989
o37 = {};
// 2990
o40.firstChild = o37;
// undefined
o40 = null;
// 2991
o37.getAttribute = f81632121_506;
// 2993
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0]");
// 2994
o40 = {};
// 2995
o37.firstChild = o40;
// undefined
o37 = null;
// 2996
o40.getAttribute = f81632121_506;
// 2998
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left]");
// 2999
o37 = {};
// 3000
o40.firstChild = o37;
// undefined
o40 = null;
// 3001
o37.getAttribute = f81632121_506;
// 3003
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left].[0]");
// 3004
o40 = {};
// 3005
o37.firstChild = o40;
// undefined
o37 = null;
// 3006
o40.getAttribute = f81632121_506;
// 3008
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left].[0].[0]");
// 3009
o37 = {};
// 3010
o40.firstChild = o37;
// undefined
o40 = null;
// 3011
o37.getAttribute = f81632121_506;
// 3013
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left].[0].[0].[0][0]");
// 3014
o40 = {};
// 3015
o37.firstChild = o40;
// undefined
o40 = null;
// 3016
o40 = {};
// 3017
o37.nextSibling = o40;
// undefined
o37 = null;
// 3018
o40.getAttribute = f81632121_506;
// 3020
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left].[0].[0].[0][1]");
// 3021
o37 = {};
// 3022
o40.firstChild = o37;
// undefined
o37 = null;
// 3023
o37 = {};
// 3024
o40.nextSibling = o37;
// undefined
o40 = null;
// 3025
o37.getAttribute = f81632121_506;
// 3027
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left].[0].[0].[0][2]");
// 3028
o40 = {};
// 3029
o37.firstChild = o40;
// undefined
o40 = null;
// 3030
o40 = {};
// 3031
o37.nextSibling = o40;
// undefined
o37 = null;
// 3032
o40.getAttribute = f81632121_506;
// undefined
o40 = null;
// 3034
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}.[0].[right].[0].[left].[0].[0].[3]");
// 3037
f81632121_506.returns.push(".r[5uo4e].[1][4][1]{comment10200453104264236_3198160}");
// 3040
f81632121_645.returns.push(true);
// 3042
f81632121_467.returns.push(1374851214645);
// 3047
o37 = {};
// 3048
f81632121_504.returns.push(o37);
// 3049
o37.length = 4;
// 3050
o40 = {};
// 3051
o37["0"] = o40;
// 3052
o41 = {};
// 3053
o37["1"] = o41;
// 3054
o42 = {};
// 3055
o37["2"] = o42;
// 3056
o43 = {};
// 3057
o37["3"] = o43;
// undefined
o37 = null;
// 3058
f81632121_14.returns.push(undefined);
// 3059
f81632121_12.returns.push(6);
// 3060
o38.nodeName = "DIV";
// undefined
o38 = null;
// 3062
o39.nodeName = "DIV";
// 3063
o39.parentNode = o36;
// undefined
o39 = null;
// 3064
o36.nodeName = "FORM";
// 3068
o37 = {};
// 3069
f81632121_474.returns.push(o37);
// 3071
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 3084
o37 = {};
// 3085
f81632121_508.returns.push(o37);
// 3086
o37.id = "u_0_1v";
// 3087
o37.getElementsByTagName = f81632121_502;
// 3088
o38 = {};
// 3089
o37.parentNode = o38;
// 3106
f81632121_467.returns.push(1374851214684);
// 3111
o39 = {};
// 3112
f81632121_504.returns.push(o39);
// 3113
o39.length = 4;
// 3114
o39["0"] = o40;
// 3115
o39["1"] = o41;
// 3116
o39["2"] = o42;
// 3117
o39["3"] = o43;
// undefined
o39 = null;
// 3118
f81632121_14.returns.push(undefined);
// 3119
f81632121_12.returns.push(7);
// undefined
fo81632121_700_firstChild = function() { return fo81632121_700_firstChild.returns[fo81632121_700_firstChild.inst++]; };
fo81632121_700_firstChild.returns = [];
fo81632121_700_firstChild.inst = 0;
defineGetter(o37, "firstChild", fo81632121_700_firstChild, undefined);
// undefined
fo81632121_700_firstChild.returns.push(null);
// undefined
fo81632121_700_firstChild.returns.push(null);
// undefined
fo81632121_700_firstChild.returns.push(null);
// 3132
f81632121_466.returns.push(0.4838148937560618);
// 3134
f81632121_467.returns.push(1374851214688);
// 3136
f81632121_467.returns.push(1374851214688);
// 3142
f81632121_467.returns.push(1374851214688);
// 3144
f81632121_467.returns.push(1374851214689);
// 3146
f81632121_467.returns.push(1374851214689);
// 3148
f81632121_467.returns.push(1374851214689);
// 3150
f81632121_467.returns.push(1374851214689);
// 3151
o37.nodeType = 1;
// 3155
o39 = {};
// 3156
f81632121_474.returns.push(o39);
// 3158
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3162
o39 = {};
// 3163
f81632121_474.returns.push(o39);
// 3165
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3167
o39 = {};
// 3168
f81632121_476.returns.push(o39);
// 3169
o39.firstChild = null;
// 3171
o44 = {};
// 3172
f81632121_474.returns.push(o44);
// 3174
o45 = {};
// 3175
f81632121_598.returns.push(o45);
// 3176
o44.appendChild = f81632121_478;
// 3177
f81632121_478.returns.push(o45);
// undefined
o45 = null;
// 3178
o39.appendChild = f81632121_478;
// 3179
f81632121_478.returns.push(o44);
// undefined
o44 = null;
// 3180
o39.innerHTML = "You should have snatched it out of his hands, and played it/";
// undefined
o39 = null;
// 3182
f81632121_467.returns.push(1374851214713);
// 3186
o39 = {};
// 3187
f81632121_474.returns.push(o39);
// 3189
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3191
o39 = {};
// 3192
f81632121_476.returns.push(o39);
// 3193
o39.firstChild = null;
// 3195
o44 = {};
// 3196
f81632121_474.returns.push(o44);
// 3198
o45 = {};
// 3199
f81632121_598.returns.push(o45);
// 3200
o44.appendChild = f81632121_478;
// 3201
f81632121_478.returns.push(o45);
// undefined
o45 = null;
// 3202
o39.appendChild = f81632121_478;
// 3203
f81632121_478.returns.push(o44);
// undefined
o44 = null;
// 3204
o39.innerHTML = "I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.";
// undefined
o39 = null;
// 3206
f81632121_467.returns.push(1374851214723);
// 3210
o39 = {};
// 3211
f81632121_474.returns.push(o39);
// 3213
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3215
o39 = {};
// 3216
f81632121_476.returns.push(o39);
// 3217
o39.firstChild = null;
// 3219
o44 = {};
// 3220
f81632121_474.returns.push(o44);
// 3222
o45 = {};
// 3223
f81632121_598.returns.push(o45);
// 3224
o44.appendChild = f81632121_478;
// 3225
f81632121_478.returns.push(o45);
// undefined
o45 = null;
// 3226
o39.appendChild = f81632121_478;
// 3227
f81632121_478.returns.push(o44);
// undefined
o44 = null;
// 3228
o39.innerHTML = "But in English-speaking countries it's just fine.";
// undefined
o39 = null;
// 3230
f81632121_467.returns.push(1374851214731);
// 3234
o39 = {};
// 3235
f81632121_474.returns.push(o39);
// 3237
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3239
o39 = {};
// 3240
f81632121_476.returns.push(o39);
// 3241
o39.firstChild = null;
// 3243
o44 = {};
// 3244
f81632121_474.returns.push(o44);
// 3246
o45 = {};
// 3247
f81632121_598.returns.push(o45);
// 3248
o44.appendChild = f81632121_478;
// 3249
f81632121_478.returns.push(o45);
// undefined
o45 = null;
// 3250
o39.appendChild = f81632121_478;
// 3251
f81632121_478.returns.push(o44);
// undefined
o44 = null;
// 3252
o39.innerHTML = "Naturally.";
// undefined
o39 = null;
// 3254
f81632121_467.returns.push(1374851214741);
// 3256
o37.nextSibling = null;
// 3257
o38.removeChild = f81632121_521;
// 3258
f81632121_521.returns.push(o37);
// 3259
// 3260
o38.appendChild = f81632121_478;
// 3261
f81632121_478.returns.push(o37);
// 3263
f81632121_467.returns.push(1374851214759);
// 3265
f81632121_467.returns.push(1374851214759);
// 3268
f81632121_467.returns.push(1374851214759);
// 3270
f81632121_467.returns.push(1374851214759);
// 3272
f81632121_467.returns.push(1374851214759);
// 3274
f81632121_467.returns.push(1374851214759);
// 3275
o39 = {};
// undefined
fo81632121_700_firstChild.returns.push(o39);
// 3277
o39.getAttribute = f81632121_506;
// 3279
f81632121_506.returns.push(".r[2vp51]");
// 3280
o44 = {};
// 3281
o39.firstChild = o44;
// 3282
o44.getAttribute = f81632121_506;
// 3284
f81632121_506.returns.push(".r[2vp51].[1][0]");
// 3285
o45 = {};
// 3286
o44.firstChild = o45;
// undefined
o45 = null;
// 3287
o45 = {};
// 3288
o44.nextSibling = o45;
// undefined
o44 = null;
// 3289
o45.getAttribute = f81632121_506;
// 3291
f81632121_506.returns.push(".r[2vp51].[1][4][0]");
// 3292
o44 = {};
// 3293
o45.firstChild = o44;
// undefined
o44 = null;
// 3294
o44 = {};
// 3295
o45.nextSibling = o44;
// undefined
o45 = null;
// 3296
o44.getAttribute = f81632121_506;
// 3298
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}");
// 3299
o45 = {};
// 3300
o44.firstChild = o45;
// 3301
o45.getAttribute = f81632121_506;
// 3303
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0]");
// 3304
o46 = {};
// 3305
o45.firstChild = o46;
// undefined
o45 = null;
// 3306
o46.getAttribute = f81632121_506;
// 3308
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[left]");
// 3309
o45 = {};
// 3310
o46.firstChild = o45;
// undefined
o45 = null;
// 3311
o45 = {};
// 3312
o46.nextSibling = o45;
// undefined
o46 = null;
// 3313
o45.getAttribute = f81632121_506;
// 3315
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right]");
// 3316
o46 = {};
// 3317
o45.firstChild = o46;
// undefined
o45 = null;
// 3318
o46.getAttribute = f81632121_506;
// 3320
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0]");
// 3321
o45 = {};
// 3322
o46.firstChild = o45;
// undefined
o46 = null;
// 3323
o45.getAttribute = f81632121_506;
// 3325
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left]");
// 3326
o46 = {};
// 3327
o45.firstChild = o46;
// undefined
o45 = null;
// 3328
o46.getAttribute = f81632121_506;
// 3330
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0]");
// 3331
o45 = {};
// 3332
o46.firstChild = o45;
// undefined
o46 = null;
// 3333
o45.getAttribute = f81632121_506;
// 3335
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0]");
// 3336
o46 = {};
// 3337
o45.firstChild = o46;
// undefined
o45 = null;
// 3338
o46.getAttribute = f81632121_506;
// 3340
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][0]");
// 3341
o45 = {};
// 3342
o46.firstChild = o45;
// undefined
o45 = null;
// 3343
o45 = {};
// 3344
o46.nextSibling = o45;
// undefined
o46 = null;
// 3345
o45.getAttribute = f81632121_506;
// 3347
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][1]");
// 3348
o46 = {};
// 3349
o45.firstChild = o46;
// undefined
o46 = null;
// 3350
o46 = {};
// 3351
o45.nextSibling = o46;
// undefined
o45 = null;
// 3352
o46.getAttribute = f81632121_506;
// 3354
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[0][2]");
// 3355
o45 = {};
// 3356
o46.firstChild = o45;
// undefined
o45 = null;
// 3357
o45 = {};
// 3358
o46.nextSibling = o45;
// undefined
o46 = null;
// 3359
o45.getAttribute = f81632121_506;
// undefined
o45 = null;
// 3361
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}.[0].[right].[0].[left].[0].[0].[3]");
// 3364
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}");
// 3365
o37.contains = f81632121_645;
// 3367
f81632121_645.returns.push(true);
// undefined
fo81632121_700_firstChild.returns.push(o39);
// 3371
f81632121_506.returns.push(".r[2vp51]");
// 3375
f81632121_506.returns.push(".r[2vp51].[1][0]");
// 3380
f81632121_506.returns.push(".r[2vp51].[1][4][0]");
// 3385
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}");
// 3387
o45 = {};
// 3388
o44.nextSibling = o45;
// undefined
o44 = null;
// 3389
o45.getAttribute = f81632121_506;
// 3391
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}");
// 3392
o44 = {};
// 3393
o45.firstChild = o44;
// 3394
o44.getAttribute = f81632121_506;
// 3396
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0]");
// 3397
o46 = {};
// 3398
o44.firstChild = o46;
// undefined
o44 = null;
// 3399
o46.getAttribute = f81632121_506;
// 3401
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[left]");
// 3402
o44 = {};
// 3403
o46.firstChild = o44;
// undefined
o44 = null;
// 3404
o44 = {};
// 3405
o46.nextSibling = o44;
// undefined
o46 = null;
// 3406
o44.getAttribute = f81632121_506;
// 3408
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right]");
// 3409
o46 = {};
// 3410
o44.firstChild = o46;
// undefined
o44 = null;
// 3411
o46.getAttribute = f81632121_506;
// 3413
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0]");
// 3414
o44 = {};
// 3415
o46.firstChild = o44;
// undefined
o46 = null;
// 3416
o44.getAttribute = f81632121_506;
// 3418
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left]");
// 3419
o46 = {};
// 3420
o44.firstChild = o46;
// undefined
o44 = null;
// 3421
o46.getAttribute = f81632121_506;
// 3423
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0]");
// 3424
o44 = {};
// 3425
o46.firstChild = o44;
// undefined
o46 = null;
// 3426
o44.getAttribute = f81632121_506;
// 3428
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0]");
// 3429
o46 = {};
// 3430
o44.firstChild = o46;
// undefined
o44 = null;
// 3431
o46.getAttribute = f81632121_506;
// 3433
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][0]");
// 3434
o44 = {};
// 3435
o46.firstChild = o44;
// undefined
o44 = null;
// 3436
o44 = {};
// 3437
o46.nextSibling = o44;
// undefined
o46 = null;
// 3438
o44.getAttribute = f81632121_506;
// 3440
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][1]");
// 3441
o46 = {};
// 3442
o44.firstChild = o46;
// undefined
o46 = null;
// 3443
o46 = {};
// 3444
o44.nextSibling = o46;
// undefined
o44 = null;
// 3445
o46.getAttribute = f81632121_506;
// 3447
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[0][2]");
// 3448
o44 = {};
// 3449
o46.firstChild = o44;
// undefined
o44 = null;
// 3450
o44 = {};
// 3451
o46.nextSibling = o44;
// undefined
o46 = null;
// 3452
o44.getAttribute = f81632121_506;
// undefined
o44 = null;
// 3454
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}.[0].[right].[0].[left].[0].[0].[3]");
// 3457
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}");
// 3460
f81632121_645.returns.push(true);
// undefined
fo81632121_700_firstChild.returns.push(o39);
// 3464
f81632121_506.returns.push(".r[2vp51]");
// 3468
f81632121_506.returns.push(".r[2vp51].[1][0]");
// 3473
f81632121_506.returns.push(".r[2vp51].[1][4][0]");
// 3478
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}");
// 3483
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}");
// 3485
o44 = {};
// 3486
o45.nextSibling = o44;
// undefined
o45 = null;
// 3487
o44.getAttribute = f81632121_506;
// 3489
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}");
// 3490
o45 = {};
// 3491
o44.firstChild = o45;
// 3492
o45.getAttribute = f81632121_506;
// 3494
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0]");
// 3495
o46 = {};
// 3496
o45.firstChild = o46;
// undefined
o45 = null;
// 3497
o46.getAttribute = f81632121_506;
// 3499
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[left]");
// 3500
o45 = {};
// 3501
o46.firstChild = o45;
// undefined
o45 = null;
// 3502
o45 = {};
// 3503
o46.nextSibling = o45;
// undefined
o46 = null;
// 3504
o45.getAttribute = f81632121_506;
// 3506
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right]");
// 3507
o46 = {};
// 3508
o45.firstChild = o46;
// undefined
o45 = null;
// 3509
o46.getAttribute = f81632121_506;
// 3511
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0]");
// 3512
o45 = {};
// 3513
o46.firstChild = o45;
// undefined
o46 = null;
// 3514
o45.getAttribute = f81632121_506;
// 3516
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left]");
// 3517
o46 = {};
// 3518
o45.firstChild = o46;
// undefined
o45 = null;
// 3519
o46.getAttribute = f81632121_506;
// 3521
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0]");
// 3522
o45 = {};
// 3523
o46.firstChild = o45;
// undefined
o46 = null;
// 3524
o45.getAttribute = f81632121_506;
// 3526
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0]");
// 3527
o46 = {};
// 3528
o45.firstChild = o46;
// undefined
o45 = null;
// 3529
o46.getAttribute = f81632121_506;
// 3531
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][0]");
// 3532
o45 = {};
// 3533
o46.firstChild = o45;
// undefined
o45 = null;
// 3534
o45 = {};
// 3535
o46.nextSibling = o45;
// undefined
o46 = null;
// 3536
o45.getAttribute = f81632121_506;
// 3538
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][1]");
// 3539
o46 = {};
// 3540
o45.firstChild = o46;
// undefined
o46 = null;
// 3541
o46 = {};
// 3542
o45.nextSibling = o46;
// undefined
o45 = null;
// 3543
o46.getAttribute = f81632121_506;
// 3545
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[0][2]");
// 3546
o45 = {};
// 3547
o46.firstChild = o45;
// undefined
o45 = null;
// 3548
o45 = {};
// 3549
o46.nextSibling = o45;
// undefined
o46 = null;
// 3550
o45.getAttribute = f81632121_506;
// undefined
o45 = null;
// 3552
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}.[0].[right].[0].[left].[0].[0].[3]");
// 3555
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}");
// 3558
f81632121_645.returns.push(true);
// undefined
fo81632121_700_firstChild.returns.push(o39);
// undefined
o39 = null;
// 3562
f81632121_506.returns.push(".r[2vp51]");
// 3566
f81632121_506.returns.push(".r[2vp51].[1][0]");
// 3571
f81632121_506.returns.push(".r[2vp51].[1][4][0]");
// 3576
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4954379}");
// 3581
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955913}");
// 3586
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955915}");
// 3588
o39 = {};
// 3589
o44.nextSibling = o39;
// undefined
o44 = null;
// 3590
o39.getAttribute = f81632121_506;
// 3592
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}");
// 3593
o44 = {};
// 3594
o39.firstChild = o44;
// undefined
o39 = null;
// 3595
o44.getAttribute = f81632121_506;
// 3597
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0]");
// 3598
o39 = {};
// 3599
o44.firstChild = o39;
// undefined
o44 = null;
// 3600
o39.getAttribute = f81632121_506;
// 3602
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[left]");
// 3603
o44 = {};
// 3604
o39.firstChild = o44;
// undefined
o44 = null;
// 3605
o44 = {};
// 3606
o39.nextSibling = o44;
// undefined
o39 = null;
// 3607
o44.getAttribute = f81632121_506;
// 3609
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right]");
// 3610
o39 = {};
// 3611
o44.firstChild = o39;
// undefined
o44 = null;
// 3612
o39.getAttribute = f81632121_506;
// 3614
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0]");
// 3615
o44 = {};
// 3616
o39.firstChild = o44;
// undefined
o39 = null;
// 3617
o44.getAttribute = f81632121_506;
// 3619
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left]");
// 3620
o39 = {};
// 3621
o44.firstChild = o39;
// undefined
o44 = null;
// 3622
o39.getAttribute = f81632121_506;
// 3624
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0]");
// 3625
o44 = {};
// 3626
o39.firstChild = o44;
// undefined
o39 = null;
// 3627
o44.getAttribute = f81632121_506;
// 3629
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0]");
// 3630
o39 = {};
// 3631
o44.firstChild = o39;
// undefined
o44 = null;
// 3632
o39.getAttribute = f81632121_506;
// 3634
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][0]");
// 3635
o44 = {};
// 3636
o39.firstChild = o44;
// undefined
o44 = null;
// 3637
o44 = {};
// 3638
o39.nextSibling = o44;
// undefined
o39 = null;
// 3639
o44.getAttribute = f81632121_506;
// 3641
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][1]");
// 3642
o39 = {};
// 3643
o44.firstChild = o39;
// undefined
o39 = null;
// 3644
o39 = {};
// 3645
o44.nextSibling = o39;
// undefined
o44 = null;
// 3646
o39.getAttribute = f81632121_506;
// 3648
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[0][2]");
// 3649
o44 = {};
// 3650
o39.firstChild = o44;
// undefined
o44 = null;
// 3651
o44 = {};
// 3652
o39.nextSibling = o44;
// undefined
o39 = null;
// 3653
o44.getAttribute = f81632121_506;
// undefined
o44 = null;
// 3655
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}.[0].[right].[0].[left].[0].[0].[3]");
// 3658
f81632121_506.returns.push(".r[2vp51].[1][4][1]{comment10200350995551582_4955918}");
// 3661
f81632121_645.returns.push(true);
// 3663
f81632121_467.returns.push(1374851214792);
// 3668
o39 = {};
// 3669
f81632121_504.returns.push(o39);
// 3670
o39.length = 8;
// 3671
o39["0"] = o40;
// 3672
o39["1"] = o41;
// 3673
o39["2"] = o42;
// 3674
o39["3"] = o43;
// 3675
o44 = {};
// 3676
o39["4"] = o44;
// 3677
o45 = {};
// 3678
o39["5"] = o45;
// 3679
o46 = {};
// 3680
o39["6"] = o46;
// 3681
o47 = {};
// 3682
o39["7"] = o47;
// undefined
o39 = null;
// 3683
f81632121_14.returns.push(undefined);
// 3684
f81632121_12.returns.push(8);
// 3685
o37.nodeName = "DIV";
// undefined
o37 = null;
// 3687
o38.nodeName = "DIV";
// 3688
o38.parentNode = o33;
// undefined
o38 = null;
// 3689
o33.nodeName = "FORM";
// 3693
o37 = {};
// 3694
f81632121_474.returns.push(o37);
// 3696
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 3701
o37 = {};
// 3702
f81632121_508.returns.push(o37);
// 3703
o37.id = "u_0_1x";
// 3704
o37.getElementsByTagName = f81632121_502;
// 3705
o38 = {};
// 3706
o37.parentNode = o38;
// 3724
f81632121_467.returns.push(1374851214824);
// 3729
o39 = {};
// 3730
f81632121_504.returns.push(o39);
// 3731
o39.length = 8;
// 3732
o39["0"] = o40;
// 3733
o39["1"] = o41;
// 3734
o39["2"] = o42;
// 3735
o39["3"] = o43;
// 3736
o39["4"] = o44;
// 3737
o39["5"] = o45;
// 3738
o39["6"] = o46;
// 3739
o39["7"] = o47;
// undefined
o39 = null;
// 3740
f81632121_14.returns.push(undefined);
// 3741
f81632121_12.returns.push(9);
// undefined
fo81632121_795_firstChild = function() { return fo81632121_795_firstChild.returns[fo81632121_795_firstChild.inst++]; };
fo81632121_795_firstChild.returns = [];
fo81632121_795_firstChild.inst = 0;
defineGetter(o37, "firstChild", fo81632121_795_firstChild, undefined);
// undefined
fo81632121_795_firstChild.returns.push(null);
// undefined
fo81632121_795_firstChild.returns.push(null);
// undefined
fo81632121_795_firstChild.returns.push(null);
// 3756
f81632121_466.returns.push(0.9252282343804836);
// 3758
f81632121_467.returns.push(1374851214828);
// 3760
f81632121_467.returns.push(1374851214829);
// 3766
f81632121_467.returns.push(1374851214829);
// 3768
f81632121_467.returns.push(1374851214829);
// 3770
f81632121_467.returns.push(1374851214835);
// 3772
f81632121_467.returns.push(1374851214835);
// 3774
f81632121_467.returns.push(1374851214835);
// 3775
o37.nodeType = 1;
// 3779
o39 = {};
// 3780
f81632121_474.returns.push(o39);
// 3782
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3784
o39 = {};
// 3785
f81632121_476.returns.push(o39);
// 3786
o39.firstChild = null;
// 3788
o48 = {};
// 3789
f81632121_474.returns.push(o48);
// 3791
o49 = {};
// 3792
f81632121_598.returns.push(o49);
// 3793
o48.appendChild = f81632121_478;
// 3794
f81632121_478.returns.push(o49);
// undefined
o49 = null;
// 3795
o39.appendChild = f81632121_478;
// 3796
f81632121_478.returns.push(o48);
// undefined
o48 = null;
// 3797
o39.innerHTML = "You are the antithesis of what my husband has been writing his dissertation about.";
// undefined
o39 = null;
// 3800
f81632121_467.returns.push(1374851214859);
// 3804
o39 = {};
// 3805
f81632121_474.returns.push(o39);
// 3807
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3809
o39 = {};
// 3810
f81632121_476.returns.push(o39);
// 3811
o39.firstChild = null;
// 3813
o48 = {};
// 3814
f81632121_474.returns.push(o48);
// 3816
o49 = {};
// 3817
f81632121_598.returns.push(o49);
// 3818
o48.appendChild = f81632121_478;
// 3819
f81632121_478.returns.push(o49);
// undefined
o49 = null;
// 3820
o39.appendChild = f81632121_478;
// 3821
f81632121_478.returns.push(o48);
// undefined
o48 = null;
// 3822
o39.innerHTML = "Harry: I'm turning 27, not 4½...";
// undefined
o39 = null;
// 3824
o39 = {};
// 3825
f81632121_476.returns.push(o39);
// 3826
o39.firstChild = null;
// 3828
o48 = {};
// 3829
f81632121_474.returns.push(o48);
// 3831
o49 = {};
// 3832
f81632121_598.returns.push(o49);
// 3833
o48.appendChild = f81632121_478;
// 3834
f81632121_478.returns.push(o49);
// undefined
o49 = null;
// 3835
o39.appendChild = f81632121_478;
// 3836
f81632121_478.returns.push(o48);
// undefined
o48 = null;
// 3837
o39.innerHTML = "Chrissi: Oh?";
// undefined
o39 = null;
// 3839
f81632121_467.returns.push(1374851214869);
// 3843
o39 = {};
// 3844
f81632121_474.returns.push(o39);
// 3846
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3848
o39 = {};
// 3849
f81632121_476.returns.push(o39);
// 3850
o39.firstChild = null;
// 3852
o48 = {};
// 3853
f81632121_474.returns.push(o48);
// 3855
o49 = {};
// 3856
f81632121_598.returns.push(o49);
// 3857
o48.appendChild = f81632121_478;
// 3858
f81632121_478.returns.push(o49);
// undefined
o49 = null;
// 3859
o39.appendChild = f81632121_478;
// 3860
f81632121_478.returns.push(o48);
// undefined
o48 = null;
// 3861
o39.innerHTML = "irony vs satire/sarcasm, pragmatism, william james type stuff";
// undefined
o39 = null;
// 3864
f81632121_467.returns.push(1374851214880);
// 3868
o39 = {};
// 3869
f81632121_474.returns.push(o39);
// 3871
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 3873
o39 = {};
// 3874
f81632121_476.returns.push(o39);
// 3875
o39.setAttribute = f81632121_575;
// 3877
f81632121_575.returns.push(undefined);
// 3878
// 3879
o39.firstChild = null;
// 3881
o48 = {};
// 3882
f81632121_474.returns.push(o48);
// 3884
o49 = {};
// 3885
f81632121_598.returns.push(o49);
// 3886
o48.appendChild = f81632121_478;
// 3887
f81632121_478.returns.push(o49);
// undefined
o49 = null;
// 3888
o39.appendChild = f81632121_478;
// 3889
f81632121_478.returns.push(o48);
// undefined
o48 = null;
// 3891
o48 = {};
// 3892
f81632121_476.returns.push(o48);
// 3893
// 3894
// 3895
o49 = {};
// 3896
o48.classList = o49;
// 3898
o49.add = f81632121_602;
// undefined
o49 = null;
// 3899
f81632121_602.returns.push(undefined);
// 3901
o49 = {};
// 3902
f81632121_476.returns.push(o49);
// 3903
o49.firstChild = null;
// 3905
o50 = {};
// 3906
f81632121_474.returns.push(o50);
// 3908
o51 = {};
// 3909
f81632121_598.returns.push(o51);
// 3910
o50.appendChild = f81632121_478;
// 3911
f81632121_478.returns.push(o51);
// undefined
o51 = null;
// 3912
o39.__html = void 0;
// undefined
o39 = null;
// 3913
o48.__html = void 0;
// undefined
o48 = null;
// 3914
o49.appendChild = f81632121_478;
// 3915
f81632121_478.returns.push(o50);
// undefined
o50 = null;
// 3916
o49.innerHTML = "";
// undefined
o49 = null;
// 3919
f81632121_467.returns.push(1374851214900);
// 3921
o37.nextSibling = null;
// 3922
o38.removeChild = f81632121_521;
// 3923
f81632121_521.returns.push(o37);
// 3924
// 3925
o38.appendChild = f81632121_478;
// 3926
f81632121_478.returns.push(o37);
// 3928
f81632121_467.returns.push(1374851214913);
// 3930
f81632121_467.returns.push(1374851214913);
// 3933
f81632121_467.returns.push(1374851214913);
// 3935
f81632121_467.returns.push(1374851214913);
// 3937
f81632121_467.returns.push(1374851214913);
// 3939
f81632121_467.returns.push(1374851214913);
// 3940
o39 = {};
// undefined
fo81632121_795_firstChild.returns.push(o39);
// 3942
o39.getAttribute = f81632121_506;
// 3944
f81632121_506.returns.push(".r[5ib3u]");
// 3945
o48 = {};
// 3946
o39.firstChild = o48;
// 3947
o48.getAttribute = f81632121_506;
// 3949
f81632121_506.returns.push(".r[5ib3u].[1][0]");
// 3950
o49 = {};
// 3951
o48.firstChild = o49;
// undefined
o49 = null;
// 3952
o49 = {};
// 3953
o48.nextSibling = o49;
// undefined
o48 = null;
// 3954
o49.getAttribute = f81632121_506;
// 3956
f81632121_506.returns.push(".r[5ib3u].[1][4][0]");
// 3957
o48 = {};
// 3958
o49.firstChild = o48;
// undefined
o48 = null;
// 3959
o48 = {};
// 3960
o49.nextSibling = o48;
// undefined
o49 = null;
// 3961
o48.getAttribute = f81632121_506;
// 3963
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}");
// 3964
o49 = {};
// 3965
o48.firstChild = o49;
// 3966
o49.getAttribute = f81632121_506;
// 3968
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0]");
// 3969
o50 = {};
// 3970
o49.firstChild = o50;
// undefined
o49 = null;
// 3971
o50.getAttribute = f81632121_506;
// 3973
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[left]");
// 3974
o49 = {};
// 3975
o50.firstChild = o49;
// undefined
o49 = null;
// 3976
o49 = {};
// 3977
o50.nextSibling = o49;
// undefined
o50 = null;
// 3978
o49.getAttribute = f81632121_506;
// 3980
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right]");
// 3981
o50 = {};
// 3982
o49.firstChild = o50;
// undefined
o49 = null;
// 3983
o50.getAttribute = f81632121_506;
// 3985
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0]");
// 3986
o49 = {};
// 3987
o50.firstChild = o49;
// undefined
o50 = null;
// 3988
o49.getAttribute = f81632121_506;
// 3990
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left]");
// 3991
o50 = {};
// 3992
o49.firstChild = o50;
// undefined
o49 = null;
// 3993
o50.getAttribute = f81632121_506;
// 3995
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left].[0]");
// 3996
o49 = {};
// 3997
o50.firstChild = o49;
// undefined
o50 = null;
// 3998
o49.getAttribute = f81632121_506;
// 4000
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left].[0].[0]");
// 4001
o50 = {};
// 4002
o49.firstChild = o50;
// undefined
o49 = null;
// 4003
o50.getAttribute = f81632121_506;
// 4005
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4006
o49 = {};
// 4007
o50.firstChild = o49;
// undefined
o49 = null;
// 4008
o49 = {};
// 4009
o50.nextSibling = o49;
// undefined
o50 = null;
// 4010
o49.getAttribute = f81632121_506;
// 4012
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4013
o50 = {};
// 4014
o49.firstChild = o50;
// undefined
o50 = null;
// 4015
o50 = {};
// 4016
o49.nextSibling = o50;
// undefined
o49 = null;
// 4017
o50.getAttribute = f81632121_506;
// 4019
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4020
o49 = {};
// 4021
o50.firstChild = o49;
// undefined
o49 = null;
// 4022
o49 = {};
// 4023
o50.nextSibling = o49;
// undefined
o50 = null;
// 4024
o49.getAttribute = f81632121_506;
// undefined
o49 = null;
// 4026
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}.[0].[right].[0].[left].[0].[0].[3]");
// 4029
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}");
// 4030
o37.contains = f81632121_645;
// 4032
f81632121_645.returns.push(true);
// undefined
fo81632121_795_firstChild.returns.push(o39);
// 4036
f81632121_506.returns.push(".r[5ib3u]");
// 4040
f81632121_506.returns.push(".r[5ib3u].[1][0]");
// 4045
f81632121_506.returns.push(".r[5ib3u].[1][4][0]");
// 4050
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}");
// 4052
o49 = {};
// 4053
o48.nextSibling = o49;
// undefined
o48 = null;
// 4054
o49.getAttribute = f81632121_506;
// 4056
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}");
// 4057
o48 = {};
// 4058
o49.firstChild = o48;
// 4059
o48.getAttribute = f81632121_506;
// 4061
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0]");
// 4062
o50 = {};
// 4063
o48.firstChild = o50;
// undefined
o48 = null;
// 4064
o50.getAttribute = f81632121_506;
// 4066
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[left]");
// 4067
o48 = {};
// 4068
o50.firstChild = o48;
// undefined
o48 = null;
// 4069
o48 = {};
// 4070
o50.nextSibling = o48;
// undefined
o50 = null;
// 4071
o48.getAttribute = f81632121_506;
// 4073
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right]");
// 4074
o50 = {};
// 4075
o48.firstChild = o50;
// undefined
o48 = null;
// 4076
o50.getAttribute = f81632121_506;
// 4078
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0]");
// 4079
o48 = {};
// 4080
o50.firstChild = o48;
// undefined
o50 = null;
// 4081
o48.getAttribute = f81632121_506;
// 4083
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left]");
// 4084
o50 = {};
// 4085
o48.firstChild = o50;
// undefined
o48 = null;
// 4086
o50.getAttribute = f81632121_506;
// 4088
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left].[0]");
// 4089
o48 = {};
// 4090
o50.firstChild = o48;
// undefined
o50 = null;
// 4091
o48.getAttribute = f81632121_506;
// 4093
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left].[0].[0]");
// 4094
o50 = {};
// 4095
o48.firstChild = o50;
// undefined
o48 = null;
// 4096
o50.getAttribute = f81632121_506;
// 4098
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4099
o48 = {};
// 4100
o50.firstChild = o48;
// undefined
o48 = null;
// 4101
o48 = {};
// 4102
o50.nextSibling = o48;
// undefined
o50 = null;
// 4103
o48.getAttribute = f81632121_506;
// 4105
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4106
o50 = {};
// 4107
o48.firstChild = o50;
// undefined
o50 = null;
// 4108
o50 = {};
// 4109
o48.nextSibling = o50;
// undefined
o48 = null;
// 4110
o50.getAttribute = f81632121_506;
// 4112
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4113
o48 = {};
// 4114
o50.firstChild = o48;
// undefined
o48 = null;
// 4115
o48 = {};
// 4116
o50.nextSibling = o48;
// undefined
o50 = null;
// 4117
o48.getAttribute = f81632121_506;
// undefined
o48 = null;
// 4119
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}.[0].[right].[0].[left].[0].[0].[3]");
// 4122
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}");
// 4125
f81632121_645.returns.push(true);
// undefined
fo81632121_795_firstChild.returns.push(o39);
// 4129
f81632121_506.returns.push(".r[5ib3u]");
// 4133
f81632121_506.returns.push(".r[5ib3u].[1][0]");
// 4138
f81632121_506.returns.push(".r[5ib3u].[1][4][0]");
// 4143
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}");
// 4148
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}");
// 4150
o48 = {};
// 4151
o49.nextSibling = o48;
// undefined
o49 = null;
// 4152
o48.getAttribute = f81632121_506;
// 4154
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}");
// 4155
o49 = {};
// 4156
o48.firstChild = o49;
// 4157
o49.getAttribute = f81632121_506;
// 4159
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0]");
// 4160
o50 = {};
// 4161
o49.firstChild = o50;
// undefined
o49 = null;
// 4162
o50.getAttribute = f81632121_506;
// 4164
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[left]");
// 4165
o49 = {};
// 4166
o50.firstChild = o49;
// undefined
o49 = null;
// 4167
o49 = {};
// 4168
o50.nextSibling = o49;
// undefined
o50 = null;
// 4169
o49.getAttribute = f81632121_506;
// 4171
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right]");
// 4172
o50 = {};
// 4173
o49.firstChild = o50;
// undefined
o49 = null;
// 4174
o50.getAttribute = f81632121_506;
// 4176
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0]");
// 4177
o49 = {};
// 4178
o50.firstChild = o49;
// undefined
o50 = null;
// 4179
o49.getAttribute = f81632121_506;
// 4181
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left]");
// 4182
o50 = {};
// 4183
o49.firstChild = o50;
// undefined
o49 = null;
// 4184
o50.getAttribute = f81632121_506;
// 4186
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left].[0]");
// 4187
o49 = {};
// 4188
o50.firstChild = o49;
// undefined
o50 = null;
// 4189
o49.getAttribute = f81632121_506;
// 4191
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left].[0].[0]");
// 4192
o50 = {};
// 4193
o49.firstChild = o50;
// undefined
o49 = null;
// 4194
o50.getAttribute = f81632121_506;
// 4196
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4197
o49 = {};
// 4198
o50.firstChild = o49;
// undefined
o49 = null;
// 4199
o49 = {};
// 4200
o50.nextSibling = o49;
// undefined
o50 = null;
// 4201
o49.getAttribute = f81632121_506;
// 4203
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4204
o50 = {};
// 4205
o49.firstChild = o50;
// undefined
o50 = null;
// 4206
o50 = {};
// 4207
o49.nextSibling = o50;
// undefined
o49 = null;
// 4208
o50.getAttribute = f81632121_506;
// 4210
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4211
o49 = {};
// 4212
o50.firstChild = o49;
// undefined
o49 = null;
// 4213
o49 = {};
// 4214
o50.nextSibling = o49;
// undefined
o50 = null;
// 4215
o49.getAttribute = f81632121_506;
// undefined
o49 = null;
// 4217
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}.[0].[right].[0].[left].[0].[0].[3]");
// 4220
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}");
// 4223
f81632121_645.returns.push(true);
// undefined
fo81632121_795_firstChild.returns.push(o39);
// undefined
o39 = null;
// 4227
f81632121_506.returns.push(".r[5ib3u]");
// 4231
f81632121_506.returns.push(".r[5ib3u].[1][0]");
// 4236
f81632121_506.returns.push(".r[5ib3u].[1][4][0]");
// 4241
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992459}");
// 4246
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992465}");
// 4251
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4992473}");
// 4253
o39 = {};
// 4254
o48.nextSibling = o39;
// undefined
o48 = null;
// 4255
o39.getAttribute = f81632121_506;
// 4257
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}");
// 4258
o48 = {};
// 4259
o39.firstChild = o48;
// undefined
o39 = null;
// 4260
o48.getAttribute = f81632121_506;
// 4262
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0]");
// 4263
o39 = {};
// 4264
o48.firstChild = o39;
// undefined
o48 = null;
// 4265
o39.getAttribute = f81632121_506;
// 4267
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[left]");
// 4268
o48 = {};
// 4269
o39.firstChild = o48;
// undefined
o48 = null;
// 4270
o48 = {};
// 4271
o39.nextSibling = o48;
// undefined
o39 = null;
// 4272
o48.getAttribute = f81632121_506;
// 4274
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right]");
// 4275
o39 = {};
// 4276
o48.firstChild = o39;
// undefined
o48 = null;
// 4277
o39.getAttribute = f81632121_506;
// 4279
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0]");
// 4280
o48 = {};
// 4281
o39.firstChild = o48;
// undefined
o39 = null;
// 4282
o48.getAttribute = f81632121_506;
// 4284
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left]");
// 4285
o39 = {};
// 4286
o48.firstChild = o39;
// undefined
o48 = null;
// 4287
o39.getAttribute = f81632121_506;
// 4289
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left].[0]");
// 4290
o48 = {};
// 4291
o39.firstChild = o48;
// undefined
o39 = null;
// 4292
o48.getAttribute = f81632121_506;
// 4294
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left].[0].[0]");
// 4295
o39 = {};
// 4296
o48.firstChild = o39;
// undefined
o48 = null;
// 4297
o39.getAttribute = f81632121_506;
// 4299
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4300
o48 = {};
// 4301
o39.firstChild = o48;
// undefined
o48 = null;
// 4302
o48 = {};
// 4303
o39.nextSibling = o48;
// undefined
o39 = null;
// 4304
o48.getAttribute = f81632121_506;
// 4306
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4307
o39 = {};
// 4308
o48.firstChild = o39;
// undefined
o39 = null;
// 4309
o39 = {};
// 4310
o48.nextSibling = o39;
// undefined
o48 = null;
// 4311
o39.getAttribute = f81632121_506;
// 4313
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4314
o48 = {};
// 4315
o39.firstChild = o48;
// undefined
o48 = null;
// 4316
o48 = {};
// 4317
o39.nextSibling = o48;
// undefined
o39 = null;
// 4318
o48.getAttribute = f81632121_506;
// undefined
o48 = null;
// 4320
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}.[0].[right].[0].[left].[0].[0].[3]");
// 4323
f81632121_506.returns.push(".r[5ib3u].[1][4][1]{comment10200407437602598_4996311}");
// 4326
f81632121_645.returns.push(true);
// 4328
f81632121_467.returns.push(1374851214951);
// 4333
o39 = {};
// 4334
f81632121_504.returns.push(o39);
// 4335
o39.length = 12;
// 4336
o39["0"] = o40;
// 4337
o39["1"] = o41;
// 4338
o39["2"] = o42;
// 4339
o39["3"] = o43;
// 4340
o48 = {};
// 4341
o39["4"] = o48;
// 4342
o49 = {};
// 4343
o39["5"] = o49;
// 4344
o50 = {};
// 4345
o39["6"] = o50;
// 4346
o51 = {};
// 4347
o39["7"] = o51;
// 4348
o39["8"] = o44;
// 4349
o39["9"] = o45;
// 4350
o39["10"] = o46;
// 4351
o39["11"] = o47;
// undefined
o39 = null;
// 4352
f81632121_14.returns.push(undefined);
// 4353
f81632121_12.returns.push(10);
// 4354
o37.nodeName = "DIV";
// undefined
o37 = null;
// 4356
o38.nodeName = "DIV";
// 4357
o38.parentNode = o35;
// undefined
o38 = null;
// 4358
o35.nodeName = "FORM";
// 4362
o37 = {};
// 4363
f81632121_474.returns.push(o37);
// 4365
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 4370
o37 = {};
// 4371
f81632121_508.returns.push(o37);
// 4372
o37.id = "u_0_1z";
// 4373
o37.getElementsByTagName = f81632121_502;
// 4374
o38 = {};
// 4375
o37.parentNode = o38;
// 4394
f81632121_467.returns.push(1374851214979);
// 4399
o39 = {};
// 4400
f81632121_504.returns.push(o39);
// 4401
o39.length = 12;
// 4402
o39["0"] = o40;
// 4403
o39["1"] = o41;
// 4404
o39["2"] = o42;
// 4405
o39["3"] = o43;
// 4406
o39["4"] = o48;
// 4407
o39["5"] = o49;
// 4408
o39["6"] = o50;
// 4409
o39["7"] = o51;
// 4410
o39["8"] = o44;
// 4411
o39["9"] = o45;
// 4412
o39["10"] = o46;
// 4413
o39["11"] = o47;
// undefined
o39 = null;
// 4414
f81632121_14.returns.push(undefined);
// 4415
f81632121_12.returns.push(11);
// undefined
fo81632121_897_firstChild = function() { return fo81632121_897_firstChild.returns[fo81632121_897_firstChild.inst++]; };
fo81632121_897_firstChild.returns = [];
fo81632121_897_firstChild.inst = 0;
defineGetter(o37, "firstChild", fo81632121_897_firstChild, undefined);
// undefined
fo81632121_897_firstChild.returns.push(null);
// undefined
fo81632121_897_firstChild.returns.push(null);
// undefined
fo81632121_897_firstChild.returns.push(null);
// 4432
f81632121_466.returns.push(0.032721861032769084);
// 4434
f81632121_467.returns.push(1374851214985);
// 4436
f81632121_467.returns.push(1374851214997);
// 4442
f81632121_467.returns.push(1374851214998);
// 4444
f81632121_467.returns.push(1374851214998);
// 4446
f81632121_467.returns.push(1374851214998);
// 4448
f81632121_467.returns.push(1374851214998);
// 4450
f81632121_467.returns.push(1374851214998);
// 4451
o37.nodeType = 1;
// 4455
o39 = {};
// 4456
f81632121_474.returns.push(o39);
// 4458
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 4460
o39 = {};
// 4461
f81632121_476.returns.push(o39);
// 4462
o39.setAttribute = f81632121_575;
// 4464
f81632121_575.returns.push(undefined);
// 4465
// 4466
o39.firstChild = null;
// 4468
o52 = {};
// 4469
f81632121_474.returns.push(o52);
// 4471
o53 = {};
// 4472
f81632121_598.returns.push(o53);
// 4473
o52.appendChild = f81632121_478;
// 4474
f81632121_478.returns.push(o53);
// undefined
o53 = null;
// 4475
o39.appendChild = f81632121_478;
// 4476
f81632121_478.returns.push(o52);
// undefined
o52 = null;
// 4478
o52 = {};
// 4479
f81632121_476.returns.push(o52);
// 4480
// 4481
// 4482
o53 = {};
// 4483
o52.classList = o53;
// 4485
o53.add = f81632121_602;
// undefined
o53 = null;
// 4486
f81632121_602.returns.push(undefined);
// 4488
o53 = {};
// 4489
f81632121_476.returns.push(o53);
// 4490
o53.firstChild = null;
// 4492
o54 = {};
// 4493
f81632121_474.returns.push(o54);
// 4495
o55 = {};
// 4496
f81632121_598.returns.push(o55);
// 4497
o54.appendChild = f81632121_478;
// 4498
f81632121_478.returns.push(o55);
// undefined
o55 = null;
// 4499
o39.__html = void 0;
// undefined
o39 = null;
// 4500
o52.__html = void 0;
// undefined
o52 = null;
// 4501
o53.appendChild = f81632121_478;
// 4502
f81632121_478.returns.push(o54);
// undefined
o54 = null;
// 4503
o53.innerHTML = "Does it have a sense of the surreal or are you just sharing a data point? ";
// undefined
o53 = null;
// 4505
f81632121_467.returns.push(1374851215036);
// 4509
o39 = {};
// 4510
f81632121_474.returns.push(o39);
// 4512
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 4514
o39 = {};
// 4515
f81632121_476.returns.push(o39);
// 4516
o39.firstChild = null;
// 4518
o52 = {};
// 4519
f81632121_474.returns.push(o52);
// 4521
o53 = {};
// 4522
f81632121_598.returns.push(o53);
// 4523
o52.appendChild = f81632121_478;
// 4524
f81632121_478.returns.push(o53);
// undefined
o53 = null;
// 4525
o39.appendChild = f81632121_478;
// 4526
f81632121_478.returns.push(o52);
// undefined
o52 = null;
// 4527
o39.innerHTML = "Merely minor amusement.";
// undefined
o39 = null;
// 4529
f81632121_467.returns.push(1374851215042);
// 4533
o39 = {};
// 4534
f81632121_474.returns.push(o39);
// 4536
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 4538
o39 = {};
// 4539
f81632121_476.returns.push(o39);
// 4540
o39.firstChild = null;
// 4542
o52 = {};
// 4543
f81632121_474.returns.push(o52);
// 4545
o53 = {};
// 4546
f81632121_598.returns.push(o53);
// 4547
o52.appendChild = f81632121_478;
// 4548
f81632121_478.returns.push(o53);
// undefined
o53 = null;
// 4549
o39.appendChild = f81632121_478;
// 4550
f81632121_478.returns.push(o52);
// undefined
o52 = null;
// 4551
o39.innerHTML = "Did you wear ";
// undefined
o39 = null;
// 4553
f81632121_467.returns.push(1374851215052);
// 4557
o39 = {};
// 4558
f81632121_474.returns.push(o39);
// 4560
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 4562
o39 = {};
// 4563
f81632121_476.returns.push(o39);
// 4564
o39.firstChild = null;
// 4566
o52 = {};
// 4567
f81632121_474.returns.push(o52);
// 4569
o53 = {};
// 4570
f81632121_598.returns.push(o53);
// 4571
o52.appendChild = f81632121_478;
// 4572
f81632121_478.returns.push(o53);
// undefined
o53 = null;
// 4573
o39.appendChild = f81632121_478;
// 4574
f81632121_478.returns.push(o52);
// undefined
o52 = null;
// 4575
o39.innerHTML = "That's the most delightfully offensive piece of apparel I've seen in quite some time.";
// undefined
o39 = null;
// 4577
f81632121_467.returns.push(1374851215058);
// 4579
o37.nextSibling = null;
// 4580
o38.removeChild = f81632121_521;
// 4581
f81632121_521.returns.push(o37);
// 4582
// 4583
o38.appendChild = f81632121_478;
// 4584
f81632121_478.returns.push(o37);
// 4586
f81632121_467.returns.push(1374851215069);
// 4588
f81632121_467.returns.push(1374851215070);
// 4591
f81632121_467.returns.push(1374851215070);
// 4593
f81632121_467.returns.push(1374851215070);
// 4595
f81632121_467.returns.push(1374851215070);
// 4597
f81632121_467.returns.push(1374851215070);
// 4598
o39 = {};
// undefined
fo81632121_897_firstChild.returns.push(o39);
// 4600
o39.getAttribute = f81632121_506;
// 4602
f81632121_506.returns.push(".r[70hf]");
// 4603
o52 = {};
// 4604
o39.firstChild = o52;
// 4605
o52.getAttribute = f81632121_506;
// 4607
f81632121_506.returns.push(".r[70hf].[1][0]");
// 4608
o53 = {};
// 4609
o52.firstChild = o53;
// undefined
o53 = null;
// 4610
o53 = {};
// 4611
o52.nextSibling = o53;
// undefined
o52 = null;
// 4612
o53.getAttribute = f81632121_506;
// 4614
f81632121_506.returns.push(".r[70hf].[1][4][0]");
// 4615
o52 = {};
// 4616
o53.firstChild = o52;
// undefined
o52 = null;
// 4617
o52 = {};
// 4618
o53.nextSibling = o52;
// undefined
o53 = null;
// 4619
o52.getAttribute = f81632121_506;
// 4621
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}");
// 4622
o53 = {};
// 4623
o52.firstChild = o53;
// 4624
o53.getAttribute = f81632121_506;
// 4626
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0]");
// 4627
o54 = {};
// 4628
o53.firstChild = o54;
// undefined
o53 = null;
// 4629
o54.getAttribute = f81632121_506;
// 4631
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[left]");
// 4632
o53 = {};
// 4633
o54.firstChild = o53;
// undefined
o53 = null;
// 4634
o53 = {};
// 4635
o54.nextSibling = o53;
// undefined
o54 = null;
// 4636
o53.getAttribute = f81632121_506;
// 4638
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right]");
// 4639
o54 = {};
// 4640
o53.firstChild = o54;
// undefined
o53 = null;
// 4641
o54.getAttribute = f81632121_506;
// 4643
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0]");
// 4644
o53 = {};
// 4645
o54.firstChild = o53;
// undefined
o54 = null;
// 4646
o53.getAttribute = f81632121_506;
// 4648
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left]");
// 4649
o54 = {};
// 4650
o53.firstChild = o54;
// undefined
o53 = null;
// 4651
o54.getAttribute = f81632121_506;
// 4653
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0]");
// 4654
o53 = {};
// 4655
o54.firstChild = o53;
// undefined
o54 = null;
// 4656
o53.getAttribute = f81632121_506;
// 4658
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0]");
// 4659
o54 = {};
// 4660
o53.firstChild = o54;
// undefined
o53 = null;
// 4661
o54.getAttribute = f81632121_506;
// 4663
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4664
o53 = {};
// 4665
o54.firstChild = o53;
// undefined
o53 = null;
// 4666
o53 = {};
// 4667
o54.nextSibling = o53;
// undefined
o54 = null;
// 4668
o53.getAttribute = f81632121_506;
// 4670
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4671
o54 = {};
// 4672
o53.firstChild = o54;
// undefined
o54 = null;
// 4673
o54 = {};
// 4674
o53.nextSibling = o54;
// undefined
o53 = null;
// 4675
o54.getAttribute = f81632121_506;
// 4677
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4678
o53 = {};
// 4679
o54.firstChild = o53;
// undefined
o53 = null;
// 4680
o53 = {};
// 4681
o54.nextSibling = o53;
// undefined
o54 = null;
// 4682
o53.getAttribute = f81632121_506;
// undefined
o53 = null;
// 4684
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}.[0].[right].[0].[left].[0].[0].[3]");
// 4687
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}");
// 4688
o37.contains = f81632121_645;
// 4690
f81632121_645.returns.push(true);
// undefined
fo81632121_897_firstChild.returns.push(o39);
// 4694
f81632121_506.returns.push(".r[70hf]");
// 4698
f81632121_506.returns.push(".r[70hf].[1][0]");
// 4703
f81632121_506.returns.push(".r[70hf].[1][4][0]");
// 4708
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}");
// 4710
o53 = {};
// 4711
o52.nextSibling = o53;
// undefined
o52 = null;
// 4712
o53.getAttribute = f81632121_506;
// 4714
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 4715
o52 = {};
// 4716
o53.firstChild = o52;
// 4717
o52.getAttribute = f81632121_506;
// 4719
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0]");
// 4720
o54 = {};
// 4721
o52.firstChild = o54;
// undefined
o52 = null;
// 4722
o54.getAttribute = f81632121_506;
// 4724
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[left]");
// 4725
o52 = {};
// 4726
o54.firstChild = o52;
// undefined
o52 = null;
// 4727
o52 = {};
// 4728
o54.nextSibling = o52;
// undefined
o54 = null;
// 4729
o52.getAttribute = f81632121_506;
// 4731
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right]");
// 4732
o54 = {};
// 4733
o52.firstChild = o54;
// undefined
o52 = null;
// 4734
o54.getAttribute = f81632121_506;
// 4736
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0]");
// 4737
o52 = {};
// 4738
o54.firstChild = o52;
// undefined
o54 = null;
// 4739
o52.getAttribute = f81632121_506;
// 4741
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left]");
// 4742
o54 = {};
// 4743
o52.firstChild = o54;
// undefined
o52 = null;
// 4744
o54.getAttribute = f81632121_506;
// 4746
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0]");
// 4747
o52 = {};
// 4748
o54.firstChild = o52;
// 4749
o52.getAttribute = f81632121_506;
// 4751
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 4752
o55 = {};
// 4753
o52.firstChild = o55;
// 4754
o55.getAttribute = f81632121_506;
// 4756
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4757
o56 = {};
// 4758
o55.firstChild = o56;
// undefined
o56 = null;
// 4759
o56 = {};
// 4760
o55.nextSibling = o56;
// undefined
o55 = null;
// 4761
o56.getAttribute = f81632121_506;
// 4763
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4764
o55 = {};
// 4765
o56.firstChild = o55;
// undefined
o55 = null;
// 4766
o55 = {};
// 4767
o56.nextSibling = o55;
// undefined
o56 = null;
// 4768
o55.getAttribute = f81632121_506;
// 4770
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4771
o56 = {};
// 4772
o55.firstChild = o56;
// undefined
o56 = null;
// 4773
o56 = {};
// 4774
o55.nextSibling = o56;
// undefined
o55 = null;
// 4775
o56.getAttribute = f81632121_506;
// undefined
o56 = null;
// 4777
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0].[3]");
// 4780
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 4783
f81632121_645.returns.push(true);
// undefined
fo81632121_897_firstChild.returns.push(o39);
// 4787
f81632121_506.returns.push(".r[70hf]");
// 4791
f81632121_506.returns.push(".r[70hf].[1][0]");
// 4796
f81632121_506.returns.push(".r[70hf].[1][4][0]");
// 4801
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}");
// 4806
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 4808
o55 = {};
// 4809
o53.nextSibling = o55;
// 4810
o55.getAttribute = f81632121_506;
// 4812
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}");
// 4813
o56 = {};
// 4814
o55.firstChild = o56;
// 4815
o56.getAttribute = f81632121_506;
// 4817
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0]");
// 4818
o57 = {};
// 4819
o56.firstChild = o57;
// undefined
o56 = null;
// 4820
o57.getAttribute = f81632121_506;
// 4822
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[left]");
// 4823
o56 = {};
// 4824
o57.firstChild = o56;
// undefined
o56 = null;
// 4825
o56 = {};
// 4826
o57.nextSibling = o56;
// undefined
o57 = null;
// 4827
o56.getAttribute = f81632121_506;
// 4829
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right]");
// 4830
o57 = {};
// 4831
o56.firstChild = o57;
// undefined
o56 = null;
// 4832
o57.getAttribute = f81632121_506;
// 4834
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0]");
// 4835
o56 = {};
// 4836
o57.firstChild = o56;
// undefined
o57 = null;
// 4837
o56.getAttribute = f81632121_506;
// 4839
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left]");
// 4840
o57 = {};
// 4841
o56.firstChild = o57;
// undefined
o56 = null;
// 4842
o57.getAttribute = f81632121_506;
// 4844
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0]");
// 4845
o56 = {};
// 4846
o57.firstChild = o56;
// undefined
o57 = null;
// 4847
o56.getAttribute = f81632121_506;
// 4849
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0]");
// 4850
o57 = {};
// 4851
o56.firstChild = o57;
// undefined
o56 = null;
// 4852
o57.getAttribute = f81632121_506;
// 4854
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4855
o56 = {};
// 4856
o57.firstChild = o56;
// undefined
o56 = null;
// 4857
o56 = {};
// 4858
o57.nextSibling = o56;
// undefined
o57 = null;
// 4859
o56.getAttribute = f81632121_506;
// 4861
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4862
o57 = {};
// 4863
o56.firstChild = o57;
// undefined
o57 = null;
// 4864
o57 = {};
// 4865
o56.nextSibling = o57;
// undefined
o56 = null;
// 4866
o57.getAttribute = f81632121_506;
// 4868
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4869
o56 = {};
// 4870
o57.firstChild = o56;
// undefined
o56 = null;
// 4871
o56 = {};
// 4872
o57.nextSibling = o56;
// undefined
o57 = null;
// 4873
o56.getAttribute = f81632121_506;
// undefined
o56 = null;
// 4875
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}.[0].[right].[0].[left].[0].[0].[3]");
// 4878
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}");
// 4881
f81632121_645.returns.push(true);
// undefined
fo81632121_897_firstChild.returns.push(o39);
// 4885
f81632121_506.returns.push(".r[70hf]");
// 4889
f81632121_506.returns.push(".r[70hf].[1][0]");
// 4894
f81632121_506.returns.push(".r[70hf].[1][4][0]");
// 4899
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4946958}");
// 4904
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 4909
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950566}");
// 4911
o56 = {};
// 4912
o55.nextSibling = o56;
// undefined
o55 = null;
// 4913
o56.getAttribute = f81632121_506;
// 4915
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}");
// 4916
o55 = {};
// 4917
o56.firstChild = o55;
// undefined
o56 = null;
// 4918
o55.getAttribute = f81632121_506;
// 4920
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0]");
// 4921
o56 = {};
// 4922
o55.firstChild = o56;
// undefined
o55 = null;
// 4923
o56.getAttribute = f81632121_506;
// 4925
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[left]");
// 4926
o55 = {};
// 4927
o56.firstChild = o55;
// undefined
o55 = null;
// 4928
o55 = {};
// 4929
o56.nextSibling = o55;
// undefined
o56 = null;
// 4930
o55.getAttribute = f81632121_506;
// 4932
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right]");
// 4933
o56 = {};
// 4934
o55.firstChild = o56;
// undefined
o55 = null;
// 4935
o56.getAttribute = f81632121_506;
// 4937
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0]");
// 4938
o55 = {};
// 4939
o56.firstChild = o55;
// undefined
o56 = null;
// 4940
o55.getAttribute = f81632121_506;
// 4942
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left]");
// 4943
o56 = {};
// 4944
o55.firstChild = o56;
// undefined
o55 = null;
// 4945
o56.getAttribute = f81632121_506;
// 4947
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0]");
// 4948
o55 = {};
// 4949
o56.firstChild = o55;
// undefined
o56 = null;
// 4950
o55.getAttribute = f81632121_506;
// 4952
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0]");
// 4953
o56 = {};
// 4954
o55.firstChild = o56;
// undefined
o55 = null;
// 4955
o56.getAttribute = f81632121_506;
// 4957
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][0]");
// 4958
o55 = {};
// 4959
o56.firstChild = o55;
// undefined
o55 = null;
// 4960
o55 = {};
// 4961
o56.nextSibling = o55;
// undefined
o56 = null;
// 4962
o55.getAttribute = f81632121_506;
// 4964
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][1]");
// 4965
o56 = {};
// 4966
o55.firstChild = o56;
// undefined
o56 = null;
// 4967
o56 = {};
// 4968
o55.nextSibling = o56;
// undefined
o55 = null;
// 4969
o56.getAttribute = f81632121_506;
// 4971
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[0][2]");
// 4972
o55 = {};
// 4973
o56.firstChild = o55;
// undefined
o55 = null;
// 4974
o55 = {};
// 4975
o56.nextSibling = o55;
// undefined
o56 = null;
// 4976
o55.getAttribute = f81632121_506;
// undefined
o55 = null;
// 4978
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}.[0].[right].[0].[left].[0].[0].[3]");
// 4981
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4950571}");
// 4984
f81632121_645.returns.push(true);
// 4986
f81632121_467.returns.push(1374851215098);
// 4991
o55 = {};
// 4992
f81632121_504.returns.push(o55);
// 4993
o55.length = 16;
// 4994
o55["0"] = o40;
// 4995
o55["1"] = o41;
// 4996
o55["2"] = o42;
// 4997
o55["3"] = o43;
// 4998
o55["4"] = o48;
// 4999
o55["5"] = o49;
// 5000
o55["6"] = o50;
// 5001
o55["7"] = o51;
// 5002
o55["8"] = o44;
// 5003
o55["9"] = o45;
// 5004
o55["10"] = o46;
// 5005
o55["11"] = o47;
// 5006
o56 = {};
// 5007
o55["12"] = o56;
// 5008
o57 = {};
// 5009
o55["13"] = o57;
// 5010
o58 = {};
// 5011
o55["14"] = o58;
// 5012
o59 = {};
// 5013
o55["15"] = o59;
// undefined
o55 = null;
// 5014
f81632121_14.returns.push(undefined);
// 5015
f81632121_12.returns.push(12);
// 5016
o37.nodeName = "DIV";
// undefined
o37 = null;
// 5018
o38.nodeName = "DIV";
// 5019
o38.parentNode = o32;
// undefined
o38 = null;
// 5020
o32.nodeName = "FORM";
// 5024
o37 = {};
// 5025
f81632121_474.returns.push(o37);
// 5027
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 5029
f81632121_467.returns.push(1374851215100);
// 5033
o37 = {};
// 5034
f81632121_474.returns.push(o37);
// 5036
f81632121_478.returns.push(o37);
// undefined
o37 = null;
// 5039
f81632121_467.returns.push(1374851215101);
// 5041
f81632121_467.returns.push(1374851215101);
// 5042
o37 = {};
// 5044
o23.parentNode = o9;
// 5045
o9.removeChild = f81632121_521;
// 5046
f81632121_521.returns.push(o23);
// 5054
o38 = {};
// 5055
o55 = {};
// 5057
o38.nodeType = void 0;
// 5058
o38.length = 1;
// 5059
o38["0"] = "/MWWQ";
// 5070
f81632121_468.returns.push(undefined);
// 5071
o8.JSBNG__oninput = null;
// 5076
f81632121_468.returns.push(undefined);
// 5077
o8.JSBNG__onkeyup = null;
// 5084
f81632121_468.returns.push(undefined);
// 5085
f81632121_1000 = function() { return f81632121_1000.returns[f81632121_1000.inst++]; };
f81632121_1000.returns = [];
f81632121_1000.inst = 0;
// 5086
o8.JSBNG__onsubmit = f81632121_1000;
// 5089
// 5094
o5.protocol = "https:";
// undefined
fo81632121_1_cookie = function() { return fo81632121_1_cookie.returns[fo81632121_1_cookie.inst++]; };
fo81632121_1_cookie.returns = [];
fo81632121_1_cookie.inst = 0;
defineGetter(o0, "cookie", fo81632121_1_cookie, undefined);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; highContrastMode=1; wd=1034x727");
// 5097
f81632121_467.returns.push(1374851215241);
// 5098
o60 = {};
// 5099
f81632121_0.returns.push(o60);
// 5100
f81632121_1002 = function() { return f81632121_1002.returns[f81632121_1002.inst++]; };
f81632121_1002.returns = [];
f81632121_1002.inst = 0;
// 5101
o60.toGMTString = f81632121_1002;
// undefined
o60 = null;
// 5102
f81632121_1002.returns.push("Fri, 02 Aug 2013 15:06:55 GMT");
// 5103
o5.hostname = "jsbngssl.www.facebook.com";
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; highContrastMode=1; wd=1034x727");
// 5106
f81632121_467.returns.push(1374851215242);
// 5108
f81632121_482.returns.push("1;1");
// 5113
// 5116
o60 = {};
// 5117
o61 = {};
// 5119
o60.nodeType = void 0;
// 5120
o60.length = 1;
// 5121
o60["0"] = "AVmr9";
// 5131
f81632121_468.returns.push(undefined);
// 5132
o8.JSBNG__onkeydown = null;
// 5142
f81632121_468.returns.push(undefined);
// 5143
f81632121_1005 = function() { return f81632121_1005.returns[f81632121_1005.inst++]; };
f81632121_1005.returns = [];
f81632121_1005.inst = 0;
// 5144
o8.JSBNG__onclick = f81632121_1005;
// 5147
// 5151
o62 = {};
// 5152
f81632121_476.returns.push(o62);
// 5157
f81632121_468.returns.push(undefined);
// 5158
o8.JSBNG__onmousedown = null;
// 5166
f81632121_468.returns.push(undefined);
// 5167
f81632121_1007 = function() { return f81632121_1007.returns[f81632121_1007.inst++]; };
f81632121_1007.returns = [];
f81632121_1007.inst = 0;
// 5168
o8.JSBNG__onmouseover = f81632121_1007;
// 5171
// 5183
o63 = {};
// 5184
f81632121_508.returns.push(o63);
// 5185
o63.getElementsByTagName = f81632121_502;
// 5187
o63.querySelectorAll = f81632121_504;
// 5188
o64 = {};
// 5189
f81632121_504.returns.push(o64);
// 5190
o64.length = 1;
// 5191
o65 = {};
// 5192
o64["0"] = o65;
// undefined
o64 = null;
// 5193
o65.getElementsByTagName = f81632121_502;
// 5195
o65.querySelectorAll = f81632121_504;
// 5196
o64 = {};
// 5197
f81632121_504.returns.push(o64);
// 5198
o64.length = 1;
// 5199
o66 = {};
// 5200
o64["0"] = o66;
// undefined
o64 = null;
// 5201
o66.getElementsByTagName = f81632121_502;
// 5203
o66.querySelectorAll = f81632121_504;
// undefined
o66 = null;
// 5204
o64 = {};
// 5205
f81632121_504.returns.push(o64);
// 5206
o64.length = 1;
// 5207
o66 = {};
// 5208
o64["0"] = o66;
// undefined
o64 = null;
// 5212
o64 = {};
// 5213
f81632121_504.returns.push(o64);
// 5214
o64.length = 1;
// 5215
o67 = {};
// 5216
o64["0"] = o67;
// undefined
o64 = null;
// 5217
o67.getElementsByTagName = f81632121_502;
// 5219
o67.querySelectorAll = f81632121_504;
// 5220
o64 = {};
// 5221
f81632121_504.returns.push(o64);
// 5222
o64.length = 1;
// 5223
o68 = {};
// 5224
o64["0"] = o68;
// undefined
o64 = null;
// 5225
f81632121_12.returns.push(13);
// 5226
o65.nodeName = "DIV";
// 5227
o65.__FB_TOKEN = void 0;
// 5228
// 5229
o65.getAttribute = f81632121_506;
// 5230
o65.hasAttribute = f81632121_507;
// 5232
f81632121_507.returns.push(false);
// 5233
o65.JSBNG__addEventListener = f81632121_468;
// 5235
f81632121_468.returns.push(undefined);
// 5236
o65.JSBNG__onJSBNG__scroll = void 0;
// 5238
o63.nodeName = "DIV";
// 5239
o63.__FB_TOKEN = void 0;
// 5240
// 5241
o63.getAttribute = f81632121_506;
// 5242
o63.hasAttribute = f81632121_507;
// 5244
f81632121_507.returns.push(false);
// 5245
o63.JSBNG__addEventListener = f81632121_468;
// 5247
f81632121_468.returns.push(undefined);
// 5248
o63.JSBNG__onmousemove = null;
// 5250
o67.nodeName = "DIV";
// 5251
o67.__FB_TOKEN = void 0;
// 5252
// 5253
o67.getAttribute = f81632121_506;
// 5254
o67.hasAttribute = f81632121_507;
// 5256
f81632121_507.returns.push(false);
// 5257
o67.JSBNG__addEventListener = f81632121_468;
// 5259
f81632121_468.returns.push(undefined);
// 5260
o67.JSBNG__onclick = null;
// 5262
o64 = {};
// 5263
o62.style = o64;
// 5265
// 5267
// undefined
o64 = null;
// 5269
o62.__html = void 0;
// 5271
o64 = {};
// 5272
f81632121_474.returns.push(o64);
// 5274
o8.appendChild = f81632121_478;
// 5275
f81632121_478.returns.push(o64);
// undefined
o64 = null;
// 5276
o64 = {};
// 5277
f81632121_4.returns.push(o64);
// 5278
o64.pointerEvents = "";
// undefined
o64 = null;
// 5279
o62.parentNode = null;
// 5283
f81632121_468.returns.push(undefined);
// 5284
o63.JSBNG__onmouseover = null;
// 5289
f81632121_468.returns.push(undefined);
// 5290
o63.JSBNG__onmouseout = null;
// 5295
f81632121_468.returns.push(undefined);
// 5296
o63.JSBNG__onfocusin = void 0;
// 5301
f81632121_468.returns.push(undefined);
// 5302
o63.JSBNG__onfocusout = void 0;
// 5307
f81632121_468.returns.push(undefined);
// 5308
o63.JSBNG__onmousedown = null;
// 5310
o68.nodeName = "DIV";
// 5311
o68.__FB_TOKEN = void 0;
// 5312
// 5313
o68.getAttribute = f81632121_506;
// 5314
o68.hasAttribute = f81632121_507;
// 5316
f81632121_507.returns.push(false);
// 5317
o68.JSBNG__addEventListener = f81632121_468;
// 5319
f81632121_468.returns.push(undefined);
// 5320
o68.JSBNG__onmousedown = null;
// 5322
o64 = {};
// 5323
o63.classList = o64;
// 5325
o64.add = f81632121_602;
// 5326
f81632121_602.returns.push(undefined);
// 5329
o69 = {};
// 5330
f81632121_508.returns.push(o69);
// 5331
o69.getElementsByTagName = f81632121_502;
// 5333
o69.querySelectorAll = f81632121_504;
// 5334
o70 = {};
// 5335
f81632121_504.returns.push(o70);
// 5336
o70.length = 1;
// 5337
o71 = {};
// 5338
o70["0"] = o71;
// undefined
o70 = null;
// 5339
o71.getElementsByTagName = f81632121_502;
// 5341
o71.querySelectorAll = f81632121_504;
// 5342
o70 = {};
// 5343
f81632121_504.returns.push(o70);
// 5344
o70.length = 1;
// 5345
o72 = {};
// 5346
o70["0"] = o72;
// undefined
o70 = null;
// 5347
o72.getElementsByTagName = f81632121_502;
// 5349
o72.querySelectorAll = f81632121_504;
// undefined
o72 = null;
// 5350
o70 = {};
// 5351
f81632121_504.returns.push(o70);
// 5352
o70.length = 1;
// 5353
o72 = {};
// 5354
o70["0"] = o72;
// undefined
o70 = null;
// 5358
o70 = {};
// 5359
f81632121_504.returns.push(o70);
// 5360
o70.length = 1;
// 5361
o73 = {};
// 5362
o70["0"] = o73;
// undefined
o70 = null;
// 5363
o73.getElementsByTagName = f81632121_502;
// 5365
o73.querySelectorAll = f81632121_504;
// 5366
o70 = {};
// 5367
f81632121_504.returns.push(o70);
// 5368
o70.length = 1;
// 5369
o74 = {};
// 5370
o70["0"] = o74;
// undefined
o70 = null;
// 5371
f81632121_12.returns.push(14);
// 5372
o71.nodeName = "DIV";
// 5373
o71.__FB_TOKEN = void 0;
// 5374
// 5375
o71.getAttribute = f81632121_506;
// 5376
o71.hasAttribute = f81632121_507;
// 5378
f81632121_507.returns.push(false);
// 5379
o71.JSBNG__addEventListener = f81632121_468;
// 5381
f81632121_468.returns.push(undefined);
// 5382
o71.JSBNG__onJSBNG__scroll = void 0;
// 5384
o69.nodeName = "DIV";
// 5385
o69.__FB_TOKEN = void 0;
// 5386
// 5387
o69.getAttribute = f81632121_506;
// 5388
o69.hasAttribute = f81632121_507;
// 5390
f81632121_507.returns.push(false);
// 5391
o69.JSBNG__addEventListener = f81632121_468;
// 5393
f81632121_468.returns.push(undefined);
// 5394
o69.JSBNG__onmousemove = null;
// 5396
o73.nodeName = "DIV";
// 5397
o73.__FB_TOKEN = void 0;
// 5398
// 5399
o73.getAttribute = f81632121_506;
// 5400
o73.hasAttribute = f81632121_507;
// 5402
f81632121_507.returns.push(false);
// 5403
o73.JSBNG__addEventListener = f81632121_468;
// 5405
f81632121_468.returns.push(undefined);
// 5406
o73.JSBNG__onclick = null;
// 5411
f81632121_468.returns.push(undefined);
// 5412
o69.JSBNG__onmouseover = null;
// 5417
f81632121_468.returns.push(undefined);
// 5418
o69.JSBNG__onmouseout = null;
// 5423
f81632121_468.returns.push(undefined);
// 5424
o69.JSBNG__onfocusin = void 0;
// 5429
f81632121_468.returns.push(undefined);
// 5430
o69.JSBNG__onfocusout = void 0;
// 5435
f81632121_468.returns.push(undefined);
// 5436
o69.JSBNG__onmousedown = null;
// 5438
o74.nodeName = "DIV";
// 5439
o74.__FB_TOKEN = void 0;
// 5440
// 5441
o74.getAttribute = f81632121_506;
// 5442
o74.hasAttribute = f81632121_507;
// 5444
f81632121_507.returns.push(false);
// 5445
o74.JSBNG__addEventListener = f81632121_468;
// 5447
f81632121_468.returns.push(undefined);
// 5448
o74.JSBNG__onmousedown = null;
// 5452
o70 = {};
// 5453
f81632121_508.returns.push(o70);
// 5454
o70.getElementsByTagName = f81632121_502;
// 5456
o70.querySelectorAll = f81632121_504;
// 5457
o75 = {};
// 5458
f81632121_504.returns.push(o75);
// 5459
o75.length = 1;
// 5460
o76 = {};
// 5461
o75["0"] = o76;
// undefined
o75 = null;
// 5462
o76.getElementsByTagName = f81632121_502;
// 5464
o76.querySelectorAll = f81632121_504;
// 5465
o75 = {};
// 5466
f81632121_504.returns.push(o75);
// 5467
o75.length = 1;
// 5468
o77 = {};
// 5469
o75["0"] = o77;
// undefined
o75 = null;
// 5470
o77.getElementsByTagName = f81632121_502;
// 5472
o77.querySelectorAll = f81632121_504;
// undefined
o77 = null;
// 5473
o75 = {};
// 5474
f81632121_504.returns.push(o75);
// 5475
o75.length = 1;
// 5476
o77 = {};
// 5477
o75["0"] = o77;
// undefined
o75 = null;
// 5481
o75 = {};
// 5482
f81632121_504.returns.push(o75);
// 5483
o75.length = 1;
// 5484
o78 = {};
// 5485
o75["0"] = o78;
// undefined
o75 = null;
// 5486
o78.getElementsByTagName = f81632121_502;
// 5488
o78.querySelectorAll = f81632121_504;
// 5489
o75 = {};
// 5490
f81632121_504.returns.push(o75);
// 5491
o75.length = 1;
// 5492
o79 = {};
// 5493
o75["0"] = o79;
// undefined
o75 = null;
// 5494
f81632121_12.returns.push(15);
// 5495
o76.nodeName = "DIV";
// 5496
o76.__FB_TOKEN = void 0;
// 5497
// 5498
o76.getAttribute = f81632121_506;
// 5499
o76.hasAttribute = f81632121_507;
// 5501
f81632121_507.returns.push(false);
// 5502
o76.JSBNG__addEventListener = f81632121_468;
// 5504
f81632121_468.returns.push(undefined);
// 5505
o76.JSBNG__onJSBNG__scroll = void 0;
// 5507
o70.nodeName = "DIV";
// 5508
o70.__FB_TOKEN = void 0;
// 5509
// 5510
o70.getAttribute = f81632121_506;
// 5511
o70.hasAttribute = f81632121_507;
// 5513
f81632121_507.returns.push(false);
// 5514
o70.JSBNG__addEventListener = f81632121_468;
// 5516
f81632121_468.returns.push(undefined);
// 5517
o70.JSBNG__onmousemove = null;
// 5519
o78.nodeName = "DIV";
// 5520
o78.__FB_TOKEN = void 0;
// 5521
// 5522
o78.getAttribute = f81632121_506;
// 5523
o78.hasAttribute = f81632121_507;
// 5525
f81632121_507.returns.push(false);
// 5526
o78.JSBNG__addEventListener = f81632121_468;
// 5528
f81632121_468.returns.push(undefined);
// 5529
o78.JSBNG__onclick = null;
// 5534
f81632121_468.returns.push(undefined);
// 5535
o70.JSBNG__onmouseover = null;
// 5540
f81632121_468.returns.push(undefined);
// 5541
o70.JSBNG__onmouseout = null;
// 5546
f81632121_468.returns.push(undefined);
// 5547
o70.JSBNG__onfocusin = void 0;
// 5552
f81632121_468.returns.push(undefined);
// 5553
o70.JSBNG__onfocusout = void 0;
// 5558
f81632121_468.returns.push(undefined);
// 5559
o70.JSBNG__onmousedown = null;
// 5561
o79.nodeName = "DIV";
// 5562
o79.__FB_TOKEN = void 0;
// 5563
// 5564
o79.getAttribute = f81632121_506;
// 5565
o79.hasAttribute = f81632121_507;
// 5567
f81632121_507.returns.push(false);
// 5568
o79.JSBNG__addEventListener = f81632121_468;
// 5570
f81632121_468.returns.push(undefined);
// 5571
o79.JSBNG__onmousedown = null;
// 5573
o75 = {};
// 5574
o70.classList = o75;
// 5576
o75.add = f81632121_602;
// 5577
f81632121_602.returns.push(undefined);
// 5580
o80 = {};
// 5581
f81632121_476.returns.push(o80);
// 5582
// 5583
// 5584
o80.getElementsByTagName = f81632121_502;
// 5585
o81 = {};
// 5586
f81632121_502.returns.push(o81);
// 5587
o81.length = 0;
// undefined
o81 = null;
// 5589
o81 = {};
// 5590
o80.childNodes = o81;
// undefined
o80 = null;
// 5591
o81.nodeType = void 0;
// 5592
o81.getElementsByTagName = void 0;
// 5593
o81.__html = void 0;
// 5594
o81.mountComponentIntoNode = void 0;
// 5595
o81.classList = void 0;
// 5597
o81.className = void 0;
// 5599
// undefined
o81 = null;
// 5601
o80 = {};
// 5602
f81632121_476.returns.push(o80);
// 5603
o80.firstChild = null;
// 5605
o81 = {};
// 5606
f81632121_474.returns.push(o81);
// 5608
o80.appendChild = f81632121_478;
// 5609
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5611
o81 = {};
// 5612
f81632121_476.returns.push(o81);
// 5613
// 5614
o81.firstChild = null;
// 5615
o80.__html = void 0;
// 5617
o82 = {};
// 5618
f81632121_474.returns.push(o82);
// 5620
o81.appendChild = f81632121_478;
// 5621
f81632121_478.returns.push(o82);
// undefined
o82 = null;
// 5623
o82 = {};
// 5624
f81632121_476.returns.push(o82);
// 5625
// 5626
o82.firstChild = null;
// 5627
o81.__html = void 0;
// undefined
o81 = null;
// 5629
o81 = {};
// 5630
f81632121_474.returns.push(o81);
// 5632
o82.appendChild = f81632121_478;
// 5633
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5634
o81 = {};
// 5635
o82.classList = o81;
// 5637
o81.add = f81632121_602;
// undefined
o81 = null;
// 5638
f81632121_602.returns.push(undefined);
// 5639
o81 = {};
// 5640
o80.style = o81;
// undefined
o80 = null;
// 5641
// undefined
o81 = null;
// 5645
f81632121_602.returns.push(undefined);
// 5646
o82.__FB_TOKEN = void 0;
// 5647
// 5648
o82.nodeName = "DIV";
// 5649
o82.getAttribute = f81632121_506;
// 5650
o82.hasAttribute = f81632121_507;
// 5652
f81632121_507.returns.push(false);
// 5653
o82.JSBNG__addEventListener = f81632121_468;
// 5655
f81632121_468.returns.push(undefined);
// 5656
o82.JSBNG__onclick = null;
// 5661
f81632121_468.returns.push(undefined);
// 5662
o82.JSBNG__onsubmit = null;
// 5667
f81632121_468.returns.push(undefined);
// 5668
o82.JSBNG__onsuccess = void 0;
// 5673
f81632121_468.returns.push(undefined);
// 5674
o82.JSBNG__onerror = null;
// undefined
o82 = null;
// 5676
f81632121_12.returns.push(16);
// 5679
o80 = {};
// 5680
f81632121_476.returns.push(o80);
// 5681
// 5682
// 5683
o80.getElementsByTagName = f81632121_502;
// 5684
o81 = {};
// 5685
f81632121_502.returns.push(o81);
// 5686
o81.length = 0;
// undefined
o81 = null;
// 5688
o81 = {};
// 5689
o80.childNodes = o81;
// undefined
o80 = null;
// 5690
o81.nodeType = void 0;
// 5691
o81.getElementsByTagName = void 0;
// 5692
o81.__html = void 0;
// 5693
o81.mountComponentIntoNode = void 0;
// 5694
o81.classList = void 0;
// 5696
o81.className = void 0;
// 5698
// undefined
o81 = null;
// 5700
o80 = {};
// 5701
f81632121_476.returns.push(o80);
// 5702
o80.firstChild = null;
// 5704
o81 = {};
// 5705
f81632121_474.returns.push(o81);
// 5707
o80.appendChild = f81632121_478;
// 5708
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5710
o81 = {};
// 5711
f81632121_476.returns.push(o81);
// 5712
// 5713
o81.firstChild = null;
// 5714
o80.__html = void 0;
// 5716
o82 = {};
// 5717
f81632121_474.returns.push(o82);
// 5719
o81.appendChild = f81632121_478;
// 5720
f81632121_478.returns.push(o82);
// undefined
o82 = null;
// 5722
o82 = {};
// 5723
f81632121_476.returns.push(o82);
// 5724
// 5725
o82.firstChild = null;
// 5726
o81.__html = void 0;
// undefined
o81 = null;
// 5728
o81 = {};
// 5729
f81632121_474.returns.push(o81);
// 5731
o82.appendChild = f81632121_478;
// 5732
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5733
o81 = {};
// 5734
o82.classList = o81;
// 5736
o81.add = f81632121_602;
// undefined
o81 = null;
// 5737
f81632121_602.returns.push(undefined);
// 5738
o81 = {};
// 5739
o80.style = o81;
// undefined
o80 = null;
// 5740
// undefined
o81 = null;
// 5744
f81632121_602.returns.push(undefined);
// 5745
o82.__FB_TOKEN = void 0;
// 5746
// undefined
o82 = null;
// 5749
o80 = {};
// 5750
f81632121_476.returns.push(o80);
// 5751
// 5752
// 5753
o80.getElementsByTagName = f81632121_502;
// 5754
o81 = {};
// 5755
f81632121_502.returns.push(o81);
// 5756
o81.length = 0;
// undefined
o81 = null;
// 5758
o81 = {};
// 5759
o80.childNodes = o81;
// undefined
o80 = null;
// 5760
o81.nodeType = void 0;
// 5761
o81.getElementsByTagName = void 0;
// 5762
o81.__html = void 0;
// 5763
o81.mountComponentIntoNode = void 0;
// 5764
o81.classList = void 0;
// 5766
o81.className = void 0;
// 5768
// undefined
o81 = null;
// 5770
o80 = {};
// 5771
f81632121_476.returns.push(o80);
// 5772
o80.firstChild = null;
// 5774
o81 = {};
// 5775
f81632121_474.returns.push(o81);
// 5777
o80.appendChild = f81632121_478;
// 5778
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5780
o81 = {};
// 5781
f81632121_476.returns.push(o81);
// 5782
// 5783
o81.firstChild = null;
// 5784
o80.__html = void 0;
// 5786
o82 = {};
// 5787
f81632121_474.returns.push(o82);
// 5789
o81.appendChild = f81632121_478;
// 5790
f81632121_478.returns.push(o82);
// undefined
o82 = null;
// 5792
o82 = {};
// 5793
f81632121_476.returns.push(o82);
// 5794
// 5795
o82.firstChild = null;
// 5796
o81.__html = void 0;
// undefined
o81 = null;
// 5798
o81 = {};
// 5799
f81632121_474.returns.push(o81);
// 5801
o82.appendChild = f81632121_478;
// 5802
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5803
o81 = {};
// 5804
o82.classList = o81;
// 5806
o81.add = f81632121_602;
// undefined
o81 = null;
// 5807
f81632121_602.returns.push(undefined);
// 5808
o81 = {};
// 5809
o80.style = o81;
// undefined
o80 = null;
// 5810
// undefined
o81 = null;
// 5814
f81632121_602.returns.push(undefined);
// 5815
o82.__FB_TOKEN = void 0;
// 5816
// undefined
o82 = null;
// 5819
o80 = {};
// 5820
f81632121_476.returns.push(o80);
// 5821
// 5822
// 5823
o80.getElementsByTagName = f81632121_502;
// 5824
o81 = {};
// 5825
f81632121_502.returns.push(o81);
// 5826
o81.length = 0;
// undefined
o81 = null;
// 5828
o81 = {};
// 5829
o80.childNodes = o81;
// undefined
o80 = null;
// 5830
o81.nodeType = void 0;
// 5831
o81.getElementsByTagName = void 0;
// 5832
o81.__html = void 0;
// 5833
o81.mountComponentIntoNode = void 0;
// 5834
o81.classList = void 0;
// 5836
o81.className = void 0;
// 5838
// undefined
o81 = null;
// 5840
o80 = {};
// 5841
f81632121_476.returns.push(o80);
// 5842
o80.firstChild = null;
// 5844
o81 = {};
// 5845
f81632121_474.returns.push(o81);
// 5847
o80.appendChild = f81632121_478;
// 5848
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5850
o81 = {};
// 5851
f81632121_476.returns.push(o81);
// 5852
// 5853
o81.firstChild = null;
// 5854
o80.__html = void 0;
// 5856
o82 = {};
// 5857
f81632121_474.returns.push(o82);
// 5859
o81.appendChild = f81632121_478;
// 5860
f81632121_478.returns.push(o82);
// undefined
o82 = null;
// 5862
o82 = {};
// 5863
f81632121_476.returns.push(o82);
// 5864
// 5865
o82.firstChild = null;
// 5866
o81.__html = void 0;
// undefined
o81 = null;
// 5868
o81 = {};
// 5869
f81632121_474.returns.push(o81);
// 5871
o82.appendChild = f81632121_478;
// 5872
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5873
o81 = {};
// 5874
o82.classList = o81;
// 5876
o81.add = f81632121_602;
// undefined
o81 = null;
// 5877
f81632121_602.returns.push(undefined);
// 5878
o81 = {};
// 5879
o80.style = o81;
// undefined
o80 = null;
// 5880
// undefined
o81 = null;
// 5884
f81632121_602.returns.push(undefined);
// 5885
o82.__FB_TOKEN = void 0;
// 5886
// undefined
o82 = null;
// 5890
o30.__html = void 0;
// 5891
o30.mountComponentIntoNode = void 0;
// 5892
o30.classList = void 0;
// 5894
o30.className = void 0;
// 5896
// undefined
o30 = null;
// 5898
o30 = {};
// 5899
f81632121_476.returns.push(o30);
// 5900
o30.firstChild = null;
// 5902
o80 = {};
// 5903
f81632121_474.returns.push(o80);
// 5905
o30.appendChild = f81632121_478;
// 5906
f81632121_478.returns.push(o80);
// undefined
o80 = null;
// 5908
o80 = {};
// 5909
f81632121_476.returns.push(o80);
// 5910
// 5911
o80.firstChild = null;
// 5912
o30.__html = void 0;
// 5914
o81 = {};
// 5915
f81632121_474.returns.push(o81);
// 5917
o80.appendChild = f81632121_478;
// 5918
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 5920
o81 = {};
// 5921
f81632121_476.returns.push(o81);
// 5922
// 5923
o81.firstChild = null;
// 5924
o80.__html = void 0;
// undefined
o80 = null;
// 5926
o80 = {};
// 5927
f81632121_474.returns.push(o80);
// 5929
o81.appendChild = f81632121_478;
// 5930
f81632121_478.returns.push(o80);
// undefined
o80 = null;
// 5931
o80 = {};
// 5932
o81.classList = o80;
// 5934
o80.add = f81632121_602;
// undefined
o80 = null;
// 5935
f81632121_602.returns.push(undefined);
// 5936
o80 = {};
// 5937
o30.style = o80;
// undefined
o30 = null;
// 5938
// undefined
o80 = null;
// 5942
f81632121_602.returns.push(undefined);
// 5943
o81.__FB_TOKEN = void 0;
// 5944
// undefined
o81 = null;
// 5949
o30 = {};
// 5950
f81632121_476.returns.push(o30);
// undefined
o30 = null;
// 5952
o30 = {};
// 5953
f81632121_476.returns.push(o30);
// undefined
o30 = null;
// 5954
o30 = {};
// 5955
o80 = {};
// 5957
o30.nodeType = void 0;
// 5958
o30.length = 1;
// 5959
o30["0"] = "f7Tpb";
// 5982
o81 = {};
// 5985
o82 = {};
// 5986
o81.srcElement = o82;
// 5988
o81.target = o82;
// 5990
o82.nodeType = 1;
// 5991
o82.parentNode = o16;
// 5993
o82.getAttribute = f81632121_506;
// 5995
f81632121_506.returns.push(null);
// 5997
o16.parentNode = o8;
// 5998
o16.nodeType = 1;
// 6001
f81632121_506.returns.push(null);
// 6003
o8.parentNode = o0;
// 6004
o8.nodeType = 1;
// 6007
f81632121_506.returns.push(null);
// 6009
o0.parentNode = null;
// 6010
o0.nodeType = 9;
// 6012
o81.JSBNG__screenX = 1070;
// 6013
o81.JSBNG__screenY = 414;
// 6014
o81.altKey = false;
// 6015
o81.bubbles = true;
// 6016
o81.button = 0;
// 6017
o81.buttons = void 0;
// 6018
o81.cancelable = false;
// 6019
o81.clientX = 1002;
// 6020
o81.clientY = 249;
// 6021
o81.ctrlKey = false;
// 6022
o81.currentTarget = o0;
// 6023
o81.defaultPrevented = false;
// 6024
o81.detail = 0;
// 6025
o81.eventPhase = 3;
// 6026
o81.isTrusted = void 0;
// 6027
o81.metaKey = false;
// 6028
o81.pageX = 1002;
// 6029
o81.pageY = 408;
// 6030
o81.relatedTarget = null;
// 6031
o81.fromElement = null;
// 6034
o81.shiftKey = false;
// 6037
o81.timeStamp = 1374851215437;
// 6038
o81.type = "mousemove";
// 6039
o81.view = ow81632121;
// 6041
o81.returnValue = true;
// 6042
o81.cancelBubble = false;
// undefined
o81 = null;
// 6049
f81632121_467.returns.push(1374851215451);
// 6051
f81632121_467.returns.push(1374851215452);
// 6055
f81632121_467.returns.push(1374851215452);
// 6059
o81 = {};
// 6060
f81632121_474.returns.push(o81);
// 6062
f81632121_467.returns.push(1374851215452);
// 6065
o83 = {};
// 6066
f81632121_476.returns.push(o83);
// 6067
// 6068
// 6069
// 6070
// 6071
// 6072
o81.appendChild = f81632121_478;
// 6073
f81632121_478.returns.push(o83);
// 6075
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 6081
f81632121_467.returns.push(1374851215461);
// 6083
f81632121_467.returns.push(1374851215461);
// 6087
f81632121_467.returns.push(1374851215462);
// 6091
o81 = {};
// 6092
f81632121_474.returns.push(o81);
// 6094
f81632121_467.returns.push(1374851215462);
// 6097
o84 = {};
// 6098
f81632121_476.returns.push(o84);
// 6099
// 6100
// 6101
// 6102
// 6103
// 6104
o81.appendChild = f81632121_478;
// 6105
f81632121_478.returns.push(o84);
// 6107
f81632121_467.returns.push(1374851215463);
// 6110
o85 = {};
// 6111
f81632121_476.returns.push(o85);
// 6112
// 6113
// 6114
// 6115
// 6116
// 6118
f81632121_478.returns.push(o85);
// 6120
f81632121_478.returns.push(o81);
// undefined
o81 = null;
// 6121
o81 = {};
// 6123
f81632121_1110 = function() { return f81632121_1110.returns[f81632121_1110.inst++]; };
f81632121_1110.returns = [];
f81632121_1110.inst = 0;
// 6124
o81._needsGripper = f81632121_1110;
// 6125
f81632121_1111 = function() { return f81632121_1111.returns[f81632121_1111.inst++]; };
f81632121_1111.returns = [];
f81632121_1111.inst = 0;
// 6126
o81._throttledComputeHeights = f81632121_1111;
// 6128
f81632121_467.returns.push(1374851215477);
// 6129
o70.clientHeight = 0;
// undefined
o70 = null;
// 6130
o77.offsetHeight = 0;
// undefined
o77 = null;
// 6131
o78.offsetHeight = 0;
// undefined
o78 = null;
// 6132
f81632121_12.returns.push(17);
// 6133
f81632121_1111.returns.push(undefined);
// 6134
o81._gripperHeight = NaN;
// 6135
o81._trackHeight = 0;
// 6136
f81632121_1110.returns.push(false);
// 6137
f81632121_1112 = function() { return f81632121_1112.returns[f81632121_1112.inst++]; };
f81632121_1112.returns = [];
f81632121_1112.inst = 0;
// 6138
o81._throttledShowGripperAndShadows = f81632121_1112;
// 6140
f81632121_467.returns.push(1374851215487);
// 6142
f81632121_467.returns.push(1374851215487);
// 6143
o70 = {};
// 6144
o79.classList = o70;
// undefined
o79 = null;
// 6146
o70.add = f81632121_602;
// undefined
o70 = null;
// 6147
f81632121_602.returns.push(undefined);
// 6148
o76.scrollTop = 0;
// 6151
f81632121_1114 = function() { return f81632121_1114.returns[f81632121_1114.inst++]; };
f81632121_1114.returns = [];
f81632121_1114.inst = 0;
// 6152
o75.remove = f81632121_1114;
// undefined
o75 = null;
// 6153
f81632121_1114.returns.push(undefined);
// 6158
f81632121_1114.returns.push(undefined);
// 6159
f81632121_12.returns.push(18);
// 6160
f81632121_1112.returns.push(undefined);
// 6161
o70 = {};
// 6164
o70.srcElement = o82;
// 6166
o70.target = o82;
// 6173
f81632121_506.returns.push(null);
// 6179
f81632121_506.returns.push(null);
// 6185
f81632121_506.returns.push(null);
// 6190
o70.JSBNG__screenX = 1072;
// 6191
o70.JSBNG__screenY = 414;
// 6192
o70.altKey = false;
// 6193
o70.bubbles = true;
// 6194
o70.button = 0;
// 6195
o70.buttons = void 0;
// 6196
o70.cancelable = false;
// 6197
o70.clientX = 1004;
// 6198
o70.clientY = 249;
// 6199
o70.ctrlKey = false;
// 6200
o70.currentTarget = o0;
// 6201
o70.defaultPrevented = false;
// 6202
o70.detail = 0;
// 6203
o70.eventPhase = 3;
// 6204
o70.isTrusted = void 0;
// 6205
o70.metaKey = false;
// 6206
o70.pageX = 1004;
// 6207
o70.pageY = 408;
// 6208
o70.relatedTarget = null;
// 6209
o70.fromElement = null;
// 6212
o70.shiftKey = false;
// 6215
o70.timeStamp = 1374851215542;
// 6216
o70.type = "mousemove";
// 6217
o70.view = ow81632121;
// 6219
o70.returnValue = true;
// 6220
o70.cancelBubble = false;
// undefined
o70 = null;
// 6222
o70 = {};
// 6224
o70._needsGripper = f81632121_1110;
// 6225
f81632121_1117 = function() { return f81632121_1117.returns[f81632121_1117.inst++]; };
f81632121_1117.returns = [];
f81632121_1117.inst = 0;
// 6226
o70._throttledComputeHeights = f81632121_1117;
// 6228
f81632121_467.returns.push(1374851215544);
// 6229
o63.clientHeight = 0;
// 6230
o66.offsetHeight = 0;
// undefined
o66 = null;
// 6231
o67.offsetHeight = 0;
// undefined
o67 = null;
// 6232
f81632121_12.returns.push(19);
// 6233
f81632121_1117.returns.push(undefined);
// 6234
o70._gripperHeight = NaN;
// 6235
o70._trackHeight = 0;
// 6236
f81632121_1110.returns.push(false);
// 6237
f81632121_1118 = function() { return f81632121_1118.returns[f81632121_1118.inst++]; };
f81632121_1118.returns = [];
f81632121_1118.inst = 0;
// 6238
o70._throttledShowGripperAndShadows = f81632121_1118;
// 6240
f81632121_467.returns.push(1374851215548);
// 6242
f81632121_467.returns.push(1374851215548);
// 6243
o66 = {};
// 6244
o68.classList = o66;
// undefined
o68 = null;
// 6246
o66.add = f81632121_602;
// undefined
o66 = null;
// 6247
f81632121_602.returns.push(undefined);
// 6248
o65.scrollTop = 0;
// undefined
o65 = null;
// 6251
o64.remove = f81632121_1114;
// undefined
o64 = null;
// 6252
f81632121_1114.returns.push(undefined);
// 6257
f81632121_1114.returns.push(undefined);
// 6258
f81632121_12.returns.push(20);
// 6259
f81632121_1118.returns.push(undefined);
// 6262
f81632121_467.returns.push(1374851215549);
// 6263
o64 = {};
// 6264
f81632121_4.returns.push(o64);
// 6265
o64.height = "42px";
// undefined
o64 = null;
// 6266
o22.parentNode = o9;
// undefined
o9 = null;
// 6268
f81632121_521.returns.push(o22);
// undefined
o22 = null;
// 6270
f81632121_467.returns.push(1374851215549);
// 6271
f81632121_15.returns.push(undefined);
// 6272
o9 = {};
// 6278
f81632121_467.returns.push(1374851215550);
// 6279
f81632121_1122 = function() { return f81632121_1122.returns[f81632121_1122.inst++]; };
f81632121_1122.returns = [];
f81632121_1122.inst = 0;
// 6280
o4.pushState = f81632121_1122;
// 6281
o0.JSBNG__URL = "http://jsbngssl.www.facebook.com/LawlabeeTheWallaby";
// 6282
f81632121_1123 = function() { return f81632121_1123.returns[f81632121_1123.inst++]; };
f81632121_1123.returns = [];
f81632121_1123.inst = 0;
// 6283
o4.replaceState = f81632121_1123;
// undefined
o4 = null;
// 6284
f81632121_1123.returns.push(undefined);
// 6285
f81632121_7.returns.push(undefined);
// 6286
f81632121_1124 = function() { return f81632121_1124.returns[f81632121_1124.inst++]; };
f81632121_1124.returns = [];
f81632121_1124.inst = 0;
// 6287
ow81632121.JSBNG__onpopstate = f81632121_1124;
// 6294
f81632121_468.returns.push(undefined);
// 6295
o0.JSBNG__onsubmit = null;
// 6300
o4 = {};
// 6302
o4._needsGripper = f81632121_1110;
// 6303
f81632121_1126 = function() { return f81632121_1126.returns[f81632121_1126.inst++]; };
f81632121_1126.returns = [];
f81632121_1126.inst = 0;
// 6304
o4._throttledComputeHeights = f81632121_1126;
// 6306
f81632121_467.returns.push(1374851215552);
// 6307
o69.clientHeight = 0;
// 6308
o72.offsetHeight = 0;
// undefined
o72 = null;
// 6309
o73.offsetHeight = 0;
// undefined
o73 = null;
// 6310
f81632121_12.returns.push(21);
// 6311
f81632121_1126.returns.push(undefined);
// 6312
o4._gripperHeight = NaN;
// 6313
o4._trackHeight = 0;
// 6314
f81632121_1110.returns.push(false);
// 6315
f81632121_1127 = function() { return f81632121_1127.returns[f81632121_1127.inst++]; };
f81632121_1127.returns = [];
f81632121_1127.inst = 0;
// 6316
o4._throttledShowGripperAndShadows = f81632121_1127;
// 6318
f81632121_467.returns.push(1374851215552);
// 6320
f81632121_467.returns.push(1374851215552);
// 6321
o22 = {};
// 6322
o74.classList = o22;
// undefined
o74 = null;
// 6324
o22.add = f81632121_602;
// undefined
o22 = null;
// 6325
f81632121_602.returns.push(undefined);
// 6326
o71.scrollTop = 0;
// undefined
o71 = null;
// 6327
o22 = {};
// 6328
o69.classList = o22;
// 6330
o22.remove = f81632121_1114;
// 6331
f81632121_1114.returns.push(undefined);
// 6336
f81632121_1114.returns.push(undefined);
// 6337
f81632121_12.returns.push(22);
// 6338
f81632121_1127.returns.push(undefined);
// 6339
o64 = {};
// undefined
o64 = null;
// 6340
// 6341
// undefined
o83 = null;
// 6344
f81632121_467.returns.push(1374851215557);
// 6347
f81632121_467.returns.push(1374851215558);
// 6349
o64 = {};
// 6350
f81632121_508.returns.push(o64);
// 6352
o65 = {};
// 6353
f81632121_508.returns.push(o65);
// 6354
o66 = {};
// 6355
o65.firstChild = o66;
// 6357
o66.nodeType = 8;
// 6359
o66.nodeValue = " <div class=\"fbChatSidebar fixed_always hidden_elem\" id=\"u_0_22\"><div class=\"fbChatSidebarBody\"><div class=\"uiScrollableArea scrollableOrderedList fade\" style=\"width:205px;\" id=\"u_0_23\"><div class=\"uiScrollableAreaWrap scrollable\" aria-label=\"Scrollable region\" tabindex=\"0\"><div class=\"uiScrollableAreaBody\" style=\"width:205px;\"><div class=\"uiScrollableAreaContent\"><div id=\"u_0_29\"><ul class=\"fbChatOrderedList clearfix\"><li><div class=\"phs fcg\"><span data-jsid=\"message\">Loading...</span></div></li></ul></div></div></div></div><div class=\"uiScrollableAreaTrack invisible_elem\"><div class=\"uiScrollableAreaGripper\"></div></div></div><div class=\"fbChatTypeaheadView hidden_elem\" id=\"u_0_21\"></div></div><div class=\"fbChatSidebarMessage clearfix\"><img class=\"img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><div class=\"message fcg\"></div></div><table class=\"uiGrid -cx-PRIVATE-fbChatSidebarFooter__root\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td><div class=\"uiTypeahead uiClearableTypeahead fbChatTypeahead\" id=\"u_0_24\"><div class=\"wrap\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e31920a0c3d7535092c23ec61a3987f2d3bc254ed(event) {\\u000a\\u000a};\"), (\"s86d711f4a82117e4ddc059f9b64fc2aa5687ef8d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e31920a0c3d7535092c23ec61a3987f2d3bc254ed(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s86d711f4a82117e4ddc059f9b64fc2aa5687ef8d_0\"), (s86d711f4a82117e4ddc059f9b64fc2aa5687ef8d_0_instance), (this), (arguments)))\n        };\n        (null);\n    ;\n    };\n    var s86d711f4a82117e4ddc059f9b64fc2aa5687ef8d_0_instance;\n    ((s86d711f4a82117e4ddc059f9b64fc2aa5687ef8d_0_instance) = ((JSBNG_Record.eventInstance)((\"s86d711f4a82117e4ddc059f9b64fc2aa5687ef8d_0\"))));\n    ((JSBNG_Record.markFunction)((e31920a0c3d7535092c23ec61a3987f2d3bc254ed)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><button class=\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-xuiCloseButton__root clear uiTypeaheadCloseButton -cx-PRIVATE-xuiCloseButton__medium -cx-PRIVATE-xuiCloseButton__dark\" title=\"Remove\" onclick=\"return e31920a0c3d7535092c23ec61a3987f2d3bc254ed.call(this, event);\" type=\"button\" id=\"u_0_25\">Remove</button><input type=\"hidden\" autocomplete=\"off\" class=\"hiddenInput\" /><div class=\"innerWrap\"><input type=\"text\" class=\"inputtext inputsearch textInput DOMControl_placeholder\" autocomplete=\"off\" placeholder=\"Search\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-owns=\"typeahead_list_u_0_24\" role=\"combobox\" spellcheck=\"false\" value=\"Search\" aria-label=\"Search\" id=\"u_0_26\" /></div><img class=\"throbber uiLoadingIndicatorAsync img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div></div></td><td><div><div class=\"uiSelector inlineBlock fbChatSidebarDropdown button uiSelectorBottomUp uiSelectorRight\" id=\"u_0_27\" data-multiple=\"1\"><div class=\"uiToggle wrap\"><a data-hover=\"tooltip\" aria-label=\"Options\" class=\"uiSelectorButton uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"1\" rel=\"toggle\"></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem hidden_elem\" data-label=\"Chat from Desktop...\" id=\"sidebar-messenger-install-link\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ec0ed8ac6a7048f67ceaa2e8950b774f895367494(event) {\\u000a    FbdConversionTracking.logClick(\\\"chat_sidebar_gear_promo\\\");\\u000a};\"), (\"sa9759c52f0d107df16c372092cc1619071e70a16\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ec0ed8ac6a7048f67ceaa2e8950b774f895367494(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sa9759c52f0d107df16c372092cc1619071e70a16_0\"), (sa9759c52f0d107df16c372092cc1619071e70a16_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(FbdConversionTracking, (\"logClick\")))[(\"logClick\")])(\"chat_sidebar_gear_promo\");\n    };\n    var sa9759c52f0d107df16c372092cc1619071e70a16_0_instance;\n    ((sa9759c52f0d107df16c372092cc1619071e70a16_0_instance) = ((JSBNG_Record.eventInstance)((\"sa9759c52f0d107df16c372092cc1619071e70a16_0\"))));\n    ((JSBNG_Record.markFunction)((ec0ed8ac6a7048f67ceaa2e8950b774f895367494)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"itemAnchor\" role=\"menuitem\" tabindex=\"0\" href=\"/about/messenger?src=chat_sidebar_gear_promo\" onclick=\"return ec0ed8ac6a7048f67ceaa2e8950b774f895367494.call(this, event);\"><span class=\"itemLabel fsm\">Chat from Desktop...</span></a></li><li class=\"uiMenuSeparator hidden_elem\" id=\"sidebar-messenger-install-separator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption checked\" data-label=\"Chat Sounds\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Chat Sounds</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption\" data-label=\"Advanced Settings...\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/settings_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Advanced Settings...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOnlineItem\" data-label=\"Turn On Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn On Chat</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOfflineItem\" data-label=\"Turn Off Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn Off Chat</span></a></li></ul></div></div></div><select multiple=\"1\"><option value=\"\" disabled=\"1\"></option><option value=\"sound\" selected=\"1\">Chat Sounds</option><option value=\"advanced_settings\">Advanced Settings...</option><option value=\"online\">Turn On Chat</option><option value=\"offline\">Turn Off Chat</option></select></div></div></td><td><div></div></td><td><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e896d84f5f56a7323d155a78f7f59a073aabbee70(event) {\\u000a    Chat.toggleSidebar();\\u000a};\"), (\"s40cde328520d54a3af91e3baeccea43d236a716c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e896d84f5f56a7323d155a78f7f59a073aabbee70(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s40cde328520d54a3af91e3baeccea43d236a716c_0\"), (s40cde328520d54a3af91e3baeccea43d236a716c_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((JSBNG_Record.get)(Chat, (\"toggleSidebar\")))[(\"toggleSidebar\")])();\n    };\n    var s40cde328520d54a3af91e3baeccea43d236a716c_0_instance;\n    ((s40cde328520d54a3af91e3baeccea43d236a716c_0_instance) = ((JSBNG_Record.eventInstance)((\"s40cde328520d54a3af91e3baeccea43d236a716c_0\"))));\n    ((JSBNG_Record.markFunction)((e896d84f5f56a7323d155a78f7f59a073aabbee70)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a data-hover=\"tooltip\" aria-label=\"Hide sidebar\" data-tooltip-alignh=\"right\" class=\"toggle button\" href=\"#\" onclick=\"return e896d84f5f56a7323d155a78f7f59a073aabbee70.call(this, event);\" role=\"button\"></a></td></tr></tbody></table></div> ";
// undefined
o66 = null;
// 6360
o65.parentNode = o16;
// 6362
f81632121_521.returns.push(o65);
// undefined
o65 = null;
// 6363
// 6364
o64.getAttribute = f81632121_506;
// 6365
f81632121_506.returns.push("pagelet_sidebar");
// 6394
o65 = {};
// 6395
f81632121_476.returns.push(o65);
// 6396
// 6397
// 6398
o65.getElementsByTagName = f81632121_502;
// 6399
o66 = {};
// 6400
f81632121_502.returns.push(o66);
// 6401
o66.length = 0;
// undefined
o66 = null;
// 6403
o66 = {};
// 6404
o65.childNodes = o66;
// undefined
o65 = null;
// 6405
o66.nodeType = void 0;
// 6406
o66.getAttributeNode = void 0;
// 6407
o66.getElementsByTagName = void 0;
// 6408
o66.childNodes = void 0;
// undefined
o66 = null;
// 6412
o65 = {};
// 6413
f81632121_476.returns.push(o65);
// 6414
// 6415
// 6416
o65.getElementsByTagName = f81632121_502;
// 6417
o66 = {};
// 6418
f81632121_502.returns.push(o66);
// 6419
o66.length = 0;
// undefined
o66 = null;
// 6421
o66 = {};
// 6422
o65.childNodes = o66;
// undefined
o65 = null;
// 6423
o66.nodeType = void 0;
// 6424
o66.getAttributeNode = void 0;
// 6425
o66.getElementsByTagName = void 0;
// 6426
o66.childNodes = void 0;
// undefined
o66 = null;
// 6430
o65 = {};
// 6431
f81632121_476.returns.push(o65);
// 6432
// 6433
// 6434
o65.getElementsByTagName = f81632121_502;
// 6435
o66 = {};
// 6436
f81632121_502.returns.push(o66);
// 6437
o66.length = 0;
// undefined
o66 = null;
// 6439
o66 = {};
// 6440
o65.childNodes = o66;
// undefined
o65 = null;
// 6441
o66.nodeType = void 0;
// 6442
o66.getAttributeNode = void 0;
// 6443
o66.getElementsByTagName = void 0;
// 6444
o66.childNodes = void 0;
// undefined
o66 = null;
// 6463
o65 = {};
// 6464
f81632121_508.returns.push(o65);
// 6465
o65.getElementsByTagName = f81632121_502;
// 6467
o65.querySelectorAll = f81632121_504;
// 6468
o66 = {};
// 6469
f81632121_504.returns.push(o66);
// 6470
o66.length = 1;
// 6471
o67 = {};
// 6472
o66["0"] = o67;
// undefined
o66 = null;
// 6473
o67.getElementsByTagName = f81632121_502;
// 6475
o67.querySelectorAll = f81632121_504;
// 6476
o66 = {};
// 6477
f81632121_504.returns.push(o66);
// 6478
o66.length = 1;
// 6479
o68 = {};
// 6480
o66["0"] = o68;
// undefined
o66 = null;
// 6481
o68.getElementsByTagName = f81632121_502;
// 6483
o68.querySelectorAll = f81632121_504;
// 6484
o66 = {};
// 6485
f81632121_504.returns.push(o66);
// 6486
o66.length = 1;
// 6487
o71 = {};
// 6488
o66["0"] = o71;
// undefined
o66 = null;
// 6492
o66 = {};
// 6493
f81632121_504.returns.push(o66);
// 6494
o66.length = 1;
// 6495
o72 = {};
// 6496
o66["0"] = o72;
// undefined
o66 = null;
// 6497
o72.getElementsByTagName = f81632121_502;
// 6499
o72.querySelectorAll = f81632121_504;
// 6500
o66 = {};
// 6501
f81632121_504.returns.push(o66);
// 6502
o66.length = 1;
// 6503
o73 = {};
// 6504
o66["0"] = o73;
// undefined
o66 = null;
// 6505
f81632121_12.returns.push(23);
// 6506
o67.nodeName = "DIV";
// 6507
o67.__FB_TOKEN = void 0;
// 6508
// 6509
o67.getAttribute = f81632121_506;
// 6510
o67.hasAttribute = f81632121_507;
// 6512
f81632121_507.returns.push(false);
// 6513
o67.JSBNG__addEventListener = f81632121_468;
// 6515
f81632121_468.returns.push(undefined);
// 6516
o67.JSBNG__onJSBNG__scroll = void 0;
// 6518
o65.nodeName = "DIV";
// 6519
o65.__FB_TOKEN = void 0;
// 6520
// 6521
o65.getAttribute = f81632121_506;
// 6522
o65.hasAttribute = f81632121_507;
// 6524
f81632121_507.returns.push(false);
// 6525
o65.JSBNG__addEventListener = f81632121_468;
// 6527
f81632121_468.returns.push(undefined);
// 6528
o65.JSBNG__onmousemove = null;
// 6530
o72.nodeName = "DIV";
// 6531
o72.__FB_TOKEN = void 0;
// 6532
// 6533
o72.getAttribute = f81632121_506;
// 6534
o72.hasAttribute = f81632121_507;
// 6536
f81632121_507.returns.push(false);
// 6537
o72.JSBNG__addEventListener = f81632121_468;
// 6539
f81632121_468.returns.push(undefined);
// 6540
o72.JSBNG__onclick = null;
// 6545
f81632121_468.returns.push(undefined);
// 6546
o65.JSBNG__onmouseover = null;
// 6551
f81632121_468.returns.push(undefined);
// 6552
o65.JSBNG__onmouseout = null;
// 6557
f81632121_468.returns.push(undefined);
// 6558
o65.JSBNG__onfocusin = void 0;
// 6563
f81632121_468.returns.push(undefined);
// 6564
o65.JSBNG__onfocusout = void 0;
// 6569
f81632121_468.returns.push(undefined);
// 6570
o65.JSBNG__onmousedown = null;
// 6572
o73.nodeName = "DIV";
// 6573
o73.__FB_TOKEN = void 0;
// 6574
// 6575
o73.getAttribute = f81632121_506;
// 6576
o73.hasAttribute = f81632121_507;
// 6578
f81632121_507.returns.push(false);
// 6579
o73.JSBNG__addEventListener = f81632121_468;
// 6581
f81632121_468.returns.push(undefined);
// 6582
o73.JSBNG__onmousedown = null;
// 6584
o66 = {};
// 6585
o65.classList = o66;
// 6587
o66.add = f81632121_602;
// 6588
f81632121_602.returns.push(undefined);
// 6598
f81632121_467.returns.push(1374851215631);
// 6599
o74 = {};
// 6601
o74._needsGripper = f81632121_1110;
// 6602
f81632121_1156 = function() { return f81632121_1156.returns[f81632121_1156.inst++]; };
f81632121_1156.returns = [];
f81632121_1156.inst = 0;
// 6603
o74._throttledComputeHeights = f81632121_1156;
// 6605
f81632121_467.returns.push(1374851215632);
// 6606
o65.clientHeight = 0;
// 6607
o71.offsetHeight = 0;
// 6608
o72.offsetHeight = 0;
// undefined
o72 = null;
// 6609
f81632121_12.returns.push(24);
// 6610
f81632121_1156.returns.push(undefined);
// 6611
o74._gripperHeight = NaN;
// 6612
o74._trackHeight = 0;
// 6613
f81632121_1110.returns.push(false);
// 6614
f81632121_1157 = function() { return f81632121_1157.returns[f81632121_1157.inst++]; };
f81632121_1157.returns = [];
f81632121_1157.inst = 0;
// 6615
o74._throttledShowGripperAndShadows = f81632121_1157;
// 6617
f81632121_467.returns.push(1374851215639);
// 6619
f81632121_467.returns.push(1374851215640);
// 6620
o72 = {};
// 6621
o73.classList = o72;
// undefined
o73 = null;
// 6623
o72.add = f81632121_602;
// undefined
o72 = null;
// 6624
f81632121_602.returns.push(undefined);
// 6625
o67.scrollTop = 0;
// 6628
o66.remove = f81632121_1114;
// 6629
f81632121_1114.returns.push(undefined);
// 6634
f81632121_1114.returns.push(undefined);
// 6635
f81632121_12.returns.push(25);
// 6636
f81632121_1157.returns.push(undefined);
// 6637
o72 = {};
// undefined
o72 = null;
// 6638
// 6639
// undefined
o85 = null;
// 6645
f81632121_467.returns.push(1374851215713);
// 6647
f81632121_467.returns.push(1374851215713);
// 6654
f81632121_467.returns.push(1374851215736);
// 6656
f81632121_467.returns.push(1374851215737);
// 6663
f81632121_467.returns.push(1374851215739);
// 6665
f81632121_467.returns.push(1374851215739);
// 6672
f81632121_467.returns.push(1374851215744);
// 6674
f81632121_467.returns.push(1374851215744);
// 6681
f81632121_467.returns.push(1374851215749);
// 6683
f81632121_467.returns.push(1374851215749);
// 6690
f81632121_467.returns.push(1374851215750);
// 6692
f81632121_467.returns.push(1374851215750);
// 6699
f81632121_467.returns.push(1374851215751);
// 6701
f81632121_467.returns.push(1374851215751);
// 6708
f81632121_467.returns.push(1374851215760);
// 6710
f81632121_467.returns.push(1374851215761);
// 6716
f81632121_467.returns.push(1374851215761);
// 6718
f81632121_467.returns.push(1374851215761);
// 6720
o72 = {};
// 6722
o73 = {};
// undefined
o73 = null;
// 6723
// 6724
// undefined
o84 = null;
// 6727
f81632121_467.returns.push(1374851215773);
// 6730
f81632121_467.returns.push(1374851215774);
// 6732
o73 = {};
// 6733
f81632121_508.returns.push(o73);
// 6735
o75 = {};
// 6736
f81632121_508.returns.push(o75);
// 6737
o77 = {};
// 6738
o75.firstChild = o77;
// 6740
o77.nodeType = 8;
// 6742
o77.nodeValue = " <li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"tl_unit_380562705353186_recent\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer\" id=\"u_0_2i\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851148&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;TimelineAboutReportUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" role=\"complementary\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/info\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/info\">About</a></div></div></div><div class=\"timelineReportContent timelineNoSubheaderReport\"><div class=\"timelineUnitContainer -cx-PRIVATE-fbTimelineAboutUnit__root ogProfileLastUnit\" id=\"timeline_about_unit\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851148&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;TimelineAboutUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div><ul><li data-token=\"1\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2m\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/3LFVMmKZeUX.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Works at <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/PurdueUniversity?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=100526673914\">Purdue University</a></li><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__subtitle\">September 2008 to present</li></ul></div></div></div></li><li data-token=\"2\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2n\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/wKvDSXpnqkB.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Studies Computer Science at <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/PurdueUniversity?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=100526673914\">Purdue University</a></li><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__subtitle\">Past: <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-State-University/113512491992878\" data-hovercard=\"/ajax/hovercard/page.php?id=113512491992878\">Portland State University</a> and <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Milwaukie-High-School/109486142404101\" data-hovercard=\"/ajax/hovercard/page.php?id=109486142404101\">Milwaukie High School</a></li></ul></div></div></div></li><li data-token=\"3\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2o\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/jg7lQrpjdKk.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-fbTimelineAboutUnit__nosubtitle -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Lives in <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/West-Lafayette-Indiana/112305682116972?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=112305682116972\">West Lafayette, Indiana</a></li></ul></div></div></div></li><li data-token=\"4\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2p\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/kBTlO7fdcY0.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-fbTimelineAboutUnit__nosubtitle -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">From <a class=\"profileLink\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-Oregon/112548152092705?ref=br_rs\" data-hovercard=\"/ajax/hovercard/page.php?id=112548152092705\">Portland, Oregon</a></li></ul></div></div></div></li><li data-token=\"6\" class=\"-cx-PRIVATE-fbTimelineAboutUnit__rowcontainer\" id=\"u_0_2q\"><div class=\"-cx-PRIVATE-fbTimelineAboutUnit__row\"><div class=\"clearfix\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PUBLIC-fbTimelineAboutUnit__rowicon -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat -cx-PRIVATE-uiSquareImage__size16 img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/kz0_p5XcuSq.png\" alt=\"\" width=\"16\" height=\"16\" /><div class=\"-cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><ul class=\"uiList -cx-PRIVATE-fbTimelineAboutUnit__summary -cx-PRIVATE-fbTimelineAboutUnit__nosubtitle -cx-PRIVATE-uiList__vert\"><li class=\"-cx-PRIVATE-fbTimelineAboutUnit__title\">Followed by <a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/followers\">10 people</a></li></ul></div></div></div></li></ul></div></div></div></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2f\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer -cx-PRIVATE-fbTimelineAppSectionEgo__photos\" id=\"u_0_2j\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851148&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;2305272732&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\">Photos</a> · <span class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/photos\"><span class=\"fwn fcg\">242</span></a></span></div></div></div><div id=\"pagelet_timeline_app_collection_report_5\" class=\"-cx-PRIVATE-fbTimelineAppSectionEgo__collectioncontent\"><div data-referrer=\"photos_ego\"><table class=\"uiGrid -cx-PRIVATE-fbTimelinePhotosEgo__root -cx-PRIVATE-fbTimelineAppSectionEgo__photogrid\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-prn2%2F1069167_10200453104264236_1772112196_n.jpg&amp;size=652%2C800&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"-cx-PRIVATE-fbCroppedImage__container\" style=\"width:103px;height:103px;\"><img class=\"-cx-PRIVATE-fbCroppedImage__image img\" src=\"http://jsbngssl.fbcdn-photos-h-a.akamaihd.net/hphotos-ak-prn2/s168x128/1069167_10200453104264236_1772112196_a.jpg\" style=\"left:0px; top:0px;\" alt=\"Dammit Steam sale...\" width=\"104\" height=\"128\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268473688587&amp;set=a.1468918877039.2062262.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-b-a.akamaihd.net%2Fhphotos-ak-frc3%2F993004_10200268473688587_517108607_n.jpg&amp;size=640%2C640&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-photos-b-a.akamaihd.net/hphotos-ak-frc3/p110x80/993004_10200268473688587_517108607_a.jpg\" alt=\"Gregor Richards&#039;s photo.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=10200268472248551&amp;set=a.3353777797334.2140697.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-a-iad.xx.fbcdn.net%2Fhphotos-ash3%2F1017486_10200268472248551_842609840_n.jpg&amp;size=851%2C315&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.sphotos-a-iad.xx.fbcdn.net/hphotos-ash3/s280x280/1017486_10200268472248551_842609840_n.jpg\" style=\"left:-88px;\" alt=\"Gregor Richards&#039;s photo.\" width=\"280\" height=\"103\" /></div></a></td></tr><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4986916864790&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4986916864790&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F913679_4986916864790_91703778_o.jpg&amp;smallsrc=https%3A%2F%2Fsphotos-b-iad.xx.fbcdn.net%2Fhphotos-prn2%2F178992_4986916864790_91703778_n.jpg&amp;size=2048%2C1536&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.sphotos-b-iad.xx.fbcdn.net/hphotos-prn2/p118x118/178992_4986916864790_91703778_n.jpg\" alt=\"Today I learned that Dr. Gorman is actually another alternate identity for Clark Kent.\" width=\"138\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897864518537&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897864518537&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-c-a.akamaihd.net%2Fhphotos-ak-frc1%2F422167_4897864518537_1503459754_n.jpg&amp;size=538%2C404&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc1/p118x118/422167_4897864518537_1503459754_n.jpg\" style=\"left:-17px;\" alt=\"No parking gais. For realsies. They&#039;ll tow your boat.\" width=\"138\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897839437910&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4897839437910&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F920971_4897839437910_1063615079_o.jpg&amp;smallsrc=https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net%2Fhphotos-ak-frc1%2F644616_4897839437910_1063615079_n.jpg&amp;size=2048%2C473&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-frc1/s480x480/644616_4897839437910_1063615079_n.jpg\" style=\"left:-173px;\" alt=\"So yeah, there&#039;s a LITTLE bit of flooding &#039;round these parts.\" width=\"450\" height=\"103\" /></div></a></td></tr><tr><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4875948970662&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4875948970662&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Fsphotos-b-iad.xx.fbcdn.net%2Fhphotos-ash3%2F150431_4875948970662_1470457029_n.jpg&amp;size=944%2C834&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"-cx-PRIVATE-fbCroppedImage__container\" style=\"width:103px;height:103px;\"><img class=\"-cx-PRIVATE-fbCroppedImage__image img\" src=\"http://jsbngssl.photos-b-iad.xx.fbcdn.net/hphotos-ash3/p118x90/150431_4875948970662_1470457029_a.jpg\" style=\"left:-7px; top:0px;\" alt=\"Anyone who can spot the delightful (and delicious!) irony in this photo gets ten Internet points.\" width=\"118\" height=\"104\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4691723285135&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4691723285135&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-f-a.akamaihd.net%2Fhphotos-ak-ash3%2F577358_4691723285135_528345851_n.jpg&amp;size=600%2C600&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.fbcdn-photos-f-a.akamaihd.net/hphotos-ak-ash3/p110x80/577358_4691723285135_528345851_a.jpg\" alt=\"I, for one, blame my parents.\" width=\"103\" height=\"103\" /></div></a></td><td><a href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4441724315317&amp;set=a.1138433375108.2021456.1055580469&amp;type=1\" rel=\"theater\" ajaxify=\"http://jsbngssl.www.facebook.com/photo.php?fbid=4441724315317&amp;set=a.1138433375108.2021456.1055580469&amp;type=1&amp;src=https%3A%2F%2Ffbcdn-sphotos-g-a.akamaihd.net%2Fhphotos-ak-prn1%2F793914_4441724315317_424104454_o.jpg&amp;smallsrc=https%3A%2F%2Fsphotos-a-iad.xx.fbcdn.net%2Fhphotos-prn1%2F74137_4441724315317_424104454_n.jpg&amp;size=1024%2C1024&amp;source=8\" data-ft=\"&#123;&quot;tn&quot;:&quot;E&quot;&#125;\"><div class=\"uiScaledImageContainer\" style=\"width:103px;height:103px;\"><img class=\"scaledImageFitWidth img\" src=\"http://jsbngssl.photos-a-iad.xx.fbcdn.net/hphotos-prn1/p110x80/74137_4441724315317_424104454_a.jpg\" alt=\"Bought myself some nostalgia in the form of a watch.\" width=\"103\" height=\"103\" /></div></a></td></tr></tbody></table></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2g\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer -cx-PRIVATE-fbTimelineAppSectionEgo__places\" id=\"u_0_2k\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851148&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;302324425790&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/map\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/map\">Places</a></div></div></div><div id=\"pagelet_timeline_app_collection_report_17\" class=\"-cx-PRIVATE-fbTimelineAppSectionEgo__collectioncontent\"><div class=\"-cx-PRIVATE-ogAppReport__listview\"><ul class=\"uiList -cx-PRIVATE-uiList__vert -cx-PRIVATE-uiList__mediumborder\"><li><div class=\"clearfix\"><a class=\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__largeimage lfloat\" href=\"http://jsbngssl.www.facebook.com/pages/Genova-Italy/106073859432101?ref=stream\" data-ft=\"&#123;&quot;tn&quot;:&quot;k&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/page.php?id=106073859432101\"><div class=\"uiScaledImageContainer -cx-PUBLIC-fbTimelineCollectionGrid__mapimage\"><img class=\"img\" src=\"http://jsbngssl.fbexternal-a.akamaihd.net/safe_image.php?d=AQAkJs97ODg-aCVh&amp;w=180&amp;h=540&amp;url=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fa%2Fa7%2FCollage_Genova.jpg%2F720px-Collage_Genova.jpg&amp;fallback=hub_city&amp;prefix=d\" alt=\"\" width=\"86\" height=\"64\" itemprop=\"photo\" /></div></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-ogAppReport__caption\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\" style=\"height:64px\"></div><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\"><div><a href=\"http://jsbngssl.www.facebook.com/pages/Genova-Italy/106073859432101?ref=stream\" data-ft=\"&#123;&quot;tn&quot;:&quot;k&quot;&#125;\" data-hovercard=\"/ajax/hovercard/page.php?id=106073859432101\">Genova, Italy</a><span class=\"fcg\" data-ft=\"&#123;&quot;tn&quot;:&quot;l&quot;&#125;\"> — with <a href=\"http://jsbngssl.www.facebook.com/johan.ostlund.777?viewer_id=100006118350059\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\" data-hovercard=\"/ajax/hovercard/user.php?id=735417817&amp;extragetparams=%7B%22directed_target_id%22%3Anull%2C%22viewer_id%22%3A100006118350059%7D\">Johan Östlund</a> and <a href=\"http://jsbngssl.www.facebook.com/supercooldave?viewer_id=100006118350059\" data-ft=\"&#123;&quot;tn&quot;:&quot;\\\\u0040&quot;&#125;\" data-hovercard=\"/ajax/hovercard/user.php?id=702266706&amp;extragetparams=%7B%22directed_target_id%22%3Anull%2C%22viewer_id%22%3A100006118350059%7D\">Dave Clarke</a>.</span></div><a class=\"uiLinkSubtle\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=1158894366620&amp;set=a.1158828204966.2024661.1055580469&amp;type=1\"><abbr title=\"Sunday, July 12, 2009 at 12:45pm\" data-utime=\"1247427913\" class=\"timestamp\">over a year ago</abbr></a></div></div></div></div></li><li><div class=\"clearfix\"><a class=\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__largeimage lfloat\" href=\"http://jsbngssl.www.facebook.com/pages/Portland-Oregon/112548152092705?ref=stream\" data-ft=\"&#123;&quot;tn&quot;:&quot;k&quot;&#125;\" tabindex=\"-1\" aria-hidden=\"true\" data-hovercard=\"/ajax/hovercard/page.php?id=112548152092705\"><div class=\"uiScaledImageContainer -cx-PUBLIC-fbTimelineCollectionGrid__mapimage\"><img class=\"img\" src=\"http://jsbngssl.fbexternal-a.akamaihd.net/safe_image.php?d=AQBTwYBBb6Mi-jh0&amp;w=180&amp;h=540&amp;url=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2F2%2F29%2FPortland_Skyline-02.jpg%2F720px-Portland_Skyline-02.jpg&amp;fallback=hub_city&amp;prefix=d\" alt=\"\" width=\"96\" height=\"64\" itemprop=\"photo\" /></div></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-ogAppReport__caption\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\" style=\"height:64px\"></div><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\"><div><a href=\"http://jsbngssl.www.facebook.com/pages/Portland-Oregon/112548152092705?ref=stream\" data-ft=\"&#123;&quot;tn&quot;:&quot;k&quot;&#125;\" data-hovercard=\"/ajax/hovercard/page.php?id=112548152092705\">Portland, Oregon</a><span class=\"fcg\" data-ft=\"&#123;&quot;tn&quot;:&quot;l&quot;&#125;\"> — with <a href=\"http://jsbngssl.www.facebook.com/michael.a.goss?viewer_id=100006118350059\" data-ft=\"&#123;&quot;tn&quot;:&quot;;&quot;&#125;\" data-hovercard=\"/ajax/hovercard/user.php?id=10715287&amp;extragetparams=%7B%22directed_target_id%22%3Anull%2C%22viewer_id%22%3A100006118350059%7D\">Michael A Goss</a>.</span></div><a class=\"uiLinkSubtle\" href=\"http://jsbngssl.www.facebook.com/photo.php?fbid=544659356228&amp;set=a.544659151638.2212647.10715287&amp;type=1\"><abbr title=\"Monday, November 26, 2007 at 9:38pm\" data-utime=\"1196141914\" class=\"timestamp\">over a year ago</abbr></a></div></div></div></div></li></ul></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"fbTimelineUnit fbTimelineTwoColumn clearfix\" data-side=\"r\" data-fixed=\"1\" data-size=\"1\" id=\"u_0_2h\"><div class=\"topBorder\"></div><div class=\"timelineReportContainer\" id=\"u_0_2l\" data-gt=\"&#123;&quot;eventtime&quot;:&quot;1374851148&quot;,&quot;viewerid&quot;:&quot;100006118350059&quot;,&quot;profileownerid&quot;:&quot;1055580469&quot;,&quot;unitimpressionid&quot;:&quot;b1113c18&quot;,&quot;contentid&quot;:&quot;&quot;,&quot;timeline_unit_type&quot;:&quot;AppSectionEgoUnit&quot;,&quot;timewindowsize&quot;:&quot;3&quot;,&quot;query_type&quot;:&quot;39&quot;,&quot;contextwindowstart&quot;:&quot;0&quot;,&quot;contextwindowend&quot;:&quot;1375340399&quot;,&quot;timeline_og_unit_click&quot;:&quot;1&quot;,&quot;unit_id&quot;:&quot;288381481237582&quot;,&quot;event_source&quot;:&quot;38&quot;,&quot;app_id&quot;:&quot;2361831622&quot;,&quot;action_type_id&quot;:&quot;&quot;&#125;\" data-time=\"0\"><div class=\"\"><div role=\"article\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__root\"><div class=\"-cx-PRIVATE-fbTimelineLightReportHeader__titlecontainer\" data-ft=\"&#123;&quot;tn&quot;:&quot;C&quot;&#125;\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__backgroundanchor\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\"></a><div class=\"fsm fwn fcg\"><a class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text -cx-PRIVATE-fbTimelineLightReportHeader__title\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\">Groups</a> · <span class=\"-cx-PRIVATE-fbTimelineLightReportHeader__text\"><a href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/groups\"><span class=\"fwn fcg\">1</span></a></span></div></div></div><div id=\"pagelet_timeline_app_collection_report_66\" class=\"-cx-PRIVATE-fbTimelineAppSectionEgo__collectioncontent\"><div class=\"-cx-PRIVATE-ogAppReport__listview\"><ul class=\"uiList -cx-PRIVATE-uiList__vert -cx-PRIVATE-uiList__mediumborder\"><li><div class=\"clearfix\" data-ft=\"&#123;&quot;tn&quot;:&quot;l&quot;&#125;\"><div class=\"listMemberFacepileLargeCollection listMemberFacepile -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__largeimage lfloat\"><img class=\"firstImg img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /><img class=\"img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /><img class=\"img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /><img class=\"lastImg img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif\" alt=\"\" /></div><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-ogAppReport__caption\"><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\" style=\"height:64px\"></div><div class=\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle\"><a href=\"/groups/26418081870/\" data-hovercard=\"/ajax/hovercard/group.php?id=26418081870\">Purdue Extreme Croquet</a><div><div class=\"fcg\">1 member</div></div><span class=\"-cx-PRIVATE-fbTimelineGroupsCollection__desc\">Enjoy the civilized and gentlemanly...</span></div></div></div></div></li></ul></div></div></div></div></div><i class=\"spinePointer\"></i><div class=\"bottomBorder\"></div></li><li class=\"-cx-PUBLIC-timelineOneColMin__endmarker hidden_elem\" data-endmarker=\"recent\" data-pageindex=\"0\"></li> ";
// undefined
o77 = null;
// 6743
o75.parentNode = o16;
// 6745
f81632121_521.returns.push(o75);
// undefined
o75 = null;
// 6747
o75 = {};
// 6748
f81632121_476.returns.push(o75);
// 6749
// 6751
o77 = {};
// 6752
f81632121_474.returns.push(o77);
// 6753
o78 = {};
// undefined
fo81632121_1165_firstChild = function() { return fo81632121_1165_firstChild.returns[fo81632121_1165_firstChild.inst++]; };
fo81632121_1165_firstChild.returns = [];
fo81632121_1165_firstChild.inst = 0;
defineGetter(o75, "firstChild", fo81632121_1165_firstChild, undefined);
// undefined
o75 = null;
// undefined
fo81632121_1165_firstChild.returns.push(o78);
// 6755
o77.appendChild = f81632121_478;
// undefined
fo81632121_1165_firstChild.returns.push(o78);
// 6757
f81632121_478.returns.push(o78);
// 6758
o75 = {};
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// 6762
f81632121_478.returns.push(o75);
// undefined
o75 = null;
// 6763
o75 = {};
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// 6767
f81632121_478.returns.push(o75);
// undefined
o75 = null;
// 6768
o75 = {};
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// 6772
f81632121_478.returns.push(o75);
// undefined
o75 = null;
// 6773
o75 = {};
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// undefined
fo81632121_1165_firstChild.returns.push(o75);
// 6777
f81632121_478.returns.push(o75);
// undefined
fo81632121_1165_firstChild.returns.push(null);
// 6779
o73.appendChild = f81632121_478;
// 6780
f81632121_478.returns.push(o77);
// undefined
o77 = null;
// 6781
o73.getAttribute = f81632121_506;
// 6782
f81632121_506.returns.push("pagelet_timeline_recent_ocm");
// 6787
f81632121_467.returns.push(1374851215850);
// 6790
f81632121_467.returns.push(1374851215850);
// 6793
f81632121_467.returns.push(1374851215851);
// 6796
f81632121_467.returns.push(1374851215851);
// 6799
f81632121_467.returns.push(1374851215851);
// 6801
o77 = {};
// 6802
f81632121_508.returns.push(o77);
// 6804
o79 = {};
// 6805
f81632121_508.returns.push(o79);
// 6806
o83 = {};
// 6807
o79.firstChild = o83;
// 6809
o83.nodeType = 8;
// 6811
o83.nodeValue = " <div class=\"-cx-PRIVATE-fbTimelineStyleAds__root -cx-PRIVATE-fbTimelineStyleAds__vertical -cx-PRIVATE-fbTimelineStyleAds__offscreen\" id=\"u_0_2s\" data-referrer=\"u_0_2s\"></div> ";
// undefined
o83 = null;
// 6812
o79.parentNode = o16;
// 6814
f81632121_521.returns.push(o79);
// undefined
o79 = null;
// 6815
// 6816
o77.getAttribute = f81632121_506;
// 6817
f81632121_506.returns.push("pagelet_side_ads");
// 6821
f81632121_467.returns.push(1374851215859);
// 6826
o79 = {};
// 6827
f81632121_474.returns.push(o79);
// 6829
f81632121_478.returns.push(o79);
// undefined
o79 = null;
// 6832
f81632121_467.returns.push(1374851215860);
// 6836
o79 = {};
// 6837
f81632121_474.returns.push(o79);
// 6839
f81632121_467.returns.push(1374851215861);
// 6842
o83 = {};
// 6843
f81632121_476.returns.push(o83);
// 6844
// 6845
// 6846
// 6847
// 6848
// 6849
o79.appendChild = f81632121_478;
// 6850
f81632121_478.returns.push(o83);
// 6852
f81632121_467.returns.push(1374851215865);
// 6855
o84 = {};
// 6856
f81632121_476.returns.push(o84);
// 6857
// 6858
// 6859
// 6860
// 6861
// 6863
f81632121_478.returns.push(o84);
// 6865
f81632121_478.returns.push(o79);
// undefined
o79 = null;
// 6868
f81632121_467.returns.push(1374851215869);
// 6871
f81632121_467.returns.push(1374851215869);
// 6874
f81632121_467.returns.push(1374851215869);
// 6876
o79 = {};
// 6877
f81632121_508.returns.push(o79);
// 6879
o85 = {};
// 6880
f81632121_508.returns.push(o85);
// 6881
o86 = {};
// 6882
o85.firstChild = o86;
// 6884
o86.nodeType = 8;
// 6886
o86.nodeValue = " <div id=\"fbRequestsJewelLoading\"><div id=\"fbRequestsJewelLoadingContent\"><div class=\"uiHeader uiHeaderBottomBorder jewelHeader\"><div class=\"clearfix uiHeaderTop\"><div class=\"rfloat\"><h3 class=\"accessible_elem\">Friend Requests</h3><div class=\"uiHeaderActions fsm fwn fcg\"><a href=\"http://jsbngssl.www.facebook.com/?sk=ff\" accesskey=\"3\">Find Friends</a> · <a ajaxify=\"/ajax/settings/granular_privacy/can_friend.php\" rel=\"dialog\" href=\"#\" role=\"button\">Settings</a></div></div><div><h3 class=\"uiHeaderTitle\" aria-hidden=\"true\">Friend Requests</h3></div></div></div><img class=\"jewelLoading img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"jewelFooter\"><a class=\"seeMore\" href=\"/friends/requests/\"><span>See All</span></a></div></div> ";
// undefined
o86 = null;
// 6887
o85.parentNode = o16;
// 6889
f81632121_521.returns.push(o85);
// undefined
o85 = null;
// 6890
// 6891
o79.getAttribute = f81632121_506;
// 6892
f81632121_506.returns.push(null);
// 6893
o79.setAttribute = f81632121_575;
// undefined
o79 = null;
// 6894
f81632121_575.returns.push(undefined);
// 6896
f81632121_467.returns.push(1374851215870);
// 6900
o79 = {};
// 6901
f81632121_474.returns.push(o79);
// 6903
f81632121_478.returns.push(o79);
// undefined
o79 = null;
// 6906
f81632121_467.returns.push(1374851215871);
// 6909
f81632121_467.returns.push(1374851215871);
// 6912
f81632121_467.returns.push(1374851215871);
// 6914
o79 = {};
// 6915
f81632121_508.returns.push(o79);
// 6917
o85 = {};
// 6918
f81632121_508.returns.push(o85);
// 6919
o86 = {};
// 6920
o85.firstChild = o86;
// 6922
o86.nodeType = 8;
// 6924
o86.nodeValue = " <div class=\"fbTimelineStickyHeader fixed_elem fbTimelineStickyHeaderHidden\" aria-hidden=\"true\" id=\"u_0_3s\"><div class=\"stickyHeaderWrap clearfix\"><div class=\"back\"></div><div class=\"name\"><a class=\"profileThumb\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\"><img class=\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\" src=\"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/276274_1055580469_962040234_q.jpg\" alt=\"\" /></a><span class=\"uiButtonGroup fbStickyHeaderBreadcrumb uiButtonGroupOverlay\" id=\"u_0_3r\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><a class=\"nameButton uiButton uiButtonOverlay\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" role=\"button\"><span class=\"uiButtonText\">Gregor Richards</span></a></span><span class=\"uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock pageMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"pageMenuButton uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-label=\"Timeline\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Timeline</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox checked\" data-label=\"Timeline\"><a class=\"itemAnchor itemWithIcon\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\" aria-checked=\"true\"><i class=\"mrs itemIcon img sp_at8kd9 sx_c113b7\"></i><span class=\"itemLabel fsm\">Timeline</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox\" data-label=\"About\"><a class=\"itemAnchor itemWithIcon\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby/about\" aria-checked=\"false\"><i class=\"mrs itemIcon img sp_4p6kmz sx_fb2987\"></i><span class=\"itemLabel fsm\">About</span></a></li><li class=\"uiMenuSeparator separator hidden_elem\"></li></ul></div></div></div></div></span><span class=\"lastItem uiButtonGroupItem selectorItem\"><div class=\"uiSelector inlineBlock sectionMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Recent</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption checked\" data-label=\"Recent\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"0\" href=\"#\" aria-checked=\"true\" data-key=\"recent\"><span class=\"itemLabel fsm\">Recent</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2013\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2013\"><span class=\"itemLabel fsm\">2013</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2012\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2012\"><span class=\"itemLabel fsm\">2012</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2011\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2011\"><span class=\"itemLabel fsm\">2011</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2010\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2010\"><span class=\"itemLabel fsm\">2010</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2009\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2009\"><span class=\"itemLabel fsm\">2009</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"2008\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"year_2008\"><span class=\"itemLabel fsm\">2008</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption\" data-label=\"Born\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\" data-key=\"way_back\"><span class=\"itemLabel fsm\">Born</span></a></li></ul></div></div></div><select><option value=\"\"></option><option value=\"recent\" selected=\"1\">Recent</option><option value=\"year_2013\">2013</option><option value=\"year_2012\">2012</option><option value=\"year_2011\">2011</option><option value=\"year_2010\">2010</option><option value=\"year_2009\">2009</option><option value=\"year_2008\">2008</option><option value=\"way_back\">Born</option></select></div></span><span class=\"uiButtonGroupItem selectorItem hidden_elem\"><div class=\"uiSelector inlineBlock subsectionMenu uiSelectorNormal uiSelectorDynamicLabel\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiButton uiButtonOverlay\" href=\"#\" role=\"button\" aria-haspopup=\"1\" data-length=\"30\" rel=\"toggle\"><span class=\"uiButtonText\">Highlights</span></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption highlights checked\" data-label=\"Highlights\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Highlights</span></a></li><li class=\"uiMenuItem uiMenuItemRadio uiSelectorOption allStories\" data-label=\"All Stories\"><a class=\"itemAnchor\" role=\"menuitemradio\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">All Stories</span></a></li><li class=\"uiMenuSeparator separator hidden_elem\"></li></ul></div></div></div><select><option value=\"\"></option><option value=\"highlights\" selected=\"1\">Highlights</option><option value=\"allStories\">All Stories</option></select></div></span></span></div><div class=\"actions\"><span class=\"uiButtonGroup fbTimelineConnectButtonGroup uiButtonGroupOverlay\" id=\"u_0_3k\"><span class=\"firstItem uiButtonGroupItem buttonItem\"><div class=\"FriendButton\" id=\"u_0_3p\"><label class=\"FriendRequestAdd addButton uiButton uiButtonOverlay uiButtonLarge\" for=\"u_0_3q\"><i class=\"mrs img sp_at8kd9 sx_aad3a2\"></i><input value=\"Add Friend\" type=\"button\" id=\"u_0_3q\" /></label><a class=\"FriendRequestOutgoing enableFriendListFlyout outgoingButton enableFriendListFlyout hidden_elem uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" data-profileid=\"1055580469\" data-flloc=\"sticky_header\" data-cansuggestfriends=\"false\"><i class=\"mrs img sp_at8kd9 sx_aad3a2\"></i><span class=\"uiButtonText\">Friend Request Sent</span></a></div></span><span class=\"lastItem uiButtonGroupItem buttonItem\"><span class=\"-cx-PRIVATE-uiSwapButton__root -cx-PRIVATE-fbSubscribeButton__root\"><a class=\"uiButton uiButtonOverlay uiButtonLarge\" href=\"#\" role=\"button\" ajaxify=\"/ajax/follow/follow_profile.php?profile_id=1055580469&amp;location=1\" rel=\"async-post\" id=\"u_0_3l\"><i class=\"mrs img sp_at8kd9 sx_dedf3e\"></i><span class=\"uiButtonText\">Follow</span></a><label class=\"profileFollowButton -cx-PUBLIC-uiHoverButton__root -cx-PRIVATE-uiSwapButton__secondbutton hidden_elem uiButton uiButtonOverlay uiButtonLarge\" id=\"u_0_3m\" for=\"u_0_3o\"><i class=\"mrs img sp_at8kd9 sx_d4ea38\"></i><input value=\"Following\" aria-haspopup=\"1\" data-profileid=\"1055580469\" type=\"submit\" id=\"u_0_3o\" /></label></span></span></span></div></div></div> ";
// undefined
o86 = null;
// 6925
o85.parentNode = o16;
// 6927
f81632121_521.returns.push(o85);
// undefined
o85 = null;
// 6928
// 6929
o79.getAttribute = f81632121_506;
// undefined
o79 = null;
// 6930
f81632121_506.returns.push("timeline_sticky_header");
// 6934
o79 = {};
// 6935
f81632121_476.returns.push(o79);
// 6936
// 6937
// 6938
o79.getElementsByTagName = f81632121_502;
// 6939
o85 = {};
// 6940
f81632121_502.returns.push(o85);
// 6941
o85.length = 0;
// undefined
o85 = null;
// 6943
o85 = {};
// 6944
o79.childNodes = o85;
// undefined
o79 = null;
// 6945
o85.nodeType = void 0;
// 6946
o85.getAttributeNode = void 0;
// 6947
o85.getElementsByTagName = void 0;
// 6948
o85.childNodes = void 0;
// 6967
o85.__html = void 0;
// 6968
o85.mountComponentIntoNode = void 0;
// 6969
o85.classList = void 0;
// 6971
o85.className = void 0;
// 6973
// undefined
o85 = null;
// 6975
o79 = {};
// 6976
f81632121_476.returns.push(o79);
// 6977
o79.firstChild = null;
// 6979
o85 = {};
// 6980
f81632121_474.returns.push(o85);
// 6982
o79.appendChild = f81632121_478;
// 6983
f81632121_478.returns.push(o85);
// undefined
o85 = null;
// 6985
o85 = {};
// 6986
f81632121_476.returns.push(o85);
// 6987
// 6988
o85.firstChild = null;
// 6989
o79.__html = void 0;
// 6991
o86 = {};
// 6992
f81632121_474.returns.push(o86);
// 6994
o85.appendChild = f81632121_478;
// 6995
f81632121_478.returns.push(o86);
// undefined
o86 = null;
// 6997
o86 = {};
// 6998
f81632121_476.returns.push(o86);
// 6999
// 7000
o86.firstChild = null;
// 7001
o85.__html = void 0;
// undefined
o85 = null;
// 7003
o85 = {};
// 7004
f81632121_474.returns.push(o85);
// 7006
o86.appendChild = f81632121_478;
// 7007
f81632121_478.returns.push(o85);
// undefined
o85 = null;
// 7008
o85 = {};
// 7009
o86.classList = o85;
// 7011
o85.add = f81632121_602;
// undefined
o85 = null;
// 7012
f81632121_602.returns.push(undefined);
// 7013
o85 = {};
// 7014
o79.style = o85;
// undefined
o79 = null;
// 7015
// undefined
o85 = null;
// 7019
f81632121_602.returns.push(undefined);
// 7020
o86.__FB_TOKEN = void 0;
// 7021
// undefined
o86 = null;
// 7027
f81632121_467.returns.push(1374851215902);
// 7031
o79 = {};
// 7032
f81632121_474.returns.push(o79);
// 7034
f81632121_478.returns.push(o79);
// undefined
o79 = null;
// 7037
f81632121_467.returns.push(1374851215903);
// 7040
f81632121_467.returns.push(1374851215903);
// 7043
f81632121_467.returns.push(1374851215903);
// 7045
o79 = {};
// 7046
f81632121_508.returns.push(o79);
// 7048
o85 = {};
// 7049
f81632121_508.returns.push(o85);
// 7050
o86 = {};
// 7051
o85.firstChild = o86;
// 7053
o86.nodeType = 8;
// 7055
o86.nodeValue = " <div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_current\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">Earlier in 2013</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3u\"><span class=\"sectionLabel fwb\" data-year=\"2013\">Show 2013</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_last\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2012</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3v\"><span class=\"sectionLabel fwb\" data-year=\"2012\">Show 2012</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2011\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2011</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3w\"><span class=\"sectionLabel fwb\" data-year=\"2011\">Show 2011</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2010\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2010</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_40\"><span class=\"sectionLabel fwb\" data-year=\"2010\">Show 2010</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2009\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2009</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3z\"><span class=\"sectionLabel fwb\" data-year=\"2009\">Show 2009</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_year_2008\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">2008</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3x\"><span class=\"sectionLabel fwb\" data-year=\"2008\">Show 2008</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div><div class=\"fbTimelineTimePeriod fbTimelineTimePeriodUnexpanded\" id=\"pagelet_timeline_wayback\"><div class=\"fbTimelineSection fbTimelineCompactSection fbTimelineSectionTransparent\"><div class=\"fbTimelinePeriodPlaceholder\"><div class=\"mbm -cx-PRIVATE-fbTimelineOneColumnHeader__header sectionHeader\"><div class=\"uiHeader\"><div class=\"clearfix uiHeaderTop\"><div><h3 class=\"uiHeaderTitle\">Born</h3></div></div></div><div class=\"-cx-PRIVATE-fbTimelineOneColumnHeader__line\"></div></div><div class=\"loadingContainer\"><a class=\"mbm phm forceLoad\" href=\"#\" role=\"button\" id=\"u_0_3y\"><span class=\"sectionLabel fwb\" data-year=\"2007\">Show 2007</span></a></div></div></div><img class=\"ptl loadingIndicator img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div> ";
// undefined
o86 = null;
// 7056
o85.parentNode = o16;
// 7058
f81632121_521.returns.push(o85);
// undefined
o85 = null;
// 7060
o85 = {};
// 7061
f81632121_476.returns.push(o85);
// 7062
// 7064
o86 = {};
// 7065
f81632121_474.returns.push(o86);
// 7066
o87 = {};
// undefined
fo81632121_1201_firstChild = function() { return fo81632121_1201_firstChild.returns[fo81632121_1201_firstChild.inst++]; };
fo81632121_1201_firstChild.returns = [];
fo81632121_1201_firstChild.inst = 0;
defineGetter(o85, "firstChild", fo81632121_1201_firstChild, undefined);
// undefined
o85 = null;
// undefined
fo81632121_1201_firstChild.returns.push(o87);
// 7068
o86.appendChild = f81632121_478;
// undefined
fo81632121_1201_firstChild.returns.push(o87);
// 7070
f81632121_478.returns.push(o87);
// 7071
o85 = {};
// undefined
fo81632121_1201_firstChild.returns.push(o85);
// undefined
fo81632121_1201_firstChild.returns.push(o85);
// 7075
f81632121_478.returns.push(o85);
// 7076
o88 = {};
// undefined
fo81632121_1201_firstChild.returns.push(o88);
// undefined
fo81632121_1201_firstChild.returns.push(o88);
// 7080
f81632121_478.returns.push(o88);
// 7081
o89 = {};
// undefined
fo81632121_1201_firstChild.returns.push(o89);
// undefined
fo81632121_1201_firstChild.returns.push(o89);
// 7085
f81632121_478.returns.push(o89);
// 7086
o90 = {};
// undefined
fo81632121_1201_firstChild.returns.push(o90);
// undefined
fo81632121_1201_firstChild.returns.push(o90);
// 7090
f81632121_478.returns.push(o90);
// 7091
o91 = {};
// undefined
fo81632121_1201_firstChild.returns.push(o91);
// undefined
fo81632121_1201_firstChild.returns.push(o91);
// 7095
f81632121_478.returns.push(o91);
// 7096
o92 = {};
// undefined
fo81632121_1201_firstChild.returns.push(o92);
// undefined
fo81632121_1201_firstChild.returns.push(o92);
// 7100
f81632121_478.returns.push(o92);
// undefined
fo81632121_1201_firstChild.returns.push(null);
// 7102
o79.appendChild = f81632121_478;
// 7103
f81632121_478.returns.push(o86);
// undefined
o86 = null;
// 7104
o79.getAttribute = f81632121_506;
// 7105
f81632121_506.returns.push(null);
// 7106
o79.setAttribute = f81632121_575;
// undefined
o79 = null;
// 7107
f81632121_575.returns.push(undefined);
// 7143
f81632121_467.returns.push(1374851215925);
// 7147
o79 = {};
// 7148
f81632121_474.returns.push(o79);
// 7150
f81632121_478.returns.push(o79);
// undefined
o79 = null;
// 7153
f81632121_467.returns.push(1374851215926);
// 7156
f81632121_467.returns.push(1374851215926);
// 7159
f81632121_467.returns.push(1374851215926);
// 7161
o79 = {};
// 7162
f81632121_508.returns.push(o79);
// 7164
o86 = {};
// 7165
f81632121_508.returns.push(o86);
// 7166
o93 = {};
// 7167
o86.firstChild = o93;
// 7169
o93.nodeType = 8;
// 7171
o93.nodeValue = " <div class=\"fbTimelineSectionExpander fbTimelineHiddenPager stat_elem\" id=\"pagelet_timeline_recent_pager_1\"><div class=\"fbTimelineSectionExpandPager fbTimelineShowOlder\" data-gt=\"&#123;&quot;timeline_pager&quot;:&quot;1&quot;,&quot;profile_id&quot;:&quot;1055580469&quot;,&quot;page_index&quot;:&quot;1&quot;,&quot;query_type&quot;:&quot;39&quot;&#125;\" id=\"u_0_42\"><div class=\"clearfix uiMorePager stat_elem\"><a class=\"-cx-PUBLIC-timelineOneColMin__caret uiMorePagerSecondary rfloat\" href=\"#\" role=\"button\"></a><div><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e54abfe526a2ad0769e7f20c510b65512590a089f(event) {\\u000a    ((JSCC.get(\\\"jp1njVsiFS9h1xdp9Yi0\\\") && JSCC.get(\\\"jp1njVsiFS9h1xdp9Yi0\\\").getHandler()))();\\u000a    return false;\\u000a};\"), (\"sfa3079759067df9a19fd325724f561bebeabc7e5\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e54abfe526a2ad0769e7f20c510b65512590a089f(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sfa3079759067df9a19fd325724f561bebeabc7e5_0\"), (sfa3079759067df9a19fd325724f561bebeabc7e5_0_instance), (this), (arguments)))\n        };\n        (null);\n        (((((JSBNG_Record.get)(JSCC, (\"get\")))[(\"get\")])(\"jp1njVsiFS9h1xdp9Yi0\") && (((JSBNG_Record.get)((((JSBNG_Record.get)(JSCC, (\"get\")))[(\"get\")])(\"jp1njVsiFS9h1xdp9Yi0\"), (\"getHandler\")))[(\"getHandler\")])()))();\n        return false;\n    };\n    var sfa3079759067df9a19fd325724f561bebeabc7e5_0_instance;\n    ((sfa3079759067df9a19fd325724f561bebeabc7e5_0_instance) = ((JSBNG_Record.eventInstance)((\"sfa3079759067df9a19fd325724f561bebeabc7e5_0\"))));\n    ((JSBNG_Record.markFunction)((e54abfe526a2ad0769e7f20c510b65512590a089f)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"pam uiBoxLightblue uiMorePagerPrimary\" onclick=\"return e54abfe526a2ad0769e7f20c510b65512590a089f.call(this, event);\" href=\"#\" role=\"button\">See More Recent Stories</a><span class=\"uiMorePagerLoader pam uiBoxLightblue\"><img class=\"img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></span></div></div></div></div> ";
// undefined
o93 = null;
// 7172
o86.parentNode = o16;
// 7174
f81632121_521.returns.push(o86);
// undefined
o86 = null;
// 7175
// 7176
o79.getAttribute = f81632121_506;
// 7177
f81632121_506.returns.push(null);
// 7178
o79.setAttribute = f81632121_575;
// 7179
f81632121_575.returns.push(undefined);
// 7183
f81632121_467.returns.push(1374851215936);
// 7187
o86 = {};
// 7188
f81632121_474.returns.push(o86);
// 7190
f81632121_478.returns.push(o86);
// undefined
o86 = null;
// 7193
f81632121_467.returns.push(1374851215936);
// 7196
f81632121_467.returns.push(1374851215936);
// 7199
f81632121_467.returns.push(1374851215936);
// 7201
o86 = {};
// 7202
f81632121_508.returns.push(o86);
// 7204
o93 = {};
// 7205
f81632121_508.returns.push(o93);
// 7206
o94 = {};
// 7207
o93.firstChild = o94;
// 7209
o94.nodeType = 8;
// 7211
o94.nodeValue = " <ul class=\"fbTimelineScrubber hidden_elem\" role=\"navigation\" data-gt=\"&#123;&quot;timeline_scrubber&quot;:&quot;1&quot;,&quot;profile_id&quot;:&quot;1055580469&quot;&#125;\" id=\"u_0_44\"><li data-key=\"recent\" class=\"selected\"><a href=\"/LawlabeeTheWallaby/timeline\" rel=\"ignore\">Recent</a></li><li data-key=\"year_2013\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2013\"><a href=\"/LawlabeeTheWallaby/timeline/2013\" rel=\"ignore\" tabindex=\"-1\">2013</a><ul class=\"clearfix\"><li data-key=\"month_2013_1\"><a href=\"/LawlabeeTheWallaby/timeline/2013/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2012\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2012\"><a href=\"/LawlabeeTheWallaby/timeline/2012\" rel=\"ignore\" tabindex=\"-1\">2012</a><ul class=\"clearfix\"><li data-key=\"month_2012_12\"><a href=\"/LawlabeeTheWallaby/timeline/2012/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2012_11\"><a href=\"/LawlabeeTheWallaby/timeline/2012/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2012_10\"><a href=\"/LawlabeeTheWallaby/timeline/2012/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2012_9\"><a href=\"/LawlabeeTheWallaby/timeline/2012/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2012_8\"><a href=\"/LawlabeeTheWallaby/timeline/2012/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2012_7\"><a href=\"/LawlabeeTheWallaby/timeline/2012/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2012_6\"><a href=\"/LawlabeeTheWallaby/timeline/2012/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2012_5\"><a href=\"/LawlabeeTheWallaby/timeline/2012/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2012_4\"><a href=\"/LawlabeeTheWallaby/timeline/2012/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2012_3\"><a href=\"/LawlabeeTheWallaby/timeline/2012/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2012_2\"><a href=\"/LawlabeeTheWallaby/timeline/2012/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2012_1\"><a href=\"/LawlabeeTheWallaby/timeline/2012/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2011\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2011\"><a href=\"/LawlabeeTheWallaby/timeline/2011\" rel=\"ignore\" tabindex=\"-1\">2011</a><ul class=\"clearfix\"><li data-key=\"month_2011_12\"><a href=\"/LawlabeeTheWallaby/timeline/2011/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2011_11\"><a href=\"/LawlabeeTheWallaby/timeline/2011/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2011_10\"><a href=\"/LawlabeeTheWallaby/timeline/2011/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2011_9\"><a href=\"/LawlabeeTheWallaby/timeline/2011/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2011_8\"><a href=\"/LawlabeeTheWallaby/timeline/2011/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2011_7\"><a href=\"/LawlabeeTheWallaby/timeline/2011/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2011_6\"><a href=\"/LawlabeeTheWallaby/timeline/2011/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2011_5\"><a href=\"/LawlabeeTheWallaby/timeline/2011/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2011_4\"><a href=\"/LawlabeeTheWallaby/timeline/2011/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2011_3\"><a href=\"/LawlabeeTheWallaby/timeline/2011/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2011_2\"><a href=\"/LawlabeeTheWallaby/timeline/2011/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2011_1\"><a href=\"/LawlabeeTheWallaby/timeline/2011/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2010\" class=\"clearfix\" data-rollup=\"2010s\" data-year=\"2010\"><a href=\"/LawlabeeTheWallaby/timeline/2010\" rel=\"ignore\" tabindex=\"-1\">2010</a><ul class=\"clearfix\"><li data-key=\"month_2010_12\"><a href=\"/LawlabeeTheWallaby/timeline/2010/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2010_11\"><a href=\"/LawlabeeTheWallaby/timeline/2010/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2010_10\"><a href=\"/LawlabeeTheWallaby/timeline/2010/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2010_9\"><a href=\"/LawlabeeTheWallaby/timeline/2010/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2010_8\"><a href=\"/LawlabeeTheWallaby/timeline/2010/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2010_7\"><a href=\"/LawlabeeTheWallaby/timeline/2010/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2010_6\"><a href=\"/LawlabeeTheWallaby/timeline/2010/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2010_5\"><a href=\"/LawlabeeTheWallaby/timeline/2010/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2010_4\"><a href=\"/LawlabeeTheWallaby/timeline/2010/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2010_3\"><a href=\"/LawlabeeTheWallaby/timeline/2010/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2010_2\"><a href=\"/LawlabeeTheWallaby/timeline/2010/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2010_1\"><a href=\"/LawlabeeTheWallaby/timeline/2010/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2009\" class=\"clearfix\" data-rollup=\"2000s\" data-year=\"2009\"><a href=\"/LawlabeeTheWallaby/timeline/2009\" rel=\"ignore\" tabindex=\"-1\">2009</a><ul class=\"clearfix\"><li data-key=\"month_2009_12\"><a href=\"/LawlabeeTheWallaby/timeline/2009/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2009_11\"><a href=\"/LawlabeeTheWallaby/timeline/2009/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2009_10\"><a href=\"/LawlabeeTheWallaby/timeline/2009/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2009_9\"><a href=\"/LawlabeeTheWallaby/timeline/2009/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2009_8\"><a href=\"/LawlabeeTheWallaby/timeline/2009/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2009_7\"><a href=\"/LawlabeeTheWallaby/timeline/2009/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2009_6\"><a href=\"/LawlabeeTheWallaby/timeline/2009/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2009_5\"><a href=\"/LawlabeeTheWallaby/timeline/2009/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2009_4\"><a href=\"/LawlabeeTheWallaby/timeline/2009/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2009_3\"><a href=\"/LawlabeeTheWallaby/timeline/2009/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2009_2\"><a href=\"/LawlabeeTheWallaby/timeline/2009/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2009_1\"><a href=\"/LawlabeeTheWallaby/timeline/2009/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"year_2008\" class=\"clearfix\" data-rollup=\"2000s\" data-year=\"2008\"><a href=\"/LawlabeeTheWallaby/timeline/2008\" rel=\"ignore\" tabindex=\"-1\">2008</a><ul class=\"clearfix\"><li data-key=\"month_2008_12\"><a href=\"/LawlabeeTheWallaby/timeline/2008/12\" rel=\"ignore\">December</a></li><li data-key=\"month_2008_11\"><a href=\"/LawlabeeTheWallaby/timeline/2008/11\" rel=\"ignore\">November</a></li><li data-key=\"month_2008_10\"><a href=\"/LawlabeeTheWallaby/timeline/2008/10\" rel=\"ignore\">October</a></li><li data-key=\"month_2008_9\"><a href=\"/LawlabeeTheWallaby/timeline/2008/9\" rel=\"ignore\">September</a></li><li data-key=\"month_2008_8\"><a href=\"/LawlabeeTheWallaby/timeline/2008/8\" rel=\"ignore\">August</a></li><li data-key=\"month_2008_7\"><a href=\"/LawlabeeTheWallaby/timeline/2008/7\" rel=\"ignore\">July</a></li><li data-key=\"month_2008_6\"><a href=\"/LawlabeeTheWallaby/timeline/2008/6\" rel=\"ignore\">June</a></li><li data-key=\"month_2008_5\"><a href=\"/LawlabeeTheWallaby/timeline/2008/5\" rel=\"ignore\">May</a></li><li data-key=\"month_2008_4\"><a href=\"/LawlabeeTheWallaby/timeline/2008/4\" rel=\"ignore\">April</a></li><li data-key=\"month_2008_3\"><a href=\"/LawlabeeTheWallaby/timeline/2008/3\" rel=\"ignore\">March</a></li><li data-key=\"month_2008_2\"><a href=\"/LawlabeeTheWallaby/timeline/2008/2\" rel=\"ignore\">February</a></li><li data-key=\"month_2008_1\"><a href=\"/LawlabeeTheWallaby/timeline/2008/1\" rel=\"ignore\">January</a></li></ul></li><li data-key=\"way_back\"><a href=\"/LawlabeeTheWallaby/timeline#way_back\" rel=\"ignore\" tabindex=\"-1\">Born</a></li></ul> ";
// undefined
o94 = null;
// 7212
o93.parentNode = o16;
// 7214
f81632121_521.returns.push(o93);
// undefined
o93 = null;
// 7216
o93 = {};
// 7217
f81632121_476.returns.push(o93);
// 7218
// 7220
o94 = {};
// 7221
f81632121_474.returns.push(o94);
// 7222
o95 = {};
// undefined
fo81632121_1218_firstChild = function() { return fo81632121_1218_firstChild.returns[fo81632121_1218_firstChild.inst++]; };
fo81632121_1218_firstChild.returns = [];
fo81632121_1218_firstChild.inst = 0;
defineGetter(o93, "firstChild", fo81632121_1218_firstChild, undefined);
// undefined
o93 = null;
// undefined
fo81632121_1218_firstChild.returns.push(o95);
// 7224
o94.appendChild = f81632121_478;
// undefined
fo81632121_1218_firstChild.returns.push(o95);
// 7226
f81632121_478.returns.push(o95);
// undefined
fo81632121_1218_firstChild.returns.push(null);
// 7228
o86.appendChild = f81632121_478;
// 7229
f81632121_478.returns.push(o94);
// undefined
o94 = null;
// 7230
o86.getAttribute = f81632121_506;
// 7231
f81632121_506.returns.push(null);
// 7232
o86.setAttribute = f81632121_575;
// 7233
f81632121_575.returns.push(undefined);
// 7235
f81632121_467.returns.push(1374851215953);
// 7239
o93 = {};
// 7240
f81632121_474.returns.push(o93);
// 7242
f81632121_478.returns.push(o93);
// undefined
o93 = null;
// 7245
f81632121_467.returns.push(1374851215954);
// 7248
f81632121_467.returns.push(1374851215954);
// 7251
f81632121_467.returns.push(1374851215954);
// 7253
o93 = {};
// 7254
f81632121_508.returns.push(o93);
// 7256
o94 = {};
// 7257
f81632121_508.returns.push(o94);
// 7258
o96 = {};
// 7259
o94.firstChild = o96;
// 7261
o96.nodeType = 8;
// 7263
o96.nodeValue = " <div class=\"ego_column\"><div class=\"ego_section\" id=\"u_0_46\"><div class=\"uiHeader uiHeaderTopBorder mbs uiSideHeader\"><div class=\"clearfix uiHeaderTop\"><div class=\"rfloat\"><h6 class=\"accessible_elem\"><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><span class=\"adsCategoryTitleLink\">Sponsored</span></a></h6><a class=\"uiHeaderActions\" href=\"/ads/adboard/?type=normal\">See All</a></div><div><h6 class=\"uiHeaderTitle\" aria-hidden=\"true\"><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><span class=\"adsCategoryTitleLink\">Sponsored</span></a><a href=\"/campaign/landing.php?placement=egot&amp;campaign_id=366925476690229&amp;extra_1=auto\"><i class=\"mls adsCategoryIcon img sp_3yt8ar sx_06ab6d\"></i></a></h6></div></div></div><div class=\"ego_unit_container\"><div class=\"ego_unit\" data-ego-fbid=\"6011858202131\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6011858202131,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6011858202131-id_51f2904c3d16d9b66803454\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup-\\-\\XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE-\\-\\_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s&amp;f=0&amp;ui=6011858202131-id_51f2904c3d16d9b66803454&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e14338d925f9bf9db3a9f83cbec4d7eb15257906b(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s97dfd0dd969505e65a9d012deafb18c1c93fe214\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e14338d925f9bf9db3a9f83cbec4d7eb15257906b(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s97dfd0dd969505e65a9d012deafb18c1c93fe214_0\"), (s97dfd0dd969505e65a9d012deafb18c1c93fe214_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s97dfd0dd969505e65a9d012deafb18c1c93fe214_1_instance;\n            ((s97dfd0dd969505e65a9d012deafb18c1c93fe214_1_instance) = ((JSBNG_Record.eventInstance)((\"s97dfd0dd969505e65a9d012deafb18c1c93fe214_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s97dfd0dd969505e65a9d012deafb18c1c93fe214_1\"), (s97dfd0dd969505e65a9d012deafb18c1c93fe214_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s97dfd0dd969505e65a9d012deafb18c1c93fe214_0_instance;\n    ((s97dfd0dd969505e65a9d012deafb18c1c93fe214_0_instance) = ((JSBNG_Record.eventInstance)((\"s97dfd0dd969505e65a9d012deafb18c1c93fe214_0\"))));\n    ((JSBNG_Record.markFunction)((e14338d925f9bf9db3a9f83cbec4d7eb15257906b)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup-\\-\\XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE-\\-\\_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s&amp;f=1&amp;ui=6011858202131-id_51f2904c3d16d9b66803454&amp;en=1&amp;a=0&amp;sig=71261&amp;__tn__=wv\" onmousedown=\"return e14338d925f9bf9db3a9f83cbec4d7eb15257906b.call(this, event);\">S.V.S. Fine Jewelry</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e99ef0c69a11cb199218318ed6a88927763ad1717(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e99ef0c69a11cb199218318ed6a88927763ad1717(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_0\"), (sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_1_instance;\n            ((sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_1_instance) = ((JSBNG_Record.eventInstance)((\"sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_1\"), (sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_0_instance;\n    ((sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_0_instance) = ((JSBNG_Record.eventInstance)((\"sd68fd4a2dfa62f16eb4f1ee948762cde8f89efd2_0\"))));\n    ((JSBNG_Record.markFunction)((e99ef0c69a11cb199218318ed6a88927763ad1717)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup-\\-\\XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE-\\-\\_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s&amp;f=1&amp;ui=6011858202131-id_51f2904c3d16d9b66803454&amp;en=1&amp;a=0&amp;sig=125679&amp;__tn__=ywv\" onmousedown=\"return e99ef0c69a11cb199218318ed6a88927763ad1717.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.creative-iad.xx.fbcdn.net/hads-prn1/s110x80/735357_6011669043531_889011985_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function eb9d86d457b698354ef73e187d68041c13a6747e5(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sc5e6c333b267f15e0561ff6cf990d3adc7940e7f\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function eb9d86d457b698354ef73e187d68041c13a6747e5(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_0\"), (sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_1_instance;\n            ((sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_1_instance) = ((JSBNG_Record.eventInstance)((\"sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_1\"), (sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_0_instance;\n    ((sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_0_instance) = ((JSBNG_Record.eventInstance)((\"sc5e6c333b267f15e0561ff6cf990d3adc7940e7f_0\"))));\n    ((JSBNG_Record.markFunction)((eb9d86d457b698354ef73e187d68041c13a6747e5)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup-\\-\\XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE-\\-\\_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s&amp;f=1&amp;ui=6011858202131-id_51f2904c3d16d9b66803454&amp;en=1&amp;a=0&amp;sig=65690&amp;__tn__=xywv\" onmousedown=\"return eb9d86d457b698354ef73e187d68041c13a6747e5.call(this, event);\">At SVS Fine Jewelry we have been honored to be selected as an IJO Master Jeweler. As a...</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup-\\-\\XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE-\\-\\_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s&amp;f=0&amp;ui=6011858202131-id_51f2904c3d16d9b66803454&amp;en=fad_fan&amp;ed=406124561390&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">2,197 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e61f9797e9a470a89724555bc0d8ffb0093c5ba67(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s3d260c2ec16dce7a2154b6ef4b44776dd6330abb\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e61f9797e9a470a89724555bc0d8ffb0093c5ba67(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_0\"), (s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_1_instance;\n            ((s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_1_instance) = ((JSBNG_Record.eventInstance)((\"s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_1\"), (s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_0_instance;\n    ((s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_0_instance) = ((JSBNG_Record.eventInstance)((\"s3d260c2ec16dce7a2154b6ef4b44776dd6330abb_0\"))));\n    ((JSBNG_Record.markFunction)((e61f9797e9a470a89724555bc0d8ffb0093c5ba67)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup-\\-\\XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE-\\-\\_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s&amp;f=1&amp;ui=6011858202131-id_51f2904c3d16d9b66803454&amp;en=fad_pageclick&amp;ed=406124561390&amp;a=0&amp;mac=AQKoHjJls9-pk6xe&amp;sig=112192&amp;__tn__=zwv\" onmousedown=\"return e61f9797e9a470a89724555bc0d8ffb0093c5ba67.call(this, event);\">S.V.S. Fine Jewelry</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6007957621675\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6007957621675,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6007957621675-id_51f2904c3d2240385237667\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24&amp;f=0&amp;ui=6007957621675-id_51f2904c3d2240385237667&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ec6746832181e4465e84a15407c6358878a9524bf(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sde041b355e2c79a548ccd93451be6ac81481aa7f\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ec6746832181e4465e84a15407c6358878a9524bf(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sde041b355e2c79a548ccd93451be6ac81481aa7f_0\"), (sde041b355e2c79a548ccd93451be6ac81481aa7f_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sde041b355e2c79a548ccd93451be6ac81481aa7f_1_instance;\n            ((sde041b355e2c79a548ccd93451be6ac81481aa7f_1_instance) = ((JSBNG_Record.eventInstance)((\"sde041b355e2c79a548ccd93451be6ac81481aa7f_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sde041b355e2c79a548ccd93451be6ac81481aa7f_1\"), (sde041b355e2c79a548ccd93451be6ac81481aa7f_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sde041b355e2c79a548ccd93451be6ac81481aa7f_0_instance;\n    ((sde041b355e2c79a548ccd93451be6ac81481aa7f_0_instance) = ((JSBNG_Record.eventInstance)((\"sde041b355e2c79a548ccd93451be6ac81481aa7f_0\"))));\n    ((JSBNG_Record.markFunction)((ec6746832181e4465e84a15407c6358878a9524bf)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24&amp;f=1&amp;ui=6007957621675-id_51f2904c3d2240385237667&amp;en=1&amp;a=0&amp;sig=127360&amp;__tn__=wv\" onmousedown=\"return ec6746832181e4465e84a15407c6358878a9524bf.call(this, event);\">WOMEN on Facebook</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e2c113a9a386ab849c906a9d56b8165fc46d98f19(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s28879714450be6a27c1abfe326e44e49840aca82\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e2c113a9a386ab849c906a9d56b8165fc46d98f19(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s28879714450be6a27c1abfe326e44e49840aca82_0\"), (s28879714450be6a27c1abfe326e44e49840aca82_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s28879714450be6a27c1abfe326e44e49840aca82_1_instance;\n            ((s28879714450be6a27c1abfe326e44e49840aca82_1_instance) = ((JSBNG_Record.eventInstance)((\"s28879714450be6a27c1abfe326e44e49840aca82_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s28879714450be6a27c1abfe326e44e49840aca82_1\"), (s28879714450be6a27c1abfe326e44e49840aca82_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s28879714450be6a27c1abfe326e44e49840aca82_0_instance;\n    ((s28879714450be6a27c1abfe326e44e49840aca82_0_instance) = ((JSBNG_Record.eventInstance)((\"s28879714450be6a27c1abfe326e44e49840aca82_0\"))));\n    ((JSBNG_Record.markFunction)((e2c113a9a386ab849c906a9d56b8165fc46d98f19)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24&amp;f=1&amp;ui=6007957621675-id_51f2904c3d2240385237667&amp;en=1&amp;a=0&amp;sig=98096&amp;__tn__=ywv\" onmousedown=\"return e2c113a9a386ab849c906a9d56b8165fc46d98f19.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-ash3/s110x80/708194_6005058265675_41800_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e7578d897dcc8420ac71be4b933b99feca73e313c(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s03d5bc389712dc8fc1b5e4a7645b421017cf8073\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e7578d897dcc8420ac71be4b933b99feca73e313c(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s03d5bc389712dc8fc1b5e4a7645b421017cf8073_0\"), (s03d5bc389712dc8fc1b5e4a7645b421017cf8073_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s03d5bc389712dc8fc1b5e4a7645b421017cf8073_1_instance;\n            ((s03d5bc389712dc8fc1b5e4a7645b421017cf8073_1_instance) = ((JSBNG_Record.eventInstance)((\"s03d5bc389712dc8fc1b5e4a7645b421017cf8073_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s03d5bc389712dc8fc1b5e4a7645b421017cf8073_1\"), (s03d5bc389712dc8fc1b5e4a7645b421017cf8073_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s03d5bc389712dc8fc1b5e4a7645b421017cf8073_0_instance;\n    ((s03d5bc389712dc8fc1b5e4a7645b421017cf8073_0_instance) = ((JSBNG_Record.eventInstance)((\"s03d5bc389712dc8fc1b5e4a7645b421017cf8073_0\"))));\n    ((JSBNG_Record.markFunction)((e7578d897dcc8420ac71be4b933b99feca73e313c)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24&amp;f=1&amp;ui=6007957621675-id_51f2904c3d2240385237667&amp;en=1&amp;a=0&amp;sig=95219&amp;__tn__=xywv\" onmousedown=\"return e7578d897dcc8420ac71be4b933b99feca73e313c.call(this, event);\">Thousands of local singles just one click away. Start now and find the date that fits you.</a></div></div></div><div class=\"inline\"><div class=\"action\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e4c076a8f5a071f71549aed1a9c22793adf19833a(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s07c77755fb0c3aa604c7a1ed60f8b0077299f67d\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e4c076a8f5a071f71549aed1a9c22793adf19833a(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_0\"), (s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_1_instance;\n            ((s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_1_instance) = ((JSBNG_Record.eventInstance)((\"s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_1\"), (s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_0_instance;\n    ((s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_0_instance) = ((JSBNG_Record.eventInstance)((\"s07c77755fb0c3aa604c7a1ed60f8b0077299f67d_0\"))));\n    ((JSBNG_Record.markFunction)((e4c076a8f5a071f71549aed1a9c22793adf19833a)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"uiIconText emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24&amp;f=1&amp;ui=6007957621675-id_51f2904c3d2240385237667&amp;en=1&amp;a=0&amp;sig=127391&amp;__tn__=wv\" onmousedown=\"return e4c076a8f5a071f71549aed1a9c22793adf19833a.call(this, event);\"><i class=\"img sp_3yt8ar sx_b302f8\"></i>Use Now</a> · <span class=\"fbEmuContext\">5,000,000 people used <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e97629af3e63a9ce7d51401e7006d11e445ebd382(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s28aaa87b44fa4424aad06df9289dc62a041116fd\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e97629af3e63a9ce7d51401e7006d11e445ebd382(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s28aaa87b44fa4424aad06df9289dc62a041116fd_0\"), (s28aaa87b44fa4424aad06df9289dc62a041116fd_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s28aaa87b44fa4424aad06df9289dc62a041116fd_1_instance;\n            ((s28aaa87b44fa4424aad06df9289dc62a041116fd_1_instance) = ((JSBNG_Record.eventInstance)((\"s28aaa87b44fa4424aad06df9289dc62a041116fd_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s28aaa87b44fa4424aad06df9289dc62a041116fd_1\"), (s28aaa87b44fa4424aad06df9289dc62a041116fd_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s28aaa87b44fa4424aad06df9289dc62a041116fd_0_instance;\n    ((s28aaa87b44fa4424aad06df9289dc62a041116fd_0_instance) = ((JSBNG_Record.eventInstance)((\"s28aaa87b44fa4424aad06df9289dc62a041116fd_0\"))));\n    ((JSBNG_Record.markFunction)((e97629af3e63a9ce7d51401e7006d11e445ebd382)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24&amp;f=1&amp;ui=6007957621675-id_51f2904c3d2240385237667&amp;en=1&amp;a=0&amp;sig=70865&amp;__tn__=%7Bzwv\" onmousedown=\"return e97629af3e63a9ce7d51401e7006d11e445ebd382.call(this, event);\">Zoosk</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6007651357550\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6007651357550,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6007651357550-id_51f2904c3d26e5462905510\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W&amp;f=0&amp;ui=6007651357550-id_51f2904c3d26e5462905510&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e8b07f25afabdb3609d715b9f07ba140eb225b64e(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s08def55b89d61e64d4e002341f5538931eae4578\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e8b07f25afabdb3609d715b9f07ba140eb225b64e(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s08def55b89d61e64d4e002341f5538931eae4578_0\"), (s08def55b89d61e64d4e002341f5538931eae4578_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s08def55b89d61e64d4e002341f5538931eae4578_1_instance;\n            ((s08def55b89d61e64d4e002341f5538931eae4578_1_instance) = ((JSBNG_Record.eventInstance)((\"s08def55b89d61e64d4e002341f5538931eae4578_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s08def55b89d61e64d4e002341f5538931eae4578_1\"), (s08def55b89d61e64d4e002341f5538931eae4578_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s08def55b89d61e64d4e002341f5538931eae4578_0_instance;\n    ((s08def55b89d61e64d4e002341f5538931eae4578_0_instance) = ((JSBNG_Record.eventInstance)((\"s08def55b89d61e64d4e002341f5538931eae4578_0\"))));\n    ((JSBNG_Record.markFunction)((e8b07f25afabdb3609d715b9f07ba140eb225b64e)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W&amp;f=1&amp;ui=6007651357550-id_51f2904c3d26e5462905510&amp;en=1&amp;a=0&amp;sig=71707&amp;__tn__=wv\" onmousedown=\"return e8b07f25afabdb3609d715b9f07ba140eb225b64e.call(this, event);\">Is this sweet or sour?</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ef0164f2bf1fd8d8e01d41d9655c31d18bdbdaea7(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s290a2264d7a9097dc1470b1f1f9747457327661c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ef0164f2bf1fd8d8e01d41d9655c31d18bdbdaea7(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s290a2264d7a9097dc1470b1f1f9747457327661c_0\"), (s290a2264d7a9097dc1470b1f1f9747457327661c_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s290a2264d7a9097dc1470b1f1f9747457327661c_1_instance;\n            ((s290a2264d7a9097dc1470b1f1f9747457327661c_1_instance) = ((JSBNG_Record.eventInstance)((\"s290a2264d7a9097dc1470b1f1f9747457327661c_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s290a2264d7a9097dc1470b1f1f9747457327661c_1\"), (s290a2264d7a9097dc1470b1f1f9747457327661c_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s290a2264d7a9097dc1470b1f1f9747457327661c_0_instance;\n    ((s290a2264d7a9097dc1470b1f1f9747457327661c_0_instance) = ((JSBNG_Record.eventInstance)((\"s290a2264d7a9097dc1470b1f1f9747457327661c_0\"))));\n    ((JSBNG_Record.markFunction)((ef0164f2bf1fd8d8e01d41d9655c31d18bdbdaea7)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W&amp;f=1&amp;ui=6007651357550-id_51f2904c3d26e5462905510&amp;en=1&amp;a=0&amp;sig=121486&amp;__tn__=ywv\" onmousedown=\"return ef0164f2bf1fd8d8e01d41d9655c31d18bdbdaea7.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-ash3/s110x80/735347_6007651190750_477676589_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ee7661523863a3beb371063b97f421fc12f5d5b5e(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sb9cb25ccb0016e0dea02908bd1237349e2197d82\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ee7661523863a3beb371063b97f421fc12f5d5b5e(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sb9cb25ccb0016e0dea02908bd1237349e2197d82_0\"), (sb9cb25ccb0016e0dea02908bd1237349e2197d82_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sb9cb25ccb0016e0dea02908bd1237349e2197d82_1_instance;\n            ((sb9cb25ccb0016e0dea02908bd1237349e2197d82_1_instance) = ((JSBNG_Record.eventInstance)((\"sb9cb25ccb0016e0dea02908bd1237349e2197d82_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sb9cb25ccb0016e0dea02908bd1237349e2197d82_1\"), (sb9cb25ccb0016e0dea02908bd1237349e2197d82_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sb9cb25ccb0016e0dea02908bd1237349e2197d82_0_instance;\n    ((sb9cb25ccb0016e0dea02908bd1237349e2197d82_0_instance) = ((JSBNG_Record.eventInstance)((\"sb9cb25ccb0016e0dea02908bd1237349e2197d82_0\"))));\n    ((JSBNG_Record.markFunction)((ee7661523863a3beb371063b97f421fc12f5d5b5e)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W&amp;f=1&amp;ui=6007651357550-id_51f2904c3d26e5462905510&amp;en=1&amp;a=0&amp;sig=119784&amp;__tn__=xywv\" onmousedown=\"return ee7661523863a3beb371063b97f421fc12f5d5b5e.call(this, event);\">Discover a world of intense flavors with Bon Bon Boom gum pops. Like us on Facebook now!</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W&amp;f=0&amp;ui=6007651357550-id_51f2904c3d26e5462905510&amp;en=fad_fan&amp;ed=551477364890640&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">5,642 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e8e1a7aeebfe56c090d2cdde0e878c5d23b720f29(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s314539d5f689824fc8c87b8a2a08fed2c0031085\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e8e1a7aeebfe56c090d2cdde0e878c5d23b720f29(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s314539d5f689824fc8c87b8a2a08fed2c0031085_0\"), (s314539d5f689824fc8c87b8a2a08fed2c0031085_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s314539d5f689824fc8c87b8a2a08fed2c0031085_1_instance;\n            ((s314539d5f689824fc8c87b8a2a08fed2c0031085_1_instance) = ((JSBNG_Record.eventInstance)((\"s314539d5f689824fc8c87b8a2a08fed2c0031085_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s314539d5f689824fc8c87b8a2a08fed2c0031085_1\"), (s314539d5f689824fc8c87b8a2a08fed2c0031085_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s314539d5f689824fc8c87b8a2a08fed2c0031085_0_instance;\n    ((s314539d5f689824fc8c87b8a2a08fed2c0031085_0_instance) = ((JSBNG_Record.eventInstance)((\"s314539d5f689824fc8c87b8a2a08fed2c0031085_0\"))));\n    ((JSBNG_Record.markFunction)((e8e1a7aeebfe56c090d2cdde0e878c5d23b720f29)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W&amp;f=1&amp;ui=6007651357550-id_51f2904c3d26e5462905510&amp;en=fad_pageclick&amp;ed=551477364890640&amp;a=0&amp;mac=AQKQ4s-yGdeSklgE&amp;sig=84935&amp;__tn__=zwv\" onmousedown=\"return e8e1a7aeebfe56c090d2cdde0e878c5d23b720f29.call(this, event);\">Bon Bon Boom</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6010680301716\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6010680301716,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6010680301716-id_51f2904c3d2af8e11302550\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE&amp;f=0&amp;ui=6010680301716-id_51f2904c3d2af8e11302550&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e732bc6df7140aff102b8742f56356d4d7b96f2c1(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sba53f6365b5fb9a70fb8011c430ca20670c5060c\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e732bc6df7140aff102b8742f56356d4d7b96f2c1(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sba53f6365b5fb9a70fb8011c430ca20670c5060c_0\"), (sba53f6365b5fb9a70fb8011c430ca20670c5060c_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sba53f6365b5fb9a70fb8011c430ca20670c5060c_1_instance;\n            ((sba53f6365b5fb9a70fb8011c430ca20670c5060c_1_instance) = ((JSBNG_Record.eventInstance)((\"sba53f6365b5fb9a70fb8011c430ca20670c5060c_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sba53f6365b5fb9a70fb8011c430ca20670c5060c_1\"), (sba53f6365b5fb9a70fb8011c430ca20670c5060c_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sba53f6365b5fb9a70fb8011c430ca20670c5060c_0_instance;\n    ((sba53f6365b5fb9a70fb8011c430ca20670c5060c_0_instance) = ((JSBNG_Record.eventInstance)((\"sba53f6365b5fb9a70fb8011c430ca20670c5060c_0\"))));\n    ((JSBNG_Record.markFunction)((e732bc6df7140aff102b8742f56356d4d7b96f2c1)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE&amp;f=1&amp;ui=6010680301716-id_51f2904c3d2af8e11302550&amp;en=1&amp;a=0&amp;sig=114877&amp;__tn__=wv\" onmousedown=\"return e732bc6df7140aff102b8742f56356d4d7b96f2c1.call(this, event);\">Marlene&#039;s Meal Makeovers</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ec6a6e5a6fbb2e5ee136fec2e14ab76e2ba4dac95(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s92a2752a2b343ca2be7e7e9ecd19420beff0674e\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ec6a6e5a6fbb2e5ee136fec2e14ab76e2ba4dac95(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s92a2752a2b343ca2be7e7e9ecd19420beff0674e_0\"), (s92a2752a2b343ca2be7e7e9ecd19420beff0674e_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s92a2752a2b343ca2be7e7e9ecd19420beff0674e_1_instance;\n            ((s92a2752a2b343ca2be7e7e9ecd19420beff0674e_1_instance) = ((JSBNG_Record.eventInstance)((\"s92a2752a2b343ca2be7e7e9ecd19420beff0674e_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s92a2752a2b343ca2be7e7e9ecd19420beff0674e_1\"), (s92a2752a2b343ca2be7e7e9ecd19420beff0674e_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s92a2752a2b343ca2be7e7e9ecd19420beff0674e_0_instance;\n    ((s92a2752a2b343ca2be7e7e9ecd19420beff0674e_0_instance) = ((JSBNG_Record.eventInstance)((\"s92a2752a2b343ca2be7e7e9ecd19420beff0674e_0\"))));\n    ((JSBNG_Record.markFunction)((ec6a6e5a6fbb2e5ee136fec2e14ab76e2ba4dac95)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE&amp;f=1&amp;ui=6010680301716-id_51f2904c3d2af8e11302550&amp;en=1&amp;a=0&amp;sig=78807&amp;__tn__=ywv\" onmousedown=\"return ec6a6e5a6fbb2e5ee136fec2e14ab76e2ba4dac95.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.creative-iad.xx.fbcdn.net/hads-ash3/s110x80/735358_6010487616516_1483820094_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e51fc0459fd8ba1ed9ef4aea9396e75c6209247e8(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e51fc0459fd8ba1ed9ef4aea9396e75c6209247e8(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_0\"), (sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_1_instance;\n            ((sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_1_instance) = ((JSBNG_Record.eventInstance)((\"sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_1\"), (sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_0_instance;\n    ((sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_0_instance) = ((JSBNG_Record.eventInstance)((\"sea2fefb043d9f9ace09f2e6fc4e78b841ec7dc22_0\"))));\n    ((JSBNG_Record.markFunction)((e51fc0459fd8ba1ed9ef4aea9396e75c6209247e8)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE&amp;f=1&amp;ui=6010680301716-id_51f2904c3d2af8e11302550&amp;en=1&amp;a=0&amp;sig=66146&amp;__tn__=xywv\" onmousedown=\"return e51fc0459fd8ba1ed9ef4aea9396e75c6209247e8.call(this, event);\">Like Us for healthy recipes, Cheaper, Better, and Faster with Cook Once, Produce Twice...</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE&amp;f=0&amp;ui=6010680301716-id_51f2904c3d2af8e11302550&amp;en=fad_fan&amp;ed=352352391912&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">3,263 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ebe75e181291e1f217f9de74db62fe89366bc0718(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s399b54ad4f6c978693a6b0a963aeb42c71a41866\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ebe75e181291e1f217f9de74db62fe89366bc0718(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s399b54ad4f6c978693a6b0a963aeb42c71a41866_0\"), (s399b54ad4f6c978693a6b0a963aeb42c71a41866_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s399b54ad4f6c978693a6b0a963aeb42c71a41866_1_instance;\n            ((s399b54ad4f6c978693a6b0a963aeb42c71a41866_1_instance) = ((JSBNG_Record.eventInstance)((\"s399b54ad4f6c978693a6b0a963aeb42c71a41866_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s399b54ad4f6c978693a6b0a963aeb42c71a41866_1\"), (s399b54ad4f6c978693a6b0a963aeb42c71a41866_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s399b54ad4f6c978693a6b0a963aeb42c71a41866_0_instance;\n    ((s399b54ad4f6c978693a6b0a963aeb42c71a41866_0_instance) = ((JSBNG_Record.eventInstance)((\"s399b54ad4f6c978693a6b0a963aeb42c71a41866_0\"))));\n    ((JSBNG_Record.markFunction)((ebe75e181291e1f217f9de74db62fe89366bc0718)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE&amp;f=1&amp;ui=6010680301716-id_51f2904c3d2af8e11302550&amp;en=fad_pageclick&amp;ed=352352391912&amp;a=0&amp;mac=AQKfXPSPqhiaF4n7&amp;sig=97556&amp;__tn__=zwv\" onmousedown=\"return ebe75e181291e1f217f9de74db62fe89366bc0718.call(this, event);\">marlene&#039;s meal makeovers</a>.</span></div></div></div></div></div><div class=\"ego_unit\" data-ego-fbid=\"6007882470930\"><div class=\"-cx-PUBLIC-fbAdUnit__root\" data-ad=\"&#123;&quot;adid&quot;:6007882470930,&quot;segment&quot;:&quot;market&quot;&#125;\" id=\"6007882470930-id_51f2904c3d2ef2f25249809\"><div class=\"-cx-PRIVATE-fbEmu__root -cx-PRIVATE-fbEmuEgo__unit\"><div class=\"uiSelector inlineBlock emu_x emuEventfad_hide -cx-PUBLIC-fbEmu__link uiSelectorRight\"><div class=\"uiToggle wrap\"><a class=\"uiSelectorButton uiCloseButton uiCloseButtonSmall\" href=\"#\" role=\"button\" title=\"About Facebook Ads\" rel=\"toggle\" ajaxify=\"/ajax/emu/end.php?eid=AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS-\\-\\HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ&amp;f=0&amp;ui=6007882470930-id_51f2904c3d2ef2f25249809&amp;en=fad_hide&amp;ed=true&amp;a=1&amp;__tn__=v\" aria-haspopup=\"1\"></a></div></div><div class=\"title\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e4ca693ff3b871bfffd92997ec2c6db05cf16bb6a(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s625458d2e43b662571072377a04c208a8c560d62\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e4ca693ff3b871bfffd92997ec2c6db05cf16bb6a(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s625458d2e43b662571072377a04c208a8c560d62_0\"), (s625458d2e43b662571072377a04c208a8c560d62_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s625458d2e43b662571072377a04c208a8c560d62_1_instance;\n            ((s625458d2e43b662571072377a04c208a8c560d62_1_instance) = ((JSBNG_Record.eventInstance)((\"s625458d2e43b662571072377a04c208a8c560d62_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s625458d2e43b662571072377a04c208a8c560d62_1\"), (s625458d2e43b662571072377a04c208a8c560d62_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s625458d2e43b662571072377a04c208a8c560d62_0_instance;\n    ((s625458d2e43b662571072377a04c208a8c560d62_0_instance) = ((JSBNG_Record.eventInstance)((\"s625458d2e43b662571072377a04c208a8c560d62_0\"))));\n    ((JSBNG_Record.markFunction)((e4ca693ff3b871bfffd92997ec2c6db05cf16bb6a)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS-\\-\\HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ&amp;f=1&amp;ui=6007882470930-id_51f2904c3d2ef2f25249809&amp;en=1&amp;a=0&amp;sig=102367&amp;__tn__=wv\" onmousedown=\"return e4ca693ff3b871bfffd92997ec2c6db05cf16bb6a.call(this, event);\">Like Cool Cars?</a></div><div class=\"clearfix image_body_block\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function e53938e7627bca752056396fb818b0364b033db37(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s315c86651673789cd574fcdb8e1e6ff60f8c76c0\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function e53938e7627bca752056396fb818b0364b033db37(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s315c86651673789cd574fcdb8e1e6ff60f8c76c0_0\"), (s315c86651673789cd574fcdb8e1e6ff60f8c76c0_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s315c86651673789cd574fcdb8e1e6ff60f8c76c0_1_instance;\n            ((s315c86651673789cd574fcdb8e1e6ff60f8c76c0_1_instance) = ((JSBNG_Record.eventInstance)((\"s315c86651673789cd574fcdb8e1e6ff60f8c76c0_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s315c86651673789cd574fcdb8e1e6ff60f8c76c0_1\"), (s315c86651673789cd574fcdb8e1e6ff60f8c76c0_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s315c86651673789cd574fcdb8e1e6ff60f8c76c0_0_instance;\n    ((s315c86651673789cd574fcdb8e1e6ff60f8c76c0_0_instance) = ((JSBNG_Record.eventInstance)((\"s315c86651673789cd574fcdb8e1e6ff60f8c76c0_0\"))));\n    ((JSBNG_Record.markFunction)((e53938e7627bca752056396fb818b0364b033db37)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link image fbEmuImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\" tabindex=\"-1\" href=\"/ajax/emu/end.php?eid=AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS-\\-\\HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ&amp;f=1&amp;ui=6007882470930-id_51f2904c3d2ef2f25249809&amp;en=1&amp;a=0&amp;sig=99575&amp;__tn__=ywv\" onmousedown=\"return e53938e7627bca752056396fb818b0364b033db37.call(this, event);\" aria-hidden=\"true\"><img class=\"img\" src=\"http://jsbngssl.fbcdn-creative-a.akamaihd.net/hads-ak-prn1/s110x80/735300_6007844247530_1677760925_n.png\" alt=\"\" /></a><div class=\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\"><div class=\"body\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function efc72b1b3b01bbec2e62ddd82a8f5af9f0cbe1b78(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s400cb16d7b581757ddfcb762b81e5e5ec727070e\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function efc72b1b3b01bbec2e62ddd82a8f5af9f0cbe1b78(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s400cb16d7b581757ddfcb762b81e5e5ec727070e_0\"), (s400cb16d7b581757ddfcb762b81e5e5ec727070e_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s400cb16d7b581757ddfcb762b81e5e5ec727070e_1_instance;\n            ((s400cb16d7b581757ddfcb762b81e5e5ec727070e_1_instance) = ((JSBNG_Record.eventInstance)((\"s400cb16d7b581757ddfcb762b81e5e5ec727070e_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s400cb16d7b581757ddfcb762b81e5e5ec727070e_1\"), (s400cb16d7b581757ddfcb762b81e5e5ec727070e_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s400cb16d7b581757ddfcb762b81e5e5ec727070e_0_instance;\n    ((s400cb16d7b581757ddfcb762b81e5e5ec727070e_0_instance) = ((JSBNG_Record.eventInstance)((\"s400cb16d7b581757ddfcb762b81e5e5ec727070e_0\"))));\n    ((JSBNG_Record.markFunction)((efc72b1b3b01bbec2e62ddd82a8f5af9f0cbe1b78)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"forceLTR emuEvent1 -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS-\\-\\HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ&amp;f=1&amp;ui=6007882470930-id_51f2904c3d2ef2f25249809&amp;en=1&amp;a=0&amp;sig=75951&amp;__tn__=xywv\" onmousedown=\"return efc72b1b3b01bbec2e62ddd82a8f5af9f0cbe1b78.call(this, event);\">We do.</a></div></div></div><div class=\"inline\"><div class=\"action\"><a class=\"uiIconText emuEventfad_fan -cx-PUBLIC-fbEmu__link\" href=\"#\" style=\"padding-left: 17px;\" rel=\"async-post\" ajaxify=\"/ajax/emu/end.php?eid=AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS-\\-\\HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ&amp;f=0&amp;ui=6007882470930-id_51f2904c3d2ef2f25249809&amp;en=fad_fan&amp;ed=457438810959776&amp;a=1&amp;__tn__=wv\" role=\"button\"><i class=\"img sp_4p6kmz sx_bc56c4\" style=\"top: 1px;\"></i>Like</a> · <span class=\"fbEmuContext\">2,957 people like <script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ed363dd5b4457ddc178baa0792dfbc150ae3c2958(event) {\\u000a    var meta = document.getElementById(\\\"meta_referrer\\\");\\u000a    meta.content = \\\"origin\\\";\\u000a    setTimeout(function() {\\u000a        meta.content = \\\"default\\\";\\u000a    }, 100);\\u000a    var attribute = \\\"href\\\";\\u000a    var ms = this.getAttribute(attribute).match(/([\\\\\\\\?|&]f=)([^&]*)/);\\u000a    if (ms) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]f=[^&]*/, (ms[1] + 0)));\\u000a    }\\u000a;\\u000a;\\u000a    var attribute = \\\"href\\\";\\u000a    var sig = this.getAttribute(attribute).match(/([\\\\\\\\?|&]sig=)([^&]*)/);\\u000a    if (sig) {\\u000a        this.setAttribute(attribute, this.getAttribute(attribute).replace(/[\\\\\\\\?|&]sig=[^&]*/, (sig[1] + ((Math.floor((Math.random() * 65535)) + 65536)))));\\u000a    }\\u000a;\\u000a;\\u000a};\"), (\"s9a2220cdebe3ad13d68296225760bff7aab5543b\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ed363dd5b4457ddc178baa0792dfbc150ae3c2958(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s9a2220cdebe3ad13d68296225760bff7aab5543b_0\"), (s9a2220cdebe3ad13d68296225760bff7aab5543b_0_instance), (this), (arguments)))\n        };\n        (null);\n        var meta = (((JSBNG_Record.get)(JSBNG__document, (\"getElementById\")))[(\"getElementById\")])(\"meta_referrer\");\n        ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"origin\"));\n        JSBNG__setTimeout(((function() {\n            var s9a2220cdebe3ad13d68296225760bff7aab5543b_1_instance;\n            ((s9a2220cdebe3ad13d68296225760bff7aab5543b_1_instance) = ((JSBNG_Record.eventInstance)((\"s9a2220cdebe3ad13d68296225760bff7aab5543b_1\"))));\n            return ((JSBNG_Record.markFunction)((function() {\n                if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n                    return ((JSBNG_Record.eventCall)((arguments.callee), (\"s9a2220cdebe3ad13d68296225760bff7aab5543b_1\"), (s9a2220cdebe3ad13d68296225760bff7aab5543b_1_instance), (this), (arguments)))\n                };\n                (null);\n                ((JSBNG_Record.set)(meta, (\"JSBNG__content\"), \"default\"));\n            })));\n        })()), 100);\n        var attribute = \"href\";\n        var ms = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]f=)([^&]*)/);\n        if (ms) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]f=[^&]*/, ((((JSBNG_Record.get)(ms, 1))[1]) + 0)));\n        }\n        ;\n        ;\n        var attribute = \"href\";\n        var sig = (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"match\")))[(\"match\")])(/([\\\\?|&]sig=)([^&]*)/);\n        if (sig) {\n            (((JSBNG_Record.get)(this, (\"setAttribute\")))[(\"setAttribute\")])(attribute, (((JSBNG_Record.get)((((JSBNG_Record.get)(this, (\"getAttribute\")))[(\"getAttribute\")])(attribute), (\"replace\")))[(\"replace\")])(/[\\\\?|&]sig=[^&]*/, ((((JSBNG_Record.get)(sig, 1))[1]) + (((((JSBNG_Record.get)(Math, (\"floor\")))[(\"floor\")])(((((JSBNG_Record.get)(Math, (\"JSBNG__random\")))[(\"JSBNG__random\")])() * 65535)) + 65536)))));\n        }\n        ;\n        ;\n    };\n    var s9a2220cdebe3ad13d68296225760bff7aab5543b_0_instance;\n    ((s9a2220cdebe3ad13d68296225760bff7aab5543b_0_instance) = ((JSBNG_Record.eventInstance)((\"s9a2220cdebe3ad13d68296225760bff7aab5543b_0\"))));\n    ((JSBNG_Record.markFunction)((ed363dd5b4457ddc178baa0792dfbc150ae3c2958)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><a class=\"emuEventfad_pageclick -cx-PUBLIC-fbEmu__link\" href=\"/ajax/emu/end.php?eid=AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS-\\-\\HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ&amp;f=1&amp;ui=6007882470930-id_51f2904c3d2ef2f25249809&amp;en=fad_pageclick&amp;ed=457438810959776&amp;a=0&amp;mac=AQJo4bLN86ypaeU2&amp;sig=67548&amp;__tn__=zwv\" onmousedown=\"return ed363dd5b4457ddc178baa0792dfbc150ae3c2958.call(this, event);\">Autoswaprz.com</a>.</span></div></div></div></div></div></div></div></div> ";
// undefined
o96 = null;
// 7264
o94.parentNode = o16;
// 7266
f81632121_521.returns.push(o94);
// undefined
o94 = null;
// 7267
// 7268
o93.getAttribute = f81632121_506;
// 7269
f81632121_506.returns.push("u_0_2s");
// 7280
f81632121_467.returns.push(1374851216009);
// 7284
o94 = {};
// 7285
f81632121_474.returns.push(o94);
// 7287
f81632121_478.returns.push(o94);
// undefined
o94 = null;
// 7290
f81632121_467.returns.push(1374851216009);
// 7293
f81632121_467.returns.push(1374851216009);
// 7296
f81632121_467.returns.push(1374851216010);
// 7299
f81632121_467.returns.push(1374851216011);
// 7303
o94 = {};
// 7304
f81632121_474.returns.push(o94);
// 7306
f81632121_478.returns.push(o94);
// undefined
o94 = null;
// 7307
o94 = {};
// 7309
f81632121_469.returns.push(undefined);
// 7310
o96 = {};
// 7313
f81632121_1124.returns.push(undefined);
// 7314
o96.cancelBubble = false;
// 7316
o96.state = null;
// 7318
o96.returnValue = true;
// undefined
o96 = null;
// 7319
o96 = {};
// undefined
o96 = null;
// 7320
// 7321
// undefined
o83 = null;
// 7324
f81632121_467.returns.push(1374851216013);
// 7327
f81632121_467.returns.push(1374851216013);
// 7329
o83 = {};
// 7330
f81632121_508.returns.push(o83);
// 7332
o96 = {};
// 7333
f81632121_508.returns.push(o96);
// 7334
o97 = {};
// 7335
o96.firstChild = o97;
// 7337
o97.nodeType = 8;
// 7339
o97.nodeValue = " <div class=\"-cx-PRIVATE-fbDock__root fbDockWrapper fbDockWrapperRight\" id=\"u_0_2u\"><div class=\"fbDock clearfix\"><div class=\"clearfix nubContainer rNubContainer\"><div id=\"ChatTabsPagelet\" data-referrer=\"ChatTabsPagelet\"><div class=\"fbNubGroup clearfix -cx-PUBLIC-fbMercuryChatTab__container\" id=\"u_0_2v\"><div class=\"fbNubGroup clearfix\" id=\"u_0_2w\"></div></div></div><div id=\"BuddylistPagelet\" data-referrer=\"BuddylistPagelet\"><div class=\"-cx-PUBLIC-fbDockChatBuddyListNub__container\"><div class=\"uiToggle -cx-PRIVATE-fbNub__root fbNub -cx-PUBLIC-fbDockChatBuddyListNub__root hide_on_presence_error\" id=\"fbDockChatBuddylistNub\"><a class=\"fbNubButton\" tabindex=\"0\" href=\"#\" rel=\"toggle\" role=\"button\"><span class=\"-cx-PRIVATE-fbDockChatBuddyListNub__unreadcount rfloat\"></span><img class=\"icon lfloat img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><span class=\"label\">Chat<span class=\"count\"> (<strong>0</strong>)</span></span></a><div class=\"fbNubFlyout uiToggleFlyout\"><div class=\"fbNubFlyoutOuter\"><div class=\"fbNubFlyoutInner\"><div class=\"clearfix fbNubFlyoutTitlebar\" data-jsid=\"nubFlyoutTitlebar\"><div class=\"uiSelector inlineBlock fbChatSidebarDropdown button rfloat uiSelectorRight\" id=\"u_0_31\" data-multiple=\"1\"><div class=\"uiToggle wrap\"><a data-hover=\"tooltip\" aria-label=\"Options\" class=\"uiSelectorButton uiCloseButton\" href=\"#\" role=\"button\" aria-haspopup=\"1\" rel=\"toggle\"></a><div class=\"uiSelectorMenuWrapper uiToggleFlyout\"><div role=\"menu\" class=\"uiMenu uiSelectorMenu\"><ul class=\"uiMenuInner\"><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption checked\" data-label=\"Chat Sounds\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"0\" href=\"#\" aria-checked=\"true\"><span class=\"itemLabel fsm\">Chat Sounds</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption\" data-label=\"Advanced Settings...\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/settings_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Advanced Settings...</span></a></li><li class=\"uiMenuSeparator\"></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOnlineItem\" data-label=\"Turn On Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"#\" aria-checked=\"false\"><span class=\"itemLabel fsm\">Turn On Chat</span></a></li><li class=\"uiMenuItem uiMenuItemCheckbox uiSelectorOption fbChatGoOfflineItem\" data-label=\"Turn Off Chat\"><a class=\"itemAnchor\" role=\"menuitemcheckbox\" tabindex=\"-1\" href=\"/ajax/chat/privacy/turn_off_dialog.php\" aria-checked=\"false\" rel=\"dialog\"><span class=\"itemLabel fsm\">Turn Off Chat</span></a></li></ul></div></div></div><select multiple=\"1\"><option value=\"\" disabled=\"1\"></option><option value=\"sound\" selected=\"1\">Chat Sounds</option><option value=\"advanced_settings\">Advanced Settings...</option><option value=\"online\">Turn On Chat</option><option value=\"turn_off_dialog\">Turn Off Chat</option></select></div><div class=\"titlebarLabel clearfix\"><div class=\"titlebarTextWrapper\">Chat</div></div></div><div class=\"fbNubFlyoutBody scrollable\"><div class=\"fbNubFlyoutBodyContent\"><div id=\"u_0_33\"><ul class=\"fbChatOrderedList clearfix\"><li><div class=\"phs fcg\"><span data-jsid=\"message\">Loading...</span></div></li></ul></div><div class=\"fbChatTypeaheadView hidden_elem\" id=\"u_0_2x\"></div></div></div><div class=\"fbNubFlyoutFooter\"><div class=\"-cx-PRIVATE-fbDockChatBuddyListNub__messageouter clearfix\"><img class=\"img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\" alt=\"\" width=\"1\" height=\"1\" /><div class=\"-cx-PRIVATE-fbDockChatBuddyListNub__message fcg\"></div></div><div class=\"uiTypeahead uiClearableTypeahead fbChatTypeahead\" id=\"u_0_2y\"><div class=\"wrap\"><script type=\"text/javascript\">try {\n    ((JSBNG_Record.scriptLoad)((\"function ea7e383ecd3b5f6b16e83b00b802333ed8e45c8c9(event) {\\u000a\\u000a};\"), (\"s0b82d3ea0afb5d2199e454492c80deca405e1fc9\")));\n    ((window.top.JSBNG_Record.callerJS) = (true));\n    function ea7e383ecd3b5f6b16e83b00b802333ed8e45c8c9(JSBNG__event) {\n        if ((!(JSBNG_Record.top.JSBNG_Record.callerJS))) {\n            return ((JSBNG_Record.eventCall)((arguments.callee), (\"s0b82d3ea0afb5d2199e454492c80deca405e1fc9_0\"), (s0b82d3ea0afb5d2199e454492c80deca405e1fc9_0_instance), (this), (arguments)))\n        };\n        (null);\n    ;\n    };\n    var s0b82d3ea0afb5d2199e454492c80deca405e1fc9_0_instance;\n    ((s0b82d3ea0afb5d2199e454492c80deca405e1fc9_0_instance) = ((JSBNG_Record.eventInstance)((\"s0b82d3ea0afb5d2199e454492c80deca405e1fc9_0\"))));\n    ((JSBNG_Record.markFunction)((ea7e383ecd3b5f6b16e83b00b802333ed8e45c8c9)));\n} finally {\n    ((window.top.JSBNG_Record.callerJS) = (false));\n    ((window.top.JSBNG_Record.flushDeferredEvents)());\n};</script><button class=\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-xuiCloseButton__root clear uiTypeaheadCloseButton -cx-PRIVATE-xuiCloseButton__medium -cx-PRIVATE-xuiCloseButton__dark\" title=\"Remove\" onclick=\"return ea7e383ecd3b5f6b16e83b00b802333ed8e45c8c9.call(this, event);\" type=\"button\" id=\"u_0_2z\">Remove</button><input type=\"hidden\" autocomplete=\"off\" class=\"hiddenInput\" /><div class=\"innerWrap\"><input type=\"text\" class=\"inputtext inputsearch textInput DOMControl_placeholder\" autocomplete=\"off\" placeholder=\"Search\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-owns=\"typeahead_list_u_0_2y\" role=\"combobox\" spellcheck=\"false\" value=\"Search\" aria-label=\"Search\" id=\"u_0_30\" /></div><img class=\"throbber uiLoadingIndicatorAsync img\" src=\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\" alt=\"\" width=\"16\" height=\"11\" /></div></div></div></div></div></div></div></div></div></div></div></div><div id=\"u_0_34\"></div> ";
// undefined
o97 = null;
// 7340
o96.parentNode = o16;
// 7342
f81632121_521.returns.push(o96);
// undefined
o96 = null;
// 7343
// 7344
o83.getAttribute = f81632121_506;
// 7345
f81632121_506.returns.push("pagelet_dock");
// 7400
o96 = {};
// 7401
f81632121_476.returns.push(o96);
// 7402
// 7403
// 7404
o96.getElementsByTagName = f81632121_502;
// 7405
o97 = {};
// 7406
f81632121_502.returns.push(o97);
// 7407
o97.length = 0;
// undefined
o97 = null;
// 7409
o97 = {};
// 7410
o96.childNodes = o97;
// undefined
o96 = null;
// 7411
o97.nodeType = void 0;
// 7412
o97.getAttributeNode = void 0;
// 7413
o97.getElementsByTagName = void 0;
// 7414
o97.childNodes = void 0;
// undefined
o97 = null;
// 7417
o96 = {};
// 7418
f81632121_476.returns.push(o96);
// 7419
// 7420
// 7421
o96.getElementsByTagName = f81632121_502;
// 7422
o97 = {};
// 7423
f81632121_502.returns.push(o97);
// 7424
o97.length = 0;
// undefined
o97 = null;
// 7426
o97 = {};
// 7427
o96.childNodes = o97;
// undefined
o96 = null;
// 7428
o97.nodeType = void 0;
// 7429
o97.getAttributeNode = void 0;
// 7430
o97.getElementsByTagName = void 0;
// 7431
o97.childNodes = void 0;
// undefined
o97 = null;
// 7441
o96 = {};
// 7442
f81632121_476.returns.push(o96);
// 7443
// 7444
// 7445
o96.getElementsByTagName = f81632121_502;
// 7446
o97 = {};
// 7447
f81632121_502.returns.push(o97);
// 7448
o97.length = 0;
// undefined
o97 = null;
// 7450
o97 = {};
// 7451
o96.childNodes = o97;
// undefined
o96 = null;
// 7452
o97.nodeType = void 0;
// 7453
o97.getAttributeNode = void 0;
// 7454
o97.getElementsByTagName = void 0;
// 7455
o97.childNodes = void 0;
// undefined
o97 = null;
// 7539
f81632121_467.returns.push(1374851216135);
// 7543
f81632121_467.returns.push(1374851216136);
// 7548
o96 = {};
// 7549
f81632121_474.returns.push(o96);
// 7551
f81632121_467.returns.push(1374851216137);
// 7553
o97 = {};
// 7554
f81632121_476.returns.push(o97);
// 7555
// 7556
// 7557
// 7558
// 7559
// 7560
// 7561
o96.appendChild = f81632121_478;
// 7562
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7564
f81632121_467.returns.push(1374851216137);
// 7566
o97 = {};
// 7567
f81632121_476.returns.push(o97);
// 7568
// 7569
// 7570
// 7571
// 7572
// 7573
// 7575
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7577
f81632121_467.returns.push(1374851216138);
// 7579
o97 = {};
// 7580
f81632121_476.returns.push(o97);
// 7581
// 7582
// 7583
// 7584
// 7585
// 7586
// 7588
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7590
f81632121_467.returns.push(1374851216138);
// 7592
o97 = {};
// 7593
f81632121_476.returns.push(o97);
// 7594
// 7595
// 7596
// 7597
// 7598
// 7599
// 7601
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7603
f81632121_467.returns.push(1374851216139);
// 7605
o97 = {};
// 7606
f81632121_476.returns.push(o97);
// 7607
// 7608
// 7609
// 7610
// 7611
// 7612
// 7614
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7616
f81632121_467.returns.push(1374851216140);
// 7618
o97 = {};
// 7619
f81632121_476.returns.push(o97);
// 7620
// 7621
// 7622
// 7623
// 7624
// 7625
// 7627
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7629
f81632121_467.returns.push(1374851216144);
// 7631
o97 = {};
// 7632
f81632121_476.returns.push(o97);
// 7633
// 7634
// 7635
// 7636
// 7637
// 7638
// 7640
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7642
f81632121_467.returns.push(1374851216145);
// 7644
o97 = {};
// 7645
f81632121_476.returns.push(o97);
// 7646
// 7647
// 7648
// 7649
// 7650
// 7651
// 7653
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7655
f81632121_467.returns.push(1374851216145);
// 7657
o97 = {};
// 7658
f81632121_476.returns.push(o97);
// 7659
// 7660
// 7661
// 7662
// 7663
// 7664
// 7666
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7668
f81632121_467.returns.push(1374851216145);
// 7670
o97 = {};
// 7671
f81632121_476.returns.push(o97);
// 7672
// 7673
// 7674
// 7675
// 7676
// 7677
// 7679
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7681
f81632121_467.returns.push(1374851216146);
// 7683
o97 = {};
// 7684
f81632121_476.returns.push(o97);
// 7685
// 7686
// 7687
// 7688
// 7689
// 7690
// 7692
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7694
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7697
f81632121_467.returns.push(1374851216149);
// 7701
o96 = {};
// 7702
f81632121_474.returns.push(o96);
// 7704
f81632121_467.returns.push(1374851216150);
// 7706
o97 = {};
// 7707
f81632121_476.returns.push(o97);
// 7708
// 7709
// 7710
// 7711
// 7712
// 7713
// 7714
o96.appendChild = f81632121_478;
// 7715
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7717
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7720
f81632121_467.returns.push(1374851216152);
// 7724
o96 = {};
// 7725
f81632121_474.returns.push(o96);
// 7727
f81632121_467.returns.push(1374851216159);
// 7729
o97 = {};
// 7730
f81632121_476.returns.push(o97);
// 7731
// 7732
// 7733
// 7734
// 7735
// 7736
// 7737
o96.appendChild = f81632121_478;
// 7738
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7740
f81632121_467.returns.push(1374851216159);
// 7742
o97 = {};
// 7743
f81632121_476.returns.push(o97);
// 7744
// 7745
// 7746
// 7747
// 7748
// 7749
// 7751
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7753
f81632121_467.returns.push(1374851216160);
// 7755
o97 = {};
// 7756
f81632121_476.returns.push(o97);
// 7757
// 7758
// 7759
// 7760
// 7761
// 7762
// 7764
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7766
f81632121_467.returns.push(1374851216160);
// 7768
o97 = {};
// 7769
f81632121_476.returns.push(o97);
// 7770
// 7771
// 7772
// 7773
// 7774
// 7775
// 7777
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7779
f81632121_467.returns.push(1374851216160);
// 7781
o97 = {};
// 7782
f81632121_476.returns.push(o97);
// 7783
// 7784
// 7785
// 7786
// 7787
// 7788
// 7790
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7792
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7795
f81632121_467.returns.push(1374851216161);
// 7799
o96 = {};
// 7800
f81632121_474.returns.push(o96);
// 7802
f81632121_467.returns.push(1374851216162);
// 7804
o97 = {};
// 7805
f81632121_476.returns.push(o97);
// 7806
// 7807
// 7808
// 7809
// 7810
// 7811
// 7812
o96.appendChild = f81632121_478;
// 7813
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7815
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7818
f81632121_467.returns.push(1374851216162);
// 7822
o96 = {};
// 7823
f81632121_474.returns.push(o96);
// 7825
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7828
f81632121_467.returns.push(1374851216172);
// 7832
o96 = {};
// 7833
f81632121_474.returns.push(o96);
// 7835
f81632121_467.returns.push(1374851216172);
// 7837
o97 = {};
// 7838
f81632121_476.returns.push(o97);
// 7839
// 7840
// 7841
// 7842
// 7843
// 7844
// 7845
o96.appendChild = f81632121_478;
// 7846
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7848
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7851
f81632121_467.returns.push(1374851216173);
// 7855
o96 = {};
// 7856
f81632121_474.returns.push(o96);
// 7858
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7861
f81632121_467.returns.push(1374851216173);
// 7864
f81632121_467.returns.push(1374851216174);
// 7868
o96 = {};
// 7869
f81632121_474.returns.push(o96);
// 7871
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7874
f81632121_467.returns.push(1374851216174);
// 7878
o96 = {};
// 7879
f81632121_474.returns.push(o96);
// 7881
f81632121_467.returns.push(1374851216175);
// 7883
o97 = {};
// 7884
f81632121_476.returns.push(o97);
// 7885
// 7886
// 7887
// 7888
// 7889
// 7890
// 7891
o96.appendChild = f81632121_478;
// 7892
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7894
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7897
f81632121_467.returns.push(1374851216176);
// 7901
o96 = {};
// 7902
f81632121_474.returns.push(o96);
// 7904
f81632121_467.returns.push(1374851216177);
// 7906
o97 = {};
// 7907
f81632121_476.returns.push(o97);
// 7908
// 7909
// 7910
// 7911
// 7912
// 7913
// 7914
o96.appendChild = f81632121_478;
// 7915
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7917
f81632121_467.returns.push(1374851216178);
// 7919
o97 = {};
// 7920
f81632121_476.returns.push(o97);
// 7921
// 7922
// 7923
// 7924
// 7925
// 7926
// 7928
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7930
f81632121_467.returns.push(1374851216183);
// 7932
o97 = {};
// 7933
f81632121_476.returns.push(o97);
// 7934
// 7935
// 7936
// 7937
// 7938
// 7939
// 7941
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7943
f81632121_467.returns.push(1374851216183);
// 7945
o97 = {};
// 7946
f81632121_476.returns.push(o97);
// 7947
// 7948
// 7949
// 7950
// 7951
// 7952
// 7954
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7956
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7959
f81632121_467.returns.push(1374851216184);
// 7963
o96 = {};
// 7964
f81632121_474.returns.push(o96);
// 7966
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7969
f81632121_467.returns.push(1374851216185);
// 7973
o96 = {};
// 7974
f81632121_474.returns.push(o96);
// 7976
f81632121_467.returns.push(1374851216185);
// 7978
o97 = {};
// 7979
f81632121_476.returns.push(o97);
// 7980
// 7981
// 7982
// 7983
// 7984
// 7985
// 7986
o96.appendChild = f81632121_478;
// 7987
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 7989
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 7992
f81632121_467.returns.push(1374851216186);
// 7995
f81632121_467.returns.push(1374851216186);
// 7999
o96 = {};
// 8000
f81632121_474.returns.push(o96);
// 8002
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8005
f81632121_467.returns.push(1374851216186);
// 8009
o96 = {};
// 8010
f81632121_474.returns.push(o96);
// 8012
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8015
f81632121_467.returns.push(1374851216187);
// 8019
o96 = {};
// 8020
f81632121_474.returns.push(o96);
// 8022
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8025
f81632121_467.returns.push(1374851216191);
// 8029
o96 = {};
// 8030
f81632121_474.returns.push(o96);
// 8032
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8035
f81632121_467.returns.push(1374851216192);
// 8039
o96 = {};
// 8040
f81632121_474.returns.push(o96);
// 8042
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8045
f81632121_467.returns.push(1374851216192);
// 8049
o96 = {};
// 8050
f81632121_474.returns.push(o96);
// 8052
f81632121_467.returns.push(1374851216193);
// 8054
o97 = {};
// 8055
f81632121_476.returns.push(o97);
// 8056
// 8057
// 8058
// 8059
// 8060
// 8061
// 8062
o96.appendChild = f81632121_478;
// 8063
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 8065
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8068
f81632121_467.returns.push(1374851216193);
// 8072
o96 = {};
// 8073
f81632121_474.returns.push(o96);
// 8075
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8078
f81632121_467.returns.push(1374851216194);
// 8082
o96 = {};
// 8083
f81632121_474.returns.push(o96);
// 8085
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8087
f81632121_467.returns.push(1374851216195);
// 8090
f81632121_467.returns.push(1374851216198);
// 8094
o96 = {};
// 8095
f81632121_474.returns.push(o96);
// 8097
f81632121_467.returns.push(1374851216199);
// 8099
o97 = {};
// 8100
f81632121_476.returns.push(o97);
// 8101
// 8102
// 8103
// 8104
// 8105
// 8106
// 8107
o96.appendChild = f81632121_478;
// 8108
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 8110
f81632121_467.returns.push(1374851216200);
// 8112
o97 = {};
// 8113
f81632121_476.returns.push(o97);
// 8114
// 8115
// 8116
// 8117
// 8118
// 8119
// 8121
f81632121_478.returns.push(o97);
// undefined
o97 = null;
// 8123
f81632121_478.returns.push(o96);
// undefined
o96 = null;
// 8124
o96 = {};
// undefined
o96 = null;
// 8125
// 8126
// undefined
o84 = null;
// 8128
f81632121_467.returns.push(1374851216211);
// 8130
f81632121_467.returns.push(1374851216211);
// 8134
f81632121_12.returns.push(26);
// 8136
f81632121_467.returns.push(1374851216212);
// 8140
f81632121_12.returns.push(27);
// 8142
f81632121_467.returns.push(1374851216212);
// 8144
f81632121_467.returns.push(1374851216212);
// 8146
f81632121_467.returns.push(1374851216212);
// 8150
f81632121_12.returns.push(28);
// 8152
f81632121_467.returns.push(1374851216212);
// 8156
f81632121_12.returns.push(29);
// 8158
f81632121_467.returns.push(1374851216212);
// 8165
o0.title = "Gregor Richards";
// 8167
o1._ua_log = "{\"log\":[{\"ts\":1374851176765,\"path\":\"-\",\"index\":0,\"type\":\"init\",\"iref\":\"-\"},{\"path\":\"/index.php\",\"type\":\"click\",\"ts\":1374851178117,\"iref\":\"bluebar\",\"index\":1},{\"path\":\"/index.php\",\"type\":\"click\",\"ts\":1374851184878,\"iref\":\"bluebar\",\"index\":2},{\"path\":\"/index.php\",\"type\":\"submit\",\"ts\":1374851184905,\"iref\":\"bluebar\",\"index\":3}],\"len\":4}";
// 8170
f81632121_467.returns.push(1374851216237);
// 8172
f81632121_463.returns.push(1);
// 8174
f81632121_463.returns.push(2);
// 8177
f81632121_467.returns.push(1374851216239);
// 8181
f81632121_7.returns.push(undefined);
// 8182
ow81632121.JSBNG__onJSBNG__focus = undefined;
// 8187
f81632121_468.returns.push(undefined);
// 8188
o8.JSBNG__onDOMMouseScroll = void 0;
// 8195
f81632121_468.returns.push(undefined);
// 8196
o8.JSBNG__onmousemove = null;
// 8200
o84 = {};
// 8201
f81632121_0.returns.push(o84);
// undefined
o84 = null;
// 8203
f81632121_467.returns.push(1374851216242);
// 8205
f81632121_482.returns.push("1;1");
// 8207
f81632121_482.returns.push("{\"log\":[{\"ts\":1374851176765,\"path\":\"-\",\"index\":0,\"type\":\"init\",\"iref\":\"-\"},{\"path\":\"/index.php\",\"type\":\"click\",\"ts\":1374851178117,\"iref\":\"bluebar\",\"index\":1},{\"path\":\"/index.php\",\"type\":\"click\",\"ts\":1374851184878,\"iref\":\"bluebar\",\"index\":2},{\"path\":\"/index.php\",\"type\":\"submit\",\"ts\":1374851184905,\"iref\":\"bluebar\",\"index\":3}],\"len\":4}");
// 8209
f81632121_467.returns.push(1374851216243);
// 8211
o84 = {};
// 8212
f81632121_70.returns.push(o84);
// 8213
// 8214
f81632121_1294 = function() { return f81632121_1294.returns[f81632121_1294.inst++]; };
f81632121_1294.returns = [];
f81632121_1294.inst = 0;
// 8215
o84.open = f81632121_1294;
// 8216
f81632121_1294.returns.push(undefined);
// 8217
f81632121_1295 = function() { return f81632121_1295.returns[f81632121_1295.inst++]; };
f81632121_1295.returns = [];
f81632121_1295.inst = 0;
// 8218
o84.setRequestHeader = f81632121_1295;
// 8219
f81632121_1295.returns.push(undefined);
// 8222
f81632121_1295.returns.push(undefined);
// 8223
f81632121_1296 = function() { return f81632121_1296.returns[f81632121_1296.inst++]; };
f81632121_1296.returns = [];
f81632121_1296.inst = 0;
// 8224
o84.send = f81632121_1296;
// 8225
f81632121_1296.returns.push(undefined);
// 8228
o96 = {};
// 8229
f81632121_508.returns.push(o96);
// 8230
o96.nodeName = "FORM";
// 8231
o96.__FB_TOKEN = void 0;
// 8232
// 8233
o96.getAttribute = f81632121_506;
// 8234
o96.hasAttribute = f81632121_507;
// 8236
f81632121_507.returns.push(false);
// 8237
o96.JSBNG__addEventListener = f81632121_468;
// 8239
f81632121_468.returns.push(undefined);
// 8240
f81632121_1298 = function() { return f81632121_1298.returns[f81632121_1298.inst++]; };
f81632121_1298.returns = [];
f81632121_1298.inst = 0;
// 8241
o96.JSBNG__onsubmit = f81632121_1298;
// 8244
// undefined
o96 = null;
// 8248
o96 = {};
// 8249
o97 = {};
// 8251
o96.transport = o84;
// 8252
o84.readyState = 1;
// 8253
o98 = {};
// 8254
o99 = {};
// 8256
o98.nodeType = void 0;
// 8257
o98.length = 1;
// 8258
o98["0"] = "I+n09";
// 8265
f81632121_467.returns.push(1374851216301);
// 8266
f81632121_12.returns.push(30);
// 8267
o100 = {};
// 8268
o101 = {};
// 8270
o100.nodeType = void 0;
// 8271
o100.length = 1;
// 8272
o100["0"] = "4vv8/";
// 8276
o8.clientHeight = 727;
// 8279
o102 = {};
// 8280
o8.classList = o102;
// 8282
o102.remove = f81632121_1114;
// 8283
f81632121_1114.returns.push(undefined);
// 8286
o102.add = f81632121_602;
// 8287
f81632121_602.returns.push(undefined);
// 8291
o103 = {};
// 8292
o104 = {};
// 8294
o103.nodeType = void 0;
// 8295
o103.length = 1;
// 8296
o103["0"] = "BjpNB";
// 8303
o105 = {};
// 8304
f81632121_508.returns.push(o105);
// 8305
o105.getElementsByTagName = f81632121_502;
// 8307
o105.querySelectorAll = f81632121_504;
// 8308
o106 = {};
// 8309
f81632121_504.returns.push(o106);
// 8310
o106.length = 1;
// 8311
o107 = {};
// 8312
o106["0"] = o107;
// undefined
o106 = null;
// 8313
o106 = {};
// 8314
o107.parentNode = o106;
// undefined
o107 = null;
// undefined
o106 = null;
// 8315
f81632121_12.returns.push(31);
// 8320
o16.__FB_TOKEN = void 0;
// 8321
// 8323
o16.hasAttribute = f81632121_507;
// 8325
f81632121_507.returns.push(false);
// 8326
o16.JSBNG__addEventListener = f81632121_468;
// 8328
f81632121_468.returns.push(undefined);
// 8329
o16.JSBNG__onclick = null;
// 8331
o106 = {};
// 8332
o107 = {};
// 8334
o106.nodeType = void 0;
// 8335
o106.length = 1;
// 8336
o106["0"] = "js0se";
// 8338
o108 = {};
// 8341
o108.cancelBubble = false;
// 8344
f81632121_467.returns.push(1374851216392);
// 8347
f81632121_1007.returns.push(undefined);
// 8349
o108.returnValue = true;
// 8352
o109 = {};
// 8353
o108.srcElement = o109;
// 8355
o108.target = o109;
// 8357
o109.nodeType = 1;
// 8358
o110 = {};
// 8359
o109.parentNode = o110;
// 8361
o109.getAttribute = f81632121_506;
// 8363
f81632121_506.returns.push(null);
// 8365
o111 = {};
// 8366
o110.parentNode = o111;
// 8367
o110.nodeType = 1;
// 8368
o110.getAttribute = f81632121_506;
// 8370
f81632121_506.returns.push(null);
// 8372
o112 = {};
// 8373
o111.parentNode = o112;
// 8374
o111.nodeType = 1;
// 8375
o111.getAttribute = f81632121_506;
// 8377
f81632121_506.returns.push(null);
// 8379
o113 = {};
// 8380
o112.parentNode = o113;
// 8381
o112.nodeType = 1;
// 8382
o112.getAttribute = f81632121_506;
// 8384
f81632121_506.returns.push(null);
// 8386
o113.parentNode = o82;
// 8387
o113.nodeType = 1;
// 8388
o113.getAttribute = f81632121_506;
// 8390
f81632121_506.returns.push(null);
// 8396
f81632121_506.returns.push(null);
// 8402
f81632121_506.returns.push(null);
// 8408
f81632121_506.returns.push(null);
// 8413
o108.relatedTarget = null;
// 8414
o108.fromElement = null;
// undefined
o108 = null;
// 8417
o108 = {};
// 8421
f81632121_467.returns.push(1374851216402);
// 8422
o108.cancelBubble = false;
// 8423
o108.returnValue = true;
// 8426
o108.srcElement = o109;
// 8428
o108.target = o109;
// 8435
f81632121_506.returns.push(null);
// 8441
f81632121_506.returns.push(null);
// 8447
f81632121_506.returns.push(null);
// 8453
f81632121_506.returns.push(null);
// 8459
f81632121_506.returns.push(null);
// 8465
f81632121_506.returns.push(null);
// 8471
f81632121_506.returns.push(null);
// 8477
f81632121_506.returns.push(null);
// 8482
o108.JSBNG__screenX = 1047;
// 8483
o108.JSBNG__screenY = 478;
// 8484
o108.altKey = false;
// 8485
o108.bubbles = true;
// 8486
o108.button = 0;
// 8487
o108.buttons = void 0;
// 8488
o108.cancelable = false;
// 8489
o108.clientX = 979;
// 8490
o108.clientY = 313;
// 8491
o108.ctrlKey = false;
// 8492
o108.currentTarget = o0;
// 8493
o108.defaultPrevented = false;
// 8494
o108.detail = 0;
// 8495
o108.eventPhase = 3;
// 8496
o108.isTrusted = void 0;
// 8497
o108.metaKey = false;
// 8498
o108.pageX = 979;
// 8499
o108.pageY = 472;
// 8500
o108.relatedTarget = null;
// 8501
o108.fromElement = null;
// 8504
o108.shiftKey = false;
// 8507
o108.timeStamp = 1374851216401;
// 8508
o108.type = "mousemove";
// 8509
o108.view = ow81632121;
// undefined
o108 = null;
// 8515
f81632121_467.returns.push(1374851216462);
// 8517
f81632121_467.returns.push(1374851216462);
// 8519
f81632121_467.returns.push(1374851216462);
// 8521
f81632121_467.returns.push(1374851216462);
// 8522
o108 = {};
// 8526
f81632121_467.returns.push(1374851216547);
// 8527
o108.cancelBubble = false;
// 8528
o108.returnValue = true;
// 8531
o108.srcElement = o109;
// 8533
o108.target = o109;
// 8540
f81632121_506.returns.push(null);
// 8546
f81632121_506.returns.push(null);
// 8552
f81632121_506.returns.push(null);
// 8558
f81632121_506.returns.push(null);
// 8564
f81632121_506.returns.push(null);
// 8570
f81632121_506.returns.push(null);
// 8576
f81632121_506.returns.push(null);
// 8582
f81632121_506.returns.push(null);
// 8587
o108.JSBNG__screenX = 1048;
// 8588
o108.JSBNG__screenY = 478;
// 8589
o108.altKey = false;
// 8590
o108.bubbles = true;
// 8591
o108.button = 0;
// 8592
o108.buttons = void 0;
// 8593
o108.cancelable = false;
// 8594
o108.clientX = 980;
// 8595
o108.clientY = 313;
// 8596
o108.ctrlKey = false;
// 8597
o108.currentTarget = o0;
// 8598
o108.defaultPrevented = false;
// 8599
o108.detail = 0;
// 8600
o108.eventPhase = 3;
// 8601
o108.isTrusted = void 0;
// 8602
o108.metaKey = false;
// 8603
o108.pageX = 980;
// 8604
o108.pageY = 472;
// 8605
o108.relatedTarget = null;
// 8606
o108.fromElement = null;
// 8609
o108.shiftKey = false;
// 8612
o108.timeStamp = 1374851216547;
// 8613
o108.type = "mousemove";
// 8614
o108.view = ow81632121;
// undefined
o108 = null;
// 8619
o108 = {};
// 8623
f81632121_467.returns.push(1374851217846);
// 8625
o108.cancelBubble = false;
// 8626
o108.returnValue = true;
// 8629
o108.srcElement = o109;
// 8631
o108.target = o109;
// 8638
f81632121_506.returns.push(null);
// 8644
f81632121_506.returns.push(null);
// 8650
f81632121_506.returns.push(null);
// 8656
f81632121_506.returns.push(null);
// 8662
f81632121_506.returns.push(null);
// 8668
f81632121_506.returns.push(null);
// 8674
f81632121_506.returns.push(null);
// 8680
f81632121_506.returns.push(null);
// 8685
o108.JSBNG__screenX = 941;
// 8686
o108.JSBNG__screenY = 502;
// 8687
o108.altKey = false;
// 8688
o108.bubbles = true;
// 8689
o108.button = 0;
// 8690
o108.buttons = void 0;
// 8691
o108.cancelable = false;
// 8692
o108.clientX = 873;
// 8693
o108.clientY = 337;
// 8694
o108.ctrlKey = false;
// 8695
o108.currentTarget = o0;
// 8696
o108.defaultPrevented = false;
// 8697
o108.detail = 0;
// 8698
o108.eventPhase = 3;
// 8699
o108.isTrusted = void 0;
// 8700
o108.metaKey = false;
// 8701
o108.pageX = 873;
// 8702
o108.pageY = 496;
// 8703
o108.relatedTarget = null;
// 8704
o108.fromElement = null;
// 8707
o108.shiftKey = false;
// 8710
o108.timeStamp = 1374851217846;
// 8711
o108.type = "mousemove";
// 8712
o108.view = ow81632121;
// undefined
o108 = null;
// 8717
o108 = {};
// 8721
f81632121_467.returns.push(1374851221800);
// 8723
o108.cancelBubble = false;
// 8724
o108.returnValue = true;
// 8727
o108.srcElement = o109;
// 8729
o108.target = o109;
// 8736
f81632121_506.returns.push(null);
// 8742
f81632121_506.returns.push(null);
// 8748
f81632121_506.returns.push(null);
// 8754
f81632121_506.returns.push(null);
// 8760
f81632121_506.returns.push(null);
// 8766
f81632121_506.returns.push(null);
// 8772
f81632121_506.returns.push(null);
// 8778
f81632121_506.returns.push(null);
// 8783
o108.JSBNG__screenX = 942;
// 8784
o108.JSBNG__screenY = 502;
// 8785
o108.altKey = false;
// 8786
o108.bubbles = true;
// 8787
o108.button = 0;
// 8788
o108.buttons = void 0;
// 8789
o108.cancelable = false;
// 8790
o108.clientX = 874;
// 8791
o108.clientY = 337;
// 8792
o108.ctrlKey = false;
// 8793
o108.currentTarget = o0;
// 8794
o108.defaultPrevented = false;
// 8795
o108.detail = 0;
// 8796
o108.eventPhase = 3;
// 8797
o108.isTrusted = void 0;
// 8798
o108.metaKey = false;
// 8799
o108.pageX = 874;
// 8800
o108.pageY = 496;
// 8801
o108.relatedTarget = null;
// 8802
o108.fromElement = null;
// 8805
o108.shiftKey = false;
// 8808
o108.timeStamp = 1374851217855;
// 8809
o108.type = "mousemove";
// 8810
o108.view = ow81632121;
// undefined
o108 = null;
// 8815
o108 = {};
// 8818
o108.cancelBubble = false;
// 8821
f81632121_467.returns.push(1374851221808);
// 8823
o108.returnValue = true;
// undefined
o108 = null;
// 8824
o108 = {};
// 8827
o108.cancelBubble = false;
// 8830
f81632121_467.returns.push(1374851221823);
// 8832
o108.returnValue = true;
// undefined
o108 = null;
// 8833
o108 = {};
// 8837
f81632121_467.returns.push(1374851221825);
// 8838
o108.cancelBubble = false;
// 8839
o108.returnValue = true;
// 8842
o108.srcElement = o109;
// 8844
o108.target = o109;
// 8851
f81632121_506.returns.push(null);
// 8857
f81632121_506.returns.push(null);
// 8863
f81632121_506.returns.push(null);
// 8869
f81632121_506.returns.push(null);
// 8875
f81632121_506.returns.push(null);
// 8881
f81632121_506.returns.push(null);
// 8887
f81632121_506.returns.push(null);
// 8893
f81632121_506.returns.push(null);
// 8898
o108.JSBNG__screenX = 970;
// 8899
o108.JSBNG__screenY = 511;
// 8900
o108.altKey = false;
// 8901
o108.bubbles = true;
// 8902
o108.button = 0;
// 8903
o108.buttons = void 0;
// 8904
o108.cancelable = false;
// 8905
o108.clientX = 902;
// 8906
o108.clientY = 346;
// 8907
o108.ctrlKey = false;
// 8908
o108.currentTarget = o0;
// 8909
o108.defaultPrevented = false;
// 8910
o108.detail = 0;
// 8911
o108.eventPhase = 3;
// 8912
o108.isTrusted = void 0;
// 8913
o108.metaKey = false;
// 8914
o108.pageX = 902;
// 8915
o108.pageY = 346;
// 8916
o108.relatedTarget = null;
// 8917
o108.fromElement = null;
// 8920
o108.shiftKey = false;
// 8923
o108.timeStamp = 1374851221824;
// 8924
o108.type = "mousemove";
// 8925
o108.view = ow81632121;
// undefined
o108 = null;
// 8934
ow81632121.JSBNG__random = undefined;
// 8935
f81632121_466.returns.push(0.8472101090010256);
// 8936
o5.pathname = "/LawlabeeTheWallaby";
// 8938
f81632121_467.returns.push(1374851225480);
// 8942
f81632121_12.returns.push(32);
// 8943
o108 = {};
// 8944
o114 = {};
// 8946
o108.nodeType = void 0;
// 8947
o108.length = 1;
// 8948
o108["0"] = "zBhY6";
// 8950
o115 = {};
// 8954
o116 = {};
// 8958
o117 = {};
// 8963
f81632121_1332 = function() { return f81632121_1332.returns[f81632121_1332.inst++]; };
f81632121_1332.returns = [];
f81632121_1332.inst = 0;
// 8964
o84.getResponseHeader = f81632121_1332;
// 8967
f81632121_1332.returns.push("3xmoz3iESIuknM/7/9Ym+VHcCy1tul8y/Lv/ebbexTQ=");
// 8970
f81632121_1332.returns.push("3xmoz3iESIuknM/7/9Ym+VHcCy1tul8y/Lv/ebbexTQ=");
// 8971
// 8973
o84.JSBNG__status = 200;
// 8977
f81632121_467.returns.push(1374851225491);
// 8978
f81632121_1333 = function() { return f81632121_1333.returns[f81632121_1333.inst++]; };
f81632121_1333.returns = [];
f81632121_1333.inst = 0;
// 8979
o96._handleXHRResponse = f81632121_1333;
// 8981
f81632121_1334 = function() { return f81632121_1334.returns[f81632121_1334.inst++]; };
f81632121_1334.returns = [];
f81632121_1334.inst = 0;
// 8982
o96.getOption = f81632121_1334;
// 8983
o118 = {};
// 8984
o96.option = o118;
// 8985
o118.suppressEvaluation = false;
// 8988
f81632121_1334.returns.push(false);
// 8989
o84.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"keys\":[]},\"bootloadable\":{},\"ixData\":[]}";
// 8990
f81632121_1336 = function() { return f81632121_1336.returns[f81632121_1336.inst++]; };
f81632121_1336.returns = [];
f81632121_1336.inst = 0;
// 8991
o96._unshieldResponseText = f81632121_1336;
// 8992
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":{\"keys\":[]},\"bootloadable\":{},\"ixData\":[]}");
// 8993
f81632121_1337 = function() { return f81632121_1337.returns[f81632121_1337.inst++]; };
f81632121_1337.returns = [];
f81632121_1337.inst = 0;
// 8994
o96._interpretResponse = f81632121_1337;
// 8995
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 8996
f81632121_1338 = function() { return f81632121_1338.returns[f81632121_1338.inst++]; };
f81632121_1338.returns = [];
f81632121_1338.inst = 0;
// 8997
o96.invokeResponseHandler = f81632121_1338;
// 8998
f81632121_1339 = function() { return f81632121_1339.returns[f81632121_1339.inst++]; };
f81632121_1339.returns = [];
f81632121_1339.inst = 0;
// 8999
o96.handler = f81632121_1339;
// 9000
f81632121_1340 = function() { return f81632121_1340.returns[f81632121_1340.inst++]; };
f81632121_1340.returns = [];
f81632121_1340.inst = 0;
// 9001
o96._isRelevant = f81632121_1340;
// 9002
o96._allowCrossPageTransition = void 0;
// 9003
o96.id = 3;
// 9005
f81632121_1340.returns.push(true);
// 9006
f81632121_1341 = function() { return f81632121_1341.returns[f81632121_1341.inst++]; };
f81632121_1341.returns = [];
f81632121_1341.inst = 0;
// 9007
o96._dispatchResponse = f81632121_1341;
// 9008
f81632121_1342 = function() { return f81632121_1342.returns[f81632121_1342.inst++]; };
f81632121_1342.returns = [];
f81632121_1342.inst = 0;
// 9009
o96.getURI = f81632121_1342;
// 9010
o119 = {};
// 9011
o96.uri = o119;
// 9012
f81632121_1344 = function() { return f81632121_1344.returns[f81632121_1344.inst++]; };
f81632121_1344.returns = [];
f81632121_1344.inst = 0;
// 9014
o119.$URIBase0 = "";
// 9015
o119.$URIBase1 = "";
// 9016
o119.$URIBase2 = "";
// 9017
o119.$URIBase3 = "/ajax/webstorage/process_keys.php";
// 9019
o120 = {};
// 9020
o119.$URIBase5 = o120;
// undefined
o120 = null;
// 9021
o119.$URIBase4 = "";
// 9022
f81632121_1344.returns.push("/ajax/webstorage/process_keys.php");
// 9023
f81632121_1342.returns.push("/ajax/webstorage/process_keys.php");
// 9024
o96.preBootloadHandler = void 0;
// 9035
f81632121_1344.returns.push("/ajax/webstorage/process_keys.php");
// 9036
f81632121_1342.returns.push("/ajax/webstorage/process_keys.php");
// 9038
f81632121_12.returns.push(33);
// 9042
o120 = {};
// 9043
f81632121_474.returns.push(o120);
// 9045
f81632121_478.returns.push(o120);
// undefined
o120 = null;
// 9046
f81632121_1338.returns.push(undefined);
// 9047
f81632121_1333.returns.push(undefined);
// 9050
o118.asynchronous = true;
// undefined
o118 = null;
// 9053
f81632121_1334.returns.push(true);
// 9054
// 9056
f81632121_1347 = function() { return f81632121_1347.returns[f81632121_1347.inst++]; };
f81632121_1347.returns = [];
f81632121_1347.inst = 0;
// 9057
o96.clearStatusIndicator = f81632121_1347;
// 9058
f81632121_1348 = function() { return f81632121_1348.returns[f81632121_1348.inst++]; };
f81632121_1348.returns = [];
f81632121_1348.inst = 0;
// 9059
o96.getStatusElement = f81632121_1348;
// 9060
o96.statusElement = null;
// 9061
f81632121_1348.returns.push(null);
// 9062
f81632121_1347.returns.push(undefined);
// 9067
f81632121_1340.returns.push(true);
// 9068
f81632121_1349 = function() { return f81632121_1349.returns[f81632121_1349.inst++]; };
f81632121_1349.returns = [];
f81632121_1349.inst = 0;
// 9069
o96.initialHandler = f81632121_1349;
// 9070
f81632121_1349.returns.push(undefined);
// 9071
o96.timer = null;
// 9072
f81632121_14.returns.push(undefined);
// 9074
f81632121_1350 = function() { return f81632121_1350.returns[f81632121_1350.inst++]; };
f81632121_1350.returns = [];
f81632121_1350.inst = 0;
// 9075
o96._shouldSuppressJS = f81632121_1350;
// 9077
f81632121_1339.returns.push(undefined);
// 9078
f81632121_1350.returns.push(false);
// 9079
f81632121_1351 = function() { return f81632121_1351.returns[f81632121_1351.inst++]; };
f81632121_1351.returns = [];
f81632121_1351.inst = 0;
// 9080
o96._handleJSResponse = f81632121_1351;
// 9081
f81632121_1352 = function() { return f81632121_1352.returns[f81632121_1352.inst++]; };
f81632121_1352.returns = [];
f81632121_1352.inst = 0;
// 9082
o96.getRelativeTo = f81632121_1352;
// 9083
o96.relativeTo = null;
// 9084
f81632121_1352.returns.push(null);
// 9085
f81632121_1353 = function() { return f81632121_1353.returns[f81632121_1353.inst++]; };
f81632121_1353.returns = [];
f81632121_1353.inst = 0;
// 9086
o96._handleJSRegisters = f81632121_1353;
// 9087
f81632121_1353.returns.push(undefined);
// 9088
o96.lid = void 0;
// 9090
f81632121_1353.returns.push(undefined);
// 9091
f81632121_1351.returns.push(undefined);
// 9092
o96.finallyHandler = f81632121_1349;
// 9093
f81632121_1349.returns.push(undefined);
// 9094
f81632121_1341.returns.push(undefined);
// 9101
o118 = {};
// 9102
f81632121_508.returns.push(o118);
// 9103
o118.nodeName = "A";
// 9104
o118.__FB_TOKEN = void 0;
// 9105
// 9106
o118.getAttribute = f81632121_506;
// 9107
o118.hasAttribute = f81632121_507;
// 9109
f81632121_507.returns.push(false);
// 9110
o118.JSBNG__addEventListener = f81632121_468;
// 9112
f81632121_468.returns.push(undefined);
// 9113
f81632121_1355 = function() { return f81632121_1355.returns[f81632121_1355.inst++]; };
f81632121_1355.returns = [];
f81632121_1355.inst = 0;
// 9114
o118.JSBNG__onclick = f81632121_1355;
// 9117
// 9120
o120 = {};
// 9121
o121 = {};
// 9123
o120.nodeType = void 0;
// 9124
o120.length = 1;
// 9125
o120["0"] = "OSd/n";
// 9133
o122 = {};
// 9134
f81632121_508.returns.push(o122);
// 9135
o122.getElementsByTagName = f81632121_502;
// 9137
o122.querySelectorAll = f81632121_504;
// 9138
o123 = {};
// 9139
f81632121_504.returns.push(o123);
// 9140
o123.length = 1;
// 9141
o124 = {};
// 9142
o123["0"] = o124;
// undefined
o123 = null;
// 9145
o124.__FB_TOKEN = void 0;
// 9146
// 9149
o123 = {};
// 9150
f81632121_508.returns.push(o123);
// 9151
o123.getElementsByTagName = f81632121_502;
// 9153
o123.querySelectorAll = f81632121_504;
// undefined
o123 = null;
// 9154
o123 = {};
// 9155
f81632121_504.returns.push(o123);
// 9156
o123.length = 1;
// 9157
o125 = {};
// 9158
o123["0"] = o125;
// undefined
o123 = null;
// 9159
o125.__FB_TOKEN = void 0;
// 9160
// 9163
o123 = {};
// 9164
f81632121_508.returns.push(o123);
// 9165
o123.getElementsByTagName = f81632121_502;
// 9167
o123.querySelectorAll = f81632121_504;
// 9168
o126 = {};
// 9169
f81632121_504.returns.push(o126);
// 9170
o126.length = 1;
// 9171
o127 = {};
// 9172
o126["0"] = o127;
// undefined
o126 = null;
// 9173
o127.__FB_TOKEN = void 0;
// 9174
// 9177
o126 = {};
// 9178
f81632121_476.returns.push(o126);
// 9179
// 9180
// 9181
o126.getElementsByTagName = f81632121_502;
// 9182
o128 = {};
// 9183
f81632121_502.returns.push(o128);
// 9184
o128.length = 0;
// undefined
o128 = null;
// 9186
o128 = {};
// 9187
o126.childNodes = o128;
// undefined
o126 = null;
// 9188
o128.nodeType = void 0;
// undefined
o128 = null;
// 9190
o126 = {};
// 9191
f81632121_476.returns.push(o126);
// 9192
// 9193
// 9194
o126.getElementsByTagName = f81632121_502;
// 9195
o128 = {};
// 9196
f81632121_502.returns.push(o128);
// 9197
o128.length = 0;
// undefined
o128 = null;
// 9199
o128 = {};
// 9200
o126.childNodes = o128;
// undefined
o126 = null;
// 9201
o128.nodeType = void 0;
// undefined
o128 = null;
// 9203
o126 = {};
// 9204
f81632121_476.returns.push(o126);
// 9205
// 9206
// 9207
o126.getElementsByTagName = f81632121_502;
// 9208
o128 = {};
// 9209
f81632121_502.returns.push(o128);
// 9210
o128.length = 0;
// undefined
o128 = null;
// 9212
o128 = {};
// 9213
o126.childNodes = o128;
// undefined
o126 = null;
// 9214
o128.nodeType = void 0;
// undefined
o128 = null;
// 9216
o126 = {};
// 9217
f81632121_476.returns.push(o126);
// 9218
// 9219
// 9220
o126.getElementsByTagName = f81632121_502;
// 9221
o128 = {};
// 9222
f81632121_502.returns.push(o128);
// 9223
o128.length = 0;
// undefined
o128 = null;
// 9225
o128 = {};
// 9226
o126.childNodes = o128;
// undefined
o126 = null;
// 9227
o128.nodeType = void 0;
// undefined
o128 = null;
// 9229
o126 = {};
// 9230
f81632121_476.returns.push(o126);
// 9231
// 9232
// 9233
o126.getElementsByTagName = f81632121_502;
// 9234
o128 = {};
// 9235
f81632121_502.returns.push(o128);
// 9236
o128.length = 0;
// undefined
o128 = null;
// 9238
o128 = {};
// 9239
o126.childNodes = o128;
// undefined
o126 = null;
// 9240
o128.nodeType = void 0;
// undefined
o128 = null;
// 9242
o126 = {};
// 9243
f81632121_476.returns.push(o126);
// 9244
// 9245
// 9246
o126.getElementsByTagName = f81632121_502;
// 9247
o128 = {};
// 9248
f81632121_502.returns.push(o128);
// 9249
o128.length = 0;
// undefined
o128 = null;
// 9251
o128 = {};
// 9252
o126.childNodes = o128;
// undefined
o126 = null;
// 9253
o128.nodeType = void 0;
// undefined
o128 = null;
// 9258
o126 = {};
// 9259
f81632121_508.returns.push(o126);
// undefined
o126 = null;
// 9262
o126 = {};
// 9263
f81632121_508.returns.push(o126);
// undefined
o126 = null;
// 9265
o126 = {};
// 9266
o16.classList = o126;
// 9268
o126.contains = f81632121_513;
// undefined
o126 = null;
// 9269
f81632121_513.returns.push(false);
// 9272
o126 = {};
// 9273
f81632121_508.returns.push(o126);
// 9275
o128 = {};
// 9276
f81632121_508.returns.push(o128);
// 9277
o126.__FB_TOKEN = void 0;
// 9278
// 9281
o129 = {};
// 9282
f81632121_508.returns.push(o129);
// undefined
o129 = null;
// 9284
o129 = {};
// 9285
f81632121_508.returns.push(o129);
// 9287
o130 = {};
// 9288
f81632121_508.returns.push(o130);
// undefined
o130 = null;
// 9290
o130 = {};
// 9291
f81632121_508.returns.push(o130);
// 9293
o131 = {};
// 9294
f81632121_508.returns.push(o131);
// 9295
o129.getElementsByTagName = f81632121_502;
// 9297
o129.querySelectorAll = f81632121_504;
// 9298
o132 = {};
// 9299
f81632121_504.returns.push(o132);
// 9300
o132.length = 1;
// 9301
o133 = {};
// 9302
o132["0"] = o133;
// undefined
o132 = null;
// 9304
o132 = {};
// 9305
f81632121_476.returns.push(o132);
// undefined
o132 = null;
// 9306
o133.nodeName = "INPUT";
// 9307
o133.__FB_TOKEN = void 0;
// 9308
// 9309
o133.getAttribute = f81632121_506;
// 9310
o133.hasAttribute = f81632121_507;
// 9312
f81632121_507.returns.push(false);
// 9313
o133.JSBNG__addEventListener = f81632121_468;
// 9315
f81632121_468.returns.push(undefined);
// 9316
o133.JSBNG__onkeyup = null;
// 9318
o130.nodeName = "A";
// 9319
o130.__FB_TOKEN = void 0;
// 9320
// 9321
o130.getAttribute = f81632121_506;
// 9322
o130.hasAttribute = f81632121_507;
// 9324
f81632121_507.returns.push(false);
// 9325
o130.JSBNG__addEventListener = f81632121_468;
// 9327
f81632121_468.returns.push(undefined);
// 9328
o130.JSBNG__onclick = null;
// undefined
o130 = null;
// 9330
o133.tabIndex = 0;
// 9331
// 9332
f81632121_1398 = function() { return f81632121_1398.returns[f81632121_1398.inst++]; };
f81632121_1398.returns = [];
f81632121_1398.inst = 0;
// 9333
o133.JSBNG__focus = f81632121_1398;
// undefined
o133 = null;
// 9334
f81632121_1398.returns.push(undefined);
// 9335
o130 = {};
// 9336
o129.classList = o130;
// 9338
o130.contains = f81632121_513;
// undefined
o130 = null;
// 9339
f81632121_513.returns.push(false);
// 9340
o130 = {};
// 9341
o129.parentNode = o130;
// undefined
o129 = null;
// 9342
o129 = {};
// 9343
o130.classList = o129;
// 9345
o129.contains = f81632121_513;
// undefined
o129 = null;
// 9346
f81632121_513.returns.push(false);
// 9347
o129 = {};
// 9348
o130.parentNode = o129;
// undefined
o130 = null;
// 9349
o130 = {};
// 9350
o129.classList = o130;
// 9352
o130.contains = f81632121_513;
// undefined
o130 = null;
// 9353
f81632121_513.returns.push(false);
// 9354
o129.parentNode = o126;
// undefined
o129 = null;
// 9355
o129 = {};
// 9356
o126.classList = o129;
// 9358
o129.contains = f81632121_513;
// undefined
o129 = null;
// 9359
f81632121_513.returns.push(false);
// 9360
o126.parentNode = o128;
// undefined
o126 = null;
// 9361
o126 = {};
// 9362
o128.classList = o126;
// 9364
o126.contains = f81632121_513;
// undefined
o126 = null;
// 9365
f81632121_513.returns.push(true);
// 9366
o131.nodeName = "A";
// 9367
o131.__FB_TOKEN = void 0;
// 9368
// 9369
o131.getAttribute = f81632121_506;
// 9370
o131.hasAttribute = f81632121_507;
// 9372
f81632121_507.returns.push(false);
// 9373
o131.JSBNG__addEventListener = f81632121_468;
// 9375
f81632121_468.returns.push(undefined);
// 9376
o131.JSBNG__onclick = null;
// undefined
o131 = null;
// 9378
o128.getElementsByTagName = f81632121_502;
// 9380
o128.querySelectorAll = f81632121_504;
// undefined
o128 = null;
// 9381
o126 = {};
// 9382
f81632121_504.returns.push(o126);
// 9383
o126.length = 1;
// 9384
o128 = {};
// 9385
o126["0"] = o128;
// undefined
o126 = null;
// 9386
o128.nodeName = "A";
// 9387
o128.__FB_TOKEN = void 0;
// 9388
// 9389
o128.getAttribute = f81632121_506;
// 9390
o128.hasAttribute = f81632121_507;
// 9392
f81632121_507.returns.push(false);
// 9393
o128.JSBNG__addEventListener = f81632121_468;
// 9395
f81632121_468.returns.push(undefined);
// 9396
o128.JSBNG__onclick = null;
// undefined
o128 = null;
// 9400
o126 = {};
// 9401
f81632121_508.returns.push(o126);
// undefined
o126 = null;
// 9402
o126 = {};
// 9403
o128 = {};
// 9405
o126.nodeType = void 0;
// 9406
o126.length = 1;
// 9407
o126["0"] = "+P3v8";
// 9411
f81632121_467.returns.push(1374851226185);
// 9413
f81632121_467.returns.push(1374851226187);
// 9415
f81632121_467.returns.push(1374851226187);
// 9416
f81632121_14.returns.push(undefined);
// 9417
f81632121_12.returns.push(34);
// 9418
f81632121_14.returns.push(undefined);
// 9422
o129 = {};
// 9423
o130 = {};
// 9425
o129.nodeType = void 0;
// 9426
o129.length = 1;
// 9427
o129["0"] = "mBpeN";
// 9433
f81632121_13.returns.push(35);
// 9434
o3.onLine = true;
// 9436
f81632121_467.returns.push(1374851226278);
// 9437
f81632121_1413 = function() { return f81632121_1413.returns[f81632121_1413.inst++]; };
f81632121_1413.returns = [];
f81632121_1413.inst = 0;
// 9438
f81632121_1349.thatReturnsThis = f81632121_1413;
// 9442
o131 = {};
// 9443
o132 = {};
// 9445
o131.nodeType = void 0;
// 9446
o131.length = 1;
// 9447
o131["0"] = "C6rJk";
// 9449
o133 = {};
// 9453
f81632121_467.returns.push(1374851226295);
// 9455
f81632121_12.returns.push(36);
// 9456
o133.cancelBubble = false;
// 9457
o133.returnValue = true;
// 9460
o133.srcElement = o109;
// 9462
o133.target = o109;
// 9469
f81632121_506.returns.push(null);
// 9475
f81632121_506.returns.push(null);
// 9481
f81632121_506.returns.push(null);
// 9487
f81632121_506.returns.push(null);
// 9493
f81632121_506.returns.push(null);
// 9499
f81632121_506.returns.push(null);
// 9505
f81632121_506.returns.push(null);
// 9511
f81632121_506.returns.push(null);
// 9516
o133.JSBNG__screenX = 970;
// 9517
o133.JSBNG__screenY = 511;
// 9518
o133.altKey = false;
// 9519
o133.bubbles = true;
// 9520
o133.button = 0;
// 9521
o133.buttons = void 0;
// 9522
o133.cancelable = false;
// 9523
o133.clientX = 902;
// 9524
o133.clientY = 346;
// 9525
o133.ctrlKey = false;
// 9526
o133.currentTarget = o0;
// 9527
o133.defaultPrevented = false;
// 9528
o133.detail = 0;
// 9529
o133.eventPhase = 3;
// 9530
o133.isTrusted = void 0;
// 9531
o133.metaKey = false;
// 9532
o133.pageX = 902;
// 9533
o133.pageY = 346;
// 9534
o133.relatedTarget = null;
// 9535
o133.fromElement = null;
// 9538
o133.shiftKey = false;
// 9541
o133.timeStamp = 1374851226294;
// 9542
o133.type = "mousemove";
// 9543
o133.view = ow81632121;
// undefined
o133 = null;
// 9546
f81632121_1417 = function() { return f81632121_1417.returns[f81632121_1417.inst++]; };
f81632121_1417.returns = [];
f81632121_1417.inst = 0;
// 9547
f81632121_1349.thatReturnsFalse = f81632121_1417;
// 9555
f81632121_1418 = function() { return f81632121_1418.returns[f81632121_1418.inst++]; };
f81632121_1418.returns = [];
f81632121_1418.inst = 0;
// 9556
f81632121_1349.thatReturns = f81632121_1418;
// 9557
f81632121_1418.returns.push({__JSBNG_unknown_function:true});
// 9558
o133 = {};
// 9559
o134 = {};
// 9561
o133.nodeType = void 0;
// 9562
o133.length = 1;
// 9563
o133["0"] = "97Zhe";
// 9569
o0.selection = void 0;
// 9571
o135 = {};
// 9572
f81632121_476.returns.push(o135);
// undefined
o135 = null;
// 9573
o17.__FB_TOKEN = void 0;
// 9574
// 9578
o135 = {};
// 9579
f81632121_504.returns.push(o135);
// 9580
o135.length = 1;
// 9581
o136 = {};
// 9582
o135["0"] = o136;
// undefined
o135 = null;
// 9586
o135 = {};
// 9587
f81632121_504.returns.push(o135);
// 9588
o135.length = 1;
// 9589
o135["0"] = o19;
// undefined
o135 = null;
// 9593
o135 = {};
// 9594
f81632121_504.returns.push(o135);
// 9595
o135.length = 1;
// 9596
o137 = {};
// 9597
o135["0"] = o137;
// undefined
o135 = null;
// 9601
o135 = {};
// 9602
f81632121_504.returns.push(o135);
// 9603
o135.length = 1;
// 9604
o138 = {};
// 9605
o135["0"] = o138;
// undefined
o135 = null;
// undefined
o138 = null;
// 9606
o136.ownerDocument = o0;
// 9607
o0.defaultView = ow81632121;
// 9609
// 9610
// 9611
// 9612
// 9613
o19.nodeName = "INPUT";
// 9614
o135 = {};
// 9615
o136.classList = o135;
// 9617
o135.contains = f81632121_513;
// 9618
f81632121_513.returns.push(true);
// 9620
o19.selectionStart = 0;
// 9621
o19.selectionEnd = 0;
// undefined
o19 = null;
// 9626
f81632121_513.returns.push(false);
// 9628
o19 = {};
// undefined
fo81632121_1423_firstChild = function() { return fo81632121_1423_firstChild.returns[fo81632121_1423_firstChild.inst++]; };
fo81632121_1423_firstChild.returns = [];
fo81632121_1423_firstChild.inst = 0;
defineGetter(o136, "firstChild", fo81632121_1423_firstChild, undefined);
// undefined
fo81632121_1423_firstChild.returns.push(o19);
// undefined
fo81632121_1423_firstChild.returns.push(o19);
// 9631
o19.parentNode = o136;
// 9633
o136.removeChild = f81632121_521;
// 9634
f81632121_521.returns.push(o19);
// undefined
o19 = null;
// undefined
fo81632121_1423_firstChild.returns.push(null);
// 9637
o19 = {};
// 9638
f81632121_474.returns.push(o19);
// 9640
o138 = {};
// 9641
f81632121_598.returns.push(o138);
// 9642
o19.appendChild = f81632121_478;
// 9643
f81632121_478.returns.push(o138);
// 9644
o136.appendChild = f81632121_478;
// 9645
f81632121_478.returns.push(o19);
// undefined
o19 = null;
// 9648
o18.add = f81632121_602;
// undefined
o18 = null;
// 9649
f81632121_602.returns.push(undefined);
// 9652
o135.remove = f81632121_1114;
// undefined
o135 = null;
// 9653
f81632121_1114.returns.push(undefined);
// 9654
// 9655
// 9657
o17.contains = f81632121_645;
// 9659
f81632121_645.returns.push(false);
// 9660
o18 = {};
// 9661
o137.classList = o18;
// undefined
o137 = null;
// 9663
o18.remove = f81632121_1114;
// undefined
o18 = null;
// 9664
f81632121_1114.returns.push(undefined);
// 9668
f81632121_645.returns.push(false);
// 9669
o136.nodeName = "DIV";
// 9670
o136.__FB_TOKEN = void 0;
// 9671
// 9672
o136.getAttribute = f81632121_506;
// 9673
o136.hasAttribute = f81632121_507;
// 9675
f81632121_507.returns.push(false);
// 9676
o136.JSBNG__addEventListener = f81632121_468;
// 9678
f81632121_468.returns.push(undefined);
// 9679
o136.JSBNG__onkeydown = null;
// 9684
f81632121_468.returns.push(undefined);
// 9685
o136.JSBNG__onkeyup = null;
// 9690
f81632121_468.returns.push(undefined);
// 9691
o136.JSBNG__onkeypress = null;
// 9697
f81632121_468.returns.push(undefined);
// 9698
o136.JSBNG__onmousedown = null;
// 9703
f81632121_468.returns.push(undefined);
// 9704
o136.JSBNG__onmouseup = null;
// 9709
f81632121_468.returns.push(undefined);
// 9710
o136.JSBNG__oncut = null;
// 9715
f81632121_468.returns.push(undefined);
// 9716
o136.JSBNG__onpaste = null;
// 9721
f81632121_468.returns.push(undefined);
// 9722
o136.JSBNG__ondrop = null;
// 9727
f81632121_468.returns.push(undefined);
// 9728
o136.JSBNG__ondragover = null;
// 9733
f81632121_468.returns.push(undefined);
// 9734
o136.JSBNG__onJSBNG__focus = void 0;
// 9739
f81632121_468.returns.push(undefined);
// 9740
o136.JSBNG__onJSBNG__blur = void 0;
// 9742
// 9743
// 9746
o18 = {};
// 9747
f81632121_508.returns.push(o18);
// undefined
o18 = null;
// 9749
o18 = {};
// 9750
f81632121_508.returns.push(o18);
// 9752
o19 = {};
// 9753
f81632121_508.returns.push(o19);
// 9754
o18.nodeName = "BUTTON";
// 9755
o18.__FB_TOKEN = void 0;
// 9756
// 9757
o18.getAttribute = f81632121_506;
// 9758
o18.hasAttribute = f81632121_507;
// 9760
f81632121_507.returns.push(false);
// 9761
o18.JSBNG__addEventListener = f81632121_468;
// 9763
f81632121_468.returns.push(undefined);
// 9764
o18.JSBNG__onclick = null;
// undefined
o18 = null;
// 9766
o19.nodeName = "A";
// 9767
o19.__FB_TOKEN = void 0;
// 9768
// 9769
o19.getAttribute = f81632121_506;
// 9770
o19.hasAttribute = f81632121_507;
// 9772
f81632121_507.returns.push(false);
// 9773
o19.JSBNG__addEventListener = f81632121_468;
// 9775
f81632121_468.returns.push(undefined);
// 9776
o19.JSBNG__onclick = null;
// undefined
o19 = null;
// 9781
o18 = {};
// 9782
f81632121_70.returns.push(o18);
// 9783
// 9784
o18.open = f81632121_1294;
// 9785
f81632121_1294.returns.push(undefined);
// 9786
o18.setRequestHeader = f81632121_1295;
// 9787
f81632121_1295.returns.push(undefined);
// 9789
o18.send = f81632121_1296;
// 9790
f81632121_1296.returns.push(undefined);
// 9792
o19 = {};
// 9793
f81632121_70.returns.push(o19);
// 9794
// 9795
o19.open = f81632121_1294;
// 9796
f81632121_1294.returns.push(undefined);
// 9797
o19.setRequestHeader = f81632121_1295;
// 9798
f81632121_1295.returns.push(undefined);
// 9800
o19.send = f81632121_1296;
// 9801
f81632121_1296.returns.push(undefined);
// 9803
o135 = {};
// 9804
f81632121_508.returns.push(o135);
// 9807
o135.__FB_TOKEN = void 0;
// 9808
// 9812
o137 = {};
// 9813
f81632121_508.returns.push(o137);
// 9815
o16.contains = f81632121_645;
// 9817
f81632121_645.returns.push(true);
// 9818
o139 = {};
// 9819
f81632121_4.returns.push(o139);
// 9820
f81632121_1442 = function() { return f81632121_1442.returns[f81632121_1442.inst++]; };
f81632121_1442.returns = [];
f81632121_1442.inst = 0;
// 9821
o139.getPropertyValue = f81632121_1442;
// undefined
o139 = null;
// 9822
f81632121_1442.returns.push("fixed");
// 9824
o139 = {};
// 9825
f81632121_508.returns.push(o139);
// 9826
o139.offsetHeight = 42;
// 9828
o140 = {};
// 9829
f81632121_508.returns.push(o140);
// 9830
o140.getElementsByTagName = f81632121_502;
// 9832
o140.querySelectorAll = f81632121_504;
// 9833
o141 = {};
// 9834
f81632121_504.returns.push(o141);
// 9835
o141.length = 1;
// 9836
o142 = {};
// 9837
o141["0"] = o142;
// undefined
o141 = null;
// 9841
o141 = {};
// 9842
f81632121_504.returns.push(o141);
// 9843
o141.length = 1;
// 9844
o143 = {};
// 9845
o141["0"] = o143;
// undefined
o141 = null;
// 9849
o141 = {};
// 9850
f81632121_504.returns.push(o141);
// 9851
o141.length = 1;
// 9852
o144 = {};
// 9853
o141["0"] = o144;
// undefined
o141 = null;
// undefined
o144 = null;
// 9857
o141 = {};
// 9858
f81632121_504.returns.push(o141);
// 9859
o141.length = 1;
// 9860
o141["0"] = o69;
// undefined
o141 = null;
// undefined
o69 = null;
// 9863
o22.contains = f81632121_513;
// undefined
o22 = null;
// 9864
f81632121_513.returns.push(true);
// 9866
o22 = {};
// 9867
f81632121_476.returns.push(o22);
// 9868
// 9869
o22.firstChild = null;
// 9870
o143.__html = void 0;
// 9872
o69 = {};
// 9873
f81632121_474.returns.push(o69);
// 9875
o22.appendChild = f81632121_478;
// 9876
f81632121_478.returns.push(o69);
// undefined
o69 = null;
// 9877
o142.nodeName = "DIV";
// 9878
o142.__FB_TOKEN = void 0;
// 9879
// 9880
o142.getAttribute = f81632121_506;
// 9881
o142.hasAttribute = f81632121_507;
// 9883
f81632121_507.returns.push(false);
// 9884
o142.JSBNG__addEventListener = f81632121_468;
// 9886
f81632121_468.returns.push(undefined);
// 9887
o142.JSBNG__onclick = null;
// 9892
f81632121_468.returns.push(undefined);
// 9893
o142.JSBNG__onmouseover = null;
// 9895
// 9896
o135.getElementsByTagName = f81632121_502;
// 9898
o135.querySelectorAll = f81632121_504;
// 9899
o69 = {};
// 9900
f81632121_504.returns.push(o69);
// 9901
o69.length = 1;
// 9902
o69["0"] = o17;
// undefined
o69 = null;
// 9903
o69 = {};
// 9904
o17.classList = o69;
// 9906
o69.contains = f81632121_513;
// undefined
o69 = null;
// 9907
f81632121_513.returns.push(true);
// 9911
o69 = {};
// 9912
f81632121_504.returns.push(o69);
// 9913
o69.length = 1;
// 9914
o69["0"] = o136;
// undefined
o69 = null;
// 9917
f81632121_1457 = function() { return f81632121_1457.returns[f81632121_1457.inst++]; };
f81632121_1457.returns = [];
f81632121_1457.inst = 0;
// 9918
o16.getAttributeNode = f81632121_1457;
// 9920
f81632121_1457.returns.push(null);
// 9923
o69 = {};
// 9924
f81632121_502.returns.push(o69);
// 9925
o69.length = 1952;
// 9926
o69["0"] = o82;
// 9927
o82.getAttributeNode = f81632121_1457;
// 9929
f81632121_1457.returns.push(null);
// 9931
o141 = {};
// 9932
o69["1"] = o141;
// 9933
o141.getAttributeNode = f81632121_1457;
// 9935
o144 = {};
// 9936
f81632121_1457.returns.push(o144);
// 9937
o144.value = "pagelet_bluebar";
// undefined
o144 = null;
// 9939
o69["2"] = o139;
// 9940
o139.getAttributeNode = f81632121_1457;
// 9942
o144 = {};
// 9943
f81632121_1457.returns.push(o144);
// 9944
o144.value = "blueBarHolder";
// undefined
o144 = null;
// 9946
o69["3"] = o137;
// undefined
o69 = null;
// 9947
o137.getAttributeNode = f81632121_1457;
// 9949
o69 = {};
// 9950
f81632121_1457.returns.push(o69);
// 9951
o69.value = "blueBar";
// undefined
o69 = null;
// 9955
f81632121_645.returns.push(true);
// 9956
o137.contains = f81632121_645;
// 9958
f81632121_645.returns.push(true);
// 9960
o69 = {};
// 9961
f81632121_476.returns.push(o69);
// 9962
o140.__html = void 0;
// 9964
o144 = {};
// 9965
f81632121_474.returns.push(o144);
// 9967
o69.appendChild = f81632121_478;
// 9968
f81632121_478.returns.push(o144);
// undefined
o144 = null;
// 9969
o69.__html = void 0;
// 9970
o69.mountComponentIntoNode = void 0;
// undefined
o69 = null;
// 9972
o69 = {};
// 9973
f81632121_476.returns.push(o69);
// 9974
// 9975
o69.firstChild = null;
// 9978
o144 = {};
// 9979
f81632121_474.returns.push(o144);
// 9981
o69.appendChild = f81632121_478;
// 9982
f81632121_478.returns.push(o144);
// undefined
o144 = null;
// 9984
o144 = {};
// 9985
f81632121_476.returns.push(o144);
// 9986
// 9987
o144.firstChild = null;
// 9988
o69.__html = void 0;
// 9990
o145 = {};
// 9991
f81632121_474.returns.push(o145);
// 9993
o144.appendChild = f81632121_478;
// 9994
f81632121_478.returns.push(o145);
// undefined
o145 = null;
// 9995
o145 = {};
// 9996
o144.classList = o145;
// 9998
o145.add = f81632121_602;
// 9999
f81632121_602.returns.push(undefined);
// 10000
o144.__FB_TOKEN = void 0;
// 10001
// 10002
o137.__FB_TOKEN = void 0;
// 10003
// 10004
o137.getAttribute = f81632121_506;
// 10005
o137.hasAttribute = f81632121_507;
// 10007
f81632121_507.returns.push(false);
// 10008
o137.parentNode = o139;
// 10009
o139.__FB_TOKEN = void 0;
// 10010
// 10011
o139.getAttribute = f81632121_506;
// 10012
o139.hasAttribute = f81632121_507;
// 10014
f81632121_507.returns.push(false);
// 10015
o139.parentNode = o141;
// 10016
o141.__FB_TOKEN = void 0;
// 10017
// 10018
o141.getAttribute = f81632121_506;
// 10019
o141.hasAttribute = f81632121_507;
// 10021
f81632121_507.returns.push(false);
// 10022
o141.parentNode = o82;
// 10023
o82.__FB_TOKEN = void 0;
// 10024
// 10026
o82.hasAttribute = f81632121_507;
// 10028
f81632121_507.returns.push(false);
// 10033
f81632121_507.returns.push(false);
// 10038
f81632121_507.returns.push(false);
// 10042
o144.id = "";
// 10043
// 10044
o136.setAttribute = f81632121_575;
// 10045
f81632121_575.returns.push(undefined);
// 10047
f81632121_575.returns.push(undefined);
// 10048
f81632121_12.returns.push(37);
// 10049
o146 = {};
// undefined
fo81632121_1467_style = function() { return fo81632121_1467_style.returns[fo81632121_1467_style.inst++]; };
fo81632121_1467_style.returns = [];
fo81632121_1467_style.inst = 0;
defineGetter(o144, "style", fo81632121_1467_style, undefined);
// undefined
fo81632121_1467_style.returns.push(o146);
// 10051
// undefined
fo81632121_1467_style.returns.push(o146);
// 10053
// 10056
o145.remove = f81632121_1114;
// undefined
o145 = null;
// 10057
f81632121_1114.returns.push(undefined);
// 10058
o145 = {};
// 10059
o137.classList = o145;
// 10061
o145.contains = f81632121_513;
// undefined
o145 = null;
// 10062
f81632121_513.returns.push(false);
// 10064
o145 = {};
// 10065
o139.classList = o145;
// 10067
o145.contains = f81632121_513;
// undefined
o145 = null;
// 10068
f81632121_513.returns.push(false);
// 10070
o145 = {};
// 10071
o141.classList = o145;
// undefined
o141 = null;
// 10073
o145.contains = f81632121_513;
// undefined
o145 = null;
// 10074
f81632121_513.returns.push(false);
// 10076
o141 = {};
// 10077
o82.classList = o141;
// 10079
o141.contains = f81632121_513;
// undefined
o141 = null;
// 10080
f81632121_513.returns.push(false);
// 10085
f81632121_513.returns.push(false);
// 10089
o102.contains = f81632121_513;
// undefined
o102 = null;
// 10090
f81632121_513.returns.push(false);
// 10092
o0.classList = void 0;
// 10093
o0.className = void 0;
// 10096
o144.__html = void 0;
// 10098
o102 = {};
// 10099
f81632121_474.returns.push(o102);
// 10101
o16.appendChild = f81632121_478;
// 10102
f81632121_478.returns.push(o102);
// undefined
o102 = null;
// 10106
f81632121_645.returns.push(true);
// 10107
o102 = {};
// 10108
f81632121_4.returns.push(o102);
// 10109
o102.getPropertyValue = f81632121_1442;
// undefined
o102 = null;
// 10110
f81632121_1442.returns.push("fixed");
// 10114
f81632121_513.returns.push(false);
// 10119
f81632121_513.returns.push(false);
// 10124
f81632121_513.returns.push(false);
// 10129
f81632121_513.returns.push(false);
// 10134
f81632121_513.returns.push(false);
// 10139
f81632121_513.returns.push(false);
// 10146
o102 = {};
// 10147
f81632121_4.returns.push(o102);
// 10148
o102.getPropertyValue = f81632121_1442;
// undefined
o102 = null;
// 10149
f81632121_1442.returns.push("static");
// 10154
f81632121_645.returns.push(false);
// undefined
fo81632121_1467_style.returns.push(o146);
// 10158
// 10159
o102 = {};
// undefined
fo81632121_1465_style = function() { return fo81632121_1465_style.returns[fo81632121_1465_style.inst++]; };
fo81632121_1465_style.returns = [];
fo81632121_1465_style.inst = 0;
defineGetter(o69, "style", fo81632121_1465_style, undefined);
// undefined
fo81632121_1465_style.returns.push(o102);
// 10161
// 10163
o141 = {};
// 10164
f81632121_4.returns.push(o141);
// 10165
o141.getPropertyValue = f81632121_1442;
// undefined
o141 = null;
// 10166
f81632121_1442.returns.push("ltr");
// undefined
fo81632121_1465_style.returns.push(o102);
// 10168
// undefined
o102 = null;
// 10169
o102 = {};
// 10170
o69.classList = o102;
// 10172
o102.add = f81632121_602;
// undefined
o102 = null;
// 10173
f81632121_602.returns.push(undefined);
// 10177
f81632121_602.returns.push(undefined);
// 10183
o8.contains = f81632121_645;
// 10185
f81632121_645.returns.push(true);
// 10186
f81632121_1481 = function() { return f81632121_1481.returns[f81632121_1481.inst++]; };
f81632121_1481.returns = [];
f81632121_1481.inst = 0;
// 10187
o137.getBoundingClientRect = f81632121_1481;
// 10188
o102 = {};
// 10189
f81632121_1481.returns.push(o102);
// 10190
o102.left = 0;
// 10191
o8.clientLeft = 0;
// 10192
o102.JSBNG__top = 0;
// undefined
o102 = null;
// 10193
o8.clientTop = 0;
// 10194
o137.offsetWidth = 1017;
// 10195
o137.offsetHeight = 42;
// undefined
fo81632121_1467_style.returns.push(o146);
// 10197
// undefined
fo81632121_1467_style.returns.push(o146);
// 10199
// undefined
o146 = null;
// 10203
f81632121_513.returns.push(false);
// 10208
f81632121_513.returns.push(false);
// 10213
f81632121_513.returns.push(false);
// 10218
f81632121_513.returns.push(false);
// 10223
f81632121_513.returns.push(false);
// 10228
f81632121_513.returns.push(false);
// 10240
f81632121_645.returns.push(false);
// 10242
o16.scrollLeft = 0;
// 10243
o16.scrollTop = 0;
// 10244
o102 = {};
// undefined
fo81632121_1467_style.returns.push(o102);
// 10246
// undefined
fo81632121_1467_style.returns.push(o102);
// 10248
// 10252
f81632121_513.returns.push(false);
// 10257
f81632121_513.returns.push(false);
// 10262
f81632121_513.returns.push(false);
// 10267
f81632121_513.returns.push(false);
// 10272
f81632121_513.returns.push(false);
// 10277
f81632121_513.returns.push(false);
// 10287
o141 = {};
// 10288
f81632121_4.returns.push(o141);
// 10289
o141.getPropertyValue = f81632121_1442;
// undefined
o141 = null;
// 10290
f81632121_1442.returns.push("static");
// 10291
o141 = {};
// 10292
f81632121_4.returns.push(o141);
// 10293
o141.getPropertyValue = f81632121_1442;
// undefined
o141 = null;
// 10294
f81632121_1442.returns.push("static");
// 10295
o141 = {};
// 10296
f81632121_4.returns.push(o141);
// 10297
o141.getPropertyValue = f81632121_1442;
// undefined
o141 = null;
// 10298
f81632121_1442.returns.push("static");
// 10299
o141 = {};
// 10300
f81632121_4.returns.push(o141);
// 10301
o141.getPropertyValue = f81632121_1442;
// undefined
o141 = null;
// 10302
f81632121_1442.returns.push("fixed");
// 10303
o141 = {};
// 10304
f81632121_4.returns.push(o141);
// 10305
o141.getPropertyValue = f81632121_1442;
// undefined
o141 = null;
// 10306
f81632121_1442.returns.push("300");
// undefined
fo81632121_1467_style.returns.push(o102);
// 10308
// 10310
o69.nodeName = "DIV";
// 10311
o69.__FB_TOKEN = void 0;
// 10312
// 10313
o69.getAttribute = f81632121_506;
// 10314
o69.hasAttribute = f81632121_507;
// 10316
f81632121_507.returns.push(false);
// 10317
o69.JSBNG__addEventListener = f81632121_468;
// 10319
f81632121_468.returns.push(undefined);
// 10320
o69.JSBNG__onmouseover = null;
// 10325
f81632121_468.returns.push(undefined);
// 10326
o69.JSBNG__onmouseout = null;
// undefined
o69 = null;
// 10328
f81632121_12.returns.push(38);
// undefined
fo81632121_1467_style.returns.push(o102);
// 10330
// undefined
fo81632121_1467_style.returns.push(o102);
// 10332
// undefined
o102 = null;
// 10333
o144.setAttribute = f81632121_575;
// undefined
o144 = null;
// 10334
o137.id = "blueBar";
// 10335
f81632121_575.returns.push(undefined);
// 10339
f81632121_602.returns.push(undefined);
// 10344
f81632121_602.returns.push(undefined);
// 10345
o69 = {};
// undefined
fo81632121_1465_style.returns.push(o69);
// 10347
// undefined
o69 = null;
// 10348
o135.nodeName = "DIV";
// 10349
o135.getAttribute = f81632121_506;
// 10350
o135.hasAttribute = f81632121_507;
// 10352
f81632121_507.returns.push(false);
// 10353
o135.JSBNG__addEventListener = f81632121_468;
// 10355
f81632121_468.returns.push(undefined);
// 10356
o135.JSBNG__onkeydown = null;
// 10358
o69 = {};
// 10359
o135.parentNode = o69;
// undefined
o135 = null;
// 10360
o69.nodeName = "DIV";
// 10361
o69.__FB_TOKEN = void 0;
// 10362
// 10363
o69.getAttribute = f81632121_506;
// 10364
o69.hasAttribute = f81632121_507;
// 10366
f81632121_507.returns.push(false);
// 10367
o69.JSBNG__addEventListener = f81632121_468;
// 10369
f81632121_468.returns.push(undefined);
// 10370
o69.JSBNG__onmousedown = null;
// undefined
o69 = null;
// 10372
o140.nodeName = "DIV";
// 10373
o140.__FB_TOKEN = void 0;
// 10374
// 10375
o140.getAttribute = f81632121_506;
// 10376
o140.hasAttribute = f81632121_507;
// 10378
f81632121_507.returns.push(false);
// 10379
o140.JSBNG__addEventListener = f81632121_468;
// 10381
f81632121_468.returns.push(undefined);
// 10382
o140.JSBNG__onmousedown = null;
// undefined
o140 = null;
// 10388
f81632121_468.returns.push(undefined);
// 10389
o16.JSBNG__onmouseup = null;
// 10391
f81632121_7.returns.push(undefined);
// 10392
ow81632121.JSBNG__onJSBNG__blur = undefined;
// 10394
o69 = {};
// 10395
o143.classList = o69;
// undefined
o143 = null;
// 10397
o69.remove = f81632121_1114;
// undefined
o69 = null;
// 10398
f81632121_1114.returns.push(undefined);
// 10399
o69 = {};
// 10400
o22.classList = o69;
// undefined
o22 = null;
// 10402
o69.remove = f81632121_1114;
// undefined
o69 = null;
// 10403
f81632121_1114.returns.push(undefined);
// 10404
f81632121_12.returns.push(39);
// 10406
f81632121_12.returns.push(40);
// 10407
o22 = {};
// 10408
o136.childNodes = o22;
// 10409
o22.nodeType = void 0;
// 10411
o69 = {};
// 10412
f81632121_476.returns.push(o69);
// 10413
o69.firstChild = null;
// 10415
o102 = {};
// 10416
f81632121_474.returns.push(o102);
// 10418
o135 = {};
// 10419
f81632121_598.returns.push(o135);
// 10420
o102.appendChild = f81632121_478;
// 10421
f81632121_478.returns.push(o135);
// undefined
o135 = null;
// 10422
o69.appendChild = f81632121_478;
// 10423
f81632121_478.returns.push(o102);
// undefined
o102 = null;
// 10424
o102 = {};
// 10425
o69.classList = o102;
// 10427
o102.add = f81632121_602;
// undefined
o102 = null;
// 10428
f81632121_602.returns.push(undefined);
// 10432
f81632121_602.returns.push(undefined);
// 10433
o69.setAttribute = f81632121_575;
// 10434
f81632121_575.returns.push(undefined);
// 10436
f81632121_575.returns.push(undefined);
// 10438
f81632121_575.returns.push(undefined);
// 10440
f81632121_575.returns.push(undefined);
// 10442
f81632121_575.returns.push(undefined);
// 10444
f81632121_575.returns.push(undefined);
// 10446
f81632121_575.returns.push(undefined);
// 10448
f81632121_575.returns.push(undefined);
// 10450
o102 = {};
// 10451
f81632121_476.returns.push(o102);
// 10452
o102.setAttribute = f81632121_575;
// 10454
f81632121_575.returns.push(undefined);
// 10455
o102.firstChild = null;
// 10457
o135 = {};
// 10458
f81632121_474.returns.push(o135);
// 10460
o140 = {};
// 10461
f81632121_598.returns.push(o140);
// 10462
o135.appendChild = f81632121_478;
// 10463
f81632121_478.returns.push(o140);
// undefined
o140 = null;
// 10464
o102.appendChild = f81632121_478;
// 10465
f81632121_478.returns.push(o135);
// undefined
o135 = null;
// undefined
fo81632121_1423_firstChild.returns.push(o138);
// undefined
fo81632121_1423_firstChild.returns.push(o138);
// 10468
o138.parentNode = o136;
// 10471
f81632121_521.returns.push(o138);
// undefined
o138 = null;
// undefined
fo81632121_1423_firstChild.returns.push(null);
// 10474
o135 = {};
// 10475
f81632121_474.returns.push(o135);
// 10476
o69.__html = void 0;
// undefined
o69 = null;
// 10477
o102.__html = void 0;
// undefined
o102 = null;
// 10479
f81632121_478.returns.push(o135);
// undefined
o135 = null;
// undefined
fo81632121_1423_firstChild.returns.push(null);
// 10481
o136.lastChild = null;
// 10482
o136.getElementsByTagName = f81632121_502;
// 10483
o69 = {};
// 10484
f81632121_502.returns.push(o69);
// 10485
o69.nodeType = void 0;
// 10487
o102 = {};
// 10488
f81632121_502.returns.push(o102);
// 10489
o102.nodeType = void 0;
// 10490
o69.parentNode = void 0;
// undefined
o69 = null;
// 10491
o102.parentNode = void 0;
// undefined
o102 = null;
// undefined
fo81632121_1423_firstChild.returns.push(null);
// 10495
o22.nodeName = void 0;
// 10497
o22.nextSibling = void 0;
// 10498
o22.parentNode = void 0;
// undefined
fo81632121_1423_firstChild.returns.push(null);
// 10503
f81632121_1114.returns.push(undefined);
// 10507
f81632121_645.returns.push(false);
// 10514
f81632121_645.returns.push(false);
// 10515
o69 = {};
// 10516
f81632121_4.returns.push(o69);
// 10517
o69.getPropertyValue = f81632121_1442;
// undefined
o69 = null;
// 10518
f81632121_1442.returns.push("14px");
// 10519
o17.offsetWidth = 550;
// 10520
o17.offsetHeight = 23;
// 10524
o69 = {};
// 10525
f81632121_504.returns.push(o69);
// 10526
o69.length = 1;
// 10527
o69["0"] = o136;
// undefined
o69 = null;
// undefined
o136 = null;
// 10530
o22.offsetWidth = void 0;
// 10531
o22.offsetHeight = void 0;
// undefined
o22 = null;
// 10532
o22 = {};
// 10533
o17.style = o22;
// 10534
// undefined
o22 = null;
// 10535
o22 = {};
// 10536
o142.style = o22;
// undefined
o142 = null;
// 10537
// undefined
o22 = null;
// 10538
// 10539
// 10540
// 10542
f81632121_508.returns.push(o137);
// 10543
o137.getElementsByTagName = f81632121_502;
// 10545
o137.querySelectorAll = f81632121_504;
// 10546
o22 = {};
// 10547
f81632121_504.returns.push(o22);
// 10548
o22.length = 1;
// 10549
o69 = {};
// 10550
o22["0"] = o69;
// undefined
o22 = null;
// 10551
o69.nodeName = "I";
// 10552
o69.__FB_TOKEN = void 0;
// 10553
// 10554
o69.getAttribute = f81632121_506;
// 10555
o69.hasAttribute = f81632121_507;
// 10557
f81632121_507.returns.push(false);
// 10558
o69.JSBNG__addEventListener = f81632121_468;
// 10560
f81632121_468.returns.push(undefined);
// 10561
o69.JSBNG__onclick = null;
// undefined
o69 = null;
// 10564
f81632121_467.returns.push(1374851232234);
// 10566
o22 = {};
// 10567
f81632121_70.returns.push(o22);
// 10568
// 10569
o22.open = f81632121_1294;
// 10570
f81632121_1294.returns.push(undefined);
// 10571
o22.setRequestHeader = f81632121_1295;
// 10572
f81632121_1295.returns.push(undefined);
// 10574
o22.send = f81632121_1296;
// 10575
f81632121_1296.returns.push(undefined);
// 10577
f81632121_467.returns.push(1374851232237);
// 10579
o69 = {};
// 10580
f81632121_70.returns.push(o69);
// 10581
// 10582
o69.open = f81632121_1294;
// 10583
f81632121_1294.returns.push(undefined);
// 10584
o69.setRequestHeader = f81632121_1295;
// 10585
f81632121_1295.returns.push(undefined);
// 10587
o69.send = f81632121_1296;
// 10588
f81632121_1296.returns.push(undefined);
// 10591
f81632121_467.returns.push(1374851232242);
// 10593
f81632121_508.returns.push(null);
// 10598
o102 = {};
// 10599
o135 = {};
// 10601
o102.transport = o18;
// 10602
o18.readyState = 1;
// 10603
o136 = {};
// 10604
o138 = {};
// 10606
o136.transport = o19;
// 10607
o19.readyState = 1;
// 10608
o140 = {};
// 10609
o141 = {};
// 10611
o140.transport = o22;
// 10612
o22.readyState = 1;
// 10613
o142 = {};
// 10614
o143 = {};
// 10616
o142.transport = o69;
// 10617
o69.readyState = 1;
// 10618
o144 = {};
// 10619
o145 = {};
// 10621
o144.nodeType = void 0;
// 10622
o144.length = 1;
// 10623
o144["0"] = "G3fzU";
// 10628
f81632121_508.returns.push(o124);
// 10630
f81632121_508.returns.push(o122);
// 10633
f81632121_467.returns.push(1374851232942);
// 10644
o122.getAttributeNode = f81632121_1457;
// 10646
o146 = {};
// 10647
f81632121_1457.returns.push(o146);
// 10648
o146.value = "fbMessagesJewel";
// undefined
o146 = null;
// 10651
o146 = {};
// 10652
f81632121_502.returns.push(o146);
// 10653
o146.length = 41;
// 10654
o147 = {};
// 10655
o146["0"] = o147;
// 10656
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10658
f81632121_1457.returns.push(null);
// 10660
o147 = {};
// 10661
o146["1"] = o147;
// 10662
o147.getAttributeNode = f81632121_1457;
// 10664
o148 = {};
// 10665
f81632121_1457.returns.push(o148);
// 10666
o148.value = "mercurymessagesCountWrapper";
// undefined
o148 = null;
// 10668
o148 = {};
// 10669
o146["2"] = o148;
// undefined
o146 = null;
// 10670
o148.getAttributeNode = f81632121_1457;
// 10672
o146 = {};
// 10673
f81632121_1457.returns.push(o146);
// 10674
o146.value = "mercurymessagesCountValue";
// undefined
o146 = null;
// 10676
o122.contains = f81632121_645;
// 10678
f81632121_645.returns.push(true);
// 10683
o146 = {};
// 10684
f81632121_504.returns.push(o146);
// 10685
o146.length = 1;
// 10686
o146["0"] = o147;
// undefined
o146 = null;
// 10688
o147.querySelectorAll = f81632121_504;
// undefined
o147 = null;
// 10689
o146 = {};
// 10690
f81632121_504.returns.push(o146);
// 10691
o146.length = 1;
// 10692
o146["0"] = o148;
// undefined
o146 = null;
// 10693
o146 = {};
// undefined
fo81632121_1527_firstChild = function() { return fo81632121_1527_firstChild.returns[fo81632121_1527_firstChild.inst++]; };
fo81632121_1527_firstChild.returns = [];
fo81632121_1527_firstChild.inst = 0;
defineGetter(o148, "firstChild", fo81632121_1527_firstChild, undefined);
// undefined
fo81632121_1527_firstChild.returns.push(o146);
// undefined
fo81632121_1527_firstChild.returns.push(o146);
// 10696
o146.parentNode = o148;
// 10698
o148.removeChild = f81632121_521;
// 10699
f81632121_521.returns.push(o146);
// undefined
o146 = null;
// undefined
fo81632121_1527_firstChild.returns.push(null);
// 10702
o146 = {};
// 10703
f81632121_474.returns.push(o146);
// 10705
o147 = {};
// 10706
f81632121_598.returns.push(o147);
// 10707
o146.appendChild = f81632121_478;
// 10708
f81632121_478.returns.push(o147);
// undefined
o147 = null;
// 10709
o148.appendChild = f81632121_478;
// undefined
o148 = null;
// 10710
f81632121_478.returns.push(o146);
// undefined
o146 = null;
// 10711
o146 = {};
// 10712
o122.classList = o146;
// undefined
o122 = null;
// 10714
o146.remove = f81632121_1114;
// 10715
f81632121_1114.returns.push(undefined);
// 10718
o124.getElementsByTagName = f81632121_502;
// 10719
o124.getAttributeNode = f81632121_1457;
// 10721
o122 = {};
// 10722
f81632121_1457.returns.push(o122);
// 10723
o122.value = "fbMessagesFlyout";
// undefined
o122 = null;
// 10726
o122 = {};
// 10727
f81632121_502.returns.push(o122);
// 10728
o122.length = 36;
// 10729
o147 = {};
// 10730
o122["0"] = o147;
// 10731
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10733
f81632121_1457.returns.push(null);
// 10735
o147 = {};
// 10736
o122["1"] = o147;
// 10737
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10739
f81632121_1457.returns.push(null);
// 10741
o147 = {};
// 10742
o122["2"] = o147;
// 10743
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10745
f81632121_1457.returns.push(null);
// 10747
o147 = {};
// 10748
o122["3"] = o147;
// 10749
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10751
f81632121_1457.returns.push(null);
// 10753
o147 = {};
// 10754
o122["4"] = o147;
// 10755
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10757
f81632121_1457.returns.push(null);
// 10759
o147 = {};
// 10760
o122["5"] = o147;
// 10761
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10763
f81632121_1457.returns.push(null);
// 10765
o147 = {};
// 10766
o122["6"] = o147;
// 10767
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10769
f81632121_1457.returns.push(null);
// 10771
o147 = {};
// 10772
o122["7"] = o147;
// 10773
o147.getAttributeNode = f81632121_1457;
// undefined
o147 = null;
// 10775
f81632121_1457.returns.push(null);
// 10777
o122["8"] = o118;
// 10778
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10780
o118 = {};
// 10781
f81632121_1457.returns.push(o118);
// 10782
o118.value = "u_0_0";
// undefined
o118 = null;
// 10784
o118 = {};
// 10785
o122["9"] = o118;
// 10786
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10788
f81632121_1457.returns.push(null);
// 10790
o118 = {};
// 10791
o122["10"] = o118;
// 10792
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10794
f81632121_1457.returns.push(null);
// 10796
o118 = {};
// 10797
o122["11"] = o118;
// 10798
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10800
f81632121_1457.returns.push(null);
// 10802
o118 = {};
// 10803
o122["12"] = o118;
// 10804
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10806
f81632121_1457.returns.push(null);
// 10808
o118 = {};
// 10809
o122["13"] = o118;
// 10810
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10812
f81632121_1457.returns.push(null);
// 10814
o118 = {};
// 10815
o122["14"] = o118;
// 10816
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10818
f81632121_1457.returns.push(null);
// 10820
o118 = {};
// 10821
o122["15"] = o118;
// 10822
o118.getAttributeNode = f81632121_1457;
// undefined
o118 = null;
// 10824
f81632121_1457.returns.push(null);
// 10826
o122["16"] = o63;
// undefined
o122 = null;
// 10827
o63.getAttributeNode = f81632121_1457;
// undefined
o63 = null;
// 10829
o63 = {};
// 10830
f81632121_1457.returns.push(o63);
// 10831
o63.value = "MercuryJewelThreadList";
// undefined
o63 = null;
// 10833
o124.contains = f81632121_645;
// undefined
o124 = null;
// 10835
f81632121_645.returns.push(true);
// 10838
o146.contains = f81632121_513;
// undefined
o146 = null;
// 10839
f81632121_513.returns.push(false);
// 10842
f81632121_508.returns.push(o125);
// 10844
f81632121_508.returns.push(null);
// 10846
f81632121_508.returns.push(null);
// 10847
o125.nodeName = "DIV";
// 10848
o125.getAttribute = f81632121_506;
// 10849
o125.hasAttribute = f81632121_507;
// 10851
f81632121_507.returns.push(false);
// 10852
o125.JSBNG__addEventListener = f81632121_468;
// 10854
f81632121_468.returns.push(undefined);
// 10855
o125.JSBNG__onsubmit = null;
// 10857
o125.getElementsByTagName = f81632121_502;
// 10859
o125.querySelectorAll = f81632121_504;
// undefined
o125 = null;
// 10860
o63 = {};
// 10861
f81632121_504.returns.push(o63);
// 10862
o63.length = 0;
// undefined
o63 = null;
// 10865
f81632121_508.returns.push(o123);
// 10867
o63 = {};
// 10868
f81632121_508.returns.push(o63);
// 10870
f81632121_508.returns.push(o127);
// 10871
o127.getElementsByTagName = f81632121_502;
// 10873
o127.querySelectorAll = f81632121_504;
// undefined
o127 = null;
// 10874
o118 = {};
// 10875
f81632121_504.returns.push(o118);
// 10876
o118.length = 1;
// 10877
o122 = {};
// 10878
o118["0"] = o122;
// undefined
o118 = null;
// undefined
o122 = null;
// 10880
o118 = {};
// 10881
f81632121_508.returns.push(o118);
// undefined
o118 = null;
// 10883
// 10890
o118 = {};
// 10891
f81632121_504.returns.push(o118);
// 10892
o118.length = 1;
// 10893
o122 = {};
// 10894
o118["0"] = o122;
// undefined
o118 = null;
// 10896
o122.querySelectorAll = f81632121_504;
// 10897
o118 = {};
// 10898
f81632121_504.returns.push(o118);
// 10899
o118.length = 1;
// 10900
o124 = {};
// 10901
o118["0"] = o124;
// undefined
o118 = null;
// 10902
o118 = {};
// undefined
fo81632121_1562_firstChild = function() { return fo81632121_1562_firstChild.returns[fo81632121_1562_firstChild.inst++]; };
fo81632121_1562_firstChild.returns = [];
fo81632121_1562_firstChild.inst = 0;
defineGetter(o124, "firstChild", fo81632121_1562_firstChild, undefined);
// undefined
fo81632121_1562_firstChild.returns.push(o118);
// undefined
fo81632121_1562_firstChild.returns.push(o118);
// 10905
o118.parentNode = o124;
// 10907
o124.removeChild = f81632121_521;
// 10908
f81632121_521.returns.push(o118);
// undefined
o118 = null;
// undefined
fo81632121_1562_firstChild.returns.push(null);
// 10911
o118 = {};
// 10912
f81632121_474.returns.push(o118);
// 10914
o125 = {};
// 10915
f81632121_598.returns.push(o125);
// 10916
o118.appendChild = f81632121_478;
// 10917
f81632121_478.returns.push(o125);
// undefined
o125 = null;
// 10918
o124.appendChild = f81632121_478;
// 10919
f81632121_478.returns.push(o118);
// undefined
o118 = null;
// 10920
o118 = {};
// 10921
o123.classList = o118;
// 10923
o118.remove = f81632121_1114;
// 10924
f81632121_1114.returns.push(undefined);
// 10926
// 10927
o123.__FB_TOKEN = void 0;
// 10928
// 10929
o123.getAttribute = f81632121_506;
// 10930
o123.hasAttribute = f81632121_507;
// 10932
f81632121_507.returns.push(false);
// 10935
o118.contains = f81632121_513;
// undefined
o118 = null;
// 10936
f81632121_513.returns.push(false);
// 10939
f81632121_506.returns.push(null);
// 10940
o118 = {};
// 10941
o123.parentNode = o118;
// 10942
o118.__FB_TOKEN = void 0;
// 10943
// 10944
o118.getAttribute = f81632121_506;
// 10945
o118.hasAttribute = f81632121_507;
// 10947
f81632121_507.returns.push(false);
// 10948
o125 = {};
// 10949
o118.classList = o125;
// 10951
o125.contains = f81632121_513;
// undefined
o125 = null;
// 10952
f81632121_513.returns.push(false);
// 10955
f81632121_506.returns.push(null);
// 10956
o125 = {};
// 10957
o118.parentNode = o125;
// undefined
o118 = null;
// 10958
o125.__FB_TOKEN = void 0;
// 10959
// 10960
o125.getAttribute = f81632121_506;
// 10961
o125.hasAttribute = f81632121_507;
// 10963
f81632121_507.returns.push(false);
// 10964
o118 = {};
// 10965
o125.classList = o118;
// 10967
o118.contains = f81632121_513;
// undefined
o118 = null;
// 10968
f81632121_513.returns.push(false);
// 10971
f81632121_506.returns.push(null);
// 10972
o118 = {};
// 10973
o125.parentNode = o118;
// undefined
o125 = null;
// 10974
o118.__FB_TOKEN = void 0;
// 10975
// 10976
o118.getAttribute = f81632121_506;
// 10977
o118.hasAttribute = f81632121_507;
// 10979
f81632121_507.returns.push(false);
// 10980
o125 = {};
// 10981
o118.classList = o125;
// 10983
o125.contains = f81632121_513;
// undefined
o125 = null;
// 10984
f81632121_513.returns.push(false);
// 10987
f81632121_506.returns.push(null);
// 10988
o125 = {};
// 10989
o118.parentNode = o125;
// undefined
o118 = null;
// 10990
o125.__FB_TOKEN = void 0;
// 10991
// 10992
o125.getAttribute = f81632121_506;
// 10993
o125.hasAttribute = f81632121_507;
// 10995
f81632121_507.returns.push(false);
// 10996
o118 = {};
// 10997
o125.classList = o118;
// 10999
o118.contains = f81632121_513;
// undefined
o118 = null;
// 11000
f81632121_513.returns.push(false);
// 11003
f81632121_506.returns.push(null);
// 11004
o118 = {};
// 11005
o125.parentNode = o118;
// undefined
o125 = null;
// 11006
o118.__FB_TOKEN = void 0;
// 11007
// 11008
o118.getAttribute = f81632121_506;
// 11009
o118.hasAttribute = f81632121_507;
// 11011
f81632121_507.returns.push(false);
// 11012
o125 = {};
// 11013
o118.classList = o125;
// 11015
o125.contains = f81632121_513;
// undefined
o125 = null;
// 11016
f81632121_513.returns.push(false);
// 11019
f81632121_506.returns.push(null);
// 11020
o118.parentNode = o105;
// undefined
o118 = null;
// 11021
o105.__FB_TOKEN = void 0;
// 11022
// 11023
o105.getAttribute = f81632121_506;
// 11024
o105.hasAttribute = f81632121_507;
// 11026
f81632121_507.returns.push(false);
// 11027
o118 = {};
// 11028
o105.classList = o118;
// 11030
o118.contains = f81632121_513;
// undefined
o118 = null;
// 11031
f81632121_513.returns.push(false);
// 11034
f81632121_506.returns.push(null);
// 11035
o105.parentNode = o137;
// undefined
o105 = null;
// 11039
f81632121_507.returns.push(false);
// 11043
f81632121_513.returns.push(false);
// 11046
f81632121_506.returns.push(null);
// 11051
f81632121_507.returns.push(false);
// 11055
f81632121_513.returns.push(false);
// 11058
f81632121_506.returns.push(null);
// 11063
f81632121_507.returns.push(false);
// 11067
f81632121_513.returns.push(false);
// 11070
f81632121_506.returns.push(null);
// 11075
f81632121_507.returns.push(false);
// 11079
f81632121_513.returns.push(false);
// 11082
f81632121_506.returns.push(null);
// 11087
f81632121_507.returns.push(false);
// 11091
f81632121_513.returns.push(false);
// 11094
f81632121_506.returns.push(null);
// 11099
f81632121_507.returns.push(false);
// 11103
f81632121_513.returns.push(false);
// 11106
f81632121_506.returns.push(null);
// 11113
f81632121_12.returns.push(41);
// 11117
o105 = {};
// 11118
f81632121_504.returns.push(o105);
// 11119
o105.length = 1;
// 11120
o105["0"] = o122;
// undefined
o105 = null;
// undefined
o122 = null;
// 11123
o105 = {};
// 11124
f81632121_504.returns.push(o105);
// 11125
o105.length = 1;
// 11126
o105["0"] = o124;
// undefined
o105 = null;
// undefined
o124 = null;
// 11127
o63.nodeName = "UL";
// 11128
o63.__FB_TOKEN = void 0;
// 11129
// 11130
o63.getAttribute = f81632121_506;
// 11131
o63.hasAttribute = f81632121_507;
// 11133
f81632121_507.returns.push(false);
// 11134
o63.JSBNG__addEventListener = f81632121_468;
// 11136
f81632121_468.returns.push(undefined);
// 11137
o63.JSBNG__onmousedown = null;
// 11142
f81632121_468.returns.push(undefined);
// 11143
o63.JSBNG__onmouseout = null;
// 11148
f81632121_468.returns.push(undefined);
// 11149
o63.JSBNG__onmouseover = null;
// 11151
o123.nodeName = "DIV";
// 11155
f81632121_507.returns.push(false);
// 11156
o123.JSBNG__addEventListener = f81632121_468;
// 11158
f81632121_468.returns.push(undefined);
// 11159
o123.JSBNG__onmouseover = null;
// 11162
f81632121_508.returns.push(o123);
// undefined
o123 = null;
// 11166
o105 = {};
// 11167
f81632121_504.returns.push(o105);
// 11168
o105.length = 1;
// 11169
o105["0"] = o76;
// undefined
o105 = null;
// undefined
o76 = null;
// 11173
o76 = {};
// 11174
f81632121_504.returns.push(o76);
// 11175
o76.length = 1;
// 11176
o105 = {};
// 11177
o76["0"] = o105;
// undefined
o76 = null;
// 11179
o105.querySelectorAll = f81632121_504;
// 11180
o76 = {};
// 11181
f81632121_504.returns.push(o76);
// 11182
o76.length = 1;
// 11183
o118 = {};
// 11184
o76["0"] = o118;
// undefined
o76 = null;
// 11185
o76 = {};
// 11186
o118.classList = o76;
// 11188
o76.contains = f81632121_513;
// undefined
o76 = null;
// 11189
f81632121_513.returns.push(false);
// 11190
o76 = {};
// 11191
o118.parentNode = o76;
// 11192
o122 = {};
// 11193
o76.classList = o122;
// 11195
o122.contains = f81632121_513;
// undefined
o122 = null;
// 11196
f81632121_513.returns.push(false);
// 11197
o76.parentNode = o105;
// undefined
o76 = null;
// 11198
o76 = {};
// 11199
o105.classList = o76;
// undefined
o105 = null;
// 11201
o76.contains = f81632121_513;
// undefined
o76 = null;
// 11202
f81632121_513.returns.push(true);
// 11204
o118.nodeName = "A";
// 11205
o118.__FB_TOKEN = void 0;
// 11206
// 11207
o118.getAttribute = f81632121_506;
// 11208
o118.hasAttribute = f81632121_507;
// 11210
f81632121_507.returns.push(false);
// 11211
o118.JSBNG__addEventListener = f81632121_468;
// 11213
f81632121_468.returns.push(undefined);
// 11214
o118.JSBNG__onsuccess = void 0;
// 11216
f81632121_12.returns.push(42);
// 11220
f81632121_507.returns.push(false);
// 11224
f81632121_513.returns.push(false);
// 11227
f81632121_506.returns.push(null);
// 11232
f81632121_507.returns.push(false);
// 11236
f81632121_513.returns.push(false);
// 11239
f81632121_506.returns.push(null);
// 11244
f81632121_507.returns.push(false);
// 11248
f81632121_513.returns.push(false);
// 11251
f81632121_506.returns.push(null);
// 11256
f81632121_507.returns.push(false);
// 11260
f81632121_513.returns.push(false);
// 11263
f81632121_506.returns.push(null);
// 11268
f81632121_507.returns.push(false);
// 11272
f81632121_513.returns.push(false);
// 11275
f81632121_506.returns.push(null);
// 11280
f81632121_507.returns.push(false);
// 11284
f81632121_513.returns.push(false);
// 11287
f81632121_506.returns.push(null);
// 11292
f81632121_507.returns.push(false);
// 11296
f81632121_513.returns.push(false);
// 11299
f81632121_506.returns.push(null);
// 11304
f81632121_507.returns.push(false);
// 11308
f81632121_513.returns.push(false);
// 11311
f81632121_506.returns.push(null);
// 11316
f81632121_507.returns.push(false);
// 11320
f81632121_513.returns.push(false);
// 11323
f81632121_506.returns.push(null);
// 11328
f81632121_507.returns.push(false);
// 11332
f81632121_513.returns.push(false);
// 11335
f81632121_506.returns.push(null);
// 11340
f81632121_507.returns.push(false);
// 11344
f81632121_513.returns.push(false);
// 11347
f81632121_506.returns.push(null);
// 11352
f81632121_507.returns.push(false);
// 11356
f81632121_513.returns.push(false);
// 11359
f81632121_506.returns.push(null);
// 11364
f81632121_507.returns.push(false);
// 11368
f81632121_513.returns.push(false);
// 11371
f81632121_506.returns.push(null);
// 11378
o63.getElementsByTagName = f81632121_502;
// 11380
o63.querySelectorAll = f81632121_504;
// undefined
o63 = null;
// 11381
o63 = {};
// 11382
f81632121_504.returns.push(o63);
// 11383
o63.length = 0;
// undefined
o63 = null;
// 11390
o63 = {};
// 11391
f81632121_70.returns.push(o63);
// 11392
// 11393
o63.open = f81632121_1294;
// 11394
f81632121_1294.returns.push(undefined);
// 11395
o63.setRequestHeader = f81632121_1295;
// 11396
f81632121_1295.returns.push(undefined);
// 11399
f81632121_1295.returns.push(undefined);
// 11400
o63.send = f81632121_1296;
// 11401
f81632121_1296.returns.push(undefined);
// 11404
f81632121_467.returns.push(1374851233092);
// 11406
f81632121_467.returns.push(1374851233092);
// 11409
f81632121_467.returns.push(1374851233093);
// 11411
f81632121_467.returns.push(1374851233093);
// 11414
f81632121_467.returns.push(1374851233093);
// 11417
f81632121_467.returns.push(1374851233093);
// 11419
f81632121_467.returns.push(1374851233094);
// 11421
o76 = {};
// 11422
o105 = {};
// 11424
o76.transport = o63;
// 11425
o63.readyState = 1;
// 11436
o122 = {};
// 11437
f81632121_508.returns.push(o122);
// 11438
o123 = {};
// 11439
o122.style = o123;
// 11440
// undefined
o123 = null;
// 11442
f81632121_508.returns.push(o27);
// 11443
o27.firstChild = null;
// undefined
o27 = null;
// 11447
o8.scrollWidth = 1017;
// 11458
o27 = {};
// 11459
f81632121_508.returns.push(o27);
// 11460
o123 = {};
// 11461
o27.classList = o123;
// 11463
o123.contains = f81632121_513;
// undefined
o123 = null;
// 11464
f81632121_513.returns.push(true);
// 11465
o27.__FB_TOKEN = void 0;
// 11466
// 11467
o123 = {};
// 11468
o27.childNodes = o123;
// undefined
o27 = null;
// 11469
o123.nodeType = void 0;
// 11470
o123.classList = void 0;
// 11471
o123.className = void 0;
// 11472
o123.childNodes = void 0;
// undefined
o123 = null;
// 11476
f81632121_467.returns.push(1374851233127);
// 11485
f81632121_467.returns.push(1374851233136);
// 11490
o27 = {};
// 11491
f81632121_508.returns.push(o27);
// 11492
o123 = {};
// 11493
o27.classList = o123;
// 11495
o123.contains = f81632121_513;
// undefined
o123 = null;
// 11496
f81632121_513.returns.push(true);
// 11497
o27.__FB_TOKEN = void 0;
// 11498
// 11499
o123 = {};
// 11500
o27.childNodes = o123;
// undefined
o27 = null;
// 11501
o123.nodeType = void 0;
// 11502
o123.classList = void 0;
// 11503
o123.className = void 0;
// 11504
o123.childNodes = void 0;
// undefined
o123 = null;
// 11509
f81632121_467.returns.push(1374851233140);
// 11511
o27 = {};
// 11512
o123 = {};
// 11514
o27.nodeType = void 0;
// 11515
o27.length = 1;
// 11516
o27["0"] = "nxD7O";
// 11519
f81632121_467.returns.push(1374851233142);
// 11522
f81632121_467.returns.push(1374851233143);
// 11524
f81632121_467.returns.push(1374851233143);
// 11526
o124 = {};
// 11527
o125 = {};
// 11528
o124.input = o125;
// undefined
o124 = null;
// 11529
o125.root = o17;
// undefined
o125 = null;
// undefined
o17 = null;
// 11533
f81632121_645.returns.push(false);
// 11536
f81632121_467.returns.push(1374851233144);
// 11537
f81632121_14.returns.push(undefined);
// 11538
f81632121_12.returns.push(43);
// 11542
f81632121_467.returns.push(1374851233147);
// 11544
f81632121_467.returns.push(1374851233147);
// 11545
f81632121_14.returns.push(undefined);
// 11546
f81632121_12.returns.push(44);
// 11548
f81632121_467.returns.push(1374851233148);
// 11549
o17 = {};
// 11550
f81632121_70.returns.push(o17);
// 11551
o17.open = f81632121_1294;
// 11552
f81632121_1294.returns.push(undefined);
// 11553
o17.setRequestHeader = f81632121_1295;
// 11554
f81632121_1295.returns.push(undefined);
// 11555
// 11556
f81632121_12.returns.push(45);
// 11558
f81632121_467.returns.push(1374851233149);
// 11560
f81632121_467.returns.push(1374851233149);
// 11561
o17.send = f81632121_1296;
// 11562
f81632121_1296.returns.push(undefined);
// 11563
o124 = {};
// 11565
o125 = {};
// 11566
o124.alertList = o125;
// 11567
f81632121_1608 = function() { return f81632121_1608.returns[f81632121_1608.inst++]; };
f81632121_1608.returns = [];
f81632121_1608.inst = 0;
// 11568
o125.getIds = f81632121_1608;
// 11569
o127 = {};
// 11570
o125._list = o127;
// 11571
f81632121_1610 = function() { return f81632121_1610.returns[f81632121_1610.inst++]; };
f81632121_1610.returns = [];
f81632121_1610.inst = 0;
// 11572
o127.reduce = f81632121_1610;
// 11573
o127._head = null;
// 11574
f81632121_1610.returns.push({__JSBNG_unknown_object:true});
// 11575
f81632121_1608.returns.push({__JSBNG_unknown_object:true});
// 11576
o124._autoLoadNotifIndex = 1;
// 11578
f81632121_1611 = function() { return f81632121_1611.returns[f81632121_1611.inst++]; };
f81632121_1611.returns = [];
f81632121_1611.inst = 0;
// 11579
o125.getDomObj = f81632121_1611;
// 11580
f81632121_1612 = function() { return f81632121_1612.returns[f81632121_1612.inst++]; };
f81632121_1612.returns = [];
f81632121_1612.inst = 0;
// 11581
o125._getField = f81632121_1612;
// 11583
f81632121_1613 = function() { return f81632121_1613.returns[f81632121_1613.inst++]; };
f81632121_1613.returns = [];
f81632121_1613.inst = 0;
// 11584
o127.get = f81632121_1613;
// 11585
o146 = {};
// 11586
o127._nodes = o146;
// 11587
o146["null"] = void 0;
// undefined
o146 = null;
// 11588
f81632121_1613.returns.push(null);
// 11589
f81632121_1612.returns.push(null);
// 11590
f81632121_1611.returns.push(null);
// 11591
// 11592
f81632121_1615 = function() { return f81632121_1615.returns[f81632121_1615.inst++]; };
f81632121_1615.returns = [];
f81632121_1615.inst = 0;
// 11593
o124._annotateMorePagerURI = f81632121_1615;
// 11594
o124._morePagerLink = o118;
// 11595
o118.setAttribute = f81632121_575;
// undefined
o118 = null;
// 11598
f81632121_506.returns.push("/ajax/notifications/get.php?user=100006118350059");
// 11600
f81632121_1616 = function() { return f81632121_1616.returns[f81632121_1616.inst++]; };
f81632121_1616.returns = [];
f81632121_1616.inst = 0;
// 11601
o125.getEarliestNotifTime = f81632121_1616;
// undefined
o125 = null;
// 11603
f81632121_1617 = function() { return f81632121_1617.returns[f81632121_1617.inst++]; };
f81632121_1617.returns = [];
f81632121_1617.inst = 0;
// 11604
o127.isEmpty = f81632121_1617;
// undefined
o127 = null;
// 11606
f81632121_1617.returns.push(true);
// 11607
f81632121_1616.returns.push(0);
// 11608
f81632121_575.returns.push(undefined);
// 11609
f81632121_1615.returns.push(undefined);
// 11610
o118 = {};
// 11611
f81632121_1619 = function() { return f81632121_1619.returns[f81632121_1619.inst++]; };
f81632121_1619.returns = [];
f81632121_1619.inst = 0;
// 11612
o118.inform = f81632121_1619;
// 11613
f81632121_1620 = function() { return f81632121_1620.returns[f81632121_1620.inst++]; };
f81632121_1620.returns = [];
f81632121_1620.inst = 0;
// 11614
o118._getArbiterInstance = f81632121_1620;
// 11615
o125 = {};
// 11616
o118._arbiter = o125;
// undefined
o118 = null;
// 11617
f81632121_1620.returns.push(o125);
// 11618
f81632121_1622 = function() { return f81632121_1622.returns[f81632121_1622.inst++]; };
f81632121_1622.returns = [];
f81632121_1622.inst = 0;
// 11619
o125.inform = f81632121_1622;
// 11620
o118 = {};
// 11621
o125.$Arbiter3 = o118;
// 11622
f81632121_1624 = function() { return f81632121_1624.returns[f81632121_1624.inst++]; };
f81632121_1624.returns = [];
f81632121_1624.inst = 0;
// 11623
o118.push = f81632121_1624;
// 11624
f81632121_1624.returns.push(1);
// 11625
o127 = {};
// 11626
o125.$Arbiter0 = o127;
// 11627
f81632121_1626 = function() { return f81632121_1626.returns[f81632121_1626.inst++]; };
f81632121_1626.returns = [];
f81632121_1626.inst = 0;
// 11628
o127.setHoldingBehavior = f81632121_1626;
// 11629
o146 = {};
// 11630
o127.$ArbiterEventHolder0 = o146;
// 11631
// 11632
f81632121_1626.returns.push(undefined);
// 11633
o147 = {};
// 11634
o125.$Arbiter1 = o147;
// 11635
f81632121_1629 = function() { return f81632121_1629.returns[f81632121_1629.inst++]; };
f81632121_1629.returns = [];
f81632121_1629.inst = 0;
// 11636
o147.emitAndHold = f81632121_1629;
// 11637
o147.$EventEmitterWithHolding1 = o127;
// 11638
f81632121_1630 = function() { return f81632121_1630.returns[f81632121_1630.inst++]; };
f81632121_1630.returns = [];
f81632121_1630.inst = 0;
// 11639
o127.holdEvent = f81632121_1630;
// 11641
f81632121_1631 = function() { return f81632121_1631.returns[f81632121_1631.inst++]; };
f81632121_1631.returns = [];
f81632121_1631.inst = 0;
// 11642
o127.$ArbiterEventHolder2 = f81632121_1631;
// 11643
f81632121_1632 = function() { return f81632121_1632.returns[f81632121_1632.inst++]; };
f81632121_1632.returns = [];
f81632121_1632.inst = 0;
// 11644
o127.emitToListener = f81632121_1632;
// 11645
f81632121_1633 = function() { return f81632121_1633.returns[f81632121_1633.inst++]; };
f81632121_1633.returns = [];
f81632121_1633.inst = 0;
// 11646
o127.releaseCurrentEvent = f81632121_1633;
// 11647
f81632121_1634 = function() { return f81632121_1634.returns[f81632121_1634.inst++]; };
f81632121_1634.returns = [];
f81632121_1634.inst = 0;
// 11648
o127.forEachHeldEvent = f81632121_1634;
// 11649
o148 = {};
// 11650
o127.$EventHolder0 = o148;
// 11651
f81632121_1636 = function() { return f81632121_1636.returns[f81632121_1636.inst++]; };
f81632121_1636.returns = [];
f81632121_1636.inst = 0;
// 11652
o148.forEach = f81632121_1636;
// undefined
o148 = null;
// 11653
f81632121_1636.returns.push(undefined);
// 11654
// 11655
f81632121_1634.returns.push(undefined);
// 11656
f81632121_1632.returns.push(undefined);
// 11657
f81632121_1631.returns.push(undefined);
// 11658
f81632121_1630.returns.push(undefined);
// 11659
// 11660
o148 = {};
// 11661
o147.$EventEmitterWithHolding0 = o148;
// 11662
f81632121_1638 = function() { return f81632121_1638.returns[f81632121_1638.inst++]; };
f81632121_1638.returns = [];
f81632121_1638.inst = 0;
// 11663
o148.emit = f81632121_1638;
// 11664
o149 = {};
// 11665
o148.$EventEmitter0 = o149;
// undefined
o148 = null;
// 11666
f81632121_1640 = function() { return f81632121_1640.returns[f81632121_1640.inst++]; };
f81632121_1640.returns = [];
f81632121_1640.inst = 0;
// 11667
o149.getSubscriptionsForType = f81632121_1640;
// 11668
o148 = {};
// 11669
o149.$EventSubscriptionVendor0 = o148;
// undefined
o149 = null;
// 11670
o148.activity = void 0;
// 11671
f81632121_1640.returns.push(undefined);
// 11672
f81632121_1638.returns.push(undefined);
// 11673
// 11674
f81632121_1629.returns.push(undefined);
// 11675
f81632121_1642 = function() { return f81632121_1642.returns[f81632121_1642.inst++]; };
f81632121_1642.returns = [];
f81632121_1642.inst = 0;
// 11676
o125.$Arbiter5 = f81632121_1642;
// 11677
o149 = {};
// 11678
o125.$Arbiter2 = o149;
// 11679
f81632121_1644 = function() { return f81632121_1644.returns[f81632121_1644.inst++]; };
f81632121_1644.returns = [];
f81632121_1644.inst = 0;
// 11680
o149.satisfyNonPersistentDependency = f81632121_1644;
// 11681
o150 = {};
// 11682
o149.$CallbackDependencyManager3 = o150;
// 11683
o150.activity = void 0;
// 11685
// 11686
f81632121_1646 = function() { return f81632121_1646.returns[f81632121_1646.inst++]; };
f81632121_1646.returns = [];
f81632121_1646.inst = 0;
// 11687
o149.$CallbackDependencyManager5 = f81632121_1646;
// 11688
o151 = {};
// 11689
o149.$CallbackDependencyManager0 = o151;
// undefined
o149 = null;
// 11690
o151.activity = void 0;
// 11691
f81632121_1646.returns.push(undefined);
// 11693
// 11694
f81632121_1644.returns.push(undefined);
// 11695
f81632121_1642.returns.push(undefined);
// 11697
f81632121_1648 = function() { return f81632121_1648.returns[f81632121_1648.inst++]; };
f81632121_1648.returns = [];
f81632121_1648.inst = 0;
// 11698
o118.pop = f81632121_1648;
// undefined
o118 = null;
// 11699
o118 = {};
// 11700
f81632121_1648.returns.push(o118);
// 11701
o118.activity = void 0;
// undefined
o118 = null;
// 11702
f81632121_1622.returns.push(undefined);
// 11703
f81632121_1619.returns.push(undefined);
// 11707
f81632121_1620.returns.push(o125);
// undefined
o125 = null;
// 11711
f81632121_1624.returns.push(1);
// 11715
// undefined
o146 = null;
// 11716
f81632121_1626.returns.push(undefined);
// 11728
f81632121_1636.returns.push(undefined);
// 11729
// undefined
o127 = null;
// 11730
f81632121_1634.returns.push(undefined);
// 11731
f81632121_1632.returns.push(undefined);
// 11732
f81632121_1631.returns.push(undefined);
// 11733
f81632121_1630.returns.push(undefined);
// 11734
// 11740
o148.change = void 0;
// undefined
o148 = null;
// 11741
f81632121_1640.returns.push(undefined);
// 11742
f81632121_1638.returns.push(undefined);
// 11743
// undefined
o147 = null;
// 11744
f81632121_1629.returns.push(undefined);
// 11749
o150.change = void 0;
// 11751
// 11754
o151.change = void 0;
// undefined
o151 = null;
// 11755
f81632121_1646.returns.push(undefined);
// 11757
// undefined
o150 = null;
// 11758
f81632121_1644.returns.push(undefined);
// 11759
f81632121_1642.returns.push(undefined);
// 11762
o118 = {};
// 11763
f81632121_1648.returns.push(o118);
// 11764
o118.change = void 0;
// undefined
o118 = null;
// 11765
f81632121_1622.returns.push(undefined);
// 11766
f81632121_1619.returns.push(undefined);
// 11767
o118 = {};
// 11768
o118._shown = false;
// undefined
o118 = null;
// 11769
o118 = {};
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 11774
f81632121_467.returns.push(1374851233175);
// 11775
o125 = {};
// 11779
o127 = {};
// 11783
o146 = {};
// 11787
o147 = {};
// 11791
o148 = {};
// 11796
o19.getResponseHeader = f81632121_1332;
// 11799
f81632121_1332.returns.push("OEaB02R0RTf78rAJ1DuTDFgTjOvmrkR5ELLovIg3pzM=");
// 11802
f81632121_1332.returns.push("OEaB02R0RTf78rAJ1DuTDFgTjOvmrkR5ELLovIg3pzM=");
// 11803
// 11805
o19.JSBNG__status = 200;
// 11809
f81632121_467.returns.push(1374851233177);
// 11810
o136._handleXHRResponse = f81632121_1333;
// 11812
o136.getOption = f81632121_1334;
// 11813
o149 = {};
// 11814
o136.option = o149;
// 11815
o149.suppressEvaluation = false;
// 11818
f81632121_1334.returns.push(false);
// 11819
o19.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"entities\":[],\"queries\":[{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__usericon\",\"original_cost\":2,\"null_state_position\":null,\"parse\":{\"display\":[\"People I may know\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(friends(friends(me)),non-friends(me))\",\"tuid\":\"intersect(friends(friends(me)),non-friends(me))\",\"type\":\"browse_type_user\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__usericon\",\"original_cost\":2.5,\"null_state_position\":null,\"parse\":{\"display\":[\"My friends\"],\"suffix\":\"\",\"remTokens\":[0,1],\"unmatch\":[0,1]},\"semantic\":\"friends(me)\",\"tuid\":\"friends(me)\",\"type\":\"browse_type_user\",\"isNullState\":\"true\",\"cost\":2,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__photoicon\",\"original_cost\":3,\"null_state_position\":null,\"parse\":{\"display\":[\"Photos of my friends\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"photos-of(friends(me))\",\"tuid\":\"photos-of(friends(me))\",\"type\":\"browse_type_photo\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__musicicon\",\"original_cost\":3.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Music my friends like\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(pages(musician),pages-liked(friends(me)))\",\"tuid\":\"intersect(pages(musician),pages-liked(friends(me)))\",\"type\":\"browse_type_music\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__movieicon\",\"original_cost\":4,\"null_state_position\":null,\"parse\":{\"display\":[\"Movies my friends like\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(pages(movie),pages-liked(friends(me)))\",\"tuid\":\"intersect(pages(movie),pages-liked(friends(me)))\",\"type\":\"browse_type_movie\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__placeicon\",\"original_cost\":4.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Restaurants nearby\"],\"suffix\":\"\",\"remTokens\":[0,1],\"unmatch\":[0,1]},\"semantic\":\"intersect(places(273819889375819),places-near(me))\",\"tuid\":\"intersect(places(273819889375819),places-near(me))\",\"type\":\"browse_type_place\",\"isNullState\":\"true\",\"cost\":2,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__gameicon\",\"original_cost\":5,\"null_state_position\":null,\"parse\":{\"display\":[\"Games my friends play\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(apps(game),apps-used(friends(me)))\",\"tuid\":\"intersect(apps(game),apps-used(friends(me)))\",\"type\":\"browse_type_game\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__photoicon\",\"original_cost\":5.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Photos I have liked\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"photos-liked(me)\",\"tuid\":\"photos-liked(me)\",\"type\":\"browse_type_photo\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__groupicon\",\"original_cost\":6,\"null_state_position\":null,\"parse\":{\"display\":[\"Groups my friends are in\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3,4],\"unmatch\":[0,1,2,3,4]},\"semantic\":\"groups(friends(me))\",\"tuid\":\"groups(friends(me))\",\"type\":\"browse_type_group\",\"isNullState\":\"true\",\"cost\":3.5,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__placeicon\",\"original_cost\":6.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Places my friends have been to\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3,4,5],\"unmatch\":[0,1,2,3,4,5]},\"semantic\":\"places-visited(friends(me))\",\"tuid\":\"places-visited(friends(me))\",\"type\":\"browse_type_place\",\"isNullState\":\"true\",\"cost\":4,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__appicon\",\"original_cost\":7,\"null_state_position\":null,\"parse\":{\"display\":[\"Apps my friends use\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"apps-used(friends(me))\",\"tuid\":\"apps-used(friends(me))\",\"type\":\"browse_type_application\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__placeicon\",\"original_cost\":7.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Current cities of my friends\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3,4],\"unmatch\":[0,1,2,3,4]},\"semantic\":\"intersect(current-cities(friends(me)),pages(city))\",\"tuid\":\"intersect(current-cities(friends(me)),pages(city))\",\"type\":\"browse_type_city\",\"isNullState\":\"true\",\"cost\":3.5,\"path\":null,\"isRedirect\":false}]},\"css\":[\"c6lUE\"],\"bootloadable\":{},\"resource_map\":{\"c6lUE\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y1\\/r\\/i2fjJiK4liE.css\"}},\"ixData\":[]}";
// 11820
o136._unshieldResponseText = f81632121_1336;
// 11821
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":{\"entities\":[],\"queries\":[{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__usericon\",\"original_cost\":2,\"null_state_position\":null,\"parse\":{\"display\":[\"People I may know\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(friends(friends(me)),non-friends(me))\",\"tuid\":\"intersect(friends(friends(me)),non-friends(me))\",\"type\":\"browse_type_user\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__usericon\",\"original_cost\":2.5,\"null_state_position\":null,\"parse\":{\"display\":[\"My friends\"],\"suffix\":\"\",\"remTokens\":[0,1],\"unmatch\":[0,1]},\"semantic\":\"friends(me)\",\"tuid\":\"friends(me)\",\"type\":\"browse_type_user\",\"isNullState\":\"true\",\"cost\":2,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__photoicon\",\"original_cost\":3,\"null_state_position\":null,\"parse\":{\"display\":[\"Photos of my friends\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"photos-of(friends(me))\",\"tuid\":\"photos-of(friends(me))\",\"type\":\"browse_type_photo\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__musicicon\",\"original_cost\":3.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Music my friends like\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(pages(musician),pages-liked(friends(me)))\",\"tuid\":\"intersect(pages(musician),pages-liked(friends(me)))\",\"type\":\"browse_type_music\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__movieicon\",\"original_cost\":4,\"null_state_position\":null,\"parse\":{\"display\":[\"Movies my friends like\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(pages(movie),pages-liked(friends(me)))\",\"tuid\":\"intersect(pages(movie),pages-liked(friends(me)))\",\"type\":\"browse_type_movie\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__placeicon\",\"original_cost\":4.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Restaurants nearby\"],\"suffix\":\"\",\"remTokens\":[0,1],\"unmatch\":[0,1]},\"semantic\":\"intersect(places(273819889375819),places-near(me))\",\"tuid\":\"intersect(places(273819889375819),places-near(me))\",\"type\":\"browse_type_place\",\"isNullState\":\"true\",\"cost\":2,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__gameicon\",\"original_cost\":5,\"null_state_position\":null,\"parse\":{\"display\":[\"Games my friends play\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"intersect(apps(game),apps-used(friends(me)))\",\"tuid\":\"intersect(apps(game),apps-used(friends(me)))\",\"type\":\"browse_type_game\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__photoicon\",\"original_cost\":5.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Photos I have liked\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"photos-liked(me)\",\"tuid\":\"photos-liked(me)\",\"type\":\"browse_type_photo\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__groupicon\",\"original_cost\":6,\"null_state_position\":null,\"parse\":{\"display\":[\"Groups my friends are in\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3,4],\"unmatch\":[0,1,2,3,4]},\"semantic\":\"groups(friends(me))\",\"tuid\":\"groups(friends(me))\",\"type\":\"browse_type_group\",\"isNullState\":\"true\",\"cost\":3.5,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__placeicon\",\"original_cost\":6.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Places my friends have been to\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3,4,5],\"unmatch\":[0,1,2,3,4,5]},\"semantic\":\"places-visited(friends(me))\",\"tuid\":\"places-visited(friends(me))\",\"type\":\"browse_type_place\",\"isNullState\":\"true\",\"cost\":4,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__appicon\",\"original_cost\":7,\"null_state_position\":null,\"parse\":{\"display\":[\"Apps my friends use\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3],\"unmatch\":[0,1,2,3]},\"semantic\":\"apps-used(friends(me))\",\"tuid\":\"apps-used(friends(me))\",\"type\":\"browse_type_application\",\"isNullState\":\"true\",\"cost\":3,\"path\":null,\"isRedirect\":false},{\"iconClass\":\"-cx-PRIVATE-fbFacebarTypeaheadItem__placeicon\",\"original_cost\":7.5,\"null_state_position\":null,\"parse\":{\"display\":[\"Current cities of my friends\"],\"suffix\":\"\",\"remTokens\":[0,1,2,3,4],\"unmatch\":[0,1,2,3,4]},\"semantic\":\"intersect(current-cities(friends(me)),pages(city))\",\"tuid\":\"intersect(current-cities(friends(me)),pages(city))\",\"type\":\"browse_type_city\",\"isNullState\":\"true\",\"cost\":3.5,\"path\":null,\"isRedirect\":false}]},\"css\":[\"c6lUE\"],\"bootloadable\":{},\"resource_map\":{\"c6lUE\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y1\\/r\\/i2fjJiK4liE.css\"}},\"ixData\":[]}");
// 11822
o136._interpretResponse = f81632121_1337;
// 11823
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 11824
o136.invokeResponseHandler = f81632121_1338;
// 11825
f81632121_1659 = function() { return f81632121_1659.returns[f81632121_1659.inst++]; };
f81632121_1659.returns = [];
f81632121_1659.inst = 0;
// 11826
o136.handler = f81632121_1659;
// 11827
o136._isRelevant = f81632121_1340;
// 11828
o136._allowCrossPageTransition = true;
// 11829
f81632121_1340.returns.push(true);
// 11830
o136._dispatchResponse = f81632121_1341;
// 11831
o136.getURI = f81632121_1342;
// 11832
o150 = {};
// 11833
o136.uri = o150;
// 11835
o150.$URIBase0 = "";
// 11836
o150.$URIBase1 = "";
// 11837
o150.$URIBase2 = "";
// 11838
o150.$URIBase3 = "/ajax/browse/null_state.php";
// 11840
o151 = {};
// 11841
o150.$URIBase5 = o151;
// 11842
f81632121_1662 = function() { return f81632121_1662.returns[f81632121_1662.inst++]; };
f81632121_1662.returns = [];
f81632121_1662.inst = 0;
// 11844
f81632121_1662.returns.push(true);
// 11845
o151.__a = 1;
// 11848
f81632121_1662.returns.push(true);
// 11849
o151.__dyn = "7n8ahyj2qmvudDgDxqjEHznBw";
// 11852
f81632121_1662.returns.push(true);
// 11853
o151.__req = "3";
// 11856
f81632121_1662.returns.push(true);
// 11857
o151.__user = "100006118350059";
// 11860
f81632121_1662.returns.push(true);
// 11861
o151.grammar_version = "9ab0d482a92fc9cfa37e6c174e4543ea4a022340";
// 11863
o150.$URIBase4 = "";
// 11864
f81632121_1344.returns.push("/ajax/browse/null_state.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=3&__user=100006118350059&grammar_version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 11865
f81632121_1342.returns.push("/ajax/browse/null_state.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=3&__user=100006118350059&grammar_version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 11866
o136.preBootloadHandler = void 0;
// 11877
f81632121_1662.returns.push(true);
// 11881
f81632121_1662.returns.push(true);
// 11885
f81632121_1662.returns.push(true);
// 11889
f81632121_1662.returns.push(true);
// 11893
f81632121_1662.returns.push(true);
// 11897
f81632121_1344.returns.push("/ajax/browse/null_state.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=3&__user=100006118350059&grammar_version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 11898
f81632121_1342.returns.push("/ajax/browse/null_state.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=3&__user=100006118350059&grammar_version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 11900
f81632121_12.returns.push(46);
// 11904
o152 = {};
// 11905
f81632121_474.returns.push(o152);
// 11907
f81632121_478.returns.push(o152);
// undefined
o152 = null;
// 11908
f81632121_1338.returns.push(undefined);
// 11909
f81632121_1333.returns.push(undefined);
// 11912
o149.asynchronous = true;
// undefined
o149 = null;
// 11915
f81632121_1334.returns.push(true);
// 11916
// 11917
o149 = {};
// 11921
o152 = {};
// 11925
o153 = {};
// 11929
o154 = {};
// 11934
o18.getResponseHeader = f81632121_1332;
// 11937
f81632121_1332.returns.push("WRM6aRBwBULw3+63TOvbKooYnQNT3s5FTkEaJBNbB6E=");
// 11940
f81632121_1332.returns.push("WRM6aRBwBULw3+63TOvbKooYnQNT3s5FTkEaJBNbB6E=");
// 11941
// 11943
o18.JSBNG__status = 200;
// 11947
f81632121_467.returns.push(1374851233192);
// 11948
o102._handleXHRResponse = f81632121_1333;
// 11950
o102.getOption = f81632121_1334;
// 11951
o155 = {};
// 11952
o102.option = o155;
// 11953
o155.suppressEvaluation = false;
// 11956
f81632121_1334.returns.push(false);
// 11957
o18.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"entity_cost\":0.5,\"blank_cost\":0.5,\"typeahead_types\":[\"user\",\"user-dynamic\",\"place\",\"place-category\",\"page\",\"page-category\",\"app\",\"group\",\"event\",\"friendlist\",\"list\",\"music\",\"shortcut\",\"websuggestion\",\"facebar_query\",\"product\",\"og-book\",\"og-movie\",\"og-tv_show\",\"hashtag_exact\",\"activity\",\"activity-actors\",\"activity-verb\",\"activity-verb-present-singular\",\"job-title\",\"job-title-activity\",\"job-title-workers\",\"political-view-adjective\",\"political-view-members\",\"political-view-party\",\"religion\",\"religion-adjective\",\"religion-alt\",\"religion-members\"],\"mapped_types\":{\"gameapp\":\"app\"},\"mapped_types_subquery\":{\"place\":\"page\"},\"bootstrap_types\":[\"user\",\"page\",\"group\",\"app\",\"event\",\"friendlist\",\"shortcut\"],\"browse_functions\":{\"intersect\":{\"numParamsUnbounded\":true,\"minNumParams\":1,\"maxNumParams\":100,\"allowsFreeText\":false},\"union\":{\"numParamsUnbounded\":true,\"minNumParams\":1,\"maxNumParams\":100,\"allowsFreeText\":false},\"fbids\":{\"numParamsUnbounded\":true,\"minNumParams\":1,\"maxNumParams\":100,\"allowsFreeText\":false},\"all\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"present\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"past\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"future\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"ever\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"ever-past\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"class\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"date\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"after\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"before\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"duration-past\":{\"numParamsUnbounded\":false,\"minNumParams\":2,\"maxNumParams\":2,\"allowsFreeText\":false},\"duration-future\":{\"numParamsUnbounded\":false,\"minNumParams\":2,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-age\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-younger\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-older\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-born\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-interested\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"users-birth-place\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"females\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":0,\"allowsFreeText\":false},\"males\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":0,\"allowsFreeText\":false},\"members\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"online-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"non-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"acquaintances\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"close-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"restricted-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"followers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-followed\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"creators\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"admins\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"groups\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"non-groups\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"groups-privacy\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"groups-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"groups-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"communities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"communities-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"relatives\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"siblings\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"brothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sisters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"parents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"fathers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"mothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"children\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sons\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"daughters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"aunts\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"uncles\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"nieces\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"nephews\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"cousins\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandchildren\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandsons\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"granddaughters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandparents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandmothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandfathers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepsiblings\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepsisters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepbrothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepparents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepfathers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepmothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepchildren\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepdaughters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepsons\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sisters-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"brothers-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"fathers-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"mothers-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sons-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"daughters-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"partners\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"boyfriends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"girlfriends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-any-relationship\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-dating\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-relationship\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-open-relationship\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"spouses\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"fiances\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-its-complicated\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-civil-union\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"domestic-partners\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"wives\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"husbands\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"students\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":7,\"allowsFreeText\":false},\"employees\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":5,\"allowsFreeText\":false},\"major\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"degree\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"job\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"schools-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"school-location\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"high-schools-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"colleges-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"grad-schools-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"employer-location\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"employers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":3,\"allowsFreeText\":false},\"residents-near\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"home-residents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"hometowns\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"residents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"current-cities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"current-regions\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"current-countries\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-of-nationalities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"nationalities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"speakers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"languages\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"likers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"exact-page-likers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"job-liker-union\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"listeners\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"readers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"watchers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"page_raters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"commenters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-religious-view\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-political-view\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"admirers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"religious-views\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"political-views\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"visitors\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-checked-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-checked-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-visited\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-near\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"places-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"pages-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"pages-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-recommended-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-recommended-for\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-similar-to\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-recommended-for\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-of\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-uploaded\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"photos-commented\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-interested\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-interacted\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-reshared\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"timeline\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-tagged-or-uploaded\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-interacted\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-of\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-uploaded\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"videos-commented\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"video-links-shared\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-interested\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-interacted\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-reshared\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"app-users\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps-used\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"games\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"platform\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"stories-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"reshare-stories-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-commented\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-keyword\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"stories-topic\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-at\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-media-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-share-link\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"message\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"keywords\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"facebook-employees\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":0,\"allowsFreeText\":false}},\"semantic_map\":[],\"grammar_stop_words\":{\"and\":\"and\",\"at\":\"at\",\"by\":\"by\",\"for\":\"for\",\"friends\":\"friends\",\"from\":\"from\",\"i\":\"i\",\"in\":\"in\",\"me\":\"me\",\"of\":\"of\",\"on\":\"on\",\"people\":\"people\",\"photos\":\"photos\",\"the\":\"the\",\"to\":\"to\"},\"grammar_stop_words_penalty\":2,\"name_functions\":[\"apps-named\",\"communities-named\",\"groups-named\",\"pages-named\",\"places-named\",\"users-named\"],\"search_path\":\"\\/search\\/\",\"non_title_term_match_penalty\":0.5,\"\\u0040generated\":true},\"bootloadable\":{},\"ixData\":[]}";
// 11958
o102._unshieldResponseText = f81632121_1336;
// 11959
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":{\"entity_cost\":0.5,\"blank_cost\":0.5,\"typeahead_types\":[\"user\",\"user-dynamic\",\"place\",\"place-category\",\"page\",\"page-category\",\"app\",\"group\",\"event\",\"friendlist\",\"list\",\"music\",\"shortcut\",\"websuggestion\",\"facebar_query\",\"product\",\"og-book\",\"og-movie\",\"og-tv_show\",\"hashtag_exact\",\"activity\",\"activity-actors\",\"activity-verb\",\"activity-verb-present-singular\",\"job-title\",\"job-title-activity\",\"job-title-workers\",\"political-view-adjective\",\"political-view-members\",\"political-view-party\",\"religion\",\"religion-adjective\",\"religion-alt\",\"religion-members\"],\"mapped_types\":{\"gameapp\":\"app\"},\"mapped_types_subquery\":{\"place\":\"page\"},\"bootstrap_types\":[\"user\",\"page\",\"group\",\"app\",\"event\",\"friendlist\",\"shortcut\"],\"browse_functions\":{\"intersect\":{\"numParamsUnbounded\":true,\"minNumParams\":1,\"maxNumParams\":100,\"allowsFreeText\":false},\"union\":{\"numParamsUnbounded\":true,\"minNumParams\":1,\"maxNumParams\":100,\"allowsFreeText\":false},\"fbids\":{\"numParamsUnbounded\":true,\"minNumParams\":1,\"maxNumParams\":100,\"allowsFreeText\":false},\"all\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"present\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"past\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"future\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"ever\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"ever-past\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"class\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"date\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"after\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"before\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"duration-past\":{\"numParamsUnbounded\":false,\"minNumParams\":2,\"maxNumParams\":2,\"allowsFreeText\":false},\"duration-future\":{\"numParamsUnbounded\":false,\"minNumParams\":2,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-age\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-younger\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-older\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-born\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"users-interested\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"users-birth-place\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"females\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":0,\"allowsFreeText\":false},\"males\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":0,\"allowsFreeText\":false},\"members\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"online-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"non-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"acquaintances\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"close-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"restricted-friends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"followers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-followed\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"creators\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"admins\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"groups\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"non-groups\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"groups-privacy\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"groups-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"groups-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"communities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"communities-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"relatives\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"siblings\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"brothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sisters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"parents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"fathers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"mothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"children\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sons\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"daughters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"aunts\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"uncles\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"nieces\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"nephews\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"cousins\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandchildren\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandsons\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"granddaughters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandparents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandmothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"grandfathers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepsiblings\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepsisters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepbrothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepparents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepfathers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepmothers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepchildren\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepdaughters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stepsons\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sisters-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"brothers-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"fathers-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"mothers-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"sons-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"daughters-in-law\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"partners\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"boyfriends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"girlfriends\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-any-relationship\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-dating\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-relationship\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-open-relationship\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"spouses\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"fiances\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-its-complicated\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-civil-union\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"domestic-partners\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"wives\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"husbands\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"students\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":7,\"allowsFreeText\":false},\"employees\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":5,\"allowsFreeText\":false},\"major\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"degree\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"job\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"schools-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"school-location\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"high-schools-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"colleges-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"grad-schools-attended\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"employer-location\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"employers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":3,\"allowsFreeText\":false},\"residents-near\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"home-residents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"hometowns\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"residents\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"current-cities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"current-regions\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"current-countries\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-of-nationalities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"nationalities\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"speakers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"languages\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"likers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"exact-page-likers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"job-liker-union\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"listeners\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"readers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"watchers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"page_raters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"commenters\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-religious-view\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-political-view\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"admirers\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"religious-views\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"political-views\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"visitors\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-checked-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-checked-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-visited\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-near\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":4,\"allowsFreeText\":false},\"places-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"places-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"pages-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"pages-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-recommended-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-recommended-for\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"pages-similar-to\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-recommended-for\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-of\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-uploaded\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"photos-commented\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-interested\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-interacted\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-reshared\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"timeline\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"photos-tagged-or-uploaded\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"users-interacted\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-of\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-uploaded\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"videos-commented\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"video-links-shared\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-interested\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-interacted\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-about\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"videos-reshared\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"app-users\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps-used\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"apps-named\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"games\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"platform\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":2,\"allowsFreeText\":false},\"stories-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"reshare-stories-by\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-commented\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-liked\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-keyword\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"stories-topic\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-at\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-in\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-media-tagged\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"stories-share-link\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"message\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":false},\"keywords\":{\"numParamsUnbounded\":false,\"minNumParams\":1,\"maxNumParams\":1,\"allowsFreeText\":true},\"facebook-employees\":{\"numParamsUnbounded\":false,\"minNumParams\":0,\"maxNumParams\":0,\"allowsFreeText\":false}},\"semantic_map\":[],\"grammar_stop_words\":{\"and\":\"and\",\"at\":\"at\",\"by\":\"by\",\"for\":\"for\",\"friends\":\"friends\",\"from\":\"from\",\"i\":\"i\",\"in\":\"in\",\"me\":\"me\",\"of\":\"of\",\"on\":\"on\",\"people\":\"people\",\"photos\":\"photos\",\"the\":\"the\",\"to\":\"to\"},\"grammar_stop_words_penalty\":2,\"name_functions\":[\"apps-named\",\"communities-named\",\"groups-named\",\"pages-named\",\"places-named\",\"users-named\"],\"search_path\":\"\\/search\\/\",\"non_title_term_match_penalty\":0.5,\"\\u0040generated\":true},\"bootloadable\":{},\"ixData\":[]}");
// 11960
o102._interpretResponse = f81632121_1337;
// 11961
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 11962
o102.invokeResponseHandler = f81632121_1338;
// 11963
f81632121_1669 = function() { return f81632121_1669.returns[f81632121_1669.inst++]; };
f81632121_1669.returns = [];
f81632121_1669.inst = 0;
// 11964
o102.handler = f81632121_1669;
// 11965
o102._isRelevant = f81632121_1340;
// 11966
o102._allowCrossPageTransition = true;
// 11967
f81632121_1340.returns.push(true);
// 11968
o102._dispatchResponse = f81632121_1341;
// 11969
o102.getURI = f81632121_1342;
// 11970
o156 = {};
// 11971
o102.uri = o156;
// 11973
o156.$URIBase0 = "";
// 11974
o156.$URIBase1 = "";
// 11975
o156.$URIBase2 = "";
// 11976
o156.$URIBase3 = "/ajax/typeahead/search/facebar/config.php";
// 11978
o157 = {};
// 11979
o156.$URIBase5 = o157;
// 11981
f81632121_1662.returns.push(true);
// 11982
o157.__a = 1;
// 11985
f81632121_1662.returns.push(true);
// 11986
o157.__dyn = "7n8ahyj2qmvudDgDxqjEHznBw";
// 11989
f81632121_1662.returns.push(true);
// 11990
o157.__req = "2";
// 11993
f81632121_1662.returns.push(true);
// 11994
o157.__user = "100006118350059";
// 11997
f81632121_1662.returns.push(true);
// 11998
o157.version = "9ab0d482a92fc9cfa37e6c174e4543ea4a022340";
// 12000
o156.$URIBase4 = "";
// 12001
f81632121_1344.returns.push("/ajax/typeahead/search/facebar/config.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=2&__user=100006118350059&version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 12002
f81632121_1342.returns.push("/ajax/typeahead/search/facebar/config.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=2&__user=100006118350059&version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 12003
o102.preBootloadHandler = void 0;
// 12014
f81632121_1662.returns.push(true);
// 12018
f81632121_1662.returns.push(true);
// 12022
f81632121_1662.returns.push(true);
// 12026
f81632121_1662.returns.push(true);
// 12030
f81632121_1662.returns.push(true);
// 12034
f81632121_1344.returns.push("/ajax/typeahead/search/facebar/config.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=2&__user=100006118350059&version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 12035
f81632121_1342.returns.push("/ajax/typeahead/search/facebar/config.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=2&__user=100006118350059&version=9ab0d482a92fc9cfa37e6c174e4543ea4a022340");
// 12037
f81632121_12.returns.push(47);
// 12041
o158 = {};
// 12042
f81632121_474.returns.push(o158);
// 12044
f81632121_478.returns.push(o158);
// undefined
o158 = null;
// 12045
f81632121_1338.returns.push(undefined);
// 12046
f81632121_1333.returns.push(undefined);
// 12049
o155.asynchronous = true;
// undefined
o155 = null;
// 12052
f81632121_1334.returns.push(true);
// 12053
// 12055
o136.clearStatusIndicator = f81632121_1347;
// 12056
o136.getStatusElement = f81632121_1348;
// 12057
o136.statusElement = null;
// 12058
f81632121_1348.returns.push(null);
// 12059
f81632121_1347.returns.push(undefined);
// 12062
f81632121_1340.returns.push(true);
// 12063
o136.initialHandler = f81632121_1349;
// 12064
f81632121_1349.returns.push(undefined);
// 12065
o136.timer = null;
// 12066
f81632121_14.returns.push(undefined);
// 12068
o136._shouldSuppressJS = f81632121_1350;
// 12070
f81632121_1659.returns.push(undefined);
// 12071
f81632121_1350.returns.push(false);
// 12072
o136._handleJSResponse = f81632121_1351;
// 12073
o136.getRelativeTo = f81632121_1352;
// 12074
o136.relativeTo = null;
// 12075
f81632121_1352.returns.push(null);
// 12076
o136._handleJSRegisters = f81632121_1353;
// 12077
f81632121_1353.returns.push(undefined);
// 12078
o136.lid = void 0;
// 12080
f81632121_1353.returns.push(undefined);
// 12081
f81632121_1351.returns.push(undefined);
// 12082
f81632121_1673 = function() { return f81632121_1673.returns[f81632121_1673.inst++]; };
f81632121_1673.returns = [];
f81632121_1673.inst = 0;
// 12083
o136.finallyHandler = f81632121_1673;
// 12084
f81632121_1673.returns.push(undefined);
// 12085
f81632121_1341.returns.push(undefined);
// 12087
o102.clearStatusIndicator = f81632121_1347;
// 12088
o102.getStatusElement = f81632121_1348;
// 12089
o102.statusElement = null;
// 12090
f81632121_1348.returns.push(null);
// 12091
f81632121_1347.returns.push(undefined);
// 12094
f81632121_1340.returns.push(true);
// 12095
o102.initialHandler = f81632121_1349;
// 12096
f81632121_1349.returns.push(undefined);
// 12097
o102.timer = null;
// 12098
f81632121_14.returns.push(undefined);
// 12100
o102._shouldSuppressJS = f81632121_1350;
// 12102
f81632121_1669.returns.push(undefined);
// 12103
f81632121_1350.returns.push(false);
// 12104
o102._handleJSResponse = f81632121_1351;
// 12105
o102.getRelativeTo = f81632121_1352;
// 12106
o102.relativeTo = null;
// 12107
f81632121_1352.returns.push(null);
// 12108
o102._handleJSRegisters = f81632121_1353;
// 12109
f81632121_1353.returns.push(undefined);
// 12110
o102.lid = void 0;
// 12112
f81632121_1353.returns.push(undefined);
// 12113
f81632121_1351.returns.push(undefined);
// 12114
f81632121_1674 = function() { return f81632121_1674.returns[f81632121_1674.inst++]; };
f81632121_1674.returns = [];
f81632121_1674.inst = 0;
// 12115
o102.finallyHandler = f81632121_1674;
// 12116
f81632121_1674.returns.push(undefined);
// 12117
f81632121_1341.returns.push(undefined);
// 12125
o155 = {};
// 12126
o158 = {};
// 12128
o155.nodeType = void 0;
// 12129
o155.length = 1;
// 12130
o155["0"] = "ywV7J";
// 12135
o159 = {};
// 12136
o160 = {};
// 12138
o159.nodeType = void 0;
// 12139
o159.length = 1;
// 12140
o159["0"] = "gyG67";
// 12152
o161 = {};
// 12153
f81632121_508.returns.push(o161);
// 12154
o161.id = "u_0_3p";
// 12155
o161.getElementsByTagName = f81632121_502;
// 12157
o161.querySelectorAll = f81632121_504;
// undefined
o161 = null;
// 12158
o161 = {};
// 12159
f81632121_504.returns.push(o161);
// 12160
o161.length = 1;
// 12161
o162 = {};
// 12162
o161["0"] = o162;
// undefined
o161 = null;
// 12166
o161 = {};
// 12167
f81632121_504.returns.push(o161);
// 12168
o161.length = 0;
// undefined
o161 = null;
// 12172
o161 = {};
// 12173
f81632121_504.returns.push(o161);
// 12174
o161.length = 1;
// 12175
o163 = {};
// 12176
o161["0"] = o163;
// undefined
o161 = null;
// undefined
o163 = null;
// 12180
o161 = {};
// 12181
f81632121_504.returns.push(o161);
// 12182
o161.length = 0;
// undefined
o161 = null;
// 12186
o161 = {};
// 12187
f81632121_504.returns.push(o161);
// 12188
o161.length = 0;
// undefined
o161 = null;
// 12189
o162.nodeName = "LABEL";
// 12190
o162.getElementsByTagName = f81632121_502;
// undefined
o162 = null;
// 12191
o161 = {};
// 12192
f81632121_502.returns.push(o161);
// 12193
o161.length = 1;
// 12194
o162 = {};
// 12195
o161["0"] = o162;
// undefined
o161 = null;
// 12196
o162.__FB_TOKEN = void 0;
// 12197
// 12198
o162.getAttribute = f81632121_506;
// 12199
o162.hasAttribute = f81632121_507;
// 12201
f81632121_507.returns.push(false);
// 12202
o162.JSBNG__addEventListener = f81632121_468;
// 12204
f81632121_468.returns.push(undefined);
// 12205
o162.JSBNG__onclick = null;
// 12206
o162.nodeName = "INPUT";
// undefined
o162 = null;
// 12209
o161 = {};
// 12210
f81632121_508.returns.push(o161);
// 12211
o161.id = "u_0_s";
// 12212
o161.getElementsByTagName = f81632121_502;
// 12214
o161.querySelectorAll = f81632121_504;
// undefined
o161 = null;
// 12215
o161 = {};
// 12216
f81632121_504.returns.push(o161);
// 12217
o161.length = 1;
// 12218
o162 = {};
// 12219
o161["0"] = o162;
// undefined
o161 = null;
// 12223
o161 = {};
// 12224
f81632121_504.returns.push(o161);
// 12225
o161.length = 1;
// 12226
o163 = {};
// 12227
o161["0"] = o163;
// undefined
o161 = null;
// undefined
o163 = null;
// 12231
o161 = {};
// 12232
f81632121_504.returns.push(o161);
// 12233
o161.length = 1;
// 12234
o163 = {};
// 12235
o161["0"] = o163;
// undefined
o161 = null;
// undefined
o163 = null;
// 12239
o161 = {};
// 12240
f81632121_504.returns.push(o161);
// 12241
o161.length = 0;
// undefined
o161 = null;
// 12245
o161 = {};
// 12246
f81632121_504.returns.push(o161);
// 12247
o161.length = 0;
// undefined
o161 = null;
// 12248
o162.nodeName = "A";
// 12249
o162.__FB_TOKEN = void 0;
// 12250
// 12251
o162.getAttribute = f81632121_506;
// 12252
o162.hasAttribute = f81632121_507;
// 12254
f81632121_507.returns.push(false);
// 12255
o162.JSBNG__addEventListener = f81632121_468;
// 12257
f81632121_468.returns.push(undefined);
// 12258
o162.JSBNG__onclick = null;
// undefined
o162 = null;
// 12262
o161 = {};
// 12263
f81632121_508.returns.push(o161);
// 12264
o161.id = "u_0_q";
// 12265
o161.getElementsByTagName = f81632121_502;
// 12267
o161.querySelectorAll = f81632121_504;
// undefined
o161 = null;
// 12268
o161 = {};
// 12269
f81632121_504.returns.push(o161);
// 12270
o161.length = 1;
// 12271
o162 = {};
// 12272
o161["0"] = o162;
// undefined
o161 = null;
// 12276
o161 = {};
// 12277
f81632121_504.returns.push(o161);
// 12278
o161.length = 0;
// undefined
o161 = null;
// 12282
o161 = {};
// 12283
f81632121_504.returns.push(o161);
// 12284
o161.length = 1;
// 12285
o163 = {};
// 12286
o161["0"] = o163;
// undefined
o161 = null;
// undefined
o163 = null;
// 12290
o161 = {};
// 12291
f81632121_504.returns.push(o161);
// 12292
o161.length = 0;
// undefined
o161 = null;
// 12296
o161 = {};
// 12297
f81632121_504.returns.push(o161);
// 12298
o161.length = 0;
// undefined
o161 = null;
// 12299
o162.nodeName = "LABEL";
// 12300
o162.getElementsByTagName = f81632121_502;
// undefined
o162 = null;
// 12301
o161 = {};
// 12302
f81632121_502.returns.push(o161);
// 12303
o161.length = 1;
// 12304
o162 = {};
// 12305
o161["0"] = o162;
// undefined
o161 = null;
// 12306
o162.__FB_TOKEN = void 0;
// 12307
// 12308
o162.getAttribute = f81632121_506;
// 12309
o162.hasAttribute = f81632121_507;
// 12311
f81632121_507.returns.push(false);
// 12312
o162.JSBNG__addEventListener = f81632121_468;
// 12314
f81632121_468.returns.push(undefined);
// 12315
o162.JSBNG__onclick = null;
// 12316
o162.nodeName = "INPUT";
// undefined
o162 = null;
// 12319
o161 = {};
// 12320
f81632121_508.returns.push(o161);
// 12321
o161.id = "u_0_16";
// 12322
o161.getElementsByTagName = f81632121_502;
// 12324
o161.querySelectorAll = f81632121_504;
// undefined
o161 = null;
// 12325
o161 = {};
// 12326
f81632121_504.returns.push(o161);
// 12327
o161.length = 1;
// 12328
o162 = {};
// 12329
o161["0"] = o162;
// undefined
o161 = null;
// 12333
o161 = {};
// 12334
f81632121_504.returns.push(o161);
// 12335
o161.length = 0;
// undefined
o161 = null;
// 12339
o161 = {};
// 12340
f81632121_504.returns.push(o161);
// 12341
o161.length = 1;
// 12342
o163 = {};
// 12343
o161["0"] = o163;
// undefined
o161 = null;
// undefined
o163 = null;
// 12347
o161 = {};
// 12348
f81632121_504.returns.push(o161);
// 12349
o161.length = 0;
// undefined
o161 = null;
// 12353
o161 = {};
// 12354
f81632121_504.returns.push(o161);
// 12355
o161.length = 0;
// undefined
o161 = null;
// 12356
o162.nodeName = "LABEL";
// 12357
o162.getElementsByTagName = f81632121_502;
// undefined
o162 = null;
// 12358
o161 = {};
// 12359
f81632121_502.returns.push(o161);
// 12360
o161.length = 1;
// 12361
o162 = {};
// 12362
o161["0"] = o162;
// undefined
o161 = null;
// 12363
o162.__FB_TOKEN = void 0;
// 12364
// 12365
o162.getAttribute = f81632121_506;
// 12366
o162.hasAttribute = f81632121_507;
// 12368
f81632121_507.returns.push(false);
// 12369
o162.JSBNG__addEventListener = f81632121_468;
// 12371
f81632121_468.returns.push(undefined);
// 12372
o162.JSBNG__onclick = null;
// 12373
o162.nodeName = "INPUT";
// undefined
o162 = null;
// 12376
o161 = {};
// 12377
o162 = {};
// 12379
o161.nodeType = void 0;
// 12380
o161.length = 1;
// 12381
o161["0"] = "cstCX";
// 12384
f81632121_467.returns.push(1374851233369);
// 12387
f81632121_467.returns.push(1374851233369);
// 12389
f81632121_467.returns.push(1374851233369);
// 12396
o163 = {};
// 12397
f81632121_508.returns.push(o163);
// 12399
o164 = {};
// 12400
f81632121_508.returns.push(o164);
// 12401
o163.nodeName = "A";
// 12402
o163.__FB_TOKEN = void 0;
// 12403
// 12404
o163.getAttribute = f81632121_506;
// 12405
o163.hasAttribute = f81632121_507;
// 12407
f81632121_507.returns.push(false);
// 12408
o163.JSBNG__addEventListener = f81632121_468;
// 12410
f81632121_468.returns.push(undefined);
// 12411
o163.JSBNG__onclick = null;
// undefined
o163 = null;
// 12415
o163 = {};
// 12416
f81632121_508.returns.push(o163);
// 12418
o165 = {};
// 12419
f81632121_508.returns.push(o165);
// 12420
o163.nodeName = "A";
// 12421
o163.__FB_TOKEN = void 0;
// 12422
// 12423
o163.getAttribute = f81632121_506;
// 12424
o163.hasAttribute = f81632121_507;
// 12426
f81632121_507.returns.push(false);
// 12427
o163.JSBNG__addEventListener = f81632121_468;
// 12429
f81632121_468.returns.push(undefined);
// 12430
o163.JSBNG__onclick = null;
// undefined
o163 = null;
// 12434
o163 = {};
// 12435
o166 = {};
// 12437
o163.nodeType = void 0;
// 12438
o163.length = 1;
// 12439
o163["0"] = "dShSX";
// 12441
o167 = {};
// 12445
f81632121_467.returns.push(1374851233411);
// 12446
o167.cancelBubble = false;
// 12447
o167.returnValue = true;
// 12450
o167.srcElement = o109;
// 12452
o167.target = o109;
// 12459
f81632121_506.returns.push(null);
// 12465
f81632121_506.returns.push(null);
// 12471
f81632121_506.returns.push(null);
// 12477
f81632121_506.returns.push(null);
// 12483
f81632121_506.returns.push(null);
// 12489
f81632121_506.returns.push(null);
// 12495
f81632121_506.returns.push(null);
// 12501
f81632121_506.returns.push(null);
// 12506
o167.JSBNG__screenX = 970;
// 12507
o167.JSBNG__screenY = 511;
// 12508
o167.altKey = false;
// 12509
o167.bubbles = true;
// 12510
o167.button = 0;
// 12511
o167.buttons = void 0;
// 12512
o167.cancelable = false;
// 12513
o167.clientX = 902;
// 12514
o167.clientY = 346;
// 12515
o167.ctrlKey = false;
// 12516
o167.currentTarget = o0;
// 12517
o167.defaultPrevented = false;
// 12518
o167.detail = 0;
// 12519
o167.eventPhase = 3;
// 12520
o167.isTrusted = void 0;
// 12521
o167.metaKey = false;
// 12522
o167.pageX = 902;
// 12523
o167.pageY = 1246;
// 12524
o167.relatedTarget = null;
// 12525
o167.fromElement = null;
// 12528
o167.shiftKey = false;
// 12531
o167.timeStamp = 1374851233411;
// 12532
o167.type = "mousemove";
// 12533
o167.view = ow81632121;
// undefined
o167 = null;
// 12540
o167 = {};
// 12544
o168 = {};
// 12548
o169 = {};
// 12553
o69.getResponseHeader = f81632121_1332;
// 12556
f81632121_1332.returns.push("MWO0jcc/KbRy36gYE1NrzU/t7jbO9DT0nr3es5+tsT8=");
// 12559
f81632121_1332.returns.push("MWO0jcc/KbRy36gYE1NrzU/t7jbO9DT0nr3es5+tsT8=");
// 12560
// 12562
o69.JSBNG__status = 200;
// 12566
f81632121_467.returns.push(1374851233426);
// 12567
o142._handleXHRResponse = f81632121_1333;
// 12569
o142.getOption = f81632121_1334;
// 12570
o170 = {};
// 12571
o142.option = o170;
// 12572
o170.suppressEvaluation = false;
// 12575
f81632121_1334.returns.push(false);
// 12576
o69.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"entries\":[],\"token\":\"1374777501-7\",\"stale\":1},\"bootloadable\":{},\"ixData\":[]}";
// 12577
o142._unshieldResponseText = f81632121_1336;
// 12578
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":{\"entries\":[],\"token\":\"1374777501-7\",\"stale\":1},\"bootloadable\":{},\"ixData\":[]}");
// 12579
o142._interpretResponse = f81632121_1337;
// 12580
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 12581
o142.invokeResponseHandler = f81632121_1338;
// 12582
f81632121_1731 = function() { return f81632121_1731.returns[f81632121_1731.inst++]; };
f81632121_1731.returns = [];
f81632121_1731.inst = 0;
// 12583
o142.handler = f81632121_1731;
// 12584
o142._isRelevant = f81632121_1340;
// 12585
o142._allowCrossPageTransition = false;
// 12586
o142.id = 7;
// 12588
f81632121_1340.returns.push(true);
// 12589
o142._dispatchResponse = f81632121_1341;
// 12590
o142.getURI = f81632121_1342;
// 12591
o171 = {};
// 12592
o142.uri = o171;
// 12594
o171.$URIBase0 = "";
// 12595
o171.$URIBase1 = "";
// 12596
o171.$URIBase2 = "";
// 12597
o171.$URIBase3 = "/ajax/typeahead/search/facebar/bootstrap/";
// 12599
o172 = {};
// 12600
o171.$URIBase5 = o172;
// 12602
f81632121_1662.returns.push(true);
// 12603
o172.__a = 1;
// 12606
f81632121_1662.returns.push(true);
// 12607
o172.__dyn = "7n8ahyj2qmvudDgDxqjEHznBw";
// 12610
f81632121_1662.returns.push(true);
// 12611
o172.__req = "5";
// 12614
f81632121_1662.returns.push(true);
// 12615
o172.__user = "100006118350059";
// 12618
f81632121_1662.returns.push(true);
// 12619
o172.context = "facebar";
// 12622
f81632121_1662.returns.push(true);
// 12623
o173 = {};
// 12624
o172.filter = o173;
// 12627
f81632121_1662.returns.push(true);
// 12628
o173["0"] = "user";
// 12631
f81632121_1662.returns.push(true);
// 12632
o172.lazy = 1;
// 12635
f81632121_1662.returns.push(true);
// 12636
o172.token = "v7";
// 12639
f81632121_1662.returns.push(true);
// 12640
o172.viewer = 100006118350059;
// 12642
o171.$URIBase4 = "";
// 12643
f81632121_1344.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=5&__user=100006118350059&context=facebar&filter[0]=user&lazy=1&token=v7&viewer=100006118350059");
// 12644
f81632121_1342.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=5&__user=100006118350059&context=facebar&filter[0]=user&lazy=1&token=v7&viewer=100006118350059");
// 12645
o142.preBootloadHandler = void 0;
// 12656
f81632121_1662.returns.push(true);
// 12660
f81632121_1662.returns.push(true);
// 12664
f81632121_1662.returns.push(true);
// 12668
f81632121_1662.returns.push(true);
// 12672
f81632121_1662.returns.push(true);
// 12676
f81632121_1662.returns.push(true);
// 12680
f81632121_1662.returns.push(true);
// 12684
f81632121_1662.returns.push(true);
// 12688
f81632121_1662.returns.push(true);
// 12692
f81632121_1662.returns.push(true);
// 12696
f81632121_1344.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=5&__user=100006118350059&context=facebar&filter[0]=user&lazy=1&token=v7&viewer=100006118350059");
// 12697
f81632121_1342.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=5&__user=100006118350059&context=facebar&filter[0]=user&lazy=1&token=v7&viewer=100006118350059");
// 12699
f81632121_12.returns.push(48);
// 12703
o174 = {};
// 12704
f81632121_474.returns.push(o174);
// 12706
f81632121_478.returns.push(o174);
// undefined
o174 = null;
// 12707
f81632121_1338.returns.push(undefined);
// 12708
f81632121_1333.returns.push(undefined);
// 12711
o170.asynchronous = true;
// undefined
o170 = null;
// 12714
f81632121_1334.returns.push(true);
// 12715
// 12716
o170 = {};
// 12720
o174 = {};
// 12724
o175 = {};
// 12729
o22.getResponseHeader = f81632121_1332;
// 12732
f81632121_1332.returns.push("KND7vYBCvkWnoN9yheVsXzudEn3zwTmvcSkMHsDLj1w=");
// 12735
f81632121_1332.returns.push("KND7vYBCvkWnoN9yheVsXzudEn3zwTmvcSkMHsDLj1w=");
// 12736
// 12738
o22.JSBNG__status = 200;
// 12742
f81632121_467.returns.push(1374851233444);
// 12743
o140._handleXHRResponse = f81632121_1333;
// 12745
o140.getOption = f81632121_1334;
// 12746
o176 = {};
// 12747
o140.option = o176;
// 12748
o176.suppressEvaluation = false;
// 12751
f81632121_1334.returns.push(false);
// 12752
o22.responseText = "for (;;);{\"__ar\":1,\"payload\":{\"entries\":[],\"token\":\"1374777501-7\",\"stale\":1},\"bootloadable\":{},\"ixData\":[]}";
// 12753
o140._unshieldResponseText = f81632121_1336;
// 12754
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":{\"entries\":[],\"token\":\"1374777501-7\",\"stale\":1},\"bootloadable\":{},\"ixData\":[]}");
// 12755
o140._interpretResponse = f81632121_1337;
// 12756
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 12757
o140.invokeResponseHandler = f81632121_1338;
// 12758
f81632121_1740 = function() { return f81632121_1740.returns[f81632121_1740.inst++]; };
f81632121_1740.returns = [];
f81632121_1740.inst = 0;
// 12759
o140.handler = f81632121_1740;
// 12760
o140._isRelevant = f81632121_1340;
// 12761
o140._allowCrossPageTransition = false;
// 12762
o140.id = 6;
// 12764
f81632121_1340.returns.push(true);
// 12765
o140._dispatchResponse = f81632121_1341;
// 12766
o140.getURI = f81632121_1342;
// 12767
o177 = {};
// 12768
o140.uri = o177;
// 12770
o177.$URIBase0 = "";
// 12771
o177.$URIBase1 = "";
// 12772
o177.$URIBase2 = "";
// 12773
o177.$URIBase3 = "/ajax/typeahead/search/facebar/bootstrap/";
// 12775
o178 = {};
// 12776
o177.$URIBase5 = o178;
// 12778
f81632121_1662.returns.push(true);
// 12779
o178.__a = 1;
// 12782
f81632121_1662.returns.push(true);
// 12783
o178.__dyn = "7n8ahyj2qmvudDgDxqjEHznBw";
// 12786
f81632121_1662.returns.push(true);
// 12787
o178.__req = "4";
// 12790
f81632121_1662.returns.push(true);
// 12791
o178.__user = "100006118350059";
// 12794
f81632121_1662.returns.push(true);
// 12795
o178.context = "facebar";
// 12798
f81632121_1662.returns.push(true);
// 12799
o179 = {};
// 12800
o178.filter = o179;
// 12803
f81632121_1662.returns.push(true);
// 12804
o179["0"] = "app";
// 12807
f81632121_1662.returns.push(true);
// 12808
o179["1"] = "page";
// 12811
f81632121_1662.returns.push(true);
// 12812
o179["2"] = "group";
// 12815
f81632121_1662.returns.push(true);
// 12816
o179["3"] = "friendlist";
// 12819
f81632121_1662.returns.push(true);
// 12820
o178.lazy = 1;
// 12823
f81632121_1662.returns.push(true);
// 12824
o178.token = "v7";
// 12827
f81632121_1662.returns.push(true);
// 12828
o178.viewer = 100006118350059;
// 12830
o177.$URIBase4 = "";
// 12831
f81632121_1344.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=4&__user=100006118350059&context=facebar&filter[0]=app&filter[1]=page&filter[2]=group&filter[3]=friendlist&lazy=1&token=v7&viewer=100006118350059");
// 12832
f81632121_1342.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=4&__user=100006118350059&context=facebar&filter[0]=app&filter[1]=page&filter[2]=group&filter[3]=friendlist&lazy=1&token=v7&viewer=100006118350059");
// 12833
o140.preBootloadHandler = void 0;
// 12844
f81632121_1662.returns.push(true);
// 12848
f81632121_1662.returns.push(true);
// 12852
f81632121_1662.returns.push(true);
// 12856
f81632121_1662.returns.push(true);
// 12860
f81632121_1662.returns.push(true);
// 12864
f81632121_1662.returns.push(true);
// 12868
f81632121_1662.returns.push(true);
// 12872
f81632121_1662.returns.push(true);
// 12876
f81632121_1662.returns.push(true);
// 12880
f81632121_1662.returns.push(true);
// 12884
f81632121_1662.returns.push(true);
// 12888
f81632121_1662.returns.push(true);
// 12892
f81632121_1662.returns.push(true);
// 12896
f81632121_1344.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=4&__user=100006118350059&context=facebar&filter[0]=app&filter[1]=page&filter[2]=group&filter[3]=friendlist&lazy=1&token=v7&viewer=100006118350059");
// 12897
f81632121_1342.returns.push("/ajax/typeahead/search/facebar/bootstrap/?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=4&__user=100006118350059&context=facebar&filter[0]=app&filter[1]=page&filter[2]=group&filter[3]=friendlist&lazy=1&token=v7&viewer=100006118350059");
// 12899
f81632121_12.returns.push(49);
// 12903
o180 = {};
// 12904
f81632121_474.returns.push(o180);
// 12906
f81632121_478.returns.push(o180);
// undefined
o180 = null;
// 12907
f81632121_1338.returns.push(undefined);
// 12908
f81632121_1333.returns.push(undefined);
// 12911
o176.asynchronous = true;
// undefined
o176 = null;
// 12914
f81632121_1334.returns.push(true);
// 12915
// 12917
o142.clearStatusIndicator = f81632121_1347;
// 12918
o142.getStatusElement = f81632121_1348;
// 12919
o142.statusElement = null;
// 12920
f81632121_1348.returns.push(null);
// 12921
f81632121_1347.returns.push(undefined);
// 12926
f81632121_1340.returns.push(true);
// 12927
o142.initialHandler = f81632121_1349;
// 12928
f81632121_1349.returns.push(undefined);
// 12929
o142.timer = null;
// 12930
f81632121_14.returns.push(undefined);
// 12932
o142._shouldSuppressJS = f81632121_1350;
// 12934
f81632121_1731.returns.push(undefined);
// 12935
f81632121_1350.returns.push(false);
// 12936
o142._handleJSResponse = f81632121_1351;
// 12937
o142.getRelativeTo = f81632121_1352;
// 12938
o142.relativeTo = null;
// 12939
f81632121_1352.returns.push(null);
// 12940
o142._handleJSRegisters = f81632121_1353;
// 12941
f81632121_1353.returns.push(undefined);
// 12942
o142.lid = void 0;
// 12944
f81632121_1353.returns.push(undefined);
// 12945
f81632121_1351.returns.push(undefined);
// 12946
o142.finallyHandler = f81632121_1349;
// 12947
f81632121_1349.returns.push(undefined);
// 12948
f81632121_1341.returns.push(undefined);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 12952
f81632121_467.returns.push(1374851234448);
// 12954
o140.clearStatusIndicator = f81632121_1347;
// 12955
o140.getStatusElement = f81632121_1348;
// 12956
o140.statusElement = null;
// 12957
f81632121_1348.returns.push(null);
// 12958
f81632121_1347.returns.push(undefined);
// 12963
f81632121_1340.returns.push(true);
// 12964
o140.initialHandler = f81632121_1349;
// 12965
f81632121_1349.returns.push(undefined);
// 12966
o140.timer = null;
// 12967
f81632121_14.returns.push(undefined);
// 12969
o140._shouldSuppressJS = f81632121_1350;
// 12971
f81632121_1740.returns.push(undefined);
// 12972
f81632121_1350.returns.push(false);
// 12973
o140._handleJSResponse = f81632121_1351;
// 12974
o140.getRelativeTo = f81632121_1352;
// 12975
o140.relativeTo = null;
// 12976
f81632121_1352.returns.push(null);
// 12977
o140._handleJSRegisters = f81632121_1353;
// 12978
f81632121_1353.returns.push(undefined);
// 12979
o140.lid = void 0;
// 12981
f81632121_1353.returns.push(undefined);
// 12982
f81632121_1351.returns.push(undefined);
// 12983
o140.finallyHandler = f81632121_1349;
// 12984
f81632121_1349.returns.push(undefined);
// 12985
f81632121_1341.returns.push(undefined);
// 12990
o176 = {};
// 12996
f81632121_468.returns.push(undefined);
// 12997
o0.JSBNG__onfullscreenchange = void 0;
// 13002
f81632121_468.returns.push(undefined);
// 13003
o0.JSBNG__onmozfullscreenchange = void 0;
// 13008
f81632121_468.returns.push(undefined);
// 13009
o0.JSBNG__onwebkitfullscreenchange = null;
// 13012
f81632121_1746 = function() { return f81632121_1746.returns[f81632121_1746.inst++]; };
f81632121_1746.returns = [];
f81632121_1746.inst = 0;
// 13013
f81632121_1349.thatReturnsNull = f81632121_1746;
// 13019
o180 = {};
// 13020
f81632121_476.returns.push(o180);
// 13021
// 13022
// 13023
o180.getElementsByTagName = f81632121_502;
// 13024
o181 = {};
// 13025
f81632121_502.returns.push(o181);
// 13026
o181.length = 0;
// undefined
o181 = null;
// 13028
o181 = {};
// 13029
o180.childNodes = o181;
// undefined
o180 = null;
// 13030
o181.nodeType = void 0;
// undefined
o181 = null;
// 13032
f81632121_1620.__prototyped = void 0;
// 13033
f81632121_1619.__prototyped = void 0;
// 13034
o25.__html = void 0;
// 13035
o25.mountComponentIntoNode = void 0;
// undefined
o25 = null;
// 13037
o25 = {};
// 13038
f81632121_476.returns.push(o25);
// 13039
// 13040
o25.firstChild = null;
// 13042
o180 = {};
// 13043
f81632121_474.returns.push(o180);
// 13045
o25.appendChild = f81632121_478;
// 13046
f81632121_478.returns.push(o180);
// undefined
o180 = null;
// 13048
o180 = {};
// 13049
f81632121_476.returns.push(o180);
// 13050
// 13051
o180.firstChild = null;
// 13053
o181 = {};
// 13054
f81632121_474.returns.push(o181);
// 13055
o25.__html = void 0;
// undefined
o25 = null;
// 13056
o180.appendChild = f81632121_478;
// 13057
f81632121_478.returns.push(o181);
// undefined
o181 = null;
// 13058
o180.setAttribute = f81632121_575;
// 13060
f81632121_575.returns.push(undefined);
// 13063
f81632121_575.returns.push(undefined);
// 13064
// 13067
f81632121_575.returns.push(undefined);
// 13070
f81632121_575.returns.push(undefined);
// 13071
o25 = {};
// 13072
o180.classList = o25;
// 13074
o25.add = f81632121_602;
// undefined
o25 = null;
// 13075
f81632121_602.returns.push(undefined);
// 13079
f81632121_602.returns.push(undefined);
// 13083
f81632121_602.returns.push(undefined);
// 13084
o180.__FB_TOKEN = void 0;
// 13085
// 13090
o25 = {};
// 13091
f81632121_504.returns.push(o25);
// 13092
o25.length = 1;
// 13093
o25["0"] = o82;
// undefined
o25 = null;
// 13094
f81632121_1746.__prototyped = void 0;
// 13099
f81632121_1756 = function() { return f81632121_1756.returns[f81632121_1756.inst++]; };
f81632121_1756.returns = [];
f81632121_1756.inst = 0;
// 13100
o0.webkitCancelFullScreen = f81632121_1756;
// 13101
o180.getElementsByTagName = f81632121_502;
// 13103
o180.querySelectorAll = f81632121_504;
// undefined
o180 = null;
// 13104
o25 = {};
// 13105
f81632121_504.returns.push(o25);
// 13106
o25.length = 0;
// undefined
o25 = null;
// 13110
o25 = {};
// 13111
f81632121_504.returns.push(o25);
// 13112
o25.length = 0;
// undefined
o25 = null;
// 13116
o25 = {};
// 13117
f81632121_504.returns.push(o25);
// 13118
o25.length = 0;
// undefined
o25 = null;
// 13122
f81632121_602.returns.push(undefined);
// 13124
f81632121_467.returns.push(1374851236898);
// 13126
f81632121_467.returns.push(1374851236898);
// 13128
o25 = {};
// 13129
o180 = {};
// 13131
o25.nodeType = void 0;
// 13132
o25.length = 1;
// 13133
o25["0"] = "e0RyX";
// 13140
o181 = {};
// 13141
f81632121_508.returns.push(o181);
// 13143
o182 = {};
// 13144
f81632121_508.returns.push(o182);
// 13145
o182.nodeName = "A";
// 13146
o182.rel = "toggle";
// 13148
o182.__FB_TOKEN = void 0;
// 13149
// 13150
o182.getAttribute = f81632121_506;
// 13151
o182.hasAttribute = f81632121_507;
// 13153
f81632121_507.returns.push(false);
// 13154
o182.JSBNG__addEventListener = f81632121_468;
// 13156
f81632121_468.returns.push(undefined);
// 13157
o182.JSBNG__onkeydown = null;
// 13159
o182.setAttribute = f81632121_575;
// 13160
f81632121_575.returns.push(undefined);
// 13161
o181.__FB_TOKEN = void 0;
// 13162
// 13166
f81632121_1349.__prototyped = void 0;
// 13168
f81632121_1417.__prototyped = void 0;
// 13180
o183 = {};
// 13181
f81632121_508.returns.push(o183);
// 13183
o184 = {};
// 13184
f81632121_508.returns.push(o184);
// 13185
o184.nodeName = "A";
// 13186
o184.rel = "toggle";
// 13188
o184.__FB_TOKEN = void 0;
// 13189
// 13190
o184.getAttribute = f81632121_506;
// 13191
o184.hasAttribute = f81632121_507;
// 13193
f81632121_507.returns.push(false);
// 13194
o184.JSBNG__addEventListener = f81632121_468;
// 13196
f81632121_468.returns.push(undefined);
// 13197
o184.JSBNG__onkeydown = null;
// 13199
o184.setAttribute = f81632121_575;
// 13200
f81632121_575.returns.push(undefined);
// 13201
o183.__FB_TOKEN = void 0;
// 13202
// undefined
o183 = null;
// 13206
f81632121_468.returns.push(undefined);
// 13207
o184.JSBNG__onmouseover = null;
// undefined
o184 = null;
// 13215
o183 = {};
// 13216
f81632121_508.returns.push(o183);
// 13218
o184 = {};
// 13219
f81632121_508.returns.push(o184);
// 13220
o184.nodeName = "A";
// 13221
o184.rel = "toggle";
// 13223
o184.__FB_TOKEN = void 0;
// 13224
// 13225
o184.getAttribute = f81632121_506;
// 13226
o184.hasAttribute = f81632121_507;
// 13228
f81632121_507.returns.push(false);
// 13229
o184.JSBNG__addEventListener = f81632121_468;
// 13231
f81632121_468.returns.push(undefined);
// 13232
o184.JSBNG__onkeydown = null;
// 13234
o184.setAttribute = f81632121_575;
// 13235
f81632121_575.returns.push(undefined);
// 13236
o183.__FB_TOKEN = void 0;
// 13237
// undefined
o183 = null;
// 13241
f81632121_468.returns.push(undefined);
// 13242
o184.JSBNG__onmouseover = null;
// undefined
o184 = null;
// 13248
o183 = {};
// 13249
f81632121_508.returns.push(o183);
// 13251
o184 = {};
// 13252
f81632121_508.returns.push(o184);
// 13253
o184.nodeName = "A";
// 13254
o184.rel = "toggle";
// 13256
o184.__FB_TOKEN = void 0;
// 13257
// 13258
o184.getAttribute = f81632121_506;
// 13259
o184.hasAttribute = f81632121_507;
// 13261
f81632121_507.returns.push(false);
// 13262
o184.JSBNG__addEventListener = f81632121_468;
// 13264
f81632121_468.returns.push(undefined);
// 13265
o184.JSBNG__onkeydown = null;
// 13267
o184.setAttribute = f81632121_575;
// 13268
f81632121_575.returns.push(undefined);
// 13269
o183.__FB_TOKEN = void 0;
// 13270
// undefined
o183 = null;
// 13274
f81632121_468.returns.push(undefined);
// 13275
o184.JSBNG__onmouseover = null;
// undefined
o184 = null;
// 13281
o183 = {};
// 13282
f81632121_508.returns.push(o183);
// 13284
o184 = {};
// 13285
f81632121_508.returns.push(o184);
// 13286
o184.nodeName = "A";
// 13287
o184.rel = "toggle";
// 13289
o184.__FB_TOKEN = void 0;
// 13290
// 13291
o184.getAttribute = f81632121_506;
// 13292
o184.hasAttribute = f81632121_507;
// 13294
f81632121_507.returns.push(false);
// 13295
o184.JSBNG__addEventListener = f81632121_468;
// 13297
f81632121_468.returns.push(undefined);
// 13298
o184.JSBNG__onkeydown = null;
// 13300
o184.setAttribute = f81632121_575;
// 13301
f81632121_575.returns.push(undefined);
// 13302
o183.__FB_TOKEN = void 0;
// 13303
// undefined
o183 = null;
// 13307
f81632121_468.returns.push(undefined);
// 13308
o184.JSBNG__onmouseover = null;
// undefined
o184 = null;
// 13314
f81632121_508.returns.push(o164);
// undefined
o164 = null;
// 13318
f81632121_467.returns.push(1374851236966);
// 13327
f81632121_508.returns.push(o165);
// undefined
o165 = null;
// 13331
f81632121_467.returns.push(1374851236970);
// 13340
o164 = {};
// 13341
o165 = {};
// 13343
o164.nodeType = void 0;
// 13344
o164.length = 1;
// 13345
o164["0"] = "OYzUx";
// 13352
o183 = {};
// 13353
f81632121_508.returns.push(o183);
// 13354
f81632121_463.returns.push(3);
// 13357
f81632121_508.returns.push(o183);
// 13361
o184 = {};
// 13362
f81632121_508.returns.push(o184);
// 13363
o184.nodeName = "A";
// 13364
o184.__FB_TOKEN = void 0;
// 13365
// 13366
o184.getAttribute = f81632121_506;
// 13367
o184.hasAttribute = f81632121_507;
// 13369
f81632121_507.returns.push(false);
// 13370
o184.JSBNG__addEventListener = f81632121_468;
// 13372
f81632121_468.returns.push(undefined);
// 13373
o184.JSBNG__onclick = null;
// undefined
o184 = null;
// 13377
f81632121_508.returns.push(o87);
// undefined
o87 = null;
// 13379
o87 = {};
// 13380
f81632121_508.returns.push(o87);
// 13382
f81632121_467.returns.push(1374851237022);
// 13387
o184 = {};
// 13388
f81632121_508.returns.push(o184);
// 13389
o184.nodeName = "A";
// 13390
o184.__FB_TOKEN = void 0;
// 13391
// 13392
o184.getAttribute = f81632121_506;
// 13393
o184.hasAttribute = f81632121_507;
// 13395
f81632121_507.returns.push(false);
// 13396
o184.JSBNG__addEventListener = f81632121_468;
// 13398
f81632121_468.returns.push(undefined);
// 13399
o184.JSBNG__onclick = null;
// undefined
o184 = null;
// 13403
f81632121_508.returns.push(o85);
// undefined
o85 = null;
// 13407
o85 = {};
// 13408
f81632121_508.returns.push(o85);
// 13409
o85.nodeName = "A";
// 13410
o85.__FB_TOKEN = void 0;
// 13411
// 13412
o85.getAttribute = f81632121_506;
// 13413
o85.hasAttribute = f81632121_507;
// 13415
f81632121_507.returns.push(false);
// 13416
o85.JSBNG__addEventListener = f81632121_468;
// 13418
f81632121_468.returns.push(undefined);
// 13419
o85.JSBNG__onclick = null;
// undefined
o85 = null;
// 13423
f81632121_508.returns.push(o88);
// undefined
o88 = null;
// 13427
o85 = {};
// 13428
f81632121_508.returns.push(o85);
// 13429
o85.nodeName = "A";
// 13430
o85.__FB_TOKEN = void 0;
// 13431
// 13432
o85.getAttribute = f81632121_506;
// 13433
o85.hasAttribute = f81632121_507;
// 13435
f81632121_507.returns.push(false);
// 13436
o85.JSBNG__addEventListener = f81632121_468;
// 13438
f81632121_468.returns.push(undefined);
// 13439
o85.JSBNG__onclick = null;
// undefined
o85 = null;
// 13443
f81632121_508.returns.push(o91);
// undefined
o91 = null;
// 13447
o85 = {};
// 13448
f81632121_508.returns.push(o85);
// 13449
o85.nodeName = "A";
// 13450
o85.__FB_TOKEN = void 0;
// 13451
// 13452
o85.getAttribute = f81632121_506;
// 13453
o85.hasAttribute = f81632121_507;
// 13455
f81632121_507.returns.push(false);
// 13456
o85.JSBNG__addEventListener = f81632121_468;
// 13458
f81632121_468.returns.push(undefined);
// 13459
o85.JSBNG__onclick = null;
// undefined
o85 = null;
// 13463
f81632121_508.returns.push(o92);
// undefined
o92 = null;
// 13466
o85 = {};
// 13467
f81632121_508.returns.push(o85);
// 13468
o85.nodeName = "A";
// 13469
o85.__FB_TOKEN = void 0;
// 13470
// 13471
o85.getAttribute = f81632121_506;
// 13472
o85.hasAttribute = f81632121_507;
// 13474
f81632121_507.returns.push(false);
// 13475
o85.JSBNG__addEventListener = f81632121_468;
// 13477
f81632121_468.returns.push(undefined);
// 13478
o85.JSBNG__onclick = null;
// undefined
o85 = null;
// 13482
f81632121_508.returns.push(o90);
// undefined
o90 = null;
// 13486
o85 = {};
// 13487
f81632121_508.returns.push(o85);
// 13488
o85.nodeName = "A";
// 13489
o85.__FB_TOKEN = void 0;
// 13490
// 13491
o85.getAttribute = f81632121_506;
// 13492
o85.hasAttribute = f81632121_507;
// 13494
f81632121_507.returns.push(false);
// 13495
o85.JSBNG__addEventListener = f81632121_468;
// 13497
f81632121_468.returns.push(undefined);
// 13498
o85.JSBNG__onclick = null;
// undefined
o85 = null;
// 13502
f81632121_508.returns.push(o89);
// undefined
o89 = null;
// 13506
o85 = {};
// 13507
f81632121_508.returns.push(o85);
// 13508
o88 = {};
// 13509
o85.firstChild = o88;
// 13510
o88.id = "u_0_42";
// 13516
f81632121_508.returns.push(o29);
// 13520
o89 = {};
// 13521
f81632121_508.returns.push(o89);
// 13522
o89.nodeName = "DIV";
// 13523
o89.__FB_TOKEN = void 0;
// 13524
// 13525
o89.getAttribute = f81632121_506;
// 13526
o89.hasAttribute = f81632121_507;
// 13528
f81632121_507.returns.push(false);
// 13529
o89.JSBNG__addEventListener = f81632121_468;
// 13531
f81632121_468.returns.push(undefined);
// 13532
o89.JSBNG__onclick = null;
// undefined
o89 = null;
// 13541
o89 = {};
// 13542
o90 = {};
// 13544
o89.nodeType = void 0;
// 13545
o89.length = 1;
// 13546
o89["0"] = "xfhln";
// 13549
f81632121_467.returns.push(1374851237057);
// 13552
f81632121_467.returns.push(1374851237057);
// 13554
f81632121_467.returns.push(1374851237057);
// 13557
f81632121_467.returns.push(1374851237061);
// 13560
f81632121_467.returns.push(1374851237062);
// 13562
f81632121_467.returns.push(1374851237062);
// 13565
f81632121_467.returns.push(1374851237062);
// 13568
f81632121_467.returns.push(1374851237063);
// 13570
f81632121_467.returns.push(1374851237063);
// 13573
f81632121_467.returns.push(1374851237064);
// 13576
f81632121_467.returns.push(1374851237064);
// 13578
f81632121_467.returns.push(1374851237064);
// 13581
f81632121_467.returns.push(1374851237065);
// 13584
f81632121_467.returns.push(1374851237065);
// 13587
f81632121_508.returns.push(o88);
// 13603
f81632121_467.returns.push(1374851237068);
// 13606
f81632121_467.returns.push(1374851237069);
// 13609
f81632121_467.returns.push(1374851237069);
// 13611
f81632121_467.returns.push(1374851237069);
// 13620
f81632121_468.returns.push(undefined);
// 13621
o182.JSBNG__onmouseover = null;
// 13628
f81632121_468.returns.push(undefined);
// 13629
o182.JSBNG__onmouseout = null;
// undefined
o182 = null;
// 13633
o91 = {};
// 13634
f81632121_508.returns.push(o91);
// 13635
o92 = {};
// 13636
o91.classList = o92;
// 13638
o92.contains = f81632121_513;
// undefined
o92 = null;
// 13639
f81632121_513.returns.push(false);
// 13640
o92 = {};
// 13641
o91.parentNode = o92;
// 13642
o182 = {};
// 13643
o92.classList = o182;
// 13645
o182.contains = f81632121_513;
// undefined
o182 = null;
// 13646
f81632121_513.returns.push(true);
// 13647
o91.getElementsByTagName = f81632121_502;
// 13649
o91.querySelectorAll = f81632121_504;
// 13650
o182 = {};
// 13651
f81632121_504.returns.push(o182);
// 13652
o182.length = 1;
// 13653
o182["0"] = o24;
// undefined
o182 = null;
// 13657
o182 = {};
// 13658
f81632121_508.returns.push(o182);
// 13659
o182.getElementsByTagName = f81632121_502;
// 13661
o182.querySelectorAll = f81632121_504;
// 13662
o184 = {};
// 13663
f81632121_504.returns.push(o184);
// 13664
o184.length = 1;
// 13665
o185 = {};
// 13666
o184["0"] = o185;
// undefined
o184 = null;
// 13670
o184 = {};
// 13671
f81632121_504.returns.push(o184);
// 13672
o184.length = 5;
// 13673
o184["0"] = o185;
// undefined
o185 = null;
// 13674
o185 = {};
// 13675
o184["1"] = o185;
// undefined
o185 = null;
// 13676
o185 = {};
// 13677
o184["2"] = o185;
// undefined
o185 = null;
// 13678
o185 = {};
// 13679
o184["3"] = o185;
// undefined
o185 = null;
// 13680
o184["4"] = o181;
// undefined
o184 = null;
// 13681
o184 = {};
// 13682
o182.classList = o184;
// 13684
o184.contains = f81632121_513;
// undefined
o184 = null;
// 13685
f81632121_513.returns.push(false);
// 13686
o184 = {};
// 13687
o182.parentNode = o184;
// 13688
o185 = {};
// 13689
o184.classList = o185;
// 13691
o185.contains = f81632121_513;
// undefined
o185 = null;
// 13692
f81632121_513.returns.push(true);
// 13693
o184.offsetWidth = 850;
// 13694
o181.offsetLeft = 524;
// 13695
o181.offsetWidth = 84;
// undefined
o181 = null;
// 13701
f81632121_513.returns.push(false);
// 13706
f81632121_513.returns.push(false);
// 13707
o181 = {};
// 13708
o184.parentNode = o181;
// 13709
o185 = {};
// 13710
o181.classList = o185;
// 13712
o185.contains = f81632121_513;
// undefined
o185 = null;
// 13713
f81632121_513.returns.push(false);
// 13714
o181.parentNode = o91;
// 13718
f81632121_513.returns.push(false);
// 13723
f81632121_513.returns.push(false);
// 13724
o185 = {};
// 13725
o92.parentNode = o185;
// 13726
o186 = {};
// 13727
o185.classList = o186;
// 13729
o186.contains = f81632121_513;
// 13730
f81632121_513.returns.push(true);
// 13733
o186.remove = f81632121_1114;
// undefined
o186 = null;
// 13734
f81632121_1114.returns.push(undefined);
// 13740
o186 = {};
// 13741
f81632121_508.returns.push(o186);
// undefined
o186 = null;
// 13742
o186 = {};
// 13743
o187 = {};
// 13745
o186.nodeType = void 0;
// 13746
o186.length = 1;
// 13747
o186["0"] = "4kgAq";
// 13750
f81632121_467.returns.push(1374851237153);
// 13753
f81632121_467.returns.push(1374851237153);
// 13755
f81632121_467.returns.push(1374851237153);
// 13758
f81632121_467.returns.push(1374851237153);
// 13761
f81632121_467.returns.push(1374851237153);
// 13763
f81632121_467.returns.push(1374851237153);
// 13766
f81632121_467.returns.push(1374851237154);
// 13769
f81632121_467.returns.push(1374851237154);
// 13772
o188 = {};
// 13773
f81632121_508.returns.push(o188);
// undefined
o188 = null;
// 13775
o188 = {};
// 13776
f81632121_508.returns.push(o188);
// undefined
o188 = null;
// 13778
o188 = {};
// 13779
f81632121_508.returns.push(o188);
// 13781
o189 = {};
// 13782
f81632121_508.returns.push(o189);
// 13783
o188.nodeName = "LI";
// 13784
o188.__FB_TOKEN = void 0;
// 13785
// 13786
o188.getAttribute = f81632121_506;
// 13787
o188.hasAttribute = f81632121_507;
// 13789
f81632121_507.returns.push(false);
// 13790
o188.JSBNG__addEventListener = f81632121_468;
// 13792
f81632121_468.returns.push(undefined);
// 13793
o188.JSBNG__onclick = null;
// undefined
o188 = null;
// 13795
o189.nodeName = "LI";
// 13796
o189.__FB_TOKEN = void 0;
// 13797
// 13798
o189.getAttribute = f81632121_506;
// 13799
o189.hasAttribute = f81632121_507;
// 13801
f81632121_507.returns.push(false);
// 13802
o189.JSBNG__addEventListener = f81632121_468;
// 13804
f81632121_468.returns.push(undefined);
// 13805
o189.JSBNG__onclick = null;
// undefined
o189 = null;
// 13810
f81632121_467.returns.push(1374851237156);
// 13813
f81632121_467.returns.push(1374851237158);
// 13814
o40.getAttribute = f81632121_506;
// undefined
o40 = null;
// 13815
f81632121_506.returns.push("1374637972");
// 13817
f81632121_506.returns.push(null);
// 13818
o41.getAttribute = f81632121_506;
// undefined
o41 = null;
// 13819
f81632121_506.returns.push("1374638034");
// 13821
f81632121_506.returns.push(null);
// 13822
o42.getAttribute = f81632121_506;
// undefined
o42 = null;
// 13823
f81632121_506.returns.push("1374638180");
// 13825
f81632121_506.returns.push(null);
// 13826
o43.getAttribute = f81632121_506;
// undefined
o43 = null;
// 13827
f81632121_506.returns.push("1374733044");
// 13829
f81632121_506.returns.push(null);
// 13830
o48.getAttribute = f81632121_506;
// undefined
o48 = null;
// 13831
f81632121_506.returns.push("1374039953");
// 13833
f81632121_506.returns.push(null);
// 13834
o49.getAttribute = f81632121_506;
// undefined
o49 = null;
// 13835
f81632121_506.returns.push("1374040107");
// 13837
f81632121_506.returns.push(null);
// 13838
o50.getAttribute = f81632121_506;
// undefined
o50 = null;
// 13839
f81632121_506.returns.push("1374040490");
// 13841
f81632121_506.returns.push(null);
// 13842
o51.getAttribute = f81632121_506;
// undefined
o51 = null;
// 13843
f81632121_506.returns.push("1374119198");
// 13845
f81632121_506.returns.push(null);
// 13846
o44.getAttribute = f81632121_506;
// undefined
o44 = null;
// 13847
f81632121_506.returns.push("1373168110");
// 13849
f81632121_506.returns.push(null);
// 13850
o45.getAttribute = f81632121_506;
// undefined
o45 = null;
// 13851
f81632121_506.returns.push("1373214256");
// 13853
f81632121_506.returns.push(null);
// 13854
o46.getAttribute = f81632121_506;
// undefined
o46 = null;
// 13855
f81632121_506.returns.push("1373214355");
// 13857
f81632121_506.returns.push(null);
// 13858
o47.getAttribute = f81632121_506;
// undefined
o47 = null;
// 13859
f81632121_506.returns.push("1373214375");
// 13861
f81632121_506.returns.push(null);
// 13862
o56.getAttribute = f81632121_506;
// undefined
o56 = null;
// 13863
f81632121_506.returns.push("1372985540");
// 13865
f81632121_506.returns.push(null);
// 13866
o57.getAttribute = f81632121_506;
// undefined
o57 = null;
// 13867
f81632121_506.returns.push("1373002430");
// 13869
f81632121_506.returns.push(null);
// 13870
o58.getAttribute = f81632121_506;
// undefined
o58 = null;
// 13871
f81632121_506.returns.push("1373066508");
// 13873
f81632121_506.returns.push(null);
// 13874
o59.getAttribute = f81632121_506;
// undefined
o59 = null;
// 13875
f81632121_506.returns.push("1373066594");
// 13877
f81632121_506.returns.push(null);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 13881
f81632121_467.returns.push(1374851237166);
// 13882
o40 = {};
// undefined
o40 = null;
// undefined
fo81632121_1605_readyState = function() { return fo81632121_1605_readyState.returns[fo81632121_1605_readyState.inst++]; };
fo81632121_1605_readyState.returns = [];
fo81632121_1605_readyState.inst = 0;
defineGetter(o17, "readyState", fo81632121_1605_readyState, undefined);
// undefined
fo81632121_1605_readyState.returns.push(2);
// 13884
o40 = {};
// undefined
o40 = null;
// undefined
fo81632121_1605_readyState.returns.push(3);
// 13886
o40 = {};
// undefined
o40 = null;
// undefined
fo81632121_1605_readyState.returns.push(4);
// 13888
o17.JSBNG__status = 200;
// undefined
fo81632121_1605_readyState.returns.push(4);
// 13890
// undefined
o17 = null;
// 13891
o17 = {};
// 13895
o40 = {};
// 13899
o41 = {};
// 13904
o63.getResponseHeader = f81632121_1332;
// 13907
f81632121_1332.returns.push("/s2QkaS/fr7GuHXgkwmyYd5wa/sWiLHB+XHj7IK5/gk=");
// 13910
f81632121_1332.returns.push("/s2QkaS/fr7GuHXgkwmyYd5wa/sWiLHB+XHj7IK5/gk=");
// 13911
// 13913
o63.JSBNG__status = 200;
// 13917
f81632121_467.returns.push(1374851237173);
// 13918
o76._handleXHRResponse = f81632121_1333;
// 13920
o76.getOption = f81632121_1334;
// 13921
o42 = {};
// 13922
o76.option = o42;
// 13923
o42.suppressEvaluation = false;
// 13926
f81632121_1334.returns.push(false);
// 13927
o63.responseText = "for (;;);{\"__ar\":1,\"payload\":null,\"css\":[\"c6lUE\"],\"bootloadable\":{},\"resource_map\":{\"c6lUE\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y1\\/r\\/i2fjJiK4liE.css\"}},\"ixData\":[]}";
// 13928
o76._unshieldResponseText = f81632121_1336;
// 13929
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":null,\"css\":[\"c6lUE\"],\"bootloadable\":{},\"resource_map\":{\"c6lUE\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y1\\/r\\/i2fjJiK4liE.css\"}},\"ixData\":[]}");
// 13930
o76._interpretResponse = f81632121_1337;
// 13931
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 13932
o76.invokeResponseHandler = f81632121_1338;
// 13933
o76.handler = null;
// 13934
f81632121_1821 = function() { return f81632121_1821.returns[f81632121_1821.inst++]; };
f81632121_1821.returns = [];
f81632121_1821.inst = 0;
// 13935
o76.errorHandler = f81632121_1821;
// 13936
o76._isRelevant = f81632121_1340;
// 13937
o76._allowCrossPageTransition = true;
// 13938
f81632121_1340.returns.push(true);
// 13939
o76._dispatchResponse = f81632121_1341;
// 13940
o76.getURI = f81632121_1342;
// 13941
o43 = {};
// 13942
o76.uri = o43;
// 13944
o43.$URIBase0 = "";
// 13945
o43.$URIBase1 = "";
// 13946
o43.$URIBase2 = "";
// 13947
o43.$URIBase3 = "/ajax/browse/nux.php";
// 13949
o44 = {};
// 13950
o43.$URIBase5 = o44;
// undefined
o44 = null;
// 13951
o43.$URIBase4 = "";
// 13952
f81632121_1344.returns.push("/ajax/browse/nux.php");
// 13953
f81632121_1342.returns.push("/ajax/browse/nux.php");
// 13954
o76.preBootloadHandler = void 0;
// 13965
f81632121_1344.returns.push("/ajax/browse/nux.php");
// 13966
f81632121_1342.returns.push("/ajax/browse/nux.php");
// 13968
f81632121_12.returns.push(50);
// 13972
o44 = {};
// 13973
f81632121_474.returns.push(o44);
// 13975
f81632121_478.returns.push(o44);
// undefined
o44 = null;
// 13976
f81632121_1338.returns.push(undefined);
// 13977
f81632121_1333.returns.push(undefined);
// 13980
o42.asynchronous = true;
// undefined
o42 = null;
// 13983
f81632121_1334.returns.push(true);
// 13984
// 13985
o42 = {};
// 13986
o183.classList = o42;
// 13988
o42.contains = f81632121_513;
// undefined
o42 = null;
// 13989
f81632121_513.returns.push(false);
// 13990
o42 = {};
// 13991
o183.parentNode = o42;
// 13992
o44 = {};
// 13993
o42.classList = o44;
// 13995
o44.contains = f81632121_513;
// undefined
o44 = null;
// 13996
f81632121_513.returns.push(true);
// 13997
o183.getElementsByTagName = f81632121_502;
// 13999
o183.querySelectorAll = f81632121_504;
// 14000
o44 = {};
// 14001
f81632121_504.returns.push(o44);
// 14002
o44.length = 1;
// 14003
o44["0"] = o31;
// undefined
o44 = null;
// 14007
o44 = {};
// 14008
f81632121_504.returns.push(o44);
// 14009
o44.length = 1;
// 14010
o44["0"] = o73;
// undefined
o44 = null;
// 14011
o73.offsetHeight = 966;
// 14012
o31.offsetHeight = 2496;
// 14013
o42.id = "u_0_1a";
// 14017
f81632121_513.returns.push(false);
// 14022
f81632121_513.returns.push(true);
// 14026
o44 = {};
// 14027
f81632121_504.returns.push(o44);
// 14028
o44.length = 1;
// 14029
o44["0"] = o31;
// undefined
o44 = null;
// 14033
o44 = {};
// 14034
f81632121_504.returns.push(o44);
// 14035
o44.length = 1;
// 14036
o44["0"] = o73;
// undefined
o44 = null;
// 14046
f81632121_508.returns.push(o137);
// 14050
f81632121_645.returns.push(true);
// 14051
o44 = {};
// 14052
f81632121_4.returns.push(o44);
// 14053
o44.getPropertyValue = f81632121_1442;
// undefined
o44 = null;
// 14054
f81632121_1442.returns.push("fixed");
// 14056
f81632121_508.returns.push(o139);
// undefined
o139 = null;
// 14058
o88.offsetWidth = 148;
// 14059
o88.offsetHeight = 62;
// 14063
f81632121_645.returns.push(true);
// 14064
o88.getBoundingClientRect = f81632121_1481;
// 14065
o44 = {};
// 14066
f81632121_1481.returns.push(o44);
// 14067
o44.left = 357;
// 14069
o44.JSBNG__top = 10665;
// undefined
o44 = null;
// 14074
o44 = {};
// 14075
o88.classList = o44;
// 14077
o44.contains = f81632121_513;
// undefined
o44 = null;
// 14078
f81632121_513.returns.push(false);
// 14079
o88.parentNode = o85;
// undefined
o88 = null;
// 14080
o44 = {};
// 14081
o85.classList = o44;
// 14083
o44.contains = f81632121_513;
// undefined
o44 = null;
// 14084
f81632121_513.returns.push(false);
// 14085
o85.parentNode = o79;
// undefined
o85 = null;
// 14086
o44 = {};
// 14087
o79.classList = o44;
// 14089
o44.contains = f81632121_513;
// undefined
o44 = null;
// 14090
f81632121_513.returns.push(false);
// 14091
o44 = {};
// 14092
o79.parentNode = o44;
// undefined
o79 = null;
// 14093
o45 = {};
// 14094
o44.classList = o45;
// 14096
o45.contains = f81632121_513;
// undefined
o45 = null;
// 14097
f81632121_513.returns.push(false);
// 14098
o44.parentNode = o183;
// 14102
f81632121_513.returns.push(false);
// 14107
f81632121_513.returns.push(false);
// 14108
o42.parentNode = o29;
// 14109
o45 = {};
// 14110
o29.classList = o45;
// 14112
o45.contains = f81632121_513;
// undefined
o45 = null;
// 14113
f81632121_513.returns.push(false);
// 14114
o29.parentNode = o87;
// 14115
o45 = {};
// 14116
o87.classList = o45;
// 14118
o45.contains = f81632121_513;
// undefined
o45 = null;
// 14119
f81632121_513.returns.push(false);
// 14120
o87.parentNode = o21;
// 14121
o45 = {};
// 14122
o21.classList = o45;
// 14124
o45.contains = f81632121_513;
// undefined
o45 = null;
// 14125
f81632121_513.returns.push(false);
// 14126
o21.parentNode = o20;
// 14127
o45 = {};
// 14128
o20.classList = o45;
// 14130
o45.contains = f81632121_513;
// undefined
o45 = null;
// 14131
f81632121_513.returns.push(false);
// 14132
o45 = {};
// 14133
o20.parentNode = o45;
// 14134
o46 = {};
// 14135
o45.classList = o46;
// 14137
o46.contains = f81632121_513;
// undefined
o46 = null;
// 14138
f81632121_513.returns.push(false);
// 14139
o45.parentNode = o109;
// 14140
o46 = {};
// 14141
o109.classList = o46;
// 14143
o46.contains = f81632121_513;
// undefined
o46 = null;
// 14144
f81632121_513.returns.push(false);
// 14146
o46 = {};
// 14147
o110.classList = o46;
// 14149
o46.contains = f81632121_513;
// undefined
o46 = null;
// 14150
f81632121_513.returns.push(false);
// 14152
o46 = {};
// 14153
o111.classList = o46;
// 14155
o46.contains = f81632121_513;
// undefined
o46 = null;
// 14156
f81632121_513.returns.push(false);
// 14158
o46 = {};
// 14159
o112.classList = o46;
// 14161
o46.contains = f81632121_513;
// undefined
o46 = null;
// 14162
f81632121_513.returns.push(false);
// 14164
o46 = {};
// 14165
o113.classList = o46;
// 14167
o46.contains = f81632121_513;
// undefined
o46 = null;
// 14168
f81632121_513.returns.push(false);
// 14173
f81632121_513.returns.push(false);
// 14178
f81632121_513.returns.push(false);
// 14183
f81632121_513.returns.push(false);
// 14191
o46 = {};
// 14192
f81632121_504.returns.push(o46);
// 14193
o46.length = 1;
// 14194
o46["0"] = o75;
// undefined
o46 = null;
// 14195
o75.getAttribute = f81632121_506;
// 14196
f81632121_506.returns.push("recent");
// 14198
f81632121_506.returns.push("0");
// 14202
o46 = {};
// 14203
f81632121_504.returns.push(o46);
// 14204
o46.length = 1;
// 14205
o46["0"] = o75;
// undefined
o46 = null;
// undefined
o75 = null;
// 14207
f81632121_506.returns.push("recent");
// 14209
f81632121_506.returns.push("0");
// 14215
f81632121_508.returns.push(o93);
// 14216
f81632121_7.returns.push(undefined);
// 14217
f81632121_1852 = function() { return f81632121_1852.returns[f81632121_1852.inst++]; };
f81632121_1852.returns = [];
f81632121_1852.inst = 0;
// 14218
ow81632121.JSBNG__onmousemove = f81632121_1852;
// 14224
o93.getElementsByTagName = f81632121_502;
// 14226
o93.querySelectorAll = f81632121_504;
// 14227
o46 = {};
// 14228
f81632121_504.returns.push(o46);
// 14229
o46.length = 5;
// 14230
o47 = {};
// 14231
o46["0"] = o47;
// 14232
o48 = {};
// 14233
o46["1"] = o48;
// 14234
o49 = {};
// 14235
o46["2"] = o49;
// 14236
o50 = {};
// 14237
o46["3"] = o50;
// 14238
o51 = {};
// 14239
o46["4"] = o51;
// undefined
o46 = null;
// 14240
o47.getElementsByTagName = f81632121_502;
// 14242
o47.querySelectorAll = f81632121_504;
// 14243
o46 = {};
// 14244
f81632121_504.returns.push(o46);
// 14245
o46.length = 1;
// 14246
o56 = {};
// 14247
o46["0"] = o56;
// undefined
o46 = null;
// 14248
o56.getAttribute = f81632121_506;
// 14249
f81632121_506.returns.push("{\"adid\":6011858202131,\"segment\":\"market\"}");
// 14250
o48.getElementsByTagName = f81632121_502;
// 14252
o48.querySelectorAll = f81632121_504;
// 14253
o46 = {};
// 14254
f81632121_504.returns.push(o46);
// 14255
o46.length = 1;
// 14256
o57 = {};
// 14257
o46["0"] = o57;
// undefined
o46 = null;
// 14258
o57.getAttribute = f81632121_506;
// 14259
f81632121_506.returns.push("{\"adid\":6007957621675,\"segment\":\"market\"}");
// 14260
o49.getElementsByTagName = f81632121_502;
// 14262
o49.querySelectorAll = f81632121_504;
// 14263
o46 = {};
// 14264
f81632121_504.returns.push(o46);
// 14265
o46.length = 1;
// 14266
o58 = {};
// 14267
o46["0"] = o58;
// undefined
o46 = null;
// 14268
o58.getAttribute = f81632121_506;
// 14269
f81632121_506.returns.push("{\"adid\":6007651357550,\"segment\":\"market\"}");
// 14270
o50.getElementsByTagName = f81632121_502;
// 14272
o50.querySelectorAll = f81632121_504;
// 14273
o46 = {};
// 14274
f81632121_504.returns.push(o46);
// 14275
o46.length = 1;
// 14276
o59 = {};
// 14277
o46["0"] = o59;
// undefined
o46 = null;
// 14278
o59.getAttribute = f81632121_506;
// 14279
f81632121_506.returns.push("{\"adid\":6010680301716,\"segment\":\"market\"}");
// 14280
o51.getElementsByTagName = f81632121_502;
// 14282
o51.querySelectorAll = f81632121_504;
// 14283
o46 = {};
// 14284
f81632121_504.returns.push(o46);
// 14285
o46.length = 1;
// 14286
o75 = {};
// 14287
o46["0"] = o75;
// undefined
o46 = null;
// 14288
o75.getAttribute = f81632121_506;
// 14289
f81632121_506.returns.push("{\"adid\":6007882470930,\"segment\":\"market\"}");
// 14290
o46 = {};
// 14291
o47.classList = o46;
// 14293
o46.add = f81632121_602;
// 14294
f81632121_602.returns.push(undefined);
// 14295
o79 = {};
// 14296
o93.classList = o79;
// 14298
o79.remove = f81632121_1114;
// undefined
o79 = null;
// 14299
f81632121_1114.returns.push(undefined);
// 14300
o93.setAttribute = f81632121_575;
// 14301
f81632121_575.returns.push(undefined);
// 14302
f81632121_1871 = function() { return f81632121_1871.returns[f81632121_1871.inst++]; };
f81632121_1871.returns = [];
f81632121_1871.inst = 0;
// 14303
o93.cloneNode = f81632121_1871;
// 14304
o79 = {};
// 14305
f81632121_1871.returns.push(o79);
// 14306
// 14307
o79.getElementsByTagName = f81632121_502;
// 14309
o79.querySelectorAll = f81632121_504;
// 14310
o85 = {};
// 14311
f81632121_504.returns.push(o85);
// 14312
o85.length = 5;
// 14313
o88 = {};
// 14314
o85["0"] = o88;
// 14315
o139 = {};
// 14316
o85["1"] = o139;
// 14317
o188 = {};
// 14318
o85["2"] = o188;
// 14319
o189 = {};
// 14320
o85["3"] = o189;
// 14321
o190 = {};
// 14322
o85["4"] = o190;
// undefined
o85 = null;
// 14323
o88.getElementsByTagName = f81632121_502;
// 14325
o88.querySelectorAll = f81632121_504;
// undefined
o88 = null;
// 14326
o85 = {};
// 14327
f81632121_504.returns.push(o85);
// 14328
o85.length = 1;
// 14329
o88 = {};
// 14330
o85["0"] = o88;
// undefined
o85 = null;
// 14331
o88.getAttribute = f81632121_506;
// undefined
o88 = null;
// 14332
f81632121_506.returns.push("{\"adid\":6011858202131,\"segment\":\"market\"}");
// 14333
o139.getElementsByTagName = f81632121_502;
// 14335
o139.querySelectorAll = f81632121_504;
// 14336
o85 = {};
// 14337
f81632121_504.returns.push(o85);
// 14338
o85.length = 1;
// 14339
o88 = {};
// 14340
o85["0"] = o88;
// undefined
o85 = null;
// 14341
o88.getAttribute = f81632121_506;
// undefined
o88 = null;
// 14342
f81632121_506.returns.push("{\"adid\":6007957621675,\"segment\":\"market\"}");
// 14343
o188.getElementsByTagName = f81632121_502;
// 14345
o188.querySelectorAll = f81632121_504;
// 14346
o85 = {};
// 14347
f81632121_504.returns.push(o85);
// 14348
o85.length = 1;
// 14349
o88 = {};
// 14350
o85["0"] = o88;
// undefined
o85 = null;
// 14351
o88.getAttribute = f81632121_506;
// undefined
o88 = null;
// 14352
f81632121_506.returns.push("{\"adid\":6007651357550,\"segment\":\"market\"}");
// 14353
o189.getElementsByTagName = f81632121_502;
// 14355
o189.querySelectorAll = f81632121_504;
// 14356
o85 = {};
// 14357
f81632121_504.returns.push(o85);
// 14358
o85.length = 1;
// 14359
o88 = {};
// 14360
o85["0"] = o88;
// undefined
o85 = null;
// 14361
o88.getAttribute = f81632121_506;
// undefined
o88 = null;
// 14362
f81632121_506.returns.push("{\"adid\":6010680301716,\"segment\":\"market\"}");
// 14363
o190.getElementsByTagName = f81632121_502;
// 14365
o190.querySelectorAll = f81632121_504;
// 14366
o85 = {};
// 14367
f81632121_504.returns.push(o85);
// 14368
o85.length = 1;
// 14369
o88 = {};
// 14370
o85["0"] = o88;
// undefined
o85 = null;
// 14371
o88.getAttribute = f81632121_506;
// undefined
o88 = null;
// 14372
f81632121_506.returns.push("{\"adid\":6007882470930,\"segment\":\"market\"}");
// 14373
o85 = {};
// 14374
o139.parentNode = o85;
// 14376
o85.removeChild = f81632121_521;
// 14377
f81632121_521.returns.push(o139);
// undefined
o139 = null;
// 14378
o188.parentNode = o85;
// 14381
f81632121_521.returns.push(o188);
// undefined
o188 = null;
// 14382
o189.parentNode = o85;
// 14385
f81632121_521.returns.push(o189);
// undefined
o189 = null;
// 14386
o190.parentNode = o85;
// undefined
o85 = null;
// 14389
f81632121_521.returns.push(o190);
// undefined
o190 = null;
// 14390
o85 = {};
// 14391
o79.classList = o85;
// 14393
o85.add = f81632121_602;
// undefined
o85 = null;
// 14394
f81632121_602.returns.push(undefined);
// 14397
o46.remove = f81632121_1114;
// undefined
o46 = null;
// 14398
f81632121_1114.returns.push(undefined);
// 14399
o47.setAttribute = f81632121_575;
// 14400
f81632121_575.returns.push(undefined);
// 14401
o46 = {};
// 14402
o48.classList = o46;
// 14404
o46.remove = f81632121_1114;
// undefined
o46 = null;
// 14405
f81632121_1114.returns.push(undefined);
// 14406
o48.setAttribute = f81632121_575;
// 14407
f81632121_575.returns.push(undefined);
// 14408
o46 = {};
// 14409
o49.classList = o46;
// 14411
o46.remove = f81632121_1114;
// undefined
o46 = null;
// 14412
f81632121_1114.returns.push(undefined);
// 14413
o49.setAttribute = f81632121_575;
// 14414
f81632121_575.returns.push(undefined);
// 14415
o46 = {};
// 14416
o50.classList = o46;
// 14418
o46.add = f81632121_602;
// undefined
o46 = null;
// 14419
f81632121_602.returns.push(undefined);
// 14420
o50.setAttribute = f81632121_575;
// 14421
f81632121_575.returns.push(undefined);
// 14422
o46 = {};
// 14423
o51.classList = o46;
// 14425
o46.add = f81632121_602;
// undefined
o46 = null;
// 14426
f81632121_602.returns.push(undefined);
// 14427
o51.setAttribute = f81632121_575;
// 14428
f81632121_575.returns.push(undefined);
// 14432
f81632121_1114.returns.push(undefined);
// 14434
f81632121_575.returns.push(undefined);
// 14438
o46 = {};
// 14439
f81632121_504.returns.push(o46);
// 14440
o46.length = 1;
// 14441
o46["0"] = o58;
// undefined
o46 = null;
// 14443
f81632121_506.returns.push("{\"adid\":6007651357550,\"segment\":\"market\"}");
// 14445
o46 = {};
// 14446
f81632121_476.returns.push(o46);
// 14447
// 14448
o46.setAttribute = f81632121_575;
// 14450
f81632121_575.returns.push(undefined);
// 14453
f81632121_575.returns.push(undefined);
// 14456
f81632121_575.returns.push(undefined);
// 14459
f81632121_575.returns.push(undefined);
// 14462
f81632121_575.returns.push(undefined);
// 14464
f81632121_575.returns.push(undefined);
// 14465
o46.__html = void 0;
// undefined
o46 = null;
// 14467
o46 = {};
// 14468
f81632121_474.returns.push(o46);
// 14470
o93.appendChild = f81632121_478;
// 14471
f81632121_478.returns.push(o46);
// undefined
o46 = null;
// 14475
o46 = {};
// 14476
f81632121_504.returns.push(o46);
// 14477
o46.length = 1;
// 14478
o46["0"] = o57;
// undefined
o46 = null;
// 14480
f81632121_506.returns.push("{\"adid\":6007957621675,\"segment\":\"market\"}");
// 14482
o46 = {};
// 14483
f81632121_476.returns.push(o46);
// 14484
// 14485
o46.setAttribute = f81632121_575;
// 14487
f81632121_575.returns.push(undefined);
// 14490
f81632121_575.returns.push(undefined);
// 14493
f81632121_575.returns.push(undefined);
// 14496
f81632121_575.returns.push(undefined);
// 14499
f81632121_575.returns.push(undefined);
// 14501
f81632121_575.returns.push(undefined);
// 14502
o46.__html = void 0;
// undefined
o46 = null;
// 14504
o46 = {};
// 14505
f81632121_474.returns.push(o46);
// 14508
f81632121_478.returns.push(o46);
// undefined
o46 = null;
// 14512
o46 = {};
// 14513
f81632121_504.returns.push(o46);
// 14514
o46.length = 1;
// 14515
o46["0"] = o56;
// undefined
o46 = null;
// 14517
f81632121_506.returns.push("{\"adid\":6011858202131,\"segment\":\"market\"}");
// 14519
o46 = {};
// 14520
f81632121_476.returns.push(o46);
// 14521
// 14522
o46.setAttribute = f81632121_575;
// 14524
f81632121_575.returns.push(undefined);
// 14527
f81632121_575.returns.push(undefined);
// 14530
f81632121_575.returns.push(undefined);
// 14533
f81632121_575.returns.push(undefined);
// 14536
f81632121_575.returns.push(undefined);
// 14538
f81632121_575.returns.push(undefined);
// 14539
o46.__html = void 0;
// undefined
o46 = null;
// 14541
o46 = {};
// 14542
f81632121_474.returns.push(o46);
// 14545
f81632121_478.returns.push(o46);
// undefined
o46 = null;
// 14549
o46 = {};
// 14550
f81632121_504.returns.push(o46);
// 14551
o46.length = 1;
// 14552
o46["0"] = o56;
// undefined
o46 = null;
// 14554
f81632121_506.returns.push("{\"adid\":6011858202131,\"segment\":\"market\"}");
// 14558
o46 = {};
// 14559
f81632121_504.returns.push(o46);
// 14560
o46.length = 1;
// 14561
o46["0"] = o57;
// undefined
o46 = null;
// 14563
f81632121_506.returns.push("{\"adid\":6007957621675,\"segment\":\"market\"}");
// 14567
o46 = {};
// 14568
f81632121_504.returns.push(o46);
// 14569
o46.length = 1;
// 14570
o46["0"] = o58;
// undefined
o46 = null;
// 14572
f81632121_506.returns.push("{\"adid\":6007651357550,\"segment\":\"market\"}");
// 14576
o46 = {};
// 14577
f81632121_504.returns.push(o46);
// 14578
o46.length = 1;
// 14579
o85 = {};
// 14580
o46["0"] = o85;
// undefined
o46 = null;
// 14581
o85.complete = true;
// 14582
f81632121_12.returns.push(51);
// 14586
o46 = {};
// 14587
f81632121_504.returns.push(o46);
// 14588
o46.length = 1;
// 14589
o88 = {};
// 14590
o46["0"] = o88;
// undefined
o46 = null;
// 14591
o88.complete = true;
// undefined
o88 = null;
// 14592
f81632121_12.returns.push(52);
// 14596
o46 = {};
// 14597
f81632121_504.returns.push(o46);
// 14598
o46.length = 1;
// 14599
o88 = {};
// 14600
o46["0"] = o88;
// undefined
o46 = null;
// 14601
o88.complete = true;
// undefined
o88 = null;
// 14602
f81632121_12.returns.push(53);
// 14606
o46 = {};
// 14607
f81632121_504.returns.push(o46);
// 14608
o46.length = 1;
// 14609
o88 = {};
// 14610
o46["0"] = o88;
// undefined
o46 = null;
// 14611
o88.complete = true;
// undefined
o88 = null;
// 14612
f81632121_12.returns.push(54);
// 14616
o46 = {};
// 14617
f81632121_504.returns.push(o46);
// 14618
o46.length = 1;
// 14619
o88 = {};
// 14620
o46["0"] = o88;
// undefined
o46 = null;
// 14621
o88.complete = true;
// undefined
o88 = null;
// 14622
f81632121_12.returns.push(55);
// 14623
o79.parentNode = null;
// undefined
o79 = null;
// 14627
f81632121_1114.returns.push(undefined);
// 14630
o46 = {};
// 14631
f81632121_508.returns.push(o46);
// 14632
o46.getElementsByTagName = f81632121_502;
// 14634
o46.querySelectorAll = f81632121_504;
// 14635
o79 = {};
// 14636
f81632121_504.returns.push(o79);
// 14637
o79.length = 0;
// undefined
o79 = null;
// 14641
o79 = {};
// 14642
f81632121_504.returns.push(o79);
// 14643
o79.length = 1;
// 14644
o88 = {};
// 14645
o79["0"] = o88;
// undefined
o79 = null;
// undefined
o88 = null;
// 14646
o79 = {};
// 14647
o46.classList = o79;
// 14649
o79.contains = f81632121_513;
// 14650
f81632121_513.returns.push(false);
// 14652
f81632121_508.returns.push(o137);
// 14653
f81632121_463.returns.push(4);
// 14656
o88 = {};
// 14657
f81632121_508.returns.push(o88);
// 14658
o88.getElementsByTagName = f81632121_502;
// 14660
o88.querySelectorAll = f81632121_504;
// 14661
o139 = {};
// 14662
f81632121_504.returns.push(o139);
// 14663
o139.length = 1;
// 14664
o188 = {};
// 14665
o139["0"] = o188;
// undefined
o139 = null;
// 14669
o139 = {};
// 14670
f81632121_504.returns.push(o139);
// 14671
o139.length = 1;
// 14672
o189 = {};
// 14673
o139["0"] = o189;
// undefined
o139 = null;
// undefined
o189 = null;
// 14677
o139 = {};
// 14678
f81632121_504.returns.push(o139);
// 14679
o139.length = 1;
// 14680
o189 = {};
// 14681
o139["0"] = o189;
// undefined
o139 = null;
// undefined
o189 = null;
// 14682
o188.getElementsByTagName = f81632121_502;
// 14684
o188.querySelectorAll = f81632121_504;
// 14685
o139 = {};
// 14686
f81632121_504.returns.push(o139);
// 14687
o139.length = 1;
// 14688
o189 = {};
// 14689
o139["0"] = o189;
// undefined
o139 = null;
// undefined
o189 = null;
// 14690
o139 = {};
// 14691
o188.classList = o139;
// 14693
o139.contains = f81632121_513;
// undefined
o139 = null;
// 14694
f81632121_513.returns.push(false);
// 14695
o139 = {};
// 14696
o188.parentNode = o139;
// undefined
o188 = null;
// 14697
o188 = {};
// 14698
o139.classList = o188;
// 14700
o188.contains = f81632121_513;
// undefined
o188 = null;
// 14701
f81632121_513.returns.push(false);
// 14702
o139.parentNode = o88;
// undefined
o139 = null;
// 14703
o139 = {};
// 14704
o88.classList = o139;
// 14706
o139.contains = f81632121_513;
// undefined
o139 = null;
// 14707
f81632121_513.returns.push(true);
// 14708
o88.__FB_TOKEN = void 0;
// 14709
// 14710
o88.getAttribute = f81632121_506;
// 14711
o88.hasAttribute = f81632121_507;
// 14713
f81632121_507.returns.push(false);
// 14717
f81632121_513.returns.push(true);
// 14718
o139 = {};
// 14719
o88.childNodes = o139;
// undefined
o88 = null;
// 14720
o139.nodeType = void 0;
// 14721
o139.classList = void 0;
// 14722
o139.className = void 0;
// 14723
o139.childNodes = void 0;
// undefined
o139 = null;
// 14728
f81632121_467.returns.push(1374851241263);
// 14732
o88 = {};
// 14733
o139 = {};
// 14735
o88.nodeType = void 0;
// 14736
o88.length = 1;
// 14737
o88["0"] = "R940f";
// 14740
f81632121_467.returns.push(1374851241281);
// 14743
f81632121_467.returns.push(1374851241281);
// 14745
f81632121_467.returns.push(1374851241282);
// 14748
f81632121_467.returns.push(1374851241282);
// 14751
f81632121_467.returns.push(1374851241283);
// 14753
f81632121_467.returns.push(1374851241283);
// 14756
f81632121_467.returns.push(1374851241284);
// 14759
f81632121_467.returns.push(1374851241284);
// 14762
f81632121_508.returns.push(o95);
// 14763
o188 = {};
// 14764
o95.childNodes = o188;
// 14765
o189 = {};
// 14766
o188["0"] = o189;
// 14767
o188.length = 8;
// 14769
o189.getAttribute = f81632121_506;
// 14770
f81632121_506.returns.push("recent");
// 14773
o189.getElementsByTagName = f81632121_502;
// 14775
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 14776
o189 = {};
// 14777
f81632121_504.returns.push(o189);
// 14778
o189.length = 0;
// undefined
o189 = null;
// 14781
f81632121_506.returns.push(null);
// 14783
o189 = {};
// 14784
o188["1"] = o189;
// 14785
o189.getAttribute = f81632121_506;
// 14786
f81632121_506.returns.push("year_2013");
// 14789
o189.getElementsByTagName = f81632121_502;
// 14791
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 14792
o189 = {};
// 14793
f81632121_504.returns.push(o189);
// 14794
o189.length = 1;
// 14795
o190 = {};
// 14796
o189["0"] = o190;
// undefined
o189 = null;
// 14797
o189 = {};
// 14798
o190.childNodes = o189;
// undefined
o190 = null;
// 14799
o189.length = 1;
// 14800
o190 = {};
// 14801
o189["0"] = o190;
// undefined
o189 = null;
// 14802
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14803
f81632121_506.returns.push("month_2013_1");
// 14808
f81632121_506.returns.push("2010s");
// 14811
o189 = {};
// 14812
o188["2"] = o189;
// 14813
o189.getAttribute = f81632121_506;
// 14814
f81632121_506.returns.push("year_2012");
// 14817
o189.getElementsByTagName = f81632121_502;
// 14819
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 14820
o189 = {};
// 14821
f81632121_504.returns.push(o189);
// 14822
o189.length = 1;
// 14823
o190 = {};
// 14824
o189["0"] = o190;
// undefined
o189 = null;
// 14825
o189 = {};
// 14826
o190.childNodes = o189;
// undefined
o190 = null;
// 14827
o189.length = 12;
// 14828
o190 = {};
// 14829
o189["0"] = o190;
// 14830
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14831
f81632121_506.returns.push("month_2012_12");
// 14834
o190 = {};
// 14835
o189["1"] = o190;
// 14836
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14837
f81632121_506.returns.push("month_2012_11");
// 14840
o190 = {};
// 14841
o189["2"] = o190;
// 14842
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14843
f81632121_506.returns.push("month_2012_10");
// 14846
o190 = {};
// 14847
o189["3"] = o190;
// 14848
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14849
f81632121_506.returns.push("month_2012_9");
// 14852
o190 = {};
// 14853
o189["4"] = o190;
// 14854
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14855
f81632121_506.returns.push("month_2012_8");
// 14858
o190 = {};
// 14859
o189["5"] = o190;
// 14860
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14861
f81632121_506.returns.push("month_2012_7");
// 14864
o190 = {};
// 14865
o189["6"] = o190;
// 14866
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14867
f81632121_506.returns.push("month_2012_6");
// 14870
o190 = {};
// 14871
o189["7"] = o190;
// 14872
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14873
f81632121_506.returns.push("month_2012_5");
// 14876
o190 = {};
// 14877
o189["8"] = o190;
// 14878
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14879
f81632121_506.returns.push("month_2012_4");
// 14882
o190 = {};
// 14883
o189["9"] = o190;
// 14884
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14885
f81632121_506.returns.push("month_2012_3");
// 14888
o190 = {};
// 14889
o189["10"] = o190;
// 14890
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14891
f81632121_506.returns.push("month_2012_2");
// 14894
o190 = {};
// 14895
o189["11"] = o190;
// undefined
o189 = null;
// 14896
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14897
f81632121_506.returns.push("month_2012_1");
// 14902
f81632121_506.returns.push("2010s");
// 14905
o189 = {};
// 14906
o188["3"] = o189;
// 14907
o189.getAttribute = f81632121_506;
// 14908
f81632121_506.returns.push("year_2011");
// 14911
o189.getElementsByTagName = f81632121_502;
// 14913
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 14914
o189 = {};
// 14915
f81632121_504.returns.push(o189);
// 14916
o189.length = 1;
// 14917
o190 = {};
// 14918
o189["0"] = o190;
// undefined
o189 = null;
// 14919
o189 = {};
// 14920
o190.childNodes = o189;
// undefined
o190 = null;
// 14921
o189.length = 12;
// 14922
o190 = {};
// 14923
o189["0"] = o190;
// 14924
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14925
f81632121_506.returns.push("month_2011_12");
// 14928
o190 = {};
// 14929
o189["1"] = o190;
// 14930
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14931
f81632121_506.returns.push("month_2011_11");
// 14934
o190 = {};
// 14935
o189["2"] = o190;
// 14936
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14937
f81632121_506.returns.push("month_2011_10");
// 14940
o190 = {};
// 14941
o189["3"] = o190;
// 14942
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14943
f81632121_506.returns.push("month_2011_9");
// 14946
o190 = {};
// 14947
o189["4"] = o190;
// 14948
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14949
f81632121_506.returns.push("month_2011_8");
// 14952
o190 = {};
// 14953
o189["5"] = o190;
// 14954
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14955
f81632121_506.returns.push("month_2011_7");
// 14958
o190 = {};
// 14959
o189["6"] = o190;
// 14960
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14961
f81632121_506.returns.push("month_2011_6");
// 14964
o190 = {};
// 14965
o189["7"] = o190;
// 14966
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14967
f81632121_506.returns.push("month_2011_5");
// 14970
o190 = {};
// 14971
o189["8"] = o190;
// 14972
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14973
f81632121_506.returns.push("month_2011_4");
// 14976
o190 = {};
// 14977
o189["9"] = o190;
// 14978
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14979
f81632121_506.returns.push("month_2011_3");
// 14982
o190 = {};
// 14983
o189["10"] = o190;
// 14984
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14985
f81632121_506.returns.push("month_2011_2");
// 14988
o190 = {};
// 14989
o189["11"] = o190;
// undefined
o189 = null;
// 14990
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 14991
f81632121_506.returns.push("month_2011_1");
// 14996
f81632121_506.returns.push("2010s");
// 14999
o189 = {};
// 15000
o188["4"] = o189;
// 15001
o189.getAttribute = f81632121_506;
// 15002
f81632121_506.returns.push("year_2010");
// 15005
o189.getElementsByTagName = f81632121_502;
// 15007
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 15008
o189 = {};
// 15009
f81632121_504.returns.push(o189);
// 15010
o189.length = 1;
// 15011
o190 = {};
// 15012
o189["0"] = o190;
// undefined
o189 = null;
// 15013
o189 = {};
// 15014
o190.childNodes = o189;
// undefined
o190 = null;
// 15015
o189.length = 12;
// 15016
o190 = {};
// 15017
o189["0"] = o190;
// 15018
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15019
f81632121_506.returns.push("month_2010_12");
// 15022
o190 = {};
// 15023
o189["1"] = o190;
// 15024
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15025
f81632121_506.returns.push("month_2010_11");
// 15028
o190 = {};
// 15029
o189["2"] = o190;
// 15030
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15031
f81632121_506.returns.push("month_2010_10");
// 15034
o190 = {};
// 15035
o189["3"] = o190;
// 15036
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15037
f81632121_506.returns.push("month_2010_9");
// 15040
o190 = {};
// 15041
o189["4"] = o190;
// 15042
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15043
f81632121_506.returns.push("month_2010_8");
// 15046
o190 = {};
// 15047
o189["5"] = o190;
// 15048
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15049
f81632121_506.returns.push("month_2010_7");
// 15052
o190 = {};
// 15053
o189["6"] = o190;
// 15054
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15055
f81632121_506.returns.push("month_2010_6");
// 15058
o190 = {};
// 15059
o189["7"] = o190;
// 15060
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15061
f81632121_506.returns.push("month_2010_5");
// 15064
o190 = {};
// 15065
o189["8"] = o190;
// 15066
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15067
f81632121_506.returns.push("month_2010_4");
// 15070
o190 = {};
// 15071
o189["9"] = o190;
// 15072
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15073
f81632121_506.returns.push("month_2010_3");
// 15076
o190 = {};
// 15077
o189["10"] = o190;
// 15078
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15079
f81632121_506.returns.push("month_2010_2");
// 15082
o190 = {};
// 15083
o189["11"] = o190;
// undefined
o189 = null;
// 15084
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15085
f81632121_506.returns.push("month_2010_1");
// 15090
f81632121_506.returns.push("2010s");
// 15093
o189 = {};
// 15094
o188["5"] = o189;
// 15095
o189.getAttribute = f81632121_506;
// 15096
f81632121_506.returns.push("year_2009");
// 15099
o189.getElementsByTagName = f81632121_502;
// 15101
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 15102
o189 = {};
// 15103
f81632121_504.returns.push(o189);
// 15104
o189.length = 1;
// 15105
o190 = {};
// 15106
o189["0"] = o190;
// undefined
o189 = null;
// 15107
o189 = {};
// 15108
o190.childNodes = o189;
// undefined
o190 = null;
// 15109
o189.length = 12;
// 15110
o190 = {};
// 15111
o189["0"] = o190;
// 15112
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15113
f81632121_506.returns.push("month_2009_12");
// 15116
o190 = {};
// 15117
o189["1"] = o190;
// 15118
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15119
f81632121_506.returns.push("month_2009_11");
// 15122
o190 = {};
// 15123
o189["2"] = o190;
// 15124
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15125
f81632121_506.returns.push("month_2009_10");
// 15128
o190 = {};
// 15129
o189["3"] = o190;
// 15130
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15131
f81632121_506.returns.push("month_2009_9");
// 15134
o190 = {};
// 15135
o189["4"] = o190;
// 15136
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15137
f81632121_506.returns.push("month_2009_8");
// 15140
o190 = {};
// 15141
o189["5"] = o190;
// 15142
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15143
f81632121_506.returns.push("month_2009_7");
// 15146
o190 = {};
// 15147
o189["6"] = o190;
// 15148
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15149
f81632121_506.returns.push("month_2009_6");
// 15152
o190 = {};
// 15153
o189["7"] = o190;
// 15154
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15155
f81632121_506.returns.push("month_2009_5");
// 15158
o190 = {};
// 15159
o189["8"] = o190;
// 15160
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15161
f81632121_506.returns.push("month_2009_4");
// 15164
o190 = {};
// 15165
o189["9"] = o190;
// 15166
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15167
f81632121_506.returns.push("month_2009_3");
// 15170
o190 = {};
// 15171
o189["10"] = o190;
// 15172
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15173
f81632121_506.returns.push("month_2009_2");
// 15176
o190 = {};
// 15177
o189["11"] = o190;
// undefined
o189 = null;
// 15178
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15179
f81632121_506.returns.push("month_2009_1");
// 15184
f81632121_506.returns.push("2000s");
// 15187
o189 = {};
// 15188
o188["6"] = o189;
// 15189
o189.getAttribute = f81632121_506;
// 15190
f81632121_506.returns.push("year_2008");
// 15193
o189.getElementsByTagName = f81632121_502;
// 15195
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 15196
o189 = {};
// 15197
f81632121_504.returns.push(o189);
// 15198
o189.length = 1;
// 15199
o190 = {};
// 15200
o189["0"] = o190;
// undefined
o189 = null;
// 15201
o189 = {};
// 15202
o190.childNodes = o189;
// undefined
o190 = null;
// 15203
o189.length = 12;
// 15204
o190 = {};
// 15205
o189["0"] = o190;
// 15206
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15207
f81632121_506.returns.push("month_2008_12");
// 15210
o190 = {};
// 15211
o189["1"] = o190;
// 15212
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15213
f81632121_506.returns.push("month_2008_11");
// 15216
o190 = {};
// 15217
o189["2"] = o190;
// 15218
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15219
f81632121_506.returns.push("month_2008_10");
// 15222
o190 = {};
// 15223
o189["3"] = o190;
// 15224
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15225
f81632121_506.returns.push("month_2008_9");
// 15228
o190 = {};
// 15229
o189["4"] = o190;
// 15230
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15231
f81632121_506.returns.push("month_2008_8");
// 15234
o190 = {};
// 15235
o189["5"] = o190;
// 15236
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15237
f81632121_506.returns.push("month_2008_7");
// 15240
o190 = {};
// 15241
o189["6"] = o190;
// 15242
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15243
f81632121_506.returns.push("month_2008_6");
// 15246
o190 = {};
// 15247
o189["7"] = o190;
// 15248
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15249
f81632121_506.returns.push("month_2008_5");
// 15252
o190 = {};
// 15253
o189["8"] = o190;
// 15254
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15255
f81632121_506.returns.push("month_2008_4");
// 15258
o190 = {};
// 15259
o189["9"] = o190;
// 15260
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15261
f81632121_506.returns.push("month_2008_3");
// 15264
o190 = {};
// 15265
o189["10"] = o190;
// 15266
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15267
f81632121_506.returns.push("month_2008_2");
// 15270
o190 = {};
// 15271
o189["11"] = o190;
// undefined
o189 = null;
// 15272
o190.getAttribute = f81632121_506;
// undefined
o190 = null;
// 15273
f81632121_506.returns.push("month_2008_1");
// 15278
f81632121_506.returns.push("2000s");
// 15281
o189 = {};
// 15282
o188["7"] = o189;
// undefined
o188 = null;
// 15283
o189.getAttribute = f81632121_506;
// 15284
f81632121_506.returns.push("way_back");
// 15287
o189.getElementsByTagName = f81632121_502;
// 15289
o189.querySelectorAll = f81632121_504;
// undefined
o189 = null;
// 15290
o188 = {};
// 15291
f81632121_504.returns.push(o188);
// 15292
o188.length = 0;
// undefined
o188 = null;
// 15295
f81632121_506.returns.push(null);
// 15297
o95.nodeName = "UL";
// 15298
o95.__FB_TOKEN = void 0;
// 15299
// 15300
o95.getAttribute = f81632121_506;
// 15301
o95.hasAttribute = f81632121_507;
// 15303
f81632121_507.returns.push(false);
// 15304
o95.JSBNG__addEventListener = f81632121_468;
// 15306
f81632121_468.returns.push(undefined);
// 15307
o95.JSBNG__onclick = null;
// 15312
f81632121_468.returns.push(undefined);
// 15313
o95.JSBNG__onkeydown = null;
// 15315
o95.getElementsByTagName = f81632121_502;
// 15317
o95.querySelectorAll = f81632121_504;
// 15318
o188 = {};
// 15319
f81632121_504.returns.push(o188);
// 15320
o188.length = 69;
// 15321
o189 = {};
// 15322
o188["0"] = o189;
// undefined
o189 = null;
// 15323
o189 = {};
// 15324
o188["1"] = o189;
// undefined
o189 = null;
// 15325
o189 = {};
// 15326
o188["2"] = o189;
// undefined
o189 = null;
// 15327
o189 = {};
// 15328
o188["3"] = o189;
// undefined
o189 = null;
// 15329
o189 = {};
// 15330
o188["4"] = o189;
// undefined
o189 = null;
// 15331
o189 = {};
// 15332
o188["5"] = o189;
// undefined
o189 = null;
// 15333
o189 = {};
// 15334
o188["6"] = o189;
// undefined
o189 = null;
// 15335
o189 = {};
// 15336
o188["7"] = o189;
// undefined
o189 = null;
// 15337
o189 = {};
// 15338
o188["8"] = o189;
// undefined
o189 = null;
// 15339
o189 = {};
// 15340
o188["9"] = o189;
// undefined
o189 = null;
// 15341
o189 = {};
// 15342
o188["10"] = o189;
// undefined
o189 = null;
// 15343
o189 = {};
// 15344
o188["11"] = o189;
// undefined
o189 = null;
// 15345
o189 = {};
// 15346
o188["12"] = o189;
// undefined
o189 = null;
// 15347
o189 = {};
// 15348
o188["13"] = o189;
// undefined
o189 = null;
// 15349
o189 = {};
// 15350
o188["14"] = o189;
// undefined
o189 = null;
// 15351
o189 = {};
// 15352
o188["15"] = o189;
// undefined
o189 = null;
// 15353
o189 = {};
// 15354
o188["16"] = o189;
// undefined
o189 = null;
// 15355
o189 = {};
// 15356
o188["17"] = o189;
// undefined
o189 = null;
// 15357
o189 = {};
// 15358
o188["18"] = o189;
// undefined
o189 = null;
// 15359
o189 = {};
// 15360
o188["19"] = o189;
// undefined
o189 = null;
// 15361
o189 = {};
// 15362
o188["20"] = o189;
// undefined
o189 = null;
// 15363
o189 = {};
// 15364
o188["21"] = o189;
// undefined
o189 = null;
// 15365
o189 = {};
// 15366
o188["22"] = o189;
// undefined
o189 = null;
// 15367
o189 = {};
// 15368
o188["23"] = o189;
// undefined
o189 = null;
// 15369
o189 = {};
// 15370
o188["24"] = o189;
// undefined
o189 = null;
// 15371
o189 = {};
// 15372
o188["25"] = o189;
// undefined
o189 = null;
// 15373
o189 = {};
// 15374
o188["26"] = o189;
// undefined
o189 = null;
// 15375
o189 = {};
// 15376
o188["27"] = o189;
// undefined
o189 = null;
// 15377
o189 = {};
// 15378
o188["28"] = o189;
// undefined
o189 = null;
// 15379
o189 = {};
// 15380
o188["29"] = o189;
// undefined
o189 = null;
// 15381
o189 = {};
// 15382
o188["30"] = o189;
// undefined
o189 = null;
// 15383
o189 = {};
// 15384
o188["31"] = o189;
// undefined
o189 = null;
// 15385
o189 = {};
// 15386
o188["32"] = o189;
// undefined
o189 = null;
// 15387
o189 = {};
// 15388
o188["33"] = o189;
// undefined
o189 = null;
// 15389
o189 = {};
// 15390
o188["34"] = o189;
// undefined
o189 = null;
// 15391
o189 = {};
// 15392
o188["35"] = o189;
// undefined
o189 = null;
// 15393
o189 = {};
// 15394
o188["36"] = o189;
// undefined
o189 = null;
// 15395
o189 = {};
// 15396
o188["37"] = o189;
// undefined
o189 = null;
// 15397
o189 = {};
// 15398
o188["38"] = o189;
// undefined
o189 = null;
// 15399
o189 = {};
// 15400
o188["39"] = o189;
// undefined
o189 = null;
// 15401
o189 = {};
// 15402
o188["40"] = o189;
// undefined
o189 = null;
// 15403
o189 = {};
// 15404
o188["41"] = o189;
// undefined
o189 = null;
// 15405
o189 = {};
// 15406
o188["42"] = o189;
// undefined
o189 = null;
// 15407
o189 = {};
// 15408
o188["43"] = o189;
// undefined
o189 = null;
// 15409
o189 = {};
// 15410
o188["44"] = o189;
// undefined
o189 = null;
// 15411
o189 = {};
// 15412
o188["45"] = o189;
// undefined
o189 = null;
// 15413
o189 = {};
// 15414
o188["46"] = o189;
// undefined
o189 = null;
// 15415
o189 = {};
// 15416
o188["47"] = o189;
// undefined
o189 = null;
// 15417
o189 = {};
// 15418
o188["48"] = o189;
// undefined
o189 = null;
// 15419
o189 = {};
// 15420
o188["49"] = o189;
// undefined
o189 = null;
// 15421
o189 = {};
// 15422
o188["50"] = o189;
// undefined
o189 = null;
// 15423
o189 = {};
// 15424
o188["51"] = o189;
// undefined
o189 = null;
// 15425
o189 = {};
// 15426
o188["52"] = o189;
// undefined
o189 = null;
// 15427
o189 = {};
// 15428
o188["53"] = o189;
// undefined
o189 = null;
// 15429
o189 = {};
// 15430
o188["54"] = o189;
// undefined
o189 = null;
// 15431
o189 = {};
// 15432
o188["55"] = o189;
// undefined
o189 = null;
// 15433
o189 = {};
// 15434
o188["56"] = o189;
// undefined
o189 = null;
// 15435
o189 = {};
// 15436
o188["57"] = o189;
// undefined
o189 = null;
// 15437
o189 = {};
// 15438
o188["58"] = o189;
// undefined
o189 = null;
// 15439
o189 = {};
// 15440
o188["59"] = o189;
// undefined
o189 = null;
// 15441
o189 = {};
// 15442
o188["60"] = o189;
// undefined
o189 = null;
// 15443
o189 = {};
// 15444
o188["61"] = o189;
// undefined
o189 = null;
// 15445
o189 = {};
// 15446
o188["62"] = o189;
// undefined
o189 = null;
// 15447
o189 = {};
// 15448
o188["63"] = o189;
// undefined
o189 = null;
// 15449
o189 = {};
// 15450
o188["64"] = o189;
// undefined
o189 = null;
// 15451
o189 = {};
// 15452
o188["65"] = o189;
// undefined
o189 = null;
// 15453
o189 = {};
// 15454
o188["66"] = o189;
// undefined
o189 = null;
// 15455
o189 = {};
// 15456
o188["67"] = o189;
// undefined
o189 = null;
// 15457
o189 = {};
// 15458
o188["68"] = o189;
// undefined
o188 = null;
// undefined
o189 = null;
// 15459
o188 = {};
// 15460
o95.classList = o188;
// 15462
o188.remove = f81632121_1114;
// undefined
o188 = null;
// 15463
f81632121_1114.returns.push(undefined);
// 15466
o95.offsetHeight = 200;
// 15470
f81632121_1114.returns.push(undefined);
// 15475
f81632121_513.returns.push(false);
// 15477
f81632121_508.returns.push(o86);
// 15478
o188 = {};
// 15479
o86.classList = o188;
// 15481
o188.contains = f81632121_513;
// undefined
o188 = null;
// 15482
f81632121_513.returns.push(false);
// 15483
o95.parentNode = o86;
// undefined
o95 = null;
// undefined
o86 = null;
// 15485
f81632121_467.returns.push(1374851241334);
// 15493
o86 = {};
// 15494
f81632121_476.returns.push(o86);
// 15495
// 15496
// 15497
o86.getElementsByTagName = f81632121_502;
// 15498
o95 = {};
// 15499
f81632121_502.returns.push(o95);
// 15500
o95.length = 0;
// undefined
o95 = null;
// 15502
o95 = {};
// 15503
o86.childNodes = o95;
// undefined
o86 = null;
// 15504
o95.nodeType = void 0;
// 15505
o95.__html = void 0;
// 15506
o95.mountComponentIntoNode = void 0;
// 15507
o95.classList = void 0;
// 15509
o95.className = void 0;
// 15511
// 15512
o95.__FB_TOKEN = void 0;
// 15513
// 15514
o95.getElementsByTagName = void 0;
// 15517
// 15521
o86 = {};
// 15522
f81632121_474.returns.push(o86);
// 15526
f81632121_478.returns.push(o86);
// undefined
o86 = null;
// 15527
o95.getAttribute = void 0;
// 15544
// 15557
// 15565
o86 = {};
// 15566
f81632121_476.returns.push(o86);
// 15567
// 15568
o86.__html = void 0;
// undefined
o86 = null;
// 15570
o86 = {};
// 15571
f81632121_474.returns.push(o86);
// undefined
o86 = null;
// 15573
o95.appendChild = void 0;
// undefined
o95 = null;
// 15578
f81632121_467.returns.push(1374851241385);
// 15581
o86 = {};
// 15582
f81632121_476.returns.push(o86);
// 15583
// 15584
// 15585
o86.getElementsByTagName = f81632121_502;
// 15586
o95 = {};
// 15587
f81632121_502.returns.push(o95);
// 15588
o95.length = 0;
// undefined
o95 = null;
// 15590
o95 = {};
// 15591
o86.childNodes = o95;
// undefined
o86 = null;
// 15592
o95.nodeType = void 0;
// 15593
o95.__html = void 0;
// 15594
o95.mountComponentIntoNode = void 0;
// 15595
o95.classList = void 0;
// 15597
o95.className = void 0;
// 15599
// 15600
o95.__FB_TOKEN = void 0;
// 15601
// 15602
o95.getElementsByTagName = void 0;
// 15605
// 15609
o86 = {};
// 15610
f81632121_474.returns.push(o86);
// 15614
f81632121_478.returns.push(o86);
// undefined
o86 = null;
// 15615
o95.getAttribute = void 0;
// 15632
// 15645
// 15653
o86 = {};
// 15654
f81632121_476.returns.push(o86);
// 15655
// 15656
o86.__html = void 0;
// undefined
o86 = null;
// 15658
o86 = {};
// 15659
f81632121_474.returns.push(o86);
// undefined
o86 = null;
// 15661
o95.appendChild = void 0;
// undefined
o95 = null;
// 15664
o86 = {};
// 15665
o95 = {};
// 15667
o86.nodeType = void 0;
// 15668
o86.length = 1;
// 15669
o86["0"] = "bmJBG";
// 15676
o188 = {};
// 15677
f81632121_508.returns.push(o188);
// 15678
o188.getAttribute = f81632121_506;
// 15679
f81632121_506.returns.push(null);
// 15680
o188.setAttribute = f81632121_575;
// 15681
f81632121_575.returns.push(undefined);
// 15682
f81632121_12.returns.push(56);
// 15691
o189 = {};
// 15692
o190 = {};
// 15694
o189.nodeType = void 0;
// 15695
o189.length = 1;
// 15696
o189["0"] = "dm/WP";
// 15699
f81632121_467.returns.push(1374851241441);
// 15702
f81632121_467.returns.push(1374851241442);
// 15705
f81632121_508.returns.push(o56);
// 15706
o56.__FB_TOKEN = void 0;
// 15707
// 15710
f81632121_508.returns.push(o57);
// 15711
o57.__FB_TOKEN = void 0;
// 15712
// undefined
o57 = null;
// 15715
f81632121_508.returns.push(o58);
// 15716
o58.__FB_TOKEN = void 0;
// 15717
// undefined
o58 = null;
// 15720
f81632121_508.returns.push(o59);
// 15721
o59.__FB_TOKEN = void 0;
// 15722
// undefined
o59 = null;
// 15725
f81632121_508.returns.push(o75);
// 15726
o75.__FB_TOKEN = void 0;
// 15727
// undefined
o75 = null;
// 15729
f81632121_467.returns.push(1374851241443);
// 15732
o51.offsetHeight = 136;
// undefined
o51 = null;
// 15733
f81632121_575.returns.push(undefined);
// 15735
o47.offsetHeight = 174;
// 15736
f81632121_575.returns.push(undefined);
// 15738
o76.clearStatusIndicator = f81632121_1347;
// 15739
o76.getStatusElement = f81632121_1348;
// 15740
o76.statusElement = null;
// 15741
f81632121_1348.returns.push(null);
// 15742
f81632121_1347.returns.push(undefined);
// 15745
f81632121_1340.returns.push(true);
// 15746
o76.initialHandler = f81632121_1349;
// 15747
f81632121_1349.returns.push(undefined);
// 15748
o76.timer = null;
// 15749
f81632121_14.returns.push(undefined);
// 15751
o76._handleJSResponse = f81632121_1351;
// 15752
o76.getRelativeTo = f81632121_1352;
// 15753
o76.relativeTo = null;
// 15754
f81632121_1352.returns.push(null);
// 15755
o76._handleJSRegisters = f81632121_1353;
// 15756
f81632121_1353.returns.push(undefined);
// 15757
o76.lid = void 0;
// 15759
f81632121_1353.returns.push(undefined);
// 15760
f81632121_1351.returns.push(undefined);
// 15761
o76.finallyHandler = f81632121_1349;
// 15762
f81632121_1349.returns.push(undefined);
// 15763
f81632121_1341.returns.push(undefined);
// 15765
o49.offsetHeight = 201;
// undefined
o49 = null;
// 15766
f81632121_575.returns.push(undefined);
// 15768
o48.offsetHeight = 214;
// undefined
o48 = null;
// 15769
f81632121_575.returns.push(undefined);
// 15771
o50.offsetHeight = 240;
// undefined
o50 = null;
// 15772
f81632121_575.returns.push(undefined);
// 15774
f81632121_467.returns.push(1374851241448);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 15778
f81632121_467.returns.push(1374851241449);
// 15779
o137.offsetTop = 0;
// 15782
o79.add = f81632121_602;
// undefined
o79 = null;
// 15783
f81632121_602.returns.push(undefined);
// 15784
f81632121_463.returns.push(5);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 15792
f81632121_467.returns.push(1374851243809);
// 15793
f81632121_13.returns.push(57);
// 15795
f81632121_467.returns.push(1374851243810);
// 15796
f81632121_466.returns.push(0.8382938504219055);
// 15798
f81632121_467.returns.push(1374851243810);
// 15801
f81632121_467.returns.push(1374851243810);
// 15803
f81632121_466.returns.push(0.39578074193559587);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2");
// 15806
// 15807
f81632121_2117 = function() { return f81632121_2117.returns[f81632121_2117.inst++]; };
f81632121_2117.returns = [];
f81632121_2117.inst = 0;
// 15808
ow81632121.JSBNG__onpageshow = f81632121_2117;
// 15809
f81632121_7.returns.push(undefined);
// 15810
f81632121_2118 = function() { return f81632121_2118.returns[f81632121_2118.inst++]; };
f81632121_2118.returns = [];
f81632121_2118.inst = 0;
// 15811
ow81632121.JSBNG__onpagehide = f81632121_2118;
// 15814
o48 = {};
// 15815
f81632121_0.returns.push(o48);
// undefined
o48 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 15817
f81632121_14.returns.push(undefined);
// 15818
o48 = {};
// 15819
f81632121_0.returns.push(o48);
// undefined
o48 = null;
// 15820
o48 = {};
// 15821
f81632121_0.returns.push(o48);
// undefined
o48 = null;
// 15822
o48 = {};
// 15823
f81632121_0.returns.push(o48);
// undefined
o48 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 15825
o48 = {};
// 15826
f81632121_70.returns.push(o48);
// 15827
o48.open = f81632121_1294;
// 15828
f81632121_1294.returns.push(undefined);
// 15829
// 15830
f81632121_12.returns.push(58);
// 15832
f81632121_467.returns.push(1374851243816);
// 15833
o48.send = f81632121_1296;
// 15834
f81632121_1296.returns.push(undefined);
// 15837
f81632121_467.returns.push(1374851243816);
// 15839
f81632121_467.returns.push(1374851243818);
// 15841
f81632121_467.returns.push(1374851243818);
// 15842
f81632121_13.returns.push(59);
// 15843
f81632121_13.returns.push(60);
// 15845
f81632121_467.returns.push(1374851243819);
// 15846
f81632121_12.returns.push(61);
// 15848
f81632121_12.returns.push(62);
// 15849
f81632121_12.returns.push(63);
// 15850
f81632121_12.returns.push(64);
// 15851
f81632121_12.returns.push(65);
// 15852
f81632121_12.returns.push(66);
// 15854
f81632121_467.returns.push(1374851243824);
// 15855
f81632121_466.returns.push(0.9318111049942672);
// 15857
f81632121_467.returns.push(1374851243825);
// 15859
f81632121_467.returns.push(1374851243825);
// 15861
f81632121_467.returns.push(1374851243825);
// 15862
f81632121_14.returns.push(undefined);
// 15863
f81632121_12.returns.push(67);
// 15864
f81632121_12.returns.push(68);
// 15868
o49 = {};
// 15869
f81632121_508.returns.push(o49);
// 15872
f81632121_467.returns.push(1374851243830);
// 15874
o50 = {};
// 15875
f81632121_508.returns.push(o50);
// 15876
o50.__FB_TOKEN = void 0;
// 15877
// 15878
o49.getElementsByTagName = f81632121_502;
// 15880
o49.querySelectorAll = f81632121_504;
// 15881
o51 = {};
// 15882
f81632121_504.returns.push(o51);
// 15883
o51.length = 0;
// undefined
o51 = null;
// 15887
o51 = {};
// 15888
f81632121_504.returns.push(o51);
// 15889
o51.length = 0;
// undefined
o51 = null;
// 15894
f81632121_467.returns.push(1374851243841);
// 15899
f81632121_467.returns.push(1374851243841);
// 15907
f81632121_1852.returns.push(undefined);
// 15909
f81632121_14.returns.push(undefined);
// 15910
f81632121_12.returns.push(69);
// 15913
o51 = {};
// 15914
f81632121_508.returns.push(o51);
// 15915
o51.nodeName = "BUTTON";
// 15916
o51.__FB_TOKEN = void 0;
// 15917
// 15918
o51.getAttribute = f81632121_506;
// 15919
o51.hasAttribute = f81632121_507;
// 15921
f81632121_507.returns.push(false);
// 15922
o51.JSBNG__addEventListener = f81632121_468;
// 15924
f81632121_468.returns.push(undefined);
// 15925
f81632121_2129 = function() { return f81632121_2129.returns[f81632121_2129.inst++]; };
f81632121_2129.returns = [];
f81632121_2129.inst = 0;
// 15926
o51.JSBNG__onclick = f81632121_2129;
// 15929
// undefined
o51 = null;
// 15934
o51 = {};
// 15935
f81632121_508.returns.push(o51);
// 15938
f81632121_467.returns.push(1374851243845);
// 15940
o57 = {};
// 15941
f81632121_508.returns.push(o57);
// 15942
o57.__FB_TOKEN = void 0;
// 15943
// undefined
o57 = null;
// 15944
o51.getElementsByTagName = f81632121_502;
// 15946
o51.querySelectorAll = f81632121_504;
// undefined
o51 = null;
// 15947
o51 = {};
// 15948
f81632121_504.returns.push(o51);
// 15949
o51.length = 0;
// undefined
o51 = null;
// 15953
o51 = {};
// 15954
f81632121_504.returns.push(o51);
// 15955
o51.length = 0;
// undefined
o51 = null;
// 15960
f81632121_467.returns.push(1374851243846);
// 15967
f81632121_1852.returns.push(undefined);
// 15969
f81632121_14.returns.push(undefined);
// 15970
f81632121_12.returns.push(70);
// 15973
o51 = {};
// 15974
f81632121_508.returns.push(o51);
// 15975
o51.nodeName = "BUTTON";
// 15976
o51.__FB_TOKEN = void 0;
// 15977
// 15978
o51.getAttribute = f81632121_506;
// 15979
o51.hasAttribute = f81632121_507;
// 15981
f81632121_507.returns.push(false);
// 15982
o51.JSBNG__addEventListener = f81632121_468;
// 15984
f81632121_468.returns.push(undefined);
// 15985
f81632121_2135 = function() { return f81632121_2135.returns[f81632121_2135.inst++]; };
f81632121_2135.returns = [];
f81632121_2135.inst = 0;
// 15986
o51.JSBNG__onclick = f81632121_2135;
// 15989
// undefined
o51 = null;
// 15994
o51 = {};
// 15995
o57 = {};
// 15997
o51.nodeType = void 0;
// 15998
o51.length = 1;
// 15999
o51["0"] = "TXKLp";
// 16005
f81632121_466.returns.push(0.1571649736724794);
// 16007
f81632121_12.returns.push(71);
// 16008
f81632121_12.returns.push(72);
// 16009
f81632121_12.returns.push(73);
// 16010
f81632121_12.returns.push(74);
// 16011
f81632121_12.returns.push(75);
// 16015
o58 = {};
// 16016
o59 = {};
// 16018
o58.nodeType = void 0;
// 16019
o58.length = 1;
// 16020
o58["0"] = "1YKDj";
// 16022
o75 = {};
// 16024
o75._polling = false;
// 16025
// 16026
f81632121_2141 = function() { return f81632121_2141.returns[f81632121_2141.inst++]; };
f81632121_2141.returns = [];
f81632121_2141.inst = 0;
// 16027
o75.request = f81632121_2141;
// 16028
o75._cancelRequest = f81632121_1349;
// 16029
f81632121_1349.returns.push(undefined);
// 16030
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 16032
o75._muted = false;
// 16033
o79 = {};
// 16034
o75._config = o79;
// 16035
o79.maxRequests = Infinity;
// 16036
// 16038
f81632121_2143 = function() { return f81632121_2143.returns[f81632121_2143.inst++]; };
f81632121_2143.returns = [];
f81632121_2143.inst = 0;
// 16039
o79.setupRequest = f81632121_2143;
// undefined
o79 = null;
// 16040
f81632121_2143.returns.push(undefined);
// 16041
o75._skip = false;
// 16042
f81632121_2141.returns.push(o75);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 16046
f81632121_467.returns.push(1374851243914);
// 16048
o46.offsetTop = 43;
// 16049
o46.scrollHeight = 48;
// undefined
o46 = null;
// 16051
f81632121_1418.returns.push({__JSBNG_unknown_function:true});
// 16057
o46 = {};
// 16058
f81632121_508.returns.push(o46);
// 16060
o79 = {};
// 16061
f81632121_508.returns.push(o79);
// 16062
o191 = {};
// 16063
o192 = {};
// 16065
o191.nodeType = void 0;
// 16066
o191.length = 1;
// 16067
o191["0"] = "cmK7/";
// 16072
o193 = {};
// 16073
o194 = {};
// 16075
o193.nodeType = void 0;
// 16076
o193.length = 1;
// 16077
o193["0"] = "4/uwC";
// 16079
o195 = {};
// 16080
o196 = {};
// undefined
o196 = null;
// 16081
f81632121_2152 = function() { return f81632121_2152.returns[f81632121_2152.inst++]; };
f81632121_2152.returns = [];
f81632121_2152.inst = 0;
// 16082
o195._onReadyState = f81632121_2152;
// 16084
o195.xhr = o48;
// 16086
o48.readyState = 2;
// 16087
o195.JSBNG__status = null;
// 16088
f81632121_2153 = function() { return f81632121_2153.returns[f81632121_2153.inst++]; };
f81632121_2153.returns = [];
f81632121_2153.inst = 0;
// 16089
o195._parseStatus = f81632121_2153;
// 16091
o48.JSBNG__status = 404;
// 16092
// 16094
o48.statusText = "Not Found";
// 16104
// 16105
o195.errorText = void 0;
// 16106
// 16107
f81632121_2153.returns.push(undefined);
// 16109
f81632121_467.returns.push(1374851244103);
// 16110
o195._sentAt = 1374851243816;
// 16111
// 16112
f81632121_2154 = function() { return f81632121_2154.returns[f81632121_2154.inst++]; };
f81632121_2154.returns = [];
f81632121_2154.inst = 0;
// 16113
o195._call = f81632121_2154;
// 16114
f81632121_2155 = function() { return f81632121_2155.returns[f81632121_2155.inst++]; };
f81632121_2155.returns = [];
f81632121_2155.inst = 0;
// 16115
o195.onError = f81632121_2155;
// 16117
f81632121_2155.returns.push(undefined);
// 16118
f81632121_2154.returns.push(undefined);
// 16119
// 16120
// 16121
// 16122
o195._timer = 58;
// 16123
f81632121_14.returns.push(undefined);
// 16128
f81632121_2156 = function() { return f81632121_2156.returns[f81632121_2156.inst++]; };
f81632121_2156.returns = [];
f81632121_2156.inst = 0;
// 16129
o48.abort = f81632121_2156;
// undefined
o48 = null;
// 16130
f81632121_2156.returns.push(undefined);
// 16131
// 16132
f81632121_2152.returns.push(undefined);
// 16133
o48 = {};
// undefined
o48 = null;
// 16138
f81632121_467.returns.push(1374851244104);
// 16140
// 16142
f81632121_2154.returns.push(undefined);
// 16143
// 16144
// 16145
// 16147
f81632121_14.returns.push(undefined);
// 16148
f81632121_2152.returns.push(undefined);
// 16154
o48 = {};
// 16155
f81632121_508.returns.push(o48);
// undefined
o48 = null;
// 16159
o48 = {};
// 16160
f81632121_503.returns.push(o48);
// 16161
o48.length = 0;
// undefined
o48 = null;
// 16162
f81632121_2160 = function() { return f81632121_2160.returns[f81632121_2160.inst++]; };
f81632121_2160.returns = [];
f81632121_2160.inst = 0;
// 16163
o6.checkPermission = f81632121_2160;
// undefined
o6 = null;
// 16164
f81632121_2160.returns.push(1);
// 16168
o6 = {};
// 16169
f81632121_503.returns.push(o6);
// 16170
o6.length = 0;
// undefined
o6 = null;
// 16174
o6 = {};
// 16175
f81632121_508.returns.push(o6);
// undefined
o6 = null;
// 16179
o6 = {};
// 16180
f81632121_503.returns.push(o6);
// 16181
o6.length = 0;
// undefined
o6 = null;
// 16183
f81632121_2160.returns.push(1);
// 16187
o6 = {};
// 16188
f81632121_503.returns.push(o6);
// 16189
o6.length = 0;
// undefined
o6 = null;
// 16192
o6 = {};
// 16193
f81632121_508.returns.push(o6);
// 16196
o6.offsetWidth = 220;
// 16197
o6.offsetHeight = 25;
// 16199
f81632121_508.returns.push(o137);
// undefined
o137 = null;
// 16203
f81632121_645.returns.push(true);
// 16204
o48 = {};
// 16205
f81632121_4.returns.push(o48);
// 16206
o48.getPropertyValue = f81632121_1442;
// undefined
o48 = null;
// 16207
f81632121_1442.returns.push("fixed");
// 16211
f81632121_645.returns.push(true);
// 16213
o48 = {};
// 16214
f81632121_1481.returns.push(o48);
// 16215
o48.left = 0;
// 16217
o48.JSBNG__top = 0;
// undefined
o48 = null;
// 16221
o6.getElementsByTagName = f81632121_502;
// 16223
o6.querySelectorAll = f81632121_504;
// 16224
o48 = {};
// 16225
f81632121_504.returns.push(o48);
// 16226
o48.length = 6;
// 16227
o137 = {};
// 16228
o48["0"] = o137;
// 16229
o196 = {};
// 16230
o48["1"] = o196;
// 16231
o197 = {};
// 16232
o48["2"] = o197;
// 16233
o198 = {};
// 16234
o48["3"] = o198;
// 16235
o199 = {};
// 16236
o48["4"] = o199;
// 16237
o200 = {};
// 16238
o48["5"] = o200;
// undefined
o48 = null;
// 16239
o137.getAttribute = f81632121_506;
// 16240
f81632121_506.returns.push("#");
// 16241
o196.getAttribute = f81632121_506;
// 16242
f81632121_506.returns.push("#");
// 16243
o197.getAttribute = f81632121_506;
// 16244
f81632121_506.returns.push("#");
// 16245
o198.getAttribute = f81632121_506;
// undefined
o198 = null;
// 16246
f81632121_506.returns.push("/ajax/chat/privacy/settings_dialog.php");
// 16247
o199.getAttribute = f81632121_506;
// 16248
f81632121_506.returns.push("#");
// 16249
o200.getAttribute = f81632121_506;
// undefined
o200 = null;
// 16250
f81632121_506.returns.push("/ajax/chat/privacy/turn_off_dialog.php");
// 16251
o137.removeAttribute = f81632121_576;
// 16252
f81632121_576.returns.push(undefined);
// 16253
o137.setAttribute = f81632121_575;
// 16254
f81632121_575.returns.push(undefined);
// 16255
o196.removeAttribute = f81632121_576;
// 16256
f81632121_576.returns.push(undefined);
// 16257
o196.setAttribute = f81632121_575;
// undefined
o196 = null;
// 16258
f81632121_575.returns.push(undefined);
// 16259
o197.removeAttribute = f81632121_576;
// 16260
f81632121_576.returns.push(undefined);
// 16261
o197.setAttribute = f81632121_575;
// undefined
o197 = null;
// 16262
f81632121_575.returns.push(undefined);
// 16263
o199.removeAttribute = f81632121_576;
// 16264
f81632121_576.returns.push(undefined);
// 16265
o199.setAttribute = f81632121_575;
// undefined
o199 = null;
// 16266
f81632121_575.returns.push(undefined);
// 16267
o6.nodeName = "DIV";
// 16268
o6.__FB_TOKEN = void 0;
// 16269
// 16270
o6.getAttribute = f81632121_506;
// 16271
o6.hasAttribute = f81632121_507;
// 16273
f81632121_507.returns.push(false);
// 16274
o6.JSBNG__addEventListener = f81632121_468;
// 16276
f81632121_468.returns.push(undefined);
// 16277
o6.JSBNG__onclick = null;
// 16281
f81632121_467.returns.push(1374851244222);
// 16286
o48 = {};
// 16287
f81632121_508.returns.push(o48);
// 16289
o196 = {};
// 16290
f81632121_476.returns.push(o196);
// 16291
// 16292
// 16293
o196.getElementsByTagName = f81632121_502;
// 16294
o197 = {};
// 16295
f81632121_502.returns.push(o197);
// 16296
o197.length = 0;
// undefined
o197 = null;
// 16298
o197 = {};
// 16299
o196.childNodes = o197;
// undefined
o196 = null;
// 16300
o197.nodeType = void 0;
// undefined
o197 = null;
// 16302
o196 = {};
// 16303
f81632121_476.returns.push(o196);
// 16304
// 16305
// 16306
o196.getElementsByTagName = f81632121_502;
// 16307
o197 = {};
// 16308
f81632121_502.returns.push(o197);
// 16309
o197.length = 0;
// undefined
o197 = null;
// 16311
o197 = {};
// 16312
o196.childNodes = o197;
// undefined
o196 = null;
// 16313
o197.nodeType = void 0;
// undefined
o197 = null;
// 16314
o196 = {};
// 16315
o48.classList = o196;
// 16317
o196.contains = f81632121_513;
// undefined
o196 = null;
// 16318
f81632121_513.returns.push(false);
// 16319
o48.parentNode = o71;
// 16320
o196 = {};
// 16321
o71.classList = o196;
// 16323
o196.contains = f81632121_513;
// undefined
o196 = null;
// 16324
f81632121_513.returns.push(false);
// 16325
o71.parentNode = o68;
// undefined
o71 = null;
// 16326
o71 = {};
// 16327
o68.classList = o71;
// 16329
o71.contains = f81632121_513;
// undefined
o71 = null;
// 16330
f81632121_513.returns.push(false);
// 16331
o68.parentNode = o67;
// undefined
o68 = null;
// 16332
o68 = {};
// 16333
o67.classList = o68;
// 16335
o68.contains = f81632121_513;
// undefined
o68 = null;
// 16336
f81632121_513.returns.push(false);
// 16337
o67.parentNode = o65;
// 16340
o66.contains = f81632121_513;
// undefined
o66 = null;
// 16341
f81632121_513.returns.push(false);
// 16342
o66 = {};
// 16343
o65.parentNode = o66;
// undefined
o65 = null;
// 16344
o65 = {};
// 16345
o66.classList = o65;
// 16347
o65.contains = f81632121_513;
// undefined
o65 = null;
// 16348
f81632121_513.returns.push(false);
// 16349
o65 = {};
// 16350
o66.parentNode = o65;
// 16351
o68 = {};
// 16352
o65.classList = o68;
// 16354
o68.contains = f81632121_513;
// 16355
f81632121_513.returns.push(false);
// 16356
o65.parentNode = o64;
// 16357
o71 = {};
// 16358
o64.classList = o71;
// 16360
o71.contains = f81632121_513;
// undefined
o71 = null;
// 16361
f81632121_513.returns.push(false);
// 16362
o64.parentNode = o82;
// undefined
o64 = null;
// 16366
f81632121_513.returns.push(false);
// 16371
f81632121_513.returns.push(false);
// 16376
f81632121_513.returns.push(false);
// 16381
o48.getElementsByTagName = f81632121_502;
// 16383
o48.querySelectorAll = f81632121_504;
// 16384
o64 = {};
// 16385
f81632121_504.returns.push(o64);
// 16386
o64.length = 1;
// 16387
o71 = {};
// 16388
o64["0"] = o71;
// undefined
o64 = null;
// undefined
o71 = null;
// 16392
f81632121_513.returns.push(false);
// 16397
f81632121_513.returns.push(false);
// 16402
f81632121_513.returns.push(false);
// 16407
f81632121_513.returns.push(false);
// 16412
f81632121_513.returns.push(true);
// 16416
f81632121_513.returns.push(false);
// 16421
f81632121_513.returns.push(false);
// 16426
f81632121_513.returns.push(false);
// 16431
f81632121_513.returns.push(false);
// 16436
f81632121_513.returns.push(false);
// 16441
f81632121_513.returns.push(false);
// 16446
f81632121_513.returns.push(true);
// 16450
f81632121_513.returns.push(false);
// 16455
f81632121_513.returns.push(false);
// 16460
f81632121_513.returns.push(false);
// 16465
f81632121_513.returns.push(true);
// 16466
o48.nodeName = "DIV";
// 16467
o48.__FB_TOKEN = void 0;
// 16468
// 16469
o48.getAttribute = f81632121_506;
// 16470
o48.hasAttribute = f81632121_507;
// 16472
f81632121_507.returns.push(false);
// 16473
o48.JSBNG__addEventListener = f81632121_468;
// 16475
f81632121_468.returns.push(undefined);
// 16476
o48.JSBNG__onclick = null;
// 16481
f81632121_468.returns.push(undefined);
// 16482
o48.JSBNG__onmouseover = null;
// 16487
f81632121_468.returns.push(undefined);
// 16488
o48.JSBNG__onmouseout = null;
// undefined
o48 = null;
// 16490
f81632121_14.returns.push(undefined);
// 16491
f81632121_12.returns.push(76);
// 16502
o48 = {};
// 16503
f81632121_508.returns.push(o48);
// 16505
o64 = {};
// 16506
f81632121_476.returns.push(o64);
// 16507
// 16508
// 16509
o64.getElementsByTagName = f81632121_502;
// 16510
o71 = {};
// 16511
f81632121_502.returns.push(o71);
// 16512
o71.length = 0;
// undefined
o71 = null;
// 16514
o71 = {};
// 16515
o64.childNodes = o71;
// undefined
o64 = null;
// 16516
o71.nodeType = void 0;
// undefined
o71 = null;
// 16518
o64 = {};
// 16519
f81632121_476.returns.push(o64);
// 16520
// 16521
// 16522
o64.getElementsByTagName = f81632121_502;
// 16523
o71 = {};
// 16524
f81632121_502.returns.push(o71);
// 16525
o71.length = 0;
// undefined
o71 = null;
// 16527
o71 = {};
// 16528
o64.childNodes = o71;
// undefined
o64 = null;
// 16529
o71.nodeType = void 0;
// undefined
o71 = null;
// 16530
o64 = {};
// 16531
o48.classList = o64;
// 16533
o64.contains = f81632121_513;
// undefined
o64 = null;
// 16534
f81632121_513.returns.push(false);
// 16535
o64 = {};
// 16536
o48.parentNode = o64;
// 16537
o71 = {};
// 16538
o64.classList = o71;
// 16540
o71.contains = f81632121_513;
// undefined
o71 = null;
// 16541
f81632121_513.returns.push(false);
// 16542
o71 = {};
// 16543
o64.parentNode = o71;
// undefined
o64 = null;
// 16544
o64 = {};
// 16545
o71.classList = o64;
// 16547
o64.contains = f81632121_513;
// undefined
o64 = null;
// 16548
f81632121_513.returns.push(false);
// 16549
o64 = {};
// 16550
o71.parentNode = o64;
// 16551
o196 = {};
// 16552
o64.classList = o196;
// 16554
o196.contains = f81632121_513;
// undefined
o196 = null;
// 16555
f81632121_513.returns.push(false);
// 16556
o196 = {};
// 16557
o64.parentNode = o196;
// undefined
o64 = null;
// 16558
o64 = {};
// 16559
o196.classList = o64;
// 16561
o64.contains = f81632121_513;
// undefined
o64 = null;
// 16562
f81632121_513.returns.push(false);
// 16563
o64 = {};
// 16564
o196.parentNode = o64;
// undefined
o196 = null;
// 16565
o196 = {};
// 16566
o64.classList = o196;
// 16568
o196.contains = f81632121_513;
// undefined
o196 = null;
// 16569
f81632121_513.returns.push(false);
// 16570
o196 = {};
// 16571
o64.parentNode = o196;
// undefined
o64 = null;
// 16572
o64 = {};
// 16573
o196.classList = o64;
// 16575
o64.contains = f81632121_513;
// undefined
o64 = null;
// 16576
f81632121_513.returns.push(false);
// 16577
o64 = {};
// 16578
o196.parentNode = o64;
// 16579
o197 = {};
// 16580
o64.classList = o197;
// 16582
o197.contains = f81632121_513;
// 16583
f81632121_513.returns.push(false);
// 16584
o198 = {};
// 16585
o64.parentNode = o198;
// 16586
o199 = {};
// 16587
o198.classList = o199;
// 16589
o199.contains = f81632121_513;
// undefined
o199 = null;
// 16590
f81632121_513.returns.push(false);
// 16591
o199 = {};
// 16592
o198.parentNode = o199;
// undefined
o198 = null;
// 16593
o198 = {};
// 16594
o199.classList = o198;
// 16596
o198.contains = f81632121_513;
// undefined
o198 = null;
// 16597
f81632121_513.returns.push(false);
// 16598
o198 = {};
// 16599
o199.parentNode = o198;
// 16600
o200 = {};
// 16601
o198.classList = o200;
// 16603
o200.contains = f81632121_513;
// undefined
o200 = null;
// 16604
f81632121_513.returns.push(false);
// 16605
o198.parentNode = o6;
// 16606
o200 = {};
// 16607
o6.classList = o200;
// 16609
o200.contains = f81632121_513;
// undefined
o200 = null;
// 16610
f81632121_513.returns.push(false);
// 16611
o6.parentNode = o83;
// undefined
o6 = null;
// 16612
o6 = {};
// 16613
o83.classList = o6;
// 16615
o6.contains = f81632121_513;
// undefined
o6 = null;
// 16616
f81632121_513.returns.push(false);
// 16617
o83.parentNode = o82;
// 16621
f81632121_513.returns.push(false);
// 16626
f81632121_513.returns.push(false);
// 16631
f81632121_513.returns.push(false);
// 16636
o48.getElementsByTagName = f81632121_502;
// 16638
o48.querySelectorAll = f81632121_504;
// 16639
o6 = {};
// 16640
f81632121_504.returns.push(o6);
// 16641
o6.length = 1;
// 16642
o200 = {};
// 16643
o6["0"] = o200;
// undefined
o6 = null;
// undefined
o200 = null;
// 16647
f81632121_513.returns.push(false);
// 16652
f81632121_513.returns.push(false);
// 16657
f81632121_513.returns.push(false);
// 16662
f81632121_513.returns.push(false);
// 16667
f81632121_513.returns.push(false);
// 16672
f81632121_513.returns.push(false);
// 16677
f81632121_513.returns.push(false);
// 16682
f81632121_513.returns.push(false);
// 16687
f81632121_513.returns.push(false);
// 16692
f81632121_513.returns.push(false);
// 16697
f81632121_513.returns.push(false);
// 16702
f81632121_513.returns.push(false);
// 16707
f81632121_513.returns.push(false);
// 16712
f81632121_513.returns.push(false);
// 16717
f81632121_513.returns.push(false);
// 16722
f81632121_513.returns.push(false);
// 16730
f81632121_513.returns.push(false);
// 16735
f81632121_513.returns.push(false);
// 16740
f81632121_513.returns.push(false);
// 16745
f81632121_513.returns.push(false);
// 16750
f81632121_513.returns.push(false);
// 16755
f81632121_513.returns.push(false);
// 16760
f81632121_513.returns.push(false);
// 16765
f81632121_513.returns.push(false);
// 16770
f81632121_513.returns.push(false);
// 16775
f81632121_513.returns.push(false);
// 16780
f81632121_513.returns.push(false);
// 16785
f81632121_513.returns.push(false);
// 16790
f81632121_513.returns.push(false);
// 16795
f81632121_513.returns.push(false);
// 16800
f81632121_513.returns.push(false);
// 16805
f81632121_513.returns.push(false);
// 16813
f81632121_513.returns.push(false);
// 16818
f81632121_513.returns.push(false);
// 16823
f81632121_513.returns.push(true);
// 16824
o48.nodeName = "DIV";
// 16825
o48.__FB_TOKEN = void 0;
// 16826
// 16827
o48.getAttribute = f81632121_506;
// 16828
o48.hasAttribute = f81632121_507;
// 16830
f81632121_507.returns.push(false);
// 16831
o48.JSBNG__addEventListener = f81632121_468;
// 16833
f81632121_468.returns.push(undefined);
// 16834
o48.JSBNG__onclick = null;
// 16839
f81632121_468.returns.push(undefined);
// 16840
o48.JSBNG__onmouseover = null;
// 16845
f81632121_468.returns.push(undefined);
// 16846
o48.JSBNG__onmouseout = null;
// undefined
o48 = null;
// 16848
f81632121_14.returns.push(undefined);
// 16849
f81632121_12.returns.push(77);
// 16853
o6 = {};
// 16854
f81632121_476.returns.push(o6);
// 16855
// 16856
// 16857
o6.getElementsByTagName = f81632121_502;
// 16858
o48 = {};
// 16859
f81632121_502.returns.push(o48);
// 16860
o48.length = 0;
// undefined
o48 = null;
// 16862
o48 = {};
// 16863
o6.childNodes = o48;
// undefined
o6 = null;
// 16864
o48.nodeType = void 0;
// undefined
o48 = null;
// 16866
f81632121_508.returns.push(o65);
// 16867
o65.getElementsByTagName = f81632121_502;
// 16869
o65.querySelectorAll = f81632121_504;
// undefined
o65 = null;
// 16870
o6 = {};
// 16871
f81632121_504.returns.push(o6);
// 16872
o6.length = 1;
// 16873
o6["0"] = o66;
// undefined
o6 = null;
// undefined
o66 = null;
// 16877
o6 = {};
// 16878
f81632121_504.returns.push(o6);
// 16879
o6.length = 0;
// undefined
o6 = null;
// 16883
o6 = {};
// 16884
f81632121_504.returns.push(o6);
// 16885
o6.length = 1;
// 16886
o48 = {};
// 16887
o6["0"] = o48;
// undefined
o6 = null;
// 16889
o48.querySelectorAll = f81632121_504;
// undefined
o48 = null;
// 16890
o6 = {};
// 16891
f81632121_504.returns.push(o6);
// 16892
o6.length = 1;
// 16893
o48 = {};
// 16894
o6["0"] = o48;
// undefined
o6 = null;
// 16897
o68.remove = f81632121_1114;
// undefined
o68 = null;
// 16898
f81632121_1114.returns.push(undefined);
// 16902
f81632121_1114.returns.push(undefined);
// 16906
f81632121_1114.returns.push(undefined);
// 16910
f81632121_1114.returns.push(undefined);
// 16914
f81632121_1114.returns.push(undefined);
// 16915
o48.firstChild = null;
// undefined
o48 = null;
// 16919
f81632121_513.returns.push(false);
// 16924
f81632121_513.returns.push(false);
// 16929
f81632121_513.returns.push(false);
// 16934
f81632121_513.returns.push(true);
// 16935
o67.contains = f81632121_645;
// undefined
o67 = null;
// 16937
f81632121_645.returns.push(true);
// 16943
f81632121_467.returns.push(1374851244303);
// 16946
o50.getElementsByTagName = f81632121_502;
// 16948
o50.querySelectorAll = f81632121_504;
// undefined
o50 = null;
// 16949
o6 = {};
// 16950
f81632121_504.returns.push(o6);
// 16951
o6.length = 1;
// 16952
o6["0"] = o49;
// undefined
o6 = null;
// 16956
o6 = {};
// 16957
f81632121_504.returns.push(o6);
// 16958
o6.length = 0;
// undefined
o6 = null;
// 16962
o6 = {};
// 16963
f81632121_504.returns.push(o6);
// 16964
o6.length = 1;
// 16965
o48 = {};
// 16966
o6["0"] = o48;
// undefined
o6 = null;
// undefined
o48 = null;
// 16970
o6 = {};
// 16971
f81632121_504.returns.push(o6);
// 16972
o6.length = 1;
// 16973
o48 = {};
// 16974
o6["0"] = o48;
// undefined
o6 = null;
// undefined
o48 = null;
// 16975
o49.nodeName = "INPUT";
// 16976
o49.__FB_TOKEN = void 0;
// 16977
// 16978
o49.getAttribute = f81632121_506;
// 16979
o49.hasAttribute = f81632121_507;
// 16981
f81632121_507.returns.push(false);
// 16982
o49.JSBNG__addEventListener = f81632121_468;
// 16984
f81632121_468.returns.push(undefined);
// 16985
o49.JSBNG__onJSBNG__blur = void 0;
// 16990
f81632121_468.returns.push(undefined);
// 16991
o49.JSBNG__onJSBNG__focus = void 0;
// 16996
f81632121_468.returns.push(undefined);
// 16997
o49.JSBNG__onclick = null;
// 17002
f81632121_468.returns.push(undefined);
// 17003
o49.JSBNG__onkeydown = null;
// 17008
f81632121_468.returns.push(undefined);
// 17009
o49.JSBNG__onkeyup = null;
// 17014
f81632121_468.returns.push(undefined);
// 17015
o49.JSBNG__onkeypress = null;
// undefined
o49 = null;
// 17027
f81632121_1114.returns.push(undefined);
// 17032
f81632121_1114.returns.push(undefined);
// 17042
f81632121_467.returns.push(1374851244322);
// 17043
o6 = {};
// 17044
o3.plugins = o6;
// 17046
f81632121_2241 = function() { return f81632121_2241.returns[f81632121_2241.inst++]; };
f81632121_2241.returns = [];
f81632121_2241.inst = 0;
// 17047
o6.refresh = f81632121_2241;
// 17048
f81632121_2241.returns.push(undefined);
// 17050
o6.length = 5;
// 17052
o48 = {};
// 17053
o6["0"] = o48;
// 17054
o48.length = 2;
// 17055
o49 = {};
// 17056
o48["0"] = o49;
// undefined
o48 = null;
// 17057
o49.type = "application/x-shockwave-flash";
// undefined
o49 = null;
// 17059
o48 = {};
// 17060
o6["1"] = o48;
// 17061
o48.length = 1;
// 17062
o49 = {};
// 17063
o48["0"] = o49;
// undefined
o48 = null;
// 17064
o49.type = "application/vnd.chromium.remoting-viewer";
// undefined
o49 = null;
// 17066
o48 = {};
// 17067
o6["2"] = o48;
// 17068
o48.length = 1;
// 17069
o49 = {};
// 17070
o48["0"] = o49;
// undefined
o48 = null;
// 17071
o49.type = "application/x-nacl";
// undefined
o49 = null;
// 17073
o48 = {};
// 17074
o6["3"] = o48;
// 17075
o48.length = 2;
// 17076
o49 = {};
// 17077
o48["0"] = o49;
// undefined
o48 = null;
// 17078
o49.type = "application/pdf";
// undefined
o49 = null;
// 17080
o48 = {};
// 17081
o6["4"] = o48;
// 17082
o48.length = 2;
// 17083
o49 = {};
// 17084
o48["0"] = o49;
// undefined
o48 = null;
// 17085
o49.type = "application/x-vnd.google.update3webcontrol.3";
// undefined
o49 = null;
// 17086
o2.getItem = f81632121_482;
// undefined
o2 = null;
// 17087
f81632121_482.returns.push(null);
// 17090
f81632121_467.returns.push(1374851244329);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 17093
o2 = {};
// 17094
f81632121_70.returns.push(o2);
// 17095
// 17096
o2.open = f81632121_1294;
// 17097
f81632121_1294.returns.push(undefined);
// 17098
o2.setRequestHeader = f81632121_1295;
// 17099
f81632121_1295.returns.push(undefined);
// 17102
f81632121_1295.returns.push(undefined);
// 17103
o2.send = f81632121_1296;
// 17104
f81632121_1296.returns.push(undefined);
// 17106
f81632121_1418.returns.push({__JSBNG_unknown_function:true});
// 17113
f81632121_508.returns.push(o196);
// 17116
o196.__FB_TOKEN = void 0;
// 17117
// 17118
o196.getElementsByTagName = f81632121_502;
// 17120
o196.querySelectorAll = f81632121_504;
// 17121
o48 = {};
// 17122
f81632121_504.returns.push(o48);
// 17123
o48.length = 1;
// 17124
o48["0"] = o137;
// undefined
o48 = null;
// 17128
o48 = {};
// 17129
f81632121_504.returns.push(o48);
// 17130
o48.length = 1;
// 17131
o49 = {};
// 17132
o48["0"] = o49;
// undefined
o48 = null;
// 17136
o48 = {};
// 17137
f81632121_504.returns.push(o48);
// 17138
o48.length = 1;
// 17139
o50 = {};
// 17140
o48["0"] = o50;
// undefined
o48 = null;
// 17144
o48 = {};
// 17145
f81632121_504.returns.push(o48);
// 17146
o48.length = 1;
// 17147
o48["0"] = o71;
// undefined
o48 = null;
// 17151
f81632121_513.returns.push(false);
// 17156
f81632121_513.returns.push(true);
// 17160
o48 = {};
// 17161
f81632121_504.returns.push(o48);
// 17162
o48.length = 1;
// 17163
o65 = {};
// 17164
o48["0"] = o65;
// undefined
o48 = null;
// 17165
o65.__FB_TOKEN = void 0;
// 17166
// undefined
o65 = null;
// 17167
o71.contains = f81632121_645;
// undefined
o71 = null;
// 17169
f81632121_645.returns.push(true);
// 17173
o48 = {};
// 17174
f81632121_504.returns.push(o48);
// 17175
o48.length = 1;
// 17176
o65 = {};
// 17177
o48["0"] = o65;
// undefined
o48 = null;
// undefined
o65 = null;
// 17178
o196.nodeName = "DIV";
// 17179
o196.getAttribute = f81632121_506;
// 17180
o196.hasAttribute = f81632121_507;
// 17182
f81632121_507.returns.push(false);
// 17183
o196.JSBNG__addEventListener = f81632121_468;
// 17185
f81632121_468.returns.push(undefined);
// 17186
o196.JSBNG__onkeydown = null;
// undefined
o196 = null;
// 17188
o137.nodeName = "A";
// 17189
o137.__FB_TOKEN = void 0;
// 17190
// 17192
o137.hasAttribute = f81632121_507;
// 17194
f81632121_507.returns.push(false);
// 17195
o137.JSBNG__addEventListener = f81632121_468;
// 17197
f81632121_468.returns.push(undefined);
// 17198
o137.JSBNG__onclick = null;
// 17204
o197.remove = f81632121_1114;
// undefined
o197 = null;
// 17205
f81632121_1114.returns.push(undefined);
// 17209
f81632121_1114.returns.push(undefined);
// 17210
o48 = {};
// 17211
o49.classList = o48;
// undefined
o49 = null;
// 17213
o48.add = f81632121_602;
// undefined
o48 = null;
// 17214
f81632121_602.returns.push(undefined);
// 17215
o50.cloneNode = f81632121_1871;
// 17216
o48 = {};
// 17217
f81632121_1871.returns.push(o48);
// 17218
o49 = {};
// undefined
fo81632121_2264_firstChild = function() { return fo81632121_2264_firstChild.returns[fo81632121_2264_firstChild.inst++]; };
fo81632121_2264_firstChild.returns = [];
fo81632121_2264_firstChild.inst = 0;
defineGetter(o48, "firstChild", fo81632121_2264_firstChild, undefined);
// undefined
fo81632121_2264_firstChild.returns.push(o49);
// undefined
fo81632121_2264_firstChild.returns.push(o49);
// 17221
o49.parentNode = o48;
// 17223
o48.removeChild = f81632121_521;
// 17224
f81632121_521.returns.push(o49);
// undefined
o49 = null;
// 17225
o49 = {};
// undefined
fo81632121_2264_firstChild.returns.push(o49);
// undefined
fo81632121_2264_firstChild.returns.push(o49);
// 17228
o49.parentNode = o48;
// 17231
f81632121_521.returns.push(o49);
// undefined
o49 = null;
// undefined
fo81632121_2264_firstChild.returns.push(null);
// 17234
o49 = {};
// 17235
f81632121_474.returns.push(o49);
// 17237
o65 = {};
// 17238
f81632121_598.returns.push(o65);
// 17239
o49.appendChild = f81632121_478;
// 17240
f81632121_478.returns.push(o65);
// undefined
o65 = null;
// 17241
o48.appendChild = f81632121_478;
// 17242
f81632121_478.returns.push(o49);
// undefined
o49 = null;
// 17243
o50.parentNode = o137;
// 17244
o48.__html = void 0;
// undefined
o48 = null;
// 17246
o48 = {};
// 17247
f81632121_474.returns.push(o48);
// undefined
o48 = null;
// 17249
f81632121_2270 = function() { return f81632121_2270.returns[f81632121_2270.inst++]; };
f81632121_2270.returns = [];
f81632121_2270.inst = 0;
// 17250
o137.replaceChild = f81632121_2270;
// undefined
o137 = null;
// 17251
f81632121_2270.returns.push(o50);
// undefined
o50 = null;
// 17259
o3.platform = "Win32";
// 17262
o48 = {};
// undefined
fo81632121_2240_Shockwave_Flash = function() { return fo81632121_2240_Shockwave_Flash.returns[fo81632121_2240_Shockwave_Flash.inst++]; };
fo81632121_2240_Shockwave_Flash.returns = [];
fo81632121_2240_Shockwave_Flash.inst = 0;
defineGetter(o6, "Shockwave Flash", fo81632121_2240_Shockwave_Flash, undefined);
// undefined
fo81632121_2240_Shockwave_Flash.returns.push(o48);
// undefined
o48 = null;
// 17265
o48 = {};
// undefined
fo81632121_2240_Shockwave_Flash.returns.push(o48);
// 17267
o48.description = "Shockwave Flash 11.8 r800";
// undefined
o48 = null;
// 17268
o48 = {};
// 17269
o3.mimeTypes = o48;
// undefined
o3 = null;
// 17271
o3 = {};
// undefined
fo81632121_2273_application_x_shockwave_flash = function() { return fo81632121_2273_application_x_shockwave_flash.returns[fo81632121_2273_application_x_shockwave_flash.inst++]; };
fo81632121_2273_application_x_shockwave_flash.returns = [];
fo81632121_2273_application_x_shockwave_flash.inst = 0;
defineGetter(o48, "application/x-shockwave-flash", fo81632121_2273_application_x_shockwave_flash, undefined);
// undefined
o48 = null;
// undefined
fo81632121_2273_application_x_shockwave_flash.returns.push(o3);
// undefined
o3 = null;
// 17274
o3 = {};
// undefined
fo81632121_2273_application_x_shockwave_flash.returns.push(o3);
// 17276
o48 = {};
// 17277
o3.enabledPlugin = o48;
// undefined
o3 = null;
// undefined
o48 = null;
// 17278
o0.readyState = "complete";
// 17281
o3 = {};
// 17282
f81632121_471.returns.push(o3);
// 17283
o3["0"] = o16;
// undefined
o3 = null;
// 17286
o3 = {};
// 17287
f81632121_476.returns.push(o3);
// 17288
f81632121_478.returns.push(o3);
// 17289
o3.parentNode = o16;
// 17291
f81632121_521.returns.push(o3);
// undefined
o3 = null;
// 17293
o3 = {};
// 17294
f81632121_471.returns.push(o3);
// 17295
o3["0"] = o16;
// undefined
o3 = null;
// 17297
o3 = {};
// 17298
f81632121_476.returns.push(o3);
// 17299
o3.setAttribute = f81632121_575;
// 17300
f81632121_575.returns.push(undefined);
// 17302
f81632121_575.returns.push(undefined);
// 17304
f81632121_478.returns.push(o3);
// 17305
f81632121_2281 = function() { return f81632121_2281.returns[f81632121_2281.inst++]; };
f81632121_2281.returns = [];
f81632121_2281.inst = 0;
// 17306
o3.GetVariable = f81632121_2281;
// undefined
o3 = null;
// 17308
f81632121_2281.returns.push("WIN 11,8,800,97");
// 17310
o5.host = "jsbngssl.www.facebook.com";
// undefined
o5 = null;
// 17312
o3 = {};
// 17313
f81632121_476.returns.push(o3);
// 17314
o3.setAttribute = f81632121_575;
// 17315
f81632121_575.returns.push(undefined);
// 17316
o5 = {};
// 17317
o3.style = o5;
// 17318
// undefined
o5 = null;
// 17321
f81632121_478.returns.push(o3);
// undefined
o3 = null;
// 17323
o3 = {};
// 17324
f81632121_508.returns.push(o3);
// 17325
o3.firstChild = null;
// 17328
f81632121_466.returns.push(0.23936162423342466);
// 17330
f81632121_467.returns.push(1374851244436);
// 17332
f81632121_467.returns.push(1374851244436);
// 17338
f81632121_467.returns.push(1374851244437);
// 17340
f81632121_467.returns.push(1374851244437);
// 17342
f81632121_467.returns.push(1374851244437);
// 17344
f81632121_467.returns.push(1374851244437);
// 17346
f81632121_467.returns.push(1374851244437);
// 17347
o3.nodeType = 1;
// 17348
o3.parentNode = o83;
// 17349
o3.nextSibling = null;
// 17350
o83.removeChild = f81632121_521;
// 17351
f81632121_521.returns.push(o3);
// 17352
// 17353
o83.appendChild = f81632121_478;
// undefined
o83 = null;
// 17354
f81632121_478.returns.push(o3);
// undefined
o3 = null;
// 17356
f81632121_467.returns.push(1374851244439);
// 17358
f81632121_467.returns.push(1374851244439);
// 17361
f81632121_467.returns.push(1374851244440);
// 17363
f81632121_467.returns.push(1374851244440);
// 17365
f81632121_467.returns.push(1374851244440);
// 17367
f81632121_467.returns.push(1374851244440);
// 17369
f81632121_467.returns.push(1374851244440);
// 17373
f81632121_467.returns.push(1374851244447);
// 17375
f81632121_467.returns.push(1374851244447);
// 17376
f81632121_13.returns.push(78);
// 17378
o3 = {};
// 17379
f81632121_476.returns.push(o3);
// 17380
// 17381
// 17382
o3.getElementsByTagName = f81632121_502;
// 17383
o5 = {};
// 17384
f81632121_502.returns.push(o5);
// 17385
o5.length = 0;
// undefined
o5 = null;
// 17387
o5 = {};
// 17388
o3.childNodes = o5;
// undefined
o3 = null;
// 17389
o5.nodeType = void 0;
// undefined
o5 = null;
// 17391
o3 = {};
// 17392
f81632121_476.returns.push(o3);
// 17393
// 17394
// 17395
o3.getElementsByTagName = f81632121_502;
// 17396
o5 = {};
// 17397
f81632121_502.returns.push(o5);
// 17398
o5.length = 0;
// undefined
o5 = null;
// 17400
o5 = {};
// 17401
o3.childNodes = o5;
// undefined
o3 = null;
// 17402
o5.nodeType = void 0;
// undefined
o5 = null;
// 17404
o3 = {};
// 17405
f81632121_476.returns.push(o3);
// 17406
// 17407
// 17408
o3.getElementsByTagName = f81632121_502;
// 17409
o5 = {};
// 17410
f81632121_502.returns.push(o5);
// 17411
o5.length = 0;
// undefined
o5 = null;
// 17413
o5 = {};
// 17414
o3.childNodes = o5;
// undefined
o3 = null;
// 17415
o5.nodeType = void 0;
// undefined
o5 = null;
// 17417
o3 = {};
// 17418
f81632121_476.returns.push(o3);
// 17419
// 17420
// 17421
o3.getElementsByTagName = f81632121_502;
// 17422
o5 = {};
// 17423
f81632121_502.returns.push(o5);
// 17424
o5.length = 0;
// undefined
o5 = null;
// 17426
o5 = {};
// 17427
o3.childNodes = o5;
// undefined
o3 = null;
// 17428
o5.nodeType = void 0;
// undefined
o5 = null;
// 17430
o3 = {};
// 17431
f81632121_476.returns.push(o3);
// 17432
// 17433
// 17434
o3.getElementsByTagName = f81632121_502;
// 17435
o5 = {};
// 17436
f81632121_502.returns.push(o5);
// 17437
o5.length = 0;
// undefined
o5 = null;
// 17439
o5 = {};
// 17440
o3.childNodes = o5;
// undefined
o3 = null;
// 17441
o5.nodeType = void 0;
// undefined
o5 = null;
// 17443
o3 = {};
// 17444
f81632121_476.returns.push(o3);
// 17445
// 17446
// 17447
o3.getElementsByTagName = f81632121_502;
// 17448
o5 = {};
// 17449
f81632121_502.returns.push(o5);
// 17450
o5.length = 0;
// undefined
o5 = null;
// 17452
o5 = {};
// 17453
o3.childNodes = o5;
// undefined
o3 = null;
// 17454
o5.nodeType = void 0;
// 17456
o3 = {};
// 17457
f81632121_476.returns.push(o3);
// 17458
// 17459
// 17460
o3.getElementsByTagName = f81632121_502;
// 17461
o48 = {};
// 17462
f81632121_502.returns.push(o48);
// 17463
o48.length = 0;
// undefined
o48 = null;
// 17465
o48 = {};
// 17466
o3.childNodes = o48;
// undefined
o3 = null;
// 17467
o48.nodeType = void 0;
// undefined
o48 = null;
// 17469
o3 = {};
// 17470
f81632121_476.returns.push(o3);
// 17471
// 17472
// 17473
o3.getElementsByTagName = f81632121_502;
// 17474
o48 = {};
// 17475
f81632121_502.returns.push(o48);
// 17476
o48.length = 0;
// undefined
o48 = null;
// 17478
o48 = {};
// 17479
o3.childNodes = o48;
// undefined
o3 = null;
// 17480
o48.nodeType = void 0;
// undefined
o48 = null;
// 17482
o3 = {};
// 17483
f81632121_476.returns.push(o3);
// 17484
// 17485
// 17486
o3.getElementsByTagName = f81632121_502;
// 17487
o48 = {};
// 17488
f81632121_502.returns.push(o48);
// 17489
o48.length = 0;
// undefined
o48 = null;
// 17491
o48 = {};
// 17492
o3.childNodes = o48;
// undefined
o3 = null;
// 17493
o48.nodeType = void 0;
// undefined
o48 = null;
// 17495
o3 = {};
// 17496
f81632121_476.returns.push(o3);
// 17497
// 17498
// 17499
o3.getElementsByTagName = f81632121_502;
// 17500
o48 = {};
// 17501
f81632121_502.returns.push(o48);
// 17502
o48.length = 0;
// undefined
o48 = null;
// 17504
o48 = {};
// 17505
o3.childNodes = o48;
// undefined
o3 = null;
// 17506
o48.nodeType = void 0;
// undefined
o48 = null;
// 17508
o3 = {};
// 17509
f81632121_476.returns.push(o3);
// 17510
// 17511
// 17512
o3.getElementsByTagName = f81632121_502;
// 17513
o48 = {};
// 17514
f81632121_502.returns.push(o48);
// 17515
o48.length = 0;
// undefined
o48 = null;
// 17517
o48 = {};
// 17518
o3.childNodes = o48;
// undefined
o3 = null;
// 17519
o48.nodeType = void 0;
// undefined
o48 = null;
// 17521
o3 = {};
// 17522
f81632121_476.returns.push(o3);
// 17523
// 17524
// 17525
o3.getElementsByTagName = f81632121_502;
// 17526
o48 = {};
// 17527
f81632121_502.returns.push(o48);
// 17528
o48.length = 0;
// undefined
o48 = null;
// 17530
o48 = {};
// 17531
o3.childNodes = o48;
// undefined
o3 = null;
// 17532
o48.nodeType = void 0;
// undefined
o48 = null;
// 17534
o3 = {};
// 17535
f81632121_476.returns.push(o3);
// 17536
// 17537
// 17538
o3.getElementsByTagName = f81632121_502;
// 17539
o48 = {};
// 17540
f81632121_502.returns.push(o48);
// 17541
o48.length = 0;
// undefined
o48 = null;
// 17543
o48 = {};
// 17544
o3.childNodes = o48;
// undefined
o3 = null;
// 17545
o48.nodeType = void 0;
// undefined
o48 = null;
// 17547
o3 = {};
// 17548
f81632121_476.returns.push(o3);
// 17549
// 17550
// 17551
o3.getElementsByTagName = f81632121_502;
// 17552
o48 = {};
// 17553
f81632121_502.returns.push(o48);
// 17554
o48.length = 0;
// undefined
o48 = null;
// 17556
o48 = {};
// 17557
o3.childNodes = o48;
// undefined
o3 = null;
// 17558
o48.nodeType = void 0;
// undefined
o48 = null;
// 17560
o3 = {};
// 17561
f81632121_476.returns.push(o3);
// 17562
// 17563
// 17564
o3.getElementsByTagName = f81632121_502;
// 17565
o48 = {};
// 17566
f81632121_502.returns.push(o48);
// 17567
o48.length = 0;
// undefined
o48 = null;
// 17569
o48 = {};
// 17570
o3.childNodes = o48;
// undefined
o3 = null;
// 17571
o48.nodeType = void 0;
// undefined
o48 = null;
// 17573
o3 = {};
// 17574
f81632121_476.returns.push(o3);
// 17575
// 17576
// 17577
o3.getElementsByTagName = f81632121_502;
// 17578
o48 = {};
// 17579
f81632121_502.returns.push(o48);
// 17580
o48.length = 0;
// undefined
o48 = null;
// 17582
o48 = {};
// 17583
o3.childNodes = o48;
// undefined
o3 = null;
// 17584
o48.nodeType = void 0;
// undefined
o48 = null;
// 17586
o3 = {};
// 17587
f81632121_476.returns.push(o3);
// 17588
// 17589
// 17590
o3.getElementsByTagName = f81632121_502;
// 17591
o48 = {};
// 17592
f81632121_502.returns.push(o48);
// 17593
o48.length = 0;
// undefined
o48 = null;
// 17595
o48 = {};
// 17596
o3.childNodes = o48;
// undefined
o3 = null;
// 17597
o48.nodeType = void 0;
// undefined
o48 = null;
// 17599
o3 = {};
// 17600
f81632121_476.returns.push(o3);
// 17601
// 17602
// 17603
o3.getElementsByTagName = f81632121_502;
// 17604
o48 = {};
// 17605
f81632121_502.returns.push(o48);
// 17606
o48.length = 0;
// undefined
o48 = null;
// 17608
o48 = {};
// 17609
o3.childNodes = o48;
// undefined
o3 = null;
// 17610
o48.nodeType = void 0;
// undefined
o48 = null;
// 17612
o3 = {};
// 17613
f81632121_476.returns.push(o3);
// 17614
// 17615
// 17616
o3.getElementsByTagName = f81632121_502;
// 17617
o48 = {};
// 17618
f81632121_502.returns.push(o48);
// 17619
o48.length = 0;
// undefined
o48 = null;
// 17621
o48 = {};
// 17622
o3.childNodes = o48;
// undefined
o3 = null;
// 17623
o48.nodeType = void 0;
// undefined
o48 = null;
// 17625
o3 = {};
// 17626
f81632121_476.returns.push(o3);
// 17627
// 17628
// 17629
o3.getElementsByTagName = f81632121_502;
// 17630
o48 = {};
// 17631
f81632121_502.returns.push(o48);
// 17632
o48.length = 0;
// undefined
o48 = null;
// 17634
o48 = {};
// 17635
o3.childNodes = o48;
// undefined
o3 = null;
// 17636
o48.nodeType = void 0;
// undefined
o48 = null;
// 17638
o3 = {};
// 17639
f81632121_476.returns.push(o3);
// 17640
// 17641
// 17642
o3.getElementsByTagName = f81632121_502;
// 17643
o48 = {};
// 17644
f81632121_502.returns.push(o48);
// 17645
o48.length = 0;
// undefined
o48 = null;
// 17647
o48 = {};
// 17648
o3.childNodes = o48;
// undefined
o3 = null;
// 17649
o48.nodeType = void 0;
// undefined
o48 = null;
// 17651
o3 = {};
// 17652
f81632121_476.returns.push(o3);
// 17653
// 17654
// 17655
o3.getElementsByTagName = f81632121_502;
// 17656
o48 = {};
// 17657
f81632121_502.returns.push(o48);
// 17658
o48.length = 0;
// undefined
o48 = null;
// 17660
o48 = {};
// 17661
o3.childNodes = o48;
// undefined
o3 = null;
// 17662
o48.nodeType = void 0;
// undefined
o48 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 17665
o3 = {};
// 17666
f81632121_476.returns.push(o3);
// 17667
// 17668
// 17669
o3.getElementsByTagName = f81632121_502;
// 17670
o48 = {};
// 17671
f81632121_502.returns.push(o48);
// 17672
o48.length = 0;
// undefined
o48 = null;
// 17674
o48 = {};
// 17675
o3.childNodes = o48;
// undefined
o3 = null;
// 17676
o48.nodeType = void 0;
// undefined
o48 = null;
// 17678
o3 = {};
// 17679
f81632121_476.returns.push(o3);
// 17680
// 17681
// 17682
o3.getElementsByTagName = f81632121_502;
// 17683
o48 = {};
// 17684
f81632121_502.returns.push(o48);
// 17685
o48.length = 0;
// undefined
o48 = null;
// 17687
o48 = {};
// 17688
o3.childNodes = o48;
// undefined
o3 = null;
// 17689
o48.nodeType = void 0;
// undefined
o48 = null;
// 17691
o3 = {};
// 17692
f81632121_476.returns.push(o3);
// 17693
// 17694
// 17695
o3.getElementsByTagName = f81632121_502;
// 17696
o48 = {};
// 17697
f81632121_502.returns.push(o48);
// 17698
o48.length = 0;
// undefined
o48 = null;
// 17700
o48 = {};
// 17701
o3.childNodes = o48;
// undefined
o3 = null;
// 17702
o48.nodeType = void 0;
// undefined
o48 = null;
// 17704
o3 = {};
// 17705
f81632121_476.returns.push(o3);
// 17706
// 17707
// 17708
o3.getElementsByTagName = f81632121_502;
// 17709
o48 = {};
// 17710
f81632121_502.returns.push(o48);
// 17711
o48.length = 0;
// undefined
o48 = null;
// 17713
o48 = {};
// 17714
o3.childNodes = o48;
// undefined
o3 = null;
// 17715
o48.nodeType = void 0;
// undefined
o48 = null;
// 17717
o3 = {};
// 17718
f81632121_476.returns.push(o3);
// 17719
// 17720
// 17721
o3.getElementsByTagName = f81632121_502;
// 17722
o48 = {};
// 17723
f81632121_502.returns.push(o48);
// 17724
o48.length = 0;
// undefined
o48 = null;
// 17726
o48 = {};
// 17727
o3.childNodes = o48;
// undefined
o3 = null;
// 17728
o48.nodeType = void 0;
// undefined
o48 = null;
// 17730
o3 = {};
// 17731
f81632121_476.returns.push(o3);
// 17732
// 17733
// 17734
o3.getElementsByTagName = f81632121_502;
// 17735
o48 = {};
// 17736
f81632121_502.returns.push(o48);
// 17737
o48.length = 0;
// undefined
o48 = null;
// 17739
o48 = {};
// 17740
o3.childNodes = o48;
// undefined
o3 = null;
// 17741
o48.nodeType = void 0;
// undefined
o48 = null;
// 17743
o3 = {};
// 17744
f81632121_476.returns.push(o3);
// 17745
// 17746
// 17747
o3.getElementsByTagName = f81632121_502;
// 17748
o48 = {};
// 17749
f81632121_502.returns.push(o48);
// 17750
o48.length = 0;
// undefined
o48 = null;
// 17752
o48 = {};
// 17753
o3.childNodes = o48;
// undefined
o3 = null;
// 17754
o48.nodeType = void 0;
// undefined
o48 = null;
// 17756
o3 = {};
// 17757
f81632121_476.returns.push(o3);
// 17758
// 17759
// 17760
o3.getElementsByTagName = f81632121_502;
// 17761
o48 = {};
// 17762
f81632121_502.returns.push(o48);
// 17763
o48.length = 0;
// undefined
o48 = null;
// 17765
o48 = {};
// 17766
o3.childNodes = o48;
// undefined
o3 = null;
// 17767
o48.nodeType = void 0;
// undefined
o48 = null;
// 17769
o3 = {};
// 17770
f81632121_476.returns.push(o3);
// 17771
// 17772
// 17773
o3.getElementsByTagName = f81632121_502;
// 17774
o48 = {};
// 17775
f81632121_502.returns.push(o48);
// 17776
o48.length = 0;
// undefined
o48 = null;
// 17778
o48 = {};
// 17779
o3.childNodes = o48;
// undefined
o3 = null;
// 17780
o48.nodeType = void 0;
// undefined
o48 = null;
// 17782
o3 = {};
// 17783
f81632121_476.returns.push(o3);
// 17784
// 17785
// 17786
o3.getElementsByTagName = f81632121_502;
// 17787
o48 = {};
// 17788
f81632121_502.returns.push(o48);
// 17789
o48.length = 0;
// undefined
o48 = null;
// 17791
o48 = {};
// 17792
o3.childNodes = o48;
// undefined
o3 = null;
// 17793
o48.nodeType = void 0;
// undefined
o48 = null;
// 17794
f81632121_1620.__reactDontBind = void 0;
// 17795
f81632121_1619.__reactDontBind = void 0;
// 17797
o3 = {};
// 17798
f81632121_476.returns.push(o3);
// 17799
// 17800
// 17801
o3.getElementsByTagName = f81632121_502;
// 17802
o48 = {};
// 17803
f81632121_502.returns.push(o48);
// 17804
o48.length = 0;
// undefined
o48 = null;
// 17806
o48 = {};
// 17807
o3.childNodes = o48;
// undefined
o3 = null;
// 17808
o48.nodeType = void 0;
// undefined
o48 = null;
// 17810
o3 = {};
// 17811
f81632121_476.returns.push(o3);
// 17812
// 17813
// 17814
o3.getElementsByTagName = f81632121_502;
// 17815
o48 = {};
// 17816
f81632121_502.returns.push(o48);
// 17817
o48.length = 0;
// undefined
o48 = null;
// 17819
o48 = {};
// 17820
o3.childNodes = o48;
// undefined
o3 = null;
// 17821
o48.nodeType = void 0;
// undefined
o48 = null;
// 17823
o3 = {};
// 17824
f81632121_476.returns.push(o3);
// 17825
// 17826
// 17827
o3.getElementsByTagName = f81632121_502;
// 17828
o48 = {};
// 17829
f81632121_502.returns.push(o48);
// 17830
o48.length = 0;
// undefined
o48 = null;
// 17832
o48 = {};
// 17833
o3.childNodes = o48;
// undefined
o3 = null;
// 17834
o48.nodeType = void 0;
// undefined
o48 = null;
// 17836
o3 = {};
// 17837
f81632121_476.returns.push(o3);
// 17838
// 17839
// 17840
o3.getElementsByTagName = f81632121_502;
// 17841
o48 = {};
// 17842
f81632121_502.returns.push(o48);
// 17843
o48.length = 0;
// undefined
o48 = null;
// 17845
o48 = {};
// 17846
o3.childNodes = o48;
// undefined
o3 = null;
// 17847
o48.nodeType = void 0;
// undefined
o48 = null;
// 17849
o3 = {};
// 17850
f81632121_476.returns.push(o3);
// 17851
// 17852
// 17853
o3.getElementsByTagName = f81632121_502;
// 17854
o48 = {};
// 17855
f81632121_502.returns.push(o48);
// 17856
o48.length = 0;
// undefined
o48 = null;
// 17858
o48 = {};
// 17859
o3.childNodes = o48;
// undefined
o3 = null;
// 17860
o48.nodeType = void 0;
// undefined
o48 = null;
// 17863
f81632121_467.returns.push(1374851244544);
// 17879
f81632121_513.returns.push(false);
// 17886
o3 = {};
// 17887
o79.classList = o3;
// 17889
o3.contains = f81632121_513;
// undefined
o3 = null;
// 17890
f81632121_513.returns.push(false);
// 17891
o79.parentNode = o46;
// undefined
o79 = null;
// 17892
o3 = {};
// 17893
o46.classList = o3;
// 17895
o3.contains = f81632121_513;
// undefined
o3 = null;
// 17896
f81632121_513.returns.push(false);
// 17897
o3 = {};
// 17898
o46.parentNode = o3;
// 17899
o48 = {};
// 17900
o3.classList = o48;
// 17902
o48.contains = f81632121_513;
// undefined
o48 = null;
// 17903
f81632121_513.returns.push(false);
// 17904
o3.parentNode = o199;
// undefined
o3 = null;
// undefined
o199 = null;
// 17908
f81632121_513.returns.push(false);
// 17913
f81632121_513.returns.push(true);
// 17914
o198.getElementsByTagName = f81632121_502;
// 17916
o198.querySelectorAll = f81632121_504;
// 17917
o3 = {};
// 17918
f81632121_504.returns.push(o3);
// 17919
o3.length = 1;
// 17920
o3["0"] = o64;
// undefined
o3 = null;
// 17921
o64.offsetWidth = 205;
// 17922
o64.offsetHeight = 0;
// undefined
o64 = null;
// 17926
o3 = {};
// 17927
f81632121_504.returns.push(o3);
// 17928
o3.length = 1;
// 17929
o3["0"] = o46;
// undefined
o3 = null;
// 17930
o46.offsetWidth = 0;
// 17931
o46.offsetHeight = 0;
// undefined
o46 = null;
// 17932
o198.offsetWidth = 205;
// 17933
o198.offsetHeight = 25;
// undefined
o198 = null;
// 17934
o5.__html = void 0;
// 17935
o5.cloneNode = void 0;
// undefined
o5 = null;
// 17936
o3 = {};
// 17937
o5 = {};
// 17939
o3.transport = o2;
// 17940
o2.readyState = 1;
// 17941
o46 = {};
// 17942
o48 = {};
// 17944
o46.nodeType = void 0;
// 17945
o46.length = 1;
// 17946
o46["0"] = "WD1Wm";
// 17949
f81632121_467.returns.push(1374851244566);
// 17952
f81632121_467.returns.push(1374851244567);
// 17957
f81632121_2241.returns.push(undefined);
// 17961
o49 = {};
// 17963
o49.length = 2;
// 17964
o50 = {};
// 17965
o49["0"] = o50;
// 17966
o50.type = "application/x-shockwave-flash";
// undefined
o50 = null;
// 17968
o50 = {};
// 17970
o50.length = 1;
// 17971
o64 = {};
// 17972
o50["0"] = o64;
// 17973
o64.type = "application/vnd.chromium.remoting-viewer";
// undefined
o64 = null;
// 17975
o64 = {};
// 17977
o64.length = 1;
// 17978
o65 = {};
// 17979
o64["0"] = o65;
// 17980
o65.type = "application/x-nacl";
// undefined
o65 = null;
// 17982
o65 = {};
// 17984
o65.length = 2;
// 17985
o66 = {};
// 17986
o65["0"] = o66;
// 17987
o66.type = "application/pdf";
// undefined
o66 = null;
// 17989
o66 = {};
// 17991
o66.length = 2;
// 17992
o67 = {};
// 17993
o66["0"] = o67;
// 17994
o67.type = "application/x-vnd.google.update3webcontrol.3";
// undefined
o67 = null;
// 17996
o67 = {};
// 17997
f81632121_508.returns.push(o67);
// 17998
o68 = {};
// 17999
o67.classList = o68;
// undefined
o67 = null;
// 18001
o68.remove = f81632121_1114;
// undefined
o68 = null;
// 18002
f81632121_1114.returns.push(undefined);
// 18004
o67 = {};
// 18005
f81632121_508.returns.push(o67);
// 18006
o68 = {};
// 18007
o67.classList = o68;
// undefined
o67 = null;
// 18009
o68.remove = f81632121_1114;
// undefined
o68 = null;
// 18010
f81632121_1114.returns.push(undefined);
// 18012
f81632121_467.returns.push(1374851244573);
// 18015
f81632121_467.returns.push(1374851244574);
// 18018
f81632121_467.returns.push(1374851244574);
// 18020
f81632121_467.returns.push(1374851244574);
// 18031
f81632121_467.returns.push(1374851244579);
// 18036
f81632121_467.returns.push(1374851244581);
// 18040
f81632121_467.returns.push(1374851244581);
// 18048
f81632121_1852.returns.push(undefined);
// 18050
f81632121_14.returns.push(undefined);
// 18051
f81632121_12.returns.push(79);
// 18058
o67 = {};
// 18059
f81632121_474.returns.push(o67);
// 18061
f81632121_467.returns.push(1374851244585);
// 18063
o68 = {};
// 18064
f81632121_476.returns.push(o68);
// 18065
// 18066
// 18067
// 18068
// 18069
// 18070
// 18071
o67.appendChild = f81632121_478;
// 18072
f81632121_478.returns.push(o68);
// undefined
o68 = null;
// 18074
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18079
o67 = {};
// 18080
f81632121_474.returns.push(o67);
// 18082
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18087
o67 = {};
// 18088
f81632121_474.returns.push(o67);
// 18090
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18103
o67 = {};
// 18104
f81632121_474.returns.push(o67);
// 18106
f81632121_467.returns.push(1374851244591);
// 18108
o68 = {};
// 18109
f81632121_476.returns.push(o68);
// 18110
// 18111
// 18112
// 18113
// 18114
// 18115
// 18116
o67.appendChild = f81632121_478;
// 18117
f81632121_478.returns.push(o68);
// undefined
o68 = null;
// 18119
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18124
o67 = {};
// 18125
f81632121_474.returns.push(o67);
// 18127
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18132
o67 = {};
// 18133
f81632121_474.returns.push(o67);
// 18135
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18140
o67 = {};
// 18141
f81632121_474.returns.push(o67);
// 18143
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18148
o67 = {};
// 18149
f81632121_474.returns.push(o67);
// 18151
f81632121_478.returns.push(o67);
// undefined
o67 = null;
// 18161
o188.offsetHeight = 626;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 18172
o67 = {};
// 18173
o68 = {};
// 18175
o67.nodeType = void 0;
// 18176
o67.length = 1;
// 18177
o67["0"] = "NMNM4";
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 18181
f81632121_12.returns.push(80);
// 18184
o71 = {};
// 18185
f81632121_476.returns.push(o71);
// 18187
o71.__html = void 0;
// 18189
o79 = {};
// 18190
f81632121_474.returns.push(o79);
// 18193
f81632121_478.returns.push(o79);
// undefined
o79 = null;
// 18194
o79 = {};
// 18195
o71.style = o79;
// 18196
// undefined
o79 = null;
// 18197
o79 = {};
// 18198
f81632121_4.returns.push(o79);
// 18199
o79.getPropertyValue = f81632121_1442;
// undefined
o79 = null;
// 18200
f81632121_1442.returns.push("");
// 18201
o79 = {};
// 18202
f81632121_4.returns.push(o79);
// 18203
o79.getPropertyValue = f81632121_1442;
// undefined
o79 = null;
// 18204
f81632121_1442.returns.push("");
// 18205
o79 = {};
// 18206
f81632121_4.returns.push(o79);
// 18207
o79.getPropertyValue = f81632121_1442;
// undefined
o79 = null;
// 18208
f81632121_1442.returns.push("");
// 18213
f81632121_602.returns.push(undefined);
// 18215
// 18216
o79 = {};
// 18217
f81632121_71.returns.push(o79);
// 18218
f81632121_466.returns.push(0.9777125425171107);
// 18219
// undefined
o79 = null;
// 18220
o71.parentNode = null;
// undefined
o71 = null;
// 18222
o71 = {};
// 18226
o79 = {};
// 18230
o83 = {};
// 18235
o2.getResponseHeader = f81632121_1332;
// 18238
f81632121_1332.returns.push("uLzHV1m5Dy2v/IO2QcgM3lldqL5hwPL/oCh+dU+gNaE=");
// 18241
f81632121_1332.returns.push("uLzHV1m5Dy2v/IO2QcgM3lldqL5hwPL/oCh+dU+gNaE=");
// 18242
// 18244
o2.JSBNG__status = 200;
// 18248
f81632121_467.returns.push(1374851244625);
// 18249
o3._handleXHRResponse = f81632121_1333;
// 18251
o3.getOption = f81632121_1334;
// 18252
o137 = {};
// 18253
o3.option = o137;
// 18254
o137.suppressEvaluation = false;
// 18257
f81632121_1334.returns.push(false);
// 18258
o2.responseText = "for (;;);{\"__ar\":1,\"payload\":[],\"bootloadable\":{},\"ixData\":[]}";
// 18259
o3._unshieldResponseText = f81632121_1336;
// 18260
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":[],\"bootloadable\":{},\"ixData\":[]}");
// 18261
o3._interpretResponse = f81632121_1337;
// 18262
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 18263
o3.invokeResponseHandler = f81632121_1338;
// 18264
o3.handler = null;
// 18265
o3.errorHandler = f81632121_1821;
// 18266
o3._isRelevant = f81632121_1340;
// 18267
o3._allowCrossPageTransition = void 0;
// 18268
o3.id = 9;
// 18270
f81632121_1340.returns.push(true);
// 18271
o3._dispatchResponse = f81632121_1341;
// 18272
o3.getURI = f81632121_1342;
// 18273
o196 = {};
// 18274
o3.uri = o196;
// 18276
o196.$URIBase0 = "";
// 18277
o196.$URIBase1 = "";
// 18278
o196.$URIBase2 = "";
// 18279
o196.$URIBase3 = "/ajax/chat/imps_logging.php";
// 18281
o197 = {};
// 18282
o196.$URIBase5 = o197;
// undefined
o197 = null;
// 18283
o196.$URIBase4 = "";
// 18284
f81632121_1344.returns.push("/ajax/chat/imps_logging.php");
// 18285
f81632121_1342.returns.push("/ajax/chat/imps_logging.php");
// 18286
o3.preBootloadHandler = void 0;
// 18297
f81632121_1344.returns.push("/ajax/chat/imps_logging.php");
// 18298
f81632121_1342.returns.push("/ajax/chat/imps_logging.php");
// 18300
f81632121_12.returns.push(81);
// 18304
o197 = {};
// 18305
f81632121_474.returns.push(o197);
// 18307
f81632121_478.returns.push(o197);
// undefined
o197 = null;
// 18308
f81632121_1338.returns.push(undefined);
// 18309
f81632121_1333.returns.push(undefined);
// 18312
o137.asynchronous = true;
// undefined
o137 = null;
// 18315
f81632121_1334.returns.push(true);
// 18316
// 18319
o3.clearStatusIndicator = f81632121_1347;
// 18320
o3.getStatusElement = f81632121_1348;
// 18321
o3.statusElement = null;
// 18322
f81632121_1348.returns.push(null);
// 18323
f81632121_1347.returns.push(undefined);
// 18328
f81632121_1340.returns.push(true);
// 18329
f81632121_2446 = function() { return f81632121_2446.returns[f81632121_2446.inst++]; };
f81632121_2446.returns = [];
f81632121_2446.inst = 0;
// 18330
o3.initialHandler = f81632121_2446;
// 18331
f81632121_2446.returns.push(true);
// 18332
o3.timer = null;
// 18333
f81632121_14.returns.push(undefined);
// 18335
o3._handleJSResponse = f81632121_1351;
// 18336
o3.getRelativeTo = f81632121_1352;
// 18337
o3.relativeTo = null;
// 18338
f81632121_1352.returns.push(null);
// 18339
o3._handleJSRegisters = f81632121_1353;
// 18340
f81632121_1353.returns.push(undefined);
// 18341
o3.lid = void 0;
// 18343
f81632121_1353.returns.push(undefined);
// 18344
f81632121_1351.returns.push(undefined);
// 18345
f81632121_2447 = function() { return f81632121_2447.returns[f81632121_2447.inst++]; };
f81632121_2447.returns = [];
f81632121_2447.inst = 0;
// 18346
o3.finallyHandler = f81632121_2447;
// 18347
f81632121_2447.returns.push(undefined);
// 18348
f81632121_1341.returns.push(undefined);
// 18353
// 18354
f81632121_12.returns.push(82);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; highContrastMode=1; wd=1034x727");
// 18360
f81632121_467.returns.push(1374851244924);
// 18366
o137 = {};
// 18367
o197 = {};
// 18369
o137.nodeType = void 0;
// 18370
o137.length = 1;
// 18371
o137["0"] = "WLpRY";
// 18382
o198 = {};
// 18383
f81632121_504.returns.push(o198);
// 18384
o198.length = 4;
// 18385
o198["0"] = o36;
// undefined
o36 = null;
// 18386
o198["1"] = o35;
// undefined
o35 = null;
// 18387
o198["2"] = o33;
// undefined
o33 = null;
// 18388
o198["3"] = o32;
// undefined
o198 = null;
// undefined
o32 = null;
// 18392
o32 = {};
// 18393
f81632121_474.returns.push(o32);
// 18395
f81632121_478.returns.push(o32);
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18400
f81632121_12.returns.push(83);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18405
f81632121_467.returns.push(1374851245927);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18409
f81632121_12.returns.push(84);
// 18411
o32 = {};
// 18414
o32.cancelBubble = false;
// 18417
f81632121_467.returns.push(1374851246902);
// 18422
f81632121_467.returns.push(1374851246904);
// 18426
f81632121_467.returns.push(1374851246904);
// 18429
o32.returnValue = true;
// undefined
o32 = null;
// 18430
o32 = {};
// 18433
o32.cancelBubble = false;
// 18436
f81632121_467.returns.push(1374851246920);
// 18438
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18442
f81632121_467.returns.push(1374851246929);
// 18443
o32 = {};
// 18446
o32.cancelBubble = false;
// 18449
f81632121_467.returns.push(1374851246942);
// 18451
o32.returnValue = true;
// undefined
o32 = null;
// 18452
o32 = {};
// 18455
o32.cancelBubble = false;
// 18458
f81632121_467.returns.push(1374851246962);
// 18460
o32.returnValue = true;
// undefined
o32 = null;
// 18461
o32 = {};
// 18464
o32.cancelBubble = false;
// 18467
f81632121_467.returns.push(1374851246964);
// 18469
o32.returnValue = true;
// undefined
o32 = null;
// 18470
o32 = {};
// 18473
o32.cancelBubble = false;
// 18476
f81632121_467.returns.push(1374851247013);
// 18478
o32.returnValue = true;
// undefined
o32 = null;
// 18479
o32 = {};
// 18482
o32.cancelBubble = false;
// 18485
f81632121_467.returns.push(1374851247020);
// 18487
o32.returnValue = true;
// undefined
o32 = null;
// 18488
o32 = {};
// 18491
o32.cancelBubble = false;
// 18494
f81632121_467.returns.push(1374851247035);
// 18496
o32.returnValue = true;
// undefined
o32 = null;
// 18497
o32 = {};
// 18500
o32.cancelBubble = false;
// 18503
f81632121_467.returns.push(1374851247053);
// 18505
o32.returnValue = true;
// undefined
o32 = null;
// 18506
o32 = {};
// 18509
o32.cancelBubble = false;
// 18512
f81632121_467.returns.push(1374851247068);
// 18514
o32.returnValue = true;
// undefined
o32 = null;
// 18515
o32 = {};
// 18518
o32.cancelBubble = false;
// 18521
f81632121_467.returns.push(1374851247086);
// 18523
o32.returnValue = true;
// undefined
o32 = null;
// 18524
o32 = {};
// 18527
o32.cancelBubble = false;
// 18530
f81632121_467.returns.push(1374851247101);
// 18532
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18534
o32 = {};
// 18537
o32.cancelBubble = false;
// 18540
f81632121_467.returns.push(1374851247117);
// 18542
o32.returnValue = true;
// undefined
o32 = null;
// 18543
o32 = {};
// 18546
o32.cancelBubble = false;
// 18549
f81632121_467.returns.push(1374851247134);
// 18551
o32.returnValue = true;
// undefined
o32 = null;
// 18552
o32 = {};
// 18555
o32.cancelBubble = false;
// 18558
f81632121_467.returns.push(1374851247150);
// 18560
o32.returnValue = true;
// undefined
o32 = null;
// 18561
o32 = {};
// 18564
o32.cancelBubble = false;
// 18567
f81632121_467.returns.push(1374851247165);
// 18569
o32.returnValue = true;
// undefined
o32 = null;
// 18570
o32 = {};
// 18573
o32.cancelBubble = false;
// 18576
f81632121_467.returns.push(1374851247181);
// 18578
o32.returnValue = true;
// undefined
o32 = null;
// 18579
o32 = {};
// 18583
f81632121_467.returns.push(1374851247195);
// 18584
o32.cancelBubble = false;
// 18585
o32.returnValue = true;
// 18588
o32.srcElement = o109;
// 18590
o32.target = o109;
// 18597
f81632121_506.returns.push(null);
// 18603
f81632121_506.returns.push(null);
// 18609
f81632121_506.returns.push(null);
// 18615
f81632121_506.returns.push(null);
// 18621
f81632121_506.returns.push(null);
// 18627
f81632121_506.returns.push(null);
// 18633
f81632121_506.returns.push(null);
// 18639
f81632121_506.returns.push(null);
// 18644
o32.JSBNG__screenX = 970;
// 18645
o32.JSBNG__screenY = 511;
// 18646
o32.altKey = false;
// 18647
o32.bubbles = true;
// 18648
o32.button = 0;
// 18649
o32.buttons = void 0;
// 18650
o32.cancelable = false;
// 18651
o32.clientX = 902;
// 18652
o32.clientY = 346;
// 18653
o32.ctrlKey = false;
// 18654
o32.currentTarget = o0;
// 18655
o32.defaultPrevented = false;
// 18656
o32.detail = 0;
// 18657
o32.eventPhase = 3;
// 18658
o32.isTrusted = void 0;
// 18659
o32.metaKey = false;
// 18660
o32.pageX = 902;
// 18661
o32.pageY = 2732;
// 18662
o32.relatedTarget = null;
// 18663
o32.fromElement = null;
// 18666
o32.shiftKey = false;
// 18669
o32.timeStamp = 1374851247195;
// 18670
o32.type = "mousemove";
// 18671
o32.view = ow81632121;
// undefined
o32 = null;
// 18680
f81632121_1852.returns.push(undefined);
// 18683
f81632121_14.returns.push(undefined);
// 18688
f81632121_467.returns.push(1374851247221);
// 18689
f81632121_12.returns.push(85);
// 18692
o32 = {};
// 18695
o32.cancelBubble = false;
// 18698
f81632121_467.returns.push(1374851247230);
// 18700
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18703
f81632121_12.returns.push(86);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18708
f81632121_467.returns.push(1374851247934);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18713
f81632121_12.returns.push(87);
// 18716
f81632121_467.returns.push(1374851248994);
// 18717
o32 = {};
// 18720
o32.cancelBubble = false;
// 18723
f81632121_467.returns.push(1374851248996);
// 18728
f81632121_467.returns.push(1374851248999);
// 18732
f81632121_467.returns.push(1374851248999);
// 18735
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18739
f81632121_467.returns.push(1374851249001);
// 18740
o32 = {};
// 18743
o32.cancelBubble = false;
// 18746
f81632121_467.returns.push(1374851249007);
// 18748
o32.returnValue = true;
// undefined
o32 = null;
// 18749
o32 = {};
// 18752
o32.cancelBubble = false;
// 18755
f81632121_467.returns.push(1374851249029);
// 18757
o32.returnValue = true;
// undefined
o32 = null;
// 18758
o32 = {};
// 18761
o32.cancelBubble = false;
// 18764
f81632121_467.returns.push(1374851249050);
// 18766
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 18768
o32 = {};
// 18771
o32.cancelBubble = false;
// 18774
f81632121_467.returns.push(1374851249117);
// 18776
o32.returnValue = true;
// undefined
o32 = null;
// 18777
o32 = {};
// 18780
o32.cancelBubble = false;
// 18783
f81632121_467.returns.push(1374851249147);
// 18785
o32.returnValue = true;
// undefined
o32 = null;
// 18786
o32 = {};
// 18789
o32.cancelBubble = false;
// 18792
f81632121_467.returns.push(1374851249181);
// 18794
o32.returnValue = true;
// undefined
o32 = null;
// 18795
o32 = {};
// 18798
o32.cancelBubble = false;
// 18801
f81632121_467.returns.push(1374851249216);
// 18803
o32.returnValue = true;
// undefined
o32 = null;
// 18804
o32 = {};
// 18807
o32.cancelBubble = false;
// 18810
f81632121_467.returns.push(1374851249250);
// 18812
o32.returnValue = true;
// undefined
o32 = null;
// 18813
o32 = {};
// 18816
o32.cancelBubble = false;
// 18819
f81632121_467.returns.push(1374851249278);
// 18821
o32.returnValue = true;
// undefined
o32 = null;
// 18822
o32 = {};
// 18825
o32.cancelBubble = false;
// 18828
f81632121_467.returns.push(1374851249309);
// 18830
o32.returnValue = true;
// undefined
o32 = null;
// 18831
o32 = {};
// 18834
o32.cancelBubble = false;
// 18837
f81632121_467.returns.push(1374851249314);
// 18839
o32.returnValue = true;
// undefined
o32 = null;
// 18840
o32 = {};
// 18843
o32.cancelBubble = false;
// 18846
f81632121_467.returns.push(1374851249330);
// 18848
o32.returnValue = true;
// undefined
o32 = null;
// 18849
o32 = {};
// 18852
o32.cancelBubble = false;
// 18855
f81632121_467.returns.push(1374851249347);
// 18857
o32.returnValue = true;
// undefined
o32 = null;
// 18858
o32 = {};
// 18861
o32.srcElement = o109;
// 18863
o32.target = o109;
// 18870
f81632121_506.returns.push(null);
// 18876
f81632121_506.returns.push(null);
// 18882
f81632121_506.returns.push(null);
// 18888
f81632121_506.returns.push(null);
// 18894
f81632121_506.returns.push(null);
// 18900
f81632121_506.returns.push(null);
// 18906
f81632121_506.returns.push(null);
// 18912
f81632121_506.returns.push(null);
// 18917
o33 = {};
// 18918
o32.relatedTarget = o33;
// 18919
o35 = {};
// 18920
o33.parentNode = o35;
// 18921
o33.nodeType = 1;
// 18922
o33.getAttribute = f81632121_506;
// 18924
f81632121_506.returns.push(null);
// 18926
o36 = {};
// 18927
o35.parentNode = o36;
// 18928
o35.nodeType = 1;
// 18929
o35.getAttribute = f81632121_506;
// undefined
o35 = null;
// 18931
f81632121_506.returns.push(null);
// 18933
o35 = {};
// 18934
o36.parentNode = o35;
// 18935
o36.nodeType = 1;
// 18936
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 18938
f81632121_506.returns.push(null);
// 18940
o36 = {};
// 18941
o35.parentNode = o36;
// 18942
o35.nodeType = 1;
// 18943
o35.getAttribute = f81632121_506;
// 18945
f81632121_506.returns.push(null);
// 18947
o36.parentNode = o56;
// 18948
o36.nodeType = 1;
// 18949
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 18951
f81632121_506.returns.push(null);
// 18953
o56.parentNode = o47;
// 18954
o56.nodeType = 1;
// undefined
o56 = null;
// 18957
f81632121_506.returns.push(null);
// 18959
o36 = {};
// 18960
o47.parentNode = o36;
// 18961
o47.nodeType = 1;
// 18962
o47.getAttribute = f81632121_506;
// undefined
o47 = null;
// 18964
f81632121_506.returns.push(null);
// 18966
o36.parentNode = o188;
// 18967
o36.nodeType = 1;
// 18968
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 18970
f81632121_506.returns.push(null);
// 18972
o36 = {};
// 18973
o188.parentNode = o36;
// 18974
o188.nodeType = 1;
// undefined
o188 = null;
// 18977
f81632121_506.returns.push(null);
// 18979
o36.parentNode = o93;
// 18980
o36.nodeType = 1;
// 18981
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 18983
f81632121_506.returns.push(null);
// 18985
o93.parentNode = o77;
// 18986
o93.nodeType = 1;
// undefined
o93 = null;
// 18989
f81632121_506.returns.push(null);
// 18991
o36 = {};
// 18992
o77.parentNode = o36;
// 18993
o77.nodeType = 1;
// undefined
o77 = null;
// 18996
f81632121_506.returns.push(null);
// 18998
o36.parentNode = o122;
// 18999
o36.nodeType = 1;
// 19000
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 19002
f81632121_506.returns.push(null);
// 19004
o122.parentNode = o109;
// 19005
o122.nodeType = 1;
// 19006
o122.getAttribute = f81632121_506;
// undefined
o122 = null;
// 19008
f81632121_506.returns.push(null);
// 19014
f81632121_506.returns.push(null);
// 19020
f81632121_506.returns.push(null);
// 19026
f81632121_506.returns.push(null);
// 19032
f81632121_506.returns.push(null);
// 19038
f81632121_506.returns.push(null);
// 19044
f81632121_506.returns.push(null);
// 19050
f81632121_506.returns.push(null);
// 19056
f81632121_506.returns.push(null);
// 19061
o32.cancelBubble = false;
// 19062
o32.returnValue = true;
// undefined
o32 = null;
// 19063
o32 = {};
// 19066
o32.cancelBubble = false;
// 19069
f81632121_467.returns.push(1374851249570);
// 19074
f81632121_467.returns.push(1374851249572);
// 19078
f81632121_467.returns.push(1374851249578);
// 19082
f81632121_1007.returns.push(undefined);
// 19084
o32.returnValue = true;
// 19087
o32.srcElement = o33;
// 19089
o32.target = o33;
// 19096
f81632121_506.returns.push(null);
// 19102
f81632121_506.returns.push(null);
// 19108
f81632121_506.returns.push(null);
// 19114
f81632121_506.returns.push(null);
// 19120
f81632121_506.returns.push(null);
// 19126
f81632121_506.returns.push(null);
// 19132
f81632121_506.returns.push(null);
// 19138
f81632121_506.returns.push(null);
// 19144
f81632121_506.returns.push(null);
// 19150
f81632121_506.returns.push(null);
// 19156
f81632121_506.returns.push(null);
// 19162
f81632121_506.returns.push(null);
// 19168
f81632121_506.returns.push(null);
// 19174
f81632121_506.returns.push(null);
// 19180
f81632121_506.returns.push(null);
// 19186
f81632121_506.returns.push(null);
// 19192
f81632121_506.returns.push(null);
// 19198
f81632121_506.returns.push(null);
// 19204
f81632121_506.returns.push(null);
// 19210
f81632121_506.returns.push(null);
// 19216
f81632121_506.returns.push(null);
// 19222
f81632121_506.returns.push(null);
// 19227
o32.relatedTarget = o109;
// undefined
o32 = null;
// 19230
o32 = {};
// 19234
f81632121_467.returns.push(1374851249593);
// 19235
o32.cancelBubble = false;
// 19236
o32.returnValue = true;
// 19239
o32.srcElement = o33;
// 19241
o32.target = o33;
// 19248
f81632121_506.returns.push(null);
// 19254
f81632121_506.returns.push(null);
// 19260
f81632121_506.returns.push(null);
// 19266
f81632121_506.returns.push(null);
// 19272
f81632121_506.returns.push(null);
// 19278
f81632121_506.returns.push(null);
// 19284
f81632121_506.returns.push(null);
// 19290
f81632121_506.returns.push(null);
// 19296
f81632121_506.returns.push(null);
// 19302
f81632121_506.returns.push(null);
// 19308
f81632121_506.returns.push(null);
// 19314
f81632121_506.returns.push(null);
// 19320
f81632121_506.returns.push(null);
// 19326
f81632121_506.returns.push(null);
// 19332
f81632121_506.returns.push(null);
// 19338
f81632121_506.returns.push(null);
// 19344
f81632121_506.returns.push(null);
// 19350
f81632121_506.returns.push(null);
// 19356
f81632121_506.returns.push(null);
// 19362
f81632121_506.returns.push(null);
// 19368
f81632121_506.returns.push(null);
// 19374
f81632121_506.returns.push(null);
// 19379
o32.JSBNG__screenX = 970;
// 19380
o32.JSBNG__screenY = 511;
// 19381
o32.altKey = false;
// 19382
o32.bubbles = true;
// 19383
o32.button = 0;
// 19384
o32.buttons = void 0;
// 19385
o32.cancelable = false;
// 19386
o32.clientX = 902;
// 19387
o32.clientY = 346;
// 19388
o32.ctrlKey = false;
// 19389
o32.currentTarget = o0;
// 19390
o32.defaultPrevented = false;
// 19391
o32.detail = 0;
// 19392
o32.eventPhase = 3;
// 19393
o32.isTrusted = void 0;
// 19394
o32.metaKey = false;
// 19395
o32.pageX = 902;
// 19396
o32.pageY = 346;
// 19397
o32.relatedTarget = null;
// 19398
o32.fromElement = null;
// 19401
o32.shiftKey = false;
// 19404
o32.timeStamp = 1374851249592;
// 19405
o32.type = "mousemove";
// 19406
o32.view = ow81632121;
// undefined
o32 = null;
// 19415
f81632121_1852.returns.push(undefined);
// 19418
f81632121_14.returns.push(undefined);
// 19419
f81632121_12.returns.push(88);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 19423
o32 = {};
// 19427
f81632121_467.returns.push(1374851249632);
// 19428
o32.cancelBubble = false;
// 19429
o32.returnValue = true;
// 19432
o32.srcElement = o33;
// 19434
o32.target = o33;
// 19441
f81632121_506.returns.push(null);
// 19447
f81632121_506.returns.push(null);
// 19453
f81632121_506.returns.push(null);
// 19459
f81632121_506.returns.push(null);
// 19465
f81632121_506.returns.push(null);
// 19471
f81632121_506.returns.push(null);
// 19477
f81632121_506.returns.push(null);
// 19483
f81632121_506.returns.push(null);
// 19489
f81632121_506.returns.push(null);
// 19495
f81632121_506.returns.push(null);
// 19501
f81632121_506.returns.push(null);
// 19507
f81632121_506.returns.push(null);
// 19513
f81632121_506.returns.push(null);
// 19519
f81632121_506.returns.push(null);
// 19525
f81632121_506.returns.push(null);
// 19531
f81632121_506.returns.push(null);
// 19537
f81632121_506.returns.push(null);
// 19543
f81632121_506.returns.push(null);
// 19549
f81632121_506.returns.push(null);
// 19555
f81632121_506.returns.push(null);
// 19561
f81632121_506.returns.push(null);
// 19567
f81632121_506.returns.push(null);
// 19572
o32.JSBNG__screenX = 970;
// 19573
o32.JSBNG__screenY = 511;
// 19574
o32.altKey = false;
// 19575
o32.bubbles = true;
// 19576
o32.button = 0;
// 19577
o32.buttons = void 0;
// 19578
o32.cancelable = false;
// 19579
o32.clientX = 902;
// 19580
o32.clientY = 346;
// 19581
o32.ctrlKey = false;
// 19582
o32.currentTarget = o0;
// 19583
o32.defaultPrevented = false;
// 19584
o32.detail = 0;
// 19585
o32.eventPhase = 3;
// 19586
o32.isTrusted = void 0;
// 19587
o32.metaKey = false;
// 19588
o32.pageX = 902;
// 19589
o32.pageY = 346;
// 19590
o32.relatedTarget = null;
// 19591
o32.fromElement = null;
// 19594
o32.shiftKey = false;
// 19597
o32.timeStamp = 1374851249632;
// 19598
o32.type = "mousemove";
// 19599
o32.view = ow81632121;
// undefined
o32 = null;
// 19608
f81632121_1852.returns.push(undefined);
// 19611
f81632121_14.returns.push(undefined);
// 19612
f81632121_12.returns.push(89);
// 19615
o32 = {};
// 19618
o32.cancelBubble = false;
// 19621
f81632121_467.returns.push(1374851249851);
// 19623
o32.returnValue = true;
// undefined
o32 = null;
// 19625
f81632121_12.returns.push(90);
// 19627
o32 = {};
// 19630
o32.cancelBubble = false;
// 19633
f81632121_467.returns.push(1374851249869);
// 19635
o32.returnValue = true;
// undefined
o32 = null;
// 19636
o32 = {};
// 19639
o32.cancelBubble = false;
// 19642
f81632121_467.returns.push(1374851249883);
// 19644
o32.returnValue = true;
// undefined
o32 = null;
// 19645
o32 = {};
// 19648
o32.cancelBubble = false;
// 19651
f81632121_467.returns.push(1374851249901);
// 19653
o32.returnValue = true;
// undefined
o32 = null;
// 19654
o32 = {};
// 19657
o32.cancelBubble = false;
// 19660
f81632121_467.returns.push(1374851249908);
// 19662
o32.returnValue = true;
// undefined
o32 = null;
// 19663
o32 = {};
// 19666
o32.cancelBubble = false;
// 19669
f81632121_467.returns.push(1374851249924);
// 19671
o32.returnValue = true;
// undefined
o32 = null;
// 19672
o32 = {};
// 19675
o32.cancelBubble = false;
// 19678
f81632121_467.returns.push(1374851249931);
// 19680
o32.returnValue = true;
// undefined
o32 = null;
// 19681
o32 = {};
// 19684
o32.cancelBubble = false;
// 19687
f81632121_467.returns.push(1374851249948);
// 19689
o32.returnValue = true;
// undefined
o32 = null;
// 19690
o32 = {};
// 19693
o32.cancelBubble = false;
// 19696
f81632121_467.returns.push(1374851249962);
// 19698
o32.returnValue = true;
// undefined
o32 = null;
// 19699
o32 = {};
// 19702
o32.cancelBubble = false;
// 19705
f81632121_467.returns.push(1374851249973);
// 19707
o32.returnValue = true;
// undefined
o32 = null;
// 19708
o32 = {};
// 19711
o32.cancelBubble = false;
// 19714
f81632121_467.returns.push(1374851249979);
// 19716
o32.returnValue = true;
// undefined
o32 = null;
// 19717
o32 = {};
// 19720
o32.cancelBubble = false;
// 19723
f81632121_467.returns.push(1374851249996);
// 19725
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 19729
f81632121_467.returns.push(1374851250009);
// 19730
o32 = {};
// 19733
o32.cancelBubble = false;
// 19736
f81632121_467.returns.push(1374851250011);
// 19738
o32.returnValue = true;
// undefined
o32 = null;
// 19739
o32 = {};
// 19742
o32.cancelBubble = false;
// 19745
f81632121_467.returns.push(1374851250027);
// 19747
o32.returnValue = true;
// undefined
o32 = null;
// 19748
o32 = {};
// 19751
o32.cancelBubble = false;
// 19754
f81632121_467.returns.push(1374851250050);
// 19756
o32.returnValue = true;
// undefined
o32 = null;
// 19757
o32 = {};
// 19760
o32.cancelBubble = false;
// 19763
f81632121_467.returns.push(1374851250076);
// 19768
f81632121_467.returns.push(1374851250079);
// 19772
f81632121_467.returns.push(1374851250079);
// 19775
o32.returnValue = true;
// undefined
o32 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 19777
o32 = {};
// 19780
o32.cancelBubble = false;
// 19783
f81632121_467.returns.push(1374851250243);
// 19785
o32.returnValue = true;
// undefined
o32 = null;
// 19786
o32 = {};
// 19789
o32.cancelBubble = false;
// 19792
f81632121_467.returns.push(1374851250275);
// 19794
o32.returnValue = true;
// undefined
o32 = null;
// 19795
o32 = {};
// 19799
f81632121_467.returns.push(1374851250309);
// 19800
o32.cancelBubble = false;
// 19801
o32.returnValue = true;
// 19804
o32.srcElement = o33;
// 19806
o32.target = o33;
// 19813
f81632121_506.returns.push(null);
// 19819
f81632121_506.returns.push(null);
// 19825
f81632121_506.returns.push(null);
// 19831
f81632121_506.returns.push(null);
// 19837
f81632121_506.returns.push(null);
// 19843
f81632121_506.returns.push(null);
// 19849
f81632121_506.returns.push(null);
// 19855
f81632121_506.returns.push(null);
// 19861
f81632121_506.returns.push(null);
// 19867
f81632121_506.returns.push(null);
// 19873
f81632121_506.returns.push(null);
// 19879
f81632121_506.returns.push(null);
// 19885
f81632121_506.returns.push(null);
// 19891
f81632121_506.returns.push(null);
// 19897
f81632121_506.returns.push(null);
// 19903
f81632121_506.returns.push(null);
// 19909
f81632121_506.returns.push(null);
// 19915
f81632121_506.returns.push(null);
// 19921
f81632121_506.returns.push(null);
// 19927
f81632121_506.returns.push(null);
// 19933
f81632121_506.returns.push(null);
// 19939
f81632121_506.returns.push(null);
// 19944
o32.JSBNG__screenX = 969;
// 19945
o32.JSBNG__screenY = 511;
// 19946
o32.altKey = false;
// 19947
o32.bubbles = true;
// 19948
o32.button = 0;
// 19949
o32.buttons = void 0;
// 19950
o32.cancelable = false;
// 19951
o32.clientX = 901;
// 19952
o32.clientY = 346;
// 19953
o32.ctrlKey = false;
// 19954
o32.currentTarget = o0;
// 19955
o32.defaultPrevented = false;
// 19956
o32.detail = 0;
// 19957
o32.eventPhase = 3;
// 19958
o32.isTrusted = void 0;
// 19959
o32.metaKey = false;
// 19960
o32.pageX = 901;
// 19961
o32.pageY = 346;
// 19962
o32.relatedTarget = null;
// 19963
o32.fromElement = null;
// 19966
o32.shiftKey = false;
// 19969
o32.timeStamp = 1374851250306;
// 19970
o32.type = "mousemove";
// 19971
o32.view = ow81632121;
// undefined
o32 = null;
// 19980
f81632121_1852.returns.push(undefined);
// 19983
f81632121_14.returns.push(undefined);
// 19984
f81632121_12.returns.push(91);
// 19987
o32 = {};
// 19990
o32.srcElement = o33;
// 19992
o32.target = o33;
// 19999
f81632121_506.returns.push(null);
// 20005
f81632121_506.returns.push(null);
// 20011
f81632121_506.returns.push(null);
// 20017
f81632121_506.returns.push(null);
// 20023
f81632121_506.returns.push(null);
// 20029
f81632121_506.returns.push(null);
// 20035
f81632121_506.returns.push(null);
// 20041
f81632121_506.returns.push(null);
// 20047
f81632121_506.returns.push(null);
// 20053
f81632121_506.returns.push(null);
// 20059
f81632121_506.returns.push(null);
// 20065
f81632121_506.returns.push(null);
// 20071
f81632121_506.returns.push(null);
// 20077
f81632121_506.returns.push(null);
// 20083
f81632121_506.returns.push(null);
// 20089
f81632121_506.returns.push(null);
// 20095
f81632121_506.returns.push(null);
// 20101
f81632121_506.returns.push(null);
// 20107
f81632121_506.returns.push(null);
// 20113
f81632121_506.returns.push(null);
// 20119
f81632121_506.returns.push(null);
// 20125
f81632121_506.returns.push(null);
// 20130
o32.relatedTarget = o85;
// 20131
o36 = {};
// 20132
o85.parentNode = o36;
// 20133
o85.nodeType = 1;
// 20134
o85.getAttribute = f81632121_506;
// 20136
f81632121_506.returns.push(null);
// 20138
o36.parentNode = o35;
// undefined
o35 = null;
// 20139
o36.nodeType = 1;
// 20140
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 20142
f81632121_506.returns.push(null);
// 20148
f81632121_506.returns.push(null);
// 20154
f81632121_506.returns.push(null);
// 20160
f81632121_506.returns.push(null);
// 20166
f81632121_506.returns.push(null);
// 20172
f81632121_506.returns.push(null);
// 20178
f81632121_506.returns.push(null);
// 20184
f81632121_506.returns.push(null);
// 20190
f81632121_506.returns.push(null);
// 20196
f81632121_506.returns.push(null);
// 20202
f81632121_506.returns.push(null);
// 20208
f81632121_506.returns.push(null);
// 20214
f81632121_506.returns.push(null);
// 20220
f81632121_506.returns.push(null);
// 20226
f81632121_506.returns.push(null);
// 20232
f81632121_506.returns.push(null);
// 20238
f81632121_506.returns.push(null);
// 20244
f81632121_506.returns.push(null);
// 20250
f81632121_506.returns.push(null);
// 20256
f81632121_506.returns.push(null);
// 20261
o32.cancelBubble = false;
// 20262
o32.returnValue = true;
// undefined
o32 = null;
// 20263
o32 = {};
// 20266
o32.cancelBubble = false;
// 20269
f81632121_467.returns.push(1374851250391);
// 20272
f81632121_1007.returns.push(undefined);
// 20274
o32.returnValue = true;
// 20277
o32.srcElement = o85;
// 20279
o32.target = o85;
// 20286
f81632121_506.returns.push(null);
// 20292
f81632121_506.returns.push(null);
// 20298
f81632121_506.returns.push(null);
// 20304
f81632121_506.returns.push(null);
// 20310
f81632121_506.returns.push(null);
// 20316
f81632121_506.returns.push(null);
// 20322
f81632121_506.returns.push(null);
// 20328
f81632121_506.returns.push(null);
// 20334
f81632121_506.returns.push(null);
// 20340
f81632121_506.returns.push(null);
// 20346
f81632121_506.returns.push(null);
// 20352
f81632121_506.returns.push(null);
// 20358
f81632121_506.returns.push(null);
// 20364
f81632121_506.returns.push(null);
// 20370
f81632121_506.returns.push(null);
// 20376
f81632121_506.returns.push(null);
// 20382
f81632121_506.returns.push(null);
// 20388
f81632121_506.returns.push(null);
// 20394
f81632121_506.returns.push(null);
// 20400
f81632121_506.returns.push(null);
// 20406
f81632121_506.returns.push(null);
// 20411
o32.relatedTarget = o33;
// undefined
o32 = null;
// undefined
o33 = null;
// 20414
o32 = {};
// 20418
f81632121_467.returns.push(1374851250398);
// 20419
o32.cancelBubble = false;
// 20420
o32.returnValue = true;
// 20423
o32.srcElement = o85;
// 20425
o32.target = o85;
// 20432
f81632121_506.returns.push(null);
// 20438
f81632121_506.returns.push(null);
// 20444
f81632121_506.returns.push(null);
// 20450
f81632121_506.returns.push(null);
// 20456
f81632121_506.returns.push(null);
// 20462
f81632121_506.returns.push(null);
// 20468
f81632121_506.returns.push(null);
// 20474
f81632121_506.returns.push(null);
// 20480
f81632121_506.returns.push(null);
// 20486
f81632121_506.returns.push(null);
// 20492
f81632121_506.returns.push(null);
// 20498
f81632121_506.returns.push(null);
// 20504
f81632121_506.returns.push(null);
// 20510
f81632121_506.returns.push(null);
// 20516
f81632121_506.returns.push(null);
// 20522
f81632121_506.returns.push(null);
// 20528
f81632121_506.returns.push(null);
// 20534
f81632121_506.returns.push(null);
// 20540
f81632121_506.returns.push(null);
// 20546
f81632121_506.returns.push(null);
// 20552
f81632121_506.returns.push(null);
// 20557
o32.JSBNG__screenX = 964;
// 20558
o32.JSBNG__screenY = 483;
// 20559
o32.altKey = false;
// 20560
o32.bubbles = true;
// 20561
o32.button = 0;
// 20562
o32.buttons = void 0;
// 20563
o32.cancelable = false;
// 20564
o32.clientX = 896;
// 20565
o32.clientY = 318;
// 20566
o32.ctrlKey = false;
// 20567
o32.currentTarget = o0;
// 20568
o32.defaultPrevented = false;
// 20569
o32.detail = 0;
// 20570
o32.eventPhase = 3;
// 20571
o32.isTrusted = void 0;
// 20572
o32.metaKey = false;
// 20573
o32.pageX = 896;
// 20574
o32.pageY = 318;
// 20575
o32.relatedTarget = null;
// 20576
o32.fromElement = null;
// 20579
o32.shiftKey = false;
// 20582
o32.timeStamp = 1374851250398;
// 20583
o32.type = "mousemove";
// 20584
o32.view = ow81632121;
// undefined
o32 = null;
// 20593
f81632121_1852.returns.push(undefined);
// 20596
f81632121_14.returns.push(undefined);
// 20597
f81632121_12.returns.push(92);
// 20600
o32 = {};
// 20604
f81632121_467.returns.push(1374851250423);
// 20605
o32.cancelBubble = false;
// 20606
o32.returnValue = true;
// 20609
o32.srcElement = o85;
// 20611
o32.target = o85;
// 20618
f81632121_506.returns.push(null);
// 20624
f81632121_506.returns.push(null);
// 20630
f81632121_506.returns.push(null);
// 20636
f81632121_506.returns.push(null);
// 20642
f81632121_506.returns.push(null);
// 20648
f81632121_506.returns.push(null);
// 20654
f81632121_506.returns.push(null);
// 20660
f81632121_506.returns.push(null);
// 20666
f81632121_506.returns.push(null);
// 20672
f81632121_506.returns.push(null);
// 20678
f81632121_506.returns.push(null);
// 20684
f81632121_506.returns.push(null);
// 20690
f81632121_506.returns.push(null);
// 20696
f81632121_506.returns.push(null);
// 20702
f81632121_506.returns.push(null);
// 20708
f81632121_506.returns.push(null);
// 20714
f81632121_506.returns.push(null);
// 20720
f81632121_506.returns.push(null);
// 20726
f81632121_506.returns.push(null);
// 20732
f81632121_506.returns.push(null);
// 20738
f81632121_506.returns.push(null);
// 20743
o32.JSBNG__screenX = 956;
// 20744
o32.JSBNG__screenY = 468;
// 20745
o32.altKey = false;
// 20746
o32.bubbles = true;
// 20747
o32.button = 0;
// 20748
o32.buttons = void 0;
// 20749
o32.cancelable = false;
// 20750
o32.clientX = 888;
// 20751
o32.clientY = 303;
// 20752
o32.ctrlKey = false;
// 20753
o32.currentTarget = o0;
// 20754
o32.defaultPrevented = false;
// 20755
o32.detail = 0;
// 20756
o32.eventPhase = 3;
// 20757
o32.isTrusted = void 0;
// 20758
o32.metaKey = false;
// 20759
o32.pageX = 888;
// 20760
o32.pageY = 303;
// 20761
o32.relatedTarget = null;
// 20762
o32.fromElement = null;
// 20765
o32.shiftKey = false;
// 20768
o32.timeStamp = 1374851250423;
// 20769
o32.type = "mousemove";
// 20770
o32.view = ow81632121;
// undefined
o32 = null;
// 20779
f81632121_1852.returns.push(undefined);
// 20782
f81632121_14.returns.push(undefined);
// 20783
f81632121_12.returns.push(93);
// 20786
o32 = {};
// 20790
f81632121_467.returns.push(1374851250436);
// 20791
o32.cancelBubble = false;
// 20792
o32.returnValue = true;
// 20795
o32.srcElement = o85;
// 20797
o32.target = o85;
// 20804
f81632121_506.returns.push(null);
// 20810
f81632121_506.returns.push(null);
// 20816
f81632121_506.returns.push(null);
// 20822
f81632121_506.returns.push(null);
// 20828
f81632121_506.returns.push(null);
// 20834
f81632121_506.returns.push(null);
// 20840
f81632121_506.returns.push(null);
// 20846
f81632121_506.returns.push(null);
// 20852
f81632121_506.returns.push(null);
// 20858
f81632121_506.returns.push(null);
// 20864
f81632121_506.returns.push(null);
// 20870
f81632121_506.returns.push(null);
// 20876
f81632121_506.returns.push(null);
// 20882
f81632121_506.returns.push(null);
// 20888
f81632121_506.returns.push(null);
// 20894
f81632121_506.returns.push(null);
// 20900
f81632121_506.returns.push(null);
// 20906
f81632121_506.returns.push(null);
// 20912
f81632121_506.returns.push(null);
// 20918
f81632121_506.returns.push(null);
// 20924
f81632121_506.returns.push(null);
// 20929
o32.JSBNG__screenX = 951;
// 20930
o32.JSBNG__screenY = 466;
// 20931
o32.altKey = false;
// 20932
o32.bubbles = true;
// 20933
o32.button = 0;
// 20934
o32.buttons = void 0;
// 20935
o32.cancelable = false;
// 20936
o32.clientX = 883;
// 20937
o32.clientY = 301;
// 20938
o32.ctrlKey = false;
// 20939
o32.currentTarget = o0;
// 20940
o32.defaultPrevented = false;
// 20941
o32.detail = 0;
// 20942
o32.eventPhase = 3;
// 20943
o32.isTrusted = void 0;
// 20944
o32.metaKey = false;
// 20945
o32.pageX = 883;
// 20946
o32.pageY = 301;
// 20947
o32.relatedTarget = null;
// 20948
o32.fromElement = null;
// 20951
o32.shiftKey = false;
// 20954
o32.timeStamp = 1374851250436;
// 20955
o32.type = "mousemove";
// 20956
o32.view = ow81632121;
// undefined
o32 = null;
// 20965
f81632121_1852.returns.push(undefined);
// 20968
f81632121_14.returns.push(undefined);
// 20969
f81632121_12.returns.push(94);
// 20972
o32 = {};
// 20975
o32.srcElement = o85;
// 20977
o32.target = o85;
// 20984
f81632121_506.returns.push(null);
// 20990
f81632121_506.returns.push(null);
// 20996
f81632121_506.returns.push(null);
// 21002
f81632121_506.returns.push(null);
// 21008
f81632121_506.returns.push(null);
// 21014
f81632121_506.returns.push(null);
// 21020
f81632121_506.returns.push(null);
// 21026
f81632121_506.returns.push(null);
// 21032
f81632121_506.returns.push(null);
// 21038
f81632121_506.returns.push(null);
// 21044
f81632121_506.returns.push(null);
// 21050
f81632121_506.returns.push(null);
// 21056
f81632121_506.returns.push(null);
// 21062
f81632121_506.returns.push(null);
// 21068
f81632121_506.returns.push(null);
// 21074
f81632121_506.returns.push(null);
// 21080
f81632121_506.returns.push(null);
// 21086
f81632121_506.returns.push(null);
// 21092
f81632121_506.returns.push(null);
// 21098
f81632121_506.returns.push(null);
// 21104
f81632121_506.returns.push(null);
// 21109
o32.relatedTarget = o109;
// 21114
f81632121_506.returns.push(null);
// 21120
f81632121_506.returns.push(null);
// 21126
f81632121_506.returns.push(null);
// 21132
f81632121_506.returns.push(null);
// 21138
f81632121_506.returns.push(null);
// 21144
f81632121_506.returns.push(null);
// 21150
f81632121_506.returns.push(null);
// 21156
f81632121_506.returns.push(null);
// 21161
o32.cancelBubble = false;
// 21162
o32.returnValue = true;
// undefined
o32 = null;
// 21163
o32 = {};
// 21166
o32.cancelBubble = false;
// 21169
f81632121_467.returns.push(1374851250457);
// 21172
f81632121_1007.returns.push(undefined);
// 21174
o32.returnValue = true;
// 21177
o32.srcElement = o109;
// 21179
o32.target = o109;
// 21186
f81632121_506.returns.push(null);
// 21192
f81632121_506.returns.push(null);
// 21198
f81632121_506.returns.push(null);
// 21204
f81632121_506.returns.push(null);
// 21210
f81632121_506.returns.push(null);
// 21216
f81632121_506.returns.push(null);
// 21222
f81632121_506.returns.push(null);
// 21228
f81632121_506.returns.push(null);
// 21233
o32.relatedTarget = o85;
// undefined
o32 = null;
// undefined
o85 = null;
// 21236
o32 = {};
// 21240
f81632121_467.returns.push(1374851250458);
// 21241
o32.cancelBubble = false;
// 21242
o32.returnValue = true;
// 21245
o32.srcElement = o109;
// 21247
o32.target = o109;
// 21254
f81632121_506.returns.push(null);
// 21260
f81632121_506.returns.push(null);
// 21266
f81632121_506.returns.push(null);
// 21272
f81632121_506.returns.push(null);
// 21278
f81632121_506.returns.push(null);
// 21284
f81632121_506.returns.push(null);
// 21290
f81632121_506.returns.push(null);
// 21296
f81632121_506.returns.push(null);
// 21301
o32.JSBNG__screenX = 945;
// 21302
o32.JSBNG__screenY = 465;
// 21303
o32.altKey = false;
// 21304
o32.bubbles = true;
// 21305
o32.button = 0;
// 21306
o32.buttons = void 0;
// 21307
o32.cancelable = false;
// 21308
o32.clientX = 877;
// 21309
o32.clientY = 300;
// 21310
o32.ctrlKey = false;
// 21311
o32.currentTarget = o0;
// 21312
o32.defaultPrevented = false;
// 21313
o32.detail = 0;
// 21314
o32.eventPhase = 3;
// 21315
o32.isTrusted = void 0;
// 21316
o32.metaKey = false;
// 21317
o32.pageX = 877;
// 21318
o32.pageY = 300;
// 21319
o32.relatedTarget = null;
// 21320
o32.fromElement = null;
// 21323
o32.shiftKey = false;
// 21326
o32.timeStamp = 1374851250458;
// 21327
o32.type = "mousemove";
// 21328
o32.view = ow81632121;
// undefined
o32 = null;
// 21337
f81632121_1852.returns.push(undefined);
// 21340
f81632121_14.returns.push(undefined);
// 21341
f81632121_12.returns.push(95);
// 21344
o32 = {};
// 21347
o32.srcElement = o109;
// 21349
o32.target = o109;
// 21356
f81632121_506.returns.push(null);
// 21362
f81632121_506.returns.push(null);
// 21368
f81632121_506.returns.push(null);
// 21374
f81632121_506.returns.push(null);
// 21380
f81632121_506.returns.push(null);
// 21386
f81632121_506.returns.push(null);
// 21392
f81632121_506.returns.push(null);
// 21398
f81632121_506.returns.push(null);
// 21403
o33 = {};
// 21404
o32.relatedTarget = o33;
// 21405
o35 = {};
// 21406
o33.parentNode = o35;
// 21407
o33.nodeType = 1;
// 21408
o33.getAttribute = f81632121_506;
// 21410
f81632121_506.returns.push(null);
// 21412
o35.parentNode = o24;
// 21413
o35.nodeType = 1;
// 21414
o35.getAttribute = f81632121_506;
// undefined
o35 = null;
// 21416
f81632121_506.returns.push(null);
// 21418
o24.parentNode = o91;
// 21419
o24.nodeType = 1;
// 21420
o24.getAttribute = f81632121_506;
// undefined
o24 = null;
// 21422
f81632121_506.returns.push(null);
// 21425
o91.nodeType = 1;
// 21426
o91.getAttribute = f81632121_506;
// undefined
o91 = null;
// 21428
f81632121_506.returns.push(null);
// 21431
o92.nodeType = 1;
// 21432
o92.getAttribute = f81632121_506;
// undefined
o92 = null;
// 21434
f81632121_506.returns.push(null);
// 21436
o185.parentNode = o21;
// 21437
o185.nodeType = 1;
// 21438
o185.getAttribute = f81632121_506;
// 21440
f81632121_506.returns.push(null);
// 21443
o21.nodeType = 1;
// 21446
f81632121_506.returns.push(null);
// 21449
o20.nodeType = 1;
// 21452
f81632121_506.returns.push(null);
// 21455
o45.nodeType = 1;
// 21456
o45.getAttribute = f81632121_506;
// 21458
f81632121_506.returns.push(null);
// 21464
f81632121_506.returns.push(null);
// 21470
f81632121_506.returns.push(null);
// 21476
f81632121_506.returns.push(null);
// 21482
f81632121_506.returns.push(null);
// 21488
f81632121_506.returns.push(null);
// 21494
f81632121_506.returns.push(null);
// 21500
f81632121_506.returns.push(null);
// 21506
f81632121_506.returns.push(null);
// 21511
o32.cancelBubble = false;
// 21512
o32.returnValue = true;
// undefined
o32 = null;
// 21513
o24 = {};
// 21516
o24.cancelBubble = false;
// 21519
f81632121_467.returns.push(1374851250484);
// 21522
f81632121_1007.returns.push(undefined);
// 21524
o24.returnValue = true;
// 21527
o24.srcElement = o33;
// 21529
o24.target = o33;
// 21536
f81632121_506.returns.push(null);
// 21542
f81632121_506.returns.push(null);
// 21548
f81632121_506.returns.push(null);
// 21554
f81632121_506.returns.push(null);
// 21560
f81632121_506.returns.push(null);
// 21566
f81632121_506.returns.push(null);
// 21572
f81632121_506.returns.push(null);
// 21578
f81632121_506.returns.push(null);
// 21584
f81632121_506.returns.push(null);
// 21590
f81632121_506.returns.push(null);
// 21596
f81632121_506.returns.push(null);
// 21602
f81632121_506.returns.push(null);
// 21608
f81632121_506.returns.push(null);
// 21614
f81632121_506.returns.push(null);
// 21620
f81632121_506.returns.push(null);
// 21626
f81632121_506.returns.push(null);
// 21632
f81632121_506.returns.push(null);
// 21637
o24.relatedTarget = o109;
// undefined
o24 = null;
// 21640
o24 = {};
// 21644
f81632121_467.returns.push(1374851250489);
// 21645
o24.cancelBubble = false;
// 21646
o24.returnValue = true;
// 21649
o24.srcElement = o33;
// 21651
o24.target = o33;
// 21658
f81632121_506.returns.push(null);
// 21664
f81632121_506.returns.push(null);
// 21670
f81632121_506.returns.push(null);
// 21676
f81632121_506.returns.push(null);
// 21682
f81632121_506.returns.push(null);
// 21688
f81632121_506.returns.push(null);
// 21694
f81632121_506.returns.push(null);
// 21700
f81632121_506.returns.push(null);
// 21706
f81632121_506.returns.push(null);
// 21712
f81632121_506.returns.push(null);
// 21718
f81632121_506.returns.push(null);
// 21724
f81632121_506.returns.push(null);
// 21730
f81632121_506.returns.push(null);
// 21736
f81632121_506.returns.push(null);
// 21742
f81632121_506.returns.push(null);
// 21748
f81632121_506.returns.push(null);
// 21754
f81632121_506.returns.push(null);
// 21759
o24.JSBNG__screenX = 933;
// 21760
o24.JSBNG__screenY = 465;
// 21761
o24.altKey = false;
// 21762
o24.bubbles = true;
// 21763
o24.button = 0;
// 21764
o24.buttons = void 0;
// 21765
o24.cancelable = false;
// 21766
o24.clientX = 865;
// 21767
o24.clientY = 300;
// 21768
o24.ctrlKey = false;
// 21769
o24.currentTarget = o0;
// 21770
o24.defaultPrevented = false;
// 21771
o24.detail = 0;
// 21772
o24.eventPhase = 3;
// 21773
o24.isTrusted = void 0;
// 21774
o24.metaKey = false;
// 21775
o24.pageX = 865;
// 21776
o24.pageY = 300;
// 21777
o24.relatedTarget = null;
// 21778
o24.fromElement = null;
// 21781
o24.shiftKey = false;
// 21784
o24.timeStamp = 1374851250489;
// 21785
o24.type = "mousemove";
// 21786
o24.view = ow81632121;
// undefined
o24 = null;
// 21795
f81632121_1852.returns.push(undefined);
// 21798
f81632121_14.returns.push(undefined);
// 21799
f81632121_12.returns.push(96);
// 21802
o24 = {};
// 21805
o24.srcElement = o33;
// 21807
o24.target = o33;
// 21814
f81632121_506.returns.push(null);
// 21820
f81632121_506.returns.push(null);
// 21826
f81632121_506.returns.push(null);
// 21832
f81632121_506.returns.push(null);
// 21838
f81632121_506.returns.push(null);
// 21844
f81632121_506.returns.push(null);
// 21850
f81632121_506.returns.push(null);
// 21856
f81632121_506.returns.push(null);
// 21862
f81632121_506.returns.push(null);
// 21868
f81632121_506.returns.push(null);
// 21874
f81632121_506.returns.push(null);
// 21880
f81632121_506.returns.push(null);
// 21886
f81632121_506.returns.push(null);
// 21892
f81632121_506.returns.push(null);
// 21898
f81632121_506.returns.push(null);
// 21904
f81632121_506.returns.push(null);
// 21910
f81632121_506.returns.push(null);
// 21915
o24.relatedTarget = o28;
// 21916
o32 = {};
// 21917
o28.parentNode = o32;
// 21918
o28.nodeType = 1;
// 21921
f81632121_506.returns.push(null);
// 21923
o35 = {};
// 21924
o32.parentNode = o35;
// 21925
o32.nodeType = 1;
// 21926
o32.getAttribute = f81632121_506;
// undefined
o32 = null;
// 21928
f81632121_506.returns.push(null);
// 21930
o35.parentNode = o181;
// 21931
o35.nodeType = 1;
// 21932
o35.getAttribute = f81632121_506;
// undefined
o35 = null;
// 21934
f81632121_506.returns.push(null);
// 21937
o181.nodeType = 1;
// 21938
o181.getAttribute = f81632121_506;
// undefined
o181 = null;
// 21940
f81632121_506.returns.push(null);
// 21946
f81632121_506.returns.push(null);
// 21952
f81632121_506.returns.push(null);
// 21958
f81632121_506.returns.push(null);
// 21964
f81632121_506.returns.push(null);
// 21970
f81632121_506.returns.push(null);
// 21976
f81632121_506.returns.push(null);
// 21982
f81632121_506.returns.push(null);
// 21988
f81632121_506.returns.push(null);
// 21994
f81632121_506.returns.push(null);
// 22000
f81632121_506.returns.push(null);
// 22006
f81632121_506.returns.push(null);
// 22012
f81632121_506.returns.push(null);
// 22018
f81632121_506.returns.push(null);
// 22024
f81632121_506.returns.push(null);
// 22029
o24.cancelBubble = false;
// 22030
o24.returnValue = true;
// undefined
o24 = null;
// 22031
o24 = {};
// 22034
o24.cancelBubble = false;
// 22037
f81632121_467.returns.push(1374851250516);
// 22040
f81632121_1007.returns.push(undefined);
// 22042
o24.returnValue = true;
// 22045
o24.srcElement = o28;
// 22047
o24.target = o28;
// 22054
f81632121_506.returns.push(null);
// 22060
f81632121_506.returns.push(null);
// 22066
f81632121_506.returns.push(null);
// 22072
f81632121_506.returns.push(null);
// 22078
f81632121_506.returns.push(null);
// 22084
f81632121_506.returns.push(null);
// 22090
f81632121_506.returns.push(null);
// 22096
f81632121_506.returns.push(null);
// 22102
f81632121_506.returns.push(null);
// 22108
f81632121_506.returns.push(null);
// 22114
f81632121_506.returns.push(null);
// 22120
f81632121_506.returns.push(null);
// 22126
f81632121_506.returns.push(null);
// 22132
f81632121_506.returns.push(null);
// 22138
f81632121_506.returns.push(null);
// 22144
f81632121_506.returns.push(null);
// 22150
f81632121_506.returns.push(null);
// 22156
f81632121_506.returns.push(null);
// 22161
o24.relatedTarget = o33;
// undefined
o24 = null;
// 22164
o24 = {};
// 22168
f81632121_467.returns.push(1374851250528);
// 22169
o24.cancelBubble = false;
// 22170
o24.returnValue = true;
// 22173
o24.srcElement = o28;
// 22175
o24.target = o28;
// 22182
f81632121_506.returns.push(null);
// 22188
f81632121_506.returns.push(null);
// 22194
f81632121_506.returns.push(null);
// 22200
f81632121_506.returns.push(null);
// 22206
f81632121_506.returns.push(null);
// 22212
f81632121_506.returns.push(null);
// 22218
f81632121_506.returns.push(null);
// 22224
f81632121_506.returns.push(null);
// 22230
f81632121_506.returns.push(null);
// 22236
f81632121_506.returns.push(null);
// 22242
f81632121_506.returns.push(null);
// 22248
f81632121_506.returns.push(null);
// 22254
f81632121_506.returns.push(null);
// 22260
f81632121_506.returns.push(null);
// 22266
f81632121_506.returns.push(null);
// 22272
f81632121_506.returns.push(null);
// 22278
f81632121_506.returns.push(null);
// 22284
f81632121_506.returns.push(null);
// 22289
o24.JSBNG__screenX = 913;
// 22290
o24.JSBNG__screenY = 468;
// 22291
o24.altKey = false;
// 22292
o24.bubbles = true;
// 22293
o24.button = 0;
// 22294
o24.buttons = void 0;
// 22295
o24.cancelable = false;
// 22296
o24.clientX = 845;
// 22297
o24.clientY = 303;
// 22298
o24.ctrlKey = false;
// 22299
o24.currentTarget = o0;
// 22300
o24.defaultPrevented = false;
// 22301
o24.detail = 0;
// 22302
o24.eventPhase = 3;
// 22303
o24.isTrusted = void 0;
// 22304
o24.metaKey = false;
// 22305
o24.pageX = 845;
// 22306
o24.pageY = 303;
// 22307
o24.relatedTarget = null;
// 22308
o24.fromElement = null;
// 22311
o24.shiftKey = false;
// 22314
o24.timeStamp = 1374851250528;
// 22315
o24.type = "mousemove";
// 22316
o24.view = ow81632121;
// undefined
o24 = null;
// 22325
f81632121_1852.returns.push(undefined);
// 22328
f81632121_14.returns.push(undefined);
// 22329
f81632121_12.returns.push(97);
// 22332
o24 = {};
// 22336
f81632121_467.returns.push(1374851250539);
// 22337
o24.cancelBubble = false;
// 22338
o24.returnValue = true;
// 22341
o24.srcElement = o28;
// 22343
o24.target = o28;
// 22350
f81632121_506.returns.push(null);
// 22356
f81632121_506.returns.push(null);
// 22362
f81632121_506.returns.push(null);
// 22368
f81632121_506.returns.push(null);
// 22374
f81632121_506.returns.push(null);
// 22380
f81632121_506.returns.push(null);
// 22386
f81632121_506.returns.push(null);
// 22392
f81632121_506.returns.push(null);
// 22398
f81632121_506.returns.push(null);
// 22404
f81632121_506.returns.push(null);
// 22410
f81632121_506.returns.push(null);
// 22416
f81632121_506.returns.push(null);
// 22422
f81632121_506.returns.push(null);
// 22428
f81632121_506.returns.push(null);
// 22434
f81632121_506.returns.push(null);
// 22440
f81632121_506.returns.push(null);
// 22446
f81632121_506.returns.push(null);
// 22452
f81632121_506.returns.push(null);
// 22457
o24.JSBNG__screenX = 890;
// 22458
o24.JSBNG__screenY = 476;
// 22459
o24.altKey = false;
// 22460
o24.bubbles = true;
// 22461
o24.button = 0;
// 22462
o24.buttons = void 0;
// 22463
o24.cancelable = false;
// 22464
o24.clientX = 822;
// 22465
o24.clientY = 311;
// 22466
o24.ctrlKey = false;
// 22467
o24.currentTarget = o0;
// 22468
o24.defaultPrevented = false;
// 22469
o24.detail = 0;
// 22470
o24.eventPhase = 3;
// 22471
o24.isTrusted = void 0;
// 22472
o24.metaKey = false;
// 22473
o24.pageX = 822;
// 22474
o24.pageY = 311;
// 22475
o24.relatedTarget = null;
// 22476
o24.fromElement = null;
// 22479
o24.shiftKey = false;
// 22482
o24.timeStamp = 1374851250539;
// 22483
o24.type = "mousemove";
// 22484
o24.view = ow81632121;
// undefined
o24 = null;
// 22493
f81632121_1852.returns.push(undefined);
// 22496
f81632121_14.returns.push(undefined);
// 22497
f81632121_12.returns.push(98);
// 22500
o24 = {};
// 22504
f81632121_467.returns.push(1374851250545);
// 22505
o24.cancelBubble = false;
// 22506
o24.returnValue = true;
// 22509
o24.srcElement = o28;
// 22511
o24.target = o28;
// 22518
f81632121_506.returns.push(null);
// 22524
f81632121_506.returns.push(null);
// 22530
f81632121_506.returns.push(null);
// 22536
f81632121_506.returns.push(null);
// 22542
f81632121_506.returns.push(null);
// 22548
f81632121_506.returns.push(null);
// 22554
f81632121_506.returns.push(null);
// 22560
f81632121_506.returns.push(null);
// 22566
f81632121_506.returns.push(null);
// 22572
f81632121_506.returns.push(null);
// 22578
f81632121_506.returns.push(null);
// 22584
f81632121_506.returns.push(null);
// 22590
f81632121_506.returns.push(null);
// 22596
f81632121_506.returns.push(null);
// 22602
f81632121_506.returns.push(null);
// 22608
f81632121_506.returns.push(null);
// 22614
f81632121_506.returns.push(null);
// 22620
f81632121_506.returns.push(null);
// 22625
o24.JSBNG__screenX = 884;
// 22626
o24.JSBNG__screenY = 479;
// 22627
o24.altKey = false;
// 22628
o24.bubbles = true;
// 22629
o24.button = 0;
// 22630
o24.buttons = void 0;
// 22631
o24.cancelable = false;
// 22632
o24.clientX = 816;
// 22633
o24.clientY = 314;
// 22634
o24.ctrlKey = false;
// 22635
o24.currentTarget = o0;
// 22636
o24.defaultPrevented = false;
// 22637
o24.detail = 0;
// 22638
o24.eventPhase = 3;
// 22639
o24.isTrusted = void 0;
// 22640
o24.metaKey = false;
// 22641
o24.pageX = 816;
// 22642
o24.pageY = 314;
// 22643
o24.relatedTarget = null;
// 22644
o24.fromElement = null;
// 22647
o24.shiftKey = false;
// 22650
o24.timeStamp = 1374851250545;
// 22651
o24.type = "mousemove";
// 22652
o24.view = ow81632121;
// undefined
o24 = null;
// 22661
f81632121_1852.returns.push(undefined);
// 22664
f81632121_14.returns.push(undefined);
// 22665
f81632121_12.returns.push(99);
// 22668
o24 = {};
// 22671
o24.srcElement = o28;
// 22673
o24.target = o28;
// 22680
f81632121_506.returns.push(null);
// 22686
f81632121_506.returns.push(null);
// 22692
f81632121_506.returns.push(null);
// 22698
f81632121_506.returns.push(null);
// 22704
f81632121_506.returns.push(null);
// 22710
f81632121_506.returns.push(null);
// 22716
f81632121_506.returns.push(null);
// 22722
f81632121_506.returns.push(null);
// 22728
f81632121_506.returns.push(null);
// 22734
f81632121_506.returns.push(null);
// 22740
f81632121_506.returns.push(null);
// 22746
f81632121_506.returns.push(null);
// 22752
f81632121_506.returns.push(null);
// 22758
f81632121_506.returns.push(null);
// 22764
f81632121_506.returns.push(null);
// 22770
f81632121_506.returns.push(null);
// 22776
f81632121_506.returns.push(null);
// 22782
f81632121_506.returns.push(null);
// 22787
o32 = {};
// 22788
o24.relatedTarget = o32;
// 22789
o35 = {};
// 22790
o32.parentNode = o35;
// 22791
o32.nodeType = 1;
// 22792
o32.getAttribute = f81632121_506;
// 22794
f81632121_506.returns.push(null);
// 22796
o36 = {};
// 22797
o35.parentNode = o36;
// 22798
o35.nodeType = 1;
// 22799
o35.getAttribute = f81632121_506;
// undefined
o35 = null;
// 22801
f81632121_506.returns.push(null);
// 22803
o35 = {};
// 22804
o36.parentNode = o35;
// 22805
o36.nodeType = 1;
// 22806
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 22808
f81632121_506.returns.push(null);
// 22810
o36 = {};
// 22811
o35.parentNode = o36;
// 22812
o35.nodeType = 1;
// 22813
o35.getAttribute = f81632121_506;
// undefined
o35 = null;
// 22815
f81632121_506.returns.push(null);
// 22817
o36.parentNode = o28;
// 22818
o36.nodeType = 1;
// 22819
o36.getAttribute = f81632121_506;
// undefined
o36 = null;
// 22821
f81632121_506.returns.push(null);
// 22827
f81632121_506.returns.push(null);
// 22833
f81632121_506.returns.push(null);
// 22839
f81632121_506.returns.push(null);
// 22845
f81632121_506.returns.push(null);
// 22851
f81632121_506.returns.push(null);
// 22857
f81632121_506.returns.push(null);
// 22863
f81632121_506.returns.push(null);
// 22869
f81632121_506.returns.push(null);
// 22875
f81632121_506.returns.push(null);
// 22881
f81632121_506.returns.push(null);
// 22887
f81632121_506.returns.push(null);
// 22893
f81632121_506.returns.push(null);
// 22899
f81632121_506.returns.push(null);
// 22905
f81632121_506.returns.push(null);
// 22911
f81632121_506.returns.push(null);
// 22917
f81632121_506.returns.push(null);
// 22923
f81632121_506.returns.push(null);
// 22929
f81632121_506.returns.push(null);
// 22934
o24.cancelBubble = false;
// 22935
o24.returnValue = true;
// undefined
o24 = null;
// 22936
o24 = {};
// 22939
o24.cancelBubble = false;
// 22942
f81632121_467.returns.push(1374851250574);
// 22945
f81632121_1007.returns.push(undefined);
// 22947
o24.returnValue = true;
// 22950
o24.srcElement = o32;
// 22952
o24.target = o32;
// 22959
f81632121_506.returns.push(null);
// 22965
f81632121_506.returns.push(null);
// 22971
f81632121_506.returns.push(null);
// 22977
f81632121_506.returns.push(null);
// 22983
f81632121_506.returns.push(null);
// 22989
f81632121_506.returns.push(null);
// 22995
f81632121_506.returns.push(null);
// 23001
f81632121_506.returns.push(null);
// 23007
f81632121_506.returns.push(null);
// 23013
f81632121_506.returns.push(null);
// 23019
f81632121_506.returns.push(null);
// 23025
f81632121_506.returns.push(null);
// 23031
f81632121_506.returns.push(null);
// 23037
f81632121_506.returns.push(null);
// 23043
f81632121_506.returns.push(null);
// 23049
f81632121_506.returns.push(null);
// 23055
f81632121_506.returns.push(null);
// 23061
f81632121_506.returns.push(null);
// 23067
f81632121_506.returns.push(null);
// 23073
f81632121_506.returns.push(null);
// 23079
f81632121_506.returns.push(null);
// 23085
f81632121_506.returns.push(null);
// 23091
f81632121_506.returns.push(null);
// 23096
o24.relatedTarget = o28;
// undefined
o24 = null;
// undefined
o28 = null;
// 23099
o24 = {};
// 23103
f81632121_467.returns.push(1374851250582);
// 23108
f81632121_467.returns.push(1374851250583);
// 23112
f81632121_467.returns.push(1374851250583);
// 23114
o24.cancelBubble = false;
// 23115
o24.returnValue = true;
// 23118
o24.srcElement = o32;
// 23120
o24.target = o32;
// 23127
f81632121_506.returns.push(null);
// 23133
f81632121_506.returns.push(null);
// 23139
f81632121_506.returns.push(null);
// 23145
f81632121_506.returns.push(null);
// 23151
f81632121_506.returns.push(null);
// 23157
f81632121_506.returns.push(null);
// 23163
f81632121_506.returns.push(null);
// 23169
f81632121_506.returns.push(null);
// 23175
f81632121_506.returns.push(null);
// 23181
f81632121_506.returns.push(null);
// 23187
f81632121_506.returns.push(null);
// 23193
f81632121_506.returns.push(null);
// 23199
f81632121_506.returns.push(null);
// 23205
f81632121_506.returns.push(null);
// 23211
f81632121_506.returns.push(null);
// 23217
f81632121_506.returns.push(null);
// 23223
f81632121_506.returns.push(null);
// 23229
f81632121_506.returns.push(null);
// 23235
f81632121_506.returns.push(null);
// 23241
f81632121_506.returns.push(null);
// 23247
f81632121_506.returns.push(null);
// 23253
f81632121_506.returns.push(null);
// 23259
f81632121_506.returns.push(null);
// 23264
o24.JSBNG__screenX = 873;
// 23265
o24.JSBNG__screenY = 486;
// 23266
o24.altKey = false;
// 23267
o24.bubbles = true;
// 23268
o24.button = 0;
// 23269
o24.buttons = void 0;
// 23270
o24.cancelable = false;
// 23271
o24.clientX = 805;
// 23272
o24.clientY = 321;
// 23273
o24.ctrlKey = false;
// 23274
o24.currentTarget = o0;
// 23275
o24.defaultPrevented = false;
// 23276
o24.detail = 0;
// 23277
o24.eventPhase = 3;
// 23278
o24.isTrusted = void 0;
// 23279
o24.metaKey = false;
// 23280
o24.pageX = 805;
// 23281
o24.pageY = 321;
// 23282
o24.relatedTarget = null;
// 23283
o24.fromElement = null;
// 23286
o24.shiftKey = false;
// 23289
o24.timeStamp = 1374851250582;
// 23290
o24.type = "mousemove";
// 23291
o24.view = ow81632121;
// undefined
o24 = null;
// 23300
f81632121_1852.returns.push(undefined);
// 23303
f81632121_14.returns.push(undefined);
// 23304
f81632121_12.returns.push(100);
// 23307
o24 = {};
// 23311
f81632121_467.returns.push(1374851250598);
// 23312
o24.cancelBubble = false;
// 23313
o24.returnValue = true;
// 23316
o24.srcElement = o32;
// 23318
o24.target = o32;
// 23325
f81632121_506.returns.push(null);
// 23331
f81632121_506.returns.push(null);
// 23337
f81632121_506.returns.push(null);
// 23343
f81632121_506.returns.push(null);
// 23349
f81632121_506.returns.push(null);
// 23355
f81632121_506.returns.push(null);
// 23361
f81632121_506.returns.push(null);
// 23367
f81632121_506.returns.push(null);
// 23373
f81632121_506.returns.push(null);
// 23379
f81632121_506.returns.push(null);
// 23385
f81632121_506.returns.push(null);
// 23391
f81632121_506.returns.push(null);
// 23397
f81632121_506.returns.push(null);
// 23403
f81632121_506.returns.push(null);
// 23409
f81632121_506.returns.push(null);
// 23415
f81632121_506.returns.push(null);
// 23421
f81632121_506.returns.push(null);
// 23427
f81632121_506.returns.push(null);
// 23433
f81632121_506.returns.push(null);
// 23439
f81632121_506.returns.push(null);
// 23445
f81632121_506.returns.push(null);
// 23451
f81632121_506.returns.push(null);
// 23457
f81632121_506.returns.push(null);
// 23462
o24.JSBNG__screenX = 854;
// 23463
o24.JSBNG__screenY = 505;
// 23464
o24.altKey = false;
// 23465
o24.bubbles = true;
// 23466
o24.button = 0;
// 23467
o24.buttons = void 0;
// 23468
o24.cancelable = false;
// 23469
o24.clientX = 786;
// 23470
o24.clientY = 340;
// 23471
o24.ctrlKey = false;
// 23472
o24.currentTarget = o0;
// 23473
o24.defaultPrevented = false;
// 23474
o24.detail = 0;
// 23475
o24.eventPhase = 3;
// 23476
o24.isTrusted = void 0;
// 23477
o24.metaKey = false;
// 23478
o24.pageX = 786;
// 23479
o24.pageY = 340;
// 23480
o24.relatedTarget = null;
// 23481
o24.fromElement = null;
// 23484
o24.shiftKey = false;
// 23487
o24.timeStamp = 1374851250598;
// 23488
o24.type = "mousemove";
// 23489
o24.view = ow81632121;
// undefined
o24 = null;
// 23498
f81632121_1852.returns.push(undefined);
// 23501
f81632121_14.returns.push(undefined);
// 23502
f81632121_12.returns.push(101);
// 23505
o24 = {};
// 23508
o24.srcElement = o32;
// 23510
o24.target = o32;
// 23517
f81632121_506.returns.push(null);
// 23523
f81632121_506.returns.push(null);
// 23529
f81632121_506.returns.push(null);
// 23535
f81632121_506.returns.push(null);
// 23541
f81632121_506.returns.push(null);
// 23547
f81632121_506.returns.push(null);
// 23553
f81632121_506.returns.push(null);
// 23559
f81632121_506.returns.push(null);
// 23565
f81632121_506.returns.push(null);
// 23571
f81632121_506.returns.push(null);
// 23577
f81632121_506.returns.push(null);
// 23583
f81632121_506.returns.push(null);
// 23589
f81632121_506.returns.push(null);
// 23595
f81632121_506.returns.push(null);
// 23601
f81632121_506.returns.push(null);
// 23607
f81632121_506.returns.push(null);
// 23613
f81632121_506.returns.push(null);
// 23619
f81632121_506.returns.push(null);
// 23625
f81632121_506.returns.push(null);
// 23631
f81632121_506.returns.push(null);
// 23637
f81632121_506.returns.push(null);
// 23643
f81632121_506.returns.push(null);
// 23649
f81632121_506.returns.push(null);
// 23654
o24.relatedTarget = o33;
// 23659
f81632121_506.returns.push(null);
// 23665
f81632121_506.returns.push(null);
// 23671
f81632121_506.returns.push(null);
// 23677
f81632121_506.returns.push(null);
// 23683
f81632121_506.returns.push(null);
// 23689
f81632121_506.returns.push(null);
// 23695
f81632121_506.returns.push(null);
// 23701
f81632121_506.returns.push(null);
// 23707
f81632121_506.returns.push(null);
// 23713
f81632121_506.returns.push(null);
// 23719
f81632121_506.returns.push(null);
// 23725
f81632121_506.returns.push(null);
// 23731
f81632121_506.returns.push(null);
// 23737
f81632121_506.returns.push(null);
// 23743
f81632121_506.returns.push(null);
// 23749
f81632121_506.returns.push(null);
// 23755
f81632121_506.returns.push(null);
// 23760
o24.cancelBubble = false;
// 23761
o24.returnValue = true;
// undefined
o24 = null;
// 23762
o24 = {};
// 23765
o24.cancelBubble = false;
// 23768
f81632121_467.returns.push(1374851250628);
// 23771
f81632121_1007.returns.push(undefined);
// 23773
o24.returnValue = true;
// 23776
o24.srcElement = o33;
// 23778
o24.target = o33;
// 23785
f81632121_506.returns.push(null);
// 23791
f81632121_506.returns.push(null);
// 23797
f81632121_506.returns.push(null);
// 23803
f81632121_506.returns.push(null);
// 23809
f81632121_506.returns.push(null);
// 23815
f81632121_506.returns.push(null);
// 23821
f81632121_506.returns.push(null);
// 23827
f81632121_506.returns.push(null);
// 23833
f81632121_506.returns.push(null);
// 23839
f81632121_506.returns.push(null);
// 23845
f81632121_506.returns.push(null);
// 23851
f81632121_506.returns.push(null);
// 23857
f81632121_506.returns.push(null);
// 23863
f81632121_506.returns.push(null);
// 23869
f81632121_506.returns.push(null);
// 23875
f81632121_506.returns.push(null);
// 23881
f81632121_506.returns.push(null);
// 23886
o24.relatedTarget = o32;
// undefined
o24 = null;
// undefined
o32 = null;
// 23889
o24 = {};
// 23893
f81632121_467.returns.push(1374851250634);
// 23894
o24.cancelBubble = false;
// 23895
o24.returnValue = true;
// 23898
o24.srcElement = o33;
// 23900
o24.target = o33;
// 23907
f81632121_506.returns.push(null);
// 23913
f81632121_506.returns.push(null);
// 23919
f81632121_506.returns.push(null);
// 23925
f81632121_506.returns.push(null);
// 23931
f81632121_506.returns.push(null);
// 23937
f81632121_506.returns.push(null);
// 23943
f81632121_506.returns.push(null);
// 23949
f81632121_506.returns.push(null);
// 23955
f81632121_506.returns.push(null);
// 23961
f81632121_506.returns.push(null);
// 23967
f81632121_506.returns.push(null);
// 23973
f81632121_506.returns.push(null);
// 23979
f81632121_506.returns.push(null);
// 23985
f81632121_506.returns.push(null);
// 23991
f81632121_506.returns.push(null);
// 23997
f81632121_506.returns.push(null);
// 24003
f81632121_506.returns.push(null);
// 24008
o24.JSBNG__screenX = 849;
// 24009
o24.JSBNG__screenY = 512;
// 24010
o24.altKey = false;
// 24011
o24.bubbles = true;
// 24012
o24.button = 0;
// 24013
o24.buttons = void 0;
// 24014
o24.cancelable = false;
// 24015
o24.clientX = 781;
// 24016
o24.clientY = 347;
// 24017
o24.ctrlKey = false;
// 24018
o24.currentTarget = o0;
// 24019
o24.defaultPrevented = false;
// 24020
o24.detail = 0;
// 24021
o24.eventPhase = 3;
// 24022
o24.isTrusted = void 0;
// 24023
o24.metaKey = false;
// 24024
o24.pageX = 781;
// 24025
o24.pageY = 347;
// 24026
o24.relatedTarget = null;
// 24027
o24.fromElement = null;
// 24030
o24.shiftKey = false;
// 24033
o24.timeStamp = 1374851250634;
// 24034
o24.type = "mousemove";
// 24035
o24.view = ow81632121;
// undefined
o24 = null;
// 24044
f81632121_1852.returns.push(undefined);
// 24047
f81632121_14.returns.push(undefined);
// 24048
f81632121_12.returns.push(102);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 24052
o24 = {};
// 24055
o24.srcElement = o33;
// 24057
o24.target = o33;
// 24064
f81632121_506.returns.push(null);
// 24070
f81632121_506.returns.push(null);
// 24076
f81632121_506.returns.push(null);
// 24082
f81632121_506.returns.push(null);
// 24088
f81632121_506.returns.push(null);
// 24094
f81632121_506.returns.push(null);
// 24100
f81632121_506.returns.push(null);
// 24106
f81632121_506.returns.push(null);
// 24112
f81632121_506.returns.push(null);
// 24118
f81632121_506.returns.push(null);
// 24124
f81632121_506.returns.push(null);
// 24130
f81632121_506.returns.push(null);
// 24136
f81632121_506.returns.push(null);
// 24142
f81632121_506.returns.push(null);
// 24148
f81632121_506.returns.push(null);
// 24154
f81632121_506.returns.push(null);
// 24160
f81632121_506.returns.push(null);
// 24165
o24.relatedTarget = o182;
// 24167
o182.nodeType = 1;
// 24168
o182.getAttribute = f81632121_506;
// 24170
f81632121_506.returns.push(null);
// 24173
o184.nodeType = 1;
// 24174
o184.getAttribute = f81632121_506;
// undefined
o184 = null;
// 24176
f81632121_506.returns.push(null);
// 24182
f81632121_506.returns.push(null);
// 24188
f81632121_506.returns.push(null);
// 24194
f81632121_506.returns.push(null);
// 24200
f81632121_506.returns.push(null);
// 24206
f81632121_506.returns.push(null);
// 24212
f81632121_506.returns.push(null);
// 24218
f81632121_506.returns.push(null);
// 24224
f81632121_506.returns.push(null);
// 24230
f81632121_506.returns.push(null);
// 24236
f81632121_506.returns.push(null);
// 24242
f81632121_506.returns.push(null);
// 24248
f81632121_506.returns.push(null);
// 24254
f81632121_506.returns.push(null);
// 24260
f81632121_506.returns.push(null);
// 24266
f81632121_506.returns.push(null);
// 24271
o24.cancelBubble = false;
// 24272
o24.returnValue = true;
// undefined
o24 = null;
// 24273
o24 = {};
// 24276
o24.cancelBubble = false;
// 24279
f81632121_467.returns.push(1374851250660);
// 24282
f81632121_1007.returns.push(undefined);
// 24284
o24.returnValue = true;
// 24287
o24.srcElement = o182;
// 24289
o24.target = o182;
// 24296
f81632121_506.returns.push(null);
// 24302
f81632121_506.returns.push(null);
// 24308
f81632121_506.returns.push(null);
// 24314
f81632121_506.returns.push(null);
// 24320
f81632121_506.returns.push(null);
// 24326
f81632121_506.returns.push(null);
// 24332
f81632121_506.returns.push(null);
// 24338
f81632121_506.returns.push(null);
// 24344
f81632121_506.returns.push(null);
// 24350
f81632121_506.returns.push(null);
// 24356
f81632121_506.returns.push(null);
// 24362
f81632121_506.returns.push(null);
// 24368
f81632121_506.returns.push(null);
// 24374
f81632121_506.returns.push(null);
// 24380
f81632121_506.returns.push(null);
// 24386
f81632121_506.returns.push(null);
// 24392
f81632121_506.returns.push(null);
// 24397
o24.relatedTarget = o33;
// undefined
o24 = null;
// undefined
o33 = null;
// 24400
o24 = {};
// 24404
f81632121_467.returns.push(1374851250670);
// 24405
o24.cancelBubble = false;
// 24406
o24.returnValue = true;
// 24409
o24.srcElement = o182;
// 24411
o24.target = o182;
// 24418
f81632121_506.returns.push(null);
// 24424
f81632121_506.returns.push(null);
// 24430
f81632121_506.returns.push(null);
// 24436
f81632121_506.returns.push(null);
// 24442
f81632121_506.returns.push(null);
// 24448
f81632121_506.returns.push(null);
// 24454
f81632121_506.returns.push(null);
// 24460
f81632121_506.returns.push(null);
// 24466
f81632121_506.returns.push(null);
// 24472
f81632121_506.returns.push(null);
// 24478
f81632121_506.returns.push(null);
// 24484
f81632121_506.returns.push(null);
// 24490
f81632121_506.returns.push(null);
// 24496
f81632121_506.returns.push(null);
// 24502
f81632121_506.returns.push(null);
// 24508
f81632121_506.returns.push(null);
// 24514
f81632121_506.returns.push(null);
// 24519
o24.JSBNG__screenX = 838;
// 24520
o24.JSBNG__screenY = 524;
// 24521
o24.altKey = false;
// 24522
o24.bubbles = true;
// 24523
o24.button = 0;
// 24524
o24.buttons = void 0;
// 24525
o24.cancelable = false;
// 24526
o24.clientX = 770;
// 24527
o24.clientY = 359;
// 24528
o24.ctrlKey = false;
// 24529
o24.currentTarget = o0;
// 24530
o24.defaultPrevented = false;
// 24531
o24.detail = 0;
// 24532
o24.eventPhase = 3;
// 24533
o24.isTrusted = void 0;
// 24534
o24.metaKey = false;
// 24535
o24.pageX = 770;
// 24536
o24.pageY = 359;
// 24537
o24.relatedTarget = null;
// 24538
o24.fromElement = null;
// 24541
o24.shiftKey = false;
// 24544
o24.timeStamp = 1374851250669;
// 24545
o24.type = "mousemove";
// 24546
o24.view = ow81632121;
// undefined
o24 = null;
// 24555
f81632121_1852.returns.push(undefined);
// 24558
f81632121_14.returns.push(undefined);
// 24559
f81632121_12.returns.push(103);
// 24562
o24 = {};
// 24566
f81632121_467.returns.push(1374851250682);
// 24567
o24.cancelBubble = false;
// 24568
o24.returnValue = true;
// 24571
o24.srcElement = o182;
// 24573
o24.target = o182;
// 24580
f81632121_506.returns.push(null);
// 24586
f81632121_506.returns.push(null);
// 24592
f81632121_506.returns.push(null);
// 24598
f81632121_506.returns.push(null);
// 24604
f81632121_506.returns.push(null);
// 24610
f81632121_506.returns.push(null);
// 24616
f81632121_506.returns.push(null);
// 24622
f81632121_506.returns.push(null);
// 24628
f81632121_506.returns.push(null);
// 24634
f81632121_506.returns.push(null);
// 24640
f81632121_506.returns.push(null);
// 24646
f81632121_506.returns.push(null);
// 24652
f81632121_506.returns.push(null);
// 24658
f81632121_506.returns.push(null);
// 24664
f81632121_506.returns.push(null);
// 24670
f81632121_506.returns.push(null);
// 24676
f81632121_506.returns.push(null);
// 24681
o24.JSBNG__screenX = 833;
// 24682
o24.JSBNG__screenY = 532;
// 24683
o24.altKey = false;
// 24684
o24.bubbles = true;
// 24685
o24.button = 0;
// 24686
o24.buttons = void 0;
// 24687
o24.cancelable = false;
// 24688
o24.clientX = 765;
// 24689
o24.clientY = 367;
// 24690
o24.ctrlKey = false;
// 24691
o24.currentTarget = o0;
// 24692
o24.defaultPrevented = false;
// 24693
o24.detail = 0;
// 24694
o24.eventPhase = 3;
// 24695
o24.isTrusted = void 0;
// 24696
o24.metaKey = false;
// 24697
o24.pageX = 765;
// 24698
o24.pageY = 367;
// 24699
o24.relatedTarget = null;
// 24700
o24.fromElement = null;
// 24703
o24.shiftKey = false;
// 24706
o24.timeStamp = 1374851250682;
// 24707
o24.type = "mousemove";
// 24708
o24.view = ow81632121;
// undefined
o24 = null;
// 24717
f81632121_1852.returns.push(undefined);
// 24720
f81632121_14.returns.push(undefined);
// 24721
f81632121_12.returns.push(104);
// 24724
o24 = {};
// 24728
f81632121_467.returns.push(1374851250694);
// 24729
o24.cancelBubble = false;
// 24730
o24.returnValue = true;
// 24733
o24.srcElement = o182;
// 24735
o24.target = o182;
// 24742
f81632121_506.returns.push(null);
// 24748
f81632121_506.returns.push(null);
// 24754
f81632121_506.returns.push(null);
// 24760
f81632121_506.returns.push(null);
// 24766
f81632121_506.returns.push(null);
// 24772
f81632121_506.returns.push(null);
// 24778
f81632121_506.returns.push(null);
// 24784
f81632121_506.returns.push(null);
// 24790
f81632121_506.returns.push(null);
// 24796
f81632121_506.returns.push(null);
// 24802
f81632121_506.returns.push(null);
// 24808
f81632121_506.returns.push(null);
// 24814
f81632121_506.returns.push(null);
// 24820
f81632121_506.returns.push(null);
// 24826
f81632121_506.returns.push(null);
// 24832
f81632121_506.returns.push(null);
// 24838
f81632121_506.returns.push(null);
// 24843
o24.JSBNG__screenX = 832;
// 24844
o24.JSBNG__screenY = 533;
// 24845
o24.altKey = false;
// 24846
o24.bubbles = true;
// 24847
o24.button = 0;
// 24848
o24.buttons = void 0;
// 24849
o24.cancelable = false;
// 24850
o24.clientX = 764;
// 24851
o24.clientY = 368;
// 24852
o24.ctrlKey = false;
// 24853
o24.currentTarget = o0;
// 24854
o24.defaultPrevented = false;
// 24855
o24.detail = 0;
// 24856
o24.eventPhase = 3;
// 24857
o24.isTrusted = void 0;
// 24858
o24.metaKey = false;
// 24859
o24.pageX = 764;
// 24860
o24.pageY = 368;
// 24861
o24.relatedTarget = null;
// 24862
o24.fromElement = null;
// 24865
o24.shiftKey = false;
// 24868
o24.timeStamp = 1374851250694;
// 24869
o24.type = "mousemove";
// 24870
o24.view = ow81632121;
// undefined
o24 = null;
// 24879
f81632121_1852.returns.push(undefined);
// 24882
f81632121_14.returns.push(undefined);
// 24883
f81632121_12.returns.push(105);
// 24886
o24 = {};
// 24890
f81632121_467.returns.push(1374851250700);
// 24891
o24.cancelBubble = false;
// 24892
o24.returnValue = true;
// 24895
o24.srcElement = o182;
// 24897
o24.target = o182;
// 24904
f81632121_506.returns.push(null);
// 24910
f81632121_506.returns.push(null);
// 24916
f81632121_506.returns.push(null);
// 24922
f81632121_506.returns.push(null);
// 24928
f81632121_506.returns.push(null);
// 24934
f81632121_506.returns.push(null);
// 24940
f81632121_506.returns.push(null);
// 24946
f81632121_506.returns.push(null);
// 24952
f81632121_506.returns.push(null);
// 24958
f81632121_506.returns.push(null);
// 24964
f81632121_506.returns.push(null);
// 24970
f81632121_506.returns.push(null);
// 24976
f81632121_506.returns.push(null);
// 24982
f81632121_506.returns.push(null);
// 24988
f81632121_506.returns.push(null);
// 24994
f81632121_506.returns.push(null);
// 25000
f81632121_506.returns.push(null);
// 25005
o24.JSBNG__screenX = 832;
// 25006
o24.JSBNG__screenY = 534;
// 25007
o24.altKey = false;
// 25008
o24.bubbles = true;
// 25009
o24.button = 0;
// 25010
o24.buttons = void 0;
// 25011
o24.cancelable = false;
// 25012
o24.clientX = 764;
// 25013
o24.clientY = 369;
// 25014
o24.ctrlKey = false;
// 25015
o24.currentTarget = o0;
// 25016
o24.defaultPrevented = false;
// 25017
o24.detail = 0;
// 25018
o24.eventPhase = 3;
// 25019
o24.isTrusted = void 0;
// 25020
o24.metaKey = false;
// 25021
o24.pageX = 764;
// 25022
o24.pageY = 369;
// 25023
o24.relatedTarget = null;
// 25024
o24.fromElement = null;
// 25027
o24.shiftKey = false;
// 25030
o24.timeStamp = 1374851250700;
// 25031
o24.type = "mousemove";
// 25032
o24.view = ow81632121;
// undefined
o24 = null;
// 25041
f81632121_1852.returns.push(undefined);
// 25044
f81632121_14.returns.push(undefined);
// 25045
f81632121_12.returns.push(106);
// 25048
o24 = {};
// 25052
f81632121_467.returns.push(1374851250714);
// 25053
o24.cancelBubble = false;
// 25054
o24.returnValue = true;
// 25057
o24.srcElement = o182;
// 25059
o24.target = o182;
// 25066
f81632121_506.returns.push(null);
// 25072
f81632121_506.returns.push(null);
// 25078
f81632121_506.returns.push(null);
// 25084
f81632121_506.returns.push(null);
// 25090
f81632121_506.returns.push(null);
// 25096
f81632121_506.returns.push(null);
// 25102
f81632121_506.returns.push(null);
// 25108
f81632121_506.returns.push(null);
// 25114
f81632121_506.returns.push(null);
// 25120
f81632121_506.returns.push(null);
// 25126
f81632121_506.returns.push(null);
// 25132
f81632121_506.returns.push(null);
// 25138
f81632121_506.returns.push(null);
// 25144
f81632121_506.returns.push(null);
// 25150
f81632121_506.returns.push(null);
// 25156
f81632121_506.returns.push(null);
// 25162
f81632121_506.returns.push(null);
// 25167
o24.JSBNG__screenX = 830;
// 25168
o24.JSBNG__screenY = 538;
// 25169
o24.altKey = false;
// 25170
o24.bubbles = true;
// 25171
o24.button = 0;
// 25172
o24.buttons = void 0;
// 25173
o24.cancelable = false;
// 25174
o24.clientX = 762;
// 25175
o24.clientY = 373;
// 25176
o24.ctrlKey = false;
// 25177
o24.currentTarget = o0;
// 25178
o24.defaultPrevented = false;
// 25179
o24.detail = 0;
// 25180
o24.eventPhase = 3;
// 25181
o24.isTrusted = void 0;
// 25182
o24.metaKey = false;
// 25183
o24.pageX = 762;
// 25184
o24.pageY = 373;
// 25185
o24.relatedTarget = null;
// 25186
o24.fromElement = null;
// 25189
o24.shiftKey = false;
// 25192
o24.timeStamp = 1374851250714;
// 25193
o24.type = "mousemove";
// 25194
o24.view = ow81632121;
// undefined
o24 = null;
// 25203
f81632121_1852.returns.push(undefined);
// 25206
f81632121_14.returns.push(undefined);
// 25207
f81632121_12.returns.push(107);
// 25210
o24 = {};
// 25214
f81632121_467.returns.push(1374851250720);
// 25215
o24.cancelBubble = false;
// 25216
o24.returnValue = true;
// 25219
o24.srcElement = o182;
// 25221
o24.target = o182;
// 25228
f81632121_506.returns.push(null);
// 25234
f81632121_506.returns.push(null);
// 25240
f81632121_506.returns.push(null);
// 25246
f81632121_506.returns.push(null);
// 25252
f81632121_506.returns.push(null);
// 25258
f81632121_506.returns.push(null);
// 25264
f81632121_506.returns.push(null);
// 25270
f81632121_506.returns.push(null);
// 25276
f81632121_506.returns.push(null);
// 25282
f81632121_506.returns.push(null);
// 25288
f81632121_506.returns.push(null);
// 25294
f81632121_506.returns.push(null);
// 25300
f81632121_506.returns.push(null);
// 25306
f81632121_506.returns.push(null);
// 25312
f81632121_506.returns.push(null);
// 25318
f81632121_506.returns.push(null);
// 25324
f81632121_506.returns.push(null);
// 25329
o24.JSBNG__screenX = 830;
// 25330
o24.JSBNG__screenY = 539;
// 25331
o24.altKey = false;
// 25332
o24.bubbles = true;
// 25333
o24.button = 0;
// 25334
o24.buttons = void 0;
// 25335
o24.cancelable = false;
// 25336
o24.clientX = 762;
// 25337
o24.clientY = 374;
// 25338
o24.ctrlKey = false;
// 25339
o24.currentTarget = o0;
// 25340
o24.defaultPrevented = false;
// 25341
o24.detail = 0;
// 25342
o24.eventPhase = 3;
// 25343
o24.isTrusted = void 0;
// 25344
o24.metaKey = false;
// 25345
o24.pageX = 762;
// 25346
o24.pageY = 374;
// 25347
o24.relatedTarget = null;
// 25348
o24.fromElement = null;
// 25351
o24.shiftKey = false;
// 25354
o24.timeStamp = 1374851250720;
// 25355
o24.type = "mousemove";
// 25356
o24.view = ow81632121;
// undefined
o24 = null;
// 25365
f81632121_1852.returns.push(undefined);
// 25368
f81632121_14.returns.push(undefined);
// 25369
f81632121_12.returns.push(108);
// 25372
o24 = {};
// 25376
f81632121_467.returns.push(1374851250731);
// 25377
o24.cancelBubble = false;
// 25378
o24.returnValue = true;
// 25381
o24.srcElement = o182;
// 25383
o24.target = o182;
// 25390
f81632121_506.returns.push(null);
// 25396
f81632121_506.returns.push(null);
// 25402
f81632121_506.returns.push(null);
// 25408
f81632121_506.returns.push(null);
// 25414
f81632121_506.returns.push(null);
// 25420
f81632121_506.returns.push(null);
// 25426
f81632121_506.returns.push(null);
// 25432
f81632121_506.returns.push(null);
// 25438
f81632121_506.returns.push(null);
// 25444
f81632121_506.returns.push(null);
// 25450
f81632121_506.returns.push(null);
// 25456
f81632121_506.returns.push(null);
// 25462
f81632121_506.returns.push(null);
// 25468
f81632121_506.returns.push(null);
// 25474
f81632121_506.returns.push(null);
// 25480
f81632121_506.returns.push(null);
// 25486
f81632121_506.returns.push(null);
// 25491
o24.JSBNG__screenX = 829;
// 25492
o24.JSBNG__screenY = 540;
// 25493
o24.altKey = false;
// 25494
o24.bubbles = true;
// 25495
o24.button = 0;
// 25496
o24.buttons = void 0;
// 25497
o24.cancelable = false;
// 25498
o24.clientX = 761;
// 25499
o24.clientY = 375;
// 25500
o24.ctrlKey = false;
// 25501
o24.currentTarget = o0;
// 25502
o24.defaultPrevented = false;
// 25503
o24.detail = 0;
// 25504
o24.eventPhase = 3;
// 25505
o24.isTrusted = void 0;
// 25506
o24.metaKey = false;
// 25507
o24.pageX = 761;
// 25508
o24.pageY = 375;
// 25509
o24.relatedTarget = null;
// 25510
o24.fromElement = null;
// 25513
o24.shiftKey = false;
// 25516
o24.timeStamp = 1374851250731;
// 25517
o24.type = "mousemove";
// 25518
o24.view = ow81632121;
// undefined
o24 = null;
// 25527
f81632121_1852.returns.push(undefined);
// 25530
f81632121_14.returns.push(undefined);
// 25531
f81632121_12.returns.push(109);
// 25534
o24 = {};
// 25538
f81632121_467.returns.push(1374851250744);
// 25539
o24.cancelBubble = false;
// 25540
o24.returnValue = true;
// 25543
o24.srcElement = o182;
// 25545
o24.target = o182;
// 25552
f81632121_506.returns.push(null);
// 25558
f81632121_506.returns.push(null);
// 25564
f81632121_506.returns.push(null);
// 25570
f81632121_506.returns.push(null);
// 25576
f81632121_506.returns.push(null);
// 25582
f81632121_506.returns.push(null);
// 25588
f81632121_506.returns.push(null);
// 25594
f81632121_506.returns.push(null);
// 25600
f81632121_506.returns.push(null);
// 25606
f81632121_506.returns.push(null);
// 25612
f81632121_506.returns.push(null);
// 25618
f81632121_506.returns.push(null);
// 25624
f81632121_506.returns.push(null);
// 25630
f81632121_506.returns.push(null);
// 25636
f81632121_506.returns.push(null);
// 25642
f81632121_506.returns.push(null);
// 25648
f81632121_506.returns.push(null);
// 25653
o24.JSBNG__screenX = 829;
// 25654
o24.JSBNG__screenY = 541;
// 25655
o24.altKey = false;
// 25656
o24.bubbles = true;
// 25657
o24.button = 0;
// 25658
o24.buttons = void 0;
// 25659
o24.cancelable = false;
// 25660
o24.clientX = 761;
// 25661
o24.clientY = 376;
// 25662
o24.ctrlKey = false;
// 25663
o24.currentTarget = o0;
// 25664
o24.defaultPrevented = false;
// 25665
o24.detail = 0;
// 25666
o24.eventPhase = 3;
// 25667
o24.isTrusted = void 0;
// 25668
o24.metaKey = false;
// 25669
o24.pageX = 761;
// 25670
o24.pageY = 376;
// 25671
o24.relatedTarget = null;
// 25672
o24.fromElement = null;
// 25675
o24.shiftKey = false;
// 25678
o24.timeStamp = 1374851250740;
// 25679
o24.type = "mousemove";
// 25680
o24.view = ow81632121;
// undefined
o24 = null;
// 25689
f81632121_1852.returns.push(undefined);
// 25692
f81632121_14.returns.push(undefined);
// 25693
f81632121_12.returns.push(110);
// 25696
o24 = {};
// 25700
f81632121_467.returns.push(1374851250752);
// 25701
o24.cancelBubble = false;
// 25702
o24.returnValue = true;
// 25705
o24.srcElement = o182;
// 25707
o24.target = o182;
// 25714
f81632121_506.returns.push(null);
// 25720
f81632121_506.returns.push(null);
// 25726
f81632121_506.returns.push(null);
// 25732
f81632121_506.returns.push(null);
// 25738
f81632121_506.returns.push(null);
// 25744
f81632121_506.returns.push(null);
// 25750
f81632121_506.returns.push(null);
// 25756
f81632121_506.returns.push(null);
// 25762
f81632121_506.returns.push(null);
// 25768
f81632121_506.returns.push(null);
// 25774
f81632121_506.returns.push(null);
// 25780
f81632121_506.returns.push(null);
// 25786
f81632121_506.returns.push(null);
// 25792
f81632121_506.returns.push(null);
// 25798
f81632121_506.returns.push(null);
// 25804
f81632121_506.returns.push(null);
// 25810
f81632121_506.returns.push(null);
// 25815
o24.JSBNG__screenX = 829;
// 25816
o24.JSBNG__screenY = 543;
// 25817
o24.altKey = false;
// 25818
o24.bubbles = true;
// 25819
o24.button = 0;
// 25820
o24.buttons = void 0;
// 25821
o24.cancelable = false;
// 25822
o24.clientX = 761;
// 25823
o24.clientY = 378;
// 25824
o24.ctrlKey = false;
// 25825
o24.currentTarget = o0;
// 25826
o24.defaultPrevented = false;
// 25827
o24.detail = 0;
// 25828
o24.eventPhase = 3;
// 25829
o24.isTrusted = void 0;
// 25830
o24.metaKey = false;
// 25831
o24.pageX = 761;
// 25832
o24.pageY = 378;
// 25833
o24.relatedTarget = null;
// 25834
o24.fromElement = null;
// 25837
o24.shiftKey = false;
// 25840
o24.timeStamp = 1374851250752;
// 25841
o24.type = "mousemove";
// 25842
o24.view = ow81632121;
// undefined
o24 = null;
// 25851
f81632121_1852.returns.push(undefined);
// 25854
f81632121_14.returns.push(undefined);
// 25855
f81632121_12.returns.push(111);
// 25858
o24 = {};
// 25862
f81632121_467.returns.push(1374851250761);
// 25863
o24.cancelBubble = false;
// 25864
o24.returnValue = true;
// 25867
o24.srcElement = o182;
// 25869
o24.target = o182;
// 25876
f81632121_506.returns.push(null);
// 25882
f81632121_506.returns.push(null);
// 25888
f81632121_506.returns.push(null);
// 25894
f81632121_506.returns.push(null);
// 25900
f81632121_506.returns.push(null);
// 25906
f81632121_506.returns.push(null);
// 25912
f81632121_506.returns.push(null);
// 25918
f81632121_506.returns.push(null);
// 25924
f81632121_506.returns.push(null);
// 25930
f81632121_506.returns.push(null);
// 25936
f81632121_506.returns.push(null);
// 25942
f81632121_506.returns.push(null);
// 25948
f81632121_506.returns.push(null);
// 25954
f81632121_506.returns.push(null);
// 25960
f81632121_506.returns.push(null);
// 25966
f81632121_506.returns.push(null);
// 25972
f81632121_506.returns.push(null);
// 25977
o24.JSBNG__screenX = 828;
// 25978
o24.JSBNG__screenY = 544;
// 25979
o24.altKey = false;
// 25980
o24.bubbles = true;
// 25981
o24.button = 0;
// 25982
o24.buttons = void 0;
// 25983
o24.cancelable = false;
// 25984
o24.clientX = 760;
// 25985
o24.clientY = 379;
// 25986
o24.ctrlKey = false;
// 25987
o24.currentTarget = o0;
// 25988
o24.defaultPrevented = false;
// 25989
o24.detail = 0;
// 25990
o24.eventPhase = 3;
// 25991
o24.isTrusted = void 0;
// 25992
o24.metaKey = false;
// 25993
o24.pageX = 760;
// 25994
o24.pageY = 379;
// 25995
o24.relatedTarget = null;
// 25996
o24.fromElement = null;
// 25999
o24.shiftKey = false;
// 26002
o24.timeStamp = 1374851250761;
// 26003
o24.type = "mousemove";
// 26004
o24.view = ow81632121;
// undefined
o24 = null;
// 26013
f81632121_1852.returns.push(undefined);
// 26016
f81632121_14.returns.push(undefined);
// 26017
f81632121_12.returns.push(112);
// 26020
o24 = {};
// 26024
f81632121_467.returns.push(1374851250771);
// 26025
o24.cancelBubble = false;
// 26026
o24.returnValue = true;
// 26029
o24.srcElement = o182;
// 26031
o24.target = o182;
// 26038
f81632121_506.returns.push(null);
// 26044
f81632121_506.returns.push(null);
// 26050
f81632121_506.returns.push(null);
// 26056
f81632121_506.returns.push(null);
// 26062
f81632121_506.returns.push(null);
// 26068
f81632121_506.returns.push(null);
// 26074
f81632121_506.returns.push(null);
// 26080
f81632121_506.returns.push(null);
// 26086
f81632121_506.returns.push(null);
// 26092
f81632121_506.returns.push(null);
// 26098
f81632121_506.returns.push(null);
// 26104
f81632121_506.returns.push(null);
// 26110
f81632121_506.returns.push(null);
// 26116
f81632121_506.returns.push(null);
// 26122
f81632121_506.returns.push(null);
// 26128
f81632121_506.returns.push(null);
// 26134
f81632121_506.returns.push(null);
// 26139
o24.JSBNG__screenX = 828;
// 26140
o24.JSBNG__screenY = 545;
// 26141
o24.altKey = false;
// 26142
o24.bubbles = true;
// 26143
o24.button = 0;
// 26144
o24.buttons = void 0;
// 26145
o24.cancelable = false;
// 26146
o24.clientX = 760;
// 26147
o24.clientY = 380;
// 26148
o24.ctrlKey = false;
// 26149
o24.currentTarget = o0;
// 26150
o24.defaultPrevented = false;
// 26151
o24.detail = 0;
// 26152
o24.eventPhase = 3;
// 26153
o24.isTrusted = void 0;
// 26154
o24.metaKey = false;
// 26155
o24.pageX = 760;
// 26156
o24.pageY = 380;
// 26157
o24.relatedTarget = null;
// 26158
o24.fromElement = null;
// 26161
o24.shiftKey = false;
// 26164
o24.timeStamp = 1374851250771;
// 26165
o24.type = "mousemove";
// 26166
o24.view = ow81632121;
// undefined
o24 = null;
// 26175
f81632121_1852.returns.push(undefined);
// 26178
f81632121_14.returns.push(undefined);
// 26179
f81632121_12.returns.push(113);
// 26182
o24 = {};
// 26186
f81632121_467.returns.push(1374851250780);
// 26187
o24.cancelBubble = false;
// 26188
o24.returnValue = true;
// 26191
o24.srcElement = o182;
// 26193
o24.target = o182;
// 26200
f81632121_506.returns.push(null);
// 26206
f81632121_506.returns.push(null);
// 26212
f81632121_506.returns.push(null);
// 26218
f81632121_506.returns.push(null);
// 26224
f81632121_506.returns.push(null);
// 26230
f81632121_506.returns.push(null);
// 26236
f81632121_506.returns.push(null);
// 26242
f81632121_506.returns.push(null);
// 26248
f81632121_506.returns.push(null);
// 26254
f81632121_506.returns.push(null);
// 26260
f81632121_506.returns.push(null);
// 26266
f81632121_506.returns.push(null);
// 26272
f81632121_506.returns.push(null);
// 26278
f81632121_506.returns.push(null);
// 26284
f81632121_506.returns.push(null);
// 26290
f81632121_506.returns.push(null);
// 26296
f81632121_506.returns.push(null);
// 26301
o24.JSBNG__screenX = 827;
// 26302
o24.JSBNG__screenY = 547;
// 26303
o24.altKey = false;
// 26304
o24.bubbles = true;
// 26305
o24.button = 0;
// 26306
o24.buttons = void 0;
// 26307
o24.cancelable = false;
// 26308
o24.clientX = 759;
// 26309
o24.clientY = 382;
// 26310
o24.ctrlKey = false;
// 26311
o24.currentTarget = o0;
// 26312
o24.defaultPrevented = false;
// 26313
o24.detail = 0;
// 26314
o24.eventPhase = 3;
// 26315
o24.isTrusted = void 0;
// 26316
o24.metaKey = false;
// 26317
o24.pageX = 759;
// 26318
o24.pageY = 382;
// 26319
o24.relatedTarget = null;
// 26320
o24.fromElement = null;
// 26323
o24.shiftKey = false;
// 26326
o24.timeStamp = 1374851250780;
// 26327
o24.type = "mousemove";
// 26328
o24.view = ow81632121;
// undefined
o24 = null;
// 26337
f81632121_1852.returns.push(undefined);
// 26340
f81632121_14.returns.push(undefined);
// 26341
f81632121_12.returns.push(114);
// 26344
o24 = {};
// 26348
f81632121_467.returns.push(1374851250787);
// 26349
o24.cancelBubble = false;
// 26350
o24.returnValue = true;
// 26353
o24.srcElement = o182;
// 26355
o24.target = o182;
// 26362
f81632121_506.returns.push(null);
// 26368
f81632121_506.returns.push(null);
// 26374
f81632121_506.returns.push(null);
// 26380
f81632121_506.returns.push(null);
// 26386
f81632121_506.returns.push(null);
// 26392
f81632121_506.returns.push(null);
// 26398
f81632121_506.returns.push(null);
// 26404
f81632121_506.returns.push(null);
// 26410
f81632121_506.returns.push(null);
// 26416
f81632121_506.returns.push(null);
// 26422
f81632121_506.returns.push(null);
// 26428
f81632121_506.returns.push(null);
// 26434
f81632121_506.returns.push(null);
// 26440
f81632121_506.returns.push(null);
// 26446
f81632121_506.returns.push(null);
// 26452
f81632121_506.returns.push(null);
// 26458
f81632121_506.returns.push(null);
// 26463
o24.JSBNG__screenX = 827;
// 26464
o24.JSBNG__screenY = 550;
// 26465
o24.altKey = false;
// 26466
o24.bubbles = true;
// 26467
o24.button = 0;
// 26468
o24.buttons = void 0;
// 26469
o24.cancelable = false;
// 26470
o24.clientX = 759;
// 26471
o24.clientY = 385;
// 26472
o24.ctrlKey = false;
// 26473
o24.currentTarget = o0;
// 26474
o24.defaultPrevented = false;
// 26475
o24.detail = 0;
// 26476
o24.eventPhase = 3;
// 26477
o24.isTrusted = void 0;
// 26478
o24.metaKey = false;
// 26479
o24.pageX = 759;
// 26480
o24.pageY = 385;
// 26481
o24.relatedTarget = null;
// 26482
o24.fromElement = null;
// 26485
o24.shiftKey = false;
// 26488
o24.timeStamp = 1374851250787;
// 26489
o24.type = "mousemove";
// 26490
o24.view = ow81632121;
// undefined
o24 = null;
// 26499
f81632121_1852.returns.push(undefined);
// 26502
f81632121_14.returns.push(undefined);
// 26503
f81632121_12.returns.push(115);
// 26506
o24 = {};
// 26510
f81632121_467.returns.push(1374851250804);
// 26511
o24.cancelBubble = false;
// 26512
o24.returnValue = true;
// 26515
o24.srcElement = o182;
// 26517
o24.target = o182;
// 26524
f81632121_506.returns.push(null);
// 26530
f81632121_506.returns.push(null);
// 26536
f81632121_506.returns.push(null);
// 26542
f81632121_506.returns.push(null);
// 26548
f81632121_506.returns.push(null);
// 26554
f81632121_506.returns.push(null);
// 26560
f81632121_506.returns.push(null);
// 26566
f81632121_506.returns.push(null);
// 26572
f81632121_506.returns.push(null);
// 26578
f81632121_506.returns.push(null);
// 26584
f81632121_506.returns.push(null);
// 26590
f81632121_506.returns.push(null);
// 26596
f81632121_506.returns.push(null);
// 26602
f81632121_506.returns.push(null);
// 26608
f81632121_506.returns.push(null);
// 26614
f81632121_506.returns.push(null);
// 26620
f81632121_506.returns.push(null);
// 26625
o24.JSBNG__screenX = 825;
// 26626
o24.JSBNG__screenY = 557;
// 26627
o24.altKey = false;
// 26628
o24.bubbles = true;
// 26629
o24.button = 0;
// 26630
o24.buttons = void 0;
// 26631
o24.cancelable = false;
// 26632
o24.clientX = 757;
// 26633
o24.clientY = 392;
// 26634
o24.ctrlKey = false;
// 26635
o24.currentTarget = o0;
// 26636
o24.defaultPrevented = false;
// 26637
o24.detail = 0;
// 26638
o24.eventPhase = 3;
// 26639
o24.isTrusted = void 0;
// 26640
o24.metaKey = false;
// 26641
o24.pageX = 757;
// 26642
o24.pageY = 392;
// 26643
o24.relatedTarget = null;
// 26644
o24.fromElement = null;
// 26647
o24.shiftKey = false;
// 26650
o24.timeStamp = 1374851250804;
// 26651
o24.type = "mousemove";
// 26652
o24.view = ow81632121;
// undefined
o24 = null;
// 26661
f81632121_1852.returns.push(undefined);
// 26664
f81632121_14.returns.push(undefined);
// 26665
f81632121_12.returns.push(116);
// 26668
o24 = {};
// 26672
f81632121_467.returns.push(1374851250810);
// 26673
o24.cancelBubble = false;
// 26674
o24.returnValue = true;
// 26677
o24.srcElement = o182;
// 26679
o24.target = o182;
// 26686
f81632121_506.returns.push(null);
// 26692
f81632121_506.returns.push(null);
// 26698
f81632121_506.returns.push(null);
// 26704
f81632121_506.returns.push(null);
// 26710
f81632121_506.returns.push(null);
// 26716
f81632121_506.returns.push(null);
// 26722
f81632121_506.returns.push(null);
// 26728
f81632121_506.returns.push(null);
// 26734
f81632121_506.returns.push(null);
// 26740
f81632121_506.returns.push(null);
// 26746
f81632121_506.returns.push(null);
// 26752
f81632121_506.returns.push(null);
// 26758
f81632121_506.returns.push(null);
// 26764
f81632121_506.returns.push(null);
// 26770
f81632121_506.returns.push(null);
// 26776
f81632121_506.returns.push(null);
// 26782
f81632121_506.returns.push(null);
// 26787
o24.JSBNG__screenX = 824;
// 26788
o24.JSBNG__screenY = 563;
// 26789
o24.altKey = false;
// 26790
o24.bubbles = true;
// 26791
o24.button = 0;
// 26792
o24.buttons = void 0;
// 26793
o24.cancelable = false;
// 26794
o24.clientX = 756;
// 26795
o24.clientY = 398;
// 26796
o24.ctrlKey = false;
// 26797
o24.currentTarget = o0;
// 26798
o24.defaultPrevented = false;
// 26799
o24.detail = 0;
// 26800
o24.eventPhase = 3;
// 26801
o24.isTrusted = void 0;
// 26802
o24.metaKey = false;
// 26803
o24.pageX = 756;
// 26804
o24.pageY = 398;
// 26805
o24.relatedTarget = null;
// 26806
o24.fromElement = null;
// 26809
o24.shiftKey = false;
// 26812
o24.timeStamp = 1374851250810;
// 26813
o24.type = "mousemove";
// 26814
o24.view = ow81632121;
// undefined
o24 = null;
// 26823
f81632121_1852.returns.push(undefined);
// 26826
f81632121_14.returns.push(undefined);
// 26827
f81632121_12.returns.push(117);
// 26830
o24 = {};
// 26833
o24.srcElement = o182;
// 26835
o24.target = o182;
// 26842
f81632121_506.returns.push(null);
// 26848
f81632121_506.returns.push(null);
// 26854
f81632121_506.returns.push(null);
// 26860
f81632121_506.returns.push(null);
// 26866
f81632121_506.returns.push(null);
// 26872
f81632121_506.returns.push(null);
// 26878
f81632121_506.returns.push(null);
// 26884
f81632121_506.returns.push(null);
// 26890
f81632121_506.returns.push(null);
// 26896
f81632121_506.returns.push(null);
// 26902
f81632121_506.returns.push(null);
// 26908
f81632121_506.returns.push(null);
// 26914
f81632121_506.returns.push(null);
// 26920
f81632121_506.returns.push(null);
// 26926
f81632121_506.returns.push(null);
// 26932
f81632121_506.returns.push(null);
// 26938
f81632121_506.returns.push(null);
// 26943
o24.relatedTarget = o185;
// 26948
f81632121_506.returns.push(null);
// 26954
f81632121_506.returns.push(null);
// 26960
f81632121_506.returns.push(null);
// 26966
f81632121_506.returns.push(null);
// 26972
f81632121_506.returns.push(null);
// 26978
f81632121_506.returns.push(null);
// 26984
f81632121_506.returns.push(null);
// 26990
f81632121_506.returns.push(null);
// 26996
f81632121_506.returns.push(null);
// 27002
f81632121_506.returns.push(null);
// 27008
f81632121_506.returns.push(null);
// 27014
f81632121_506.returns.push(null);
// 27019
o24.cancelBubble = false;
// 27020
o24.returnValue = true;
// undefined
o24 = null;
// 27021
o24 = {};
// 27024
o24.cancelBubble = false;
// 27027
f81632121_467.returns.push(1374851250831);
// 27030
f81632121_1007.returns.push(undefined);
// 27032
o24.returnValue = true;
// 27035
o24.srcElement = o185;
// 27037
o24.target = o185;
// 27044
f81632121_506.returns.push(null);
// 27050
f81632121_506.returns.push(null);
// 27056
f81632121_506.returns.push(null);
// 27062
f81632121_506.returns.push(null);
// 27068
f81632121_506.returns.push(null);
// 27074
f81632121_506.returns.push(null);
// 27080
f81632121_506.returns.push(null);
// 27086
f81632121_506.returns.push(null);
// 27092
f81632121_506.returns.push(null);
// 27098
f81632121_506.returns.push(null);
// 27104
f81632121_506.returns.push(null);
// 27110
f81632121_506.returns.push(null);
// 27115
o24.relatedTarget = o182;
// undefined
o24 = null;
// undefined
o182 = null;
// 27118
o24 = {};
// 27122
f81632121_467.returns.push(1374851250836);
// 27123
o24.cancelBubble = false;
// 27124
o24.returnValue = true;
// 27127
o24.srcElement = o185;
// 27129
o24.target = o185;
// 27136
f81632121_506.returns.push(null);
// 27142
f81632121_506.returns.push(null);
// 27148
f81632121_506.returns.push(null);
// 27154
f81632121_506.returns.push(null);
// 27160
f81632121_506.returns.push(null);
// 27166
f81632121_506.returns.push(null);
// 27172
f81632121_506.returns.push(null);
// 27178
f81632121_506.returns.push(null);
// 27184
f81632121_506.returns.push(null);
// 27190
f81632121_506.returns.push(null);
// 27196
f81632121_506.returns.push(null);
// 27202
f81632121_506.returns.push(null);
// 27207
o24.JSBNG__screenX = 824;
// 27208
o24.JSBNG__screenY = 566;
// 27209
o24.altKey = false;
// 27210
o24.bubbles = true;
// 27211
o24.button = 0;
// 27212
o24.buttons = void 0;
// 27213
o24.cancelable = false;
// 27214
o24.clientX = 756;
// 27215
o24.clientY = 401;
// 27216
o24.ctrlKey = false;
// 27217
o24.currentTarget = o0;
// 27218
o24.defaultPrevented = false;
// 27219
o24.detail = 0;
// 27220
o24.eventPhase = 3;
// 27221
o24.isTrusted = void 0;
// 27222
o24.metaKey = false;
// 27223
o24.pageX = 756;
// 27224
o24.pageY = 401;
// 27225
o24.relatedTarget = null;
// 27226
o24.fromElement = null;
// 27229
o24.shiftKey = false;
// 27232
o24.timeStamp = 1374851250836;
// 27233
o24.type = "mousemove";
// 27234
o24.view = ow81632121;
// undefined
o24 = null;
// 27243
f81632121_1852.returns.push(undefined);
// 27246
f81632121_14.returns.push(undefined);
// 27247
f81632121_12.returns.push(118);
// 27250
o24 = {};
// 27253
o24.srcElement = o185;
// 27255
o24.target = o185;
// 27262
f81632121_506.returns.push(null);
// 27268
f81632121_506.returns.push(null);
// 27274
f81632121_506.returns.push(null);
// 27280
f81632121_506.returns.push(null);
// 27286
f81632121_506.returns.push(null);
// 27292
f81632121_506.returns.push(null);
// 27298
f81632121_506.returns.push(null);
// 27304
f81632121_506.returns.push(null);
// 27310
f81632121_506.returns.push(null);
// 27316
f81632121_506.returns.push(null);
// 27322
f81632121_506.returns.push(null);
// 27328
f81632121_506.returns.push(null);
// 27333
o28 = {};
// 27334
o24.relatedTarget = o28;
// 27335
o28.parentNode = o26;
// 27336
o28.nodeType = 1;
// 27337
o28.getAttribute = f81632121_506;
// 27339
f81632121_506.returns.push(null);
// 27341
o26.parentNode = o185;
// 27342
o26.nodeType = 1;
// undefined
o26 = null;
// 27345
f81632121_506.returns.push(null);
// 27351
f81632121_506.returns.push(null);
// 27357
f81632121_506.returns.push(null);
// 27363
f81632121_506.returns.push(null);
// 27369
f81632121_506.returns.push(null);
// 27375
f81632121_506.returns.push(null);
// 27381
f81632121_506.returns.push(null);
// 27387
f81632121_506.returns.push(null);
// 27393
f81632121_506.returns.push(null);
// 27399
f81632121_506.returns.push(null);
// 27405
f81632121_506.returns.push(null);
// 27411
f81632121_506.returns.push(null);
// 27417
f81632121_506.returns.push(null);
// 27422
o24.cancelBubble = false;
// 27423
o24.returnValue = true;
// undefined
o24 = null;
// 27424
o24 = {};
// 27427
o24.cancelBubble = false;
// 27430
f81632121_467.returns.push(1374851250854);
// 27433
f81632121_1007.returns.push(undefined);
// 27435
o24.returnValue = true;
// 27438
o24.srcElement = o28;
// 27440
o24.target = o28;
// 27447
f81632121_506.returns.push(null);
// 27453
f81632121_506.returns.push(null);
// 27459
f81632121_506.returns.push(null);
// 27465
f81632121_506.returns.push(null);
// 27471
f81632121_506.returns.push(null);
// 27477
f81632121_506.returns.push(null);
// 27483
f81632121_506.returns.push(null);
// 27489
f81632121_506.returns.push(null);
// 27495
f81632121_506.returns.push(null);
// 27501
f81632121_506.returns.push(null);
// 27507
f81632121_506.returns.push(null);
// 27513
f81632121_506.returns.push(null);
// 27519
f81632121_506.returns.push(null);
// 27525
f81632121_506.returns.push(null);
// 27530
o24.relatedTarget = o185;
// undefined
o24 = null;
// undefined
o185 = null;
// 27533
o24 = {};
// 27537
f81632121_467.returns.push(1374851250863);
// 27538
o24.cancelBubble = false;
// 27539
o24.returnValue = true;
// 27542
o24.srcElement = o28;
// 27544
o24.target = o28;
// 27551
f81632121_506.returns.push(null);
// 27557
f81632121_506.returns.push(null);
// 27563
f81632121_506.returns.push(null);
// 27569
f81632121_506.returns.push(null);
// 27575
f81632121_506.returns.push(null);
// 27581
f81632121_506.returns.push(null);
// 27587
f81632121_506.returns.push(null);
// 27593
f81632121_506.returns.push(null);
// 27599
f81632121_506.returns.push(null);
// 27605
f81632121_506.returns.push(null);
// 27611
f81632121_506.returns.push(null);
// 27617
f81632121_506.returns.push(null);
// 27623
f81632121_506.returns.push(null);
// 27629
f81632121_506.returns.push(null);
// 27634
o24.JSBNG__screenX = 822;
// 27635
o24.JSBNG__screenY = 580;
// 27636
o24.altKey = false;
// 27637
o24.bubbles = true;
// 27638
o24.button = 0;
// 27639
o24.buttons = void 0;
// 27640
o24.cancelable = false;
// 27641
o24.clientX = 754;
// 27642
o24.clientY = 415;
// 27643
o24.ctrlKey = false;
// 27644
o24.currentTarget = o0;
// 27645
o24.defaultPrevented = false;
// 27646
o24.detail = 0;
// 27647
o24.eventPhase = 3;
// 27648
o24.isTrusted = void 0;
// 27649
o24.metaKey = false;
// 27650
o24.pageX = 754;
// 27651
o24.pageY = 415;
// 27652
o24.relatedTarget = null;
// 27653
o24.fromElement = null;
// 27656
o24.shiftKey = false;
// 27659
o24.timeStamp = 1374851250863;
// 27660
o24.type = "mousemove";
// 27661
o24.view = ow81632121;
// undefined
o24 = null;
// 27670
f81632121_1852.returns.push(undefined);
// 27673
f81632121_14.returns.push(undefined);
// 27674
f81632121_12.returns.push(119);
// 27684
f81632121_467.returns.push(1374851250872);
// 27686
f81632121_1007.returns.push(undefined);
// 27692
f81632121_467.returns.push(1374851250872);
// 27699
f81632121_1852.returns.push(undefined);
// 27701
f81632121_14.returns.push(undefined);
// 27702
f81632121_12.returns.push(120);
// 27703
f81632121_12.returns.push(121);
// 27705
o24 = {};
// 27709
f81632121_467.returns.push(1374851250882);
// 27710
o24.cancelBubble = false;
// 27711
o24.returnValue = true;
// 27714
o26 = {};
// 27715
o24.srcElement = o26;
// 27717
o24.target = o26;
// 27719
o26.nodeType = 1;
// 27720
o32 = {};
// 27721
o26.parentNode = o32;
// 27723
o26.getAttribute = f81632121_506;
// 27725
f81632121_506.returns.push(null);
// 27727
o33 = {};
// 27728
o32.parentNode = o33;
// 27729
o32.nodeType = 1;
// 27730
o32.getAttribute = f81632121_506;
// undefined
o32 = null;
// 27732
f81632121_506.returns.push(null);
// 27734
o33.parentNode = o28;
// 27735
o33.nodeType = 1;
// 27736
o33.getAttribute = f81632121_506;
// undefined
o33 = null;
// 27738
f81632121_506.returns.push(null);
// 27744
f81632121_506.returns.push(null);
// 27750
f81632121_506.returns.push(null);
// 27756
f81632121_506.returns.push(null);
// 27762
f81632121_506.returns.push(null);
// 27768
f81632121_506.returns.push(null);
// 27774
f81632121_506.returns.push(null);
// 27780
f81632121_506.returns.push(null);
// 27786
f81632121_506.returns.push(null);
// 27792
f81632121_506.returns.push(null);
// 27798
f81632121_506.returns.push(null);
// 27804
f81632121_506.returns.push(null);
// 27810
f81632121_506.returns.push(null);
// 27816
f81632121_506.returns.push(null);
// 27822
f81632121_506.returns.push(null);
// 27827
o24.JSBNG__screenX = 822;
// 27828
o24.JSBNG__screenY = 593;
// 27829
o24.altKey = false;
// 27830
o24.bubbles = true;
// 27831
o24.button = 0;
// 27832
o24.buttons = void 0;
// 27833
o24.cancelable = false;
// 27834
o24.clientX = 754;
// 27835
o24.clientY = 428;
// 27836
o24.ctrlKey = false;
// 27837
o24.currentTarget = o0;
// 27838
o24.defaultPrevented = false;
// 27839
o24.detail = 0;
// 27840
o24.eventPhase = 3;
// 27841
o24.isTrusted = void 0;
// 27842
o24.metaKey = false;
// 27843
o24.pageX = 754;
// 27844
o24.pageY = 428;
// 27845
o24.relatedTarget = null;
// 27846
o24.fromElement = null;
// 27849
o24.shiftKey = false;
// 27852
o24.timeStamp = 1374851250882;
// 27853
o24.type = "mousemove";
// 27854
o24.view = ow81632121;
// undefined
o24 = null;
// 27863
f81632121_1852.returns.push(undefined);
// 27866
f81632121_14.returns.push(undefined);
// 27867
f81632121_12.returns.push(122);
// 27870
o24 = {};
// 27874
f81632121_467.returns.push(1374851250893);
// 27875
o24.cancelBubble = false;
// 27876
o24.returnValue = true;
// 27879
o24.srcElement = o26;
// 27881
o24.target = o26;
// 27888
f81632121_506.returns.push(null);
// 27894
f81632121_506.returns.push(null);
// 27900
f81632121_506.returns.push(null);
// 27906
f81632121_506.returns.push(null);
// 27912
f81632121_506.returns.push(null);
// 27918
f81632121_506.returns.push(null);
// 27924
f81632121_506.returns.push(null);
// 27930
f81632121_506.returns.push(null);
// 27936
f81632121_506.returns.push(null);
// 27942
f81632121_506.returns.push(null);
// 27948
f81632121_506.returns.push(null);
// 27954
f81632121_506.returns.push(null);
// 27960
f81632121_506.returns.push(null);
// 27966
f81632121_506.returns.push(null);
// 27972
f81632121_506.returns.push(null);
// 27978
f81632121_506.returns.push(null);
// 27984
f81632121_506.returns.push(null);
// 27989
o24.JSBNG__screenX = 823;
// 27990
o24.JSBNG__screenY = 596;
// 27991
o24.altKey = false;
// 27992
o24.bubbles = true;
// 27993
o24.button = 0;
// 27994
o24.buttons = void 0;
// 27995
o24.cancelable = false;
// 27996
o24.clientX = 755;
// 27997
o24.clientY = 431;
// 27998
o24.ctrlKey = false;
// 27999
o24.currentTarget = o0;
// 28000
o24.defaultPrevented = false;
// 28001
o24.detail = 0;
// 28002
o24.eventPhase = 3;
// 28003
o24.isTrusted = void 0;
// 28004
o24.metaKey = false;
// 28005
o24.pageX = 755;
// 28006
o24.pageY = 431;
// 28007
o24.relatedTarget = null;
// 28008
o24.fromElement = null;
// 28011
o24.shiftKey = false;
// 28014
o24.timeStamp = 1374851250893;
// 28015
o24.type = "mousemove";
// 28016
o24.view = ow81632121;
// undefined
o24 = null;
// 28025
f81632121_1852.returns.push(undefined);
// 28028
f81632121_14.returns.push(undefined);
// 28029
f81632121_12.returns.push(123);
// 28032
o24 = {};
// 28036
f81632121_467.returns.push(1374851250903);
// 28037
o24.cancelBubble = false;
// 28038
o24.returnValue = true;
// 28041
o24.srcElement = o26;
// 28043
o24.target = o26;
// 28050
f81632121_506.returns.push(null);
// 28056
f81632121_506.returns.push(null);
// 28062
f81632121_506.returns.push(null);
// 28068
f81632121_506.returns.push(null);
// 28074
f81632121_506.returns.push(null);
// 28080
f81632121_506.returns.push(null);
// 28086
f81632121_506.returns.push(null);
// 28092
f81632121_506.returns.push(null);
// 28098
f81632121_506.returns.push(null);
// 28104
f81632121_506.returns.push(null);
// 28110
f81632121_506.returns.push(null);
// 28116
f81632121_506.returns.push(null);
// 28122
f81632121_506.returns.push(null);
// 28128
f81632121_506.returns.push(null);
// 28134
f81632121_506.returns.push(null);
// 28140
f81632121_506.returns.push(null);
// 28146
f81632121_506.returns.push(null);
// 28151
o24.JSBNG__screenX = 825;
// 28152
o24.JSBNG__screenY = 597;
// 28153
o24.altKey = false;
// 28154
o24.bubbles = true;
// 28155
o24.button = 0;
// 28156
o24.buttons = void 0;
// 28157
o24.cancelable = false;
// 28158
o24.clientX = 757;
// 28159
o24.clientY = 432;
// 28160
o24.ctrlKey = false;
// 28161
o24.currentTarget = o0;
// 28162
o24.defaultPrevented = false;
// 28163
o24.detail = 0;
// 28164
o24.eventPhase = 3;
// 28165
o24.isTrusted = void 0;
// 28166
o24.metaKey = false;
// 28167
o24.pageX = 757;
// 28168
o24.pageY = 432;
// 28169
o24.relatedTarget = null;
// 28170
o24.fromElement = null;
// 28173
o24.shiftKey = false;
// 28176
o24.timeStamp = 1374851250902;
// 28177
o24.type = "mousemove";
// 28178
o24.view = ow81632121;
// undefined
o24 = null;
// 28187
f81632121_1852.returns.push(undefined);
// 28190
f81632121_14.returns.push(undefined);
// 28191
f81632121_12.returns.push(124);
// 28194
o24 = {};
// 28198
f81632121_467.returns.push(1374851250912);
// 28199
o24.cancelBubble = false;
// 28200
o24.returnValue = true;
// 28203
o24.srcElement = o26;
// 28205
o24.target = o26;
// 28212
f81632121_506.returns.push(null);
// 28218
f81632121_506.returns.push(null);
// 28224
f81632121_506.returns.push(null);
// 28230
f81632121_506.returns.push(null);
// 28236
f81632121_506.returns.push(null);
// 28242
f81632121_506.returns.push(null);
// 28248
f81632121_506.returns.push(null);
// 28254
f81632121_506.returns.push(null);
// 28260
f81632121_506.returns.push(null);
// 28266
f81632121_506.returns.push(null);
// 28272
f81632121_506.returns.push(null);
// 28278
f81632121_506.returns.push(null);
// 28284
f81632121_506.returns.push(null);
// 28290
f81632121_506.returns.push(null);
// 28296
f81632121_506.returns.push(null);
// 28302
f81632121_506.returns.push(null);
// 28308
f81632121_506.returns.push(null);
// 28313
o24.JSBNG__screenX = 827;
// 28314
o24.JSBNG__screenY = 600;
// 28315
o24.altKey = false;
// 28316
o24.bubbles = true;
// 28317
o24.button = 0;
// 28318
o24.buttons = void 0;
// 28319
o24.cancelable = false;
// 28320
o24.clientX = 759;
// 28321
o24.clientY = 435;
// 28322
o24.ctrlKey = false;
// 28323
o24.currentTarget = o0;
// 28324
o24.defaultPrevented = false;
// 28325
o24.detail = 0;
// 28326
o24.eventPhase = 3;
// 28327
o24.isTrusted = void 0;
// 28328
o24.metaKey = false;
// 28329
o24.pageX = 759;
// 28330
o24.pageY = 435;
// 28331
o24.relatedTarget = null;
// 28332
o24.fromElement = null;
// 28335
o24.shiftKey = false;
// 28338
o24.timeStamp = 1374851250912;
// 28339
o24.type = "mousemove";
// 28340
o24.view = ow81632121;
// undefined
o24 = null;
// 28349
f81632121_1852.returns.push(undefined);
// 28352
f81632121_14.returns.push(undefined);
// 28353
f81632121_12.returns.push(125);
// 28356
o24 = {};
// 28360
f81632121_467.returns.push(1374851250921);
// 28361
o24.cancelBubble = false;
// 28362
o24.returnValue = true;
// 28365
o24.srcElement = o26;
// 28367
o24.target = o26;
// 28374
f81632121_506.returns.push(null);
// 28380
f81632121_506.returns.push(null);
// 28386
f81632121_506.returns.push(null);
// 28392
f81632121_506.returns.push(null);
// 28398
f81632121_506.returns.push(null);
// 28404
f81632121_506.returns.push(null);
// 28410
f81632121_506.returns.push(null);
// 28416
f81632121_506.returns.push(null);
// 28422
f81632121_506.returns.push(null);
// 28428
f81632121_506.returns.push(null);
// 28434
f81632121_506.returns.push(null);
// 28440
f81632121_506.returns.push(null);
// 28446
f81632121_506.returns.push(null);
// 28452
f81632121_506.returns.push(null);
// 28458
f81632121_506.returns.push(null);
// 28464
f81632121_506.returns.push(null);
// 28470
f81632121_506.returns.push(null);
// 28475
o24.JSBNG__screenX = 829;
// 28476
o24.JSBNG__screenY = 601;
// 28477
o24.altKey = false;
// 28478
o24.bubbles = true;
// 28479
o24.button = 0;
// 28480
o24.buttons = void 0;
// 28481
o24.cancelable = false;
// 28482
o24.clientX = 761;
// 28483
o24.clientY = 436;
// 28484
o24.ctrlKey = false;
// 28485
o24.currentTarget = o0;
// 28486
o24.defaultPrevented = false;
// 28487
o24.detail = 0;
// 28488
o24.eventPhase = 3;
// 28489
o24.isTrusted = void 0;
// 28490
o24.metaKey = false;
// 28491
o24.pageX = 761;
// 28492
o24.pageY = 436;
// 28493
o24.relatedTarget = null;
// 28494
o24.fromElement = null;
// 28497
o24.shiftKey = false;
// 28500
o24.timeStamp = 1374851250920;
// 28501
o24.type = "mousemove";
// 28502
o24.view = ow81632121;
// undefined
o24 = null;
// 28511
f81632121_1852.returns.push(undefined);
// 28514
f81632121_14.returns.push(undefined);
// 28515
f81632121_12.returns.push(126);
// 28518
o24 = {};
// 28522
f81632121_467.returns.push(1374851250932);
// 28523
o24.cancelBubble = false;
// 28524
o24.returnValue = true;
// 28527
o24.srcElement = o26;
// 28529
o24.target = o26;
// 28536
f81632121_506.returns.push(null);
// 28542
f81632121_506.returns.push(null);
// 28548
f81632121_506.returns.push(null);
// 28554
f81632121_506.returns.push(null);
// 28560
f81632121_506.returns.push(null);
// 28566
f81632121_506.returns.push(null);
// 28572
f81632121_506.returns.push(null);
// 28578
f81632121_506.returns.push(null);
// 28584
f81632121_506.returns.push(null);
// 28590
f81632121_506.returns.push(null);
// 28596
f81632121_506.returns.push(null);
// 28602
f81632121_506.returns.push(null);
// 28608
f81632121_506.returns.push(null);
// 28614
f81632121_506.returns.push(null);
// 28620
f81632121_506.returns.push(null);
// 28626
f81632121_506.returns.push(null);
// 28632
f81632121_506.returns.push(null);
// 28637
o24.JSBNG__screenX = 831;
// 28638
o24.JSBNG__screenY = 602;
// 28639
o24.altKey = false;
// 28640
o24.bubbles = true;
// 28641
o24.button = 0;
// 28642
o24.buttons = void 0;
// 28643
o24.cancelable = false;
// 28644
o24.clientX = 763;
// 28645
o24.clientY = 437;
// 28646
o24.ctrlKey = false;
// 28647
o24.currentTarget = o0;
// 28648
o24.defaultPrevented = false;
// 28649
o24.detail = 0;
// 28650
o24.eventPhase = 3;
// 28651
o24.isTrusted = void 0;
// 28652
o24.metaKey = false;
// 28653
o24.pageX = 763;
// 28654
o24.pageY = 437;
// 28655
o24.relatedTarget = null;
// 28656
o24.fromElement = null;
// 28659
o24.shiftKey = false;
// 28662
o24.timeStamp = 1374851250932;
// 28663
o24.type = "mousemove";
// 28664
o24.view = ow81632121;
// undefined
o24 = null;
// 28673
f81632121_1852.returns.push(undefined);
// 28676
f81632121_14.returns.push(undefined);
// 28677
f81632121_12.returns.push(127);
// 28680
o24 = {};
// 28684
f81632121_467.returns.push(1374851250944);
// 28685
o24.cancelBubble = false;
// 28686
o24.returnValue = true;
// 28689
o24.srcElement = o26;
// 28691
o24.target = o26;
// 28698
f81632121_506.returns.push(null);
// 28704
f81632121_506.returns.push(null);
// 28710
f81632121_506.returns.push(null);
// 28716
f81632121_506.returns.push(null);
// 28722
f81632121_506.returns.push(null);
// 28728
f81632121_506.returns.push(null);
// 28734
f81632121_506.returns.push(null);
// 28740
f81632121_506.returns.push(null);
// 28746
f81632121_506.returns.push(null);
// 28752
f81632121_506.returns.push(null);
// 28758
f81632121_506.returns.push(null);
// 28764
f81632121_506.returns.push(null);
// 28770
f81632121_506.returns.push(null);
// 28776
f81632121_506.returns.push(null);
// 28782
f81632121_506.returns.push(null);
// 28788
f81632121_506.returns.push(null);
// 28794
f81632121_506.returns.push(null);
// 28799
o24.JSBNG__screenX = 834;
// 28800
o24.JSBNG__screenY = 603;
// 28801
o24.altKey = false;
// 28802
o24.bubbles = true;
// 28803
o24.button = 0;
// 28804
o24.buttons = void 0;
// 28805
o24.cancelable = false;
// 28806
o24.clientX = 766;
// 28807
o24.clientY = 438;
// 28808
o24.ctrlKey = false;
// 28809
o24.currentTarget = o0;
// 28810
o24.defaultPrevented = false;
// 28811
o24.detail = 0;
// 28812
o24.eventPhase = 3;
// 28813
o24.isTrusted = void 0;
// 28814
o24.metaKey = false;
// 28815
o24.pageX = 766;
// 28816
o24.pageY = 438;
// 28817
o24.relatedTarget = null;
// 28818
o24.fromElement = null;
// 28821
o24.shiftKey = false;
// 28824
o24.timeStamp = 1374851250944;
// 28825
o24.type = "mousemove";
// 28826
o24.view = ow81632121;
// undefined
o24 = null;
// 28835
f81632121_1852.returns.push(undefined);
// 28838
f81632121_14.returns.push(undefined);
// 28839
f81632121_12.returns.push(128);
// 28842
o24 = {};
// 28846
f81632121_467.returns.push(1374851250951);
// 28847
o24.cancelBubble = false;
// 28848
o24.returnValue = true;
// 28851
o24.srcElement = o26;
// 28853
o24.target = o26;
// 28860
f81632121_506.returns.push(null);
// 28866
f81632121_506.returns.push(null);
// 28872
f81632121_506.returns.push(null);
// 28878
f81632121_506.returns.push(null);
// 28884
f81632121_506.returns.push(null);
// 28890
f81632121_506.returns.push(null);
// 28896
f81632121_506.returns.push(null);
// 28902
f81632121_506.returns.push(null);
// 28908
f81632121_506.returns.push(null);
// 28914
f81632121_506.returns.push(null);
// 28920
f81632121_506.returns.push(null);
// 28926
f81632121_506.returns.push(null);
// 28932
f81632121_506.returns.push(null);
// 28938
f81632121_506.returns.push(null);
// 28944
f81632121_506.returns.push(null);
// 28950
f81632121_506.returns.push(null);
// 28956
f81632121_506.returns.push(null);
// 28961
o24.JSBNG__screenX = 836;
// 28962
o24.JSBNG__screenY = 604;
// 28963
o24.altKey = false;
// 28964
o24.bubbles = true;
// 28965
o24.button = 0;
// 28966
o24.buttons = void 0;
// 28967
o24.cancelable = false;
// 28968
o24.clientX = 768;
// 28969
o24.clientY = 439;
// 28970
o24.ctrlKey = false;
// 28971
o24.currentTarget = o0;
// 28972
o24.defaultPrevented = false;
// 28973
o24.detail = 0;
// 28974
o24.eventPhase = 3;
// 28975
o24.isTrusted = void 0;
// 28976
o24.metaKey = false;
// 28977
o24.pageX = 768;
// 28978
o24.pageY = 439;
// 28979
o24.relatedTarget = null;
// 28980
o24.fromElement = null;
// 28983
o24.shiftKey = false;
// 28986
o24.timeStamp = 1374851250951;
// 28987
o24.type = "mousemove";
// 28988
o24.view = ow81632121;
// undefined
o24 = null;
// 28997
f81632121_1852.returns.push(undefined);
// 29000
f81632121_14.returns.push(undefined);
// 29001
f81632121_12.returns.push(129);
// 29004
o24 = {};
// 29008
f81632121_467.returns.push(1374851250962);
// 29009
o24.cancelBubble = false;
// 29010
o24.returnValue = true;
// 29013
o24.srcElement = o26;
// 29015
o24.target = o26;
// 29022
f81632121_506.returns.push(null);
// 29028
f81632121_506.returns.push(null);
// 29034
f81632121_506.returns.push(null);
// 29040
f81632121_506.returns.push(null);
// 29046
f81632121_506.returns.push(null);
// 29052
f81632121_506.returns.push(null);
// 29058
f81632121_506.returns.push(null);
// 29064
f81632121_506.returns.push(null);
// 29070
f81632121_506.returns.push(null);
// 29076
f81632121_506.returns.push(null);
// 29082
f81632121_506.returns.push(null);
// 29088
f81632121_506.returns.push(null);
// 29094
f81632121_506.returns.push(null);
// 29100
f81632121_506.returns.push(null);
// 29106
f81632121_506.returns.push(null);
// 29112
f81632121_506.returns.push(null);
// 29118
f81632121_506.returns.push(null);
// 29123
o24.JSBNG__screenX = 837;
// 29124
o24.JSBNG__screenY = 605;
// 29125
o24.altKey = false;
// 29126
o24.bubbles = true;
// 29127
o24.button = 0;
// 29128
o24.buttons = void 0;
// 29129
o24.cancelable = false;
// 29130
o24.clientX = 769;
// 29131
o24.clientY = 440;
// 29132
o24.ctrlKey = false;
// 29133
o24.currentTarget = o0;
// 29134
o24.defaultPrevented = false;
// 29135
o24.detail = 0;
// 29136
o24.eventPhase = 3;
// 29137
o24.isTrusted = void 0;
// 29138
o24.metaKey = false;
// 29139
o24.pageX = 769;
// 29140
o24.pageY = 440;
// 29141
o24.relatedTarget = null;
// 29142
o24.fromElement = null;
// 29145
o24.shiftKey = false;
// 29148
o24.timeStamp = 1374851250962;
// 29149
o24.type = "mousemove";
// 29150
o24.view = ow81632121;
// undefined
o24 = null;
// 29159
f81632121_1852.returns.push(undefined);
// 29162
f81632121_14.returns.push(undefined);
// 29163
f81632121_12.returns.push(130);
// 29166
o24 = {};
// 29170
f81632121_467.returns.push(1374851250969);
// 29171
o24.cancelBubble = false;
// 29172
o24.returnValue = true;
// 29175
o24.srcElement = o26;
// 29177
o24.target = o26;
// 29184
f81632121_506.returns.push(null);
// 29190
f81632121_506.returns.push(null);
// 29196
f81632121_506.returns.push(null);
// 29202
f81632121_506.returns.push(null);
// 29208
f81632121_506.returns.push(null);
// 29214
f81632121_506.returns.push(null);
// 29220
f81632121_506.returns.push(null);
// 29226
f81632121_506.returns.push(null);
// 29232
f81632121_506.returns.push(null);
// 29238
f81632121_506.returns.push(null);
// 29244
f81632121_506.returns.push(null);
// 29250
f81632121_506.returns.push(null);
// 29256
f81632121_506.returns.push(null);
// 29262
f81632121_506.returns.push(null);
// 29268
f81632121_506.returns.push(null);
// 29274
f81632121_506.returns.push(null);
// 29280
f81632121_506.returns.push(null);
// 29285
o24.JSBNG__screenX = 840;
// 29286
o24.JSBNG__screenY = 606;
// 29287
o24.altKey = false;
// 29288
o24.bubbles = true;
// 29289
o24.button = 0;
// 29290
o24.buttons = void 0;
// 29291
o24.cancelable = false;
// 29292
o24.clientX = 772;
// 29293
o24.clientY = 441;
// 29294
o24.ctrlKey = false;
// 29295
o24.currentTarget = o0;
// 29296
o24.defaultPrevented = false;
// 29297
o24.detail = 0;
// 29298
o24.eventPhase = 3;
// 29299
o24.isTrusted = void 0;
// 29300
o24.metaKey = false;
// 29301
o24.pageX = 772;
// 29302
o24.pageY = 441;
// 29303
o24.relatedTarget = null;
// 29304
o24.fromElement = null;
// 29307
o24.shiftKey = false;
// 29310
o24.timeStamp = 1374851250968;
// 29311
o24.type = "mousemove";
// 29312
o24.view = ow81632121;
// undefined
o24 = null;
// 29321
f81632121_1852.returns.push(undefined);
// 29324
f81632121_14.returns.push(undefined);
// 29325
f81632121_12.returns.push(131);
// 29328
o24 = {};
// 29332
f81632121_467.returns.push(1374851250980);
// 29333
o24.cancelBubble = false;
// 29334
o24.returnValue = true;
// 29337
o24.srcElement = o26;
// 29339
o24.target = o26;
// 29346
f81632121_506.returns.push(null);
// 29352
f81632121_506.returns.push(null);
// 29358
f81632121_506.returns.push(null);
// 29364
f81632121_506.returns.push(null);
// 29370
f81632121_506.returns.push(null);
// 29376
f81632121_506.returns.push(null);
// 29382
f81632121_506.returns.push(null);
// 29388
f81632121_506.returns.push(null);
// 29394
f81632121_506.returns.push(null);
// 29400
f81632121_506.returns.push(null);
// 29406
f81632121_506.returns.push(null);
// 29412
f81632121_506.returns.push(null);
// 29418
f81632121_506.returns.push(null);
// 29424
f81632121_506.returns.push(null);
// 29430
f81632121_506.returns.push(null);
// 29436
f81632121_506.returns.push(null);
// 29442
f81632121_506.returns.push(null);
// 29447
o24.JSBNG__screenX = 841;
// 29448
o24.JSBNG__screenY = 606;
// 29449
o24.altKey = false;
// 29450
o24.bubbles = true;
// 29451
o24.button = 0;
// 29452
o24.buttons = void 0;
// 29453
o24.cancelable = false;
// 29454
o24.clientX = 773;
// 29455
o24.clientY = 441;
// 29456
o24.ctrlKey = false;
// 29457
o24.currentTarget = o0;
// 29458
o24.defaultPrevented = false;
// 29459
o24.detail = 0;
// 29460
o24.eventPhase = 3;
// 29461
o24.isTrusted = void 0;
// 29462
o24.metaKey = false;
// 29463
o24.pageX = 773;
// 29464
o24.pageY = 441;
// 29465
o24.relatedTarget = null;
// 29466
o24.fromElement = null;
// 29469
o24.shiftKey = false;
// 29472
o24.timeStamp = 1374851250979;
// 29473
o24.type = "mousemove";
// 29474
o24.view = ow81632121;
// undefined
o24 = null;
// 29483
f81632121_1852.returns.push(undefined);
// 29486
f81632121_14.returns.push(undefined);
// 29487
f81632121_12.returns.push(132);
// 29490
o24 = {};
// 29494
f81632121_467.returns.push(1374851250992);
// 29495
o24.cancelBubble = false;
// 29496
o24.returnValue = true;
// 29499
o24.srcElement = o26;
// 29501
o24.target = o26;
// 29508
f81632121_506.returns.push(null);
// 29514
f81632121_506.returns.push(null);
// 29520
f81632121_506.returns.push(null);
// 29526
f81632121_506.returns.push(null);
// 29532
f81632121_506.returns.push(null);
// 29538
f81632121_506.returns.push(null);
// 29544
f81632121_506.returns.push(null);
// 29550
f81632121_506.returns.push(null);
// 29556
f81632121_506.returns.push(null);
// 29562
f81632121_506.returns.push(null);
// 29568
f81632121_506.returns.push(null);
// 29574
f81632121_506.returns.push(null);
// 29580
f81632121_506.returns.push(null);
// 29586
f81632121_506.returns.push(null);
// 29592
f81632121_506.returns.push(null);
// 29598
f81632121_506.returns.push(null);
// 29604
f81632121_506.returns.push(null);
// 29609
o24.JSBNG__screenX = 843;
// 29610
o24.JSBNG__screenY = 606;
// 29611
o24.altKey = false;
// 29612
o24.bubbles = true;
// 29613
o24.button = 0;
// 29614
o24.buttons = void 0;
// 29615
o24.cancelable = false;
// 29616
o24.clientX = 775;
// 29617
o24.clientY = 441;
// 29618
o24.ctrlKey = false;
// 29619
o24.currentTarget = o0;
// 29620
o24.defaultPrevented = false;
// 29621
o24.detail = 0;
// 29622
o24.eventPhase = 3;
// 29623
o24.isTrusted = void 0;
// 29624
o24.metaKey = false;
// 29625
o24.pageX = 775;
// 29626
o24.pageY = 441;
// 29627
o24.relatedTarget = null;
// 29628
o24.fromElement = null;
// 29631
o24.shiftKey = false;
// 29634
o24.timeStamp = 1374851250992;
// 29635
o24.type = "mousemove";
// 29636
o24.view = ow81632121;
// undefined
o24 = null;
// 29645
f81632121_1852.returns.push(undefined);
// 29648
f81632121_14.returns.push(undefined);
// 29649
f81632121_12.returns.push(133);
// 29652
o24 = {};
// 29656
f81632121_467.returns.push(1374851251003);
// 29657
o24.cancelBubble = false;
// 29658
o24.returnValue = true;
// 29661
o24.srcElement = o26;
// 29663
o24.target = o26;
// 29670
f81632121_506.returns.push(null);
// 29676
f81632121_506.returns.push(null);
// 29682
f81632121_506.returns.push(null);
// 29688
f81632121_506.returns.push(null);
// 29694
f81632121_506.returns.push(null);
// 29700
f81632121_506.returns.push(null);
// 29706
f81632121_506.returns.push(null);
// 29712
f81632121_506.returns.push(null);
// 29718
f81632121_506.returns.push(null);
// 29724
f81632121_506.returns.push(null);
// 29730
f81632121_506.returns.push(null);
// 29736
f81632121_506.returns.push(null);
// 29742
f81632121_506.returns.push(null);
// 29748
f81632121_506.returns.push(null);
// 29754
f81632121_506.returns.push(null);
// 29760
f81632121_506.returns.push(null);
// 29766
f81632121_506.returns.push(null);
// 29771
o24.JSBNG__screenX = 844;
// 29772
o24.JSBNG__screenY = 606;
// 29773
o24.altKey = false;
// 29774
o24.bubbles = true;
// 29775
o24.button = 0;
// 29776
o24.buttons = void 0;
// 29777
o24.cancelable = false;
// 29778
o24.clientX = 776;
// 29779
o24.clientY = 441;
// 29780
o24.ctrlKey = false;
// 29781
o24.currentTarget = o0;
// 29782
o24.defaultPrevented = false;
// 29783
o24.detail = 0;
// 29784
o24.eventPhase = 3;
// 29785
o24.isTrusted = void 0;
// 29786
o24.metaKey = false;
// 29787
o24.pageX = 776;
// 29788
o24.pageY = 441;
// 29789
o24.relatedTarget = null;
// 29790
o24.fromElement = null;
// 29793
o24.shiftKey = false;
// 29796
o24.timeStamp = 1374851251002;
// 29797
o24.type = "mousemove";
// 29798
o24.view = ow81632121;
// undefined
o24 = null;
// 29807
f81632121_1852.returns.push(undefined);
// 29810
f81632121_14.returns.push(undefined);
// 29811
f81632121_12.returns.push(134);
// 29814
o24 = {};
// 29818
f81632121_467.returns.push(1374851251015);
// 29819
o24.cancelBubble = false;
// 29820
o24.returnValue = true;
// 29823
o24.srcElement = o26;
// 29825
o24.target = o26;
// 29832
f81632121_506.returns.push(null);
// 29838
f81632121_506.returns.push(null);
// 29844
f81632121_506.returns.push(null);
// 29850
f81632121_506.returns.push(null);
// 29856
f81632121_506.returns.push(null);
// 29862
f81632121_506.returns.push(null);
// 29868
f81632121_506.returns.push(null);
// 29874
f81632121_506.returns.push(null);
// 29880
f81632121_506.returns.push(null);
// 29886
f81632121_506.returns.push(null);
// 29892
f81632121_506.returns.push(null);
// 29898
f81632121_506.returns.push(null);
// 29904
f81632121_506.returns.push(null);
// 29910
f81632121_506.returns.push(null);
// 29916
f81632121_506.returns.push(null);
// 29922
f81632121_506.returns.push(null);
// 29928
f81632121_506.returns.push(null);
// 29933
o24.JSBNG__screenX = 845;
// 29934
o24.JSBNG__screenY = 606;
// 29935
o24.altKey = false;
// 29936
o24.bubbles = true;
// 29937
o24.button = 0;
// 29938
o24.buttons = void 0;
// 29939
o24.cancelable = false;
// 29940
o24.clientX = 777;
// 29941
o24.clientY = 441;
// 29942
o24.ctrlKey = false;
// 29943
o24.currentTarget = o0;
// 29944
o24.defaultPrevented = false;
// 29945
o24.detail = 0;
// 29946
o24.eventPhase = 3;
// 29947
o24.isTrusted = void 0;
// 29948
o24.metaKey = false;
// 29949
o24.pageX = 777;
// 29950
o24.pageY = 441;
// 29951
o24.relatedTarget = null;
// 29952
o24.fromElement = null;
// 29955
o24.shiftKey = false;
// 29958
o24.timeStamp = 1374851251015;
// 29959
o24.type = "mousemove";
// 29960
o24.view = ow81632121;
// undefined
o24 = null;
// 29969
f81632121_1852.returns.push(undefined);
// 29972
f81632121_14.returns.push(undefined);
// 29973
f81632121_12.returns.push(135);
// 29976
o24 = {};
// 29980
f81632121_467.returns.push(1374851251029);
// 29981
o24.cancelBubble = false;
// 29982
o24.returnValue = true;
// 29985
o24.srcElement = o26;
// 29987
o24.target = o26;
// 29994
f81632121_506.returns.push(null);
// 30000
f81632121_506.returns.push(null);
// 30006
f81632121_506.returns.push(null);
// 30012
f81632121_506.returns.push(null);
// 30018
f81632121_506.returns.push(null);
// 30024
f81632121_506.returns.push(null);
// 30030
f81632121_506.returns.push(null);
// 30036
f81632121_506.returns.push(null);
// 30042
f81632121_506.returns.push(null);
// 30048
f81632121_506.returns.push(null);
// 30054
f81632121_506.returns.push(null);
// 30060
f81632121_506.returns.push(null);
// 30066
f81632121_506.returns.push(null);
// 30072
f81632121_506.returns.push(null);
// 30078
f81632121_506.returns.push(null);
// 30084
f81632121_506.returns.push(null);
// 30090
f81632121_506.returns.push(null);
// 30095
o24.JSBNG__screenX = 846;
// 30096
o24.JSBNG__screenY = 606;
// 30097
o24.altKey = false;
// 30098
o24.bubbles = true;
// 30099
o24.button = 0;
// 30100
o24.buttons = void 0;
// 30101
o24.cancelable = false;
// 30102
o24.clientX = 778;
// 30103
o24.clientY = 441;
// 30104
o24.ctrlKey = false;
// 30105
o24.currentTarget = o0;
// 30106
o24.defaultPrevented = false;
// 30107
o24.detail = 0;
// 30108
o24.eventPhase = 3;
// 30109
o24.isTrusted = void 0;
// 30110
o24.metaKey = false;
// 30111
o24.pageX = 778;
// 30112
o24.pageY = 441;
// 30113
o24.relatedTarget = null;
// 30114
o24.fromElement = null;
// 30117
o24.shiftKey = false;
// 30120
o24.timeStamp = 1374851251029;
// 30121
o24.type = "mousemove";
// 30122
o24.view = ow81632121;
// undefined
o24 = null;
// 30131
f81632121_1852.returns.push(undefined);
// 30134
f81632121_14.returns.push(undefined);
// 30135
f81632121_12.returns.push(136);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 30141
f81632121_467.returns.push(1374851251040);
// 30142
o24 = {};
// 30146
f81632121_467.returns.push(1374851251047);
// 30147
o24.cancelBubble = false;
// 30148
o24.returnValue = true;
// 30151
o24.srcElement = o26;
// 30153
o24.target = o26;
// 30160
f81632121_506.returns.push(null);
// 30166
f81632121_506.returns.push(null);
// 30172
f81632121_506.returns.push(null);
// 30178
f81632121_506.returns.push(null);
// 30184
f81632121_506.returns.push(null);
// 30190
f81632121_506.returns.push(null);
// 30196
f81632121_506.returns.push(null);
// 30202
f81632121_506.returns.push(null);
// 30208
f81632121_506.returns.push(null);
// 30214
f81632121_506.returns.push(null);
// 30220
f81632121_506.returns.push(null);
// 30226
f81632121_506.returns.push(null);
// 30232
f81632121_506.returns.push(null);
// 30238
f81632121_506.returns.push(null);
// 30244
f81632121_506.returns.push(null);
// 30250
f81632121_506.returns.push(null);
// 30256
f81632121_506.returns.push(null);
// 30261
o24.JSBNG__screenX = 847;
// 30262
o24.JSBNG__screenY = 606;
// 30263
o24.altKey = false;
// 30264
o24.bubbles = true;
// 30265
o24.button = 0;
// 30266
o24.buttons = void 0;
// 30267
o24.cancelable = false;
// 30268
o24.clientX = 779;
// 30269
o24.clientY = 441;
// 30270
o24.ctrlKey = false;
// 30271
o24.currentTarget = o0;
// 30272
o24.defaultPrevented = false;
// 30273
o24.detail = 0;
// 30274
o24.eventPhase = 3;
// 30275
o24.isTrusted = void 0;
// 30276
o24.metaKey = false;
// 30277
o24.pageX = 779;
// 30278
o24.pageY = 441;
// 30279
o24.relatedTarget = null;
// 30280
o24.fromElement = null;
// 30283
o24.shiftKey = false;
// 30286
o24.timeStamp = 1374851251046;
// 30287
o24.type = "mousemove";
// 30288
o24.view = ow81632121;
// undefined
o24 = null;
// 30297
f81632121_1852.returns.push(undefined);
// 30300
f81632121_14.returns.push(undefined);
// 30301
f81632121_12.returns.push(137);
// 30304
o24 = {};
// 30308
f81632121_467.returns.push(1374851251062);
// 30309
o24.cancelBubble = false;
// 30310
o24.returnValue = true;
// 30313
o24.srcElement = o26;
// 30315
o24.target = o26;
// 30322
f81632121_506.returns.push(null);
// 30328
f81632121_506.returns.push(null);
// 30334
f81632121_506.returns.push(null);
// 30340
f81632121_506.returns.push(null);
// 30346
f81632121_506.returns.push(null);
// 30352
f81632121_506.returns.push(null);
// 30358
f81632121_506.returns.push(null);
// 30364
f81632121_506.returns.push(null);
// 30370
f81632121_506.returns.push(null);
// 30376
f81632121_506.returns.push(null);
// 30382
f81632121_506.returns.push(null);
// 30388
f81632121_506.returns.push(null);
// 30394
f81632121_506.returns.push(null);
// 30400
f81632121_506.returns.push(null);
// 30406
f81632121_506.returns.push(null);
// 30412
f81632121_506.returns.push(null);
// 30418
f81632121_506.returns.push(null);
// 30423
o24.JSBNG__screenX = 848;
// 30424
o24.JSBNG__screenY = 606;
// 30425
o24.altKey = false;
// 30426
o24.bubbles = true;
// 30427
o24.button = 0;
// 30428
o24.buttons = void 0;
// 30429
o24.cancelable = false;
// 30430
o24.clientX = 780;
// 30431
o24.clientY = 441;
// 30432
o24.ctrlKey = false;
// 30433
o24.currentTarget = o0;
// 30434
o24.defaultPrevented = false;
// 30435
o24.detail = 0;
// 30436
o24.eventPhase = 3;
// 30437
o24.isTrusted = void 0;
// 30438
o24.metaKey = false;
// 30439
o24.pageX = 780;
// 30440
o24.pageY = 441;
// 30441
o24.relatedTarget = null;
// 30442
o24.fromElement = null;
// 30445
o24.shiftKey = false;
// 30448
o24.timeStamp = 1374851251062;
// 30449
o24.type = "mousemove";
// 30450
o24.view = ow81632121;
// undefined
o24 = null;
// 30459
f81632121_1852.returns.push(undefined);
// 30462
f81632121_14.returns.push(undefined);
// 30463
f81632121_12.returns.push(138);
// 30466
o24 = {};
// 30470
f81632121_467.returns.push(1374851251079);
// 30471
o24.cancelBubble = false;
// 30472
o24.returnValue = true;
// 30475
o24.srcElement = o26;
// 30477
o24.target = o26;
// 30484
f81632121_506.returns.push(null);
// 30490
f81632121_506.returns.push(null);
// 30496
f81632121_506.returns.push(null);
// 30502
f81632121_506.returns.push(null);
// 30508
f81632121_506.returns.push(null);
// 30514
f81632121_506.returns.push(null);
// 30520
f81632121_506.returns.push(null);
// 30526
f81632121_506.returns.push(null);
// 30532
f81632121_506.returns.push(null);
// 30538
f81632121_506.returns.push(null);
// 30544
f81632121_506.returns.push(null);
// 30550
f81632121_506.returns.push(null);
// 30556
f81632121_506.returns.push(null);
// 30562
f81632121_506.returns.push(null);
// 30568
f81632121_506.returns.push(null);
// 30574
f81632121_506.returns.push(null);
// 30580
f81632121_506.returns.push(null);
// 30585
o24.JSBNG__screenX = 849;
// 30586
o24.JSBNG__screenY = 606;
// 30587
o24.altKey = false;
// 30588
o24.bubbles = true;
// 30589
o24.button = 0;
// 30590
o24.buttons = void 0;
// 30591
o24.cancelable = false;
// 30592
o24.clientX = 781;
// 30593
o24.clientY = 441;
// 30594
o24.ctrlKey = false;
// 30595
o24.currentTarget = o0;
// 30596
o24.defaultPrevented = false;
// 30597
o24.detail = 0;
// 30598
o24.eventPhase = 3;
// 30599
o24.isTrusted = void 0;
// 30600
o24.metaKey = false;
// 30601
o24.pageX = 781;
// 30602
o24.pageY = 441;
// 30603
o24.relatedTarget = null;
// 30604
o24.fromElement = null;
// 30607
o24.shiftKey = false;
// 30610
o24.timeStamp = 1374851251079;
// 30611
o24.type = "mousemove";
// 30612
o24.view = ow81632121;
// undefined
o24 = null;
// 30621
f81632121_1852.returns.push(undefined);
// 30624
f81632121_14.returns.push(undefined);
// 30625
f81632121_12.returns.push(139);
// 30628
o24 = {};
// 30632
f81632121_467.returns.push(1374851251088);
// 30637
f81632121_467.returns.push(1374851251089);
// 30641
f81632121_467.returns.push(1374851251089);
// 30643
o24.cancelBubble = false;
// 30644
o24.returnValue = true;
// 30647
o24.srcElement = o26;
// 30649
o24.target = o26;
// 30656
f81632121_506.returns.push(null);
// 30662
f81632121_506.returns.push(null);
// 30668
f81632121_506.returns.push(null);
// 30674
f81632121_506.returns.push(null);
// 30680
f81632121_506.returns.push(null);
// 30686
f81632121_506.returns.push(null);
// 30692
f81632121_506.returns.push(null);
// 30698
f81632121_506.returns.push(null);
// 30704
f81632121_506.returns.push(null);
// 30710
f81632121_506.returns.push(null);
// 30716
f81632121_506.returns.push(null);
// 30722
f81632121_506.returns.push(null);
// 30728
f81632121_506.returns.push(null);
// 30734
f81632121_506.returns.push(null);
// 30740
f81632121_506.returns.push(null);
// 30746
f81632121_506.returns.push(null);
// 30752
f81632121_506.returns.push(null);
// 30757
o24.JSBNG__screenX = 850;
// 30758
o24.JSBNG__screenY = 606;
// 30759
o24.altKey = false;
// 30760
o24.bubbles = true;
// 30761
o24.button = 0;
// 30762
o24.buttons = void 0;
// 30763
o24.cancelable = false;
// 30764
o24.clientX = 782;
// 30765
o24.clientY = 441;
// 30766
o24.ctrlKey = false;
// 30767
o24.currentTarget = o0;
// 30768
o24.defaultPrevented = false;
// 30769
o24.detail = 0;
// 30770
o24.eventPhase = 3;
// 30771
o24.isTrusted = void 0;
// 30772
o24.metaKey = false;
// 30773
o24.pageX = 782;
// 30774
o24.pageY = 441;
// 30775
o24.relatedTarget = null;
// 30776
o24.fromElement = null;
// 30779
o24.shiftKey = false;
// 30782
o24.timeStamp = 1374851251088;
// 30783
o24.type = "mousemove";
// 30784
o24.view = ow81632121;
// undefined
o24 = null;
// 30793
f81632121_1852.returns.push(undefined);
// 30796
f81632121_14.returns.push(undefined);
// 30797
f81632121_12.returns.push(140);
// 30800
o24 = {};
// 30804
f81632121_467.returns.push(1374851251135);
// 30805
o24.cancelBubble = false;
// 30806
o24.returnValue = true;
// 30809
o24.srcElement = o26;
// 30811
o24.target = o26;
// 30818
f81632121_506.returns.push(null);
// 30824
f81632121_506.returns.push(null);
// 30830
f81632121_506.returns.push(null);
// 30836
f81632121_506.returns.push(null);
// 30842
f81632121_506.returns.push(null);
// 30848
f81632121_506.returns.push(null);
// 30854
f81632121_506.returns.push(null);
// 30860
f81632121_506.returns.push(null);
// 30866
f81632121_506.returns.push(null);
// 30872
f81632121_506.returns.push(null);
// 30878
f81632121_506.returns.push(null);
// 30884
f81632121_506.returns.push(null);
// 30890
f81632121_506.returns.push(null);
// 30896
f81632121_506.returns.push(null);
// 30902
f81632121_506.returns.push(null);
// 30908
f81632121_506.returns.push(null);
// 30914
f81632121_506.returns.push(null);
// 30919
o24.JSBNG__screenX = 850;
// 30920
o24.JSBNG__screenY = 606;
// 30921
o24.altKey = false;
// 30922
o24.bubbles = true;
// 30923
o24.button = 0;
// 30924
o24.buttons = void 0;
// 30925
o24.cancelable = false;
// 30926
o24.clientX = 782;
// 30927
o24.clientY = 441;
// 30928
o24.ctrlKey = false;
// 30929
o24.currentTarget = o0;
// 30930
o24.defaultPrevented = false;
// 30931
o24.detail = 0;
// 30932
o24.eventPhase = 3;
// 30933
o24.isTrusted = void 0;
// 30934
o24.metaKey = false;
// 30935
o24.pageX = 782;
// 30936
o24.pageY = 441;
// 30937
o24.relatedTarget = null;
// 30938
o24.fromElement = null;
// 30941
o24.shiftKey = false;
// 30944
o24.timeStamp = 1374851251134;
// 30945
o24.type = "mousemove";
// 30946
o24.view = ow81632121;
// undefined
o24 = null;
// 30955
f81632121_1852.returns.push(undefined);
// 30958
f81632121_14.returns.push(undefined);
// 30959
f81632121_12.returns.push(141);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 30964
o24 = {};
// 30967
o24.cancelBubble = false;
// 30970
f81632121_467.returns.push(1374851251713);
// 30975
f81632121_467.returns.push(1374851251725);
// 30979
f81632121_467.returns.push(1374851251725);
// 30982
o24.returnValue = true;
// undefined
o24 = null;
// 30983
o24 = {};
// 30986
o24.cancelBubble = false;
// 30989
f81632121_467.returns.push(1374851251755);
// 30991
o24.returnValue = true;
// undefined
o24 = null;
// 30992
o24 = {};
// 30995
o24.cancelBubble = false;
// 30998
f81632121_467.returns.push(1374851251787);
// 31000
o24.returnValue = true;
// undefined
o24 = null;
// 31001
o24 = {};
// 31004
o24.cancelBubble = false;
// 31007
f81632121_467.returns.push(1374851251809);
// 31009
o24.returnValue = true;
// undefined
o24 = null;
// 31010
o24 = {};
// 31013
o24.cancelBubble = false;
// 31016
f81632121_467.returns.push(1374851251825);
// 31018
o24.returnValue = true;
// undefined
o24 = null;
// 31019
o24 = {};
// 31022
o24.cancelBubble = false;
// 31025
f81632121_467.returns.push(1374851251843);
// 31027
o24.returnValue = true;
// undefined
o24 = null;
// 31028
o24 = {};
// 31031
o24.cancelBubble = false;
// 31034
f81632121_467.returns.push(1374851251859);
// 31036
o24.returnValue = true;
// undefined
o24 = null;
// 31037
o24 = {};
// 31040
o24.cancelBubble = false;
// 31043
f81632121_467.returns.push(1374851251875);
// 31045
o24.returnValue = true;
// undefined
o24 = null;
// 31047
f81632121_12.returns.push(142);
// 31049
o24 = {};
// 31052
o24.cancelBubble = false;
// 31055
f81632121_467.returns.push(1374851251892);
// 31057
o24.returnValue = true;
// undefined
o24 = null;
// 31058
o24 = {};
// 31061
o24.cancelBubble = false;
// 31064
f81632121_467.returns.push(1374851251910);
// 31066
o24.returnValue = true;
// undefined
o24 = null;
// 31067
o24 = {};
// 31070
o24.cancelBubble = false;
// 31073
f81632121_467.returns.push(1374851251927);
// 31075
o24.returnValue = true;
// undefined
o24 = null;
// 31076
o24 = {};
// 31079
o24.cancelBubble = false;
// 31082
f81632121_467.returns.push(1374851251942);
// 31084
o24.returnValue = true;
// undefined
o24 = null;
// 31085
o24 = {};
// 31088
o24.cancelBubble = false;
// 31091
f81632121_467.returns.push(1374851251961);
// 31093
o24.returnValue = true;
// undefined
o24 = null;
// 31094
o24 = {};
// 31097
o24.cancelBubble = false;
// 31100
f81632121_467.returns.push(1374851251975);
// 31102
o24.returnValue = true;
// undefined
o24 = null;
// 31103
o24 = {};
// 31106
o24.cancelBubble = false;
// 31109
f81632121_467.returns.push(1374851251993);
// 31111
o24.returnValue = true;
// undefined
o24 = null;
// 31112
o24 = {};
// 31115
o24.cancelBubble = false;
// 31118
f81632121_467.returns.push(1374851252008);
// 31120
o24.returnValue = true;
// undefined
o24 = null;
// 31121
o24 = {};
// 31124
o24.cancelBubble = false;
// 31127
f81632121_467.returns.push(1374851252024);
// 31129
o24.returnValue = true;
// undefined
o24 = null;
// 31130
o24 = {};
// 31133
o24.cancelBubble = false;
// 31136
f81632121_467.returns.push(1374851252040);
// 31138
o24.returnValue = true;
// undefined
o24 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 31142
f81632121_467.returns.push(1374851252041);
// 31143
o24 = {};
// 31146
o24.cancelBubble = false;
// 31149
f81632121_467.returns.push(1374851252048);
// 31151
o24.returnValue = true;
// undefined
o24 = null;
// 31152
o24 = {};
// 31155
o24.cancelBubble = false;
// 31158
f81632121_467.returns.push(1374851252063);
// 31160
o24.returnValue = true;
// undefined
o24 = null;
// 31161
o24 = {};
// 31164
o24.cancelBubble = false;
// 31167
f81632121_467.returns.push(1374851252071);
// 31169
o24.returnValue = true;
// undefined
o24 = null;
// 31170
o24 = {};
// 31173
o24.cancelBubble = false;
// 31176
f81632121_467.returns.push(1374851252090);
// 31178
o24.returnValue = true;
// undefined
o24 = null;
// 31179
o24 = {};
// 31182
o24.cancelBubble = false;
// 31185
f81632121_467.returns.push(1374851252104);
// 31187
o24.returnValue = true;
// undefined
o24 = null;
// 31188
o24 = {};
// 31191
o24.cancelBubble = false;
// 31194
f81632121_467.returns.push(1374851252112);
// 31196
o24.returnValue = true;
// undefined
o24 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 31198
o24 = {};
// 31201
o24.srcElement = o26;
// 31203
o24.target = o26;
// 31210
f81632121_506.returns.push(null);
// 31216
f81632121_506.returns.push(null);
// 31222
f81632121_506.returns.push(null);
// 31228
f81632121_506.returns.push(null);
// 31234
f81632121_506.returns.push(null);
// 31240
f81632121_506.returns.push(null);
// 31246
f81632121_506.returns.push(null);
// 31252
f81632121_506.returns.push(null);
// 31258
f81632121_506.returns.push(null);
// 31264
f81632121_506.returns.push(null);
// 31270
f81632121_506.returns.push(null);
// 31276
f81632121_506.returns.push(null);
// 31282
f81632121_506.returns.push(null);
// 31288
f81632121_506.returns.push(null);
// 31294
f81632121_506.returns.push(null);
// 31300
f81632121_506.returns.push(null);
// 31306
f81632121_506.returns.push(null);
// 31311
o24.relatedTarget = o52;
// 31312
o52.parentNode = o54;
// undefined
o54 = null;
// 31313
o52.nodeType = 1;
// 31316
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31319
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31320
o24.JSBNG__screenX = 850;
// 31321
o24.JSBNG__screenY = 606;
// 31322
o24.altKey = false;
// 31323
o24.bubbles = true;
// 31324
o24.button = 0;
// 31325
o24.buttons = void 0;
// 31326
o24.cancelable = true;
// 31327
o24.clientX = 782;
// 31328
o24.clientY = 441;
// 31329
o24.ctrlKey = false;
// 31330
o24.currentTarget = o0;
// 31331
o24.defaultPrevented = false;
// 31332
o24.detail = 0;
// 31333
o24.eventPhase = 3;
// 31334
o24.isTrusted = void 0;
// 31335
o24.metaKey = false;
// 31336
o24.pageX = 782;
// 31337
o24.pageY = 2827;
// 31339
o24.shiftKey = false;
// 31342
o24.timeStamp = 1374851252265;
// 31343
o24.type = "mouseout";
// 31344
o24.view = ow81632121;
// 31346
o24.returnValue = true;
// 31378
o24.cancelBubble = false;
// undefined
o24 = null;
// 31380
o24 = {};
// 31383
o24.cancelBubble = false;
// 31386
f81632121_467.returns.push(1374851252298);
// 31391
f81632121_467.returns.push(1374851252299);
// 31395
f81632121_467.returns.push(1374851252299);
// 31399
f81632121_1007.returns.push(undefined);
// 31401
o24.returnValue = true;
// 31404
o24.srcElement = o52;
// 31406
o24.target = o52;
// 31413
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31416
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31417
o24.relatedTarget = o26;
// undefined
o24 = null;
// undefined
o26 = null;
// 31418
o52.nodeName = "DIV";
// 31425
o24 = {};
// 31429
f81632121_467.returns.push(1374851252302);
// 31430
o24.cancelBubble = false;
// 31431
o24.returnValue = true;
// 31434
o24.srcElement = o52;
// 31436
o24.target = o52;
// 31443
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31446
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31447
o24.JSBNG__screenX = 850;
// 31448
o24.JSBNG__screenY = 606;
// 31449
o24.altKey = false;
// 31450
o24.bubbles = true;
// 31451
o24.button = 0;
// 31452
o24.buttons = void 0;
// 31453
o24.cancelable = false;
// 31454
o24.clientX = 782;
// 31455
o24.clientY = 441;
// 31456
o24.ctrlKey = false;
// 31457
o24.currentTarget = o0;
// 31458
o24.defaultPrevented = false;
// 31459
o24.detail = 0;
// 31460
o24.eventPhase = 3;
// 31461
o24.isTrusted = void 0;
// 31462
o24.metaKey = false;
// 31463
o24.pageX = 782;
// 31464
o24.pageY = 2827;
// 31465
o24.relatedTarget = null;
// 31466
o24.fromElement = null;
// 31469
o24.shiftKey = false;
// 31472
o24.timeStamp = 1374851252301;
// 31473
o24.type = "mousemove";
// 31474
o24.view = ow81632121;
// undefined
o24 = null;
// 31488
f81632121_1852.returns.push(undefined);
// 31491
f81632121_14.returns.push(undefined);
// 31492
f81632121_12.returns.push(143);
// 31495
o24 = {};
// 31498
o24.cancelBubble = false;
// 31501
f81632121_467.returns.push(1374851252457);
// 31503
o24.returnValue = true;
// undefined
o24 = null;
// 31504
o24 = {};
// 31507
o24.cancelBubble = false;
// 31510
f81632121_467.returns.push(1374851252473);
// 31512
o24.returnValue = true;
// undefined
o24 = null;
// 31513
o24 = {};
// 31516
o24.cancelBubble = false;
// 31519
f81632121_467.returns.push(1374851252489);
// 31521
o24.returnValue = true;
// undefined
o24 = null;
// 31522
o24 = {};
// 31525
o24.cancelBubble = false;
// 31528
f81632121_467.returns.push(1374851252505);
// 31530
o24.returnValue = true;
// undefined
o24 = null;
// 31531
o24 = {};
// 31534
o24.cancelBubble = false;
// 31537
f81632121_467.returns.push(1374851252521);
// 31539
o24.returnValue = true;
// undefined
o24 = null;
// 31540
o24 = {};
// 31543
o24.cancelBubble = false;
// 31546
f81632121_467.returns.push(1374851252529);
// 31548
o24.returnValue = true;
// undefined
o24 = null;
// 31549
o24 = {};
// 31552
o24.cancelBubble = false;
// 31555
f81632121_467.returns.push(1374851252545);
// 31557
o24.returnValue = true;
// undefined
o24 = null;
// 31558
o24 = {};
// 31561
o24.cancelBubble = false;
// 31564
f81632121_467.returns.push(1374851252552);
// 31566
o24.returnValue = true;
// undefined
o24 = null;
// 31567
o24 = {};
// 31570
o24.cancelBubble = false;
// 31573
f81632121_467.returns.push(1374851252569);
// 31575
o24.returnValue = true;
// undefined
o24 = null;
// 31576
o24 = {};
// 31579
o24.cancelBubble = false;
// 31582
f81632121_467.returns.push(1374851252577);
// 31584
o24.returnValue = true;
// undefined
o24 = null;
// 31585
o24 = {};
// 31588
o24.cancelBubble = false;
// 31591
f81632121_467.returns.push(1374851252603);
// 31593
o24.returnValue = true;
// undefined
o24 = null;
// 31594
o24 = {};
// 31597
o24.cancelBubble = false;
// 31600
f81632121_467.returns.push(1374851252605);
// 31602
o24.returnValue = true;
// undefined
o24 = null;
// 31603
o24 = {};
// 31606
o24.cancelBubble = false;
// 31609
f81632121_467.returns.push(1374851252616);
// 31611
o24.returnValue = true;
// undefined
o24 = null;
// 31612
o24 = {};
// 31615
o24.cancelBubble = false;
// 31618
f81632121_467.returns.push(1374851252625);
// 31620
o24.returnValue = true;
// undefined
o24 = null;
// 31621
o24 = {};
// 31624
o24.cancelBubble = false;
// 31627
f81632121_467.returns.push(1374851252641);
// 31629
o24.returnValue = true;
// undefined
o24 = null;
// 31630
o24 = {};
// 31633
o24.cancelBubble = false;
// 31636
f81632121_467.returns.push(1374851252657);
// 31638
o24.returnValue = true;
// undefined
o24 = null;
// 31639
o24 = {};
// 31642
o24.cancelBubble = false;
// 31645
f81632121_467.returns.push(1374851252664);
// 31647
o24.returnValue = true;
// undefined
o24 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 31649
o24 = {};
// 31652
o24.cancelBubble = false;
// 31655
f81632121_467.returns.push(1374851252681);
// 31657
o24.returnValue = true;
// undefined
o24 = null;
// 31658
o24 = {};
// 31661
o24.cancelBubble = false;
// 31664
f81632121_467.returns.push(1374851252696);
// 31666
o24.returnValue = true;
// undefined
o24 = null;
// 31667
o24 = {};
// 31670
o24.cancelBubble = false;
// 31673
f81632121_467.returns.push(1374851252712);
// 31675
o24.returnValue = true;
// undefined
o24 = null;
// 31676
o24 = {};
// 31679
o24.cancelBubble = false;
// 31682
f81632121_467.returns.push(1374851252720);
// 31684
o24.returnValue = true;
// undefined
o24 = null;
// 31685
o24 = {};
// 31688
o24.cancelBubble = false;
// 31691
f81632121_467.returns.push(1374851252743);
// 31693
o24.returnValue = true;
// undefined
o24 = null;
// 31694
o24 = {};
// 31697
o24.cancelBubble = false;
// 31700
f81632121_467.returns.push(1374851252746);
// 31702
o24.returnValue = true;
// undefined
o24 = null;
// 31704
f81632121_12.returns.push(144);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 31709
f81632121_467.returns.push(1374851253061);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 31714
f81632121_467.returns.push(1374851253895);
// 31716
f81632121_467.returns.push(1374851253895);
// 31718
f81632121_467.returns.push(1374851253895);
// 31720
f81632121_12.returns.push(145);
// 31723
f81632121_467.returns.push(1374851254022);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 31727
f81632121_467.returns.push(1374851254062);
// 31728
o24 = {};
// 31732
f81632121_467.returns.push(1374851254134);
// 31737
f81632121_467.returns.push(1374851254136);
// 31741
f81632121_467.returns.push(1374851254136);
// 31743
o24.cancelBubble = false;
// 31744
o24.returnValue = true;
// 31747
o24.srcElement = o52;
// 31749
o24.target = o52;
// 31756
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31759
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31760
o24.JSBNG__screenX = 851;
// 31761
o24.JSBNG__screenY = 606;
// 31762
o24.altKey = false;
// 31763
o24.bubbles = true;
// 31764
o24.button = 0;
// 31765
o24.buttons = void 0;
// 31766
o24.cancelable = false;
// 31767
o24.clientX = 783;
// 31768
o24.clientY = 441;
// 31769
o24.ctrlKey = false;
// 31770
o24.currentTarget = o0;
// 31771
o24.defaultPrevented = false;
// 31772
o24.detail = 0;
// 31773
o24.eventPhase = 3;
// 31774
o24.isTrusted = void 0;
// 31775
o24.metaKey = false;
// 31776
o24.pageX = 783;
// 31777
o24.pageY = 2827;
// 31778
o24.relatedTarget = null;
// 31779
o24.fromElement = null;
// 31782
o24.shiftKey = false;
// 31785
o24.timeStamp = 1374851254134;
// 31786
o24.type = "mousemove";
// 31787
o24.view = ow81632121;
// undefined
o24 = null;
// 31801
f81632121_1852.returns.push(undefined);
// 31804
f81632121_14.returns.push(undefined);
// 31805
f81632121_12.returns.push(146);
// 31808
o24 = {};
// 31812
f81632121_467.returns.push(1374851254153);
// 31813
o24.cancelBubble = false;
// 31814
o24.returnValue = true;
// 31817
o24.srcElement = o52;
// 31819
o24.target = o52;
// 31826
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31829
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31830
o24.JSBNG__screenX = 874;
// 31831
o24.JSBNG__screenY = 599;
// 31832
o24.altKey = false;
// 31833
o24.bubbles = true;
// 31834
o24.button = 0;
// 31835
o24.buttons = void 0;
// 31836
o24.cancelable = false;
// 31837
o24.clientX = 806;
// 31838
o24.clientY = 434;
// 31839
o24.ctrlKey = false;
// 31840
o24.currentTarget = o0;
// 31841
o24.defaultPrevented = false;
// 31842
o24.detail = 0;
// 31843
o24.eventPhase = 3;
// 31844
o24.isTrusted = void 0;
// 31845
o24.metaKey = false;
// 31846
o24.pageX = 806;
// 31847
o24.pageY = 2820;
// 31848
o24.relatedTarget = null;
// 31849
o24.fromElement = null;
// 31852
o24.shiftKey = false;
// 31855
o24.timeStamp = 1374851254152;
// 31856
o24.type = "mousemove";
// 31857
o24.view = ow81632121;
// undefined
o24 = null;
// 31871
f81632121_1852.returns.push(undefined);
// 31874
f81632121_14.returns.push(undefined);
// 31875
f81632121_12.returns.push(147);
// 31878
o24 = {};
// 31881
o24.srcElement = o52;
// 31883
o24.target = o52;
// 31890
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31893
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31894
o24.relatedTarget = o53;
// 31895
o53.parentNode = o39;
// undefined
o39 = null;
// 31896
o53.nodeType = 1;
// 31899
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 31902
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}.[0].[right].[0].[left].[0].[0]");
// 31905
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 31906
o24.JSBNG__screenX = 893;
// 31907
o24.JSBNG__screenY = 593;
// 31908
o24.altKey = false;
// 31909
o24.bubbles = true;
// 31910
o24.button = 0;
// 31911
o24.buttons = void 0;
// 31912
o24.cancelable = true;
// 31913
o24.clientX = 825;
// 31914
o24.clientY = 428;
// 31915
o24.ctrlKey = false;
// 31916
o24.currentTarget = o0;
// 31917
o24.defaultPrevented = false;
// 31918
o24.detail = 0;
// 31919
o24.eventPhase = 3;
// 31920
o24.isTrusted = void 0;
// 31921
o24.metaKey = false;
// 31922
o24.pageX = 825;
// 31923
o24.pageY = 2814;
// 31925
o24.shiftKey = false;
// 31928
o24.timeStamp = 1374851254159;
// 31929
o24.type = "mouseout";
// 31930
o24.view = ow81632121;
// 31932
o24.returnValue = true;
// 31969
o24.cancelBubble = false;
// undefined
o24 = null;
// 31971
o24 = {};
// 31974
o24.cancelBubble = false;
// 31977
f81632121_467.returns.push(1374851254184);
// 31980
f81632121_1007.returns.push(undefined);
// 31982
o24.returnValue = true;
// 31985
o24.srcElement = o53;
// 31987
o24.target = o53;
// 31994
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 31997
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 31998
o24.relatedTarget = o52;
// undefined
o24 = null;
// undefined
o52 = null;
// 31999
o53.nodeName = "LI";
// 32006
o24 = {};
// 32010
f81632121_467.returns.push(1374851254194);
// 32011
o24.cancelBubble = false;
// 32012
o24.returnValue = true;
// 32015
o24.srcElement = o53;
// 32017
o24.target = o53;
// 32024
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 32027
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 32028
o24.JSBNG__screenX = 893;
// 32029
o24.JSBNG__screenY = 593;
// 32030
o24.altKey = false;
// 32031
o24.bubbles = true;
// 32032
o24.button = 0;
// 32033
o24.buttons = void 0;
// 32034
o24.cancelable = false;
// 32035
o24.clientX = 825;
// 32036
o24.clientY = 428;
// 32037
o24.ctrlKey = false;
// 32038
o24.currentTarget = o0;
// 32039
o24.defaultPrevented = false;
// 32040
o24.detail = 0;
// 32041
o24.eventPhase = 3;
// 32042
o24.isTrusted = void 0;
// 32043
o24.metaKey = false;
// 32044
o24.pageX = 825;
// 32045
o24.pageY = 2814;
// 32046
o24.relatedTarget = null;
// 32047
o24.fromElement = null;
// 32050
o24.shiftKey = false;
// 32053
o24.timeStamp = 1374851254194;
// 32054
o24.type = "mousemove";
// 32055
o24.view = ow81632121;
// undefined
o24 = null;
// 32069
f81632121_1852.returns.push(undefined);
// 32072
f81632121_14.returns.push(undefined);
// 32073
f81632121_12.returns.push(148);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 32077
o24 = {};
// 32080
o24.srcElement = o53;
// 32082
o24.target = o53;
// 32089
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 32092
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 32093
o24.relatedTarget = o109;
// 32098
f81632121_506.returns.push(null);
// 32104
f81632121_506.returns.push(null);
// 32110
f81632121_506.returns.push(null);
// 32116
f81632121_506.returns.push(null);
// 32122
f81632121_506.returns.push(null);
// 32128
f81632121_506.returns.push(null);
// 32134
f81632121_506.returns.push(null);
// 32140
f81632121_506.returns.push(null);
// 32147
f81632121_506.returns.push(".r[70hf].[1][4][1]{comment10200343222477260_4947623}");
// 32148
o24.JSBNG__screenX = 1058;
// 32149
o24.JSBNG__screenY = 583;
// 32150
o24.altKey = false;
// 32151
o24.bubbles = true;
// 32152
o24.button = 0;
// 32153
o24.buttons = void 0;
// 32154
o24.cancelable = true;
// 32155
o24.clientX = 990;
// 32156
o24.clientY = 418;
// 32157
o24.ctrlKey = false;
// 32158
o24.currentTarget = o0;
// 32159
o24.defaultPrevented = false;
// 32160
o24.detail = 0;
// 32161
o24.eventPhase = 3;
// 32162
o24.isTrusted = void 0;
// 32163
o24.metaKey = false;
// 32164
o24.pageX = 990;
// 32165
o24.pageY = 2804;
// 32167
o24.shiftKey = false;
// 32170
o24.timeStamp = 1374851254205;
// 32171
o24.type = "mouseout";
// 32172
o24.view = ow81632121;
// 32174
o24.returnValue = true;
// 32211
o24.cancelBubble = false;
// undefined
o24 = null;
// 32213
o24 = {};
// 32216
o24.cancelBubble = false;
// 32219
f81632121_467.returns.push(1374851254246);
// 32222
f81632121_1007.returns.push(undefined);
// 32224
o24.returnValue = true;
// 32227
o24.srcElement = o109;
// 32229
o24.target = o109;
// 32236
f81632121_506.returns.push(null);
// 32242
f81632121_506.returns.push(null);
// 32248
f81632121_506.returns.push(null);
// 32254
f81632121_506.returns.push(null);
// 32260
f81632121_506.returns.push(null);
// 32266
f81632121_506.returns.push(null);
// 32272
f81632121_506.returns.push(null);
// 32278
f81632121_506.returns.push(null);
// 32283
o24.relatedTarget = o53;
// undefined
o24 = null;
// undefined
o53 = null;
// 32286
o24 = {};
// 32290
f81632121_467.returns.push(1374851254248);
// 32291
o24.cancelBubble = false;
// 32292
o24.returnValue = true;
// 32295
o24.srcElement = o109;
// 32297
o24.target = o109;
// 32304
f81632121_506.returns.push(null);
// 32310
f81632121_506.returns.push(null);
// 32316
f81632121_506.returns.push(null);
// 32322
f81632121_506.returns.push(null);
// 32328
f81632121_506.returns.push(null);
// 32334
f81632121_506.returns.push(null);
// 32340
f81632121_506.returns.push(null);
// 32346
f81632121_506.returns.push(null);
// 32351
o24.JSBNG__screenX = 1058;
// 32352
o24.JSBNG__screenY = 583;
// 32353
o24.altKey = false;
// 32354
o24.bubbles = true;
// 32355
o24.button = 0;
// 32356
o24.buttons = void 0;
// 32357
o24.cancelable = false;
// 32358
o24.clientX = 990;
// 32359
o24.clientY = 418;
// 32360
o24.ctrlKey = false;
// 32361
o24.currentTarget = o0;
// 32362
o24.defaultPrevented = false;
// 32363
o24.detail = 0;
// 32364
o24.eventPhase = 3;
// 32365
o24.isTrusted = void 0;
// 32366
o24.metaKey = false;
// 32367
o24.pageX = 990;
// 32368
o24.pageY = 2804;
// 32369
o24.relatedTarget = null;
// 32370
o24.fromElement = null;
// 32373
o24.shiftKey = false;
// 32376
o24.timeStamp = 1374851254248;
// 32377
o24.type = "mousemove";
// 32378
o24.view = ow81632121;
// undefined
o24 = null;
// 32387
f81632121_1852.returns.push(undefined);
// 32390
f81632121_14.returns.push(undefined);
// 32393
f81632121_12.returns.push(149);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 32398
f81632121_12.returns.push(150);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 32403
f81632121_467.returns.push(1374851255093);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 32407
f81632121_12.returns.push(151);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 32412
f81632121_467.returns.push(1374851256085);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 32420
f81632121_467.returns.push(1374851256937);
// 32425
f81632121_467.returns.push(1374851256939);
// 32429
f81632121_467.returns.push(1374851256939);
// 32432
f81632121_1007.returns.push(undefined);
// 32438
f81632121_467.returns.push(1374851256941);
// 32445
f81632121_1852.returns.push(undefined);
// 32447
f81632121_14.returns.push(undefined);
// 32448
f81632121_12.returns.push(152);
// 32449
f81632121_12.returns.push(153);
// 32451
o24 = {};
// 32455
f81632121_467.returns.push(1374851256947);
// 32456
o24.cancelBubble = false;
// 32457
o24.returnValue = true;
// 32460
o24.srcElement = o183;
// 32462
o24.target = o183;
// 32464
o183.nodeType = 1;
// 32467
o183.getAttribute = f81632121_506;
// 32469
f81632121_506.returns.push(null);
// 32472
o42.nodeType = 1;
// 32473
o42.getAttribute = f81632121_506;
// 32475
f81632121_506.returns.push(null);
// 32478
o29.nodeType = 1;
// 32481
f81632121_506.returns.push(null);
// 32484
o87.nodeType = 1;
// 32485
o87.getAttribute = f81632121_506;
// 32487
f81632121_506.returns.push(null);
// 32493
f81632121_506.returns.push(null);
// 32499
f81632121_506.returns.push(null);
// 32505
f81632121_506.returns.push(null);
// 32511
f81632121_506.returns.push(null);
// 32517
f81632121_506.returns.push(null);
// 32523
f81632121_506.returns.push(null);
// 32529
f81632121_506.returns.push(null);
// 32535
f81632121_506.returns.push(null);
// 32541
f81632121_506.returns.push(null);
// 32547
f81632121_506.returns.push(null);
// 32553
f81632121_506.returns.push(null);
// 32558
o24.JSBNG__screenX = 287;
// 32559
o24.JSBNG__screenY = 572;
// 32560
o24.altKey = false;
// 32561
o24.bubbles = true;
// 32562
o24.button = 0;
// 32563
o24.buttons = void 0;
// 32564
o24.cancelable = false;
// 32565
o24.clientX = 219;
// 32566
o24.clientY = 407;
// 32567
o24.ctrlKey = false;
// 32568
o24.currentTarget = o0;
// 32569
o24.defaultPrevented = false;
// 32570
o24.detail = 0;
// 32571
o24.eventPhase = 3;
// 32572
o24.isTrusted = void 0;
// 32573
o24.metaKey = false;
// 32574
o24.pageX = 219;
// 32575
o24.pageY = 2793;
// 32576
o24.relatedTarget = null;
// 32577
o24.fromElement = null;
// 32580
o24.shiftKey = false;
// 32583
o24.timeStamp = 1374851256946;
// 32584
o24.type = "mousemove";
// 32585
o24.view = ow81632121;
// undefined
o24 = null;
// 32594
f81632121_1852.returns.push(undefined);
// 32597
f81632121_14.returns.push(undefined);
// 32598
f81632121_12.returns.push(154);
// 32601
o24 = {};
// 32605
f81632121_467.returns.push(1374851257018);
// 32606
o24.cancelBubble = false;
// 32607
o24.returnValue = true;
// 32610
o24.srcElement = o183;
// 32612
o24.target = o183;
// 32619
f81632121_506.returns.push(null);
// 32625
f81632121_506.returns.push(null);
// 32631
f81632121_506.returns.push(null);
// 32637
f81632121_506.returns.push(null);
// 32643
f81632121_506.returns.push(null);
// 32649
f81632121_506.returns.push(null);
// 32655
f81632121_506.returns.push(null);
// 32661
f81632121_506.returns.push(null);
// 32667
f81632121_506.returns.push(null);
// 32673
f81632121_506.returns.push(null);
// 32679
f81632121_506.returns.push(null);
// 32685
f81632121_506.returns.push(null);
// 32691
f81632121_506.returns.push(null);
// 32697
f81632121_506.returns.push(null);
// 32703
f81632121_506.returns.push(null);
// 32708
o24.JSBNG__screenX = 240;
// 32709
o24.JSBNG__screenY = 572;
// 32710
o24.altKey = false;
// 32711
o24.bubbles = true;
// 32712
o24.button = 0;
// 32713
o24.buttons = void 0;
// 32714
o24.cancelable = false;
// 32715
o24.clientX = 172;
// 32716
o24.clientY = 407;
// 32717
o24.ctrlKey = false;
// 32718
o24.currentTarget = o0;
// 32719
o24.defaultPrevented = false;
// 32720
o24.detail = 0;
// 32721
o24.eventPhase = 3;
// 32722
o24.isTrusted = void 0;
// 32723
o24.metaKey = false;
// 32724
o24.pageX = 172;
// 32725
o24.pageY = 2793;
// 32726
o24.relatedTarget = null;
// 32727
o24.fromElement = null;
// 32730
o24.shiftKey = false;
// 32733
o24.timeStamp = 1374851257007;
// 32734
o24.type = "mousemove";
// 32735
o24.view = ow81632121;
// undefined
o24 = null;
// 32744
f81632121_1852.returns.push(undefined);
// 32747
f81632121_14.returns.push(undefined);
// 32748
f81632121_12.returns.push(155);
// 32751
o24 = {};
// 32755
f81632121_467.returns.push(1374851257041);
// 32756
o24.cancelBubble = false;
// 32757
o24.returnValue = true;
// 32760
o24.srcElement = o183;
// 32762
o24.target = o183;
// 32769
f81632121_506.returns.push(null);
// 32775
f81632121_506.returns.push(null);
// 32781
f81632121_506.returns.push(null);
// 32787
f81632121_506.returns.push(null);
// 32793
f81632121_506.returns.push(null);
// 32799
f81632121_506.returns.push(null);
// 32805
f81632121_506.returns.push(null);
// 32811
f81632121_506.returns.push(null);
// 32817
f81632121_506.returns.push(null);
// 32823
f81632121_506.returns.push(null);
// 32829
f81632121_506.returns.push(null);
// 32835
f81632121_506.returns.push(null);
// 32841
f81632121_506.returns.push(null);
// 32847
f81632121_506.returns.push(null);
// 32853
f81632121_506.returns.push(null);
// 32858
o24.JSBNG__screenX = 229;
// 32859
o24.JSBNG__screenY = 572;
// 32860
o24.altKey = false;
// 32861
o24.bubbles = true;
// 32862
o24.button = 0;
// 32863
o24.buttons = void 0;
// 32864
o24.cancelable = false;
// 32865
o24.clientX = 161;
// 32866
o24.clientY = 407;
// 32867
o24.ctrlKey = false;
// 32868
o24.currentTarget = o0;
// 32869
o24.defaultPrevented = false;
// 32870
o24.detail = 0;
// 32871
o24.eventPhase = 3;
// 32872
o24.isTrusted = void 0;
// 32873
o24.metaKey = false;
// 32874
o24.pageX = 161;
// 32875
o24.pageY = 2793;
// 32876
o24.relatedTarget = null;
// 32877
o24.fromElement = null;
// 32880
o24.shiftKey = false;
// 32883
o24.timeStamp = 1374851257041;
// 32884
o24.type = "mousemove";
// 32885
o24.view = ow81632121;
// undefined
o24 = null;
// 32894
f81632121_1852.returns.push(undefined);
// 32897
f81632121_14.returns.push(undefined);
// 32898
f81632121_12.returns.push(156);
// 32901
o24 = {};
// 32905
f81632121_467.returns.push(1374851257056);
// 32906
o24.cancelBubble = false;
// 32907
o24.returnValue = true;
// 32910
o24.srcElement = o183;
// 32912
o24.target = o183;
// 32919
f81632121_506.returns.push(null);
// 32925
f81632121_506.returns.push(null);
// 32931
f81632121_506.returns.push(null);
// 32937
f81632121_506.returns.push(null);
// 32943
f81632121_506.returns.push(null);
// 32949
f81632121_506.returns.push(null);
// 32955
f81632121_506.returns.push(null);
// 32961
f81632121_506.returns.push(null);
// 32967
f81632121_506.returns.push(null);
// 32973
f81632121_506.returns.push(null);
// 32979
f81632121_506.returns.push(null);
// 32985
f81632121_506.returns.push(null);
// 32991
f81632121_506.returns.push(null);
// 32997
f81632121_506.returns.push(null);
// 33003
f81632121_506.returns.push(null);
// 33008
o24.JSBNG__screenX = 226;
// 33009
o24.JSBNG__screenY = 573;
// 33010
o24.altKey = false;
// 33011
o24.bubbles = true;
// 33012
o24.button = 0;
// 33013
o24.buttons = void 0;
// 33014
o24.cancelable = false;
// 33015
o24.clientX = 158;
// 33016
o24.clientY = 408;
// 33017
o24.ctrlKey = false;
// 33018
o24.currentTarget = o0;
// 33019
o24.defaultPrevented = false;
// 33020
o24.detail = 0;
// 33021
o24.eventPhase = 3;
// 33022
o24.isTrusted = void 0;
// 33023
o24.metaKey = false;
// 33024
o24.pageX = 158;
// 33025
o24.pageY = 2794;
// 33026
o24.relatedTarget = null;
// 33027
o24.fromElement = null;
// 33030
o24.shiftKey = false;
// 33033
o24.timeStamp = 1374851257055;
// 33034
o24.type = "mousemove";
// 33035
o24.view = ow81632121;
// undefined
o24 = null;
// 33044
f81632121_1852.returns.push(undefined);
// 33047
f81632121_14.returns.push(undefined);
// 33048
f81632121_12.returns.push(157);
// 33051
o24 = {};
// 33055
f81632121_467.returns.push(1374851257078);
// 33056
o24.cancelBubble = false;
// 33057
o24.returnValue = true;
// 33060
o24.srcElement = o183;
// 33062
o24.target = o183;
// 33069
f81632121_506.returns.push(null);
// 33075
f81632121_506.returns.push(null);
// 33081
f81632121_506.returns.push(null);
// 33087
f81632121_506.returns.push(null);
// 33093
f81632121_506.returns.push(null);
// 33099
f81632121_506.returns.push(null);
// 33105
f81632121_506.returns.push(null);
// 33111
f81632121_506.returns.push(null);
// 33117
f81632121_506.returns.push(null);
// 33123
f81632121_506.returns.push(null);
// 33129
f81632121_506.returns.push(null);
// 33135
f81632121_506.returns.push(null);
// 33141
f81632121_506.returns.push(null);
// 33147
f81632121_506.returns.push(null);
// 33153
f81632121_506.returns.push(null);
// 33158
o24.JSBNG__screenX = 224;
// 33159
o24.JSBNG__screenY = 573;
// 33160
o24.altKey = false;
// 33161
o24.bubbles = true;
// 33162
o24.button = 0;
// 33163
o24.buttons = void 0;
// 33164
o24.cancelable = false;
// 33165
o24.clientX = 156;
// 33166
o24.clientY = 408;
// 33167
o24.ctrlKey = false;
// 33168
o24.currentTarget = o0;
// 33169
o24.defaultPrevented = false;
// 33170
o24.detail = 0;
// 33171
o24.eventPhase = 3;
// 33172
o24.isTrusted = void 0;
// 33173
o24.metaKey = false;
// 33174
o24.pageX = 156;
// 33175
o24.pageY = 2794;
// 33176
o24.relatedTarget = null;
// 33177
o24.fromElement = null;
// 33180
o24.shiftKey = false;
// 33183
o24.timeStamp = 1374851257078;
// 33184
o24.type = "mousemove";
// 33185
o24.view = ow81632121;
// undefined
o24 = null;
// 33194
f81632121_1852.returns.push(undefined);
// 33197
f81632121_14.returns.push(undefined);
// 33198
f81632121_12.returns.push(158);
// 33201
o24 = {};
// 33205
f81632121_467.returns.push(1374851257091);
// 33206
o24.cancelBubble = false;
// 33207
o24.returnValue = true;
// 33210
o24.srcElement = o183;
// 33212
o24.target = o183;
// 33219
f81632121_506.returns.push(null);
// 33225
f81632121_506.returns.push(null);
// 33231
f81632121_506.returns.push(null);
// 33237
f81632121_506.returns.push(null);
// 33243
f81632121_506.returns.push(null);
// 33249
f81632121_506.returns.push(null);
// 33255
f81632121_506.returns.push(null);
// 33261
f81632121_506.returns.push(null);
// 33267
f81632121_506.returns.push(null);
// 33273
f81632121_506.returns.push(null);
// 33279
f81632121_506.returns.push(null);
// 33285
f81632121_506.returns.push(null);
// 33291
f81632121_506.returns.push(null);
// 33297
f81632121_506.returns.push(null);
// 33303
f81632121_506.returns.push(null);
// 33308
o24.JSBNG__screenX = 222;
// 33309
o24.JSBNG__screenY = 574;
// 33310
o24.altKey = false;
// 33311
o24.bubbles = true;
// 33312
o24.button = 0;
// 33313
o24.buttons = void 0;
// 33314
o24.cancelable = false;
// 33315
o24.clientX = 154;
// 33316
o24.clientY = 409;
// 33317
o24.ctrlKey = false;
// 33318
o24.currentTarget = o0;
// 33319
o24.defaultPrevented = false;
// 33320
o24.detail = 0;
// 33321
o24.eventPhase = 3;
// 33322
o24.isTrusted = void 0;
// 33323
o24.metaKey = false;
// 33324
o24.pageX = 154;
// 33325
o24.pageY = 2795;
// 33326
o24.relatedTarget = null;
// 33327
o24.fromElement = null;
// 33330
o24.shiftKey = false;
// 33333
o24.timeStamp = 1374851257090;
// 33334
o24.type = "mousemove";
// 33335
o24.view = ow81632121;
// undefined
o24 = null;
// 33344
f81632121_1852.returns.push(undefined);
// 33347
f81632121_14.returns.push(undefined);
// 33348
f81632121_12.returns.push(159);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 33354
f81632121_467.returns.push(1374851257106);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 33356
o24 = {};
// 33359
o24.cancelBubble = false;
// 33360
o24.returnValue = true;
// 33363
o24.srcElement = o183;
// 33365
o24.target = o183;
// 33372
f81632121_506.returns.push(null);
// 33378
f81632121_506.returns.push(null);
// 33384
f81632121_506.returns.push(null);
// 33390
f81632121_506.returns.push(null);
// 33396
f81632121_506.returns.push(null);
// 33402
f81632121_506.returns.push(null);
// 33408
f81632121_506.returns.push(null);
// 33414
f81632121_506.returns.push(null);
// 33420
f81632121_506.returns.push(null);
// 33426
f81632121_506.returns.push(null);
// 33432
f81632121_506.returns.push(null);
// 33438
f81632121_506.returns.push(null);
// 33444
f81632121_506.returns.push(null);
// 33450
f81632121_506.returns.push(null);
// 33456
f81632121_506.returns.push(null);
// 33461
o24.JSBNG__screenX = 222;
// 33462
o24.JSBNG__screenY = 574;
// 33463
o24.altKey = false;
// 33464
o24.bubbles = true;
// 33465
o24.button = 0;
// 33466
o24.buttons = void 0;
// 33467
o24.cancelable = true;
// 33468
o24.clientX = 154;
// 33469
o24.clientY = 409;
// 33470
o24.ctrlKey = false;
// 33471
o24.currentTarget = o0;
// 33472
o24.defaultPrevented = false;
// 33473
o24.detail = 1;
// 33474
o24.eventPhase = 3;
// 33475
o24.isTrusted = void 0;
// 33476
o24.metaKey = false;
// 33477
o24.pageX = 154;
// 33478
o24.pageY = 2795;
// 33479
o24.relatedTarget = null;
// 33480
o24.fromElement = null;
// 33483
o24.shiftKey = false;
// 33486
o24.timeStamp = 1374851257660;
// 33487
o24.type = "mousedown";
// 33488
o24.view = ow81632121;
// undefined
o24 = null;
// 33495
o24 = {};
// 33498
o24.cancelBubble = false;
// 33499
o24.returnValue = true;
// 33502
o24.srcElement = o183;
// 33504
o24.target = o183;
// 33511
f81632121_506.returns.push(null);
// 33517
f81632121_506.returns.push(null);
// 33523
f81632121_506.returns.push(null);
// 33529
f81632121_506.returns.push(null);
// 33535
f81632121_506.returns.push(null);
// 33541
f81632121_506.returns.push(null);
// 33547
f81632121_506.returns.push(null);
// 33553
f81632121_506.returns.push(null);
// 33559
f81632121_506.returns.push(null);
// 33565
f81632121_506.returns.push(null);
// 33571
f81632121_506.returns.push(null);
// 33577
f81632121_506.returns.push(null);
// 33583
f81632121_506.returns.push(null);
// 33589
f81632121_506.returns.push(null);
// 33595
f81632121_506.returns.push(null);
// 33600
o24.JSBNG__screenX = 222;
// 33601
o24.JSBNG__screenY = 574;
// 33602
o24.altKey = false;
// 33603
o24.bubbles = true;
// 33604
o24.button = 0;
// 33605
o24.buttons = void 0;
// 33606
o24.cancelable = true;
// 33607
o24.clientX = 154;
// 33608
o24.clientY = 409;
// 33609
o24.ctrlKey = false;
// 33610
o24.currentTarget = o0;
// 33611
o24.defaultPrevented = false;
// 33612
o24.detail = 1;
// 33613
o24.eventPhase = 3;
// 33614
o24.isTrusted = void 0;
// 33615
o24.metaKey = false;
// 33616
o24.pageX = 154;
// 33617
o24.pageY = 2795;
// 33618
o24.relatedTarget = null;
// 33619
o24.fromElement = null;
// 33622
o24.shiftKey = false;
// 33625
o24.timeStamp = 1374851257671;
// 33626
o24.type = "mouseup";
// 33627
o24.view = ow81632121;
// undefined
o24 = null;
// 33634
o24 = {};
// 33637
f81632121_467.returns.push(1374851257676);
// 33638
o24.type = "click";
// 33648
f81632121_467.returns.push(1374851257677);
// 33653
f81632121_467.returns.push(1374851257681);
// 33657
f81632121_467.returns.push(1374851257682);
// 33665
f81632121_1852.returns.push(undefined);
// 33667
f81632121_14.returns.push(undefined);
// 33668
f81632121_12.returns.push(160);
// 33669
f81632121_12.returns.push(161);
// 33670
f81632121_12.returns.push(162);
// 33672
f81632121_467.returns.push(1374851257684);
// 33676
o24.cancelBubble = false;
// 33677
o24.returnValue = true;
// 33680
f81632121_467.returns.push(1374851257686);
// 33681
f81632121_14.returns.push(undefined);
// 33682
f81632121_12.returns.push(163);
// 33684
f81632121_467.returns.push(1374851257687);
// 33692
f81632121_467.returns.push(1374851257687);
// 33696
o24.target = o183;
// 33699
f81632121_506.returns.push(null);
// 33703
f81632121_506.returns.push(null);
// 33707
f81632121_506.returns.push(null);
// 33711
f81632121_506.returns.push(null);
// 33715
f81632121_506.returns.push(null);
// 33719
f81632121_506.returns.push(null);
// 33723
f81632121_506.returns.push(null);
// 33727
f81632121_506.returns.push(null);
// 33731
f81632121_506.returns.push(null);
// 33735
f81632121_506.returns.push(null);
// 33739
f81632121_506.returns.push(null);
// 33743
f81632121_506.returns.push(null);
// 33747
f81632121_506.returns.push(null);
// 33751
f81632121_506.returns.push(null);
// 33755
f81632121_506.returns.push(null);
// 33759
o183.nodeName = "DIV";
// 33761
o42.nodeName = "DIV";
// undefined
o42 = null;
// 33763
o29.nodeName = "DIV";
// undefined
o29 = null;
// 33765
o87.nodeName = "DIV";
// undefined
o87 = null;
// 33767
o21.nodeName = "DIV";
// undefined
o21 = null;
// 33769
o20.nodeName = "DIV";
// undefined
o20 = null;
// 33771
o45.nodeName = "DIV";
// undefined
o45 = null;
// 33773
o109.nodeName = "DIV";
// undefined
o109 = null;
// 33775
o110.nodeName = "DIV";
// undefined
o110 = null;
// 33777
o111.nodeName = "DIV";
// undefined
o111 = null;
// 33779
o112.nodeName = "DIV";
// undefined
o112 = null;
// 33781
o113.nodeName = "DIV";
// undefined
o113 = null;
// 33783
o82.nodeName = "DIV";
// undefined
o82 = null;
// 33791
f81632121_1005.returns.push(undefined);
// 33796
f81632121_467.returns.push(1374851257692);
// 33797
f81632121_14.returns.push(undefined);
// 33798
f81632121_12.returns.push(164);
// 33800
f81632121_467.returns.push(1374851257692);
// 33803
o24.srcElement = o183;
// 33812
f81632121_506.returns.push(null);
// 33818
f81632121_506.returns.push(null);
// 33824
f81632121_506.returns.push(null);
// 33830
f81632121_506.returns.push(null);
// 33836
f81632121_506.returns.push(null);
// 33842
f81632121_506.returns.push(null);
// 33848
f81632121_506.returns.push(null);
// 33854
f81632121_506.returns.push(null);
// 33860
f81632121_506.returns.push(null);
// 33866
f81632121_506.returns.push(null);
// 33872
f81632121_506.returns.push(null);
// 33878
f81632121_506.returns.push(null);
// 33884
f81632121_506.returns.push(null);
// 33890
f81632121_506.returns.push(null);
// 33896
f81632121_506.returns.push(null);
// 33901
o24.JSBNG__screenX = 222;
// 33902
o24.JSBNG__screenY = 574;
// 33903
o24.altKey = false;
// 33904
o24.bubbles = true;
// 33905
o24.button = 0;
// 33906
o24.buttons = void 0;
// 33907
o24.cancelable = true;
// 33908
o24.clientX = 154;
// 33909
o24.clientY = 409;
// 33910
o24.ctrlKey = false;
// 33911
o24.currentTarget = o0;
// 33912
o24.defaultPrevented = false;
// 33913
o24.detail = 1;
// 33914
o24.eventPhase = 3;
// 33915
o24.isTrusted = void 0;
// 33916
o24.metaKey = false;
// 33917
o24.pageX = 154;
// 33918
o24.pageY = 2795;
// 33919
o24.relatedTarget = null;
// 33920
o24.fromElement = null;
// 33923
o24.shiftKey = false;
// 33926
o24.timeStamp = 1374851257676;
// 33928
o24.view = ow81632121;
// undefined
o24 = null;
// 33935
f81632121_12.returns.push(165);
// 33938
o20 = {};
// 33941
o20.srcElement = o0;
// 33943
o20.target = o0;
// 33949
o20.cancelBubble = false;
// 33952
o20.returnValue = true;
// undefined
o20 = null;
// 33955
f81632121_467.returns.push(1374851257703);
// 33956
// undefined
o1 = null;
// 33957
f81632121_12.returns.push(166);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 33962
f81632121_12.returns.push(167);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 33967
f81632121_467.returns.push(1374851258116);
// 33968
o1 = {};
// 33971
o1.cancelBubble = false;
// 33974
f81632121_467.returns.push(1374851258127);
// 33976
o1.returnValue = true;
// undefined
o1 = null;
// 33977
o1 = {};
// 33980
o1.cancelBubble = false;
// 33983
f81632121_467.returns.push(1374851258146);
// 33985
o1.returnValue = true;
// undefined
o1 = null;
// 33986
o1 = {};
// 33989
o1.cancelBubble = false;
// 33992
f81632121_467.returns.push(1374851258174);
// 33994
o1.returnValue = true;
// undefined
o1 = null;
// 33995
o1 = {};
// 33998
o1.cancelBubble = false;
// 34001
f81632121_467.returns.push(1374851258200);
// 34006
f81632121_467.returns.push(1374851258202);
// 34010
f81632121_467.returns.push(1374851258202);
// 34013
o1.returnValue = true;
// undefined
o1 = null;
// 34014
o1 = {};
// 34017
o1.cancelBubble = false;
// 34020
f81632121_467.returns.push(1374851258220);
// 34022
o1.returnValue = true;
// undefined
o1 = null;
// 34023
o1 = {};
// 34026
o1.cancelBubble = false;
// 34029
f81632121_467.returns.push(1374851258246);
// 34031
o1.returnValue = true;
// undefined
o1 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 34033
o1 = {};
// 34036
o1.cancelBubble = false;
// 34039
f81632121_467.returns.push(1374851258268);
// 34041
o1.returnValue = true;
// undefined
o1 = null;
// 34042
o1 = {};
// 34045
o1.cancelBubble = false;
// 34048
f81632121_467.returns.push(1374851258288);
// 34050
o1.returnValue = true;
// undefined
o1 = null;
// 34051
o1 = {};
// 34054
o1.cancelBubble = false;
// 34057
f81632121_467.returns.push(1374851258317);
// 34059
o1.returnValue = true;
// undefined
o1 = null;
// 34060
o1 = {};
// 34063
o1.cancelBubble = false;
// 34066
f81632121_467.returns.push(1374851258332);
// 34068
o1.returnValue = true;
// undefined
o1 = null;
// 34069
o1 = {};
// 34072
o1.cancelBubble = false;
// 34075
f81632121_467.returns.push(1374851258351);
// 34077
o1.returnValue = true;
// undefined
o1 = null;
// 34078
o1 = {};
// 34081
o1.cancelBubble = false;
// 34084
f81632121_467.returns.push(1374851258386);
// 34086
o1.returnValue = true;
// undefined
o1 = null;
// 34087
o1 = {};
// 34090
o1.srcElement = o183;
// 34092
o1.target = o183;
// 34099
f81632121_506.returns.push(null);
// 34105
f81632121_506.returns.push(null);
// 34111
f81632121_506.returns.push(null);
// 34117
f81632121_506.returns.push(null);
// 34123
f81632121_506.returns.push(null);
// 34129
f81632121_506.returns.push(null);
// 34135
f81632121_506.returns.push(null);
// 34141
f81632121_506.returns.push(null);
// 34147
f81632121_506.returns.push(null);
// 34153
f81632121_506.returns.push(null);
// 34159
f81632121_506.returns.push(null);
// 34165
f81632121_506.returns.push(null);
// 34171
f81632121_506.returns.push(null);
// 34177
f81632121_506.returns.push(null);
// 34183
f81632121_506.returns.push(null);
// 34188
o1.relatedTarget = o73;
// 34189
o20 = {};
// 34190
o73.parentNode = o20;
// 34191
o73.nodeType = 1;
// 34194
f81632121_506.returns.push(null);
// 34196
o20.parentNode = o183;
// 34197
o20.nodeType = 1;
// 34198
o20.getAttribute = f81632121_506;
// undefined
o20 = null;
// 34200
f81632121_506.returns.push(null);
// 34206
f81632121_506.returns.push(null);
// 34212
f81632121_506.returns.push(null);
// 34218
f81632121_506.returns.push(null);
// 34224
f81632121_506.returns.push(null);
// 34230
f81632121_506.returns.push(null);
// 34236
f81632121_506.returns.push(null);
// 34242
f81632121_506.returns.push(null);
// 34248
f81632121_506.returns.push(null);
// 34254
f81632121_506.returns.push(null);
// 34260
f81632121_506.returns.push(null);
// 34266
f81632121_506.returns.push(null);
// 34272
f81632121_506.returns.push(null);
// 34278
f81632121_506.returns.push(null);
// 34284
f81632121_506.returns.push(null);
// 34290
f81632121_506.returns.push(null);
// 34295
o1.cancelBubble = false;
// 34296
o1.returnValue = true;
// undefined
o1 = null;
// 34297
o1 = {};
// 34300
o1.cancelBubble = false;
// 34303
f81632121_467.returns.push(1374851258398);
// 34306
f81632121_1007.returns.push(undefined);
// 34308
o1.returnValue = true;
// 34311
o1.srcElement = o73;
// 34313
o1.target = o73;
// 34320
f81632121_506.returns.push(null);
// 34326
f81632121_506.returns.push(null);
// 34332
f81632121_506.returns.push(null);
// 34338
f81632121_506.returns.push(null);
// 34344
f81632121_506.returns.push(null);
// 34350
f81632121_506.returns.push(null);
// 34356
f81632121_506.returns.push(null);
// 34362
f81632121_506.returns.push(null);
// 34368
f81632121_506.returns.push(null);
// 34374
f81632121_506.returns.push(null);
// 34380
f81632121_506.returns.push(null);
// 34386
f81632121_506.returns.push(null);
// 34392
f81632121_506.returns.push(null);
// 34398
f81632121_506.returns.push(null);
// 34404
f81632121_506.returns.push(null);
// 34410
f81632121_506.returns.push(null);
// 34416
f81632121_506.returns.push(null);
// 34421
o1.relatedTarget = o183;
// undefined
o1 = null;
// 34424
o1 = {};
// 34428
f81632121_467.returns.push(1374851258404);
// 34429
o1.cancelBubble = false;
// 34430
o1.returnValue = true;
// 34433
o1.srcElement = o73;
// 34435
o1.target = o73;
// 34442
f81632121_506.returns.push(null);
// 34448
f81632121_506.returns.push(null);
// 34454
f81632121_506.returns.push(null);
// 34460
f81632121_506.returns.push(null);
// 34466
f81632121_506.returns.push(null);
// 34472
f81632121_506.returns.push(null);
// 34478
f81632121_506.returns.push(null);
// 34484
f81632121_506.returns.push(null);
// 34490
f81632121_506.returns.push(null);
// 34496
f81632121_506.returns.push(null);
// 34502
f81632121_506.returns.push(null);
// 34508
f81632121_506.returns.push(null);
// 34514
f81632121_506.returns.push(null);
// 34520
f81632121_506.returns.push(null);
// 34526
f81632121_506.returns.push(null);
// 34532
f81632121_506.returns.push(null);
// 34538
f81632121_506.returns.push(null);
// 34543
o1.JSBNG__screenX = 226;
// 34544
o1.JSBNG__screenY = 566;
// 34545
o1.altKey = false;
// 34546
o1.bubbles = true;
// 34547
o1.button = 0;
// 34548
o1.buttons = void 0;
// 34549
o1.cancelable = false;
// 34550
o1.clientX = 158;
// 34551
o1.clientY = 401;
// 34552
o1.ctrlKey = false;
// 34553
o1.currentTarget = o0;
// 34554
o1.defaultPrevented = false;
// 34555
o1.detail = 0;
// 34556
o1.eventPhase = 3;
// 34557
o1.isTrusted = void 0;
// 34558
o1.metaKey = false;
// 34559
o1.pageX = 158;
// 34560
o1.pageY = 787;
// 34561
o1.relatedTarget = null;
// 34562
o1.fromElement = null;
// 34565
o1.shiftKey = false;
// 34568
o1.timeStamp = 1374851258404;
// 34569
o1.type = "mousemove";
// 34570
o1.view = ow81632121;
// undefined
o1 = null;
// 34579
f81632121_1852.returns.push(undefined);
// 34582
f81632121_14.returns.push(undefined);
// 34583
f81632121_12.returns.push(168);
// 34588
f81632121_467.returns.push(1374851258716);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 34590
o1 = {};
// 34593
o1.srcElement = o73;
// 34595
o1.target = o73;
// 34602
f81632121_506.returns.push(null);
// 34608
f81632121_506.returns.push(null);
// 34614
f81632121_506.returns.push(null);
// 34620
f81632121_506.returns.push(null);
// 34626
f81632121_506.returns.push(null);
// 34632
f81632121_506.returns.push(null);
// 34638
f81632121_506.returns.push(null);
// 34644
f81632121_506.returns.push(null);
// 34650
f81632121_506.returns.push(null);
// 34656
f81632121_506.returns.push(null);
// 34662
f81632121_506.returns.push(null);
// 34668
f81632121_506.returns.push(null);
// 34674
f81632121_506.returns.push(null);
// 34680
f81632121_506.returns.push(null);
// 34686
f81632121_506.returns.push(null);
// 34692
f81632121_506.returns.push(null);
// 34698
f81632121_506.returns.push(null);
// 34703
o20 = {};
// 34704
o1.relatedTarget = o20;
// 34705
o20.parentNode = o78;
// 34706
o20.nodeType = 1;
// 34707
o20.getAttribute = f81632121_506;
// 34709
f81632121_506.returns.push(null);
// 34711
o78.parentNode = o73;
// 34712
o78.nodeType = 1;
// 34713
o78.getAttribute = f81632121_506;
// 34715
f81632121_506.returns.push(null);
// 34721
f81632121_506.returns.push(null);
// 34727
f81632121_506.returns.push(null);
// 34733
f81632121_506.returns.push(null);
// 34739
f81632121_506.returns.push(null);
// 34745
f81632121_506.returns.push(null);
// 34751
f81632121_506.returns.push(null);
// 34757
f81632121_506.returns.push(null);
// 34763
f81632121_506.returns.push(null);
// 34769
f81632121_506.returns.push(null);
// 34775
f81632121_506.returns.push(null);
// 34781
f81632121_506.returns.push(null);
// 34787
f81632121_506.returns.push(null);
// 34793
f81632121_506.returns.push(null);
// 34799
f81632121_506.returns.push(null);
// 34805
f81632121_506.returns.push(null);
// 34811
f81632121_506.returns.push(null);
// 34817
f81632121_506.returns.push(null);
// 34822
o1.cancelBubble = false;
// 34823
o1.returnValue = true;
// undefined
o1 = null;
// 34824
o1 = {};
// 34827
o1.cancelBubble = false;
// 34830
f81632121_467.returns.push(1374851258936);
// 34835
f81632121_467.returns.push(1374851258937);
// 34839
f81632121_467.returns.push(1374851258937);
// 34843
f81632121_1007.returns.push(undefined);
// 34845
o1.returnValue = true;
// 34848
o1.srcElement = o20;
// 34850
o1.target = o20;
// 34857
f81632121_506.returns.push(null);
// 34863
f81632121_506.returns.push(null);
// 34869
f81632121_506.returns.push(null);
// 34875
f81632121_506.returns.push(null);
// 34881
f81632121_506.returns.push(null);
// 34887
f81632121_506.returns.push(null);
// 34893
f81632121_506.returns.push(null);
// 34899
f81632121_506.returns.push(null);
// 34905
f81632121_506.returns.push(null);
// 34911
f81632121_506.returns.push(null);
// 34917
f81632121_506.returns.push(null);
// 34923
f81632121_506.returns.push(null);
// 34929
f81632121_506.returns.push(null);
// 34935
f81632121_506.returns.push(null);
// 34941
f81632121_506.returns.push(null);
// 34947
f81632121_506.returns.push(null);
// 34953
f81632121_506.returns.push(null);
// 34959
f81632121_506.returns.push(null);
// 34965
f81632121_506.returns.push(null);
// 34970
o1.relatedTarget = o73;
// undefined
o1 = null;
// undefined
o73 = null;
// 34973
o1 = {};
// 34977
f81632121_467.returns.push(1374851258956);
// 34978
o1.cancelBubble = false;
// 34979
o1.returnValue = true;
// 34982
o1.srcElement = o20;
// 34984
o1.target = o20;
// undefined
o20 = null;
// 34991
f81632121_506.returns.push(null);
// 34997
f81632121_506.returns.push(null);
// 35003
f81632121_506.returns.push(null);
// 35009
f81632121_506.returns.push(null);
// 35015
f81632121_506.returns.push(null);
// 35021
f81632121_506.returns.push(null);
// 35027
f81632121_506.returns.push(null);
// 35033
f81632121_506.returns.push(null);
// 35039
f81632121_506.returns.push(null);
// 35045
f81632121_506.returns.push(null);
// 35051
f81632121_506.returns.push(null);
// 35057
f81632121_506.returns.push(null);
// 35063
f81632121_506.returns.push(null);
// 35069
f81632121_506.returns.push(null);
// 35075
f81632121_506.returns.push(null);
// 35081
f81632121_506.returns.push(null);
// 35087
f81632121_506.returns.push(null);
// 35093
f81632121_506.returns.push(null);
// 35099
f81632121_506.returns.push(null);
// 35104
o1.JSBNG__screenX = 228;
// 35105
o1.JSBNG__screenY = 561;
// 35106
o1.altKey = false;
// 35107
o1.bubbles = true;
// 35108
o1.button = 0;
// 35109
o1.buttons = void 0;
// 35110
o1.cancelable = false;
// 35111
o1.clientX = 160;
// 35112
o1.clientY = 396;
// 35113
o1.ctrlKey = false;
// 35114
o1.currentTarget = o0;
// 35115
o1.defaultPrevented = false;
// 35116
o1.detail = 0;
// 35117
o1.eventPhase = 3;
// 35118
o1.isTrusted = void 0;
// 35119
o1.metaKey = false;
// 35120
o1.pageX = 160;
// 35121
o1.pageY = 782;
// 35122
o1.relatedTarget = null;
// 35123
o1.fromElement = null;
// 35126
o1.shiftKey = false;
// 35129
o1.timeStamp = 1374851258956;
// 35130
o1.type = "mousemove";
// 35131
o1.view = ow81632121;
// undefined
o1 = null;
// 35140
f81632121_1852.returns.push(undefined);
// 35143
f81632121_14.returns.push(undefined);
// 35144
f81632121_12.returns.push(169);
// 35156
f81632121_14.returns.push(undefined);
// 35157
f81632121_14.returns.push(undefined);
// 35158
f81632121_14.returns.push(undefined);
// 35159
f81632121_12.returns.push(170);
// 35160
f81632121_12.returns.push(171);
// 35161
o8.JSBNG__name = void 0;
// 35162
o8.id = "facebook";
// undefined
o8 = null;
// 35165
f81632121_467.returns.push(1374851258975);
// 35167
f81632121_1007.returns.push(undefined);
// 35173
f81632121_467.returns.push(1374851258976);
// 35180
f81632121_1852.returns.push(undefined);
// 35182
f81632121_14.returns.push(undefined);
// 35183
f81632121_12.returns.push(172);
// 35184
f81632121_12.returns.push(173);
// 35186
o1 = {};
// 35189
o8 = {};
// 35190
o1.srcElement = o8;
// 35192
o1.target = o8;
// 35194
o8.nodeType = 1;
// 35195
o20 = {};
// 35196
o8.parentNode = o20;
// 35198
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35200
f81632121_506.returns.push(null);
// 35202
o8 = {};
// 35203
o20.parentNode = o8;
// 35204
o20.nodeType = 1;
// 35205
o20.getAttribute = f81632121_506;
// undefined
o20 = null;
// 35207
f81632121_506.returns.push(null);
// 35209
o20 = {};
// 35210
o8.parentNode = o20;
// 35211
o8.nodeType = 1;
// 35212
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35214
f81632121_506.returns.push(null);
// 35216
o8 = {};
// 35217
o20.parentNode = o8;
// 35218
o20.nodeType = 1;
// 35219
o20.getAttribute = f81632121_506;
// undefined
o20 = null;
// 35221
f81632121_506.returns.push(null);
// 35223
o20 = {};
// 35224
o8.parentNode = o20;
// 35225
o8.nodeType = 1;
// 35226
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35228
f81632121_506.returns.push(null);
// 35230
o8 = {};
// 35231
o20.parentNode = o8;
// 35232
o20.nodeType = 1;
// 35233
o20.getAttribute = f81632121_506;
// undefined
o20 = null;
// 35235
f81632121_506.returns.push(null);
// 35237
o20 = {};
// 35238
o8.parentNode = o20;
// 35239
o8.nodeType = 1;
// 35240
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35242
f81632121_506.returns.push(null);
// 35244
o8 = {};
// 35245
o20.parentNode = o8;
// 35246
o20.nodeType = 1;
// 35247
o20.getAttribute = f81632121_506;
// 35249
f81632121_506.returns.push(null);
// 35251
o21 = {};
// 35252
o8.parentNode = o21;
// 35253
o8.nodeType = 1;
// 35254
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35256
f81632121_506.returns.push(null);
// 35258
o8 = {};
// 35259
o21.parentNode = o8;
// 35260
o21.nodeType = 1;
// 35261
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35263
f81632121_506.returns.push(null);
// 35265
o21 = {};
// 35266
o8.parentNode = o21;
// 35267
o8.nodeType = 1;
// 35268
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35270
f81632121_506.returns.push(null);
// 35272
o8 = {};
// 35273
o21.parentNode = o8;
// 35274
o21.nodeType = 1;
// 35275
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35277
f81632121_506.returns.push(null);
// 35279
o21 = {};
// 35280
o8.parentNode = o21;
// 35281
o8.nodeType = 1;
// 35282
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35284
f81632121_506.returns.push(null);
// 35286
o8 = {};
// 35287
o21.parentNode = o8;
// 35288
o21.nodeType = 1;
// 35289
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35291
f81632121_506.returns.push(null);
// 35293
o21 = {};
// 35294
o8.parentNode = o21;
// 35295
o8.nodeType = 1;
// 35296
o8.getAttribute = f81632121_506;
// undefined
o8 = null;
// 35298
f81632121_506.returns.push(null);
// 35300
o21.parentNode = o78;
// undefined
o78 = null;
// 35301
o21.nodeType = 1;
// 35302
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35304
f81632121_506.returns.push(null);
// 35310
f81632121_506.returns.push(null);
// 35316
f81632121_506.returns.push(null);
// 35322
f81632121_506.returns.push(null);
// 35328
f81632121_506.returns.push(null);
// 35334
f81632121_506.returns.push(null);
// 35340
f81632121_506.returns.push(null);
// 35346
f81632121_506.returns.push(null);
// 35352
f81632121_506.returns.push(null);
// 35358
f81632121_506.returns.push(null);
// 35364
f81632121_506.returns.push(null);
// 35370
f81632121_506.returns.push(null);
// 35376
f81632121_506.returns.push(null);
// 35382
f81632121_506.returns.push(null);
// 35388
f81632121_506.returns.push(null);
// 35394
f81632121_506.returns.push(null);
// 35400
f81632121_506.returns.push(null);
// 35406
f81632121_506.returns.push(null);
// 35412
f81632121_506.returns.push(null);
// 35417
o8 = {};
// 35418
o1.relatedTarget = o8;
// 35419
o21 = {};
// 35420
o8.parentNode = o21;
// 35421
o8.nodeType = 1;
// 35422
o8.getAttribute = f81632121_506;
// 35424
f81632121_506.returns.push(null);
// 35426
o24 = {};
// 35427
o21.parentNode = o24;
// 35428
o21.nodeType = 1;
// 35429
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35431
f81632121_506.returns.push(null);
// 35433
o21 = {};
// 35434
o24.parentNode = o21;
// 35435
o24.nodeType = 1;
// 35436
o24.getAttribute = f81632121_506;
// undefined
o24 = null;
// 35438
f81632121_506.returns.push(null);
// 35440
o24 = {};
// 35441
o21.parentNode = o24;
// 35442
o21.nodeType = 1;
// 35443
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35445
f81632121_506.returns.push(null);
// 35447
o21 = {};
// 35448
o24.parentNode = o21;
// 35449
o24.nodeType = 1;
// 35450
o24.getAttribute = f81632121_506;
// undefined
o24 = null;
// 35452
f81632121_506.returns.push(null);
// 35454
o24 = {};
// 35455
o21.parentNode = o24;
// 35456
o21.nodeType = 1;
// 35457
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 35459
f81632121_506.returns.push(null);
// 35461
o24.parentNode = o20;
// undefined
o20 = null;
// 35462
o24.nodeType = 1;
// 35463
o24.getAttribute = f81632121_506;
// undefined
o24 = null;
// 35465
f81632121_506.returns.push(null);
// 35471
f81632121_506.returns.push(null);
// 35477
f81632121_506.returns.push(null);
// 35483
f81632121_506.returns.push(null);
// 35489
f81632121_506.returns.push(null);
// 35495
f81632121_506.returns.push(null);
// 35501
f81632121_506.returns.push(null);
// 35507
f81632121_506.returns.push(null);
// 35513
f81632121_506.returns.push(null);
// 35519
f81632121_506.returns.push(null);
// 35525
f81632121_506.returns.push(null);
// 35531
f81632121_506.returns.push(null);
// 35537
f81632121_506.returns.push(null);
// 35543
f81632121_506.returns.push(null);
// 35549
f81632121_506.returns.push(null);
// 35555
f81632121_506.returns.push(null);
// 35561
f81632121_506.returns.push(null);
// 35567
f81632121_506.returns.push(null);
// 35573
f81632121_506.returns.push(null);
// 35579
f81632121_506.returns.push(null);
// 35585
f81632121_506.returns.push(null);
// 35591
f81632121_506.returns.push(null);
// 35597
f81632121_506.returns.push(null);
// 35603
f81632121_506.returns.push(null);
// 35609
f81632121_506.returns.push(null);
// 35615
f81632121_506.returns.push(null);
// 35621
f81632121_506.returns.push(null);
// 35627
f81632121_506.returns.push(null);
// 35632
o1.cancelBubble = false;
// 35633
o1.returnValue = true;
// undefined
o1 = null;
// 35634
o1 = {};
// 35637
f81632121_14.returns.push(undefined);
// 35638
f81632121_14.returns.push(undefined);
// 35639
f81632121_14.returns.push(undefined);
// 35640
f81632121_12.returns.push(174);
// 35641
f81632121_12.returns.push(175);
// 35642
f81632121_2709 = function() { return f81632121_2709.returns[f81632121_2709.inst++]; };
f81632121_2709.returns = [];
f81632121_2709.inst = 0;
// 35643
o1.JSBNG__stop = f81632121_2709;
// 35644
f81632121_2710 = function() { return f81632121_2710.returns[f81632121_2710.inst++]; };
f81632121_2710.returns = [];
f81632121_2710.inst = 0;
// 35645
f81632121_270.JSBNG__stop = f81632121_2710;
// 35646
o1.srcElement = o8;
// 35647
o1.target = o8;
// 35648
f81632121_2711 = function() { return f81632121_2711.returns[f81632121_2711.inst++]; };
f81632121_2711.returns = [];
f81632121_2711.inst = 0;
// 35649
o1.stopPropagation = f81632121_2711;
// 35651
f81632121_2711.returns.push(undefined);
// 35652
o1.type = "mouseover";
// 35656
f81632121_467.returns.push(1374851259018);
// 35657
f81632121_2710.returns.push(o1);
// 35658
f81632121_2709.returns.push(o1);
// 35659
o1.cancelBubble = false;
// 35662
f81632121_467.returns.push(1374851259019);
// 35665
f81632121_1007.returns.push(undefined);
// 35667
o1.returnValue = true;
// undefined
o1 = null;
// 35668
o1 = {};
// 35672
f81632121_467.returns.push(1374851259019);
// 35673
o1.cancelBubble = false;
// 35674
o1.returnValue = true;
// 35677
o1.srcElement = o8;
// 35679
o1.target = o8;
// 35686
f81632121_506.returns.push(null);
// 35692
f81632121_506.returns.push(null);
// 35698
f81632121_506.returns.push(null);
// 35704
f81632121_506.returns.push(null);
// 35710
f81632121_506.returns.push(null);
// 35716
f81632121_506.returns.push(null);
// 35722
f81632121_506.returns.push(null);
// 35728
f81632121_506.returns.push(null);
// 35734
f81632121_506.returns.push(null);
// 35740
f81632121_506.returns.push(null);
// 35746
f81632121_506.returns.push(null);
// 35752
f81632121_506.returns.push(null);
// 35758
f81632121_506.returns.push(null);
// 35764
f81632121_506.returns.push(null);
// 35770
f81632121_506.returns.push(null);
// 35776
f81632121_506.returns.push(null);
// 35782
f81632121_506.returns.push(null);
// 35788
f81632121_506.returns.push(null);
// 35794
f81632121_506.returns.push(null);
// 35800
f81632121_506.returns.push(null);
// 35806
f81632121_506.returns.push(null);
// 35812
f81632121_506.returns.push(null);
// 35818
f81632121_506.returns.push(null);
// 35824
f81632121_506.returns.push(null);
// 35830
f81632121_506.returns.push(null);
// 35836
f81632121_506.returns.push(null);
// 35842
f81632121_506.returns.push(null);
// 35848
f81632121_506.returns.push(null);
// 35854
f81632121_506.returns.push(null);
// 35860
f81632121_506.returns.push(null);
// 35866
f81632121_506.returns.push(null);
// 35872
f81632121_506.returns.push(null);
// 35878
f81632121_506.returns.push(null);
// 35884
f81632121_506.returns.push(null);
// 35889
o1.JSBNG__screenX = 307;
// 35890
o1.JSBNG__screenY = 432;
// 35891
o1.altKey = false;
// 35892
o1.bubbles = true;
// 35893
o1.button = 0;
// 35894
o1.buttons = void 0;
// 35895
o1.cancelable = false;
// 35896
o1.clientX = 239;
// 35897
o1.clientY = 267;
// 35898
o1.ctrlKey = false;
// 35899
o1.currentTarget = o0;
// 35900
o1.defaultPrevented = false;
// 35901
o1.detail = 0;
// 35902
o1.eventPhase = 3;
// 35903
o1.isTrusted = void 0;
// 35904
o1.metaKey = false;
// 35905
o1.pageX = 239;
// 35906
o1.pageY = 653;
// 35907
o1.relatedTarget = null;
// 35908
o1.fromElement = null;
// 35911
o1.shiftKey = false;
// 35914
o1.timeStamp = 1374851259019;
// 35915
o1.type = "mousemove";
// 35916
o1.view = ow81632121;
// undefined
o1 = null;
// 35925
f81632121_1852.returns.push(undefined);
// 35928
f81632121_14.returns.push(undefined);
// 35929
f81632121_12.returns.push(176);
// 35932
o1 = {};
// 35935
o1.srcElement = o8;
// 35937
o1.target = o8;
// 35944
f81632121_506.returns.push(null);
// 35950
f81632121_506.returns.push(null);
// 35956
f81632121_506.returns.push(null);
// 35962
f81632121_506.returns.push(null);
// 35968
f81632121_506.returns.push(null);
// 35974
f81632121_506.returns.push(null);
// 35980
f81632121_506.returns.push(null);
// 35986
f81632121_506.returns.push(null);
// 35992
f81632121_506.returns.push(null);
// 35998
f81632121_506.returns.push(null);
// 36004
f81632121_506.returns.push(null);
// 36010
f81632121_506.returns.push(null);
// 36016
f81632121_506.returns.push(null);
// 36022
f81632121_506.returns.push(null);
// 36028
f81632121_506.returns.push(null);
// 36034
f81632121_506.returns.push(null);
// 36040
f81632121_506.returns.push(null);
// 36046
f81632121_506.returns.push(null);
// 36052
f81632121_506.returns.push(null);
// 36058
f81632121_506.returns.push(null);
// 36064
f81632121_506.returns.push(null);
// 36070
f81632121_506.returns.push(null);
// 36076
f81632121_506.returns.push(null);
// 36082
f81632121_506.returns.push(null);
// 36088
f81632121_506.returns.push(null);
// 36094
f81632121_506.returns.push(null);
// 36100
f81632121_506.returns.push(null);
// 36106
f81632121_506.returns.push(null);
// 36112
f81632121_506.returns.push(null);
// 36118
f81632121_506.returns.push(null);
// 36124
f81632121_506.returns.push(null);
// 36130
f81632121_506.returns.push(null);
// 36136
f81632121_506.returns.push(null);
// 36142
f81632121_506.returns.push(null);
// 36147
o20 = {};
// 36148
o1.relatedTarget = o20;
// 36149
o20.parentNode = o34;
// 36150
o20.nodeType = 1;
// 36151
o20.getAttribute = f81632121_506;
// 36153
f81632121_506.returns.push(null);
// 36155
o34.parentNode = o31;
// 36156
o34.nodeType = 1;
// 36157
o34.getAttribute = f81632121_506;
// undefined
o34 = null;
// 36159
f81632121_506.returns.push(null);
// 36161
o31.parentNode = o44;
// 36162
o31.nodeType = 1;
// undefined
o31 = null;
// 36165
f81632121_506.returns.push(null);
// 36168
o44.nodeType = 1;
// 36169
o44.getAttribute = f81632121_506;
// undefined
o44 = null;
// 36171
f81632121_506.returns.push(null);
// 36177
f81632121_506.returns.push(null);
// 36183
f81632121_506.returns.push(null);
// 36189
f81632121_506.returns.push(null);
// 36195
f81632121_506.returns.push(null);
// 36201
f81632121_506.returns.push(null);
// 36207
f81632121_506.returns.push(null);
// 36213
f81632121_506.returns.push(null);
// 36219
f81632121_506.returns.push(null);
// 36225
f81632121_506.returns.push(null);
// 36231
f81632121_506.returns.push(null);
// 36237
f81632121_506.returns.push(null);
// 36243
f81632121_506.returns.push(null);
// 36249
f81632121_506.returns.push(null);
// 36255
f81632121_506.returns.push(null);
// 36261
f81632121_506.returns.push(null);
// 36266
o1.cancelBubble = false;
// 36267
o1.returnValue = true;
// undefined
o1 = null;
// 36268
o1 = {};
// 36271
o1.cancelBubble = false;
// 36274
f81632121_467.returns.push(1374851259063);
// 36277
f81632121_1007.returns.push(undefined);
// 36279
o1.returnValue = true;
// 36282
o1.srcElement = o20;
// 36284
o1.target = o20;
// 36291
f81632121_506.returns.push(null);
// 36297
f81632121_506.returns.push(null);
// 36303
f81632121_506.returns.push(null);
// 36309
f81632121_506.returns.push(null);
// 36315
f81632121_506.returns.push(null);
// 36321
f81632121_506.returns.push(null);
// 36327
f81632121_506.returns.push(null);
// 36333
f81632121_506.returns.push(null);
// 36339
f81632121_506.returns.push(null);
// 36345
f81632121_506.returns.push(null);
// 36351
f81632121_506.returns.push(null);
// 36357
f81632121_506.returns.push(null);
// 36363
f81632121_506.returns.push(null);
// 36369
f81632121_506.returns.push(null);
// 36375
f81632121_506.returns.push(null);
// 36381
f81632121_506.returns.push(null);
// 36387
f81632121_506.returns.push(null);
// 36393
f81632121_506.returns.push(null);
// 36399
f81632121_506.returns.push(null);
// 36404
o1.relatedTarget = o8;
// undefined
o1 = null;
// undefined
o8 = null;
// 36407
o1 = {};
// 36411
f81632121_467.returns.push(1374851259069);
// 36412
o1.cancelBubble = false;
// 36413
o1.returnValue = true;
// 36416
o1.srcElement = o20;
// 36418
o1.target = o20;
// 36425
f81632121_506.returns.push(null);
// 36431
f81632121_506.returns.push(null);
// 36437
f81632121_506.returns.push(null);
// 36443
f81632121_506.returns.push(null);
// 36449
f81632121_506.returns.push(null);
// 36455
f81632121_506.returns.push(null);
// 36461
f81632121_506.returns.push(null);
// 36467
f81632121_506.returns.push(null);
// 36473
f81632121_506.returns.push(null);
// 36479
f81632121_506.returns.push(null);
// 36485
f81632121_506.returns.push(null);
// 36491
f81632121_506.returns.push(null);
// 36497
f81632121_506.returns.push(null);
// 36503
f81632121_506.returns.push(null);
// 36509
f81632121_506.returns.push(null);
// 36515
f81632121_506.returns.push(null);
// 36521
f81632121_506.returns.push(null);
// 36527
f81632121_506.returns.push(null);
// 36533
f81632121_506.returns.push(null);
// 36538
o1.JSBNG__screenX = 429;
// 36539
o1.JSBNG__screenY = 353;
// 36540
o1.altKey = false;
// 36541
o1.bubbles = true;
// 36542
o1.button = 0;
// 36543
o1.buttons = void 0;
// 36544
o1.cancelable = false;
// 36545
o1.clientX = 361;
// 36546
o1.clientY = 188;
// 36547
o1.ctrlKey = false;
// 36548
o1.currentTarget = o0;
// 36549
o1.defaultPrevented = false;
// 36550
o1.detail = 0;
// 36551
o1.eventPhase = 3;
// 36552
o1.isTrusted = void 0;
// 36553
o1.metaKey = false;
// 36554
o1.pageX = 361;
// 36555
o1.pageY = 574;
// 36556
o1.relatedTarget = null;
// 36557
o1.fromElement = null;
// 36560
o1.shiftKey = false;
// 36563
o1.timeStamp = 1374851259069;
// 36564
o1.type = "mousemove";
// 36565
o1.view = ow81632121;
// undefined
o1 = null;
// 36574
f81632121_1852.returns.push(undefined);
// 36577
f81632121_14.returns.push(undefined);
// 36578
f81632121_12.returns.push(177);
// 36582
f81632121_467.returns.push(1374851259106);
// 36583
o1 = {};
// 36586
o1.srcElement = o20;
// 36588
o1.target = o20;
// 36595
f81632121_506.returns.push(null);
// 36601
f81632121_506.returns.push(null);
// 36607
f81632121_506.returns.push(null);
// 36613
f81632121_506.returns.push(null);
// 36619
f81632121_506.returns.push(null);
// 36625
f81632121_506.returns.push(null);
// 36631
f81632121_506.returns.push(null);
// 36637
f81632121_506.returns.push(null);
// 36643
f81632121_506.returns.push(null);
// 36649
f81632121_506.returns.push(null);
// 36655
f81632121_506.returns.push(null);
// 36661
f81632121_506.returns.push(null);
// 36667
f81632121_506.returns.push(null);
// 36673
f81632121_506.returns.push(null);
// 36679
f81632121_506.returns.push(null);
// 36685
f81632121_506.returns.push(null);
// 36691
f81632121_506.returns.push(null);
// 36697
f81632121_506.returns.push(null);
// 36703
f81632121_506.returns.push(null);
// 36708
o8 = {};
// 36709
o1.relatedTarget = o8;
// 36710
o21 = {};
// 36711
o8.parentNode = o21;
// 36712
o8.nodeType = 1;
// 36713
o8.getAttribute = f81632121_506;
// 36715
f81632121_506.returns.push(null);
// 36717
o24 = {};
// 36718
o21.parentNode = o24;
// 36719
o21.nodeType = 1;
// 36720
o21.getAttribute = f81632121_506;
// undefined
o21 = null;
// 36722
f81632121_506.returns.push(null);
// 36724
o21 = {};
// 36725
o24.parentNode = o21;
// 36726
o24.nodeType = 1;
// 36727
o24.getAttribute = f81632121_506;
// undefined
o24 = null;
// 36729
f81632121_506.returns.push(null);
// 36731
o24 = {};
// 36732
o21.parentNode = o24;
// 36733
o21.nodeType = 1;
// 36734
o21.getAttribute = f81632121_506;
// 36736
f81632121_506.returns.push(null);
// 36738
o24.parentNode = o20;
// 36739
o24.nodeType = 1;
// 36740
o24.getAttribute = f81632121_506;
// undefined
o24 = null;
// 36742
f81632121_506.returns.push(null);
// 36748
f81632121_506.returns.push(null);
// 36754
f81632121_506.returns.push(null);
// 36760
f81632121_506.returns.push(null);
// 36766
f81632121_506.returns.push(null);
// 36772
f81632121_506.returns.push(null);
// 36778
f81632121_506.returns.push(null);
// 36784
f81632121_506.returns.push(null);
// 36790
f81632121_506.returns.push(null);
// 36796
f81632121_506.returns.push(null);
// 36802
f81632121_506.returns.push(null);
// 36808
f81632121_506.returns.push(null);
// 36814
f81632121_506.returns.push(null);
// 36820
f81632121_506.returns.push(null);
// 36826
f81632121_506.returns.push(null);
// 36832
f81632121_506.returns.push(null);
// 36838
f81632121_506.returns.push(null);
// 36844
f81632121_506.returns.push(null);
// 36850
f81632121_506.returns.push(null);
// 36856
f81632121_506.returns.push(null);
// 36861
o1.cancelBubble = false;
// 36862
o1.returnValue = true;
// undefined
o1 = null;
// 36863
o1 = {};
// 36866
o1.cancelBubble = false;
// 36869
f81632121_467.returns.push(1374851259120);
// 36872
f81632121_1007.returns.push(undefined);
// 36874
o1.returnValue = true;
// 36877
o1.srcElement = o8;
// 36879
o1.target = o8;
// 36886
f81632121_506.returns.push(null);
// 36892
f81632121_506.returns.push(null);
// 36898
f81632121_506.returns.push(null);
// 36904
f81632121_506.returns.push(null);
// 36910
f81632121_506.returns.push(null);
// 36916
f81632121_506.returns.push(null);
// 36922
f81632121_506.returns.push(null);
// 36928
f81632121_506.returns.push(null);
// 36934
f81632121_506.returns.push(null);
// 36940
f81632121_506.returns.push(null);
// 36946
f81632121_506.returns.push(null);
// 36952
f81632121_506.returns.push(null);
// 36958
f81632121_506.returns.push(null);
// 36964
f81632121_506.returns.push(null);
// 36970
f81632121_506.returns.push(null);
// 36976
f81632121_506.returns.push(null);
// 36982
f81632121_506.returns.push(null);
// 36988
f81632121_506.returns.push(null);
// 36994
f81632121_506.returns.push(null);
// 37000
f81632121_506.returns.push(null);
// 37006
f81632121_506.returns.push(null);
// 37012
f81632121_506.returns.push(null);
// 37018
f81632121_506.returns.push(null);
// 37024
f81632121_506.returns.push(null);
// 37029
o1.relatedTarget = o20;
// undefined
o1 = null;
// 37032
o1 = {};
// 37036
f81632121_467.returns.push(1374851259129);
// 37037
o1.cancelBubble = false;
// 37038
o1.returnValue = true;
// 37041
o1.srcElement = o8;
// 37043
o1.target = o8;
// 37050
f81632121_506.returns.push(null);
// 37056
f81632121_506.returns.push(null);
// 37062
f81632121_506.returns.push(null);
// 37068
f81632121_506.returns.push(null);
// 37074
f81632121_506.returns.push(null);
// 37080
f81632121_506.returns.push(null);
// 37086
f81632121_506.returns.push(null);
// 37092
f81632121_506.returns.push(null);
// 37098
f81632121_506.returns.push(null);
// 37104
f81632121_506.returns.push(null);
// 37110
f81632121_506.returns.push(null);
// 37116
f81632121_506.returns.push(null);
// 37122
f81632121_506.returns.push(null);
// 37128
f81632121_506.returns.push(null);
// 37134
f81632121_506.returns.push(null);
// 37140
f81632121_506.returns.push(null);
// 37146
f81632121_506.returns.push(null);
// 37152
f81632121_506.returns.push(null);
// 37158
f81632121_506.returns.push(null);
// 37164
f81632121_506.returns.push(null);
// 37170
f81632121_506.returns.push(null);
// 37176
f81632121_506.returns.push(null);
// 37182
f81632121_506.returns.push(null);
// 37188
f81632121_506.returns.push(null);
// 37193
o1.JSBNG__screenX = 528;
// 37194
o1.JSBNG__screenY = 345;
// 37195
o1.altKey = false;
// 37196
o1.bubbles = true;
// 37197
o1.button = 0;
// 37198
o1.buttons = void 0;
// 37199
o1.cancelable = false;
// 37200
o1.clientX = 460;
// 37201
o1.clientY = 180;
// 37202
o1.ctrlKey = false;
// 37203
o1.currentTarget = o0;
// 37204
o1.defaultPrevented = false;
// 37205
o1.detail = 0;
// 37206
o1.eventPhase = 3;
// 37207
o1.isTrusted = void 0;
// 37208
o1.metaKey = false;
// 37209
o1.pageX = 460;
// 37210
o1.pageY = 566;
// 37211
o1.relatedTarget = null;
// 37212
o1.fromElement = null;
// 37215
o1.shiftKey = false;
// 37218
o1.timeStamp = 1374851259128;
// 37219
o1.type = "mousemove";
// 37220
o1.view = ow81632121;
// undefined
o1 = null;
// 37229
f81632121_1852.returns.push(undefined);
// 37232
f81632121_14.returns.push(undefined);
// 37233
f81632121_12.returns.push(178);
// 37236
o1 = {};
// 37239
o1.srcElement = o8;
// 37241
o1.target = o8;
// 37248
f81632121_506.returns.push(null);
// 37254
f81632121_506.returns.push(null);
// 37260
f81632121_506.returns.push(null);
// 37266
f81632121_506.returns.push(null);
// 37272
f81632121_506.returns.push(null);
// 37278
f81632121_506.returns.push(null);
// 37284
f81632121_506.returns.push(null);
// 37290
f81632121_506.returns.push(null);
// 37296
f81632121_506.returns.push(null);
// 37302
f81632121_506.returns.push(null);
// 37308
f81632121_506.returns.push(null);
// 37314
f81632121_506.returns.push(null);
// 37320
f81632121_506.returns.push(null);
// 37326
f81632121_506.returns.push(null);
// 37332
f81632121_506.returns.push(null);
// 37338
f81632121_506.returns.push(null);
// 37344
f81632121_506.returns.push(null);
// 37350
f81632121_506.returns.push(null);
// 37356
f81632121_506.returns.push(null);
// 37362
f81632121_506.returns.push(null);
// 37368
f81632121_506.returns.push(null);
// 37374
f81632121_506.returns.push(null);
// 37380
f81632121_506.returns.push(null);
// 37386
f81632121_506.returns.push(null);
// 37391
o1.relatedTarget = o21;
// 37396
f81632121_506.returns.push(null);
// 37402
f81632121_506.returns.push(null);
// 37408
f81632121_506.returns.push(null);
// 37414
f81632121_506.returns.push(null);
// 37420
f81632121_506.returns.push(null);
// 37426
f81632121_506.returns.push(null);
// 37432
f81632121_506.returns.push(null);
// 37438
f81632121_506.returns.push(null);
// 37444
f81632121_506.returns.push(null);
// 37450
f81632121_506.returns.push(null);
// 37456
f81632121_506.returns.push(null);
// 37462
f81632121_506.returns.push(null);
// 37468
f81632121_506.returns.push(null);
// 37474
f81632121_506.returns.push(null);
// 37480
f81632121_506.returns.push(null);
// 37486
f81632121_506.returns.push(null);
// 37492
f81632121_506.returns.push(null);
// 37498
f81632121_506.returns.push(null);
// 37504
f81632121_506.returns.push(null);
// 37510
f81632121_506.returns.push(null);
// 37516
f81632121_506.returns.push(null);
// 37521
o1.cancelBubble = false;
// 37522
o1.returnValue = true;
// undefined
o1 = null;
// 37523
o1 = {};
// 37526
o1.cancelBubble = false;
// 37529
f81632121_467.returns.push(1374851259162);
// 37532
f81632121_1007.returns.push(undefined);
// 37534
o1.returnValue = true;
// 37537
o1.srcElement = o21;
// 37539
o1.target = o21;
// 37546
f81632121_506.returns.push(null);
// 37552
f81632121_506.returns.push(null);
// 37558
f81632121_506.returns.push(null);
// 37564
f81632121_506.returns.push(null);
// 37570
f81632121_506.returns.push(null);
// 37576
f81632121_506.returns.push(null);
// 37582
f81632121_506.returns.push(null);
// 37588
f81632121_506.returns.push(null);
// 37594
f81632121_506.returns.push(null);
// 37600
f81632121_506.returns.push(null);
// 37606
f81632121_506.returns.push(null);
// 37612
f81632121_506.returns.push(null);
// 37618
f81632121_506.returns.push(null);
// 37624
f81632121_506.returns.push(null);
// 37630
f81632121_506.returns.push(null);
// 37636
f81632121_506.returns.push(null);
// 37642
f81632121_506.returns.push(null);
// 37648
f81632121_506.returns.push(null);
// 37654
f81632121_506.returns.push(null);
// 37660
f81632121_506.returns.push(null);
// 37666
f81632121_506.returns.push(null);
// 37671
o1.relatedTarget = o8;
// undefined
o1 = null;
// undefined
o8 = null;
// 37674
o1 = {};
// 37678
f81632121_467.returns.push(1374851259167);
// 37679
o1.cancelBubble = false;
// 37680
o1.returnValue = true;
// 37683
o1.srcElement = o21;
// 37685
o1.target = o21;
// 37692
f81632121_506.returns.push(null);
// 37698
f81632121_506.returns.push(null);
// 37704
f81632121_506.returns.push(null);
// 37710
f81632121_506.returns.push(null);
// 37716
f81632121_506.returns.push(null);
// 37722
f81632121_506.returns.push(null);
// 37728
f81632121_506.returns.push(null);
// 37734
f81632121_506.returns.push(null);
// 37740
f81632121_506.returns.push(null);
// 37746
f81632121_506.returns.push(null);
// 37752
f81632121_506.returns.push(null);
// 37758
f81632121_506.returns.push(null);
// 37764
f81632121_506.returns.push(null);
// 37770
f81632121_506.returns.push(null);
// 37776
f81632121_506.returns.push(null);
// 37782
f81632121_506.returns.push(null);
// 37788
f81632121_506.returns.push(null);
// 37794
f81632121_506.returns.push(null);
// 37800
f81632121_506.returns.push(null);
// 37806
f81632121_506.returns.push(null);
// 37812
f81632121_506.returns.push(null);
// 37817
o1.JSBNG__screenX = 637;
// 37818
o1.JSBNG__screenY = 371;
// 37819
o1.altKey = false;
// 37820
o1.bubbles = true;
// 37821
o1.button = 0;
// 37822
o1.buttons = void 0;
// 37823
o1.cancelable = false;
// 37824
o1.clientX = 569;
// 37825
o1.clientY = 206;
// 37826
o1.ctrlKey = false;
// 37827
o1.currentTarget = o0;
// 37828
o1.defaultPrevented = false;
// 37829
o1.detail = 0;
// 37830
o1.eventPhase = 3;
// 37831
o1.isTrusted = void 0;
// 37832
o1.metaKey = false;
// 37833
o1.pageX = 569;
// 37834
o1.pageY = 592;
// 37835
o1.relatedTarget = null;
// 37836
o1.fromElement = null;
// 37839
o1.shiftKey = false;
// 37842
o1.timeStamp = 1374851259167;
// 37843
o1.type = "mousemove";
// 37844
o1.view = ow81632121;
// undefined
o1 = null;
// 37853
f81632121_1852.returns.push(undefined);
// 37856
f81632121_14.returns.push(undefined);
// 37857
f81632121_12.returns.push(179);
// 37862
o1 = {};
// 37863
f81632121_70.returns.push(o1);
// 37864
// 37865
o1.open = f81632121_1294;
// 37866
f81632121_1294.returns.push(undefined);
// 37867
o1.setRequestHeader = f81632121_1295;
// 37868
f81632121_1295.returns.push(undefined);
// 37870
o1.send = f81632121_1296;
// 37871
f81632121_1296.returns.push(undefined);
// 37872
o8 = {};
// 37873
o24 = {};
// 37875
o8.transport = o1;
// 37876
o1.readyState = 1;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 37880
f81632121_467.returns.push(1374851259183);
// 37881
o26 = {};
// 37884
o26.srcElement = o21;
// 37886
o26.target = o21;
// 37893
f81632121_506.returns.push(null);
// 37899
f81632121_506.returns.push(null);
// 37905
f81632121_506.returns.push(null);
// 37911
f81632121_506.returns.push(null);
// 37917
f81632121_506.returns.push(null);
// 37923
f81632121_506.returns.push(null);
// 37929
f81632121_506.returns.push(null);
// 37935
f81632121_506.returns.push(null);
// 37941
f81632121_506.returns.push(null);
// 37947
f81632121_506.returns.push(null);
// 37953
f81632121_506.returns.push(null);
// 37959
f81632121_506.returns.push(null);
// 37965
f81632121_506.returns.push(null);
// 37971
f81632121_506.returns.push(null);
// 37977
f81632121_506.returns.push(null);
// 37983
f81632121_506.returns.push(null);
// 37989
f81632121_506.returns.push(null);
// 37995
f81632121_506.returns.push(null);
// 38001
f81632121_506.returns.push(null);
// 38007
f81632121_506.returns.push(null);
// 38013
f81632121_506.returns.push(null);
// 38018
o29 = {};
// 38019
o26.relatedTarget = o29;
// 38020
o31 = {};
// 38021
o29.parentNode = o31;
// 38022
o29.nodeType = 1;
// 38023
o29.getAttribute = f81632121_506;
// 38025
f81632121_506.returns.push(null);
// 38027
o32 = {};
// 38028
o31.parentNode = o32;
// 38029
o31.nodeType = 1;
// 38030
o31.getAttribute = f81632121_506;
// undefined
o31 = null;
// 38032
f81632121_506.returns.push(null);
// 38034
o32.parentNode = o21;
// 38035
o32.nodeType = 1;
// 38036
o32.getAttribute = f81632121_506;
// undefined
o32 = null;
// 38038
f81632121_506.returns.push(null);
// 38044
f81632121_506.returns.push(null);
// 38050
f81632121_506.returns.push(null);
// 38056
f81632121_506.returns.push(null);
// 38062
f81632121_506.returns.push(null);
// 38068
f81632121_506.returns.push(null);
// 38074
f81632121_506.returns.push(null);
// 38080
f81632121_506.returns.push(null);
// 38086
f81632121_506.returns.push(null);
// 38092
f81632121_506.returns.push(null);
// 38098
f81632121_506.returns.push(null);
// 38104
f81632121_506.returns.push(null);
// 38110
f81632121_506.returns.push(null);
// 38116
f81632121_506.returns.push(null);
// 38122
f81632121_506.returns.push(null);
// 38128
f81632121_506.returns.push(null);
// 38134
f81632121_506.returns.push(null);
// 38140
f81632121_506.returns.push(null);
// 38146
f81632121_506.returns.push(null);
// 38152
f81632121_506.returns.push(null);
// 38158
f81632121_506.returns.push(null);
// 38164
f81632121_506.returns.push(null);
// 38169
o26.cancelBubble = false;
// 38170
o26.returnValue = true;
// undefined
o26 = null;
// 38171
o26 = {};
// 38174
o26.cancelBubble = false;
// 38177
f81632121_467.returns.push(1374851259202);
// 38180
f81632121_1007.returns.push(undefined);
// 38182
o26.returnValue = true;
// 38185
o26.srcElement = o29;
// 38187
o26.target = o29;
// 38194
f81632121_506.returns.push(null);
// 38200
f81632121_506.returns.push(null);
// 38206
f81632121_506.returns.push(null);
// 38212
f81632121_506.returns.push(null);
// 38218
f81632121_506.returns.push(null);
// 38224
f81632121_506.returns.push(null);
// 38230
f81632121_506.returns.push(null);
// 38236
f81632121_506.returns.push(null);
// 38242
f81632121_506.returns.push(null);
// 38248
f81632121_506.returns.push(null);
// 38254
f81632121_506.returns.push(null);
// 38260
f81632121_506.returns.push(null);
// 38266
f81632121_506.returns.push(null);
// 38272
f81632121_506.returns.push(null);
// 38278
f81632121_506.returns.push(null);
// 38284
f81632121_506.returns.push(null);
// 38290
f81632121_506.returns.push(null);
// 38296
f81632121_506.returns.push(null);
// 38302
f81632121_506.returns.push(null);
// 38308
f81632121_506.returns.push(null);
// 38314
f81632121_506.returns.push(null);
// 38320
f81632121_506.returns.push(null);
// 38326
f81632121_506.returns.push(null);
// 38332
f81632121_506.returns.push(null);
// 38337
o26.relatedTarget = o21;
// undefined
o26 = null;
// 38340
o26 = {};
// 38344
f81632121_467.returns.push(1374851259216);
// 38345
o26.cancelBubble = false;
// 38346
o26.returnValue = true;
// 38349
o26.srcElement = o29;
// 38351
o26.target = o29;
// 38358
f81632121_506.returns.push(null);
// 38364
f81632121_506.returns.push(null);
// 38370
f81632121_506.returns.push(null);
// 38376
f81632121_506.returns.push(null);
// 38382
f81632121_506.returns.push(null);
// 38388
f81632121_506.returns.push(null);
// 38394
f81632121_506.returns.push(null);
// 38400
f81632121_506.returns.push(null);
// 38406
f81632121_506.returns.push(null);
// 38412
f81632121_506.returns.push(null);
// 38418
f81632121_506.returns.push(null);
// 38424
f81632121_506.returns.push(null);
// 38430
f81632121_506.returns.push(null);
// 38436
f81632121_506.returns.push(null);
// 38442
f81632121_506.returns.push(null);
// 38448
f81632121_506.returns.push(null);
// 38454
f81632121_506.returns.push(null);
// 38460
f81632121_506.returns.push(null);
// 38466
f81632121_506.returns.push(null);
// 38472
f81632121_506.returns.push(null);
// 38478
f81632121_506.returns.push(null);
// 38484
f81632121_506.returns.push(null);
// 38490
f81632121_506.returns.push(null);
// 38496
f81632121_506.returns.push(null);
// 38501
o26.JSBNG__screenX = 686;
// 38502
o26.JSBNG__screenY = 391;
// 38503
o26.altKey = false;
// 38504
o26.bubbles = true;
// 38505
o26.button = 0;
// 38506
o26.buttons = void 0;
// 38507
o26.cancelable = false;
// 38508
o26.clientX = 618;
// 38509
o26.clientY = 226;
// 38510
o26.ctrlKey = false;
// 38511
o26.currentTarget = o0;
// 38512
o26.defaultPrevented = false;
// 38513
o26.detail = 0;
// 38514
o26.eventPhase = 3;
// 38515
o26.isTrusted = void 0;
// 38516
o26.metaKey = false;
// 38517
o26.pageX = 618;
// 38518
o26.pageY = 612;
// 38519
o26.relatedTarget = null;
// 38520
o26.fromElement = null;
// 38523
o26.shiftKey = false;
// 38526
o26.timeStamp = 1374851259216;
// 38527
o26.type = "mousemove";
// 38528
o26.view = ow81632121;
// undefined
o26 = null;
// 38537
f81632121_1852.returns.push(undefined);
// 38540
f81632121_14.returns.push(undefined);
// 38541
f81632121_12.returns.push(180);
// 38544
o26 = {};
// 38547
o26.srcElement = o29;
// 38549
o26.target = o29;
// 38556
f81632121_506.returns.push(null);
// 38562
f81632121_506.returns.push(null);
// 38568
f81632121_506.returns.push(null);
// 38574
f81632121_506.returns.push(null);
// 38580
f81632121_506.returns.push(null);
// 38586
f81632121_506.returns.push(null);
// 38592
f81632121_506.returns.push(null);
// 38598
f81632121_506.returns.push(null);
// 38604
f81632121_506.returns.push(null);
// 38610
f81632121_506.returns.push(null);
// 38616
f81632121_506.returns.push(null);
// 38622
f81632121_506.returns.push(null);
// 38628
f81632121_506.returns.push(null);
// 38634
f81632121_506.returns.push(null);
// 38640
f81632121_506.returns.push(null);
// 38646
f81632121_506.returns.push(null);
// 38652
f81632121_506.returns.push(null);
// 38658
f81632121_506.returns.push(null);
// 38664
f81632121_506.returns.push(null);
// 38670
f81632121_506.returns.push(null);
// 38676
f81632121_506.returns.push(null);
// 38682
f81632121_506.returns.push(null);
// 38688
f81632121_506.returns.push(null);
// 38694
f81632121_506.returns.push(null);
// 38699
o26.relatedTarget = o21;
// 38704
f81632121_506.returns.push(null);
// 38710
f81632121_506.returns.push(null);
// 38716
f81632121_506.returns.push(null);
// 38722
f81632121_506.returns.push(null);
// 38728
f81632121_506.returns.push(null);
// 38734
f81632121_506.returns.push(null);
// 38740
f81632121_506.returns.push(null);
// 38746
f81632121_506.returns.push(null);
// 38752
f81632121_506.returns.push(null);
// 38758
f81632121_506.returns.push(null);
// 38764
f81632121_506.returns.push(null);
// 38770
f81632121_506.returns.push(null);
// 38776
f81632121_506.returns.push(null);
// 38782
f81632121_506.returns.push(null);
// 38788
f81632121_506.returns.push(null);
// 38794
f81632121_506.returns.push(null);
// 38800
f81632121_506.returns.push(null);
// 38806
f81632121_506.returns.push(null);
// 38812
f81632121_506.returns.push(null);
// 38818
f81632121_506.returns.push(null);
// 38824
f81632121_506.returns.push(null);
// 38829
o26.cancelBubble = false;
// 38830
o26.returnValue = true;
// undefined
o26 = null;
// 38831
o26 = {};
// 38834
o26.cancelBubble = false;
// 38837
f81632121_467.returns.push(1374851259245);
// 38840
f81632121_1007.returns.push(undefined);
// 38842
o26.returnValue = true;
// 38845
o26.srcElement = o21;
// 38847
o26.target = o21;
// 38854
f81632121_506.returns.push(null);
// 38860
f81632121_506.returns.push(null);
// 38866
f81632121_506.returns.push(null);
// 38872
f81632121_506.returns.push(null);
// 38878
f81632121_506.returns.push(null);
// 38884
f81632121_506.returns.push(null);
// 38890
f81632121_506.returns.push(null);
// 38896
f81632121_506.returns.push(null);
// 38902
f81632121_506.returns.push(null);
// 38908
f81632121_506.returns.push(null);
// 38914
f81632121_506.returns.push(null);
// 38920
f81632121_506.returns.push(null);
// 38926
f81632121_506.returns.push(null);
// 38932
f81632121_506.returns.push(null);
// 38938
f81632121_506.returns.push(null);
// 38944
f81632121_506.returns.push(null);
// 38950
f81632121_506.returns.push(null);
// 38956
f81632121_506.returns.push(null);
// 38962
f81632121_506.returns.push(null);
// 38968
f81632121_506.returns.push(null);
// 38974
f81632121_506.returns.push(null);
// 38979
o26.relatedTarget = o29;
// undefined
o26 = null;
// 38982
o26 = {};
// 38986
f81632121_467.returns.push(1374851259255);
// 38987
o26.cancelBubble = false;
// 38988
o26.returnValue = true;
// 38991
o26.srcElement = o21;
// 38993
o26.target = o21;
// 39000
f81632121_506.returns.push(null);
// 39006
f81632121_506.returns.push(null);
// 39012
f81632121_506.returns.push(null);
// 39018
f81632121_506.returns.push(null);
// 39024
f81632121_506.returns.push(null);
// 39030
f81632121_506.returns.push(null);
// 39036
f81632121_506.returns.push(null);
// 39042
f81632121_506.returns.push(null);
// 39048
f81632121_506.returns.push(null);
// 39054
f81632121_506.returns.push(null);
// 39060
f81632121_506.returns.push(null);
// 39066
f81632121_506.returns.push(null);
// 39072
f81632121_506.returns.push(null);
// 39078
f81632121_506.returns.push(null);
// 39084
f81632121_506.returns.push(null);
// 39090
f81632121_506.returns.push(null);
// 39096
f81632121_506.returns.push(null);
// 39102
f81632121_506.returns.push(null);
// 39108
f81632121_506.returns.push(null);
// 39114
f81632121_506.returns.push(null);
// 39120
f81632121_506.returns.push(null);
// 39125
o26.JSBNG__screenX = 709;
// 39126
o26.JSBNG__screenY = 404;
// 39127
o26.altKey = false;
// 39128
o26.bubbles = true;
// 39129
o26.button = 0;
// 39130
o26.buttons = void 0;
// 39131
o26.cancelable = false;
// 39132
o26.clientX = 641;
// 39133
o26.clientY = 239;
// 39134
o26.ctrlKey = false;
// 39135
o26.currentTarget = o0;
// 39136
o26.defaultPrevented = false;
// 39137
o26.detail = 0;
// 39138
o26.eventPhase = 3;
// 39139
o26.isTrusted = void 0;
// 39140
o26.metaKey = false;
// 39141
o26.pageX = 641;
// 39142
o26.pageY = 625;
// 39143
o26.relatedTarget = null;
// 39144
o26.fromElement = null;
// 39147
o26.shiftKey = false;
// 39150
o26.timeStamp = 1374851259255;
// 39151
o26.type = "mousemove";
// 39152
o26.view = ow81632121;
// undefined
o26 = null;
// 39161
f81632121_1852.returns.push(undefined);
// 39164
f81632121_14.returns.push(undefined);
// 39165
f81632121_12.returns.push(181);
// 39168
o26 = {};
// 39172
f81632121_467.returns.push(1374851259276);
// 39173
o26.cancelBubble = false;
// 39174
o26.returnValue = true;
// 39177
o26.srcElement = o21;
// 39179
o26.target = o21;
// 39186
f81632121_506.returns.push(null);
// 39192
f81632121_506.returns.push(null);
// 39198
f81632121_506.returns.push(null);
// 39204
f81632121_506.returns.push(null);
// 39210
f81632121_506.returns.push(null);
// 39216
f81632121_506.returns.push(null);
// 39222
f81632121_506.returns.push(null);
// 39228
f81632121_506.returns.push(null);
// 39234
f81632121_506.returns.push(null);
// 39240
f81632121_506.returns.push(null);
// 39246
f81632121_506.returns.push(null);
// 39252
f81632121_506.returns.push(null);
// 39258
f81632121_506.returns.push(null);
// 39264
f81632121_506.returns.push(null);
// 39270
f81632121_506.returns.push(null);
// 39276
f81632121_506.returns.push(null);
// 39282
f81632121_506.returns.push(null);
// 39288
f81632121_506.returns.push(null);
// 39294
f81632121_506.returns.push(null);
// 39300
f81632121_506.returns.push(null);
// 39306
f81632121_506.returns.push(null);
// 39311
o26.JSBNG__screenX = 717;
// 39312
o26.JSBNG__screenY = 404;
// 39313
o26.altKey = false;
// 39314
o26.bubbles = true;
// 39315
o26.button = 0;
// 39316
o26.buttons = void 0;
// 39317
o26.cancelable = false;
// 39318
o26.clientX = 649;
// 39319
o26.clientY = 239;
// 39320
o26.ctrlKey = false;
// 39321
o26.currentTarget = o0;
// 39322
o26.defaultPrevented = false;
// 39323
o26.detail = 0;
// 39324
o26.eventPhase = 3;
// 39325
o26.isTrusted = void 0;
// 39326
o26.metaKey = false;
// 39327
o26.pageX = 649;
// 39328
o26.pageY = 625;
// 39329
o26.relatedTarget = null;
// 39330
o26.fromElement = null;
// 39333
o26.shiftKey = false;
// 39336
o26.timeStamp = 1374851259276;
// 39337
o26.type = "mousemove";
// 39338
o26.view = ow81632121;
// undefined
o26 = null;
// 39347
f81632121_1852.returns.push(undefined);
// 39350
f81632121_14.returns.push(undefined);
// 39351
f81632121_12.returns.push(182);
// 39354
o26 = {};
// 39358
f81632121_467.returns.push(1374851259282);
// 39359
o26.cancelBubble = false;
// 39360
o26.returnValue = true;
// 39363
o26.srcElement = o21;
// 39365
o26.target = o21;
// 39372
f81632121_506.returns.push(null);
// 39378
f81632121_506.returns.push(null);
// 39384
f81632121_506.returns.push(null);
// 39390
f81632121_506.returns.push(null);
// 39396
f81632121_506.returns.push(null);
// 39402
f81632121_506.returns.push(null);
// 39408
f81632121_506.returns.push(null);
// 39414
f81632121_506.returns.push(null);
// 39420
f81632121_506.returns.push(null);
// 39426
f81632121_506.returns.push(null);
// 39432
f81632121_506.returns.push(null);
// 39438
f81632121_506.returns.push(null);
// 39444
f81632121_506.returns.push(null);
// 39450
f81632121_506.returns.push(null);
// 39456
f81632121_506.returns.push(null);
// 39462
f81632121_506.returns.push(null);
// 39468
f81632121_506.returns.push(null);
// 39474
f81632121_506.returns.push(null);
// 39480
f81632121_506.returns.push(null);
// 39486
f81632121_506.returns.push(null);
// 39492
f81632121_506.returns.push(null);
// 39497
o26.JSBNG__screenX = 718;
// 39498
o26.JSBNG__screenY = 404;
// 39499
o26.altKey = false;
// 39500
o26.bubbles = true;
// 39501
o26.button = 0;
// 39502
o26.buttons = void 0;
// 39503
o26.cancelable = false;
// 39504
o26.clientX = 650;
// 39505
o26.clientY = 239;
// 39506
o26.ctrlKey = false;
// 39507
o26.currentTarget = o0;
// 39508
o26.defaultPrevented = false;
// 39509
o26.detail = 0;
// 39510
o26.eventPhase = 3;
// 39511
o26.isTrusted = void 0;
// 39512
o26.metaKey = false;
// 39513
o26.pageX = 650;
// 39514
o26.pageY = 625;
// 39515
o26.relatedTarget = null;
// 39516
o26.fromElement = null;
// 39519
o26.shiftKey = false;
// 39522
o26.timeStamp = 1374851259282;
// 39523
o26.type = "mousemove";
// 39524
o26.view = ow81632121;
// undefined
o26 = null;
// 39533
f81632121_1852.returns.push(undefined);
// 39536
f81632121_14.returns.push(undefined);
// 39537
f81632121_12.returns.push(183);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096; wd=1034x727");
// 39541
o26 = {};
// 39545
f81632121_467.returns.push(1374851259307);
// 39546
o26.cancelBubble = false;
// 39547
o26.returnValue = true;
// 39550
o26.srcElement = o21;
// 39552
o26.target = o21;
// 39559
f81632121_506.returns.push(null);
// 39565
f81632121_506.returns.push(null);
// 39571
f81632121_506.returns.push(null);
// 39577
f81632121_506.returns.push(null);
// 39583
f81632121_506.returns.push(null);
// 39589
f81632121_506.returns.push(null);
// 39595
f81632121_506.returns.push(null);
// 39601
f81632121_506.returns.push(null);
// 39607
f81632121_506.returns.push(null);
// 39613
f81632121_506.returns.push(null);
// 39619
f81632121_506.returns.push(null);
// 39625
f81632121_506.returns.push(null);
// 39631
f81632121_506.returns.push(null);
// 39637
f81632121_506.returns.push(null);
// 39643
f81632121_506.returns.push(null);
// 39649
f81632121_506.returns.push(null);
// 39655
f81632121_506.returns.push(null);
// 39661
f81632121_506.returns.push(null);
// 39667
f81632121_506.returns.push(null);
// 39673
f81632121_506.returns.push(null);
// 39679
f81632121_506.returns.push(null);
// 39684
o26.JSBNG__screenX = 719;
// 39685
o26.JSBNG__screenY = 404;
// 39686
o26.altKey = false;
// 39687
o26.bubbles = true;
// 39688
o26.button = 0;
// 39689
o26.buttons = void 0;
// 39690
o26.cancelable = false;
// 39691
o26.clientX = 651;
// 39692
o26.clientY = 239;
// 39693
o26.ctrlKey = false;
// 39694
o26.currentTarget = o0;
// 39695
o26.defaultPrevented = false;
// 39696
o26.detail = 0;
// 39697
o26.eventPhase = 3;
// 39698
o26.isTrusted = void 0;
// 39699
o26.metaKey = false;
// 39700
o26.pageX = 651;
// 39701
o26.pageY = 625;
// 39702
o26.relatedTarget = null;
// 39703
o26.fromElement = null;
// 39706
o26.shiftKey = false;
// 39709
o26.timeStamp = 1374851259306;
// 39710
o26.type = "mousemove";
// 39711
o26.view = ow81632121;
// undefined
o26 = null;
// 39720
f81632121_1852.returns.push(undefined);
// 39723
f81632121_14.returns.push(undefined);
// 39724
f81632121_12.returns.push(184);
// 39727
o26 = {};
// 39731
f81632121_467.returns.push(1374851259321);
// 39732
o26.cancelBubble = false;
// 39733
o26.returnValue = true;
// 39736
o26.srcElement = o21;
// 39738
o26.target = o21;
// 39745
f81632121_506.returns.push(null);
// 39751
f81632121_506.returns.push(null);
// 39757
f81632121_506.returns.push(null);
// 39763
f81632121_506.returns.push(null);
// 39769
f81632121_506.returns.push(null);
// 39775
f81632121_506.returns.push(null);
// 39781
f81632121_506.returns.push(null);
// 39787
f81632121_506.returns.push(null);
// 39793
f81632121_506.returns.push(null);
// 39799
f81632121_506.returns.push(null);
// 39805
f81632121_506.returns.push(null);
// 39811
f81632121_506.returns.push(null);
// 39817
f81632121_506.returns.push(null);
// 39823
f81632121_506.returns.push(null);
// 39829
f81632121_506.returns.push(null);
// 39835
f81632121_506.returns.push(null);
// 39841
f81632121_506.returns.push(null);
// 39847
f81632121_506.returns.push(null);
// 39853
f81632121_506.returns.push(null);
// 39859
f81632121_506.returns.push(null);
// 39865
f81632121_506.returns.push(null);
// 39870
o26.JSBNG__screenX = 719;
// 39871
o26.JSBNG__screenY = 403;
// 39872
o26.altKey = false;
// 39873
o26.bubbles = true;
// 39874
o26.button = 0;
// 39875
o26.buttons = void 0;
// 39876
o26.cancelable = false;
// 39877
o26.clientX = 651;
// 39878
o26.clientY = 238;
// 39879
o26.ctrlKey = false;
// 39880
o26.currentTarget = o0;
// 39881
o26.defaultPrevented = false;
// 39882
o26.detail = 0;
// 39883
o26.eventPhase = 3;
// 39884
o26.isTrusted = void 0;
// 39885
o26.metaKey = false;
// 39886
o26.pageX = 651;
// 39887
o26.pageY = 624;
// 39888
o26.relatedTarget = null;
// 39889
o26.fromElement = null;
// 39892
o26.shiftKey = false;
// 39895
o26.timeStamp = 1374851259321;
// 39896
o26.type = "mousemove";
// 39897
o26.view = ow81632121;
// undefined
o26 = null;
// 39906
f81632121_1852.returns.push(undefined);
// 39909
f81632121_14.returns.push(undefined);
// 39910
f81632121_12.returns.push(185);
// 39913
o26 = {};
// 39917
f81632121_467.returns.push(1374851259379);
// 39918
o26.cancelBubble = false;
// 39919
o26.returnValue = true;
// 39922
o26.srcElement = o21;
// 39924
o26.target = o21;
// 39931
f81632121_506.returns.push(null);
// 39937
f81632121_506.returns.push(null);
// 39943
f81632121_506.returns.push(null);
// 39949
f81632121_506.returns.push(null);
// 39955
f81632121_506.returns.push(null);
// 39961
f81632121_506.returns.push(null);
// 39967
f81632121_506.returns.push(null);
// 39973
f81632121_506.returns.push(null);
// 39979
f81632121_506.returns.push(null);
// 39985
f81632121_506.returns.push(null);
// 39991
f81632121_506.returns.push(null);
// 39997
f81632121_506.returns.push(null);
// 40003
f81632121_506.returns.push(null);
// 40009
f81632121_506.returns.push(null);
// 40015
f81632121_506.returns.push(null);
// 40021
f81632121_506.returns.push(null);
// 40027
f81632121_506.returns.push(null);
// 40033
f81632121_506.returns.push(null);
// 40039
f81632121_506.returns.push(null);
// 40045
f81632121_506.returns.push(null);
// 40051
f81632121_506.returns.push(null);
// 40056
o26.JSBNG__screenX = 718;
// 40057
o26.JSBNG__screenY = 402;
// 40058
o26.altKey = false;
// 40059
o26.bubbles = true;
// 40060
o26.button = 0;
// 40061
o26.buttons = void 0;
// 40062
o26.cancelable = false;
// 40063
o26.clientX = 650;
// 40064
o26.clientY = 237;
// 40065
o26.ctrlKey = false;
// 40066
o26.currentTarget = o0;
// 40067
o26.defaultPrevented = false;
// 40068
o26.detail = 0;
// 40069
o26.eventPhase = 3;
// 40070
o26.isTrusted = void 0;
// 40071
o26.metaKey = false;
// 40072
o26.pageX = 650;
// 40073
o26.pageY = 623;
// 40074
o26.relatedTarget = null;
// 40075
o26.fromElement = null;
// 40078
o26.shiftKey = false;
// 40081
o26.timeStamp = 1374851259379;
// 40082
o26.type = "mousemove";
// 40083
o26.view = ow81632121;
// undefined
o26 = null;
// 40092
f81632121_1852.returns.push(undefined);
// 40095
f81632121_14.returns.push(undefined);
// 40096
f81632121_12.returns.push(186);
// 40099
o26 = {};
// 40103
f81632121_467.returns.push(1374851259392);
// 40104
o26.cancelBubble = false;
// 40105
o26.returnValue = true;
// 40108
o26.srcElement = o21;
// 40110
o26.target = o21;
// 40117
f81632121_506.returns.push(null);
// 40123
f81632121_506.returns.push(null);
// 40129
f81632121_506.returns.push(null);
// 40135
f81632121_506.returns.push(null);
// 40141
f81632121_506.returns.push(null);
// 40147
f81632121_506.returns.push(null);
// 40153
f81632121_506.returns.push(null);
// 40159
f81632121_506.returns.push(null);
// 40165
f81632121_506.returns.push(null);
// 40171
f81632121_506.returns.push(null);
// 40177
f81632121_506.returns.push(null);
// 40183
f81632121_506.returns.push(null);
// 40189
f81632121_506.returns.push(null);
// 40195
f81632121_506.returns.push(null);
// 40201
f81632121_506.returns.push(null);
// 40207
f81632121_506.returns.push(null);
// 40213
f81632121_506.returns.push(null);
// 40219
f81632121_506.returns.push(null);
// 40225
f81632121_506.returns.push(null);
// 40231
f81632121_506.returns.push(null);
// 40237
f81632121_506.returns.push(null);
// 40242
o26.JSBNG__screenX = 717;
// 40243
o26.JSBNG__screenY = 401;
// 40244
o26.altKey = false;
// 40245
o26.bubbles = true;
// 40246
o26.button = 0;
// 40247
o26.buttons = void 0;
// 40248
o26.cancelable = false;
// 40249
o26.clientX = 649;
// 40250
o26.clientY = 236;
// 40251
o26.ctrlKey = false;
// 40252
o26.currentTarget = o0;
// 40253
o26.defaultPrevented = false;
// 40254
o26.detail = 0;
// 40255
o26.eventPhase = 3;
// 40256
o26.isTrusted = void 0;
// 40257
o26.metaKey = false;
// 40258
o26.pageX = 649;
// 40259
o26.pageY = 622;
// 40260
o26.relatedTarget = null;
// 40261
o26.fromElement = null;
// 40264
o26.shiftKey = false;
// 40267
o26.timeStamp = 1374851259387;
// 40268
o26.type = "mousemove";
// 40269
o26.view = ow81632121;
// undefined
o26 = null;
// 40278
f81632121_1852.returns.push(undefined);
// 40281
f81632121_14.returns.push(undefined);
// 40282
f81632121_12.returns.push(187);
// 40285
o26 = {};
// 40289
f81632121_467.returns.push(1374851259400);
// 40290
o26.cancelBubble = false;
// 40291
o26.returnValue = true;
// 40294
o26.srcElement = o21;
// 40296
o26.target = o21;
// 40303
f81632121_506.returns.push(null);
// 40309
f81632121_506.returns.push(null);
// 40315
f81632121_506.returns.push(null);
// 40321
f81632121_506.returns.push(null);
// 40327
f81632121_506.returns.push(null);
// 40333
f81632121_506.returns.push(null);
// 40339
f81632121_506.returns.push(null);
// 40345
f81632121_506.returns.push(null);
// 40351
f81632121_506.returns.push(null);
// 40357
f81632121_506.returns.push(null);
// 40363
f81632121_506.returns.push(null);
// 40369
f81632121_506.returns.push(null);
// 40375
f81632121_506.returns.push(null);
// 40381
f81632121_506.returns.push(null);
// 40387
f81632121_506.returns.push(null);
// 40393
f81632121_506.returns.push(null);
// 40399
f81632121_506.returns.push(null);
// 40405
f81632121_506.returns.push(null);
// 40411
f81632121_506.returns.push(null);
// 40417
f81632121_506.returns.push(null);
// 40423
f81632121_506.returns.push(null);
// 40428
o26.JSBNG__screenX = 714;
// 40429
o26.JSBNG__screenY = 399;
// 40430
o26.altKey = false;
// 40431
o26.bubbles = true;
// 40432
o26.button = 0;
// 40433
o26.buttons = void 0;
// 40434
o26.cancelable = false;
// 40435
o26.clientX = 646;
// 40436
o26.clientY = 234;
// 40437
o26.ctrlKey = false;
// 40438
o26.currentTarget = o0;
// 40439
o26.defaultPrevented = false;
// 40440
o26.detail = 0;
// 40441
o26.eventPhase = 3;
// 40442
o26.isTrusted = void 0;
// 40443
o26.metaKey = false;
// 40444
o26.pageX = 646;
// 40445
o26.pageY = 620;
// 40446
o26.relatedTarget = null;
// 40447
o26.fromElement = null;
// 40450
o26.shiftKey = false;
// 40453
o26.timeStamp = 1374851259400;
// 40454
o26.type = "mousemove";
// 40455
o26.view = ow81632121;
// undefined
o26 = null;
// 40464
f81632121_1852.returns.push(undefined);
// 40467
f81632121_14.returns.push(undefined);
// 40468
f81632121_12.returns.push(188);
// 40471
o26 = {};
// 40474
o26.srcElement = o21;
// 40476
o26.target = o21;
// 40483
f81632121_506.returns.push(null);
// 40489
f81632121_506.returns.push(null);
// 40495
f81632121_506.returns.push(null);
// 40501
f81632121_506.returns.push(null);
// 40507
f81632121_506.returns.push(null);
// 40513
f81632121_506.returns.push(null);
// 40519
f81632121_506.returns.push(null);
// 40525
f81632121_506.returns.push(null);
// 40531
f81632121_506.returns.push(null);
// 40537
f81632121_506.returns.push(null);
// 40543
f81632121_506.returns.push(null);
// 40549
f81632121_506.returns.push(null);
// 40555
f81632121_506.returns.push(null);
// 40561
f81632121_506.returns.push(null);
// 40567
f81632121_506.returns.push(null);
// 40573
f81632121_506.returns.push(null);
// 40579
f81632121_506.returns.push(null);
// 40585
f81632121_506.returns.push(null);
// 40591
f81632121_506.returns.push(null);
// 40597
f81632121_506.returns.push(null);
// 40603
f81632121_506.returns.push(null);
// 40608
o26.relatedTarget = o29;
// 40613
f81632121_506.returns.push(null);
// 40619
f81632121_506.returns.push(null);
// 40625
f81632121_506.returns.push(null);
// 40631
f81632121_506.returns.push(null);
// 40637
f81632121_506.returns.push(null);
// 40643
f81632121_506.returns.push(null);
// 40649
f81632121_506.returns.push(null);
// 40655
f81632121_506.returns.push(null);
// 40661
f81632121_506.returns.push(null);
// 40667
f81632121_506.returns.push(null);
// 40673
f81632121_506.returns.push(null);
// 40679
f81632121_506.returns.push(null);
// 40685
f81632121_506.returns.push(null);
// 40691
f81632121_506.returns.push(null);
// 40697
f81632121_506.returns.push(null);
// 40703
f81632121_506.returns.push(null);
// 40709
f81632121_506.returns.push(null);
// 40715
f81632121_506.returns.push(null);
// 40721
f81632121_506.returns.push(null);
// 40727
f81632121_506.returns.push(null);
// 40733
f81632121_506.returns.push(null);
// 40739
f81632121_506.returns.push(null);
// 40745
f81632121_506.returns.push(null);
// 40751
f81632121_506.returns.push(null);
// 40756
o26.cancelBubble = false;
// 40757
o26.returnValue = true;
// undefined
o26 = null;
// 40758
o26 = {};
// 40761
o26.cancelBubble = false;
// 40764
f81632121_467.returns.push(1374851259429);
// 40767
f81632121_1007.returns.push(undefined);
// 40769
o26.returnValue = true;
// 40772
o26.srcElement = o29;
// 40774
o26.target = o29;
// 40781
f81632121_506.returns.push(null);
// 40787
f81632121_506.returns.push(null);
// 40793
f81632121_506.returns.push(null);
// 40799
f81632121_506.returns.push(null);
// 40805
f81632121_506.returns.push(null);
// 40811
f81632121_506.returns.push(null);
// 40817
f81632121_506.returns.push(null);
// 40823
f81632121_506.returns.push(null);
// 40829
f81632121_506.returns.push(null);
// 40835
f81632121_506.returns.push(null);
// 40841
f81632121_506.returns.push(null);
// 40847
f81632121_506.returns.push(null);
// 40853
f81632121_506.returns.push(null);
// 40859
f81632121_506.returns.push(null);
// 40865
f81632121_506.returns.push(null);
// 40871
f81632121_506.returns.push(null);
// 40877
f81632121_506.returns.push(null);
// 40883
f81632121_506.returns.push(null);
// 40889
f81632121_506.returns.push(null);
// 40895
f81632121_506.returns.push(null);
// 40901
f81632121_506.returns.push(null);
// 40907
f81632121_506.returns.push(null);
// 40913
f81632121_506.returns.push(null);
// 40919
f81632121_506.returns.push(null);
// 40924
o26.relatedTarget = o21;
// undefined
o26 = null;
// 40927
o26 = {};
// 40931
f81632121_467.returns.push(1374851259435);
// 40932
o26.cancelBubble = false;
// 40933
o26.returnValue = true;
// 40936
o26.srcElement = o29;
// 40938
o26.target = o29;
// 40945
f81632121_506.returns.push(null);
// 40951
f81632121_506.returns.push(null);
// 40957
f81632121_506.returns.push(null);
// 40963
f81632121_506.returns.push(null);
// 40969
f81632121_506.returns.push(null);
// 40975
f81632121_506.returns.push(null);
// 40981
f81632121_506.returns.push(null);
// 40987
f81632121_506.returns.push(null);
// 40993
f81632121_506.returns.push(null);
// 40999
f81632121_506.returns.push(null);
// 41005
f81632121_506.returns.push(null);
// 41011
f81632121_506.returns.push(null);
// 41017
f81632121_506.returns.push(null);
// 41023
f81632121_506.returns.push(null);
// 41029
f81632121_506.returns.push(null);
// 41035
f81632121_506.returns.push(null);
// 41041
f81632121_506.returns.push(null);
// 41047
f81632121_506.returns.push(null);
// 41053
f81632121_506.returns.push(null);
// 41059
f81632121_506.returns.push(null);
// 41065
f81632121_506.returns.push(null);
// 41071
f81632121_506.returns.push(null);
// 41077
f81632121_506.returns.push(null);
// 41083
f81632121_506.returns.push(null);
// 41088
o26.JSBNG__screenX = 708;
// 41089
o26.JSBNG__screenY = 392;
// 41090
o26.altKey = false;
// 41091
o26.bubbles = true;
// 41092
o26.button = 0;
// 41093
o26.buttons = void 0;
// 41094
o26.cancelable = false;
// 41095
o26.clientX = 640;
// 41096
o26.clientY = 227;
// 41097
o26.ctrlKey = false;
// 41098
o26.currentTarget = o0;
// 41099
o26.defaultPrevented = false;
// 41100
o26.detail = 0;
// 41101
o26.eventPhase = 3;
// 41102
o26.isTrusted = void 0;
// 41103
o26.metaKey = false;
// 41104
o26.pageX = 640;
// 41105
o26.pageY = 613;
// 41106
o26.relatedTarget = null;
// 41107
o26.fromElement = null;
// 41110
o26.shiftKey = false;
// 41113
o26.timeStamp = 1374851259435;
// 41114
o26.type = "mousemove";
// 41115
o26.view = ow81632121;
// undefined
o26 = null;
// 41124
f81632121_1852.returns.push(undefined);
// 41127
f81632121_14.returns.push(undefined);
// 41128
f81632121_12.returns.push(189);
// 41131
o26 = {};
// 41134
o26.srcElement = o29;
// 41136
o26.target = o29;
// 41143
f81632121_506.returns.push(null);
// 41149
f81632121_506.returns.push(null);
// 41155
f81632121_506.returns.push(null);
// 41161
f81632121_506.returns.push(null);
// 41167
f81632121_506.returns.push(null);
// 41173
f81632121_506.returns.push(null);
// 41179
f81632121_506.returns.push(null);
// 41185
f81632121_506.returns.push(null);
// 41191
f81632121_506.returns.push(null);
// 41197
f81632121_506.returns.push(null);
// 41203
f81632121_506.returns.push(null);
// 41209
f81632121_506.returns.push(null);
// 41215
f81632121_506.returns.push(null);
// 41221
f81632121_506.returns.push(null);
// 41227
f81632121_506.returns.push(null);
// 41233
f81632121_506.returns.push(null);
// 41239
f81632121_506.returns.push(null);
// 41245
f81632121_506.returns.push(null);
// 41251
f81632121_506.returns.push(null);
// 41257
f81632121_506.returns.push(null);
// 41263
f81632121_506.returns.push(null);
// 41269
f81632121_506.returns.push(null);
// 41275
f81632121_506.returns.push(null);
// 41281
f81632121_506.returns.push(null);
// 41286
o26.relatedTarget = o21;
// 41291
f81632121_506.returns.push(null);
// 41297
f81632121_506.returns.push(null);
// 41303
f81632121_506.returns.push(null);
// 41309
f81632121_506.returns.push(null);
// 41315
f81632121_506.returns.push(null);
// 41321
f81632121_506.returns.push(null);
// 41327
f81632121_506.returns.push(null);
// 41333
f81632121_506.returns.push(null);
// 41339
f81632121_506.returns.push(null);
// 41345
f81632121_506.returns.push(null);
// 41351
f81632121_506.returns.push(null);
// 41357
f81632121_506.returns.push(null);
// 41363
f81632121_506.returns.push(null);
// 41369
f81632121_506.returns.push(null);
// 41375
f81632121_506.returns.push(null);
// 41381
f81632121_506.returns.push(null);
// 41387
f81632121_506.returns.push(null);
// 41393
f81632121_506.returns.push(null);
// 41399
f81632121_506.returns.push(null);
// 41405
f81632121_506.returns.push(null);
// 41411
f81632121_506.returns.push(null);
// 41416
o26.cancelBubble = false;
// 41417
o26.returnValue = true;
// undefined
o26 = null;
// 41418
o26 = {};
// 41421
o26.cancelBubble = false;
// 41424
f81632121_467.returns.push(1374851259471);
// 41429
f81632121_467.returns.push(1374851259472);
// 41433
f81632121_467.returns.push(1374851259472);
// 41437
f81632121_1007.returns.push(undefined);
// 41439
o26.returnValue = true;
// 41442
o26.srcElement = o21;
// 41444
o26.target = o21;
// 41451
f81632121_506.returns.push(null);
// 41457
f81632121_506.returns.push(null);
// 41463
f81632121_506.returns.push(null);
// 41469
f81632121_506.returns.push(null);
// 41475
f81632121_506.returns.push(null);
// 41481
f81632121_506.returns.push(null);
// 41487
f81632121_506.returns.push(null);
// 41493
f81632121_506.returns.push(null);
// 41499
f81632121_506.returns.push(null);
// 41505
f81632121_506.returns.push(null);
// 41511
f81632121_506.returns.push(null);
// 41517
f81632121_506.returns.push(null);
// 41523
f81632121_506.returns.push(null);
// 41529
f81632121_506.returns.push(null);
// 41535
f81632121_506.returns.push(null);
// 41541
f81632121_506.returns.push(null);
// 41547
f81632121_506.returns.push(null);
// 41553
f81632121_506.returns.push(null);
// 41559
f81632121_506.returns.push(null);
// 41565
f81632121_506.returns.push(null);
// 41571
f81632121_506.returns.push(null);
// 41576
o26.relatedTarget = o29;
// undefined
o26 = null;
// undefined
o29 = null;
// 41579
o26 = {};
// 41583
f81632121_467.returns.push(1374851259487);
// 41584
o26.cancelBubble = false;
// 41585
o26.returnValue = true;
// 41588
o26.srcElement = o21;
// 41590
o26.target = o21;
// 41597
f81632121_506.returns.push(null);
// 41603
f81632121_506.returns.push(null);
// 41609
f81632121_506.returns.push(null);
// 41615
f81632121_506.returns.push(null);
// 41621
f81632121_506.returns.push(null);
// 41627
f81632121_506.returns.push(null);
// 41633
f81632121_506.returns.push(null);
// 41639
f81632121_506.returns.push(null);
// 41645
f81632121_506.returns.push(null);
// 41651
f81632121_506.returns.push(null);
// 41657
f81632121_506.returns.push(null);
// 41663
f81632121_506.returns.push(null);
// 41669
f81632121_506.returns.push(null);
// 41675
f81632121_506.returns.push(null);
// 41681
f81632121_506.returns.push(null);
// 41687
f81632121_506.returns.push(null);
// 41693
f81632121_506.returns.push(null);
// 41699
f81632121_506.returns.push(null);
// 41705
f81632121_506.returns.push(null);
// 41711
f81632121_506.returns.push(null);
// 41717
f81632121_506.returns.push(null);
// 41722
o26.JSBNG__screenX = 688;
// 41723
o26.JSBNG__screenY = 364;
// 41724
o26.altKey = false;
// 41725
o26.bubbles = true;
// 41726
o26.button = 0;
// 41727
o26.buttons = void 0;
// 41728
o26.cancelable = false;
// 41729
o26.clientX = 620;
// 41730
o26.clientY = 199;
// 41731
o26.ctrlKey = false;
// 41732
o26.currentTarget = o0;
// 41733
o26.defaultPrevented = false;
// 41734
o26.detail = 0;
// 41735
o26.eventPhase = 3;
// 41736
o26.isTrusted = void 0;
// 41737
o26.metaKey = false;
// 41738
o26.pageX = 620;
// 41739
o26.pageY = 585;
// 41740
o26.relatedTarget = null;
// 41741
o26.fromElement = null;
// 41744
o26.shiftKey = false;
// 41747
o26.timeStamp = 1374851259487;
// 41748
o26.type = "mousemove";
// 41749
o26.view = ow81632121;
// undefined
o26 = null;
// 41758
f81632121_1852.returns.push(undefined);
// 41761
f81632121_14.returns.push(undefined);
// 41762
f81632121_12.returns.push(190);
// 41765
o26 = {};
// 41769
o29 = {};
// 41773
o31 = {};
// 41777
o32 = {};
// 41782
o1.getResponseHeader = f81632121_1332;
// 41785
f81632121_1332.returns.push("oMLTJk70LeP4URd4J/Y7tkIj3TYfbIGc+3lPscz4pI4=");
// 41788
f81632121_1332.returns.push("oMLTJk70LeP4URd4J/Y7tkIj3TYfbIGc+3lPscz4pI4=");
// 41789
// 41791
o1.JSBNG__status = 200;
// 41795
f81632121_467.returns.push(1374851259498);
// 41796
o8._handleXHRResponse = f81632121_1333;
// 41798
o8.getOption = f81632121_1334;
// 41799
o33 = {};
// 41800
o8.option = o33;
// 41801
o33.suppressEvaluation = false;
// 41804
f81632121_1334.returns.push(false);
// 41805
o1.responseText = "for (;;);{\"__ar\":1,\"payload\":null,\"jsmods\":{\"require\":[[\"m_b_0\"],[\"ButtonGroupMonitor\"],[\"m_b_3\"],[\"m_b_4\"],[\"m_b_a\"],[\"m_b_9\"],[\"Hovercard\",\"setDialog\",[\"m_b_0\"],[\"\\/ajax\\/hovercard\\/page.php?id=109486142404101\",{\"__m\":\"m_b_0\"}]]],\"instances\":[[\"m_b_9\",[\"HoverFlyout\",\"m_b_a\",\"m_b_c\"],[{\"__m\":\"m_b_a\"},{\"__m\":\"m_b_c\"},150,150],3],[\"m_b_a\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_b_b\"],[{\"width\":null,\"context\":null,\"contextID\":null,\"contextSelector\":null,\"position\":\"below\",\"alignment\":\"left\",\"offsetX\":0,\"offsetY\":0,\"arrowBehavior\":{\"__m\":\"ContextualDialogArrow\"},\"theme\":{\"__m\":\"ContextualDialogDefaultTheme\"},\"addedBehaviors\":[{\"__m\":\"LayerRemoveOnHide\"},{\"__m\":\"LayerHideOnTransition\"},{\"__m\":\"LayerFadeOnShow\"},{\"__m\":\"LayerHideOnEscape\"},{\"__m\":\"ContextualLayerAutoFlip\"},{\"__m\":\"DialogHideOnSuccess\"}]},{\"__m\":\"m_b_b\"}],3],[\"m_b_4\",[\"HoverButton\",\"m_b_7\",\"m_b_9\",\"m_b_8\"],[{\"__m\":\"m_b_7\"},{\"__m\":\"m_b_9\"},{\"__m\":\"m_b_8\"},\"\\/ajax\\/lists\\/interests_menu.php?profile_id=109486142404101&list_location=like_button&use_feedtracking=1\"],2],[\"m_b_0\",[\"ContextualDialog\",\"CovercardArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"ContextualLayerAutoFlip\",\"m_b_1\"],[{\"width\":null,\"context\":null,\"contextID\":null,\"contextSelector\":null,\"position\":\"above\",\"alignment\":\"left\",\"offsetX\":0,\"offsetY\":0,\"arrowBehavior\":{\"__m\":\"CovercardArrow\"},\"theme\":{\"__m\":\"ContextualDialogDefaultTheme\"},\"addedBehaviors\":[{\"__m\":\"LayerRemoveOnHide\"},{\"__m\":\"LayerHideOnTransition\"},{\"__m\":\"ContextualLayerAutoFlip\"}]},{\"__m\":\"m_b_1\"}],3],[\"m_b_3\",[\"SwapButtonDEPRECATED\",\"m_b_5\",\"m_b_6\"],[{\"__m\":\"m_b_5\"},{\"__m\":\"m_b_6\"},false],2]],\"elements\":[[\"m_b_6\",\"u_b_3\",2,\"m_b_1\"],[\"m_b_c\",\"u_b_3\",2,\"m_b_1\"],[\"m_b_5\",\"u_b_1\",2,\"m_b_1\"],[\"m_b_7\",\"u_b_3\",2,\"m_b_1\"],[\"m_b_2\",\"u_b_0\",2,\"m_b_1\"],[\"m_b_8\",\"u_b_4\",2,\"m_b_b\"]],\"markup\":[[\"m_b_b\",{\"__html\":\"\\u003Cdiv>\\u003Cdiv>\\u003Cdiv>\\u003Cdiv id=\\\"u_b_4\\\">\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yk\\/r\\/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" \\/>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\"},3],[\"m_b_1\",{\"__html\":\"\\u003Cdiv>\\u003Cdiv>\\u003Cdiv>\\u003Cdiv class=\\\"pam -cx-PRIVATE-hovercard__stage\\\" data-gt=\\\"&#123;&quot;ogs&quot;:&quot;27&quot;&#125;\\\">\\u003Cdiv>\\u003Ctable class=\\\"-cx-PRIVATE-hovercard__content\\\" cellpadding=\\\"0\\\" cellspacing=\\\"0\\\">\\u003Ctr>\\u003Ctd rowspan=\\\"2\\\" valign=\\\"top\\\">\\u003Ca href=\\\"https:\\/\\/www.facebook.com\\/pages\\/Milwaukie-High-School\\/109486142404101\\\">\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__profilepiccontainer\\\">\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-hovercard__profilephoto -cx-PRIVATE-uiSquareImage__huge img\\\" src=\\\"https:\\/\\/fbexternal-a.akamaihd.net\\/safe_image.php?d=AQAp0vzVmcAeDZqU&amp;w=100&amp;h=100&amp;url=http\\u00253A\\u00252F\\u00252Fupload.wikimedia.org\\u00252Fwikipedia\\u00252Fcommons\\u00252Fthumb\\u00252F8\\u00252F83\\u00252FMilwaukie_High_School_Front.jpg\\u00252F720px-Milwaukie_High_School_Front.jpg&amp;cfs=1&amp;fallback=hub_education\\\" alt=\\\"\\\" \\/>\\u003C\\/div>\\u003C\\/a>\\u003C\\/td>\\u003Ctd valign=\\\"top\\\">\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__title fsl fwb fcb\\\">\\u003Ca href=\\\"https:\\/\\/www.facebook.com\\/pages\\/Milwaukie-High-School\\/109486142404101\\\">\\u003Cdiv class=\\\"ellipsis\\\">Milwaukie High School\\u003C\\/div>\\u003C\\/a>\\u003C\\/div>\\u003Cdiv class=\\\"pageByline fsm fwn\\\">School\\u003C\\/div>\\u003Ca class=\\\"pageCityLink\\\" href=\\\"https:\\/\\/www.facebook.com\\/pages\\/Milwaukie-Oregon\\/108102499217697\\\">Milwaukie, OR\\u003C\\/a>\\u003C\\/td>\\u003C\\/tr>\\u003Ctr valign=\\\"bottom\\\">\\u003Ctd class=\\\"-cx-PRIVATE-hovercard__contentfooter\\\">\\u003Cdiv class=\\\"mts -cx-PRIVATE-hovercard__footer\\\">\\u003Cdiv class=\\\"fsm fwn fcg\\\">2,665 like this\\u003C\\/div>\\u003Cdiv class=\\\"fsm fwn fcg\\\">10 talking about this\\u003C\\/div>\\u003C\\/div>\\u003C\\/td>\\u003C\\/tr>\\u003C\\/table>\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__weakreferencebanner\\\">\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__footer -cx-PUBLIC-abstractContextualDialog__footer clearfix uiBoxGray topborder\\\">\\u003Cdiv class=\\\"clearfix rfloat\\\">\\u003Cspan class=\\\"uiButtonGroup\\\" id=\\\"u_b_0\\\">\\u003Cspan class=\\\"firstItem uiButtonGroupItem buttonItem\\\">\\u003Cspan class=\\\"-cx-PRIVATE-uiSwapButton__root PageLikeButton -cx-PRIVATE-pagesLikeButton__root\\\">\\u003Clabel class=\\\"uiButton\\\" id=\\\"u_b_1\\\" for=\\\"u_b_2\\\">\\u003Ci class=\\\"mrs img sp_at8kd9 sx_b4ec2c\\\">\\u003C\\/i>\\u003Cinput value=\\\"Like\\\" data-profileid=\\\"109486142404101\\\" data-ft=\\\"&#123;&quot;type&quot;:28,&quot;tn&quot;:&quot;c&quot;&#125;\\\" type=\\\"submit\\\" id=\\\"u_b_2\\\" \\/>\\u003C\\/label>\\u003Clabel class=\\\"PageLikedButton -cx-PUBLIC-uiHoverButton__root -cx-PRIVATE-uiSwapButton__secondbutton hidden_elem uiButton\\\" id=\\\"u_b_3\\\" for=\\\"u_b_5\\\">\\u003Ci class=\\\"mrs img sp_at8kd9 sx_d4ea38\\\">\\u003C\\/i>\\u003Cinput value=\\\"Liked\\\" data-profileid=\\\"109486142404101\\\" type=\\\"submit\\\" id=\\\"u_b_5\\\" \\/>\\u003C\\/label>\\u003C\\/span>\\u003C\\/span>\\u003Cspan class=\\\"uiButtonGroupItem buttonItem\\\">\\u003C\\/span>\\u003Cspan class=\\\"lastItem uiButtonGroupItem buttonItem\\\">\\u003C\\/span>\\u003C\\/span>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\"},7]]},\"css\":[\"UmFO+\",\"6T3FY\",\"veUjj\"],\"js\":[\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"\\/MWWQ\",\"56bk6\",\"nxD7O\",\"XH2Cu\",\"dShSX\",\"OYzUx\"],\"onload\":[\"PageLikeButton.init(require(\\\"m_b_3\\\"), $(\\\"u_b_1\\\"), require(\\\"m_b_4\\\"), \\\"109486142404101\\\", \\\"hovercard\\\", \\\"\\\", \\\"\\\", \\\"\\\", 0, false, true);\"],\"bootloadable\":{\"IframeShim\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"\\/MWWQ\",\"MqSmz\"],\"module\":true},\"Dialog\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\"],\"module\":true},\"SortableSideNav\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"\\/MWWQ\",\"6tAwh\",\"C03uu\"],\"module\":true},\"AsyncDOM\":{\"resources\":[\"OH3xD\",\"WLpRY\"],\"module\":true},\"React\":{\"resources\":[\"XH2Cu\",\"OH3xD\"],\"module\":true},\"ExplicitHover\":{\"resources\":[\"OH3xD\",\"aOO05\"],\"module\":true},\"ConfirmationDialog\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"oE4Do\"],\"module\":true}},\"resource_map\":{\"dShSX\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yZ\\/r\\/JdjE3mVpxG6.js\"},\"oE4Do\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yq\\/r\\/MDwOqV08JHh.js\"},\"UmFO+\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yP\\/r\\/9mw4nQDxDC9.css\"},\"56bk6\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yG\\/r\\/K4ecOGlF2pP.js\"},\"AVmr9\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yR\\/r\\/n7J6-ECl4cu.js\"},\"6T3FY\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yZ\\/r\\/6TQwVHfa0ql.css\"},\"OH3xD\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yJ\\/r\\/MAGRPTCpjAg.js\"},\"XH2Cu\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yd\\/r\\/clqWNoT9Gz_.js\"},\"C03uu\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yC\\/r\\/3fdQLPa9g1g.js\"},\"MqSmz\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yH\\/r\\/ghlEJgSKAee.js\"},\"nxD7O\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y3\\/r\\/8VWsK8lNjX5.js\"},\"6tAwh\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yM\\/r\\/Oe0OO6kzRjj.js\"},\"WLpRY\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y_\\/r\\/gen4xnT_5g3.js\"},\"\\/MWWQ\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yd\\/r\\/cV-1QIoVTI-.js\"},\"f7Tpb\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y5\\/r\\/eV_B8SPw3se.js\"},\"OYzUx\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yN\\/r\\/bD9K1YDrR29.js\"},\"aOO05\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yW\\/r\\/zpbGrZRQcFa.js\"},\"veUjj\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yM\\/r\\/IqonxdwHUtT.css\"}},\"ixData\":[]}";
// 41806
o8._unshieldResponseText = f81632121_1336;
// 41807
f81632121_1336.returns.push("{\"__ar\":1,\"payload\":null,\"jsmods\":{\"require\":[[\"m_b_0\"],[\"ButtonGroupMonitor\"],[\"m_b_3\"],[\"m_b_4\"],[\"m_b_a\"],[\"m_b_9\"],[\"Hovercard\",\"setDialog\",[\"m_b_0\"],[\"\\/ajax\\/hovercard\\/page.php?id=109486142404101\",{\"__m\":\"m_b_0\"}]]],\"instances\":[[\"m_b_9\",[\"HoverFlyout\",\"m_b_a\",\"m_b_c\"],[{\"__m\":\"m_b_a\"},{\"__m\":\"m_b_c\"},150,150],3],[\"m_b_a\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_b_b\"],[{\"width\":null,\"context\":null,\"contextID\":null,\"contextSelector\":null,\"position\":\"below\",\"alignment\":\"left\",\"offsetX\":0,\"offsetY\":0,\"arrowBehavior\":{\"__m\":\"ContextualDialogArrow\"},\"theme\":{\"__m\":\"ContextualDialogDefaultTheme\"},\"addedBehaviors\":[{\"__m\":\"LayerRemoveOnHide\"},{\"__m\":\"LayerHideOnTransition\"},{\"__m\":\"LayerFadeOnShow\"},{\"__m\":\"LayerHideOnEscape\"},{\"__m\":\"ContextualLayerAutoFlip\"},{\"__m\":\"DialogHideOnSuccess\"}]},{\"__m\":\"m_b_b\"}],3],[\"m_b_4\",[\"HoverButton\",\"m_b_7\",\"m_b_9\",\"m_b_8\"],[{\"__m\":\"m_b_7\"},{\"__m\":\"m_b_9\"},{\"__m\":\"m_b_8\"},\"\\/ajax\\/lists\\/interests_menu.php?profile_id=109486142404101&list_location=like_button&use_feedtracking=1\"],2],[\"m_b_0\",[\"ContextualDialog\",\"CovercardArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"ContextualLayerAutoFlip\",\"m_b_1\"],[{\"width\":null,\"context\":null,\"contextID\":null,\"contextSelector\":null,\"position\":\"above\",\"alignment\":\"left\",\"offsetX\":0,\"offsetY\":0,\"arrowBehavior\":{\"__m\":\"CovercardArrow\"},\"theme\":{\"__m\":\"ContextualDialogDefaultTheme\"},\"addedBehaviors\":[{\"__m\":\"LayerRemoveOnHide\"},{\"__m\":\"LayerHideOnTransition\"},{\"__m\":\"ContextualLayerAutoFlip\"}]},{\"__m\":\"m_b_1\"}],3],[\"m_b_3\",[\"SwapButtonDEPRECATED\",\"m_b_5\",\"m_b_6\"],[{\"__m\":\"m_b_5\"},{\"__m\":\"m_b_6\"},false],2]],\"elements\":[[\"m_b_6\",\"u_b_3\",2,\"m_b_1\"],[\"m_b_c\",\"u_b_3\",2,\"m_b_1\"],[\"m_b_5\",\"u_b_1\",2,\"m_b_1\"],[\"m_b_7\",\"u_b_3\",2,\"m_b_1\"],[\"m_b_2\",\"u_b_0\",2,\"m_b_1\"],[\"m_b_8\",\"u_b_4\",2,\"m_b_b\"]],\"markup\":[[\"m_b_b\",{\"__html\":\"\\u003Cdiv>\\u003Cdiv>\\u003Cdiv>\\u003Cdiv id=\\\"u_b_4\\\">\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yk\\/r\\/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" \\/>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\"},3],[\"m_b_1\",{\"__html\":\"\\u003Cdiv>\\u003Cdiv>\\u003Cdiv>\\u003Cdiv class=\\\"pam -cx-PRIVATE-hovercard__stage\\\" data-gt=\\\"&#123;&quot;ogs&quot;:&quot;27&quot;&#125;\\\">\\u003Cdiv>\\u003Ctable class=\\\"-cx-PRIVATE-hovercard__content\\\" cellpadding=\\\"0\\\" cellspacing=\\\"0\\\">\\u003Ctr>\\u003Ctd rowspan=\\\"2\\\" valign=\\\"top\\\">\\u003Ca href=\\\"https:\\/\\/www.facebook.com\\/pages\\/Milwaukie-High-School\\/109486142404101\\\">\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__profilepiccontainer\\\">\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-hovercard__profilephoto -cx-PRIVATE-uiSquareImage__huge img\\\" src=\\\"https:\\/\\/fbexternal-a.akamaihd.net\\/safe_image.php?d=AQAp0vzVmcAeDZqU&amp;w=100&amp;h=100&amp;url=http\\u00253A\\u00252F\\u00252Fupload.wikimedia.org\\u00252Fwikipedia\\u00252Fcommons\\u00252Fthumb\\u00252F8\\u00252F83\\u00252FMilwaukie_High_School_Front.jpg\\u00252F720px-Milwaukie_High_School_Front.jpg&amp;cfs=1&amp;fallback=hub_education\\\" alt=\\\"\\\" \\/>\\u003C\\/div>\\u003C\\/a>\\u003C\\/td>\\u003Ctd valign=\\\"top\\\">\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__title fsl fwb fcb\\\">\\u003Ca href=\\\"https:\\/\\/www.facebook.com\\/pages\\/Milwaukie-High-School\\/109486142404101\\\">\\u003Cdiv class=\\\"ellipsis\\\">Milwaukie High School\\u003C\\/div>\\u003C\\/a>\\u003C\\/div>\\u003Cdiv class=\\\"pageByline fsm fwn\\\">School\\u003C\\/div>\\u003Ca class=\\\"pageCityLink\\\" href=\\\"https:\\/\\/www.facebook.com\\/pages\\/Milwaukie-Oregon\\/108102499217697\\\">Milwaukie, OR\\u003C\\/a>\\u003C\\/td>\\u003C\\/tr>\\u003Ctr valign=\\\"bottom\\\">\\u003Ctd class=\\\"-cx-PRIVATE-hovercard__contentfooter\\\">\\u003Cdiv class=\\\"mts -cx-PRIVATE-hovercard__footer\\\">\\u003Cdiv class=\\\"fsm fwn fcg\\\">2,665 like this\\u003C\\/div>\\u003Cdiv class=\\\"fsm fwn fcg\\\">10 talking about this\\u003C\\/div>\\u003C\\/div>\\u003C\\/td>\\u003C\\/tr>\\u003C\\/table>\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__weakreferencebanner\\\">\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\\u003Cdiv class=\\\"-cx-PRIVATE-hovercard__footer -cx-PUBLIC-abstractContextualDialog__footer clearfix uiBoxGray topborder\\\">\\u003Cdiv class=\\\"clearfix rfloat\\\">\\u003Cspan class=\\\"uiButtonGroup\\\" id=\\\"u_b_0\\\">\\u003Cspan class=\\\"firstItem uiButtonGroupItem buttonItem\\\">\\u003Cspan class=\\\"-cx-PRIVATE-uiSwapButton__root PageLikeButton -cx-PRIVATE-pagesLikeButton__root\\\">\\u003Clabel class=\\\"uiButton\\\" id=\\\"u_b_1\\\" for=\\\"u_b_2\\\">\\u003Ci class=\\\"mrs img sp_at8kd9 sx_b4ec2c\\\">\\u003C\\/i>\\u003Cinput value=\\\"Like\\\" data-profileid=\\\"109486142404101\\\" data-ft=\\\"&#123;&quot;type&quot;:28,&quot;tn&quot;:&quot;c&quot;&#125;\\\" type=\\\"submit\\\" id=\\\"u_b_2\\\" \\/>\\u003C\\/label>\\u003Clabel class=\\\"PageLikedButton -cx-PUBLIC-uiHoverButton__root -cx-PRIVATE-uiSwapButton__secondbutton hidden_elem uiButton\\\" id=\\\"u_b_3\\\" for=\\\"u_b_5\\\">\\u003Ci class=\\\"mrs img sp_at8kd9 sx_d4ea38\\\">\\u003C\\/i>\\u003Cinput value=\\\"Liked\\\" data-profileid=\\\"109486142404101\\\" type=\\\"submit\\\" id=\\\"u_b_5\\\" \\/>\\u003C\\/label>\\u003C\\/span>\\u003C\\/span>\\u003Cspan class=\\\"uiButtonGroupItem buttonItem\\\">\\u003C\\/span>\\u003Cspan class=\\\"lastItem uiButtonGroupItem buttonItem\\\">\\u003C\\/span>\\u003C\\/span>\\u003C\\/div>\\u003C\\/div>\\u003C\\/div>\"},7]]},\"css\":[\"UmFO+\",\"6T3FY\",\"veUjj\"],\"js\":[\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"\\/MWWQ\",\"56bk6\",\"nxD7O\",\"XH2Cu\",\"dShSX\",\"OYzUx\"],\"onload\":[\"PageLikeButton.init(require(\\\"m_b_3\\\"), $(\\\"u_b_1\\\"), require(\\\"m_b_4\\\"), \\\"109486142404101\\\", \\\"hovercard\\\", \\\"\\\", \\\"\\\", \\\"\\\", 0, false, true);\"],\"bootloadable\":{\"IframeShim\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"\\/MWWQ\",\"MqSmz\"],\"module\":true},\"Dialog\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\"],\"module\":true},\"SortableSideNav\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"\\/MWWQ\",\"6tAwh\",\"C03uu\"],\"module\":true},\"AsyncDOM\":{\"resources\":[\"OH3xD\",\"WLpRY\"],\"module\":true},\"React\":{\"resources\":[\"XH2Cu\",\"OH3xD\"],\"module\":true},\"ExplicitHover\":{\"resources\":[\"OH3xD\",\"aOO05\"],\"module\":true},\"ConfirmationDialog\":{\"resources\":[\"OH3xD\",\"f7Tpb\",\"oE4Do\"],\"module\":true}},\"resource_map\":{\"dShSX\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yZ\\/r\\/JdjE3mVpxG6.js\"},\"oE4Do\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yq\\/r\\/MDwOqV08JHh.js\"},\"UmFO+\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yP\\/r\\/9mw4nQDxDC9.css\"},\"56bk6\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yG\\/r\\/K4ecOGlF2pP.js\"},\"AVmr9\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yR\\/r\\/n7J6-ECl4cu.js\"},\"6T3FY\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yZ\\/r\\/6TQwVHfa0ql.css\"},\"OH3xD\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yJ\\/r\\/MAGRPTCpjAg.js\"},\"XH2Cu\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yd\\/r\\/clqWNoT9Gz_.js\"},\"C03uu\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yC\\/r\\/3fdQLPa9g1g.js\"},\"MqSmz\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yH\\/r\\/ghlEJgSKAee.js\"},\"nxD7O\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y3\\/r\\/8VWsK8lNjX5.js\"},\"6tAwh\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yM\\/r\\/Oe0OO6kzRjj.js\"},\"WLpRY\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y_\\/r\\/gen4xnT_5g3.js\"},\"\\/MWWQ\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yd\\/r\\/cV-1QIoVTI-.js\"},\"f7Tpb\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/y5\\/r\\/eV_B8SPw3se.js\"},\"OYzUx\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yN\\/r\\/bD9K1YDrR29.js\"},\"aOO05\":{\"type\":\"js\",\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yW\\/r\\/zpbGrZRQcFa.js\"},\"veUjj\":{\"type\":\"css\",\"permanent\":1,\"crossOrigin\":1,\"src\":\"https:\\/\\/static.xx.fbcdn.net\\/rsrc.php\\/v2\\/yM\\/r\\/IqonxdwHUtT.css\"}},\"ixData\":[]}");
// 41808
o8._interpretResponse = f81632121_1337;
// 41809
f81632121_1337.returns.push({__JSBNG_unknown_object:true});
// 41810
o8.invokeResponseHandler = f81632121_1338;
// 41811
o8.handler = null;
// 41812
f81632121_2758 = function() { return f81632121_2758.returns[f81632121_2758.inst++]; };
f81632121_2758.returns = [];
f81632121_2758.inst = 0;
// 41813
o8.errorHandler = f81632121_2758;
// 41814
o8._isRelevant = f81632121_1340;
// 41815
o8._allowCrossPageTransition = void 0;
// 41816
o8.id = 10;
// 41818
f81632121_1340.returns.push(true);
// 41819
o8._dispatchResponse = f81632121_1341;
// 41820
o8.getURI = f81632121_1342;
// 41821
o34 = {};
// 41822
o8.uri = o34;
// 41824
o34.$URIBase0 = "";
// 41825
o34.$URIBase1 = "";
// 41826
o34.$URIBase2 = "";
// 41827
o34.$URIBase3 = "/ajax/hovercard/page.php";
// 41829
o35 = {};
// 41830
o34.$URIBase5 = o35;
// 41832
f81632121_1662.returns.push(true);
// 41833
o35.__a = 1;
// 41836
f81632121_1662.returns.push(true);
// 41837
o35.__dyn = "7n8ahyj2qmvudDgDxqjEHznBw";
// 41840
f81632121_1662.returns.push(true);
// 41841
o35.__req = "b";
// 41844
f81632121_1662.returns.push(true);
// 41845
o35.__user = "100006118350059";
// 41848
f81632121_1662.returns.push(true);
// 41849
o35.endpoint = "/ajax/hovercard/page.php?id=109486142404101";
// 41852
f81632121_1662.returns.push(true);
// 41853
o35.id = "109486142404101";
// 41855
o34.$URIBase4 = "";
// 41856
f81632121_1344.returns.push("/ajax/hovercard/page.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=b&__user=100006118350059&endpoint=%2Fajax%2Fhovercard%2Fpage.php%3Fid%3D109486142404101&id=109486142404101");
// 41857
f81632121_1342.returns.push("/ajax/hovercard/page.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=b&__user=100006118350059&endpoint=%2Fajax%2Fhovercard%2Fpage.php%3Fid%3D109486142404101&id=109486142404101");
// 41858
o8.preBootloadHandler = void 0;
// 41869
f81632121_1662.returns.push(true);
// 41873
f81632121_1662.returns.push(true);
// 41877
f81632121_1662.returns.push(true);
// 41881
f81632121_1662.returns.push(true);
// 41885
f81632121_1662.returns.push(true);
// 41889
f81632121_1662.returns.push(true);
// 41893
f81632121_1344.returns.push("/ajax/hovercard/page.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=b&__user=100006118350059&endpoint=%2Fajax%2Fhovercard%2Fpage.php%3Fid%3D109486142404101&id=109486142404101");
// 41894
f81632121_1342.returns.push("/ajax/hovercard/page.php?__a=1&__dyn=7n8ahyj2qmvudDgDxqjEHznBw&__req=b&__user=100006118350059&endpoint=%2Fajax%2Fhovercard%2Fpage.php%3Fid%3D109486142404101&id=109486142404101");
// 41898
o36 = {};
// 41899
f81632121_474.returns.push(o36);
// 41901
f81632121_467.returns.push(1374851259510);
// 41903
o39 = {};
// 41904
f81632121_476.returns.push(o39);
// 41905
// 41906
// 41907
// 41908
// 41909
// 41910
// 41911
o36.appendChild = f81632121_478;
// 41912
f81632121_478.returns.push(o39);
// undefined
o39 = null;
// 41914
f81632121_478.returns.push(o36);
// undefined
o36 = null;
// 41915
f81632121_1338.returns.push(undefined);
// 41916
f81632121_1333.returns.push(undefined);
// 41919
o33.asynchronous = true;
// undefined
o33 = null;
// 41922
f81632121_1334.returns.push(true);
// 41923
// 41924
o33 = {};
// 41927
o33.srcElement = o21;
// 41929
o33.target = o21;
// 41936
f81632121_506.returns.push(null);
// 41942
f81632121_506.returns.push(null);
// 41948
f81632121_506.returns.push(null);
// 41954
f81632121_506.returns.push(null);
// 41960
f81632121_506.returns.push(null);
// 41966
f81632121_506.returns.push(null);
// 41972
f81632121_506.returns.push(null);
// 41978
f81632121_506.returns.push(null);
// 41984
f81632121_506.returns.push(null);
// 41990
f81632121_506.returns.push(null);
// 41996
f81632121_506.returns.push(null);
// 42002
f81632121_506.returns.push(null);
// 42008
f81632121_506.returns.push(null);
// 42014
f81632121_506.returns.push(null);
// 42020
f81632121_506.returns.push(null);
// 42026
f81632121_506.returns.push(null);
// 42032
f81632121_506.returns.push(null);
// 42038
f81632121_506.returns.push(null);
// 42044
f81632121_506.returns.push(null);
// 42050
f81632121_506.returns.push(null);
// 42056
f81632121_506.returns.push(null);
// 42061
o33.relatedTarget = o20;
// 42066
f81632121_506.returns.push(null);
// 42072
f81632121_506.returns.push(null);
// 42078
f81632121_506.returns.push(null);
// 42084
f81632121_506.returns.push(null);
// 42090
f81632121_506.returns.push(null);
// 42096
f81632121_506.returns.push(null);
// 42102
f81632121_506.returns.push(null);
// 42108
f81632121_506.returns.push(null);
// 42114
f81632121_506.returns.push(null);
// 42120
f81632121_506.returns.push(null);
// 42126
f81632121_506.returns.push(null);
// 42132
f81632121_506.returns.push(null);
// 42138
f81632121_506.returns.push(null);
// 42144
f81632121_506.returns.push(null);
// 42150
f81632121_506.returns.push(null);
// 42156
f81632121_506.returns.push(null);
// 42162
f81632121_506.returns.push(null);
// 42168
f81632121_506.returns.push(null);
// 42174
f81632121_506.returns.push(null);
// 42179
o33.cancelBubble = false;
// 42180
o33.returnValue = true;
// undefined
o33 = null;
// 42181
o33 = {};
// 42184
o33.cancelBubble = false;
// 42187
f81632121_467.returns.push(1374851259529);
// 42190
f81632121_1007.returns.push(undefined);
// 42192
o33.returnValue = true;
// 42195
o33.srcElement = o20;
// 42197
o33.target = o20;
// 42204
f81632121_506.returns.push(null);
// 42210
f81632121_506.returns.push(null);
// 42216
f81632121_506.returns.push(null);
// 42222
f81632121_506.returns.push(null);
// 42228
f81632121_506.returns.push(null);
// 42234
f81632121_506.returns.push(null);
// 42240
f81632121_506.returns.push(null);
// 42246
f81632121_506.returns.push(null);
// 42252
f81632121_506.returns.push(null);
// 42258
f81632121_506.returns.push(null);
// 42264
f81632121_506.returns.push(null);
// 42270
f81632121_506.returns.push(null);
// 42276
f81632121_506.returns.push(null);
// 42282
f81632121_506.returns.push(null);
// 42288
f81632121_506.returns.push(null);
// 42294
f81632121_506.returns.push(null);
// 42300
f81632121_506.returns.push(null);
// 42306
f81632121_506.returns.push(null);
// 42312
f81632121_506.returns.push(null);
// 42317
o33.relatedTarget = o21;
// undefined
o33 = null;
// undefined
o21 = null;
// 42320
o21 = {};
// 42324
f81632121_467.returns.push(1374851259537);
// 42325
o21.cancelBubble = false;
// 42326
o21.returnValue = true;
// 42329
o21.srcElement = o20;
// 42331
o21.target = o20;
// 42338
f81632121_506.returns.push(null);
// 42344
f81632121_506.returns.push(null);
// 42350
f81632121_506.returns.push(null);
// 42356
f81632121_506.returns.push(null);
// 42362
f81632121_506.returns.push(null);
// 42368
f81632121_506.returns.push(null);
// 42374
f81632121_506.returns.push(null);
// 42380
f81632121_506.returns.push(null);
// 42386
f81632121_506.returns.push(null);
// 42392
f81632121_506.returns.push(null);
// 42398
f81632121_506.returns.push(null);
// 42404
f81632121_506.returns.push(null);
// 42410
f81632121_506.returns.push(null);
// 42416
f81632121_506.returns.push(null);
// 42422
f81632121_506.returns.push(null);
// 42428
f81632121_506.returns.push(null);
// 42434
f81632121_506.returns.push(null);
// 42440
f81632121_506.returns.push(null);
// 42446
f81632121_506.returns.push(null);
// 42451
o21.JSBNG__screenX = 664;
// 42452
o21.JSBNG__screenY = 318;
// 42453
o21.altKey = false;
// 42454
o21.bubbles = true;
// 42455
o21.button = 0;
// 42456
o21.buttons = void 0;
// 42457
o21.cancelable = false;
// 42458
o21.clientX = 596;
// 42459
o21.clientY = 153;
// 42460
o21.ctrlKey = false;
// 42461
o21.currentTarget = o0;
// 42462
o21.defaultPrevented = false;
// 42463
o21.detail = 0;
// 42464
o21.eventPhase = 3;
// 42465
o21.isTrusted = void 0;
// 42466
o21.metaKey = false;
// 42467
o21.pageX = 596;
// 42468
o21.pageY = 539;
// 42469
o21.relatedTarget = null;
// 42470
o21.fromElement = null;
// 42473
o21.shiftKey = false;
// 42476
o21.timeStamp = 1374851259533;
// 42477
o21.type = "mousemove";
// 42478
o21.view = ow81632121;
// undefined
o21 = null;
// 42487
f81632121_1852.returns.push(undefined);
// 42490
f81632121_14.returns.push(undefined);
// 42491
f81632121_12.returns.push(191);
// 42494
o21 = {};
// 42497
o21.srcElement = o20;
// 42499
o21.target = o20;
// 42506
f81632121_506.returns.push(null);
// 42512
f81632121_506.returns.push(null);
// 42518
f81632121_506.returns.push(null);
// 42524
f81632121_506.returns.push(null);
// 42530
f81632121_506.returns.push(null);
// 42536
f81632121_506.returns.push(null);
// 42542
f81632121_506.returns.push(null);
// 42548
f81632121_506.returns.push(null);
// 42554
f81632121_506.returns.push(null);
// 42560
f81632121_506.returns.push(null);
// 42566
f81632121_506.returns.push(null);
// 42572
f81632121_506.returns.push(null);
// 42578
f81632121_506.returns.push(null);
// 42584
f81632121_506.returns.push(null);
// 42590
f81632121_506.returns.push(null);
// 42596
f81632121_506.returns.push(null);
// 42602
f81632121_506.returns.push(null);
// 42608
f81632121_506.returns.push(null);
// 42614
f81632121_506.returns.push(null);
// 42619
o21.relatedTarget = o183;
// 42624
f81632121_506.returns.push(null);
// 42630
f81632121_506.returns.push(null);
// 42636
f81632121_506.returns.push(null);
// 42642
f81632121_506.returns.push(null);
// 42648
f81632121_506.returns.push(null);
// 42654
f81632121_506.returns.push(null);
// 42660
f81632121_506.returns.push(null);
// 42666
f81632121_506.returns.push(null);
// 42672
f81632121_506.returns.push(null);
// 42678
f81632121_506.returns.push(null);
// 42684
f81632121_506.returns.push(null);
// 42690
f81632121_506.returns.push(null);
// 42696
f81632121_506.returns.push(null);
// 42702
f81632121_506.returns.push(null);
// 42708
f81632121_506.returns.push(null);
// 42713
o21.cancelBubble = false;
// 42714
o21.returnValue = true;
// undefined
o21 = null;
// 42715
o21 = {};
// 42718
o21.cancelBubble = false;
// 42721
f81632121_467.returns.push(1374851259564);
// 42724
f81632121_1007.returns.push(undefined);
// 42726
o21.returnValue = true;
// 42729
o21.srcElement = o183;
// 42731
o21.target = o183;
// 42738
f81632121_506.returns.push(null);
// 42744
f81632121_506.returns.push(null);
// 42750
f81632121_506.returns.push(null);
// 42756
f81632121_506.returns.push(null);
// 42762
f81632121_506.returns.push(null);
// 42768
f81632121_506.returns.push(null);
// 42774
f81632121_506.returns.push(null);
// 42780
f81632121_506.returns.push(null);
// 42786
f81632121_506.returns.push(null);
// 42792
f81632121_506.returns.push(null);
// 42798
f81632121_506.returns.push(null);
// 42804
f81632121_506.returns.push(null);
// 42810
f81632121_506.returns.push(null);
// 42816
f81632121_506.returns.push(null);
// 42822
f81632121_506.returns.push(null);
// 42827
o21.relatedTarget = o20;
// undefined
o21 = null;
// undefined
o20 = null;
// 42830
o20 = {};
// 42834
f81632121_467.returns.push(1374851259569);
// 42835
o20.cancelBubble = false;
// 42836
o20.returnValue = true;
// 42839
o20.srcElement = o183;
// 42841
o20.target = o183;
// 42848
f81632121_506.returns.push(null);
// 42854
f81632121_506.returns.push(null);
// 42860
f81632121_506.returns.push(null);
// 42866
f81632121_506.returns.push(null);
// 42872
f81632121_506.returns.push(null);
// 42878
f81632121_506.returns.push(null);
// 42884
f81632121_506.returns.push(null);
// 42890
f81632121_506.returns.push(null);
// 42896
f81632121_506.returns.push(null);
// 42902
f81632121_506.returns.push(null);
// 42908
f81632121_506.returns.push(null);
// 42914
f81632121_506.returns.push(null);
// 42920
f81632121_506.returns.push(null);
// 42926
f81632121_506.returns.push(null);
// 42932
f81632121_506.returns.push(null);
// 42937
o20.JSBNG__screenX = 660;
// 42938
o20.JSBNG__screenY = 306;
// 42939
o20.altKey = false;
// 42940
o20.bubbles = true;
// 42941
o20.button = 0;
// 42942
o20.buttons = void 0;
// 42943
o20.cancelable = false;
// 42944
o20.clientX = 592;
// 42945
o20.clientY = 141;
// 42946
o20.ctrlKey = false;
// 42947
o20.currentTarget = o0;
// 42948
o20.defaultPrevented = false;
// 42949
o20.detail = 0;
// 42950
o20.eventPhase = 3;
// 42951
o20.isTrusted = void 0;
// 42952
o20.metaKey = false;
// 42953
o20.pageX = 592;
// 42954
o20.pageY = 527;
// 42955
o20.relatedTarget = null;
// 42956
o20.fromElement = null;
// 42959
o20.shiftKey = false;
// 42962
o20.timeStamp = 1374851259569;
// 42963
o20.type = "mousemove";
// 42964
o20.view = ow81632121;
// undefined
o20 = null;
// 42973
f81632121_1852.returns.push(undefined);
// 42976
f81632121_14.returns.push(undefined);
// 42977
f81632121_12.returns.push(192);
// 42981
f81632121_12.returns.push(193);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 42983
o20 = {};
// undefined
o20 = null;
// 42985
f81632121_12.returns.push(194);
// 42988
o8.clearStatusIndicator = f81632121_1347;
// 42989
o8.getStatusElement = f81632121_1348;
// 42990
o8.statusElement = null;
// 42991
f81632121_1348.returns.push(null);
// 42992
f81632121_1347.returns.push(undefined);
// 42997
f81632121_1340.returns.push(true);
// 42998
o8.initialHandler = f81632121_1349;
// 42999
f81632121_1349.returns.push(undefined);
// 43000
o8.timer = null;
// 43001
f81632121_14.returns.push(undefined);
// 43003
o8._handleJSResponse = f81632121_1351;
// 43004
o8.getRelativeTo = f81632121_1352;
// 43005
o8.relativeTo = null;
// 43006
f81632121_1352.returns.push(null);
// 43011
o20 = {};
// 43012
f81632121_476.returns.push(o20);
// 43013
// 43014
// 43015
o20.getElementsByTagName = f81632121_502;
// 43016
o21 = {};
// 43017
f81632121_502.returns.push(o21);
// 43018
o21.length = 0;
// undefined
o21 = null;
// 43020
o21 = {};
// 43021
o20.childNodes = o21;
// undefined
o20 = null;
// 43022
o21.nodeType = void 0;
// 43023
o21.getAttributeNode = void 0;
// 43024
o21.getElementsByTagName = void 0;
// 43025
o21.childNodes = void 0;
// undefined
o21 = null;
// 43044
o20 = {};
// 43045
f81632121_476.returns.push(o20);
// 43046
// 43047
// 43048
o20.getElementsByTagName = f81632121_502;
// 43049
o21 = {};
// 43050
f81632121_502.returns.push(o21);
// 43051
o21.length = 0;
// undefined
o21 = null;
// 43053
o21 = {};
// 43054
o20.childNodes = o21;
// undefined
o20 = null;
// 43055
o21.nodeType = void 0;
// 43056
o21.getAttributeNode = void 0;
// 43057
o21.getElementsByTagName = void 0;
// 43058
o21.childNodes = void 0;
// 43070
o21.__html = void 0;
// 43071
o21.mountComponentIntoNode = void 0;
// 43072
o21.classList = void 0;
// 43074
o21.className = void 0;
// 43076
// undefined
o21 = null;
// 43078
o20 = {};
// 43079
f81632121_476.returns.push(o20);
// 43080
o20.firstChild = null;
// 43082
o21 = {};
// 43083
f81632121_474.returns.push(o21);
// 43085
o20.appendChild = f81632121_478;
// 43086
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 43088
o21 = {};
// 43089
f81632121_476.returns.push(o21);
// 43090
// 43091
o21.firstChild = null;
// 43092
o20.__html = void 0;
// undefined
o20 = null;
// 43094
o20 = {};
// 43095
f81632121_474.returns.push(o20);
// 43097
o21.appendChild = f81632121_478;
// 43098
f81632121_478.returns.push(o20);
// undefined
o20 = null;
// 43100
o20 = {};
// 43101
f81632121_476.returns.push(o20);
// 43102
// 43103
o20.firstChild = null;
// 43104
o21.__html = void 0;
// undefined
o21 = null;
// 43106
o21 = {};
// 43107
f81632121_474.returns.push(o21);
// 43109
o20.appendChild = f81632121_478;
// 43110
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 43111
o21 = {};
// 43112
o20.classList = o21;
// 43114
o21.add = f81632121_602;
// undefined
o21 = null;
// 43115
f81632121_602.returns.push(undefined);
// 43119
f81632121_602.returns.push(undefined);
// 43120
o20.__FB_TOKEN = void 0;
// 43121
// 43122
o20.nodeName = "DIV";
// 43123
o20.getAttribute = f81632121_506;
// 43124
o20.hasAttribute = f81632121_507;
// 43126
f81632121_507.returns.push(false);
// 43127
o20.JSBNG__addEventListener = f81632121_468;
// 43129
f81632121_468.returns.push(undefined);
// 43130
o20.JSBNG__onclick = null;
// 43135
f81632121_468.returns.push(undefined);
// 43136
o20.JSBNG__onsubmit = null;
// 43141
f81632121_468.returns.push(undefined);
// 43142
o20.JSBNG__onsuccess = void 0;
// 43147
f81632121_468.returns.push(undefined);
// 43148
o20.JSBNG__onerror = null;
// undefined
o20 = null;
// 43150
f81632121_12.returns.push(195);
// 43153
o8._handleJSRegisters = f81632121_1353;
// 43154
f81632121_1353.returns.push(undefined);
// 43155
o8.lid = void 0;
// 43157
f81632121_1353.returns.push(undefined);
// 43163
f81632121_1351.returns.push(undefined);
// 43164
o8.finallyHandler = f81632121_1349;
// 43165
f81632121_1349.returns.push(undefined);
// 43166
f81632121_1341.returns.push(undefined);
// 43169
f81632121_12.returns.push(196);
// 43173
o20 = {};
// 43174
f81632121_476.returns.push(o20);
// 43175
// 43176
o20.firstChild = null;
// 43178
o21 = {};
// 43179
f81632121_474.returns.push(o21);
// 43181
o33 = {};
// 43182
f81632121_598.returns.push(o33);
// 43183
o21.appendChild = f81632121_478;
// 43184
f81632121_478.returns.push(o33);
// undefined
o33 = null;
// 43185
o20.appendChild = f81632121_478;
// 43186
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 43187
o20.getElementsByTagName = f81632121_502;
// 43189
o20.querySelectorAll = f81632121_504;
// 43190
o21 = {};
// 43191
f81632121_504.returns.push(o21);
// 43192
o21.length = 0;
// undefined
o21 = null;
// 43193
o20.__html = void 0;
// 43194
o20.mountComponentIntoNode = void 0;
// 43195
o21 = {};
// 43196
o20.classList = o21;
// undefined
o20 = null;
// 43198
o21.add = f81632121_602;
// undefined
o21 = null;
// 43199
f81632121_602.returns.push(undefined);
// 43201
o20 = {};
// 43202
f81632121_476.returns.push(o20);
// 43203
o20.firstChild = null;
// 43205
o21 = {};
// 43206
f81632121_474.returns.push(o21);
// 43208
o20.appendChild = f81632121_478;
// 43209
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 43211
o21 = {};
// 43212
f81632121_476.returns.push(o21);
// 43213
// 43214
o21.firstChild = null;
// 43215
o20.__html = void 0;
// 43217
o33 = {};
// 43218
f81632121_474.returns.push(o33);
// 43220
o21.appendChild = f81632121_478;
// 43221
f81632121_478.returns.push(o33);
// undefined
o33 = null;
// 43223
o33 = {};
// 43224
f81632121_476.returns.push(o33);
// 43225
// 43226
o33.firstChild = null;
// 43227
o21.__html = void 0;
// undefined
o21 = null;
// 43229
o21 = {};
// 43230
f81632121_474.returns.push(o21);
// 43232
o33.appendChild = f81632121_478;
// 43233
f81632121_478.returns.push(o21);
// undefined
o21 = null;
// 43234
o21 = {};
// 43235
o33.classList = o21;
// 43237
o21.add = f81632121_602;
// 43238
f81632121_602.returns.push(undefined);
// 43239
o36 = {};
// 43240
o20.style = o36;
// undefined
o20 = null;
// 43241
// undefined
o36 = null;
// 43245
f81632121_602.returns.push(undefined);
// 43246
o33.__FB_TOKEN = void 0;
// 43247
// 43248
o33.nodeName = "DIV";
// 43249
o33.getAttribute = f81632121_506;
// 43250
o33.hasAttribute = f81632121_507;
// 43252
f81632121_507.returns.push(false);
// 43253
o33.JSBNG__addEventListener = f81632121_468;
// 43255
f81632121_468.returns.push(undefined);
// 43256
o33.JSBNG__onclick = null;
// 43261
f81632121_468.returns.push(undefined);
// 43262
o33.JSBNG__onsubmit = null;
// 43267
f81632121_468.returns.push(undefined);
// 43268
o33.JSBNG__onsuccess = void 0;
// 43273
f81632121_468.returns.push(undefined);
// 43274
o33.JSBNG__onerror = null;
// 43277
f81632121_1418.returns.push({__JSBNG_unknown_function:true});
// 43281
f81632121_645.returns.push(true);
// 43285
f81632121_645.returns.push(true);
// 43291
o33.id = "";
// 43292
// 43293
o20 = {};
// 43294
o33.style = o20;
// 43295
// 43297
// undefined
o20 = null;
// 43300
o21.remove = f81632121_1114;
// undefined
o21 = null;
// 43301
f81632121_1114.returns.push(undefined);
// 43302
o33.__html = void 0;
// undefined
o33 = null;
// 43304
o20 = {};
// 43305
f81632121_474.returns.push(o20);
// undefined
o20 = null;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 43310
f81632121_467.returns.push(1374851260217);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 43313
o20 = {};
// 43317
f81632121_467.returns.push(1374851260991);
// 43322
f81632121_467.returns.push(1374851260992);
// 43326
f81632121_467.returns.push(1374851260992);
// 43328
o20.cancelBubble = false;
// 43329
o20.returnValue = true;
// 43332
o20.srcElement = o183;
// 43334
o20.target = o183;
// 43341
f81632121_506.returns.push(null);
// 43347
f81632121_506.returns.push(null);
// 43353
f81632121_506.returns.push(null);
// 43359
f81632121_506.returns.push(null);
// 43365
f81632121_506.returns.push(null);
// 43371
f81632121_506.returns.push(null);
// 43377
f81632121_506.returns.push(null);
// 43383
f81632121_506.returns.push(null);
// 43389
f81632121_506.returns.push(null);
// 43395
f81632121_506.returns.push(null);
// 43401
f81632121_506.returns.push(null);
// 43407
f81632121_506.returns.push(null);
// 43413
f81632121_506.returns.push(null);
// 43419
f81632121_506.returns.push(null);
// 43425
f81632121_506.returns.push(null);
// 43430
o20.JSBNG__screenX = 660;
// 43431
o20.JSBNG__screenY = 304;
// 43432
o20.altKey = false;
// 43433
o20.bubbles = true;
// 43434
o20.button = 0;
// 43435
o20.buttons = void 0;
// 43436
o20.cancelable = false;
// 43437
o20.clientX = 592;
// 43438
o20.clientY = 139;
// 43439
o20.ctrlKey = false;
// 43440
o20.currentTarget = o0;
// 43441
o20.defaultPrevented = false;
// 43442
o20.detail = 0;
// 43443
o20.eventPhase = 3;
// 43444
o20.isTrusted = void 0;
// 43445
o20.metaKey = false;
// 43446
o20.pageX = 592;
// 43447
o20.pageY = 525;
// 43448
o20.relatedTarget = null;
// 43449
o20.fromElement = null;
// 43452
o20.shiftKey = false;
// 43455
o20.timeStamp = 1374851260991;
// 43456
o20.type = "mousemove";
// 43457
o20.view = ow81632121;
// undefined
o20 = null;
// 43466
f81632121_1852.returns.push(undefined);
// 43469
f81632121_14.returns.push(undefined);
// 43470
f81632121_12.returns.push(197);
// 43473
o20 = {};
// 43477
f81632121_467.returns.push(1374851261007);
// 43478
o20.cancelBubble = false;
// 43479
o20.returnValue = true;
// 43482
o20.srcElement = o183;
// 43484
o20.target = o183;
// 43491
f81632121_506.returns.push(null);
// 43497
f81632121_506.returns.push(null);
// 43503
f81632121_506.returns.push(null);
// 43509
f81632121_506.returns.push(null);
// 43515
f81632121_506.returns.push(null);
// 43521
f81632121_506.returns.push(null);
// 43527
f81632121_506.returns.push(null);
// 43533
f81632121_506.returns.push(null);
// 43539
f81632121_506.returns.push(null);
// 43545
f81632121_506.returns.push(null);
// 43551
f81632121_506.returns.push(null);
// 43557
f81632121_506.returns.push(null);
// 43563
f81632121_506.returns.push(null);
// 43569
f81632121_506.returns.push(null);
// 43575
f81632121_506.returns.push(null);
// 43580
o20.JSBNG__screenX = 660;
// 43581
o20.JSBNG__screenY = 300;
// 43582
o20.altKey = false;
// 43583
o20.bubbles = true;
// 43584
o20.button = 0;
// 43585
o20.buttons = void 0;
// 43586
o20.cancelable = false;
// 43587
o20.clientX = 592;
// 43588
o20.clientY = 135;
// 43589
o20.ctrlKey = false;
// 43590
o20.currentTarget = o0;
// 43591
o20.defaultPrevented = false;
// 43592
o20.detail = 0;
// 43593
o20.eventPhase = 3;
// 43594
o20.isTrusted = void 0;
// 43595
o20.metaKey = false;
// 43596
o20.pageX = 592;
// 43597
o20.pageY = 521;
// 43598
o20.relatedTarget = null;
// 43599
o20.fromElement = null;
// 43602
o20.shiftKey = false;
// 43605
o20.timeStamp = 1374851261007;
// 43606
o20.type = "mousemove";
// 43607
o20.view = ow81632121;
// undefined
o20 = null;
// 43616
f81632121_1852.returns.push(undefined);
// 43619
f81632121_14.returns.push(undefined);
// 43620
f81632121_12.returns.push(198);
// 43623
o20 = {};
// 43626
o20.srcElement = o183;
// 43628
o20.target = o183;
// 43635
f81632121_506.returns.push(null);
// 43641
f81632121_506.returns.push(null);
// 43647
f81632121_506.returns.push(null);
// 43653
f81632121_506.returns.push(null);
// 43659
f81632121_506.returns.push(null);
// 43665
f81632121_506.returns.push(null);
// 43671
f81632121_506.returns.push(null);
// 43677
f81632121_506.returns.push(null);
// 43683
f81632121_506.returns.push(null);
// 43689
f81632121_506.returns.push(null);
// 43695
f81632121_506.returns.push(null);
// 43701
f81632121_506.returns.push(null);
// 43707
f81632121_506.returns.push(null);
// 43713
f81632121_506.returns.push(null);
// 43719
f81632121_506.returns.push(null);
// 43724
o21 = {};
// 43725
o20.relatedTarget = o21;
// 43726
o21.parentNode = o28;
// undefined
o28 = null;
// 43727
o21.nodeType = 1;
// 43728
o21.getAttribute = f81632121_506;
// 43730
f81632121_506.returns.push(null);
// 43736
f81632121_506.returns.push(null);
// 43742
f81632121_506.returns.push(null);
// 43748
f81632121_506.returns.push(null);
// 43754
f81632121_506.returns.push(null);
// 43760
f81632121_506.returns.push(null);
// 43766
f81632121_506.returns.push(null);
// 43772
f81632121_506.returns.push(null);
// 43778
f81632121_506.returns.push(null);
// 43784
f81632121_506.returns.push(null);
// 43790
f81632121_506.returns.push(null);
// 43796
f81632121_506.returns.push(null);
// 43802
f81632121_506.returns.push(null);
// 43808
f81632121_506.returns.push(null);
// 43814
f81632121_506.returns.push(null);
// 43819
o20.cancelBubble = false;
// 43820
o20.returnValue = true;
// undefined
o20 = null;
// 43821
o20 = {};
// 43824
o20.cancelBubble = false;
// 43827
f81632121_467.returns.push(1374851261042);
// 43830
f81632121_1007.returns.push(undefined);
// 43832
o20.returnValue = true;
// 43835
o20.srcElement = o21;
// 43837
o20.target = o21;
// 43844
f81632121_506.returns.push(null);
// 43850
f81632121_506.returns.push(null);
// 43856
f81632121_506.returns.push(null);
// 43862
f81632121_506.returns.push(null);
// 43868
f81632121_506.returns.push(null);
// 43874
f81632121_506.returns.push(null);
// 43880
f81632121_506.returns.push(null);
// 43886
f81632121_506.returns.push(null);
// 43892
f81632121_506.returns.push(null);
// 43898
f81632121_506.returns.push(null);
// 43904
f81632121_506.returns.push(null);
// 43910
f81632121_506.returns.push(null);
// 43916
f81632121_506.returns.push(null);
// 43922
f81632121_506.returns.push(null);
// 43928
f81632121_506.returns.push(null);
// 43933
o20.relatedTarget = o183;
// undefined
o20 = null;
// undefined
o183 = null;
// 43936
o20 = {};
// 43940
f81632121_467.returns.push(1374851261048);
// 43941
o20.cancelBubble = false;
// 43942
o20.returnValue = true;
// 43945
o20.srcElement = o21;
// 43947
o20.target = o21;
// 43954
f81632121_506.returns.push(null);
// 43960
f81632121_506.returns.push(null);
// 43966
f81632121_506.returns.push(null);
// 43972
f81632121_506.returns.push(null);
// 43978
f81632121_506.returns.push(null);
// 43984
f81632121_506.returns.push(null);
// 43990
f81632121_506.returns.push(null);
// 43996
f81632121_506.returns.push(null);
// 44002
f81632121_506.returns.push(null);
// 44008
f81632121_506.returns.push(null);
// 44014
f81632121_506.returns.push(null);
// 44020
f81632121_506.returns.push(null);
// 44026
f81632121_506.returns.push(null);
// 44032
f81632121_506.returns.push(null);
// 44038
f81632121_506.returns.push(null);
// 44043
o20.JSBNG__screenX = 660;
// 44044
o20.JSBNG__screenY = 290;
// 44045
o20.altKey = false;
// 44046
o20.bubbles = true;
// 44047
o20.button = 0;
// 44048
o20.buttons = void 0;
// 44049
o20.cancelable = false;
// 44050
o20.clientX = 592;
// 44051
o20.clientY = 125;
// 44052
o20.ctrlKey = false;
// 44053
o20.currentTarget = o0;
// 44054
o20.defaultPrevented = false;
// 44055
o20.detail = 0;
// 44056
o20.eventPhase = 3;
// 44057
o20.isTrusted = void 0;
// 44058
o20.metaKey = false;
// 44059
o20.pageX = 592;
// 44060
o20.pageY = 511;
// 44061
o20.relatedTarget = null;
// 44062
o20.fromElement = null;
// 44065
o20.shiftKey = false;
// 44068
o20.timeStamp = 1374851261047;
// 44069
o20.type = "mousemove";
// 44070
o20.view = ow81632121;
// undefined
o20 = null;
// 44079
f81632121_1852.returns.push(undefined);
// 44082
f81632121_14.returns.push(undefined);
// 44083
f81632121_12.returns.push(199);
// 44093
f81632121_467.returns.push(1374851261059);
// 44095
f81632121_1007.returns.push(undefined);
// 44101
f81632121_467.returns.push(1374851261059);
// 44108
f81632121_1852.returns.push(undefined);
// 44110
f81632121_14.returns.push(undefined);
// 44111
f81632121_12.returns.push(200);
// 44112
f81632121_12.returns.push(201);
// 44114
o20 = {};
// 44118
f81632121_467.returns.push(1374851261064);
// 44119
o20.cancelBubble = false;
// 44120
o20.returnValue = true;
// 44123
o28 = {};
// 44124
o20.srcElement = o28;
// 44126
o20.target = o28;
// 44128
o28.nodeType = 1;
// 44129
o28.parentNode = o21;
// 44131
o28.getAttribute = f81632121_506;
// 44133
f81632121_506.returns.push(null);
// 44139
f81632121_506.returns.push(null);
// 44145
f81632121_506.returns.push(null);
// 44151
f81632121_506.returns.push(null);
// 44157
f81632121_506.returns.push(null);
// 44163
f81632121_506.returns.push(null);
// 44169
f81632121_506.returns.push(null);
// 44175
f81632121_506.returns.push(null);
// 44181
f81632121_506.returns.push(null);
// 44187
f81632121_506.returns.push(null);
// 44193
f81632121_506.returns.push(null);
// 44199
f81632121_506.returns.push(null);
// 44205
f81632121_506.returns.push(null);
// 44211
f81632121_506.returns.push(null);
// 44217
f81632121_506.returns.push(null);
// 44223
f81632121_506.returns.push(null);
// 44228
o20.JSBNG__screenX = 664;
// 44229
o20.JSBNG__screenY = 264;
// 44230
o20.altKey = false;
// 44231
o20.bubbles = true;
// 44232
o20.button = 0;
// 44233
o20.buttons = void 0;
// 44234
o20.cancelable = false;
// 44235
o20.clientX = 596;
// 44236
o20.clientY = 99;
// 44237
o20.ctrlKey = false;
// 44238
o20.currentTarget = o0;
// 44239
o20.defaultPrevented = false;
// 44240
o20.detail = 0;
// 44241
o20.eventPhase = 3;
// 44242
o20.isTrusted = void 0;
// 44243
o20.metaKey = false;
// 44244
o20.pageX = 596;
// 44245
o20.pageY = 485;
// 44246
o20.relatedTarget = null;
// 44247
o20.fromElement = null;
// 44250
o20.shiftKey = false;
// 44253
o20.timeStamp = 1374851261064;
// 44254
o20.type = "mousemove";
// 44255
o20.view = ow81632121;
// undefined
o20 = null;
// 44264
f81632121_1852.returns.push(undefined);
// 44267
f81632121_14.returns.push(undefined);
// 44268
f81632121_12.returns.push(202);
// 44271
o20 = {};
// 44275
f81632121_467.returns.push(1374851261078);
// 44276
o20.cancelBubble = false;
// 44277
o20.returnValue = true;
// 44280
o20.srcElement = o28;
// 44282
o20.target = o28;
// 44289
f81632121_506.returns.push(null);
// 44295
f81632121_506.returns.push(null);
// 44301
f81632121_506.returns.push(null);
// 44307
f81632121_506.returns.push(null);
// 44313
f81632121_506.returns.push(null);
// 44319
f81632121_506.returns.push(null);
// 44325
f81632121_506.returns.push(null);
// 44331
f81632121_506.returns.push(null);
// 44337
f81632121_506.returns.push(null);
// 44343
f81632121_506.returns.push(null);
// 44349
f81632121_506.returns.push(null);
// 44355
f81632121_506.returns.push(null);
// 44361
f81632121_506.returns.push(null);
// 44367
f81632121_506.returns.push(null);
// 44373
f81632121_506.returns.push(null);
// 44379
f81632121_506.returns.push(null);
// 44384
o20.JSBNG__screenX = 665;
// 44385
o20.JSBNG__screenY = 261;
// 44386
o20.altKey = false;
// 44387
o20.bubbles = true;
// 44388
o20.button = 0;
// 44389
o20.buttons = void 0;
// 44390
o20.cancelable = false;
// 44391
o20.clientX = 597;
// 44392
o20.clientY = 96;
// 44393
o20.ctrlKey = false;
// 44394
o20.currentTarget = o0;
// 44395
o20.defaultPrevented = false;
// 44396
o20.detail = 0;
// 44397
o20.eventPhase = 3;
// 44398
o20.isTrusted = void 0;
// 44399
o20.metaKey = false;
// 44400
o20.pageX = 597;
// 44401
o20.pageY = 482;
// 44402
o20.relatedTarget = null;
// 44403
o20.fromElement = null;
// 44406
o20.shiftKey = false;
// 44409
o20.timeStamp = 1374851261077;
// 44410
o20.type = "mousemove";
// 44411
o20.view = ow81632121;
// undefined
o20 = null;
// 44420
f81632121_1852.returns.push(undefined);
// 44423
f81632121_14.returns.push(undefined);
// 44424
f81632121_12.returns.push(203);
// 44427
o20 = {};
// 44431
f81632121_467.returns.push(1374851261084);
// 44432
o20.cancelBubble = false;
// 44433
o20.returnValue = true;
// 44436
o20.srcElement = o28;
// 44438
o20.target = o28;
// 44445
f81632121_506.returns.push(null);
// 44451
f81632121_506.returns.push(null);
// 44457
f81632121_506.returns.push(null);
// 44463
f81632121_506.returns.push(null);
// 44469
f81632121_506.returns.push(null);
// 44475
f81632121_506.returns.push(null);
// 44481
f81632121_506.returns.push(null);
// 44487
f81632121_506.returns.push(null);
// 44493
f81632121_506.returns.push(null);
// 44499
f81632121_506.returns.push(null);
// 44505
f81632121_506.returns.push(null);
// 44511
f81632121_506.returns.push(null);
// 44517
f81632121_506.returns.push(null);
// 44523
f81632121_506.returns.push(null);
// 44529
f81632121_506.returns.push(null);
// 44535
f81632121_506.returns.push(null);
// 44540
o20.JSBNG__screenX = 665;
// 44541
o20.JSBNG__screenY = 260;
// 44542
o20.altKey = false;
// 44543
o20.bubbles = true;
// 44544
o20.button = 0;
// 44545
o20.buttons = void 0;
// 44546
o20.cancelable = false;
// 44547
o20.clientX = 597;
// 44548
o20.clientY = 95;
// 44549
o20.ctrlKey = false;
// 44550
o20.currentTarget = o0;
// 44551
o20.defaultPrevented = false;
// 44552
o20.detail = 0;
// 44553
o20.eventPhase = 3;
// 44554
o20.isTrusted = void 0;
// 44555
o20.metaKey = false;
// 44556
o20.pageX = 597;
// 44557
o20.pageY = 481;
// 44558
o20.relatedTarget = null;
// 44559
o20.fromElement = null;
// 44562
o20.shiftKey = false;
// 44565
o20.timeStamp = 1374851261084;
// 44566
o20.type = "mousemove";
// 44567
o20.view = ow81632121;
// undefined
o20 = null;
// 44576
f81632121_1852.returns.push(undefined);
// 44579
f81632121_14.returns.push(undefined);
// 44580
f81632121_12.returns.push(204);
// 44583
o20 = {};
// 44587
f81632121_467.returns.push(1374851261094);
// 44588
o20.cancelBubble = false;
// 44589
o20.returnValue = true;
// 44592
o20.srcElement = o28;
// 44594
o20.target = o28;
// 44601
f81632121_506.returns.push(null);
// 44607
f81632121_506.returns.push(null);
// 44613
f81632121_506.returns.push(null);
// 44619
f81632121_506.returns.push(null);
// 44625
f81632121_506.returns.push(null);
// 44631
f81632121_506.returns.push(null);
// 44637
f81632121_506.returns.push(null);
// 44643
f81632121_506.returns.push(null);
// 44649
f81632121_506.returns.push(null);
// 44655
f81632121_506.returns.push(null);
// 44661
f81632121_506.returns.push(null);
// 44667
f81632121_506.returns.push(null);
// 44673
f81632121_506.returns.push(null);
// 44679
f81632121_506.returns.push(null);
// 44685
f81632121_506.returns.push(null);
// 44691
f81632121_506.returns.push(null);
// 44696
o20.JSBNG__screenX = 665;
// 44697
o20.JSBNG__screenY = 258;
// 44698
o20.altKey = false;
// 44699
o20.bubbles = true;
// 44700
o20.button = 0;
// 44701
o20.buttons = void 0;
// 44702
o20.cancelable = false;
// 44703
o20.clientX = 597;
// 44704
o20.clientY = 93;
// 44705
o20.ctrlKey = false;
// 44706
o20.currentTarget = o0;
// 44707
o20.defaultPrevented = false;
// 44708
o20.detail = 0;
// 44709
o20.eventPhase = 3;
// 44710
o20.isTrusted = void 0;
// 44711
o20.metaKey = false;
// 44712
o20.pageX = 597;
// 44713
o20.pageY = 479;
// 44714
o20.relatedTarget = null;
// 44715
o20.fromElement = null;
// 44718
o20.shiftKey = false;
// 44721
o20.timeStamp = 1374851261093;
// 44722
o20.type = "mousemove";
// 44723
o20.view = ow81632121;
// undefined
o20 = null;
// 44732
f81632121_1852.returns.push(undefined);
// 44735
f81632121_14.returns.push(undefined);
// 44736
f81632121_12.returns.push(205);
// 44739
o20 = {};
// 44743
f81632121_467.returns.push(1374851261102);
// 44744
o20.cancelBubble = false;
// 44745
o20.returnValue = true;
// 44748
o20.srcElement = o28;
// 44750
o20.target = o28;
// 44757
f81632121_506.returns.push(null);
// 44763
f81632121_506.returns.push(null);
// 44769
f81632121_506.returns.push(null);
// 44775
f81632121_506.returns.push(null);
// 44781
f81632121_506.returns.push(null);
// 44787
f81632121_506.returns.push(null);
// 44793
f81632121_506.returns.push(null);
// 44799
f81632121_506.returns.push(null);
// 44805
f81632121_506.returns.push(null);
// 44811
f81632121_506.returns.push(null);
// 44817
f81632121_506.returns.push(null);
// 44823
f81632121_506.returns.push(null);
// 44829
f81632121_506.returns.push(null);
// 44835
f81632121_506.returns.push(null);
// 44841
f81632121_506.returns.push(null);
// 44847
f81632121_506.returns.push(null);
// 44852
o20.JSBNG__screenX = 665;
// 44853
o20.JSBNG__screenY = 257;
// 44854
o20.altKey = false;
// 44855
o20.bubbles = true;
// 44856
o20.button = 0;
// 44857
o20.buttons = void 0;
// 44858
o20.cancelable = false;
// 44859
o20.clientX = 597;
// 44860
o20.clientY = 92;
// 44861
o20.ctrlKey = false;
// 44862
o20.currentTarget = o0;
// 44863
o20.defaultPrevented = false;
// 44864
o20.detail = 0;
// 44865
o20.eventPhase = 3;
// 44866
o20.isTrusted = void 0;
// 44867
o20.metaKey = false;
// 44868
o20.pageX = 597;
// 44869
o20.pageY = 478;
// 44870
o20.relatedTarget = null;
// 44871
o20.fromElement = null;
// 44874
o20.shiftKey = false;
// 44877
o20.timeStamp = 1374851261102;
// 44878
o20.type = "mousemove";
// 44879
o20.view = ow81632121;
// undefined
o20 = null;
// 44888
f81632121_1852.returns.push(undefined);
// 44891
f81632121_14.returns.push(undefined);
// 44892
f81632121_12.returns.push(206);
// 44895
o20 = {};
// 44899
f81632121_467.returns.push(1374851261112);
// 44900
o20.cancelBubble = false;
// 44901
o20.returnValue = true;
// 44904
o20.srcElement = o28;
// 44906
o20.target = o28;
// 44913
f81632121_506.returns.push(null);
// 44919
f81632121_506.returns.push(null);
// 44925
f81632121_506.returns.push(null);
// 44931
f81632121_506.returns.push(null);
// 44937
f81632121_506.returns.push(null);
// 44943
f81632121_506.returns.push(null);
// 44949
f81632121_506.returns.push(null);
// 44955
f81632121_506.returns.push(null);
// 44961
f81632121_506.returns.push(null);
// 44967
f81632121_506.returns.push(null);
// 44973
f81632121_506.returns.push(null);
// 44979
f81632121_506.returns.push(null);
// 44985
f81632121_506.returns.push(null);
// 44991
f81632121_506.returns.push(null);
// 44997
f81632121_506.returns.push(null);
// 45003
f81632121_506.returns.push(null);
// 45008
o20.JSBNG__screenX = 666;
// 45009
o20.JSBNG__screenY = 256;
// 45010
o20.altKey = false;
// 45011
o20.bubbles = true;
// 45012
o20.button = 0;
// 45013
o20.buttons = void 0;
// 45014
o20.cancelable = false;
// 45015
o20.clientX = 598;
// 45016
o20.clientY = 91;
// 45017
o20.ctrlKey = false;
// 45018
o20.currentTarget = o0;
// 45019
o20.defaultPrevented = false;
// 45020
o20.detail = 0;
// 45021
o20.eventPhase = 3;
// 45022
o20.isTrusted = void 0;
// 45023
o20.metaKey = false;
// 45024
o20.pageX = 598;
// 45025
o20.pageY = 477;
// 45026
o20.relatedTarget = null;
// 45027
o20.fromElement = null;
// 45030
o20.shiftKey = false;
// 45033
o20.timeStamp = 1374851261111;
// 45034
o20.type = "mousemove";
// 45035
o20.view = ow81632121;
// undefined
o20 = null;
// 45044
f81632121_1852.returns.push(undefined);
// 45047
f81632121_14.returns.push(undefined);
// 45048
f81632121_12.returns.push(207);
// 45051
o20 = {};
// 45055
f81632121_467.returns.push(1374851261121);
// 45056
o20.cancelBubble = false;
// 45057
o20.returnValue = true;
// 45060
o20.srcElement = o28;
// 45062
o20.target = o28;
// 45069
f81632121_506.returns.push(null);
// 45075
f81632121_506.returns.push(null);
// 45081
f81632121_506.returns.push(null);
// 45087
f81632121_506.returns.push(null);
// 45093
f81632121_506.returns.push(null);
// 45099
f81632121_506.returns.push(null);
// 45105
f81632121_506.returns.push(null);
// 45111
f81632121_506.returns.push(null);
// 45117
f81632121_506.returns.push(null);
// 45123
f81632121_506.returns.push(null);
// 45129
f81632121_506.returns.push(null);
// 45135
f81632121_506.returns.push(null);
// 45141
f81632121_506.returns.push(null);
// 45147
f81632121_506.returns.push(null);
// 45153
f81632121_506.returns.push(null);
// 45159
f81632121_506.returns.push(null);
// 45164
o20.JSBNG__screenX = 666;
// 45165
o20.JSBNG__screenY = 255;
// 45166
o20.altKey = false;
// 45167
o20.bubbles = true;
// 45168
o20.button = 0;
// 45169
o20.buttons = void 0;
// 45170
o20.cancelable = false;
// 45171
o20.clientX = 598;
// 45172
o20.clientY = 90;
// 45173
o20.ctrlKey = false;
// 45174
o20.currentTarget = o0;
// 45175
o20.defaultPrevented = false;
// 45176
o20.detail = 0;
// 45177
o20.eventPhase = 3;
// 45178
o20.isTrusted = void 0;
// 45179
o20.metaKey = false;
// 45180
o20.pageX = 598;
// 45181
o20.pageY = 476;
// 45182
o20.relatedTarget = null;
// 45183
o20.fromElement = null;
// 45186
o20.shiftKey = false;
// 45189
o20.timeStamp = 1374851261121;
// 45190
o20.type = "mousemove";
// 45191
o20.view = ow81632121;
// undefined
o20 = null;
// 45200
f81632121_1852.returns.push(undefined);
// 45203
f81632121_14.returns.push(undefined);
// 45204
f81632121_12.returns.push(208);
// 45207
o20 = {};
// 45211
f81632121_467.returns.push(1374851261132);
// 45212
o20.cancelBubble = false;
// 45213
o20.returnValue = true;
// 45216
o20.srcElement = o28;
// 45218
o20.target = o28;
// 45225
f81632121_506.returns.push(null);
// 45231
f81632121_506.returns.push(null);
// 45237
f81632121_506.returns.push(null);
// 45243
f81632121_506.returns.push(null);
// 45249
f81632121_506.returns.push(null);
// 45255
f81632121_506.returns.push(null);
// 45261
f81632121_506.returns.push(null);
// 45267
f81632121_506.returns.push(null);
// 45273
f81632121_506.returns.push(null);
// 45279
f81632121_506.returns.push(null);
// 45285
f81632121_506.returns.push(null);
// 45291
f81632121_506.returns.push(null);
// 45297
f81632121_506.returns.push(null);
// 45303
f81632121_506.returns.push(null);
// 45309
f81632121_506.returns.push(null);
// 45315
f81632121_506.returns.push(null);
// 45320
o20.JSBNG__screenX = 667;
// 45321
o20.JSBNG__screenY = 255;
// 45322
o20.altKey = false;
// 45323
o20.bubbles = true;
// 45324
o20.button = 0;
// 45325
o20.buttons = void 0;
// 45326
o20.cancelable = false;
// 45327
o20.clientX = 599;
// 45328
o20.clientY = 90;
// 45329
o20.ctrlKey = false;
// 45330
o20.currentTarget = o0;
// 45331
o20.defaultPrevented = false;
// 45332
o20.detail = 0;
// 45333
o20.eventPhase = 3;
// 45334
o20.isTrusted = void 0;
// 45335
o20.metaKey = false;
// 45336
o20.pageX = 599;
// 45337
o20.pageY = 476;
// 45338
o20.relatedTarget = null;
// 45339
o20.fromElement = null;
// 45342
o20.shiftKey = false;
// 45345
o20.timeStamp = 1374851261128;
// 45346
o20.type = "mousemove";
// 45347
o20.view = ow81632121;
// undefined
o20 = null;
// 45356
f81632121_1852.returns.push(undefined);
// 45359
f81632121_14.returns.push(undefined);
// 45360
f81632121_12.returns.push(209);
// 45363
o20 = {};
// 45367
f81632121_467.returns.push(1374851261145);
// 45368
o20.cancelBubble = false;
// 45369
o20.returnValue = true;
// 45372
o20.srcElement = o28;
// 45374
o20.target = o28;
// 45381
f81632121_506.returns.push(null);
// 45387
f81632121_506.returns.push(null);
// 45393
f81632121_506.returns.push(null);
// 45399
f81632121_506.returns.push(null);
// 45405
f81632121_506.returns.push(null);
// 45411
f81632121_506.returns.push(null);
// 45417
f81632121_506.returns.push(null);
// 45423
f81632121_506.returns.push(null);
// 45429
f81632121_506.returns.push(null);
// 45435
f81632121_506.returns.push(null);
// 45441
f81632121_506.returns.push(null);
// 45447
f81632121_506.returns.push(null);
// 45453
f81632121_506.returns.push(null);
// 45459
f81632121_506.returns.push(null);
// 45465
f81632121_506.returns.push(null);
// 45471
f81632121_506.returns.push(null);
// 45476
o20.JSBNG__screenX = 668;
// 45477
o20.JSBNG__screenY = 254;
// 45478
o20.altKey = false;
// 45479
o20.bubbles = true;
// 45480
o20.button = 0;
// 45481
o20.buttons = void 0;
// 45482
o20.cancelable = false;
// 45483
o20.clientX = 600;
// 45484
o20.clientY = 89;
// 45485
o20.ctrlKey = false;
// 45486
o20.currentTarget = o0;
// 45487
o20.defaultPrevented = false;
// 45488
o20.detail = 0;
// 45489
o20.eventPhase = 3;
// 45490
o20.isTrusted = void 0;
// 45491
o20.metaKey = false;
// 45492
o20.pageX = 600;
// 45493
o20.pageY = 475;
// 45494
o20.relatedTarget = null;
// 45495
o20.fromElement = null;
// 45498
o20.shiftKey = false;
// 45501
o20.timeStamp = 1374851261144;
// 45502
o20.type = "mousemove";
// 45503
o20.view = ow81632121;
// undefined
o20 = null;
// 45512
f81632121_1852.returns.push(undefined);
// 45515
f81632121_14.returns.push(undefined);
// 45516
f81632121_12.returns.push(210);
// 45519
o20 = {};
// 45523
f81632121_467.returns.push(1374851261157);
// 45524
o20.cancelBubble = false;
// 45525
o20.returnValue = true;
// 45528
o20.srcElement = o28;
// 45530
o20.target = o28;
// 45537
f81632121_506.returns.push(null);
// 45543
f81632121_506.returns.push(null);
// 45549
f81632121_506.returns.push(null);
// 45555
f81632121_506.returns.push(null);
// 45561
f81632121_506.returns.push(null);
// 45567
f81632121_506.returns.push(null);
// 45573
f81632121_506.returns.push(null);
// 45579
f81632121_506.returns.push(null);
// 45585
f81632121_506.returns.push(null);
// 45591
f81632121_506.returns.push(null);
// 45597
f81632121_506.returns.push(null);
// 45603
f81632121_506.returns.push(null);
// 45609
f81632121_506.returns.push(null);
// 45615
f81632121_506.returns.push(null);
// 45621
f81632121_506.returns.push(null);
// 45627
f81632121_506.returns.push(null);
// 45632
o20.JSBNG__screenX = 668;
// 45633
o20.JSBNG__screenY = 253;
// 45634
o20.altKey = false;
// 45635
o20.bubbles = true;
// 45636
o20.button = 0;
// 45637
o20.buttons = void 0;
// 45638
o20.cancelable = false;
// 45639
o20.clientX = 600;
// 45640
o20.clientY = 88;
// 45641
o20.ctrlKey = false;
// 45642
o20.currentTarget = o0;
// 45643
o20.defaultPrevented = false;
// 45644
o20.detail = 0;
// 45645
o20.eventPhase = 3;
// 45646
o20.isTrusted = void 0;
// 45647
o20.metaKey = false;
// 45648
o20.pageX = 600;
// 45649
o20.pageY = 474;
// 45650
o20.relatedTarget = null;
// 45651
o20.fromElement = null;
// 45654
o20.shiftKey = false;
// 45657
o20.timeStamp = 1374851261152;
// 45658
o20.type = "mousemove";
// 45659
o20.view = ow81632121;
// undefined
o20 = null;
// 45668
f81632121_1852.returns.push(undefined);
// 45671
f81632121_14.returns.push(undefined);
// 45672
f81632121_12.returns.push(211);
// 45675
o20 = {};
// 45679
f81632121_467.returns.push(1374851261165);
// 45680
o20.cancelBubble = false;
// 45681
o20.returnValue = true;
// 45684
o20.srcElement = o28;
// 45686
o20.target = o28;
// 45693
f81632121_506.returns.push(null);
// 45699
f81632121_506.returns.push(null);
// 45705
f81632121_506.returns.push(null);
// 45711
f81632121_506.returns.push(null);
// 45717
f81632121_506.returns.push(null);
// 45723
f81632121_506.returns.push(null);
// 45729
f81632121_506.returns.push(null);
// 45735
f81632121_506.returns.push(null);
// 45741
f81632121_506.returns.push(null);
// 45747
f81632121_506.returns.push(null);
// 45753
f81632121_506.returns.push(null);
// 45759
f81632121_506.returns.push(null);
// 45765
f81632121_506.returns.push(null);
// 45771
f81632121_506.returns.push(null);
// 45777
f81632121_506.returns.push(null);
// 45783
f81632121_506.returns.push(null);
// 45788
o20.JSBNG__screenX = 669;
// 45789
o20.JSBNG__screenY = 251;
// 45790
o20.altKey = false;
// 45791
o20.bubbles = true;
// 45792
o20.button = 0;
// 45793
o20.buttons = void 0;
// 45794
o20.cancelable = false;
// 45795
o20.clientX = 601;
// 45796
o20.clientY = 86;
// 45797
o20.ctrlKey = false;
// 45798
o20.currentTarget = o0;
// 45799
o20.defaultPrevented = false;
// 45800
o20.detail = 0;
// 45801
o20.eventPhase = 3;
// 45802
o20.isTrusted = void 0;
// 45803
o20.metaKey = false;
// 45804
o20.pageX = 601;
// 45805
o20.pageY = 472;
// 45806
o20.relatedTarget = null;
// 45807
o20.fromElement = null;
// 45810
o20.shiftKey = false;
// 45813
o20.timeStamp = 1374851261165;
// 45814
o20.type = "mousemove";
// 45815
o20.view = ow81632121;
// undefined
o20 = null;
// 45824
f81632121_1852.returns.push(undefined);
// 45827
f81632121_14.returns.push(undefined);
// 45828
f81632121_12.returns.push(212);
// 45831
o20 = {};
// 45835
f81632121_467.returns.push(1374851261172);
// 45836
o20.cancelBubble = false;
// 45837
o20.returnValue = true;
// 45840
o20.srcElement = o28;
// 45842
o20.target = o28;
// 45849
f81632121_506.returns.push(null);
// 45855
f81632121_506.returns.push(null);
// 45861
f81632121_506.returns.push(null);
// 45867
f81632121_506.returns.push(null);
// 45873
f81632121_506.returns.push(null);
// 45879
f81632121_506.returns.push(null);
// 45885
f81632121_506.returns.push(null);
// 45891
f81632121_506.returns.push(null);
// 45897
f81632121_506.returns.push(null);
// 45903
f81632121_506.returns.push(null);
// 45909
f81632121_506.returns.push(null);
// 45915
f81632121_506.returns.push(null);
// 45921
f81632121_506.returns.push(null);
// 45927
f81632121_506.returns.push(null);
// 45933
f81632121_506.returns.push(null);
// 45939
f81632121_506.returns.push(null);
// 45944
o20.JSBNG__screenX = 670;
// 45945
o20.JSBNG__screenY = 251;
// 45946
o20.altKey = false;
// 45947
o20.bubbles = true;
// 45948
o20.button = 0;
// 45949
o20.buttons = void 0;
// 45950
o20.cancelable = false;
// 45951
o20.clientX = 602;
// 45952
o20.clientY = 86;
// 45953
o20.ctrlKey = false;
// 45954
o20.currentTarget = o0;
// 45955
o20.defaultPrevented = false;
// 45956
o20.detail = 0;
// 45957
o20.eventPhase = 3;
// 45958
o20.isTrusted = void 0;
// 45959
o20.metaKey = false;
// 45960
o20.pageX = 602;
// 45961
o20.pageY = 472;
// 45962
o20.relatedTarget = null;
// 45963
o20.fromElement = null;
// 45966
o20.shiftKey = false;
// 45969
o20.timeStamp = 1374851261172;
// 45970
o20.type = "mousemove";
// 45971
o20.view = ow81632121;
// undefined
o20 = null;
// 45980
f81632121_1852.returns.push(undefined);
// 45983
f81632121_14.returns.push(undefined);
// 45984
f81632121_12.returns.push(213);
// 45987
o20 = {};
// 45991
f81632121_467.returns.push(1374851261182);
// 45992
o20.cancelBubble = false;
// 45993
o20.returnValue = true;
// 45996
o20.srcElement = o28;
// 45998
o20.target = o28;
// 46005
f81632121_506.returns.push(null);
// 46011
f81632121_506.returns.push(null);
// 46017
f81632121_506.returns.push(null);
// 46023
f81632121_506.returns.push(null);
// 46029
f81632121_506.returns.push(null);
// 46035
f81632121_506.returns.push(null);
// 46041
f81632121_506.returns.push(null);
// 46047
f81632121_506.returns.push(null);
// 46053
f81632121_506.returns.push(null);
// 46059
f81632121_506.returns.push(null);
// 46065
f81632121_506.returns.push(null);
// 46071
f81632121_506.returns.push(null);
// 46077
f81632121_506.returns.push(null);
// 46083
f81632121_506.returns.push(null);
// 46089
f81632121_506.returns.push(null);
// 46095
f81632121_506.returns.push(null);
// 46100
o20.JSBNG__screenX = 671;
// 46101
o20.JSBNG__screenY = 249;
// 46102
o20.altKey = false;
// 46103
o20.bubbles = true;
// 46104
o20.button = 0;
// 46105
o20.buttons = void 0;
// 46106
o20.cancelable = false;
// 46107
o20.clientX = 603;
// 46108
o20.clientY = 84;
// 46109
o20.ctrlKey = false;
// 46110
o20.currentTarget = o0;
// 46111
o20.defaultPrevented = false;
// 46112
o20.detail = 0;
// 46113
o20.eventPhase = 3;
// 46114
o20.isTrusted = void 0;
// 46115
o20.metaKey = false;
// 46116
o20.pageX = 603;
// 46117
o20.pageY = 470;
// 46118
o20.relatedTarget = null;
// 46119
o20.fromElement = null;
// 46122
o20.shiftKey = false;
// 46125
o20.timeStamp = 1374851261182;
// 46126
o20.type = "mousemove";
// 46127
o20.view = ow81632121;
// undefined
o20 = null;
// 46136
f81632121_1852.returns.push(undefined);
// 46139
f81632121_14.returns.push(undefined);
// 46140
f81632121_12.returns.push(214);
// 46143
o20 = {};
// 46147
f81632121_467.returns.push(1374851261188);
// 46148
o20.cancelBubble = false;
// 46149
o20.returnValue = true;
// 46152
o20.srcElement = o28;
// 46154
o20.target = o28;
// 46161
f81632121_506.returns.push(null);
// 46167
f81632121_506.returns.push(null);
// 46173
f81632121_506.returns.push(null);
// 46179
f81632121_506.returns.push(null);
// 46185
f81632121_506.returns.push(null);
// 46191
f81632121_506.returns.push(null);
// 46197
f81632121_506.returns.push(null);
// 46203
f81632121_506.returns.push(null);
// 46209
f81632121_506.returns.push(null);
// 46215
f81632121_506.returns.push(null);
// 46221
f81632121_506.returns.push(null);
// 46227
f81632121_506.returns.push(null);
// 46233
f81632121_506.returns.push(null);
// 46239
f81632121_506.returns.push(null);
// 46245
f81632121_506.returns.push(null);
// 46251
f81632121_506.returns.push(null);
// 46256
o20.JSBNG__screenX = 673;
// 46257
o20.JSBNG__screenY = 247;
// 46258
o20.altKey = false;
// 46259
o20.bubbles = true;
// 46260
o20.button = 0;
// 46261
o20.buttons = void 0;
// 46262
o20.cancelable = false;
// 46263
o20.clientX = 605;
// 46264
o20.clientY = 82;
// 46265
o20.ctrlKey = false;
// 46266
o20.currentTarget = o0;
// 46267
o20.defaultPrevented = false;
// 46268
o20.detail = 0;
// 46269
o20.eventPhase = 3;
// 46270
o20.isTrusted = void 0;
// 46271
o20.metaKey = false;
// 46272
o20.pageX = 605;
// 46273
o20.pageY = 468;
// 46274
o20.relatedTarget = null;
// 46275
o20.fromElement = null;
// 46278
o20.shiftKey = false;
// 46281
o20.timeStamp = 1374851261188;
// 46282
o20.type = "mousemove";
// 46283
o20.view = ow81632121;
// undefined
o20 = null;
// 46292
f81632121_1852.returns.push(undefined);
// 46295
f81632121_14.returns.push(undefined);
// 46296
f81632121_12.returns.push(215);
// 46299
o20 = {};
// 46303
f81632121_467.returns.push(1374851261203);
// 46304
o20.cancelBubble = false;
// 46305
o20.returnValue = true;
// 46308
o20.srcElement = o28;
// 46310
o20.target = o28;
// 46317
f81632121_506.returns.push(null);
// 46323
f81632121_506.returns.push(null);
// 46329
f81632121_506.returns.push(null);
// 46335
f81632121_506.returns.push(null);
// 46341
f81632121_506.returns.push(null);
// 46347
f81632121_506.returns.push(null);
// 46353
f81632121_506.returns.push(null);
// 46359
f81632121_506.returns.push(null);
// 46365
f81632121_506.returns.push(null);
// 46371
f81632121_506.returns.push(null);
// 46377
f81632121_506.returns.push(null);
// 46383
f81632121_506.returns.push(null);
// 46389
f81632121_506.returns.push(null);
// 46395
f81632121_506.returns.push(null);
// 46401
f81632121_506.returns.push(null);
// 46407
f81632121_506.returns.push(null);
// 46412
o20.JSBNG__screenX = 675;
// 46413
o20.JSBNG__screenY = 244;
// 46414
o20.altKey = false;
// 46415
o20.bubbles = true;
// 46416
o20.button = 0;
// 46417
o20.buttons = void 0;
// 46418
o20.cancelable = false;
// 46419
o20.clientX = 607;
// 46420
o20.clientY = 79;
// 46421
o20.ctrlKey = false;
// 46422
o20.currentTarget = o0;
// 46423
o20.defaultPrevented = false;
// 46424
o20.detail = 0;
// 46425
o20.eventPhase = 3;
// 46426
o20.isTrusted = void 0;
// 46427
o20.metaKey = false;
// 46428
o20.pageX = 607;
// 46429
o20.pageY = 465;
// 46430
o20.relatedTarget = null;
// 46431
o20.fromElement = null;
// 46434
o20.shiftKey = false;
// 46437
o20.timeStamp = 1374851261203;
// 46438
o20.type = "mousemove";
// 46439
o20.view = ow81632121;
// undefined
o20 = null;
// 46448
f81632121_1852.returns.push(undefined);
// 46451
f81632121_14.returns.push(undefined);
// 46452
f81632121_12.returns.push(216);
// 46455
o20 = {};
// 46459
f81632121_467.returns.push(1374851261209);
// 46460
o20.cancelBubble = false;
// 46461
o20.returnValue = true;
// 46464
o20.srcElement = o28;
// 46466
o20.target = o28;
// 46473
f81632121_506.returns.push(null);
// 46479
f81632121_506.returns.push(null);
// 46485
f81632121_506.returns.push(null);
// 46491
f81632121_506.returns.push(null);
// 46497
f81632121_506.returns.push(null);
// 46503
f81632121_506.returns.push(null);
// 46509
f81632121_506.returns.push(null);
// 46515
f81632121_506.returns.push(null);
// 46521
f81632121_506.returns.push(null);
// 46527
f81632121_506.returns.push(null);
// 46533
f81632121_506.returns.push(null);
// 46539
f81632121_506.returns.push(null);
// 46545
f81632121_506.returns.push(null);
// 46551
f81632121_506.returns.push(null);
// 46557
f81632121_506.returns.push(null);
// 46563
f81632121_506.returns.push(null);
// 46568
o20.JSBNG__screenX = 675;
// 46569
o20.JSBNG__screenY = 243;
// 46570
o20.altKey = false;
// 46571
o20.bubbles = true;
// 46572
o20.button = 0;
// 46573
o20.buttons = void 0;
// 46574
o20.cancelable = false;
// 46575
o20.clientX = 607;
// 46576
o20.clientY = 78;
// 46577
o20.ctrlKey = false;
// 46578
o20.currentTarget = o0;
// 46579
o20.defaultPrevented = false;
// 46580
o20.detail = 0;
// 46581
o20.eventPhase = 3;
// 46582
o20.isTrusted = void 0;
// 46583
o20.metaKey = false;
// 46584
o20.pageX = 607;
// 46585
o20.pageY = 464;
// 46586
o20.relatedTarget = null;
// 46587
o20.fromElement = null;
// 46590
o20.shiftKey = false;
// 46593
o20.timeStamp = 1374851261209;
// 46594
o20.type = "mousemove";
// 46595
o20.view = ow81632121;
// undefined
o20 = null;
// 46604
f81632121_1852.returns.push(undefined);
// 46607
f81632121_14.returns.push(undefined);
// 46608
f81632121_12.returns.push(217);
// 46611
o20 = {};
// 46615
f81632121_467.returns.push(1374851261220);
// 46616
o20.cancelBubble = false;
// 46617
o20.returnValue = true;
// 46620
o20.srcElement = o28;
// 46622
o20.target = o28;
// 46629
f81632121_506.returns.push(null);
// 46635
f81632121_506.returns.push(null);
// 46641
f81632121_506.returns.push(null);
// 46647
f81632121_506.returns.push(null);
// 46653
f81632121_506.returns.push(null);
// 46659
f81632121_506.returns.push(null);
// 46665
f81632121_506.returns.push(null);
// 46671
f81632121_506.returns.push(null);
// 46677
f81632121_506.returns.push(null);
// 46683
f81632121_506.returns.push(null);
// 46689
f81632121_506.returns.push(null);
// 46695
f81632121_506.returns.push(null);
// 46701
f81632121_506.returns.push(null);
// 46707
f81632121_506.returns.push(null);
// 46713
f81632121_506.returns.push(null);
// 46719
f81632121_506.returns.push(null);
// 46724
o20.JSBNG__screenX = 676;
// 46725
o20.JSBNG__screenY = 243;
// 46726
o20.altKey = false;
// 46727
o20.bubbles = true;
// 46728
o20.button = 0;
// 46729
o20.buttons = void 0;
// 46730
o20.cancelable = false;
// 46731
o20.clientX = 608;
// 46732
o20.clientY = 78;
// 46733
o20.ctrlKey = false;
// 46734
o20.currentTarget = o0;
// 46735
o20.defaultPrevented = false;
// 46736
o20.detail = 0;
// 46737
o20.eventPhase = 3;
// 46738
o20.isTrusted = void 0;
// 46739
o20.metaKey = false;
// 46740
o20.pageX = 608;
// 46741
o20.pageY = 464;
// 46742
o20.relatedTarget = null;
// 46743
o20.fromElement = null;
// 46746
o20.shiftKey = false;
// 46749
o20.timeStamp = 1374851261220;
// 46750
o20.type = "mousemove";
// 46751
o20.view = ow81632121;
// undefined
o20 = null;
// 46760
f81632121_1852.returns.push(undefined);
// 46763
f81632121_14.returns.push(undefined);
// 46764
f81632121_12.returns.push(218);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 46770
f81632121_467.returns.push(1374851261229);
// 46771
o20 = {};
// 46775
f81632121_467.returns.push(1374851261230);
// 46776
o20.cancelBubble = false;
// 46777
o20.returnValue = true;
// 46780
o20.srcElement = o28;
// 46782
o20.target = o28;
// 46789
f81632121_506.returns.push(null);
// 46795
f81632121_506.returns.push(null);
// 46801
f81632121_506.returns.push(null);
// 46807
f81632121_506.returns.push(null);
// 46813
f81632121_506.returns.push(null);
// 46819
f81632121_506.returns.push(null);
// 46825
f81632121_506.returns.push(null);
// 46831
f81632121_506.returns.push(null);
// 46837
f81632121_506.returns.push(null);
// 46843
f81632121_506.returns.push(null);
// 46849
f81632121_506.returns.push(null);
// 46855
f81632121_506.returns.push(null);
// 46861
f81632121_506.returns.push(null);
// 46867
f81632121_506.returns.push(null);
// 46873
f81632121_506.returns.push(null);
// 46879
f81632121_506.returns.push(null);
// 46884
o20.JSBNG__screenX = 677;
// 46885
o20.JSBNG__screenY = 242;
// 46886
o20.altKey = false;
// 46887
o20.bubbles = true;
// 46888
o20.button = 0;
// 46889
o20.buttons = void 0;
// 46890
o20.cancelable = false;
// 46891
o20.clientX = 609;
// 46892
o20.clientY = 77;
// 46893
o20.ctrlKey = false;
// 46894
o20.currentTarget = o0;
// 46895
o20.defaultPrevented = false;
// 46896
o20.detail = 0;
// 46897
o20.eventPhase = 3;
// 46898
o20.isTrusted = void 0;
// 46899
o20.metaKey = false;
// 46900
o20.pageX = 609;
// 46901
o20.pageY = 463;
// 46902
o20.relatedTarget = null;
// 46903
o20.fromElement = null;
// 46906
o20.shiftKey = false;
// 46909
o20.timeStamp = 1374851261229;
// 46910
o20.type = "mousemove";
// 46911
o20.view = ow81632121;
// undefined
o20 = null;
// 46920
f81632121_1852.returns.push(undefined);
// 46923
f81632121_14.returns.push(undefined);
// 46924
f81632121_12.returns.push(219);
// 46927
o20 = {};
// 46930
o20.srcElement = o28;
// 46932
o20.target = o28;
// 46939
f81632121_506.returns.push(null);
// 46945
f81632121_506.returns.push(null);
// 46951
f81632121_506.returns.push(null);
// 46957
f81632121_506.returns.push(null);
// 46963
f81632121_506.returns.push(null);
// 46969
f81632121_506.returns.push(null);
// 46975
f81632121_506.returns.push(null);
// 46981
f81632121_506.returns.push(null);
// 46987
f81632121_506.returns.push(null);
// 46993
f81632121_506.returns.push(null);
// 46999
f81632121_506.returns.push(null);
// 47005
f81632121_506.returns.push(null);
// 47011
f81632121_506.returns.push(null);
// 47017
f81632121_506.returns.push(null);
// 47023
f81632121_506.returns.push(null);
// 47029
f81632121_506.returns.push(null);
// 47034
o20.relatedTarget = o21;
// 47039
f81632121_506.returns.push(null);
// 47045
f81632121_506.returns.push(null);
// 47051
f81632121_506.returns.push(null);
// 47057
f81632121_506.returns.push(null);
// 47063
f81632121_506.returns.push(null);
// 47069
f81632121_506.returns.push(null);
// 47075
f81632121_506.returns.push(null);
// 47081
f81632121_506.returns.push(null);
// 47087
f81632121_506.returns.push(null);
// 47093
f81632121_506.returns.push(null);
// 47099
f81632121_506.returns.push(null);
// 47105
f81632121_506.returns.push(null);
// 47111
f81632121_506.returns.push(null);
// 47117
f81632121_506.returns.push(null);
// 47123
f81632121_506.returns.push(null);
// 47128
o20.cancelBubble = false;
// 47129
o20.returnValue = true;
// undefined
o20 = null;
// 47130
o20 = {};
// 47133
o20.cancelBubble = false;
// 47136
f81632121_467.returns.push(1374851261248);
// 47139
f81632121_1007.returns.push(undefined);
// 47141
o20.returnValue = true;
// 47144
o20.srcElement = o21;
// 47146
o20.target = o21;
// 47153
f81632121_506.returns.push(null);
// 47159
f81632121_506.returns.push(null);
// 47165
f81632121_506.returns.push(null);
// 47171
f81632121_506.returns.push(null);
// 47177
f81632121_506.returns.push(null);
// 47183
f81632121_506.returns.push(null);
// 47189
f81632121_506.returns.push(null);
// 47195
f81632121_506.returns.push(null);
// 47201
f81632121_506.returns.push(null);
// 47207
f81632121_506.returns.push(null);
// 47213
f81632121_506.returns.push(null);
// 47219
f81632121_506.returns.push(null);
// 47225
f81632121_506.returns.push(null);
// 47231
f81632121_506.returns.push(null);
// 47237
f81632121_506.returns.push(null);
// 47242
o20.relatedTarget = o28;
// undefined
o20 = null;
// undefined
o28 = null;
// 47245
o20 = {};
// 47249
f81632121_467.returns.push(1374851261256);
// 47250
o20.cancelBubble = false;
// 47251
o20.returnValue = true;
// 47254
o20.srcElement = o21;
// 47256
o20.target = o21;
// 47263
f81632121_506.returns.push(null);
// 47269
f81632121_506.returns.push(null);
// 47275
f81632121_506.returns.push(null);
// 47281
f81632121_506.returns.push(null);
// 47287
f81632121_506.returns.push(null);
// 47293
f81632121_506.returns.push(null);
// 47299
f81632121_506.returns.push(null);
// 47305
f81632121_506.returns.push(null);
// 47311
f81632121_506.returns.push(null);
// 47317
f81632121_506.returns.push(null);
// 47323
f81632121_506.returns.push(null);
// 47329
f81632121_506.returns.push(null);
// 47335
f81632121_506.returns.push(null);
// 47341
f81632121_506.returns.push(null);
// 47347
f81632121_506.returns.push(null);
// 47352
o20.JSBNG__screenX = 677;
// 47353
o20.JSBNG__screenY = 241;
// 47354
o20.altKey = false;
// 47355
o20.bubbles = true;
// 47356
o20.button = 0;
// 47357
o20.buttons = void 0;
// 47358
o20.cancelable = false;
// 47359
o20.clientX = 609;
// 47360
o20.clientY = 76;
// 47361
o20.ctrlKey = false;
// 47362
o20.currentTarget = o0;
// 47363
o20.defaultPrevented = false;
// 47364
o20.detail = 0;
// 47365
o20.eventPhase = 3;
// 47366
o20.isTrusted = void 0;
// 47367
o20.metaKey = false;
// 47368
o20.pageX = 609;
// 47369
o20.pageY = 462;
// 47370
o20.relatedTarget = null;
// 47371
o20.fromElement = null;
// 47374
o20.shiftKey = false;
// 47377
o20.timeStamp = 1374851261256;
// 47378
o20.type = "mousemove";
// 47379
o20.view = ow81632121;
// undefined
o20 = null;
// 47388
f81632121_1852.returns.push(undefined);
// 47391
f81632121_14.returns.push(undefined);
// 47392
f81632121_12.returns.push(220);
// 47395
o20 = {};
// 47399
f81632121_467.returns.push(1374851261264);
// 47400
o20.cancelBubble = false;
// 47401
o20.returnValue = true;
// 47404
o20.srcElement = o21;
// 47406
o20.target = o21;
// 47413
f81632121_506.returns.push(null);
// 47419
f81632121_506.returns.push(null);
// 47425
f81632121_506.returns.push(null);
// 47431
f81632121_506.returns.push(null);
// 47437
f81632121_506.returns.push(null);
// 47443
f81632121_506.returns.push(null);
// 47449
f81632121_506.returns.push(null);
// 47455
f81632121_506.returns.push(null);
// 47461
f81632121_506.returns.push(null);
// 47467
f81632121_506.returns.push(null);
// 47473
f81632121_506.returns.push(null);
// 47479
f81632121_506.returns.push(null);
// 47485
f81632121_506.returns.push(null);
// 47491
f81632121_506.returns.push(null);
// 47497
f81632121_506.returns.push(null);
// 47502
o20.JSBNG__screenX = 678;
// 47503
o20.JSBNG__screenY = 241;
// 47504
o20.altKey = false;
// 47505
o20.bubbles = true;
// 47506
o20.button = 0;
// 47507
o20.buttons = void 0;
// 47508
o20.cancelable = false;
// 47509
o20.clientX = 610;
// 47510
o20.clientY = 76;
// 47511
o20.ctrlKey = false;
// 47512
o20.currentTarget = o0;
// 47513
o20.defaultPrevented = false;
// 47514
o20.detail = 0;
// 47515
o20.eventPhase = 3;
// 47516
o20.isTrusted = void 0;
// 47517
o20.metaKey = false;
// 47518
o20.pageX = 610;
// 47519
o20.pageY = 462;
// 47520
o20.relatedTarget = null;
// 47521
o20.fromElement = null;
// 47524
o20.shiftKey = false;
// 47527
o20.timeStamp = 1374851261264;
// 47528
o20.type = "mousemove";
// 47529
o20.view = ow81632121;
// undefined
o20 = null;
// 47538
f81632121_1852.returns.push(undefined);
// 47541
f81632121_14.returns.push(undefined);
// 47542
f81632121_12.returns.push(221);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 47546
o20 = {};
// 47550
f81632121_467.returns.push(1374851261522);
// 47555
f81632121_467.returns.push(1374851261524);
// 47559
f81632121_467.returns.push(1374851261524);
// 47561
o20.cancelBubble = false;
// 47562
o20.returnValue = true;
// 47565
o20.srcElement = o21;
// 47567
o20.target = o21;
// 47574
f81632121_506.returns.push(null);
// 47580
f81632121_506.returns.push(null);
// 47586
f81632121_506.returns.push(null);
// 47592
f81632121_506.returns.push(null);
// 47598
f81632121_506.returns.push(null);
// 47604
f81632121_506.returns.push(null);
// 47610
f81632121_506.returns.push(null);
// 47616
f81632121_506.returns.push(null);
// 47622
f81632121_506.returns.push(null);
// 47628
f81632121_506.returns.push(null);
// 47634
f81632121_506.returns.push(null);
// 47640
f81632121_506.returns.push(null);
// 47646
f81632121_506.returns.push(null);
// 47652
f81632121_506.returns.push(null);
// 47658
f81632121_506.returns.push(null);
// 47663
o20.JSBNG__screenX = 678;
// 47664
o20.JSBNG__screenY = 240;
// 47665
o20.altKey = false;
// 47666
o20.bubbles = true;
// 47667
o20.button = 0;
// 47668
o20.buttons = void 0;
// 47669
o20.cancelable = false;
// 47670
o20.clientX = 610;
// 47671
o20.clientY = 75;
// 47672
o20.ctrlKey = false;
// 47673
o20.currentTarget = o0;
// 47674
o20.defaultPrevented = false;
// 47675
o20.detail = 0;
// 47676
o20.eventPhase = 3;
// 47677
o20.isTrusted = void 0;
// 47678
o20.metaKey = false;
// 47679
o20.pageX = 610;
// 47680
o20.pageY = 461;
// 47681
o20.relatedTarget = null;
// 47682
o20.fromElement = null;
// 47685
o20.shiftKey = false;
// 47688
o20.timeStamp = 1374851261522;
// 47689
o20.type = "mousemove";
// 47690
o20.view = ow81632121;
// undefined
o20 = null;
// 47699
f81632121_1852.returns.push(undefined);
// 47702
f81632121_14.returns.push(undefined);
// 47703
f81632121_12.returns.push(222);
// 47706
o20 = {};
// 47710
f81632121_467.returns.push(1374851261546);
// 47711
o20.cancelBubble = false;
// 47712
o20.returnValue = true;
// 47715
o20.srcElement = o21;
// 47717
o20.target = o21;
// 47724
f81632121_506.returns.push(null);
// 47730
f81632121_506.returns.push(null);
// 47736
f81632121_506.returns.push(null);
// 47742
f81632121_506.returns.push(null);
// 47748
f81632121_506.returns.push(null);
// 47754
f81632121_506.returns.push(null);
// 47760
f81632121_506.returns.push(null);
// 47766
f81632121_506.returns.push(null);
// 47772
f81632121_506.returns.push(null);
// 47778
f81632121_506.returns.push(null);
// 47784
f81632121_506.returns.push(null);
// 47790
f81632121_506.returns.push(null);
// 47796
f81632121_506.returns.push(null);
// 47802
f81632121_506.returns.push(null);
// 47808
f81632121_506.returns.push(null);
// 47813
o20.JSBNG__screenX = 679;
// 47814
o20.JSBNG__screenY = 240;
// 47815
o20.altKey = false;
// 47816
o20.bubbles = true;
// 47817
o20.button = 0;
// 47818
o20.buttons = void 0;
// 47819
o20.cancelable = false;
// 47820
o20.clientX = 611;
// 47821
o20.clientY = 75;
// 47822
o20.ctrlKey = false;
// 47823
o20.currentTarget = o0;
// 47824
o20.defaultPrevented = false;
// 47825
o20.detail = 0;
// 47826
o20.eventPhase = 3;
// 47827
o20.isTrusted = void 0;
// 47828
o20.metaKey = false;
// 47829
o20.pageX = 611;
// 47830
o20.pageY = 461;
// 47831
o20.relatedTarget = null;
// 47832
o20.fromElement = null;
// 47835
o20.shiftKey = false;
// 47838
o20.timeStamp = 1374851261546;
// 47839
o20.type = "mousemove";
// 47840
o20.view = ow81632121;
// undefined
o20 = null;
// 47849
f81632121_1852.returns.push(undefined);
// 47852
f81632121_14.returns.push(undefined);
// 47853
f81632121_12.returns.push(223);
// 47856
o20 = {};
// 47860
f81632121_467.returns.push(1374851261577);
// 47861
o20.cancelBubble = false;
// 47862
o20.returnValue = true;
// 47865
o20.srcElement = o21;
// 47867
o20.target = o21;
// 47874
f81632121_506.returns.push(null);
// 47880
f81632121_506.returns.push(null);
// 47886
f81632121_506.returns.push(null);
// 47892
f81632121_506.returns.push(null);
// 47898
f81632121_506.returns.push(null);
// 47904
f81632121_506.returns.push(null);
// 47910
f81632121_506.returns.push(null);
// 47916
f81632121_506.returns.push(null);
// 47922
f81632121_506.returns.push(null);
// 47928
f81632121_506.returns.push(null);
// 47934
f81632121_506.returns.push(null);
// 47940
f81632121_506.returns.push(null);
// 47946
f81632121_506.returns.push(null);
// 47952
f81632121_506.returns.push(null);
// 47958
f81632121_506.returns.push(null);
// 47963
o20.JSBNG__screenX = 679;
// 47964
o20.JSBNG__screenY = 239;
// 47965
o20.altKey = false;
// 47966
o20.bubbles = true;
// 47967
o20.button = 0;
// 47968
o20.buttons = void 0;
// 47969
o20.cancelable = false;
// 47970
o20.clientX = 611;
// 47971
o20.clientY = 74;
// 47972
o20.ctrlKey = false;
// 47973
o20.currentTarget = o0;
// 47974
o20.defaultPrevented = false;
// 47975
o20.detail = 0;
// 47976
o20.eventPhase = 3;
// 47977
o20.isTrusted = void 0;
// 47978
o20.metaKey = false;
// 47979
o20.pageX = 611;
// 47980
o20.pageY = 460;
// 47981
o20.relatedTarget = null;
// 47982
o20.fromElement = null;
// 47985
o20.shiftKey = false;
// 47988
o20.timeStamp = 1374851261576;
// 47989
o20.type = "mousemove";
// 47990
o20.view = ow81632121;
// undefined
o20 = null;
// 47999
f81632121_1852.returns.push(undefined);
// 48002
f81632121_14.returns.push(undefined);
// 48003
f81632121_12.returns.push(224);
// 48006
o20 = {};
// 48010
f81632121_467.returns.push(1374851261591);
// 48011
o20.cancelBubble = false;
// 48012
o20.returnValue = true;
// 48015
o20.srcElement = o21;
// 48017
o20.target = o21;
// 48024
f81632121_506.returns.push(null);
// 48030
f81632121_506.returns.push(null);
// 48036
f81632121_506.returns.push(null);
// 48042
f81632121_506.returns.push(null);
// 48048
f81632121_506.returns.push(null);
// 48054
f81632121_506.returns.push(null);
// 48060
f81632121_506.returns.push(null);
// 48066
f81632121_506.returns.push(null);
// 48072
f81632121_506.returns.push(null);
// 48078
f81632121_506.returns.push(null);
// 48084
f81632121_506.returns.push(null);
// 48090
f81632121_506.returns.push(null);
// 48096
f81632121_506.returns.push(null);
// 48102
f81632121_506.returns.push(null);
// 48108
f81632121_506.returns.push(null);
// 48113
o20.JSBNG__screenX = 680;
// 48114
o20.JSBNG__screenY = 239;
// 48115
o20.altKey = false;
// 48116
o20.bubbles = true;
// 48117
o20.button = 0;
// 48118
o20.buttons = void 0;
// 48119
o20.cancelable = false;
// 48120
o20.clientX = 612;
// 48121
o20.clientY = 74;
// 48122
o20.ctrlKey = false;
// 48123
o20.currentTarget = o0;
// 48124
o20.defaultPrevented = false;
// 48125
o20.detail = 0;
// 48126
o20.eventPhase = 3;
// 48127
o20.isTrusted = void 0;
// 48128
o20.metaKey = false;
// 48129
o20.pageX = 612;
// 48130
o20.pageY = 460;
// 48131
o20.relatedTarget = null;
// 48132
o20.fromElement = null;
// 48135
o20.shiftKey = false;
// 48138
o20.timeStamp = 1374851261591;
// 48139
o20.type = "mousemove";
// 48140
o20.view = ow81632121;
// undefined
o20 = null;
// 48149
f81632121_1852.returns.push(undefined);
// 48152
f81632121_14.returns.push(undefined);
// 48153
f81632121_12.returns.push(225);
// 48156
o20 = {};
// 48160
f81632121_467.returns.push(1374851261633);
// 48161
o20.cancelBubble = false;
// 48162
o20.returnValue = true;
// 48165
o20.srcElement = o21;
// 48167
o20.target = o21;
// undefined
o21 = null;
// 48174
f81632121_506.returns.push(null);
// 48180
f81632121_506.returns.push(null);
// 48186
f81632121_506.returns.push(null);
// 48192
f81632121_506.returns.push(null);
// 48198
f81632121_506.returns.push(null);
// 48204
f81632121_506.returns.push(null);
// 48210
f81632121_506.returns.push(null);
// 48216
f81632121_506.returns.push(null);
// 48222
f81632121_506.returns.push(null);
// 48228
f81632121_506.returns.push(null);
// 48234
f81632121_506.returns.push(null);
// 48240
f81632121_506.returns.push(null);
// 48246
f81632121_506.returns.push(null);
// 48252
f81632121_506.returns.push(null);
// 48258
f81632121_506.returns.push(null);
// 48263
o20.JSBNG__screenX = 681;
// 48264
o20.JSBNG__screenY = 239;
// 48265
o20.altKey = false;
// 48266
o20.bubbles = true;
// 48267
o20.button = 0;
// 48268
o20.buttons = void 0;
// 48269
o20.cancelable = false;
// 48270
o20.clientX = 613;
// 48271
o20.clientY = 74;
// 48272
o20.ctrlKey = false;
// 48273
o20.currentTarget = o0;
// 48274
o20.defaultPrevented = false;
// 48275
o20.detail = 0;
// 48276
o20.eventPhase = 3;
// 48277
o20.isTrusted = void 0;
// 48278
o20.metaKey = false;
// 48279
o20.pageX = 613;
// 48280
o20.pageY = 460;
// 48281
o20.relatedTarget = null;
// 48282
o20.fromElement = null;
// 48285
o20.shiftKey = false;
// 48288
o20.timeStamp = 1374851261633;
// 48289
o20.type = "mousemove";
// 48290
o20.view = ow81632121;
// undefined
o20 = null;
// 48299
f81632121_1852.returns.push(undefined);
// 48302
f81632121_14.returns.push(undefined);
// 48303
f81632121_12.returns.push(226);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 48307
o20 = {};
// 48310
o20.srcElement = o16;
// 48311
o20.target = o16;
// 48312
o20.keyCode = 17;
// 48313
o20.shiftKey = false;
// 48315
o20.cancelBubble = false;
// 48322
f81632121_467.returns.push(1374851262038);
// 48327
f81632121_467.returns.push(1374851262040);
// 48331
f81632121_467.returns.push(1374851262040);
// 48334
o20.returnValue = true;
// 48346
f81632121_506.returns.push(null);
// 48352
f81632121_506.returns.push(null);
// 48357
o20.JSBNG__location = void 0;
// 48358
o20.altKey = false;
// 48359
o20.bubbles = true;
// 48360
o20.cancelable = true;
// 48361
o20.char = void 0;
// 48362
o20.charCode = 0;
// 48363
o20.ctrlKey = true;
// 48364
o20.currentTarget = o0;
// 48365
o20.defaultPrevented = false;
// 48366
o20.detail = 0;
// 48367
o20.eventPhase = 3;
// 48368
o20.isTrusted = void 0;
// 48369
o20.key = void 0;
// 48371
o20.locale = void 0;
// 48372
o20.location = void 0;
// 48373
o20.metaKey = false;
// 48374
o20.repeat = void 0;
// 48378
o20.timeStamp = 1374851262036;
// 48379
o20.type = "keydown";
// 48380
o20.view = ow81632121;
// 48381
o20.which = 17;
// 48388
o21 = {};
// 48390
o28 = {};
// 48391
o21.handlers = o28;
// 48393
o28["17"] = void 0;
// undefined
o28 = null;
// 48398
f81632121_12.returns.push(227);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 48403
f81632121_467.returns.push(1374851262238);
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 48405
o28 = {};
// 48408
o28.srcElement = o16;
// 48409
o28.target = o16;
// 48410
o28.keyCode = 17;
// 48411
o28.shiftKey = false;
// 48413
o28.cancelBubble = false;
// 48420
f81632121_467.returns.push(1374851262538);
// 48422
o28.returnValue = true;
// 48434
f81632121_506.returns.push(null);
// 48440
f81632121_506.returns.push(null);
// 48445
o28.JSBNG__location = void 0;
// 48446
o28.altKey = false;
// 48447
o28.bubbles = true;
// 48448
o28.cancelable = true;
// 48449
o28.char = void 0;
// 48450
o28.charCode = 0;
// 48451
o28.ctrlKey = true;
// 48452
o28.currentTarget = o0;
// 48453
o28.defaultPrevented = false;
// 48454
o28.detail = 0;
// 48455
o28.eventPhase = 3;
// 48456
o28.isTrusted = void 0;
// 48457
o28.key = void 0;
// 48459
o28.locale = void 0;
// 48460
o28.location = void 0;
// 48461
o28.metaKey = false;
// 48462
o28.repeat = void 0;
// 48466
o28.timeStamp = 1374851262536;
// 48467
o28.type = "keydown";
// 48468
o28.view = ow81632121;
// 48469
o28.which = 17;
// 48483
o33 = {};
// 48486
o33.srcElement = o16;
// 48487
o33.target = o16;
// 48488
o33.keyCode = 17;
// 48489
o33.shiftKey = false;
// 48491
o33.cancelBubble = false;
// 48498
f81632121_467.returns.push(1374851262570);
// 48503
f81632121_467.returns.push(1374851262572);
// 48507
f81632121_467.returns.push(1374851262572);
// 48510
o33.returnValue = true;
// 48522
f81632121_506.returns.push(null);
// 48528
f81632121_506.returns.push(null);
// 48533
o33.JSBNG__location = void 0;
// 48534
o33.altKey = false;
// 48535
o33.bubbles = true;
// 48536
o33.cancelable = true;
// 48537
o33.char = void 0;
// 48538
o33.charCode = 0;
// 48539
o33.ctrlKey = true;
// 48540
o33.currentTarget = o0;
// 48541
o33.defaultPrevented = false;
// 48542
o33.detail = 0;
// 48543
o33.eventPhase = 3;
// 48544
o33.isTrusted = void 0;
// 48545
o33.key = void 0;
// 48547
o33.locale = void 0;
// 48548
o33.location = void 0;
// 48549
o33.metaKey = false;
// 48550
o33.repeat = void 0;
// 48554
o33.timeStamp = 1374851262568;
// 48555
o33.type = "keydown";
// 48556
o33.view = ow81632121;
// 48557
o33.which = 17;
// 48571
o36 = {};
// 48574
o36.srcElement = o16;
// 48575
o36.target = o16;
// 48576
o36.keyCode = 17;
// 48577
o36.shiftKey = false;
// 48579
o36.cancelBubble = false;
// 48586
f81632121_467.returns.push(1374851262603);
// 48588
o36.returnValue = true;
// 48600
f81632121_506.returns.push(null);
// 48606
f81632121_506.returns.push(null);
// 48611
o36.JSBNG__location = void 0;
// 48612
o36.altKey = false;
// 48613
o36.bubbles = true;
// 48614
o36.cancelable = true;
// 48615
o36.char = void 0;
// 48616
o36.charCode = 0;
// 48617
o36.ctrlKey = true;
// 48618
o36.currentTarget = o0;
// 48619
o36.defaultPrevented = false;
// 48620
o36.detail = 0;
// 48621
o36.eventPhase = 3;
// 48622
o36.isTrusted = void 0;
// 48623
o36.key = void 0;
// 48625
o36.locale = void 0;
// 48626
o36.location = void 0;
// 48627
o36.metaKey = false;
// 48628
o36.repeat = void 0;
// 48632
o36.timeStamp = 1374851262602;
// 48633
o36.type = "keydown";
// 48634
o36.view = ow81632121;
// 48635
o36.which = 17;
// 48649
o39 = {};
// 48652
o39.srcElement = o16;
// 48653
o39.target = o16;
// 48654
o39.keyCode = 17;
// 48655
o39.shiftKey = false;
// 48657
o39.cancelBubble = false;
// 48664
f81632121_467.returns.push(1374851262637);
// 48666
o39.returnValue = true;
// 48678
f81632121_506.returns.push(null);
// 48684
f81632121_506.returns.push(null);
// 48689
o39.JSBNG__location = void 0;
// 48690
o39.altKey = false;
// 48691
o39.bubbles = true;
// 48692
o39.cancelable = true;
// 48693
o39.char = void 0;
// 48694
o39.charCode = 0;
// 48695
o39.ctrlKey = true;
// 48696
o39.currentTarget = o0;
// 48697
o39.defaultPrevented = false;
// 48698
o39.detail = 0;
// 48699
o39.eventPhase = 3;
// 48700
o39.isTrusted = void 0;
// 48701
o39.key = void 0;
// 48703
o39.locale = void 0;
// 48704
o39.location = void 0;
// 48705
o39.metaKey = false;
// 48706
o39.repeat = void 0;
// 48710
o39.timeStamp = 1374851262635;
// 48711
o39.type = "keydown";
// 48712
o39.view = ow81632121;
// 48713
o39.which = 17;
// 48727
o42 = {};
// 48733
// 48735
o44 = {};
// 48738
f81632121_2118.returns.push(undefined);
// 48739
o44.cancelBubble = false;
// undefined
fo81632121_1_cookie.returns.push("c_user=100006118350059; csm=2; sub=4096");
// 48743
// 48745
o44.returnValue = true;
// undefined
o44 = null;
// 48746
// 0
JSBNG_Replay$ = function(real, cb) { if (!real) return;
// 980
geval("function envFlush(a) {\n    function b(c) {\n        {\n            var fin0keys = ((window.top.JSBNG_Replay.forInKeys)((a))), fin0i = (0);\n            var d;\n            for (; (fin0i < fin0keys.length); (fin0i++)) {\n                ((d) = (fin0keys[fin0i]));\n                {\n                    c[d] = a[d];\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    if (window.requireLazy) {\n        requireLazy([\"Env\",], b);\n    }\n     else {\n        Env = ((window.Env || {\n        }));\n        b(Env);\n    }\n;\n;\n};\n;\nenvFlush({\n    user: \"100006118350059\",\n    locale: \"en_US\",\n    method: \"GET\",\n    svn_rev: 888463,\n    tier: \"\",\n    push_phase: \"V3\",\n    pkg_cohort: \"EXP1:DEFAULT\",\n    vip: \"69.171.242.27\",\n    www_base: \"http://jsbngssl.www.facebook.com/\",\n    fb_dtsg: \"AQApxIm6\",\n    ajaxpipe_token: \"AXg6AziAArJNc7e2\",\n    lhsh: \"FAQE1CTsK\",\n    tracking_domain: \"http://jsbngssl.pixel.facebook.com\",\n    retry_ajax_on_network_error: \"1\",\n    fbid_emoticons: \"1\"\n});");
// 981
geval("envFlush({\n    eagleEyeConfig: {\n        seed: \"0ouW\",\n        JSBNG__sessionStorage: true\n    }\n});\nCavalryLogger = false;");
// 982
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"KlJ/5\",]);\n}\n;\n;\nJSBNG__self.__DEV__ = ((JSBNG__self.__DEV__ || 0));\nif (((JSON.stringify([\"\\u2028\\u2029\",]) === \"[\\\"\\u2028\\u2029\\\"]\"))) {\n    JSON.stringify = function(a) {\n        var b = /\\u2028/g, c = /\\u2029/g;\n        return ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1), function(d, e, f) {\n            var g = a.call(this, d, e, f);\n            if (g) {\n                if (((-1 < g.indexOf(\"\\u2028\")))) {\n                    g = g.replace(b, \"\\\\u2028\");\n                }\n            ;\n            ;\n                if (((-1 < g.indexOf(\"\\u2029\")))) {\n                    g = g.replace(c, \"\\\\u2029\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return g;\n        }));\n    }(JSON.stringify);\n}\n;\n;\n__t = function(a) {\n    return a[0];\n};\n__w = function(a) {\n    return a;\n};\n(function(a) {\n    if (a.require) {\n        return;\n    }\n;\n;\n    var b = Object.prototype.toString, c = {\n    }, d = {\n    }, e = {\n    }, f = 0, g = 1, h = 2, i = Object.prototype.hasOwnProperty;\n    function j(s) {\n        if (((a.ErrorUtils && !a.ErrorUtils.inGuard()))) {\n            return ErrorUtils.applyWithGuard(j, this, arguments);\n        }\n    ;\n    ;\n        var t = c[s], u, v, w;\n        if (!c[s]) {\n            w = ((((\"Requiring unknown module \\\"\" + s)) + \"\\\"\"));\n            throw new Error(w);\n        }\n    ;\n    ;\n        if (t.hasError) {\n            throw new Error(((((\"Requiring module \\\"\" + s)) + \"\\\" which threw an exception\")));\n        }\n    ;\n    ;\n        if (t.waiting) {\n            w = ((((\"Requiring module \\\"\" + s)) + \"\\\" with unresolved dependencies\"));\n            throw new Error(w);\n        }\n    ;\n    ;\n        if (!t.exports) {\n            var x = t.exports = {\n            }, y = t.factory;\n            if (((b.call(y) === \"[object Function]\"))) {\n                var z = [], aa = t.dependencies, ba = aa.length, ca;\n                if (((t.special & h))) {\n                    ba = Math.min(ba, y.length);\n                }\n            ;\n            ;\n                try {\n                    for (v = 0; ((v < ba)); v++) {\n                        u = aa[v];\n                        z.push(((((u === \"module\")) ? t : ((((u === \"exports\")) ? x : j(u))))));\n                    };\n                ;\n                    ca = y.apply(((t.context || a)), z);\n                } catch (da) {\n                    t.hasError = true;\n                    throw da;\n                };\n            ;\n                if (ca) {\n                    t.exports = ca;\n                }\n            ;\n            ;\n            }\n             else t.exports = y;\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((t.refcount-- === 1))) {\n            delete c[s];\n        }\n    ;\n    ;\n        return t.exports;\n    };\n;\n    function k(s, t, u, v, w, x) {\n        if (((t === undefined))) {\n            t = [];\n            u = s;\n            s = n();\n        }\n         else if (((u === undefined))) {\n            u = t;\n            if (((b.call(s) === \"[object Array]\"))) {\n                t = s;\n                s = n();\n            }\n             else t = [];\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        var y = {\n            cancel: l.bind(this, s)\n        }, z = c[s];\n        if (z) {\n            if (x) {\n                z.refcount += x;\n            }\n        ;\n        ;\n            return y;\n        }\n         else if (((((!t && !u)) && x))) {\n            e[s] = ((((e[s] || 0)) + x));\n            return y;\n        }\n         else {\n            z = {\n                id: s\n            };\n            z.refcount = ((((e[s] || 0)) + ((x || 0))));\n            delete e[s];\n        }\n        \n    ;\n    ;\n        z.factory = u;\n        z.dependencies = t;\n        z.context = w;\n        z.special = v;\n        z.waitingMap = {\n        };\n        z.waiting = 0;\n        z.hasError = false;\n        c[s] = z;\n        p(s);\n        return y;\n    };\n;\n    function l(s) {\n        if (!c[s]) {\n            return;\n        }\n    ;\n    ;\n        var t = c[s];\n        delete c[s];\n        {\n            var fin1keys = ((window.top.JSBNG_Replay.forInKeys)((t.waitingMap))), fin1i = (0);\n            var u;\n            for (; (fin1i < fin1keys.length); (fin1i++)) {\n                ((u) = (fin1keys[fin1i]));\n                {\n                    if (t.waitingMap[u]) {\n                        delete d[u][s];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        for (var v = 0; ((v < t.dependencies.length)); v++) {\n            u = t.dependencies[v];\n            if (c[u]) {\n                if (((c[u].refcount-- === 1))) {\n                    l(u);\n                }\n            ;\n            ;\n            }\n             else if (e[u]) {\n                e[u]--;\n            }\n            \n        ;\n        ;\n        };\n    ;\n    };\n;\n    function m(s, t, u) {\n        return k(s, t, undefined, g, u, 1);\n    };\n;\n    function n() {\n        return ((\"__mod__\" + f++));\n    };\n;\n    function o(s, t) {\n        if (((!s.waitingMap[t] && ((s.id !== t))))) {\n            s.waiting++;\n            s.waitingMap[t] = 1;\n            ((d[t] || (d[t] = {\n            })));\n            d[t][s.id] = 1;\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        var t = [], u = c[s], v, w, x;\n        for (w = 0; ((w < u.dependencies.length)); w++) {\n            v = u.dependencies[w];\n            if (!c[v]) {\n                o(u, v);\n            }\n             else if (c[v].waiting) {\n                {\n                    var fin2keys = ((window.top.JSBNG_Replay.forInKeys)((c[v].waitingMap))), fin2i = (0);\n                    (0);\n                    for (; (fin2i < fin2keys.length); (fin2i++)) {\n                        ((x) = (fin2keys[fin2i]));\n                        {\n                            if (c[v].waitingMap[x]) {\n                                o(u, x);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (((((u.waiting === 0)) && ((u.special & g))))) {\n            t.push(s);\n        }\n    ;\n    ;\n        if (d[s]) {\n            var y = d[s], z;\n            d[s] = undefined;\n            {\n                var fin3keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin3i = (0);\n                (0);\n                for (; (fin3i < fin3keys.length); (fin3i++)) {\n                    ((v) = (fin3keys[fin3i]));\n                    {\n                        z = c[v];\n                        {\n                            var fin4keys = ((window.top.JSBNG_Replay.forInKeys)((u.waitingMap))), fin4i = (0);\n                            (0);\n                            for (; (fin4i < fin4keys.length); (fin4i++)) {\n                                ((x) = (fin4keys[fin4i]));\n                                {\n                                    if (u.waitingMap[x]) {\n                                        o(z, x);\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                        if (z.waitingMap[s]) {\n                            z.waitingMap[s] = undefined;\n                            z.waiting--;\n                        }\n                    ;\n                    ;\n                        if (((((z.waiting === 0)) && ((z.special & g))))) {\n                            t.push(v);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        for (w = 0; ((w < t.length)); w++) {\n            j(t[w]);\n        ;\n        };\n    ;\n    };\n;\n    function q(s, t) {\n        c[s] = {\n            id: s\n        };\n        c[s].exports = t;\n    };\n;\n    q(\"module\", 0);\n    q(\"exports\", 0);\n    q(\"define\", k);\n    q(\"global\", a);\n    q(\"require\", j);\n    q(\"requireDynamic\", j);\n    q(\"requireLazy\", m);\n    k.amd = {\n    };\n    a.define = k;\n    a.require = j;\n    a.requireDynamic = j;\n    a.requireLazy = m;\n    j.__debug = {\n        modules: c,\n        deps: d\n    };\n    var r = function(s, t, u, v) {\n        k(s, t, u, ((v || h)));\n    };\n    a.__d = function(s, t, u, v) {\n        t = [\"global\",\"require\",\"requireDynamic\",\"requireLazy\",\"module\",\"exports\",].concat(t);\n        r(s, t, u, v);\n    };\n})(this);\n__d(\"SidebarPrelude\", [], function(a, b, c, d, e, f) {\n    var g = {\n        addSidebarMode: function(h) {\n            var i = JSBNG__document.documentElement;\n            if (((i.clientWidth > h))) {\n                i.className = ((i.className + \" sidebarMode\"));\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"eprintf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i = Array.prototype.slice.call(arguments).map(function(l) {\n            return String(l);\n        }), j = ((h.split(\"%s\").length - 1));\n        if (((j !== ((i.length - 1))))) {\n            return g(\"eprintf args number mismatch: %s\", JSON.stringify(i));\n        }\n    ;\n    ;\n        var k = 1;\n        return h.replace(/%s/g, function(l) {\n            return String(i[k++]);\n        });\n    };\n    e.exports = g;\n});\n__d(\"ex\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i = Array.prototype.slice.call(arguments).map(function(k) {\n            return String(k);\n        }), j = ((h.split(\"%s\").length - 1));\n        if (((j !== ((i.length - 1))))) {\n            return g(\"ex args number mismatch: %s\", JSON.stringify(i));\n        }\n    ;\n    ;\n        return ((((g._prefix + JSON.stringify(i))) + g._suffix));\n    };\n    g._prefix = \"\\u003C![EX[\";\n    g._suffix = \"]]\\u003E\";\n    e.exports = g;\n});\n__d(\"erx\", [\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"ex\"), h = function(i) {\n        if (((typeof i !== \"string\"))) {\n            return i;\n        }\n    ;\n    ;\n        var j = i.indexOf(g._prefix), k = i.lastIndexOf(g._suffix);\n        if (((((j < 0)) || ((k < 0))))) {\n            return [i,];\n        }\n    ;\n    ;\n        var l = ((j + g._prefix.length)), m = ((k + g._suffix.length));\n        if (((l >= k))) {\n            return [\"erx slice failure: %s\",i,];\n        }\n    ;\n    ;\n        var n = i.substring(0, j), o = i.substring(m);\n        i = i.substring(l, k);\n        var p;\n        try {\n            p = JSON.parse(i);\n            p[0] = ((((n + p[0])) + o));\n        } catch (q) {\n            return [\"erx parse failure: %s\",i,];\n        };\n    ;\n        return p;\n    };\n    e.exports = h;\n});\n__d(\"copyProperties\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n) {\n        h = ((h || {\n        }));\n        var o = [i,j,k,l,m,], p = 0, q;\n        while (o[p]) {\n            q = o[p++];\n            {\n                var fin5keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin5i = (0);\n                var r;\n                for (; (fin5i < fin5keys.length); (fin5i++)) {\n                    ((r) = (fin5keys[fin5i]));\n                    {\n                        h[r] = q[r];\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((((((q.hasOwnProperty && q.hasOwnProperty(\"toString\"))) && ((typeof q.toString != \"undefined\")))) && ((h.toString !== q.toString))))) {\n                h.toString = q.toString;\n            }\n        ;\n        ;\n        };\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"Env\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        start: JSBNG__Date.now()\n    };\n    if (a.Env) {\n        g(h, a.Env);\n        a.Env = undefined;\n    }\n;\n;\n    e.exports = h;\n});\n__d(\"ErrorUtils\", [\"eprintf\",\"erx\",\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"eprintf\"), h = b(\"erx\"), i = b(\"Env\"), j = \"\\u003Canonymous guard\\u003E\", k = \"\\u003Cgenerated guard\\u003E\", l = \"\\u003Cwindow.onerror\\u003E\", m = [], n = [], o = 50, p = ((window.chrome && ((\"type\" in new Error())))), q = false;\n    function r(da) {\n        if (!da) {\n            return;\n        }\n    ;\n    ;\n        var ea = da.split(/\\n\\n/)[0].replace(/[\\(\\)]|\\[.*?\\]|^\\w+:\\s.*?\\n/g, \"\").split(\"\\u000a\").map(function(fa) {\n            var ga, ha, ia;\n            fa = fa.trim();\n            if (/(:(\\d+)(:(\\d+))?)$/.test(fa)) {\n                ha = RegExp.$2;\n                ia = RegExp.$4;\n                fa = fa.slice(0, -RegExp.$1.length);\n            }\n        ;\n        ;\n            if (/(.*)(@|\\s)[^\\s]+$/.test(fa)) {\n                fa = fa.substring(((RegExp.$1.length + 1)));\n                ga = ((/(at)?\\s*(.*)([^\\s]+|$)/.test(RegExp.$1) ? RegExp.$2 : \"\"));\n            }\n        ;\n        ;\n            return ((((((((((\"    at\" + ((ga ? ((((\" \" + ga)) + \" (\")) : \" \")))) + fa.replace(/^@/, \"\"))) + ((ha ? ((\":\" + ha)) : \"\")))) + ((ia ? ((\":\" + ia)) : \"\")))) + ((ga ? \")\" : \"\"))));\n        });\n        return ea.join(\"\\u000a\");\n    };\n;\n    function s(da) {\n        if (!da) {\n            return {\n            };\n        }\n         else if (da._originalError) {\n            return da;\n        }\n        \n    ;\n    ;\n        var ea = {\n            line: ((da.lineNumber || da.line)),\n            column: ((da.columnNumber || da.column)),\n            JSBNG__name: da.JSBNG__name,\n            message: da.message,\n            script: ((((da.fileName || da.sourceURL)) || da.script)),\n            stack: r(((da.stackTrace || da.stack))),\n            guard: da.guard\n        };\n        if (((typeof ea.message === \"string\"))) {\n            ea.messageWithParams = h(ea.message);\n            ea.message = g.apply(a, ea.messageWithParams);\n        }\n         else {\n            ea.messageObject = ea.message;\n            ea.message = String(ea.message);\n        }\n    ;\n    ;\n        ea._originalError = da;\n        if (((da.framesToPop && ea.stack))) {\n            var fa = ea.stack.split(\"\\u000a\");\n            fa.shift();\n            if (((da.framesToPop === 2))) {\n                da.message += ((\" \" + fa.shift().trim()));\n            }\n        ;\n        ;\n            ea.stack = fa.join(\"\\u000a\");\n            if (/(\\w{3,5}:\\/\\/[^:]+):(\\d+)/.test(fa[0])) {\n                ea.script = RegExp.$1;\n                ea.line = parseInt(RegExp.$2, 10);\n            }\n        ;\n        ;\n            delete da.framesToPop;\n        }\n    ;\n    ;\n        if (((p && /(\\w{3,5}:\\/\\/[^:]+):(\\d+)/.test(da.stack)))) {\n            ea.script = RegExp.$1;\n            ea.line = parseInt(RegExp.$2, 10);\n        }\n    ;\n    ;\n        {\n            var fin6keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin6i = (0);\n            var ga;\n            for (; (fin6i < fin6keys.length); (fin6i++)) {\n                ((ga) = (fin6keys[fin6i]));\n                {\n                    ((((ea[ga] == null)) && delete ea[ga]));\n                ;\n                };\n            };\n        };\n    ;\n        return ea;\n    };\n;\n    function t() {\n        try {\n            throw new Error();\n        } catch (da) {\n            var ea = s(da).stack;\n            return ((ea && ea.replace(/[\\s\\S]*__getTrace__.*\\n/, \"\")));\n        };\n    ;\n    };\n;\n    function u(da, ea) {\n        if (q) {\n            return false;\n        }\n    ;\n    ;\n        da = s(da);\n        !ea;\n        if (((n.length > o))) {\n            n.splice(((o / 2)), 1);\n        }\n    ;\n    ;\n        n.push(da);\n        q = true;\n        for (var fa = 0; ((fa < m.length)); fa++) {\n            try {\n                m[fa](da);\n            } catch (ga) {\n            \n            };\n        ;\n        };\n    ;\n        q = false;\n        return true;\n    };\n;\n    var v = false;\n    function w() {\n        return v;\n    };\n;\n    function x() {\n        v = false;\n    };\n;\n    function y(da, ea, fa, ga, ha) {\n        var ia = !v;\n        if (ia) {\n            v = true;\n        }\n    ;\n    ;\n        var ja, ka = ((i.nocatch || (/nocatch/).test(JSBNG__location.search)));\n        if (ka) {\n            ja = da.apply(ea, ((fa || [])));\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            return ja;\n        }\n    ;\n    ;\n        try {\n            ja = da.apply(ea, ((fa || [])));\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            return ja;\n        } catch (la) {\n            if (ia) {\n                x();\n            }\n        ;\n        ;\n            var ma = s(la);\n            if (ga) {\n                ga(ma);\n            }\n        ;\n        ;\n            if (da) {\n                ma.callee = da.toString().substring(0, 100);\n            }\n        ;\n        ;\n            if (fa) {\n                ma.args = Array.prototype.slice.call(fa).toString().substring(0, 100);\n            }\n        ;\n        ;\n            ma.guard = ((ha || j));\n            u(ma);\n        };\n    ;\n    };\n;\n    function z(da, ea) {\n        ea = ((((ea || da.JSBNG__name)) || k));\n        function fa() {\n            return y(da, this, arguments, null, ea);\n        };\n    ;\n        return fa;\n    };\n;\n    function aa(da, ea, fa, ga) {\n        u({\n            message: da,\n            script: ea,\n            line: fa,\n            column: ga,\n            guard: l\n        }, true);\n    };\n;\n    window.JSBNG__onerror = aa;\n    function ba(da, ea) {\n        m.push(da);\n        if (!ea) {\n            n.forEach(da);\n        }\n    ;\n    ;\n    };\n;\n    var ca = {\n        ANONYMOUS_GUARD_TAG: j,\n        GENERATED_GUARD_TAG: k,\n        GLOBAL_ERROR_HANDLER_TAG: l,\n        addListener: ba,\n        applyWithGuard: y,\n        getTrace: t,\n        guard: z,\n        JSBNG__history: n,\n        inGuard: w,\n        normalizeError: s,\n        JSBNG__onerror: aa,\n        reportError: u\n    };\n    e.exports = a.ErrorUtils = ca;\n    if (((((typeof __t === \"function\")) && __t.setHandler))) {\n        __t.setHandler(u);\n    }\n;\n;\n});\n__d(\"CallbackDependencyManager\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\");\n    function h() {\n        this.$CallbackDependencyManager0 = {\n        };\n        this.$CallbackDependencyManager1 = {\n        };\n        this.$CallbackDependencyManager2 = 1;\n        this.$CallbackDependencyManager3 = {\n        };\n    };\n;\n    h.prototype.$CallbackDependencyManager4 = function(i, j) {\n        var k = 0, l = {\n        };\n        for (var m = 0, n = j.length; ((m < n)); m++) {\n            l[j[m]] = 1;\n        ;\n        };\n    ;\n        {\n            var fin7keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin7i = (0);\n            var o;\n            for (; (fin7i < fin7keys.length); (fin7i++)) {\n                ((o) = (fin7keys[fin7i]));\n                {\n                    if (this.$CallbackDependencyManager3[o]) {\n                        continue;\n                    }\n                ;\n                ;\n                    k++;\n                    if (((this.$CallbackDependencyManager0[o] === undefined))) {\n                        this.$CallbackDependencyManager0[o] = {\n                        };\n                    }\n                ;\n                ;\n                    this.$CallbackDependencyManager0[o][i] = ((((this.$CallbackDependencyManager0[o][i] || 0)) + 1));\n                };\n            };\n        };\n    ;\n        return k;\n    };\n    h.prototype.$CallbackDependencyManager5 = function(i) {\n        if (!this.$CallbackDependencyManager0[i]) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin8keys = ((window.top.JSBNG_Replay.forInKeys)((this.$CallbackDependencyManager0[i]))), fin8i = (0);\n            var j;\n            for (; (fin8i < fin8keys.length); (fin8i++)) {\n                ((j) = (fin8keys[fin8i]));\n                {\n                    this.$CallbackDependencyManager0[i][j]--;\n                    if (((this.$CallbackDependencyManager0[i][j] <= 0))) {\n                        delete this.$CallbackDependencyManager0[i][j];\n                    }\n                ;\n                ;\n                    this.$CallbackDependencyManager1[j].$CallbackDependencyManager6--;\n                    if (((this.$CallbackDependencyManager1[j].$CallbackDependencyManager6 <= 0))) {\n                        var k = this.$CallbackDependencyManager1[j].$CallbackDependencyManager7;\n                        delete this.$CallbackDependencyManager1[j];\n                        g.applyWithGuard(k);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n    h.prototype.addDependenciesToExistingCallback = function(i, j) {\n        if (!this.$CallbackDependencyManager1[i]) {\n            return null;\n        }\n    ;\n    ;\n        var k = this.$CallbackDependencyManager4(i, j);\n        this.$CallbackDependencyManager1[i].$CallbackDependencyManager6 += k;\n        return i;\n    };\n    h.prototype.isPersistentDependencySatisfied = function(i) {\n        return !!this.$CallbackDependencyManager3[i];\n    };\n    h.prototype.satisfyPersistentDependency = function(i) {\n        this.$CallbackDependencyManager3[i] = 1;\n        this.$CallbackDependencyManager5(i);\n    };\n    h.prototype.satisfyNonPersistentDependency = function(i) {\n        var j = ((this.$CallbackDependencyManager3[i] === 1));\n        if (!j) {\n            this.$CallbackDependencyManager3[i] = 1;\n        }\n    ;\n    ;\n        this.$CallbackDependencyManager5(i);\n        if (!j) {\n            delete this.$CallbackDependencyManager3[i];\n        }\n    ;\n    ;\n    };\n    h.prototype.registerCallback = function(i, j) {\n        var k = this.$CallbackDependencyManager2;\n        this.$CallbackDependencyManager2++;\n        var l = this.$CallbackDependencyManager4(k, j);\n        if (((l === 0))) {\n            g.applyWithGuard(i);\n            return null;\n        }\n    ;\n    ;\n        this.$CallbackDependencyManager1[k] = {\n            $CallbackDependencyManager7: i,\n            $CallbackDependencyManager6: l\n        };\n        return k;\n    };\n    h.prototype.unsatisfyPersistentDependency = function(i) {\n        delete this.$CallbackDependencyManager3[i];\n    };\n    e.exports = h;\n});\n__d(\"emptyFunction\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j) {\n        return function() {\n            return j;\n        };\n    };\n;\n    {\n        function i() {\n        \n        };\n        ((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_55.push)((i)));\n    };\n;\n    g(i, {\n        thatReturns: h,\n        thatReturnsFalse: h(false),\n        thatReturnsTrue: h(true),\n        thatReturnsNull: h(null),\n        thatReturnsThis: function() {\n            return this;\n        },\n        thatReturnsArgument: function(j) {\n            return j;\n        }\n    });\n    e.exports = i;\n});\n__d(\"invariant\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            throw new Error(\"Invariant Violation\");\n        }\n    ;\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"EventSubscriptionVendor\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h() {\n        this.$EventSubscriptionVendor0 = {\n        };\n        this.$EventSubscriptionVendor1 = null;\n    };\n;\n    h.prototype.addSubscription = function(i, j) {\n        g(((j.subscriber === this)));\n        if (!this.$EventSubscriptionVendor0[i]) {\n            this.$EventSubscriptionVendor0[i] = [];\n        }\n    ;\n    ;\n        var k = this.$EventSubscriptionVendor0[i].length;\n        this.$EventSubscriptionVendor0[i].push(j);\n        j.eventType = i;\n        j.key = k;\n        return j;\n    };\n    h.prototype.removeAllSubscriptions = function(i) {\n        if (((i === undefined))) {\n            this.$EventSubscriptionVendor0 = {\n            };\n        }\n         else delete this.$EventSubscriptionVendor0[i];\n    ;\n    ;\n    };\n    h.prototype.removeSubscription = function(i) {\n        var j = i.eventType, k = i.key, l = this.$EventSubscriptionVendor0[j];\n        if (l) {\n            delete l[k];\n        }\n    ;\n    ;\n    };\n    h.prototype.getSubscriptionsForType = function(i) {\n        return this.$EventSubscriptionVendor0[i];\n    };\n    e.exports = h;\n});\n__d(\"EventSubscription\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this.subscriber = h;\n    };\n;\n    g.prototype.remove = function() {\n        this.subscriber.removeSubscription(this);\n    };\n    e.exports = g;\n});\n__d(\"EmitterSubscription\", [\"EventSubscription\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventSubscription\");\n    {\n        var fin9keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin9i = (0);\n        var h;\n        for (; (fin9i < fin9keys.length); (fin9i++)) {\n            ((h) = (fin9keys[fin9i]));\n            {\n                if (((g.hasOwnProperty(h) && ((h !== \"_metaprototype\"))))) {\n                    j[h] = g[h];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var i = ((((g === null)) ? null : g.prototype));\n    j.prototype = Object.create(i);\n    j.prototype.constructor = j;\n    j.__superConstructor__ = g;\n    function j(k, l, m) {\n        g.call(this, k);\n        this.listener = l;\n        this.context = m;\n    };\n;\n    e.exports = j;\n});\n__d(\"EventEmitter\", [\"emptyFunction\",\"invariant\",\"EventSubscriptionVendor\",\"EmitterSubscription\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"invariant\"), i = b(\"EventSubscriptionVendor\"), j = b(\"EmitterSubscription\");\n    function k() {\n        this.$EventEmitter0 = new i();\n    };\n;\n    k.prototype.addListener = function(l, m, n) {\n        return this.$EventEmitter0.addSubscription(l, new j(this.$EventEmitter0, m, n));\n    };\n    k.prototype.once = function(l, m, n) {\n        var o = this;\n        return this.addListener(l, function() {\n            o.removeCurrentListener();\n            m.apply(n, arguments);\n        });\n    };\n    k.prototype.removeAllListeners = function(l) {\n        this.$EventEmitter0.removeAllSubscriptions(l);\n    };\n    k.prototype.removeCurrentListener = function() {\n        h(!!this.$EventEmitter1);\n        this.$EventEmitter0.removeSubscription(this.$EventEmitter1);\n    };\n    k.prototype.listeners = function(l) {\n        var m = this.$EventEmitter0.getSubscriptionsForType(l);\n        return ((m ? m.filter(g.thatReturnsTrue).map(function(n) {\n            return n.listener;\n        }) : []));\n    };\n    k.prototype.emit = function(l, m, n, o, p, q, r) {\n        h(((r === undefined)));\n        var s = this.$EventEmitter0.getSubscriptionsForType(l);\n        if (s) {\n            var t = Object.keys(s);\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = t[u], w = s[v];\n                if (w) {\n                    this.$EventEmitter1 = w;\n                    var x = w.listener;\n                    if (((w.context === undefined))) {\n                        x(m, n, o, p, q);\n                    }\n                     else x.call(w.context, m, n, o, p, q);\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            this.$EventEmitter1 = null;\n        }\n    ;\n    ;\n    };\n    e.exports = k;\n});\n__d(\"EventEmitterWithHolding\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        this.$EventEmitterWithHolding0 = h;\n        this.$EventEmitterWithHolding1 = i;\n        this.$EventEmitterWithHolding2 = null;\n        this.$EventEmitterWithHolding3 = false;\n    };\n;\n    g.prototype.addListener = function(h, i, j) {\n        return this.$EventEmitterWithHolding0.addListener(h, i, j);\n    };\n    g.prototype.once = function(h, i, j) {\n        return this.$EventEmitterWithHolding0.once(h, i, j);\n    };\n    g.prototype.addRetroactiveListener = function(h, i, j) {\n        var k = this.$EventEmitterWithHolding0.addListener(h, i, j);\n        this.$EventEmitterWithHolding3 = true;\n        this.$EventEmitterWithHolding1.emitToListener(h, i, j);\n        this.$EventEmitterWithHolding3 = false;\n        return k;\n    };\n    g.prototype.removeAllListeners = function(h) {\n        this.$EventEmitterWithHolding0.removeAllListeners(h);\n    };\n    g.prototype.removeCurrentListener = function() {\n        this.$EventEmitterWithHolding0.removeCurrentListener();\n    };\n    g.prototype.listeners = function(h) {\n        return this.$EventEmitterWithHolding0.listeners(h);\n    };\n    g.prototype.emit = function(h, i, j, k, l, m, n) {\n        this.$EventEmitterWithHolding0.emit(h, i, j, k, l, m, n);\n    };\n    g.prototype.emitAndHold = function(h, i, j, k, l, m, n) {\n        this.$EventEmitterWithHolding2 = this.$EventEmitterWithHolding1.holdEvent(h, i, j, k, l, m, n);\n        this.$EventEmitterWithHolding0.emit(h, i, j, k, l, m, n);\n        this.$EventEmitterWithHolding2 = null;\n    };\n    g.prototype.releaseCurrentEvent = function() {\n        if (((this.$EventEmitterWithHolding2 !== null))) {\n            this.$EventEmitterWithHolding1.releaseEvent(this.$EventEmitterWithHolding2);\n        }\n         else if (this.$EventEmitterWithHolding3) {\n            this.$EventEmitterWithHolding1.releaseCurrentEvent();\n        }\n        \n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventHolder\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h() {\n        this.$EventHolder0 = [];\n        this.$EventHolder1 = [];\n        this.$EventHolder2 = null;\n    };\n;\n    h.prototype.holdEvent = function(i, j, k, l, m, n, o) {\n        var p = this.$EventHolder0.length, JSBNG__event = [i,j,k,l,m,n,o,];\n        this.$EventHolder0.push(JSBNG__event);\n        return p;\n    };\n    h.prototype.emitToListener = function(i, j, k) {\n        this.forEachHeldEvent(function(l, m, n, o, p, q, r) {\n            if (((l === i))) {\n                j.call(k, m, n, o, p, q, r);\n            }\n        ;\n        ;\n        });\n    };\n    h.prototype.forEachHeldEvent = function(i, j) {\n        this.$EventHolder0.forEach(function(JSBNG__event, k) {\n            this.$EventHolder2 = k;\n            i.apply(j, JSBNG__event);\n        }, this);\n        this.$EventHolder2 = null;\n    };\n    h.prototype.releaseCurrentEvent = function() {\n        g(((this.$EventHolder2 !== null)));\n        delete this.$EventHolder0[this.$EventHolder2];\n    };\n    h.prototype.releaseEvent = function(i) {\n        delete this.$EventHolder0[i];\n    };\n    e.exports = h;\n});\n__d(\"asyncCallback\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if (a.ArbiterMonitor) {\n            return a.ArbiterMonitor.asyncCallback(h, i);\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"hasArrayNature\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return ((((((((((!!h && ((((typeof h == \"object\")) || ((typeof h == \"function\")))))) && ((\"length\" in h)))) && !((\"JSBNG__setInterval\" in h)))) && ((typeof h.nodeType != \"number\")))) && ((((Array.isArray(h) || ((\"callee\" in h)))) || ((\"JSBNG__item\" in h))))));\n    };\n;\n    e.exports = g;\n});\n__d(\"createArrayFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        if (!g(i)) {\n            return [i,];\n        }\n    ;\n    ;\n        if (i.JSBNG__item) {\n            var j = i.length, k = new Array(j);\n            while (j--) {\n                k[j] = i[j];\n            ;\n            };\n        ;\n            return k;\n        }\n    ;\n    ;\n        return Array.prototype.slice.call(i);\n    };\n;\n    e.exports = h;\n});\n__d(\"Arbiter\", [\"CallbackDependencyManager\",\"ErrorUtils\",\"EventEmitter\",\"EventEmitterWithHolding\",\"EventHolder\",\"asyncCallback\",\"copyProperties\",\"createArrayFrom\",\"hasArrayNature\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackDependencyManager\"), h = b(\"ErrorUtils\"), i = b(\"EventEmitter\"), j = b(\"EventEmitterWithHolding\"), k = b(\"EventHolder\"), l = b(\"asyncCallback\"), m = b(\"copyProperties\"), n = b(\"createArrayFrom\"), o = b(\"hasArrayNature\"), p = b(\"invariant\");\n    function q() {\n        var v = new i();\n        this.$Arbiter0 = new t();\n        this.$Arbiter1 = new j(v, this.$Arbiter0);\n        this.$Arbiter2 = new g();\n        this.$Arbiter3 = [];\n    };\n;\n    q.prototype.subscribe = function(v, w, x) {\n        v = n(v);\n        v.forEach(function(z) {\n            p(((z && ((typeof z === \"string\")))));\n        });\n        p(((typeof w === \"function\")));\n        x = ((x || q.SUBSCRIBE_ALL));\n        p(((((x === q.SUBSCRIBE_NEW)) || ((x === q.SUBSCRIBE_ALL)))));\n        var y = v.map(function(z) {\n            var aa = this.$Arbiter4.bind(this, w, z);\n            if (((x === q.SUBSCRIBE_NEW))) {\n                return this.$Arbiter1.addListener(z, aa);\n            }\n        ;\n        ;\n            this.$Arbiter3.push({\n            });\n            var ba = this.$Arbiter1.addRetroactiveListener(z, aa);\n            this.$Arbiter3.pop();\n            return ba;\n        }, this);\n        return new u(this, y);\n    };\n    q.prototype.$Arbiter4 = function(v, w, x) {\n        var y = this.$Arbiter3[((this.$Arbiter3.length - 1))];\n        if (((y[w] === false))) {\n            return;\n        }\n    ;\n    ;\n        var z = h.applyWithGuard(v, null, [w,x,]);\n        if (((z === false))) {\n            this.$Arbiter1.releaseCurrentEvent();\n        }\n    ;\n    ;\n        y[w] = z;\n    };\n    q.prototype.subscribeOnce = function(v, w, x) {\n        var y = this.subscribe(v, function(z, aa) {\n            ((y && y.unsubscribe()));\n            return w(z, aa);\n        }, x);\n        return y;\n    };\n    q.prototype.unsubscribe = function(v) {\n        p(v.isForArbiterInstance(this));\n        v.unsubscribe();\n    };\n    q.prototype.inform = function(v, w, x) {\n        var y = o(v);\n        v = n(v);\n        x = ((x || q.BEHAVIOR_EVENT));\n        var z = ((((x === q.BEHAVIOR_STATE)) || ((x === q.BEHAVIOR_PERSISTENT)))), aa = a.ArbiterMonitor;\n        this.$Arbiter3.push({\n        });\n        for (var ba = 0; ((ba < v.length)); ba++) {\n            var ca = v[ba];\n            p(ca);\n            this.$Arbiter0.setHoldingBehavior(ca, x);\n            ((aa && aa.record(\"JSBNG__event\", ca, w, this)));\n            this.$Arbiter1.emitAndHold(ca, w);\n            this.$Arbiter5(ca, w, z);\n            ((aa && aa.record(\"done\", ca, w, this)));\n        };\n    ;\n        var da = this.$Arbiter3.pop();\n        return ((y ? da : da[v[0]]));\n    };\n    q.prototype.query = function(v) {\n        var w = this.$Arbiter0.getHoldingBehavior(v);\n        p(((!w || ((w === q.BEHAVIOR_STATE)))));\n        var x = null;\n        this.$Arbiter0.emitToListener(v, function(y) {\n            x = y;\n        });\n        return x;\n    };\n    q.prototype.registerCallback = function(v, w) {\n        if (((typeof v === \"function\"))) {\n            return this.$Arbiter2.registerCallback(l(v, \"arbiter\"), w);\n        }\n         else return this.$Arbiter2.addDependenciesToExistingCallback(v, w)\n    ;\n    };\n    q.prototype.$Arbiter5 = function(v, w, x) {\n        if (((w === null))) {\n            return;\n        }\n    ;\n    ;\n        if (x) {\n            this.$Arbiter2.satisfyPersistentDependency(v);\n        }\n         else this.$Arbiter2.satisfyNonPersistentDependency(v);\n    ;\n    ;\n    };\n    {\n        var fin10keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin10i = (0);\n        var r;\n        for (; (fin10i < fin10keys.length); (fin10i++)) {\n            ((r) = (fin10keys[fin10i]));\n            {\n                if (((k.hasOwnProperty(r) && ((r !== \"_metaprototype\"))))) {\n                    t[r] = k[r];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var s = ((((k === null)) ? null : k.prototype));\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = k;\n    function t() {\n        k.call(this);\n        this.$ArbiterEventHolder0 = {\n        };\n    };\n;\n    t.prototype.setHoldingBehavior = function(v, w) {\n        this.$ArbiterEventHolder0[v] = w;\n    };\n    t.prototype.getHoldingBehavior = function(v) {\n        return this.$ArbiterEventHolder0[v];\n    };\n    t.prototype.holdEvent = function(v, w, x, y, z) {\n        var aa = this.$ArbiterEventHolder0[v];\n        if (((aa !== q.BEHAVIOR_PERSISTENT))) {\n            this.$ArbiterEventHolder2(v);\n        }\n    ;\n    ;\n        if (((aa !== q.BEHAVIOR_EVENT))) {\n            return s.holdEvent.call(this, v, w, x, y, z);\n        }\n    ;\n    ;\n    };\n    t.prototype.$ArbiterEventHolder2 = function(v) {\n        this.emitToListener(v, this.releaseCurrentEvent, this);\n    };\n    m(q, {\n        SUBSCRIBE_NEW: \"new\",\n        SUBSCRIBE_ALL: \"all\",\n        BEHAVIOR_EVENT: \"JSBNG__event\",\n        BEHAVIOR_STATE: \"state\",\n        BEHAVIOR_PERSISTENT: \"persistent\"\n    });\n    function u(v, w) {\n        this.$ArbiterToken0 = v;\n        this.$ArbiterToken1 = w;\n    };\n;\n    u.prototype.unsubscribe = function() {\n        for (var v = 0; ((v < this.$ArbiterToken1.length)); v++) {\n            this.$ArbiterToken1[v].remove();\n        ;\n        };\n    ;\n        this.$ArbiterToken1.length = 0;\n    };\n    u.prototype.isForArbiterInstance = function(v) {\n        p(this.$ArbiterToken0);\n        return ((this.$ArbiterToken0 === v));\n    };\n    Object.keys(q.prototype).forEach(function(v) {\n        q[v] = function() {\n            var w = ((((this instanceof q)) ? this : q));\n            return q.prototype[v].apply(w, arguments);\n        };\n    });\n    q.call(q);\n    e.exports = q;\n});\n__d(\"ArbiterMixin\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = {\n        _getArbiterInstance: function() {\n            return ((this._arbiter || (this._arbiter = new g())));\n        },\n        inform: function(i, j, k) {\n            return this._getArbiterInstance().inform(i, j, k);\n        },\n        subscribe: function(i, j, k) {\n            return this._getArbiterInstance().subscribe(i, j, k);\n        },\n        subscribeOnce: function(i, j, k) {\n            return this._getArbiterInstance().subscribeOnce(i, j, k);\n        },\n        unsubscribe: function(i) {\n            this._getArbiterInstance().unsubscribe(i);\n        },\n        registerCallback: function(i, j) {\n            return this._getArbiterInstance().registerCallback(i, j);\n        },\n        query: function(i) {\n            return this._getArbiterInstance().query(i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:ArbiterMixin\", [\"ArbiterMixin\",], function(a, b, c, d) {\n    a.ArbiterMixin = b(\"ArbiterMixin\");\n}, 3);\n__d(\"ge\", [], function(a, b, c, d, e, f) {\n    function g(j, k, l) {\n        return ((((typeof j != \"string\")) ? j : ((!k ? JSBNG__document.getElementById(j) : h(j, k, l)))));\n    };\n;\n    function h(j, k, l) {\n        var m, n, o;\n        if (((i(k) == j))) {\n            return k;\n        }\n         else if (k.getElementsByTagName) {\n            n = k.getElementsByTagName(((l || \"*\")));\n            for (o = 0; ((o < n.length)); o++) {\n                if (((i(n[o]) == j))) {\n                    return n[o];\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            n = k.childNodes;\n            for (o = 0; ((o < n.length)); o++) {\n                m = h(j, n[o]);\n                if (m) {\n                    return m;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n        \n    ;\n    ;\n        return null;\n    };\n;\n    function i(j) {\n        var k = ((j.getAttributeNode && j.getAttributeNode(\"id\")));\n        return ((k ? k.value : null));\n    };\n;\n    e.exports = g;\n});\n__d(\"$\", [\"ge\",\"ex\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\"), h = b(\"ex\");\n    function i(j) {\n        var k = g(j);\n        if (!k) {\n            throw new Error(h(\"Tried to get element with id of \\\"%s\\\" but it is not present on the page.\", j));\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = i;\n});\n__d(\"CSSCore\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(j, k) {\n        if (j.classList) {\n            return ((!!k && j.classList.contains(k)));\n        }\n    ;\n    ;\n        return ((((((\" \" + j.className)) + \" \")).indexOf(((((\" \" + k)) + \" \"))) > -1));\n    };\n;\n    var i = {\n        addClass: function(j, k) {\n            g(!/\\s/.test(k));\n            if (k) {\n                if (j.classList) {\n                    j.classList.add(k);\n                }\n                 else if (!h(j, k)) {\n                    j.className = ((((j.className + \" \")) + k));\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return j;\n        },\n        removeClass: function(j, k) {\n            g(!/\\s/.test(k));\n            if (k) {\n                if (j.classList) {\n                    j.classList.remove(k);\n                }\n                 else if (h(j, k)) {\n                    j.className = j.className.replace(new RegExp(((((\"(^|\\\\s)\" + k)) + \"(?:\\\\s|$)\")), \"g\"), \"$1\").replace(/\\s+/g, \" \").replace(/^\\s*|\\s*$/g, \"\");\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return j;\n        },\n        conditionClass: function(j, k, l) {\n            return ((l ? i.addClass : i.removeClass))(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSBNG__CSS\", [\"$\",\"CSSCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"CSSCore\"), i = \"hidden_elem\", j = {\n        setClass: function(k, l) {\n            g(k).className = ((l || \"\"));\n            return k;\n        },\n        hasClass: function(k, l) {\n            k = g(k);\n            if (k.classList) {\n                return ((!!l && k.classList.contains(l)));\n            }\n        ;\n        ;\n            return ((((((\" \" + k.className)) + \" \")).indexOf(((((\" \" + l)) + \" \"))) > -1));\n        },\n        addClass: function(k, l) {\n            return h.addClass(g(k), l);\n        },\n        removeClass: function(k, l) {\n            return h.removeClass(g(k), l);\n        },\n        conditionClass: function(k, l, m) {\n            return h.conditionClass(g(k), l, m);\n        },\n        toggleClass: function(k, l) {\n            return j.conditionClass(k, l, !j.hasClass(k, l));\n        },\n        shown: function(k) {\n            return !j.hasClass(k, i);\n        },\n        hide: function(k) {\n            return j.addClass(k, i);\n        },\n        show: function(k) {\n            return j.removeClass(k, i);\n        },\n        toggle: function(k) {\n            return j.toggleClass(k, i);\n        },\n        conditionShow: function(k, l) {\n            return j.conditionClass(k, i, !l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:css-core\", [\"JSBNG__CSS\",], function(a, b, c, d) {\n    a.JSBNG__CSS = b(\"JSBNG__CSS\");\n}, 3);\n__d(\"legacy:dom-core\", [\"$\",\"ge\",], function(a, b, c, d) {\n    a.$ = b(\"$\");\n    a.ge = b(\"ge\");\n}, 3);\n__d(\"Parent\", [\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = {\n        byTag: function(i, j) {\n            j = j.toUpperCase();\n            while (((i && ((i.nodeName != j))))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        },\n        byClass: function(i, j) {\n            while (((i && !g.hasClass(i, j)))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        },\n        byAttribute: function(i, j) {\n            while (((i && ((!i.getAttribute || !i.getAttribute(j)))))) {\n                i = i.parentNode;\n            ;\n            };\n        ;\n            return i;\n        }\n    };\n    e.exports = h;\n});\n__d(\"legacy:parent\", [\"Parent\",], function(a, b, c, d) {\n    a.Parent = b(\"Parent\");\n}, 3);\n__d(\"legacy:emptyFunction\", [\"emptyFunction\",], function(a, b, c, d) {\n    a.emptyFunction = b(\"emptyFunction\");\n}, 3);\n__d(\"isEmpty\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (Array.isArray(h)) {\n            return ((h.length === 0));\n        }\n         else if (((typeof h === \"object\"))) {\n            {\n                var fin11keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin11i = (0);\n                var i;\n                for (; (fin11i < fin11keys.length); (fin11i++)) {\n                    ((i) = (fin11keys[fin11i]));\n                    {\n                        return false;\n                    };\n                };\n            };\n        ;\n            return true;\n        }\n         else return !h\n        \n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"CSSLoader\", [\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"isEmpty\"), h = 20, i = 5000, j, k, l = {\n    }, m = [], n, o = {\n    };\n    function p(t) {\n        if (k) {\n            return;\n        }\n    ;\n    ;\n        k = true;\n        var u = JSBNG__document.createElement(\"link\");\n        u.JSBNG__onload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_175), function() {\n            j = true;\n            u.parentNode.removeChild(u);\n        }));\n        u.rel = \"stylesheet\";\n        u.href = \"data:text/css;base64,\";\n        t.appendChild(u);\n    };\n;\n    function q() {\n        var t, u = [], v = [];\n        if (((JSBNG__Date.now() >= n))) {\n            {\n                var fin12keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin12i = (0);\n                (0);\n                for (; (fin12i < fin12keys.length); (fin12i++)) {\n                    ((t) = (fin12keys[fin12i]));\n                    {\n                        v.push(o[t].signal);\n                        u.push(o[t].error);\n                    };\n                };\n            };\n        ;\n            o = {\n            };\n        }\n         else {\n            var fin13keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin13i = (0);\n            (0);\n            for (; (fin13i < fin13keys.length); (fin13i++)) {\n                ((t) = (fin13keys[fin13i]));\n                {\n                    var w = o[t].signal, x = ((window.JSBNG__getComputedStyle ? JSBNG__getComputedStyle(w, null) : w.currentStyle));\n                    if (((x && ((parseInt(x.height, 10) > 1))))) {\n                        u.push(o[t].load);\n                        v.push(w);\n                        delete o[t];\n                    }\n                ;\n                ;\n                };\n            };\n        }\n    ;\n    ;\n        for (var y = 0; ((y < v.length)); y++) {\n            v[y].parentNode.removeChild(v[y]);\n        ;\n        };\n    ;\n        if (!g(u)) {\n            for (y = 0; ((y < u.length)); y++) {\n                u[y]();\n            ;\n            };\n        ;\n            n = ((JSBNG__Date.now() + i));\n        }\n    ;\n    ;\n        return g(o);\n    };\n;\n    function r(t, u, v, w) {\n        var x = JSBNG__document.createElement(\"meta\");\n        x.id = ((\"bootloader_\" + t.replace(/[^a-z0-9]/gi, \"_\")));\n        u.appendChild(x);\n        var y = !g(o);\n        n = ((JSBNG__Date.now() + i));\n        o[t] = {\n            signal: x,\n            load: v,\n            error: w\n        };\n        if (!y) {\n            var z = JSBNG__setInterval(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_178), function aa() {\n                if (q()) {\n                    JSBNG__clearInterval(z);\n                }\n            ;\n            ;\n            })), h, false);\n        }\n    ;\n    ;\n    };\n;\n    var s = {\n        loadStyleSheet: function(t, u, v, w, x) {\n            if (l[t]) {\n                throw new Error(((((\"CSS component \" + t)) + \" has already been requested.\")));\n            }\n        ;\n        ;\n            if (JSBNG__document.createStyleSheet) {\n                var y;\n                for (var z = 0; ((z < m.length)); z++) {\n                    if (((m[z].imports.length < 31))) {\n                        y = z;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((y === undefined))) {\n                    m.push(JSBNG__document.createStyleSheet());\n                    y = ((m.length - 1));\n                }\n            ;\n            ;\n                m[y].addImport(u);\n                l[t] = {\n                    styleSheet: m[y],\n                    uri: u\n                };\n                r(t, v, w, x);\n                return;\n            }\n        ;\n        ;\n            var aa = JSBNG__document.createElement(\"link\");\n            aa.rel = \"stylesheet\";\n            aa.type = \"text/css\";\n            aa.href = u;\n            l[t] = {\n                link: aa\n            };\n            if (j) {\n                aa.JSBNG__onload = function() {\n                    aa.JSBNG__onload = aa.JSBNG__onerror = null;\n                    w();\n                };\n                aa.JSBNG__onerror = function() {\n                    aa.JSBNG__onload = aa.JSBNG__onerror = null;\n                    x();\n                };\n            }\n             else {\n                r(t, v, w, x);\n                if (((j === undefined))) {\n                    p(v);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            v.appendChild(aa);\n        },\n        registerLoadedStyleSheet: function(t, u) {\n            if (l[t]) {\n                throw new Error(((((((\"CSS component \" + t)) + \" has been requested and should not be \")) + \"loaded more than once.\")));\n            }\n        ;\n        ;\n            l[t] = {\n                link: u\n            };\n        },\n        unloadStyleSheet: function(t) {\n            if (((!t in l))) {\n                return;\n            }\n        ;\n        ;\n            var u = l[t], v = u.link;\n            if (v) {\n                v.JSBNG__onload = v.JSBNG__onerror = null;\n                v.parentNode.removeChild(v);\n            }\n             else {\n                var w = u.styleSheet;\n                for (var x = 0; ((x < w.imports.length)); x++) {\n                    if (((w.imports[x].href == u.uri))) {\n                        w.removeImport(x);\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            delete o[t];\n            delete l[t];\n        }\n    };\n    e.exports = s;\n});\n__d(\"Bootloader\", [\"CSSLoader\",\"CallbackDependencyManager\",\"createArrayFrom\",\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSLoader\"), h = b(\"CallbackDependencyManager\"), i = b(\"createArrayFrom\"), j = b(\"ErrorUtils\"), k = {\n    }, l = {\n    }, m = {\n    }, n = null, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = false, t = [], u = new h(), v = [];\n    j.addListener(function(ca) {\n        ca.loadingUrls = Object.keys(p);\n    }, true);\n    function w(ca, da, ea, fa) {\n        var ga = ba.done.bind(null, [ea,], ((ca === \"css\")), da);\n        p[da] = JSBNG__Date.now();\n        if (((ca == \"js\"))) {\n            var ha = JSBNG__document.createElement(\"script\");\n            ha.src = da;\n            ha.async = true;\n            var ia = o[ea];\n            if (((ia && ia.crossOrigin))) {\n                ha.crossOrigin = \"anonymous\";\n            }\n        ;\n        ;\n            ha.JSBNG__onload = ga;\n            ha.JSBNG__onerror = function() {\n                q[da] = true;\n                ga();\n            };\n            ha.JSBNG__onreadystatechange = function() {\n                if (((this.readyState in {\n                    loaded: 1,\n                    complete: 1\n                }))) {\n                    ga();\n                }\n            ;\n            ;\n            };\n            fa.appendChild(ha);\n        }\n         else if (((ca == \"css\"))) {\n            g.loadStyleSheet(ea, da, fa, ga, function() {\n                q[da] = true;\n                ga();\n            });\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ca) {\n        if (!o[ca]) {\n            return;\n        }\n    ;\n    ;\n        if (((o[ca].type == \"css\"))) {\n            g.unloadStyleSheet(ca);\n            delete k[ca];\n            u.unsatisfyPersistentDependency(ca);\n        }\n    ;\n    ;\n    };\n;\n    function y(ca, da) {\n        if (!s) {\n            t.push([ca,da,]);\n            return;\n        }\n    ;\n    ;\n        ca = i(ca);\n        var ea = [];\n        for (var fa = 0; ((fa < ca.length)); ++fa) {\n            if (!ca[fa]) {\n                continue;\n            }\n        ;\n        ;\n            var ga = m[ca[fa]];\n            if (ga) {\n                var ha = ga.resources;\n                for (var ia = 0; ((ia < ha.length)); ++ia) {\n                    ea.push(ha[ia]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        ba.loadResources(ea, da);\n    };\n;\n    function z(ca) {\n        ca = i(ca);\n        for (var da = 0; ((da < ca.length)); ++da) {\n            if (((ca[da] !== undefined))) {\n                k[ca[da]] = true;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function aa(ca) {\n        if (!ca) {\n            return [];\n        }\n    ;\n    ;\n        var da = [];\n        for (var ea = 0; ((ea < ca.length)); ++ea) {\n            if (((typeof ca[ea] == \"string\"))) {\n                if (((ca[ea] in o))) {\n                    da.push(o[ca[ea]]);\n                }\n            ;\n            ;\n            }\n             else da.push(ca[ea]);\n        ;\n        ;\n        };\n    ;\n        return da;\n    };\n;\n    var ba = {\n        configurePage: function(ca) {\n            var da = {\n            }, ea = aa(ca), fa;\n            for (fa = 0; ((fa < ea.length)); fa++) {\n                da[ea[fa].src] = ea[fa];\n                z(ea[fa].JSBNG__name);\n            };\n        ;\n            var ga = JSBNG__document.getElementsByTagName(\"link\");\n            for (fa = 0; ((fa < ga.length)); ++fa) {\n                if (((ga[fa].rel != \"stylesheet\"))) {\n                    continue;\n                }\n            ;\n            ;\n                {\n                    var fin14keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin14i = (0);\n                    var ha;\n                    for (; (fin14i < fin14keys.length); (fin14i++)) {\n                        ((ha) = (fin14keys[fin14i]));\n                        {\n                            if (((ga[fa].href.indexOf(ha) !== -1))) {\n                                var ia = da[ha].JSBNG__name;\n                                if (da[ha].permanent) {\n                                    l[ia] = true;\n                                }\n                            ;\n                            ;\n                                delete da[ha];\n                                g.registerLoadedStyleSheet(ia, ga[fa]);\n                                ba.done([ia,], true);\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n        },\n        loadComponents: function(ca, da) {\n            ca = i(ca);\n            var ea = [], fa = [];\n            for (var ga = 0; ((ga < ca.length)); ga++) {\n                var ha = m[ca[ga]];\n                if (((ha && !ha.module))) {\n                    continue;\n                }\n            ;\n            ;\n                var ia = ((\"legacy:\" + ca[ga]));\n                if (m[ia]) {\n                    ca[ga] = ia;\n                    ea.push(ia);\n                }\n                 else if (((ha && ha.module))) {\n                    ea.push(ca[ga]);\n                    if (!ha.runWhenReady) {\n                        fa.push(ca[ga]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            y(ca, ((ea.length ? d.bind(null, ea, da) : da)));\n        },\n        loadModules: function(ca, da) {\n            var ea = [], fa = [];\n            for (var ga = 0; ((ga < ca.length)); ga++) {\n                var ha = m[ca[ga]];\n                if (((!ha || ha.module))) {\n                    ea.push(ca[ga]);\n                }\n            ;\n            ;\n            };\n        ;\n            y(ca, d.bind(null, ea, da));\n        },\n        loadResources: function(ca, da, ea, fa) {\n            var ga;\n            ca = aa(i(ca));\n            if (ea) {\n                var ha = {\n                };\n                for (ga = 0; ((ga < ca.length)); ++ga) {\n                    ha[ca[ga].JSBNG__name] = true;\n                ;\n                };\n            ;\n                {\n                    var fin15keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin15i = (0);\n                    var ia;\n                    for (; (fin15i < fin15keys.length); (fin15i++)) {\n                        ((ia) = (fin15keys[fin15i]));\n                        {\n                            if (((((!((ia in l)) && !((ia in ha)))) && !((ia in r))))) {\n                                x(ia);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                r = {\n                };\n            }\n        ;\n        ;\n            var ja = [], ka = [];\n            for (ga = 0; ((ga < ca.length)); ++ga) {\n                var la = ca[ga];\n                if (la.permanent) {\n                    l[la.JSBNG__name] = true;\n                }\n            ;\n            ;\n                if (u.isPersistentDependencySatisfied(la.JSBNG__name)) {\n                    continue;\n                }\n            ;\n            ;\n                if (!la.nonblocking) {\n                    ka.push(la.JSBNG__name);\n                }\n            ;\n            ;\n                if (!k[la.JSBNG__name]) {\n                    z(la.JSBNG__name);\n                    ja.push(la);\n                    ((window.CavalryLogger && window.CavalryLogger.getInstance().measureResources(la, fa)));\n                }\n            ;\n            ;\n            };\n        ;\n            var ma;\n            if (da) {\n                if (((typeof da === \"function\"))) {\n                    ma = u.registerCallback(da, ka);\n                }\n                 else ma = u.addDependenciesToExistingCallback(da, ka);\n            ;\n            }\n        ;\n        ;\n            var na = ((JSBNG__document.documentMode || +((/MSIE.(\\d+)/.exec(JSBNG__navigator.userAgent) || []))[1])), oa = ba.getHardpoint(), pa = ((na ? oa : JSBNG__document.createDocumentFragment()));\n            for (ga = 0; ((ga < ja.length)); ++ga) {\n                w(ja[ga].type, ja[ga].src, ja[ga].JSBNG__name, pa);\n            ;\n            };\n        ;\n            if (((oa !== pa))) {\n                oa.appendChild(pa);\n            }\n        ;\n        ;\n            return ma;\n        },\n        requestJSResource: function(ca) {\n            var da = ba.getHardpoint();\n            w(\"js\", ca, null, da);\n        },\n        done: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199), function(ca, da, ea) {\n            if (ea) {\n                delete p[ea];\n            }\n        ;\n        ;\n            z(ca);\n            if (!da) {\n                for (var fa = 0, ga = v.length; ((fa < ga)); fa++) {\n                    v[fa]();\n                ;\n                };\n            }\n        ;\n        ;\n            for (var ha = 0; ((ha < ca.length)); ++ha) {\n                var ia = ca[ha];\n                if (ia) {\n                    u.satisfyPersistentDependency(ia);\n                }\n            ;\n            ;\n            };\n        ;\n        })),\n        subscribeToLoadedResources_DEPRECATED: function(ca) {\n            v.push(ca);\n        },\n        enableBootload: function(ca) {\n            {\n                var fin16keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin16i = (0);\n                var da;\n                for (; (fin16i < fin16keys.length); (fin16i++)) {\n                    ((da) = (fin16keys[fin16i]));\n                    {\n                        if (!m[da]) {\n                            m[da] = ca[da];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (!s) {\n                s = true;\n                for (var ea = 0; ((ea < t.length)); ea++) {\n                    y.apply(null, t[ea]);\n                ;\n                };\n            ;\n                t = [];\n            }\n        ;\n        ;\n        },\n        getHardpoint: function() {\n            if (!n) {\n                var ca = JSBNG__document.getElementsByTagName(\"head\");\n                n = ((((ca.length && ca[0])) || JSBNG__document.body));\n            }\n        ;\n        ;\n            return n;\n        },\n        setResourceMap: function(ca) {\n            {\n                var fin17keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin17i = (0);\n                var da;\n                for (; (fin17i < fin17keys.length); (fin17i++)) {\n                    ((da) = (fin17keys[fin17i]));\n                    {\n                        if (!o[da]) {\n                            ca[da].JSBNG__name = da;\n                            o[da] = ca[da];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        loadEarlyResources: function(ca) {\n            ba.setResourceMap(ca);\n            var da = [];\n            {\n                var fin18keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin18i = (0);\n                var ea;\n                for (; (fin18i < fin18keys.length); (fin18i++)) {\n                    ((ea) = (fin18keys[fin18i]));\n                    {\n                        var fa = o[ea];\n                        da.push(fa);\n                        if (!fa.permanent) {\n                            r[fa.JSBNG__name] = fa;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba.loadResources(da);\n        },\n        getLoadingUrls: function() {\n            var ca = {\n            }, da = JSBNG__Date.now();\n            {\n                var fin19keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin19i = (0);\n                var ea;\n                for (; (fin19i < fin19keys.length); (fin19i++)) {\n                    ((ea) = (fin19keys[fin19i]));\n                    {\n                        ca[ea] = ((da - p[ea]));\n                    ;\n                    };\n                };\n            };\n        ;\n            return ca;\n        },\n        getErrorUrls: function() {\n            return Object.keys(q);\n        }\n    };\n    e.exports = ba;\n});\n__d(\"BlueBarController\", [\"Bootloader\",\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__CSS\");\n    f.init = function(i) {\n        if (((\"getBoundingClientRect\" in i))) {\n            var j = function() {\n                var k = i.getBoundingClientRect(), l = ((Math.round(k.JSBNG__top) - JSBNG__document.documentElement.clientTop));\n                h.conditionClass(i.firstChild, \"fixed_elem\", ((l <= 0)));\n            };\n            j();\n            g.loadModules([\"JSBNG__Event\",], function(k) {\n                k.listen(window, \"JSBNG__scroll\", j);\n            });\n        }\n    ;\n    ;\n    };\n});\n__d(\"legacy:arbiter\", [\"Arbiter\",], function(a, b, c, d) {\n    a.Arbiter = b(\"Arbiter\");\n}, 3);\n__d(\"event-form-bubbling\", [], function(a, b, c, d, e, f) {\n    a.JSBNG__Event = ((a.JSBNG__Event || function() {\n    \n    }));\n    a.JSBNG__Event.__inlineSubmit = function(g, JSBNG__event) {\n        var h = ((a.JSBNG__Event.__getHandler && a.JSBNG__Event.__getHandler(g, \"submit\")));\n        return ((h ? null : a.JSBNG__Event.__bubbleSubmit(g, JSBNG__event)));\n    };\n    a.JSBNG__Event.__bubbleSubmit = function(g, JSBNG__event) {\n        if (JSBNG__document.documentElement.JSBNG__attachEvent) {\n            var h;\n            while (((((h !== false)) && (g = g.parentNode)))) {\n                h = ((g.JSBNG__onsubmit ? g.JSBNG__onsubmit(JSBNG__event) : ((a.JSBNG__Event.__fire && a.JSBNG__Event.__fire(g, \"submit\", JSBNG__event)))));\n            ;\n            };\n        ;\n            return h;\n        }\n    ;\n    ;\n    };\n}, 3);\n__d(\"OnloadEvent\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ONLOAD: \"onload/onload\",\n        ONLOAD_CALLBACK: \"onload/onload_callback\",\n        ONLOAD_DOMCONTENT: \"onload/dom_content_ready\",\n        ONLOAD_DOMCONTENT_CALLBACK: \"onload/domcontent_callback\",\n        ONBEFOREUNLOAD: \"onload/beforeunload\",\n        ONUNLOAD: \"onload/unload\"\n    };\n    e.exports = g;\n});\n__d(\"Run\", [\"Arbiter\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"OnloadEvent\"), i = \"onunloadhooks\", j = \"onafterunloadhooks\", k = g.BEHAVIOR_STATE;\n    function l(ba) {\n        var ca = a.CavalryLogger;\n        ((ca && ca.getInstance().setTimeStamp(ba)));\n    };\n;\n    function m() {\n        return !window.loading_page_chrome;\n    };\n;\n    function n(ba) {\n        var ca = a.OnloadHooks;\n        if (((window.loaded && ca))) {\n            ca.runHook(ba, \"onlateloadhooks\");\n        }\n         else u(\"onloadhooks\", ba);\n    ;\n    ;\n    };\n;\n    function o(ba) {\n        var ca = a.OnloadHooks;\n        if (((window.afterloaded && ca))) {\n            JSBNG__setTimeout(function() {\n                ca.runHook(ba, \"onlateafterloadhooks\");\n            }, 0);\n        }\n         else u(\"onafterloadhooks\", ba);\n    ;\n    ;\n    };\n;\n    function p(ba, ca) {\n        if (((ca === undefined))) {\n            ca = m();\n        }\n    ;\n    ;\n        ((ca ? u(\"onbeforeleavehooks\", ba) : u(\"onbeforeunloadhooks\", ba)));\n    };\n;\n    function q(ba, ca) {\n        if (!window.JSBNG__onunload) {\n            window.JSBNG__onunload = function() {\n                g.inform(h.ONUNLOAD, true, k);\n            };\n        }\n    ;\n    ;\n        u(ba, ca);\n    };\n;\n    function r(ba) {\n        q(i, ba);\n    };\n;\n    function s(ba) {\n        q(j, ba);\n    };\n;\n    function t(ba) {\n        u(\"onleavehooks\", ba);\n    };\n;\n    function u(ba, ca) {\n        window[ba] = ((window[ba] || [])).concat(ca);\n    };\n;\n    function v(ba) {\n        window[ba] = [];\n    };\n;\n    {\n        function w() {\n            g.inform(h.ONLOAD_DOMCONTENT, true, k);\n        };\n        ((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_231.push)((w)));\n    };\n;\n    a._domcontentready = w;\n    function x() {\n        var ba = JSBNG__document, ca = window;\n        if (ba.JSBNG__addEventListener) {\n            var da = /AppleWebKit.(\\d+)/.exec(JSBNG__navigator.userAgent);\n            if (((da && ((da[1] < 525))))) {\n                var ea = JSBNG__setInterval(function() {\n                    if (/loaded|complete/.test(ba.readyState)) {\n                        w();\n                        JSBNG__clearInterval(ea);\n                    }\n                ;\n                ;\n                }, 10);\n            }\n             else ba.JSBNG__addEventListener(\"DOMContentLoaded\", w, true);\n        ;\n        ;\n        }\n         else {\n            var fa = \"javascript:void(0)\";\n            if (((ca.JSBNG__location.protocol == \"https:\"))) {\n                fa = \"//:\";\n            }\n        ;\n        ;\n            ba.write(((((((((\"\\u003Cscript onreadystatechange=\\\"if (this.readyState=='complete') {\" + \"this.parentNode.removeChild(this);_domcontentready();}\\\" \")) + \"defer=\\\"defer\\\" src=\\\"\")) + fa)) + \"\\\"\\u003E\\u003C/script\\u003E\")));\n        }\n    ;\n    ;\n        var ga = ca.JSBNG__onload;\n        ca.JSBNG__onload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_234), function() {\n            l(\"t_layout\");\n            ((ga && ga()));\n            g.inform(h.ONLOAD, true, k);\n        }));\n        ca.JSBNG__onbeforeunload = ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_235), function() {\n            var ha = {\n            };\n            g.inform(h.ONBEFOREUNLOAD, ha, k);\n            if (!ha.warn) {\n                g.inform(\"onload/exit\", true);\n            }\n        ;\n        ;\n            return ha.warn;\n        }));\n    };\n;\n    var y = g.registerCallback(function() {\n        l(\"t_onload\");\n        g.inform(h.ONLOAD_CALLBACK, true, k);\n    }, [h.ONLOAD,]), z = g.registerCallback(function() {\n        l(\"t_domcontent\");\n        var ba = {\n            timeTriggered: JSBNG__Date.now()\n        };\n        g.inform(h.ONLOAD_DOMCONTENT_CALLBACK, ba, k);\n    }, [h.ONLOAD_DOMCONTENT,]);\n    x();\n    var aa = {\n        onLoad: n,\n        onAfterLoad: o,\n        onLeave: t,\n        onBeforeUnload: p,\n        onUnload: r,\n        onAfterUnload: s,\n        __domContentCallback: z,\n        __onloadCallback: y,\n        __removeHook: v\n    };\n    e.exports = aa;\n});\n__d(\"legacy:onload\", [\"Run\",\"OnloadEvent\",], function(a, b, c, d) {\n    var e = b(\"Run\");\n    a.OnloadEvent = b(\"OnloadEvent\");\n    a.onloadRegister_DEPRECATED = e.onLoad;\n    a.onloadRegister = function() {\n        return e.onLoad.apply(this, arguments);\n    };\n    a.onafterloadRegister_DEPRECATED = e.onAfterLoad;\n    a.onafterloadRegister = function() {\n        return e.onAfterLoad.apply(this, arguments);\n    };\n    a.onleaveRegister = e.onLeave;\n    a.onbeforeunloadRegister = e.onBeforeUnload;\n    a.onunloadRegister = e.onUnload;\n}, 3);\n__d(\"wait_for_load\", [\"Bootloader\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\");\n    function i(l, m) {\n        return ((window.loaded && m.call(l)));\n    };\n;\n    function j(l, m, n) {\n        g.loadComponents.call(g, m, n.bind(l));\n        return false;\n    };\n;\n    function k(l, m, n) {\n        n = n.bind(l, m);\n        if (window.loaded) {\n            return n();\n        }\n    ;\n    ;\n        switch (((m || JSBNG__event)).type) {\n          case \"load\":\n        \n          case \"JSBNG__focus\":\n            h.onAfterLoad(n);\n            return;\n          case \"click\":\n            var o = l.style, p = JSBNG__document.body.style;\n            o.cursor = p.cursor = \"progress\";\n            h.onAfterLoad(function() {\n                o.cursor = p.cursor = \"\";\n                if (((l.tagName.toLowerCase() == \"a\"))) {\n                    if (((((false !== n())) && l.href))) {\n                        window.JSBNG__location.href = l.href;\n                    }\n                ;\n                ;\n                }\n                 else if (l.click) {\n                    l.click();\n                }\n                \n            ;\n            ;\n            });\n            break;\n        };\n    ;\n        return false;\n    };\n;\n    a.run_if_loaded = i;\n    a.run_with = j;\n    a.wait_for_load = k;\n}, 3);\n__d(\"markJSEnabled\", [], function(a, b, c, d, e, f) {\n    var g = JSBNG__document.documentElement;\n    g.className = g.className.replace(\"no_js\", \"\");\n});\n__d(\"JSCC\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(j) {\n        var k, l = false;\n        return function() {\n            if (!l) {\n                k = j();\n                l = true;\n            }\n        ;\n        ;\n            return k;\n        };\n    };\n;\n    var i = {\n        get: function(j) {\n            if (!g[j]) {\n                throw new Error(\"JSCC entry is missing\");\n            }\n        ;\n        ;\n            return g[j]();\n        },\n        init: function(j) {\n            {\n                var fin20keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin20i = (0);\n                var k;\n                for (; (fin20i < fin20keys.length); (fin20i++)) {\n                    ((k) = (fin20keys[fin20i]));\n                    {\n                        g[k] = h(j[k]);\n                    ;\n                    };\n                };\n            };\n        ;\n            return function l() {\n                {\n                    var fin21keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin21i = (0);\n                    var m;\n                    for (; (fin21i < fin21keys.length); (fin21i++)) {\n                        ((m) = (fin21keys[fin21i]));\n                        {\n                            delete g[m];\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"PageletSet\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        hasPagelet: function(m) {\n            return i.hasOwnProperty(m);\n        },\n        getPagelet: function(m) {\n            return i[m];\n        },\n        getOrCreatePagelet: function(m) {\n            if (!j.hasPagelet(m)) {\n                var n = new l(m);\n                i[m] = n;\n            }\n        ;\n        ;\n            return j.getPagelet(m);\n        },\n        getPageletIDs: function() {\n            return Object.keys(i);\n        },\n        removePagelet: function(m) {\n            if (j.hasPagelet(m)) {\n                i[m].destroy();\n                delete i[m];\n            }\n        ;\n        ;\n        }\n    };\n    function k(m, n) {\n        return ((m.contains ? m.contains(n) : ((m.compareDocumentPosition(n) & 16))));\n    };\n;\n    function l(m) {\n        this.id = m;\n        this._root = null;\n        this._destructors = [];\n        this.addDestructor(function n() {\n            g.inform(\"pagelet/destroy\", {\n                id: this.id,\n                root: this._root\n            });\n        }.bind(this));\n    };\n;\n    h(l.prototype, {\n        setRoot: function(m) {\n            this._root = m;\n        },\n        _getDescendantPagelets: function() {\n            var m = [];\n            if (!this._root) {\n                return m;\n            }\n        ;\n        ;\n            var n = j.getPageletIDs();\n            for (var o = 0; ((o < n.length)); o++) {\n                var p = n[o];\n                if (((p === this.id))) {\n                    continue;\n                }\n            ;\n            ;\n                var q = i[p];\n                if (((q._root && k(this._root, q._root)))) {\n                    m.push(q);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        },\n        addDestructor: function(m) {\n            this._destructors.push(m);\n        },\n        destroy: function() {\n            var m = this._getDescendantPagelets();\n            for (var n = 0; ((n < m.length)); n++) {\n                var o = m[n];\n                if (j.hasPagelet(o.id)) {\n                    j.removePagelet(o.id);\n                }\n            ;\n            ;\n            };\n        ;\n            for (n = 0; ((n < this._destructors.length)); n++) {\n                this._destructors[n]();\n            ;\n            };\n        ;\n            if (this._root) {\n                while (this._root.firstChild) {\n                    this._root.removeChild(this._root.firstChild);\n                ;\n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"repeatString\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        if (((j === 1))) {\n            return i;\n        }\n    ;\n    ;\n        g(((j >= 0)));\n        var k = \"\";\n        while (j) {\n            if (((j & 1))) {\n                k += i;\n            }\n        ;\n        ;\n            if ((j >>= 1)) {\n                i += i;\n            }\n        ;\n        ;\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"BitMap\", [\"copyProperties\",\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"repeatString\"), i = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_\";\n    function j() {\n        this._bits = [];\n    };\n;\n    g(j.prototype, {\n        set: function(m) {\n            this._bits[m] = 1;\n            return this;\n        },\n        toString: function() {\n            var m = [];\n            for (var n = 0; ((n < this._bits.length)); n++) {\n                m.push(((this._bits[n] ? 1 : 0)));\n            ;\n            };\n        ;\n            return ((m.length ? l(m.join(\"\")) : \"\"));\n        },\n        toCompressedString: function() {\n            if (((this._bits.length === 0))) {\n                return \"\";\n            }\n        ;\n        ;\n            var m = [], n = 1, o = ((this._bits[0] || 0)), p = o.toString(2);\n            for (var q = 1; ((q < this._bits.length)); q++) {\n                var r = ((this._bits[q] || 0));\n                if (((r === o))) {\n                    n++;\n                }\n                 else {\n                    m.push(k(n));\n                    o = r;\n                    n = 1;\n                }\n            ;\n            ;\n            };\n        ;\n            if (n) {\n                m.push(k(n));\n            }\n        ;\n        ;\n            return l(((p + m.join(\"\"))));\n        }\n    });\n    function k(m) {\n        var n = m.toString(2), o = h(\"0\", ((n.length - 1)));\n        return ((o + n));\n    };\n;\n    function l(m) {\n        var n = ((m + \"00000\")).match(/[01]{6}/g), o = \"\";\n        for (var p = 0; ((p < n.length)); p++) {\n            o += i[parseInt(n[p], 2)];\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    e.exports = j;\n});\n__d(\"ServerJS\", [\"BitMap\",\"ErrorUtils\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"BitMap\"), h = b(\"ErrorUtils\"), i = b(\"copyProperties\"), j = b(\"ge\"), k = 0, l = new g();\n    function m() {\n        this._moduleMap = {\n        };\n        this._relativeTo = null;\n        this._moduleIDsToCleanup = {\n        };\n    };\n;\n    m.getLoadedModuleHash = function() {\n        return l.toCompressedString();\n    };\n    i(m.prototype, {\n        handle: function(q) {\n            if (q.__guard) {\n                throw new Error(\"ServerJS.handle called on data that has already been handled\");\n            }\n        ;\n        ;\n            q.__guard = true;\n            n(((q.define || [])), this._handleDefine, this);\n            n(((q.markup || [])), this._handleMarkup, this);\n            n(((q.elements || [])), this._handleElement, this);\n            n(((q.instances || [])), this._handleInstance, this);\n            var r = n(((q.require || [])), this._handleRequire, this);\n            return {\n                cancel: function() {\n                    for (var s = 0; ((s < r.length)); s++) {\n                        if (r[s]) {\n                            r[s].cancel();\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            };\n        },\n        handlePartial: function(q) {\n            ((q.instances || [])).forEach(o.bind(null, this._moduleMap, 3));\n            ((q.markup || [])).forEach(o.bind(null, this._moduleMap, 2));\n            return this.handle(q);\n        },\n        setRelativeTo: function(q) {\n            this._relativeTo = q;\n            return this;\n        },\n        cleanup: function() {\n            var q = [];\n            {\n                var fin22keys = ((window.top.JSBNG_Replay.forInKeys)((this._moduleMap))), fin22i = (0);\n                var r;\n                for (; (fin22i < fin22keys.length); (fin22i++)) {\n                    ((r) = (fin22keys[fin22i]));\n                    {\n                        q.push(r);\n                    ;\n                    };\n                };\n            };\n        ;\n            d.call(null, q, p);\n            this._moduleMap = {\n            };\n            function s(u) {\n                var v = this._moduleIDsToCleanup[u], w = v[0], x = v[1];\n                delete this._moduleIDsToCleanup[u];\n                var y = ((x ? ((((((((\"JS::call(\\\"\" + w)) + \"\\\", \\\"\")) + x)) + \"\\\", ...)\")) : ((((\"JS::requireModule(\\\"\" + w)) + \"\\\")\")))), z = ((y + \" did not fire because it has missing dependencies.\"));\n                throw new Error(z);\n            };\n        ;\n            {\n                var fin23keys = ((window.top.JSBNG_Replay.forInKeys)((this._moduleIDsToCleanup))), fin23i = (0);\n                var t;\n                for (; (fin23i < fin23keys.length); (fin23i++)) {\n                    ((t) = (fin23keys[fin23i]));\n                    {\n                        h.applyWithGuard(s, this, [t,], null, ((((\"ServerJS:cleanup\" + \" id: \")) + t)));\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _handleDefine: function q(r, s, t, u) {\n            if (((u >= 0))) {\n                l.set(u);\n            }\n        ;\n        ;\n            define(r, s, function() {\n                this._replaceTransportMarkers(t);\n                return t;\n            }.bind(this));\n        },\n        _handleRequire: function q(r, s, t, u) {\n            var v = [r,].concat(((t || []))), w = ((((s ? \"__call__\" : \"__requireModule__\")) + k++));\n            this._moduleIDsToCleanup[w] = [r,s,];\n            return define(w, v, function(x) {\n                delete this._moduleIDsToCleanup[w];\n                ((u && this._replaceTransportMarkers(u)));\n                if (s) {\n                    if (!x[s]) {\n                        throw new TypeError(((((((\"Module \" + r)) + \" has no method \")) + s)));\n                    }\n                ;\n                ;\n                    x[s].apply(x, ((u || [])));\n                }\n            ;\n            ;\n            }, 1, this, 1);\n        },\n        _handleInstance: function q(r, s, t, u) {\n            var v = null;\n            if (s) {\n                v = function(w) {\n                    this._replaceTransportMarkers(t);\n                    var x = Object.create(w.prototype);\n                    w.apply(x, t);\n                    return x;\n                }.bind(this);\n            }\n        ;\n        ;\n            define(r, s, v, 0, null, u);\n        },\n        _handleMarkup: function q(r, s, t) {\n            define(r, [\"HTML\",], function(u) {\n                return u.replaceJSONWrapper(s).getRootNode();\n            }, 0, null, t);\n        },\n        _handleElement: function q(r, s, t, u) {\n            var v = [], w = 0;\n            if (u) {\n                v.push(u);\n                w = 1;\n                t++;\n            }\n        ;\n        ;\n            define(r, v, function(x) {\n                var y = j(s, x);\n                if (!y) {\n                    var z = ((\"Could not find element \" + s));\n                    throw new Error(z);\n                }\n            ;\n            ;\n                return y;\n            }, w, null, t);\n        },\n        _replaceTransportMarkers: function(q, r) {\n            var s = ((((typeof r !== \"undefined\")) ? q[r] : q)), t;\n            if (Array.isArray(s)) {\n                for (t = 0; ((t < s.length)); t++) {\n                    this._replaceTransportMarkers(s, t);\n                ;\n                };\n            ;\n            }\n             else if (((s && ((typeof s == \"object\"))))) {\n                if (s.__m) {\n                    q[r] = b.call(null, s.__m);\n                }\n                 else if (s.__e) {\n                    q[r] = j(s.__e);\n                }\n                 else if (s.__rel) {\n                    q[r] = this._relativeTo;\n                }\n                 else {\n                    var fin24keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin24i = (0);\n                    var u;\n                    for (; (fin24i < fin24keys.length); (fin24i++)) {\n                        ((u) = (fin24keys[fin24i]));\n                        {\n                            this._replaceTransportMarkers(s, u);\n                        ;\n                        };\n                    };\n                }\n                \n                \n            ;\n            }\n            \n        ;\n        ;\n        }\n    });\n    function n(q, r, s) {\n        return q.map(function(t) {\n            return h.applyWithGuard(r, s, t, null, ((((((((((\"ServerJS:applyEach\" + \" handle: \")) + ((r.JSBNG__name || \"\\u003Canonymous function\\u003E\")))) + \" args: [\")) + t)) + \"]\")));\n        });\n    };\n;\n    function o(q, r, s) {\n        var t = s[0];\n        if (!((t in q))) {\n            s[r] = ((((s[r] || 0)) + 1));\n        }\n    ;\n    ;\n        q[t] = true;\n    };\n;\n    function p() {\n        return {\n        };\n    };\n;\n    e.exports = m;\n});\n__d(\"invokeCallbacks\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\");\n    function h(i, j) {\n        if (i) {\n            for (var k = 0; ((k < i.length)); k++) {\n                g.applyWithGuard(new Function(i[k]), j);\n            ;\n            };\n        }\n    ;\n    ;\n    };\n;\n    e.exports = h;\n});\n__d(\"ix\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n    };\n    function i(j) {\n        return h[j];\n    };\n;\n    i.add = g.bind(null, h);\n    e.exports = i;\n});\n__d(\"BigPipe\", [\"Arbiter\",\"Bootloader\",\"Env\",\"ErrorUtils\",\"JSCC\",\"OnloadEvent\",\"PageletSet\",\"Run\",\"ServerJS\",\"$\",\"copyProperties\",\"ge\",\"invokeCallbacks\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"Env\"), j = b(\"ErrorUtils\"), k = b(\"JSCC\"), l = b(\"OnloadEvent\"), m = b(\"PageletSet\"), n = b(\"Run\"), o = b(\"ServerJS\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = b(\"invokeCallbacks\"), t = b(\"ix\"), u = ((JSBNG__document.documentMode || +((/MSIE.(\\d+)/.exec(JSBNG__navigator.userAgent) || []))[1])), v = g.BEHAVIOR_STATE, w = g.BEHAVIOR_PERSISTENT;\n    function x(ba) {\n        q(this, {\n            arbiter: g,\n            rootNodeID: \"JSBNG__content\",\n            lid: 0,\n            isAjax: false,\n            domContentCallback: n.__domContentCallback,\n            onloadCallback: n.__onloadCallback,\n            domContentEvt: l.ONLOAD_DOMCONTENT_CALLBACK,\n            onloadEvt: l.ONLOAD_CALLBACK,\n            forceFinish: false,\n            _phaseDoneCallbacks: [],\n            _currentPhase: 0,\n            _lastPhase: -1,\n            _livePagelets: {\n            }\n        });\n        q(this, ba);\n        if (this.automatic) {\n            this._relevant_instance = x._current_instance;\n        }\n         else x._current_instance = this;\n    ;\n    ;\n        this._serverJS = new o();\n        g.inform(\"BigPipe/init\", {\n            lid: this.lid,\n            arbiter: this.arbiter\n        }, w);\n        this.arbiter.registerCallback(this.domContentCallback, [\"pagelet_displayed_all\",]);\n        this._informEventExternal(\"phase_begin\", {\n            phase: 0\n        });\n        this.arbiter.inform(\"phase_begin_0\", true, v);\n        this.onloadCallback = this.arbiter.registerCallback(this.onloadCallback, [\"pagelet_displayed_all\",]);\n        this.arbiter.registerCallback(this._serverJS.cleanup.bind(this._serverJS), [this.onloadEvt,]);\n    };\n;\n    x.getCurrentInstance = function() {\n        return x._current_instance;\n    };\n    q(x.prototype, {\n        onPageletArrive: j.guard(function(ba) {\n            this._informPageletEvent(\"arrive\", ba.id, ba.phase);\n            ba.JSBNG__content = ((ba.JSBNG__content || {\n            }));\n            var ca = ba.phase;\n            if (!this._phaseDoneCallbacks[ca]) {\n                this._phaseDoneCallbacks[ca] = this.arbiter.registerCallback(this._onPhaseDone.bind(this), [((\"phase_complete_\" + ca)),]);\n            }\n        ;\n        ;\n            this.arbiter.registerCallback(this._phaseDoneCallbacks[ca], [((ba.id + \"_displayed\")),]);\n            var da = this._getPageletRootID(ba), ea = m.getOrCreatePagelet(da);\n            if (ba.the_end) {\n                this._lastPhase = ca;\n            }\n        ;\n        ;\n            if (((ba.tti_phase !== undefined))) {\n                this._ttiPhase = ba.tti_phase;\n            }\n        ;\n        ;\n            if (ba.is_second_to_last_phase) {\n                this._secondToLastPhase = ca;\n            }\n        ;\n        ;\n            this._livePagelets[ea.id] = true;\n            ea.addDestructor(function() {\n                delete this._livePagelets[ea.id];\n            }.bind(this));\n            if (ba.jscc_map) {\n                var fa = (eval)(ba.jscc_map), ga = k.init(fa);\n                ea.addDestructor(ga);\n            }\n        ;\n        ;\n            if (ba.resource_map) {\n                h.setResourceMap(ba.resource_map);\n            }\n        ;\n        ;\n            if (ba.bootloadable) {\n                h.enableBootload(ba.bootloadable);\n            }\n        ;\n        ;\n            t.add(ba.ixData);\n            this._informPageletEvent(\"setup\", ba.id);\n            var ha = new g();\n            ha.registerCallback(this._displayPageletHandler.bind(this, ba), [\"preceding_pagelets_displayed\",\"display_resources_downloaded\",]);\n            var ia = ((ba.display_dependency || [])), ja = ia.map(function(la) {\n                return ((la + \"_displayed\"));\n            });\n            this.arbiter.registerCallback(function() {\n                ha.inform(\"preceding_pagelets_displayed\");\n            }, ja);\n            this.arbiter.registerCallback(function() {\n                this._informPageletEvent(\"css\", ba.id);\n                var la = ((ba.css || [])).concat(((ba.displayJS || [])));\n                h.loadResources(la, function() {\n                    this._informPageletEvent(\"css_load\", ba.id);\n                    ha.inform(\"display_resources_downloaded\");\n                }.bind(this), false, ba.id);\n            }.bind(this), [((\"phase_begin_\" + ca)),]);\n            this.arbiter.registerCallback(this.onloadCallback, [\"pagelet_onload\",]);\n            var ka = [((ba.id + \"_displayed\")),];\n            if (!this.jsNonBlock) {\n                ka.push(this.domContentEvt);\n            }\n        ;\n        ;\n            this.arbiter.registerCallback(this._downloadJsForPagelet.bind(this, ba), ka);\n            if (ba.is_last) {\n                this._endPhase(ca);\n            }\n        ;\n        ;\n        }),\n        _beginPhase: function(ba) {\n            this._informEventExternal(\"phase_begin\", {\n                phase: ba\n            });\n            this.arbiter.inform(((\"phase_begin_\" + ba)), true, v);\n        },\n        _endPhase: function(ba) {\n            this.arbiter.inform(((\"phase_complete_\" + ba)), true, v);\n        },\n        _displayPageletHandler: function(ba) {\n            if (this.displayCallback) {\n                this.displayCallback(this._displayPagelet.bind(this, ba));\n            }\n             else this._displayPagelet(ba);\n        ;\n        ;\n        },\n        _displayPagelet: function(ba) {\n            this._informPageletEvent(\"display_start\", ba.id);\n            var ca = this._getPagelet(ba);\n            {\n                var fin25keys = ((window.top.JSBNG_Replay.forInKeys)((ba.JSBNG__content))), fin25i = (0);\n                var da;\n                for (; (fin25i < fin25keys.length); (fin25i++)) {\n                    ((da) = (fin25keys[fin25i]));\n                    {\n                        var ea = ba.JSBNG__content[da];\n                        if (ba.append) {\n                            da = this._getPageletRootID(ba);\n                        }\n                    ;\n                    ;\n                        var fa = r(da);\n                        if (!fa) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((da === ca.id))) {\n                            ca.setRoot(fa);\n                        }\n                    ;\n                    ;\n                        ea = y(ea);\n                        if (ea) {\n                            if (((ba.append || ((u < 8))))) {\n                                if (!ba.append) {\n                                    while (fa.firstChild) {\n                                        fa.removeChild(fa.firstChild);\n                                    ;\n                                    };\n                                }\n                            ;\n                            ;\n                                aa(fa, ea);\n                            }\n                             else fa.innerHTML = ea;\n                        ;\n                        }\n                    ;\n                    ;\n                        var ga = fa.getAttribute(\"data-referrer\");\n                        if (!ga) {\n                            fa.setAttribute(\"data-referrer\", da);\n                        }\n                    ;\n                    ;\n                        if (((ba.cache_hit && i.pc_debug))) {\n                            fa.style.border = \"1px red solid\";\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (ba.jsmods) {\n                var ha = JSON.parse(JSON.stringify(ba.jsmods)), ia = this._serverJS.handlePartial(ha);\n                ca.addDestructor(ia.cancel.bind(ia));\n            }\n        ;\n        ;\n            this._informPageletEvent(\"display\", ba.id);\n            this.arbiter.inform(((ba.id + \"_displayed\")), true, v);\n        },\n        _onPhaseDone: function() {\n            if (((this._currentPhase === this._ttiPhase))) {\n                this._informEventExternal(\"tti_bigpipe\", {\n                    phase: this._ttiPhase\n                });\n            }\n        ;\n        ;\n            if (((((this._currentPhase === this._lastPhase)) && this._isRelevant()))) {\n                this.arbiter.inform(\"pagelet_displayed_all\", true, v);\n            }\n        ;\n        ;\n            this._currentPhase++;\n            if (((u <= 8))) {\n                JSBNG__setTimeout(this._beginPhase.bind(this, this._currentPhase), 20);\n            }\n             else this._beginPhase(this._currentPhase);\n        ;\n        ;\n        },\n        _downloadJsForPagelet: function(ba) {\n            this._informPageletEvent(\"jsstart\", ba.id);\n            h.loadResources(((ba.js || [])), function() {\n                this._informPageletEvent(\"jsdone\", ba.id);\n                ba.requires = ((ba.requires || []));\n                if (((!this.isAjax || ((ba.phase >= 1))))) {\n                    ba.requires.push(\"uipage_onload\");\n                }\n            ;\n            ;\n                var ca = function() {\n                    this._informPageletEvent(\"preonload\", ba.id);\n                    if (this._isRelevantPagelet(ba)) {\n                        s(ba.JSBNG__onload);\n                    }\n                ;\n                ;\n                    this._informPageletEvent(\"JSBNG__onload\", ba.id);\n                    this.arbiter.inform(\"pagelet_onload\", true, g.BEHAVIOR_EVENT);\n                    ((ba.provides && this.arbiter.inform(ba.provides, true, v)));\n                }.bind(this), da = function() {\n                    ((this._isRelevantPagelet(ba) && s(ba.onafterload)));\n                }.bind(this);\n                this.arbiter.registerCallback(ca, ba.requires);\n                this.arbiter.registerCallback(da, [this.onloadEvt,]);\n            }.bind(this), false, ba.id);\n        },\n        _getPagelet: function(ba) {\n            var ca = this._getPageletRootID(ba);\n            return m.getPagelet(ca);\n        },\n        _getPageletRootID: function(ba) {\n            var ca = ba.append;\n            if (ca) {\n                return ((((ca === \"bigpipe_root\")) ? this.rootNodeID : ca));\n            }\n        ;\n        ;\n            return ((Object.keys(ba.JSBNG__content)[0] || null));\n        },\n        _isRelevant: function() {\n            return ((((((((this == x._current_instance)) || ((this.automatic && ((this._relevant_instance == x._current_instance)))))) || this.jsNonBlock)) || this.forceFinish));\n        },\n        _isRelevantPagelet: function(ba) {\n            if (!this._isRelevant()) {\n                return false;\n            }\n        ;\n        ;\n            var ca = this._getPageletRootID(ba);\n            return !!this._livePagelets[ca];\n        },\n        _informEventExternal: function(ba, ca) {\n            ca = ((ca || {\n            }));\n            ca.ts = JSBNG__Date.now();\n            ca.lid = this.lid;\n            this.arbiter.inform(ba, ca, w);\n        },\n        _informPageletEvent: function(ba, ca, da) {\n            var ea = {\n                JSBNG__event: ba,\n                id: ca\n            };\n            if (da) {\n                ea.phase = da;\n            }\n        ;\n        ;\n            this._informEventExternal(\"pagelet_event\", ea);\n        }\n    });\n    function y(ba) {\n        if (((!ba || ((typeof ba === \"string\"))))) {\n            return ba;\n        }\n    ;\n    ;\n        if (ba.container_id) {\n            var ca = p(ba.container_id);\n            ba = ((z(ca) || \"\"));\n            ca.parentNode.removeChild(ca);\n            return ba;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function z(ba) {\n        if (!ba.firstChild) {\n            h.loadModules([\"ErrorSignal\",], function(da) {\n                da.sendErrorSignal(\"bigpipe\", \"Pagelet markup container is empty.\");\n            });\n            return null;\n        }\n    ;\n    ;\n        if (((ba.firstChild.nodeType !== 8))) {\n            return null;\n        }\n    ;\n    ;\n        var ca = ba.firstChild.nodeValue;\n        ca = ca.substring(1, ((ca.length - 1)));\n        return ca.replace(/\\\\([\\s\\S]|$)/g, \"$1\");\n    };\n;\n    function aa(ba, ca) {\n        var da = JSBNG__document.createElement(\"div\"), ea = ((u < 7));\n        if (ea) {\n            ba.appendChild(da);\n        }\n    ;\n    ;\n        da.innerHTML = ca;\n        var fa = JSBNG__document.createDocumentFragment();\n        while (da.firstChild) {\n            fa.appendChild(da.firstChild);\n        ;\n        };\n    ;\n        ba.appendChild(fa);\n        if (ea) {\n            ba.removeChild(da);\n        }\n    ;\n    ;\n    };\n;\n    e.exports = x;\n});\n__d(\"legacy:bootloader\", [\"Bootloader\",], function(a, b, c, d) {\n    a.Bootloader = b(\"Bootloader\");\n}, 3);\n__d(\"Class\", [\"CallbackDependencyManager\",\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackDependencyManager\"), h = b(\"Bootloader\"), i = \"bootload_done\", j = false, k = new g(), l = {\n    }, m = {\n        extend: function(u, v) {\n            if (!j) {\n                h.subscribeToLoadedResources_DEPRECATED(o);\n                j = true;\n            }\n        ;\n        ;\n            if (((typeof v == \"string\"))) {\n                n(u, v);\n            }\n             else p(u, v);\n        ;\n        ;\n        }\n    };\n    function n(u, v) {\n        u.__class_extending = true;\n        var w = k.registerCallback(p.bind(null, u, v), [v,i,]);\n        if (((w !== null))) {\n            l[v] = true;\n        }\n    ;\n    ;\n    };\n;\n    function o() {\n        k.satisfyNonPersistentDependency(i);\n        {\n            var fin26keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin26i = (0);\n            var u;\n            for (; (fin26i < fin26keys.length); (fin26i++)) {\n                ((u) = (fin26keys[fin26i]));\n                {\n                    if (!!a[u]) {\n                        delete l[u];\n                        if (!a[u].__class_extending) {\n                            k.satisfyNonPersistentDependency(u);\n                        }\n                         else a[u].__class_name = u;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function p(u, v) {\n        delete u.__class_extending;\n        v = ((((typeof v == \"string\")) ? a[v] : v));\n        var w = q(v, 0), x = q(u, ((w.prototype.__level + 1)));\n        x.parent = w;\n        if (!!u.__class_name) {\n            k.satisfyNonPersistentDependency(u.__class_name);\n        }\n    ;\n    ;\n    };\n;\n    function q(u, v) {\n        if (u._metaprototype) {\n            return u._metaprototype;\n        }\n    ;\n    ;\n        var w = new Function();\n        w.construct = r;\n        w.prototype.construct = t(u, v, true);\n        w.prototype.__level = v;\n        w.base = u;\n        u.prototype.parent = w;\n        u._metaprototype = w;\n        return w;\n    };\n;\n    function r(u) {\n        s(u.parent);\n        var v = [], w = u;\n        while (w.parent) {\n            var x = new w.parent();\n            v.push(x);\n            x.__instance = u;\n            w = w.parent;\n        };\n    ;\n        u.parent = v[1];\n        v.reverse();\n        v.pop();\n        u.__parents = v;\n        u.__instance = u;\n        return u.parent.construct.apply(u.parent, arguments);\n    };\n;\n    function s(u) {\n        if (u.initialized) {\n            return;\n        }\n    ;\n    ;\n        var v = u.base.prototype;\n        if (u.parent) {\n            s(u.parent);\n            var w = u.parent.prototype;\n            {\n                var fin27keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin27i = (0);\n                var x;\n                for (; (fin27i < fin27keys.length); (fin27i++)) {\n                    ((x) = (fin27keys[fin27i]));\n                    {\n                        if (((((((x != \"__level\")) && ((x != \"construct\")))) && ((v[x] === undefined))))) {\n                            v[x] = u.prototype[x] = w[x];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        u.initialized = true;\n        var y = u.prototype.__level;\n        {\n            var fin28keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin28i = (0);\n            var x;\n            for (; (fin28i < fin28keys.length); (fin28i++)) {\n                ((x) = (fin28keys[fin28i]));\n                {\n                    if (((x != \"parent\"))) {\n                        v[x] = u.prototype[x] = t(v[x], y);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function t(u, v, w) {\n        if (((((typeof u != \"function\")) || u.__prototyped))) {\n            return u;\n        }\n    ;\n    ;\n        var x = function() {\n            var y = this.__instance;\n            if (y) {\n                var z = y.parent;\n                y.parent = ((v ? y.__parents[((v - 1))] : null));\n                var aa = arguments;\n                if (w) {\n                    aa = [];\n                    for (var ba = 1; ((ba < arguments.length)); ba++) {\n                        aa.push(arguments[ba]);\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                var ca = u.apply(y, aa);\n                y.parent = z;\n                return ca;\n            }\n             else return u.apply(this, arguments)\n        ;\n        };\n        x.__prototyped = true;\n        return x;\n    };\n;\n    e.exports = m;\n});\n__d(\"legacy:Class\", [\"Class\",], function(a, b, c, d) {\n    a.Class = b(\"Class\");\n}, 3);\n__d(\"legacy:constructor-cache\", [\"JSCC\",], function(a, b, c, d) {\n    a.JSCC = b(\"JSCC\");\n}, 3);\n__d(\"function-extensions\", [\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\");\n    Function.prototype.curry = function() {\n        var h = g(arguments);\n        return this.bind.apply(this, [null,].concat(h));\n    };\n    Function.prototype.defer = function(h, i) {\n        if (((typeof this != \"function\"))) {\n            throw new TypeError();\n        }\n    ;\n    ;\n        h = ((h || 0));\n        return JSBNG__setTimeout(this, h, i);\n    };\n}, 3);\n__d(\"goURI\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        h = h.toString();\n        if (((((!i && a.PageTransitions)) && PageTransitions.isInitialized()))) {\n            PageTransitions.go(h, j);\n        }\n         else if (((window.JSBNG__location.href == h))) {\n            window.JSBNG__location.reload();\n        }\n         else window.JSBNG__location.href = h;\n        \n    ;\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"legacy:goURI\", [\"goURI\",], function(a, b, c, d) {\n    a.goURI = b(\"goURI\");\n}, 3);\n__d(\"InitialJSLoader\", [\"Arbiter\",\"Bootloader\",\"OnloadEvent\",\"Run\",\"ServerJS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"OnloadEvent\"), j = b(\"Run\"), k = b(\"ServerJS\"), l = {\n        INITIAL_JS_READY: \"BOOTLOAD/JSREADY\",\n        loadOnDOMContentReady: function(m, n) {\n            g.subscribe(i.ONLOAD_DOMCONTENT_CALLBACK, function() {\n                function o() {\n                    h.loadResources(m, function() {\n                        g.inform(l.INITIAL_JS_READY, true, g.BEHAVIOR_STATE);\n                    });\n                };\n            ;\n                if (n) {\n                    JSBNG__setTimeout(o, n);\n                }\n                 else o();\n            ;\n            ;\n            });\n        },\n        handleServerJS: function(m) {\n            var n = new k();\n            n.handle(m);\n            j.onAfterLoad(n.cleanup.bind(n));\n        }\n    };\n    e.exports = l;\n});\n__d(\"lowerDomain\", [], function(a, b, c, d, e, f) {\n    if (JSBNG__document.domain.toLowerCase().match(/(^|\\.)facebook\\..*/)) {\n        JSBNG__document.domain = \"facebook.com\";\n    }\n;\n;\n});\n__d(\"legacy:object-core-utils\", [\"isEmpty\",\"copyProperties\",], function(a, b, c, d) {\n    a.is_empty = b(\"isEmpty\");\n    a.copyProperties = b(\"copyProperties\");\n}, 3);\n__d(\"PlaceholderListener\", [\"Arbiter\",\"JSBNG__CSS\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"Parent\");\n    function j(o, p) {\n        if (p.getAttribute(\"data-silentPlaceholderListener\")) {\n            return;\n        }\n    ;\n    ;\n        var q = p.getAttribute(\"placeholder\");\n        if (q) {\n            var r = i.byClass(p, \"focus_target\");\n            if (((((\"JSBNG__focus\" == o)) || ((\"focusin\" == o))))) {\n                var s = p.value.replace(/\\r\\n/g, \"\\u000a\"), t = q.replace(/\\r\\n/g, \"\\u000a\");\n                if (((((s == t)) && h.hasClass(p, \"DOMControl_placeholder\")))) {\n                    p.value = \"\";\n                    h.removeClass(p, \"DOMControl_placeholder\");\n                }\n            ;\n            ;\n                if (r) {\n                    n.expandInput(r);\n                }\n            ;\n            ;\n            }\n             else {\n                if (((p.value === \"\"))) {\n                    h.addClass(p, \"DOMControl_placeholder\");\n                    p.value = q;\n                    ((r && h.removeClass(r, \"child_is_active\")));\n                    p.style.direction = \"\";\n                }\n            ;\n            ;\n                ((r && h.removeClass(r, \"child_is_focused\")));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    try {\n        if (JSBNG__document.activeElement) {\n            j(\"JSBNG__focus\", JSBNG__document.activeElement);\n        }\n    ;\n    ;\n    } catch (k) {\n    \n    };\n;\n    function l(JSBNG__event) {\n        JSBNG__event = ((JSBNG__event || window.JSBNG__event));\n        j(JSBNG__event.type, ((JSBNG__event.target || JSBNG__event.srcElement)));\n    };\n;\n    var m = JSBNG__document.documentElement;\n    if (m.JSBNG__addEventListener) {\n        m.JSBNG__addEventListener(\"JSBNG__focus\", l, true);\n        m.JSBNG__addEventListener(\"JSBNG__blur\", l, true);\n    }\n     else {\n        m.JSBNG__attachEvent(\"JSBNG__onfocusin\", l);\n        m.JSBNG__attachEvent(\"JSBNG__onfocusout\", l);\n    }\n;\n;\n    var n = {\n        expandInput: function(o) {\n            h.addClass(o, \"child_is_active\");\n            h.addClass(o, \"child_is_focused\");\n            h.addClass(o, \"child_was_focused\");\n            g.inform(\"reflow\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"clickRefAction\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    function h(l, m, n, o, p) {\n        var q = ((((l + \"/\")) + m));\n        this.ue = q;\n        this._ue_ts = l;\n        this._ue_count = m;\n        this._context = n;\n        this._ns = null;\n        this._node = o;\n        this._type = p;\n    };\n;\n    h.prototype.set_namespace = function(l) {\n        this._ns = l;\n        return this;\n    };\n    h.prototype.coalesce_namespace = function(l) {\n        if (((this._ns === null))) {\n            this._ns = l;\n        }\n    ;\n    ;\n        return this;\n    };\n    h.prototype.add_event = function() {\n        return this;\n    };\n    var i = 0, j = [];\n    function k(l, m, JSBNG__event, n, o) {\n        var p = JSBNG__Date.now(), q = ((JSBNG__event && JSBNG__event.type));\n        o = ((o || {\n        }));\n        if (((!m && JSBNG__event))) {\n            m = JSBNG__event.getTarget();\n        }\n    ;\n    ;\n        var r = 50;\n        if (((m && ((n != \"FORCE\"))))) {\n            for (var s = ((j.length - 1)); ((((s >= 0)) && ((((p - j[s]._ue_ts)) < r)))); --s) {\n                if (((((j[s]._node == m)) && ((j[s]._type == q))))) {\n                    return j[s];\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        var t = new h(p, i, l, m, q);\n        j.push(t);\n        while (((j.length > 10))) {\n            j.shift();\n        ;\n        };\n    ;\n        g.inform(\"ClickRefAction/new\", {\n            cfa: t,\n            node: m,\n            mode: n,\n            JSBNG__event: JSBNG__event,\n            extra_data: o\n        }, g.BEHAVIOR_PERSISTENT);\n        i++;\n        return t;\n    };\n;\n    e.exports = a.clickRefAction = k;\n});\n__d(\"trackReferrer\", [\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Parent\");\n    function h(i, j) {\n        i = g.byAttribute(i, \"data-referrer\");\n        if (i) {\n            var k = ((/^(?:(?:[^:\\/?#]+):)?(?:\\/\\/(?:[^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/.exec(j)[1] || \"\"));\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            var l = ((((k + \"|\")) + i.getAttribute(\"data-referrer\"))), m = new JSBNG__Date();\n            m.setTime(((JSBNG__Date.now() + 1000)));\n            JSBNG__document.cookie = ((((((((((((\"x-src=\" + encodeURIComponent(l))) + \"; \")) + \"expires=\")) + m.toGMTString())) + \";path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        }\n    ;\n    ;\n        return i;\n    };\n;\n    e.exports = h;\n});\n__d(\"Miny\", [], function(a, b, c, d, e, f) {\n    var g = \"Miny1\", h = {\n        encode: [],\n        decode: {\n        }\n    }, i = \"wxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_\".split(\"\");\n    function j(n) {\n        for (var o = h.encode.length; ((o < n)); o++) {\n            var p = o.toString(32).split(\"\");\n            p[((p.length - 1))] = i[parseInt(p[((p.length - 1))], 32)];\n            p = p.join(\"\");\n            h.encode[o] = p;\n            h.decode[p] = o;\n        };\n    ;\n        return h;\n    };\n;\n    function k(n) {\n        var o = n.match(/\\w+|\\W+/g), p = {\n        };\n        for (var q = 0; ((q < o.length)); q++) {\n            p[o[q]] = ((((p[o[q]] || 0)) + 1));\n        ;\n        };\n    ;\n        var r = Object.keys(p);\n        r.sort(function(u, v) {\n            return ((((p[u] < p[v])) ? 1 : ((((p[v] < p[u])) ? -1 : 0))));\n        });\n        var s = j(r.length).encode;\n        for (q = 0; ((q < r.length)); q++) {\n            p[r[q]] = s[q];\n        ;\n        };\n    ;\n        var t = [];\n        for (q = 0; ((q < o.length)); q++) {\n            t[q] = p[o[q]];\n        ;\n        };\n    ;\n        for (q = 0; ((q < r.length)); q++) {\n            r[q] = r[q].replace(/'~'/g, \"\\\\~\");\n        ;\n        };\n    ;\n        return [g,r.length,].concat(r).concat(t.join(\"\")).join(\"~\");\n    };\n;\n    function l(n) {\n        var o = n.split(\"~\");\n        if (((o.shift() != g))) {\n            throw new Error(\"Not a Miny stream\");\n        }\n    ;\n    ;\n        var p = parseInt(o.shift(), 10), q = o.pop();\n        q = q.match(/[0-9a-v]*[\\-w-zA-Z_]/g);\n        var r = o, s = j(p).decode, t = [];\n        for (var u = 0; ((u < q.length)); u++) {\n            t[u] = r[s[q[u]]];\n        ;\n        };\n    ;\n        return t.join(\"\");\n    };\n;\n    var m = {\n        encode: k,\n        decode: l\n    };\n    e.exports = m;\n});\n__d(\"QueryString\", [], function(a, b, c, d, e, f) {\n    function g(k) {\n        var l = [];\n        Object.keys(k).forEach(function(m) {\n            var n = k[m];\n            if (((typeof n === \"undefined\"))) {\n                return;\n            }\n        ;\n        ;\n            if (((n === null))) {\n                l.push(m);\n                return;\n            }\n        ;\n        ;\n            l.push(((((encodeURIComponent(m) + \"=\")) + encodeURIComponent(n))));\n        });\n        return l.join(\"&\");\n    };\n;\n    function h(k, l) {\n        var m = {\n        };\n        if (((k === \"\"))) {\n            return m;\n        }\n    ;\n    ;\n        var n = k.split(\"&\");\n        for (var o = 0; ((o < n.length)); o++) {\n            var p = n[o].split(\"=\", 2), q = decodeURIComponent(p[0]);\n            if (((l && m.hasOwnProperty(q)))) {\n                throw new URIError(((\"Duplicate key: \" + q)));\n            }\n        ;\n        ;\n            m[q] = ((((p.length === 2)) ? decodeURIComponent(p[1]) : null));\n        };\n    ;\n        return m;\n    };\n;\n    function i(k, l) {\n        return ((((k + ((~k.indexOf(\"?\") ? \"&\" : \"?\")))) + ((((typeof l === \"string\")) ? l : j.encode(l)))));\n    };\n;\n    var j = {\n        encode: g,\n        decode: h,\n        appendToUrl: i\n    };\n    e.exports = j;\n});\n__d(\"UserAgent\", [], function(a, b, c, d, e, f) {\n    var g = false, h, i, j, k, l, m, n, o, p, q, r, s, t, u;\n    function v() {\n        if (g) {\n            return;\n        }\n    ;\n    ;\n        g = true;\n        var x = JSBNG__navigator.userAgent, y = /(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))/.exec(x), z = /(Mac OS X)|(Windows)|(Linux)/.exec(x);\n        r = /\\b(iPhone|iP[ao]d)/.exec(x);\n        s = /\\b(iP[ao]d)/.exec(x);\n        p = /Android/i.exec(x);\n        t = /FBAN\\/\\w+;/i.exec(x);\n        u = /Mobile/i.exec(x);\n        q = !!(/Win64/.exec(x));\n        if (y) {\n            h = ((y[1] ? parseFloat(y[1]) : NaN));\n            if (((h && JSBNG__document.documentMode))) {\n                h = JSBNG__document.documentMode;\n            }\n        ;\n        ;\n            i = ((y[2] ? parseFloat(y[2]) : NaN));\n            j = ((y[3] ? parseFloat(y[3]) : NaN));\n            k = ((y[4] ? parseFloat(y[4]) : NaN));\n            if (k) {\n                y = /(?:Chrome\\/(\\d+\\.\\d+))/.exec(x);\n                l = ((((y && y[1])) ? parseFloat(y[1]) : NaN));\n            }\n             else l = NaN;\n        ;\n        ;\n        }\n         else h = i = j = l = k = NaN;\n    ;\n    ;\n        if (z) {\n            if (z[1]) {\n                var aa = /(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(x);\n                m = ((aa ? parseFloat(aa[1].replace(\"_\", \".\")) : true));\n            }\n             else m = false;\n        ;\n        ;\n            n = !!z[2];\n            o = !!z[3];\n        }\n         else m = n = o = false;\n    ;\n    ;\n    };\n;\n    var w = {\n        ie: function() {\n            return ((v() || h));\n        },\n        ie64: function() {\n            return ((w.ie() && q));\n        },\n        firefox: function() {\n            return ((v() || i));\n        },\n        JSBNG__opera: function() {\n            return ((v() || j));\n        },\n        webkit: function() {\n            return ((v() || k));\n        },\n        safari: function() {\n            return w.webkit();\n        },\n        chrome: function() {\n            return ((v() || l));\n        },\n        windows: function() {\n            return ((v() || n));\n        },\n        osx: function() {\n            return ((v() || m));\n        },\n        linux: function() {\n            return ((v() || o));\n        },\n        iphone: function() {\n            return ((v() || r));\n        },\n        mobile: function() {\n            return ((v() || ((((((r || s)) || p)) || u))));\n        },\n        nativeApp: function() {\n            return ((v() || t));\n        },\n        android: function() {\n            return ((v() || p));\n        },\n        ipad: function() {\n            return ((v() || s));\n        }\n    };\n    e.exports = w;\n});\n__d(\"XHR\", [\"Env\",\"ServerJS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ServerJS\"), i = 1, j = {\n        create: function() {\n            try {\n                return ((a.JSBNG__XMLHttpRequest ? new a.JSBNG__XMLHttpRequest() : new ActiveXObject(\"MSXML2.XMLHTTP.3.0\")));\n            } catch (k) {\n            \n            };\n        ;\n        },\n        getAsyncParams: function(k) {\n            var l = {\n                __user: g.user,\n                __a: 1,\n                __dyn: h.getLoadedModuleHash(),\n                __req: (i++).toString(36)\n            };\n            if (((((k == \"POST\")) && g.fb_dtsg))) {\n                l.fb_dtsg = g.fb_dtsg;\n            }\n        ;\n        ;\n            if (g.fb_isb) {\n                l.fb_isb = g.fb_isb;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"BanzaiAdapter\", [\"Arbiter\",\"Env\",\"Miny\",\"QueryString\",\"Run\",\"UserAgent\",\"XHR\",\"BanzaiConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"Miny\"), j = b(\"QueryString\"), k = b(\"Run\"), l = b(\"UserAgent\"), m = b(\"XHR\"), n = null, o = new g(), p = b(\"BanzaiConfig\"), q = \"/ajax/bz\", r = {\n    }, s = r.adapter = {\n        config: p,\n        getUserID: function() {\n            return h.user;\n        },\n        inform: function(t) {\n            o.inform(t);\n        },\n        subscribe: function(t, u) {\n            o.subscribe(t, u);\n        },\n        cleanup: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_404), function() {\n            if (((n && ((n.readyState < 4))))) {\n                n.abort();\n            }\n        ;\n        ;\n            if (n) {\n                delete n.JSBNG__onreadystatechange;\n                n = null;\n            }\n        ;\n        ;\n        })),\n        readyToSend: function() {\n            var t = ((((l.ie() <= 8)) ? true : JSBNG__navigator.onLine));\n            return ((!n && t));\n        },\n        send: function(t, u, v) {\n            var w = \"POST\";\n            n = m.create();\n            n.open(w, q, true);\n            n.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            n.JSBNG__onreadystatechange = function() {\n                if (((n.readyState >= 4))) {\n                    var aa = n.JSBNG__status;\n                    s.cleanup();\n                    if (((aa == 200))) {\n                        if (u) {\n                            u();\n                        }\n                    ;\n                    ;\n                        s.inform(r.OK);\n                    }\n                     else {\n                        if (v) {\n                            v(aa);\n                        }\n                    ;\n                    ;\n                        s.inform(r.ERROR);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            JSBNG__setTimeout(s.cleanup, r.SEND_TIMEOUT, false);\n            var x = m.getAsyncParams(w);\n            x.q = JSON.stringify(t);\n            x.ts = JSBNG__Date.now();\n            x.ph = h.push_phase;\n            if (r.FBTRACE) {\n                x.fbtrace = r.FBTRACE;\n            }\n        ;\n        ;\n            if (r.isEnabled(\"miny_compression\")) {\n                var y = JSBNG__Date.now(), z = i.encode(x.q);\n                if (((z.length < x.q.length))) {\n                    x.q = z;\n                    x.miny_encode_ms = ((JSBNG__Date.now() - y));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            n.send(j.encode(x));\n        },\n        onUnload: function(t) {\n            k.onAfterUnload(t);\n        }\n    };\n    e.exports = r;\n});\n__d(\"pageID\", [], function(a, b, c, d, e, f) {\n    e.exports = Math.floor(((2147483648 * Math.JSBNG__random()))).toString(36);\n});\n__d(\"Banzai\", [\"BanzaiAdapter\",\"pageID\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiAdapter\"), h = g.adapter, i = b(\"pageID\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = \"Banzai\", m = \"sequencer\", n, o, p, q = [], r = {\n    }, s = ((a != a.JSBNG__top));\n    function t() {\n        if (((p && ((p.posts.length > 0))))) {\n            q.push(p);\n        }\n    ;\n    ;\n        p = {\n            user: h.getUserID(),\n            page_id: i,\n            trigger: null,\n            time: JSBNG__Date.now(),\n            posts: []\n        };\n        if (g.isEnabled(m)) {\n            p.sequence = [];\n        }\n    ;\n    ;\n    };\n;\n    function u(z) {\n        var aa = ((JSBNG__Date.now() + z));\n        if (((!o || ((aa < o))))) {\n            o = aa;\n            JSBNG__clearTimeout(n);\n            n = JSBNG__setTimeout(v, z, false);\n            return true;\n        }\n    ;\n    ;\n    };\n;\n    {\n        function v() {\n            o = null;\n            u(g.BASIC.delay);\n            if (!h.readyToSend()) {\n                return;\n            }\n        ;\n        ;\n            h.inform(g.SEND);\n            if (((((q.length <= 0)) && ((p.posts.length <= 0))))) {\n                h.inform(g.OK);\n                return;\n            }\n        ;\n        ;\n            t();\n            var z = q;\n            q = [];\n            h.send(z, null, function(aa) {\n                var ba = ((JSBNG__Date.now() - ((h.config.EXPIRY || g.EXPIRY)))), ca = ((((aa >= 400)) && ((aa < 600)))), da = z.map(function(ea) {\n                    ea.posts = ea.posts.filter(function(fa) {\n                        var ga = ((ca || fa.__meta.options.retry));\n                        fa.__meta.retryCount = ((((fa.__meta.retryCount || 0)) + 1));\n                        fa[3] = fa.__meta.retryCount;\n                        return ((ga && ((fa.__meta.timestamp > ba))));\n                    });\n                    return ea;\n                });\n                da = da.filter(function(ea) {\n                    return ((ea.posts.length > 0));\n                });\n                q = da.concat(q);\n            });\n        };\n        ((window.top.JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_413.push)((v)));\n    };\n;\n    var w, x;\n    try {\n        x = a.JSBNG__sessionStorage;\n    } catch (y) {\n    \n    };\n;\n    if (((x && !s))) {\n        w = {\n            store: function z() {\n                try {\n                    t();\n                    var ba = h.getUserID(), ca = q.filter(function(ea) {\n                        return ((ea.user == ba));\n                    }).map(function(ea) {\n                        ea = j({\n                        }, ea);\n                        ea.posts = ea.posts.map(function(fa) {\n                            return [fa[0],fa[1],fa[2],fa.__meta,];\n                        });\n                        return ea;\n                    }), da = JSON.stringify(ca);\n                    x.setItem(l, da);\n                } catch (aa) {\n                \n                };\n            ;\n            },\n            restore: function z() {\n                try {\n                    var ba = x.getItem(l);\n                    if (ba) {\n                        x.removeItem(l);\n                        var ca = h.getUserID(), da = JSON.parse(ba);\n                        da = da.filter(function(ea) {\n                            ea.posts.forEach(function(fa) {\n                                fa.__meta = fa.pop();\n                                if (((\"retryCount\" in fa.__meta))) {\n                                    fa[3] = fa.__meta.retryCount;\n                                }\n                            ;\n                            ;\n                            });\n                            return ((ea.user == ca));\n                        });\n                        q = q.concat(da);\n                    }\n                ;\n                ;\n                } catch (aa) {\n                \n                };\n            ;\n            }\n        };\n    }\n     else w = {\n        store: k,\n        restore: k\n    };\n;\n;\n    g.SEND = \"Banzai:SEND\";\n    g.OK = \"Banzai:OK\";\n    g.ERROR = \"Banzai:ERROR\";\n    g.SHUTDOWN = \"Banzai:SHUTDOWN\";\n    g.SEND_TIMEOUT = 15000;\n    g.VITAL_WAIT = 1000;\n    g.BASIC_WAIT = 60000;\n    g.EXPIRY = ((30 * 60000));\n    g.VITAL = {\n        delay: ((h.config.MIN_WAIT || g.VITAL_WAIT))\n    };\n    g.BASIC = {\n        delay: ((h.config.MAX_WAIT || g.BASIC_WAIT))\n    };\n    g.FBTRACE = h.config.fbtrace, g.isEnabled = function(z) {\n        return ((h.config.gks && h.config.gks[z]));\n    };\n    g.post = function(z, aa, ba) {\n        ba = ((ba || {\n        }));\n        if (s) {\n            if (((JSBNG__document.domain == \"facebook.com\"))) {\n                try {\n                    var da = a.JSBNG__top.require(\"Banzai\");\n                    da.post.apply(da, arguments);\n                } catch (ca) {\n                \n                };\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        if (h.config.disabled) {\n            return;\n        }\n    ;\n    ;\n        var ea = h.config.blacklist;\n        if (ea) {\n            if (((((ea && ea.join)) && !ea._regex))) {\n                ea._regex = new RegExp(((((\"^(?:\" + ea.join(\"|\"))) + \")\")));\n            }\n        ;\n        ;\n            if (((ea._regex && ea._regex.test(z)))) {\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((p.user != h.getUserID()))) {\n            t();\n        }\n    ;\n    ;\n        var fa = JSBNG__Date.now(), ga = [z,aa,((fa - p.time)),];\n        ga.__meta = {\n            options: ba,\n            timestamp: fa\n        };\n        p.posts.push(ga);\n        var ha = ba.delay;\n        if (((ha == null))) {\n            ha = g.BASIC_WAIT;\n        }\n    ;\n    ;\n        if (g.isEnabled(m)) {\n            if (!((z in r))) {\n                r[z] = 0;\n            }\n             else r[z]++;\n        ;\n        ;\n            p.sequence.push([z,r[z],]);\n        }\n    ;\n    ;\n        if (((u(ha) || !p.trigger))) {\n            p.trigger = z;\n        }\n    ;\n    ;\n    };\n    g.subscribe = h.subscribe;\n    g._testState = function() {\n        return {\n            wad: p,\n            wads: q\n        };\n    };\n    h.onUnload(function() {\n        h.cleanup();\n        h.inform(g.SHUTDOWN);\n        w.store();\n    });\n    t();\n    w.restore();\n    u(g.BASIC.delay);\n    e.exports = g;\n});\n__d(\"userAction\", [\"Arbiter\",\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"copyProperties\"), j = 50, k = [], l = {\n    }, m = {\n    };\n    function n(v, w, x, y, JSBNG__event) {\n        var z = ((((v + \"/\")) + w)), aa = u(y);\n        i(this, {\n            ue: z,\n            _uai_logged: false,\n            _uai_timeout: null,\n            _primary: {\n            },\n            _fallback: {\n            },\n            _default_ua_id: ((aa || \"-\")),\n            _default_action_type: ((JSBNG__event ? JSBNG__event.type : \"-\")),\n            _ts: v,\n            _ns: x,\n            _start_ts: v,\n            _prev_event: \"s\",\n            _ue_ts: v,\n            _ue_count: w,\n            _data_version: 1,\n            _event_version: 2,\n            _info_version: 2\n        });\n        this._log(\"ua:n\", [1,z,]);\n    };\n;\n    function o(v, w, x, y) {\n        var z = ((((v in m)) ? m[v] : {\n        })), aa = ((((w in z)) ? z[w] : {\n        })), ba;\n        if (((x in aa))) {\n            if (((\"*\" in aa[x]))) {\n                ba = aa[x][\"*\"];\n            }\n             else if (((y in aa[x]))) {\n                ba = aa[x][y];\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var p = {\n        store: true,\n        delay: 3000,\n        retry: true\n    };\n    i(n.prototype, {\n        _log: function(v, w) {\n            var x = ((l[v] === true)), y = o(v, this._ns, \"ua_id\", this._get_ua_id()), z = o(v, this._ns, \"action\", this._get_action_type()), aa = ((((y !== undefined)) || ((z !== undefined)))), ba = ((aa ? ((y || z)) : x));\n            if (((h.isEnabled(\"useraction\") && ba))) {\n                h.post(v, w, p);\n            }\n        ;\n        ;\n        },\n        _get_action_type: function() {\n            return ((((this._primary._action_type || this._fallback._action_type)) || this._default_action_type));\n        },\n        _get_ua_id: function() {\n            return ((((this._primary._ua_id || this._fallback._ua_id)) || this._default_ua_id));\n        },\n        _log_uai: function() {\n            var v = [this._info_version,this.ue,this._ns,this._get_ua_id(),this._get_action_type(),];\n            this._log(\"ua:i\", v);\n            this._uai_logged = true;\n            this._uai_timeout = null;\n        },\n        uai: function(v, w, x) {\n            if (!this._uai_logged) {\n                ((this._uai_timeout && JSBNG__clearTimeout(this._uai_timeout)));\n                this._primary._ua_id = w;\n                this._primary._action_type = v;\n                if (((x === undefined))) {\n                    this._log_uai();\n                }\n                 else if (((x === false))) {\n                    this._uai_logged = true;\n                }\n                 else {\n                    var y = this;\n                    x = ((x || 0));\n                    this._uai_timeout = JSBNG__setTimeout(function() {\n                        y._log_uai.apply(y);\n                    }, x);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        uai_fallback: function(v, w, x) {\n            if (!this._uai_logged) {\n                var y = this;\n                ((this._uai_timeout && JSBNG__clearTimeout(this._uai_timeout)));\n                this._fallback._ua_id = w;\n                this._fallback._action_type = v;\n                x = ((((x === undefined)) ? j : x));\n                this._uai_timeout = JSBNG__setTimeout(function() {\n                    y._log_uai.apply(y);\n                }, x);\n            }\n        ;\n        ;\n            return this;\n        },\n        add_event: function(v, w, x) {\n            w = ((w || 0));\n            var y = ((JSBNG__Date.now() - w)), z = ((y - this._ts)), aa = ((y - ((x ? x : this._ue_ts)))), ba = [this._event_version,this.ue,this._ns,this._get_ua_id(),this._prev_event,v,z,aa,];\n            if (this._get_ua_id()) {\n                this._log(\"ua:e\", ba);\n                this._ts = y;\n                this._prev_event = v;\n            }\n        ;\n        ;\n            return this;\n        },\n        add_data: function(v) {\n            var w = [this._data_version,this.ue,v,];\n            this._log(\"ua:d\", w);\n            return this;\n        }\n    });\n    var q = 0, r = 0, s = null;\n    function t(v, w, JSBNG__event, x) {\n        x = ((x || {\n        }));\n        var y = JSBNG__Date.now();\n        if (((!w && JSBNG__event))) {\n            w = JSBNG__event.getTarget();\n        }\n    ;\n    ;\n        if (((w && s))) {\n            if (((((((((y - r)) < j)) && ((w == s)))) && ((x.mode == \"DEDUP\"))))) {\n                return k[((k.length - 1))];\n            }\n        ;\n        }\n    ;\n    ;\n        var z = new n(y, q, v, w, JSBNG__event);\n        s = w;\n        k.push(z);\n        while (((k.length > 10))) {\n            k.shift();\n        ;\n        };\n    ;\n        g.inform(\"UserAction/new\", {\n            ua: z,\n            node: w,\n            mode: x.mode,\n            JSBNG__event: JSBNG__event\n        });\n        r = y;\n        q++;\n        return z;\n    };\n;\n    function u(v) {\n        if (((!v || !v.nodeName))) {\n            return null;\n        }\n    ;\n    ;\n        return v.nodeName.toLowerCase();\n    };\n;\n    t.setUATypeConfig = function(v) {\n        i(l, v);\n    };\n    t.setCustomSampleConfig = function(v) {\n        i(m, v);\n    };\n    t.getCurrentUECount = function() {\n        return q;\n    };\n    e.exports = a.userAction = t;\n});\n__d(\"Primer\", [\"function-extensions\",\"Bootloader\",\"JSBNG__CSS\",\"ErrorUtils\",\"Parent\",\"clickRefAction\",\"trackReferrer\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__CSS\"), i = b(\"ErrorUtils\"), j = b(\"Parent\"), k = b(\"clickRefAction\"), l = b(\"trackReferrer\"), m = b(\"userAction\"), n = null, o = /async(?:-post)?|dialog(?:-post)?|theater|toggle/, p = JSBNG__document.documentElement;\n    function q(t, u) {\n        t = j.byAttribute(t, u);\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        do {\n            var v = t.getAttribute(u);\n            JSON.parse(v).forEach(function(w) {\n                var x = t;\n                g.loadModules.call(g, [w[0],], function(y) {\n                    y[w[1]](x);\n                });\n            });\n        } while (t = j.byAttribute(t.parentNode, u));\n        return false;\n    };\n;\n    p.JSBNG__onclick = i.guard(function(t) {\n        t = ((t || window.JSBNG__event));\n        n = ((t.target || t.srcElement));\n        var u = q(n, \"data-onclick\"), v = j.byTag(n, \"A\");\n        if (!v) {\n            return u;\n        }\n    ;\n    ;\n        var w = v.getAttribute(\"ajaxify\"), x = v.href, y = ((w || x));\n        if (y) {\n            k(\"a\", v, t).coalesce_namespace(\"primer\");\n            var z = m(\"primer\", v, t, {\n                mode: \"DEDUP\"\n            }).uai_fallback(\"click\");\n            if (a.ArbiterMonitor) {\n                a.ArbiterMonitor.initUA(z, [v,]);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((((w && x)) && !(/#$/).test(x)))) {\n            var aa = ((t.which && ((t.which === 2)))), ba = ((((((t.altKey || t.ctrlKey)) || t.metaKey)) || t.shiftKey));\n            if (((aa || ba))) {\n                return;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        l(v, y);\n        var ca = ((v.rel && v.rel.match(o)));\n        ca = ((ca && ca[0]));\n        switch (ca) {\n          case \"dialog\":\n        \n          case \"dialog-post\":\n            g.loadModules([\"AsyncDialog\",], function(da) {\n                da.bootstrap(y, v, ca);\n            });\n            break;\n          case \"async\":\n        \n          case \"async-post\":\n            g.loadModules([\"AsyncRequest\",], function(da) {\n                da.bootstrap(y, v);\n            });\n            break;\n          case \"theater\":\n            g.loadModules([\"PhotoSnowlift\",], function(da) {\n                da.bootstrap(y, v);\n            });\n            break;\n          case \"toggle\":\n            h.toggleClass(v.parentNode, \"openToggler\");\n            g.loadModules([\"Toggler\",], function(da) {\n                da.bootstrap(v);\n            });\n            break;\n          default:\n            return u;\n        };\n    ;\n        return false;\n    });\n    p.JSBNG__onsubmit = i.guard(function(t) {\n        t = ((t || window.JSBNG__event));\n        var u = ((t.target || t.srcElement));\n        if (((((u && ((u.nodeName == \"FORM\")))) && ((u.getAttribute(\"rel\") == \"async\"))))) {\n            k(\"f\", u, t).coalesce_namespace(\"primer\");\n            var v = m(\"primer\", u, t, {\n                mode: \"DEDUP\"\n            }).uai_fallback(\"submit\");\n            if (a.ArbiterMonitor) {\n                a.ArbiterMonitor.initUA(v, [u,]);\n            }\n        ;\n        ;\n            var w = n;\n            g.loadModules([\"Form\",], function(x) {\n                x.bootstrap(u, w);\n            });\n            return false;\n        }\n    ;\n    ;\n    });\n    var r = null, s = i.guard(function(t, u) {\n        u = ((u || window.JSBNG__event));\n        r = ((u.target || u.srcElement));\n        q(r, ((\"data-on\" + t)));\n        var v = j.byAttribute(r, \"data-hover\");\n        if (!v) {\n            return;\n        }\n    ;\n    ;\n        switch (v.getAttribute(\"data-hover\")) {\n          case \"tooltip\":\n            g.loadModules([\"Tooltip\",], function(w) {\n                w.process(v, r);\n            });\n            break;\n        };\n    ;\n    });\n    p.JSBNG__onmouseover = s.curry(\"mouseover\");\n    if (p.JSBNG__addEventListener) {\n        p.JSBNG__addEventListener(\"JSBNG__focus\", s.curry(\"JSBNG__focus\"), true);\n    }\n     else p.JSBNG__attachEvent(\"JSBNG__onfocusin\", s.curry(\"JSBNG__focus\"));\n;\n;\n});\n__d(\"ScriptPath\", [\"Banzai\",\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"ErrorUtils\"), i = \"script_path_change\", j = {\n        scriptPath: null,\n        categoryToken: null\n    }, k = {\n        PAGE_LOAD: \"load\",\n        PAGE_UNLOAD: \"unload\",\n        TRANSITION: \"transition\"\n    }, l = null, m = null, n = {\n    }, o = 0, p = false, q = null;\n    function r(z) {\n        var aa = ++o;\n        n[aa] = z;\n        return aa;\n    };\n;\n    function s(z) {\n        if (n[z]) {\n            delete n[z];\n        }\n    ;\n    ;\n    };\n;\n    function t() {\n        Object.keys(n).forEach(function(z) {\n            h.applyWithGuard(n[z], null, [{\n                source: l,\n                dest: m\n            },]);\n        });\n    };\n;\n    function u(z, aa, ba) {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        var ca = {\n            source_path: z.scriptPath,\n            source_token: z.categoryToken,\n            dest_path: aa.scriptPath,\n            dest_token: aa.categoryToken,\n            navigation: q,\n            cause: ba\n        };\n        g.post(i, ca);\n    };\n;\n    function v() {\n        u(j, m, k.PAGE_LOAD);\n    };\n;\n    function w(z, aa) {\n        u(z, aa, k.TRANSITION);\n    };\n;\n    function x() {\n        u(m, j, k.PAGE_UNLOAD);\n    };\n;\n    g.subscribe(g.SHUTDOWN, x);\n    var y = {\n        set: function(z, aa) {\n            var ba = m;\n            m = {\n                scriptPath: z,\n                categoryToken: aa\n            };\n            window._script_path = z;\n            t();\n            if (p) {\n                if (ba) {\n                    w(ba, m);\n                }\n                 else v();\n            ;\n            }\n        ;\n        ;\n        },\n        setNavigation: function(z) {\n            q = z;\n        },\n        startLogging: function() {\n            p = true;\n            if (m) {\n                v();\n            }\n        ;\n        ;\n        },\n        stopLogging: function() {\n            p = false;\n        },\n        getScriptPath: function() {\n            return ((m ? m.scriptPath : undefined));\n        },\n        getCategoryToken: function() {\n            return ((m ? m.categoryToken : undefined));\n        },\n        subscribe: function(z) {\n            return r(z);\n        },\n        unsubscribe: function(z) {\n            s(z);\n        }\n    };\n    y.CAUSE = k;\n    y.BANZAI_LOGGING_ROUTE = i;\n    e.exports = y;\n});\n__d(\"URLFragmentPrelude\", [\"ScriptPath\",\"URLFragmentPreludeConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptPath\"), h = b(\"URLFragmentPreludeConfig\"), i = /^(?:(?:[^:\\/?#]+):)?(?:\\/\\/(?:[^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/, j = \"\", k = /^[^\\/\\\\#!\\.\\?\\*\\&\\^]+$/;\n    window.JSBNG__location.href.replace(i, function(l, m, n, o) {\n        var p, q, r, s;\n        p = q = ((m + ((n ? ((\"?\" + n)) : \"\"))));\n        if (o) {\n            if (h.incorporateQuicklingFragment) {\n                var t = o.replace(/^(!|%21)/, \"\");\n                r = t.charAt(0);\n                if (((((r == \"/\")) || ((r == \"\\\\\"))))) {\n                    p = t.replace(/^[\\\\\\/]+/, \"/\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (h.hashtagRedirect) {\n                if (((q == p))) {\n                    var u = o.match(k);\n                    if (((((u && !n)) && ((m == \"/\"))))) {\n                        p = ((\"/hashtag/\" + o));\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((p != q))) {\n            s = g.getScriptPath();\n            if (s) {\n                JSBNG__document.cookie = ((((((\"rdir=\" + s)) + \"; path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n            }\n        ;\n        ;\n            window.JSBNG__location.replace(((j + p)));\n        }\n    ;\n    ;\n    });\n});\n__d(\"removeArrayReduce\", [], function(a, b, c, d, e, f) {\n    Array.prototype.reduce = undefined;\n    Array.prototype.reduceRight = undefined;\n});\n__d(\"cx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(((\"cx\" + \"(...): Unexpected class transformation.\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"LitestandSidebarPrelude\", [\"JSBNG__CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"cx\");\n    e.exports = {\n        init: function(i, j, k) {\n            var l = JSBNG__document.documentElement;\n            l.className = ((l.className + \" sidebarMode\"));\n            if (((j || ((l.clientWidth <= k))))) {\n                l.className = ((((l.className + \" \")) + \"-cx-PUBLIC-hasLitestandBookmarksSidebar__collapsed\"));\n            }\n        ;\n        ;\n            g.show(i);\n        }\n    };\n});\n__d(\"SubmitOnEnterListener\", [\"Bootloader\",\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__CSS\");\n    JSBNG__document.documentElement.JSBNG__onkeydown = function(i) {\n        i = ((i || window.JSBNG__event));\n        var j = ((i.target || i.srcElement)), k = ((((((((((((i.keyCode == 13)) && !i.altKey)) && !i.ctrlKey)) && !i.metaKey)) && !i.shiftKey)) && h.hasClass(j, \"enter_submit\")));\n        if (k) {\n            g.loadModules([\"DOM\",\"Input\",\"trackReferrer\",\"Form\",], function(l, m, n, o) {\n                if (!m.isEmpty(j)) {\n                    var p = j.form, q = ((l.scry(p, \".enter_submit_target\")[0] || l.scry(p, \"[type=\\\"submit\\\"]\")[0]));\n                    if (q) {\n                        var r = ((o.getAttribute(p, \"ajaxify\") || o.getAttribute(p, \"action\")));\n                        if (r) {\n                            n(p, r);\n                        }\n                    ;\n                    ;\n                        q.click();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            return false;\n        }\n    ;\n    ;\n    };\n});\n__d(\"CommentPrelude\", [\"JSBNG__CSS\",\"Parent\",\"clickRefAction\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"Parent\"), i = b(\"clickRefAction\"), j = b(\"userAction\");\n    function k(o, p) {\n        j(\"ufi\", o).uai(\"click\");\n        i(\"ufi\", o, null, \"FORCE\");\n        return l(o, p);\n    };\n;\n    function l(o, p) {\n        var q = h.byTag(o, \"form\");\n        m(q);\n        var r = g.removeClass.curry(q, \"hidden_add_comment\");\n        if (window.ScrollAwareDOM) {\n            window.ScrollAwareDOM.monitor(q, r);\n        }\n         else r();\n    ;\n    ;\n        if (((p !== false))) {\n            var s = ((q.add_comment_text_text || q.add_comment_text)), t = s.length;\n            if (t) {\n                if (!h.byClass(s[((t - 1))], \"UFIReplyList\")) {\n                    s[((t - 1))].JSBNG__focus();\n                }\n                 else if (!h.byClass(s[0], \"UFIReplyList\")) {\n                    s[0].JSBNG__focus();\n                }\n                \n            ;\n            ;\n            }\n             else s.JSBNG__focus();\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function m(o) {\n        var p = g.removeClass.curry(o, \"collapsed_comments\");\n        if (window.ScrollAwareDOM) {\n            window.ScrollAwareDOM.monitor(o, p);\n        }\n         else p();\n    ;\n    ;\n    };\n;\n    var n = {\n        click: k,\n        expand: l,\n        uncollapse: m\n    };\n    e.exports = n;\n});\n__d(\"legacy:ufi-comment-prelude-js\", [\"CommentPrelude\",], function(a, b, c, d) {\n    var e = b(\"CommentPrelude\");\n    a.fc_click = e.click;\n    a.fc_expand = e.expand;\n}, 3);\n__d(\"ScriptMonitor\", [], function(a, b, c, d, e, f) {\n    var g, h = [], i = ((((window.JSBNG__MutationObserver || window.JSBNG__WebKitMutationObserver)) || window.MozMutationObserver));\n    e.exports = {\n        activate: function() {\n            if (!i) {\n                return;\n            }\n        ;\n        ;\n            g = new i(function(j) {\n                for (var k = 0; ((k < j.length)); k++) {\n                    var l = j[k];\n                    if (((l.type == \"childList\"))) {\n                        for (var m = 0; ((m < l.addedNodes.length)); m++) {\n                            var n = l.addedNodes[m];\n                            if (((((((n.tagName == \"SCRIPT\")) || ((n.tagName == \"div\")))) && n.src))) {\n                                h.push(n.src);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((((l.type == \"attributes\")) && ((l.attributeName == \"src\"))))) {\n                        h.push(l.target.src);\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n            });\n            g.observe(JSBNG__document, {\n                attributes: true,\n                childList: true,\n                subtree: true\n            });\n        },\n        JSBNG__stop: function() {\n            ((g && g.disconnect()));\n            return h;\n        }\n    };\n});");
// 1019
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"(window.Bootloader && Bootloader.done([\"KlJ/5\",]));");
// 1020
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s2cbbb344264ff2fb1d0f702823bd4d1c89478c26");
// 1021
geval("((window.Bootloader && Bootloader.done([\"KlJ/5\",])));");
// 1022
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"Bootloader.loadEarlyResources({\n    OH3xD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/MAGRPTCpjAg.js\"\n    },\n    XH2Cu: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/clqWNoT9Gz_.js\"\n    },\n    ociRJ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/OZ92iwfpUMS.js\"\n    }\n});");
// 1023
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sdd9d3eed3f252be959e4754051407372cbd92eae");
// 1024
geval("Bootloader.loadEarlyResources({\n    OH3xD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/MAGRPTCpjAg.js\"\n    },\n    XH2Cu: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/clqWNoT9Gz_.js\"\n    },\n    ociRJ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/OZ92iwfpUMS.js\"\n    }\n});");
// 1081
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"");
// 1082
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sda39a3ee5e6b4b0d3255bfef95601890afd80709");
// 1083
geval("");
// 1084
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 1085
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sbc7df7f6bb75d7e29414a7bf76d7afea4393a8e7");
// 1086
geval("new (require(\"ServerJS\"))().handle({\n    require: [[\"removeArrayReduce\",],[\"markJSEnabled\",],[\"lowerDomain\",],[\"URLFragmentPrelude\",],],\n    define: [[\"BanzaiConfig\",[],{\n        MAX_WAIT: 150000,\n        MAX_SIZE: 10000,\n        COMPRESSION_THRESHOLD: 800,\n        gks: {\n            jslogger: true,\n            miny_compression: true,\n            boosted_posts: true,\n            time_spent: true,\n            time_spent_bit_array: true,\n            time_spent_debug: true,\n            useraction: true,\n            videos: true\n        }\n    },7,],[\"URLFragmentPreludeConfig\",[],{\n        hashtagRedirect: true,\n        incorporateQuicklingFragment: true\n    },137,],]\n});");
// 1113
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"OH3xD\",]);\n}\n;\n__d(\"XdArbiterBuffer\", [], function(a, b, c, d, e, f) {\n    if (!a.XdArbiter) {\n        a.XdArbiter = {\n            _m: [],\n            _p: [],\n            register: function(g, h, i) {\n                h = (h || (((/^apps\\./).test(location.hostname) ? \"canvas\" : \"tab\")));\n                this._p.push([g,h,i,]);\n                return h;\n            },\n            handleMessage: function(g, h) {\n                this._m.push([g,h,]);\n            }\n        };\n    };\n});\n__d(\"CanvasIFrameLoader\", [\"XdArbiterBuffer\",\"$\",], function(a, b, c, d, e, f) {\n    b(\"XdArbiterBuffer\");\n    var g = b(\"$\"), h = {\n        loadFromForm: function(i) {\n            i.submit();\n        }\n    };\n    e.exports = h;\n});\n__d(\"PHPQuerySerializer\", [], function(a, b, c, d, e, f) {\n    function g(n) {\n        return h(n, null);\n    };\n    function h(n, o) {\n        o = (o || \"\");\n        var p = [];\n        if (((n === null) || (n === undefined))) {\n            p.push(i(o));\n        }\n         else if ((typeof (n) == \"object\")) {\n            for (var q in n) {\n                if ((n.hasOwnProperty(q) && (n[q] !== undefined))) {\n                    p.push(h(n[q], (o ? ((((o + \"[\") + q) + \"]\")) : q)));\n                };\n            };\n        }\n         else p.push(((i(o) + \"=\") + i(n)));\n        \n    ;\n        return p.join(\"&\");\n    };\n    function i(n) {\n        return encodeURIComponent(n).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n    };\n    var j = /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/;\n    function k(n) {\n        if (!n) {\n            return {\n            }\n        };\n        var o = {\n        };\n        n = n.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n        n = n.split(\"&\");\n        var p = Object.prototype.hasOwnProperty;\n        for (var q = 0, r = n.length; (q < r); q++) {\n            var s = n[q].match(j);\n            if (!s) {\n                var t = n[q].split(\"=\");\n                o[l(t[0])] = ((t[1] === undefined) ? null : l(t[1]));\n            }\n             else {\n                var u = s[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), v = s[1], w = l((s[3] || \"\"));\n                u[0] = v;\n                var x = o;\n                for (var y = 0; (y < (u.length - 1)); y++) {\n                    if (u[y]) {\n                        if (!p.call(x, u[y])) {\n                            var z = ((u[(y + 1)] && !u[(y + 1)].match(/^\\d{1,3}$/)) ? {\n                            } : []);\n                            x[u[y]] = z;\n                            if ((x[u[y]] !== z)) {\n                                return o\n                            };\n                        }\n                    ;\n                        x = x[u[y]];\n                    }\n                     else {\n                        if ((u[(y + 1)] && !u[(y + 1)].match(/^\\d{1,3}$/))) {\n                            x.push({\n                            });\n                        }\n                         else x.push([]);\n                    ;\n                        x = x[(x.length - 1)];\n                    }\n                ;\n                };\n                if (((x instanceof Array) && (u[(u.length - 1)] === \"\"))) {\n                    x.push(w);\n                }\n                 else x[u[(u.length - 1)]] = w;\n            ;\n            }\n        ;\n        };\n        return o;\n    };\n    function l(n) {\n        return decodeURIComponent(n.replace(/\\+/g, \" \"));\n    };\n    var m = {\n        serialize: g,\n        encodeComponent: i,\n        deserialize: k,\n        decodeComponent: l\n    };\n    e.exports = m;\n});\n__d(\"URIRFC3986\", [], function(a, b, c, d, e, f) {\n    var g = new RegExp(((((((((((((\"^\" + \"([^:/?#]+:)?\") + \"(//\") + \"([^\\\\\\\\/?#@]*@)?\") + \"(\") + \"\\\\[[A-Fa-f0-9:.]+\\\\]|\") + \"[^\\\\/?#:]*\") + \")\") + \"(:[0-9]*)?\") + \")?\") + \"([^?#]*)\") + \"(\\\\?[^#]*)?\") + \"(#.*)?\")), h = {\n        parse: function(i) {\n            if ((i.trim() === \"\")) {\n                return null\n            };\n            var j = i.match(g), k = {\n            };\n            k.uri = (j[0] ? j[0] : null);\n            k.scheme = (j[1] ? j[1].substr(0, (j[1].length - 1)) : null);\n            k.authority = (j[2] ? j[2].substr(2) : null);\n            k.userinfo = (j[3] ? j[3].substr(0, (j[3].length - 1)) : null);\n            k.host = (j[2] ? j[4] : null);\n            k.port = (j[5] ? ((j[5].substr(1) ? parseInt(j[5].substr(1), 10) : null)) : null);\n            k.path = (j[6] ? j[6] : null);\n            k.query = (j[7] ? j[7].substr(1) : null);\n            k.fragment = (j[8] ? j[8].substr(1) : null);\n            k.isGenericURI = ((k.authority === null) && !!k.scheme);\n            return k;\n        }\n    };\n    e.exports = h;\n});\n__d(\"createObjectFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i, j) {\n        var k = {\n        }, l = g(j);\n        if ((typeof j == \"undefined\")) {\n            j = true;\n        };\n        for (var m = i.length; m--; ) {\n            k[i[m]] = (l ? j[m] : j);;\n        };\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"URISchemes\", [\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = g([\"fb\",\"fbcf\",\"fbconnect\",\"fb-messenger\",\"fbrpc\",\"ftp\",\"http\",\"https\",\"mailto\",\"itms\",\"itms-apps\",\"market\",\"svn+ssh\",\"fbstaging\",\"tel\",\"sms\",]), i = {\n        isAllowed: function(j) {\n            if (!j) {\n                return true\n            };\n            return h.hasOwnProperty(j.toLowerCase());\n        }\n    };\n    e.exports = i;\n});\n__d(\"URIBase\", [\"PHPQuerySerializer\",\"URIRFC3986\",\"URISchemes\",\"copyProperties\",\"ex\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"PHPQuerySerializer\"), h = b(\"URIRFC3986\"), i = b(\"URISchemes\"), j = b(\"copyProperties\"), k = b(\"ex\"), l = b(\"invariant\"), m = new RegExp(((\"[\\\\x00-\\\\x2c\\\\x2f\\\\x3b-\\\\x40\\\\x5c\\\\x5e\\\\x60\\\\x7b-\\\\x7f\" + \"\\\\uFDD0-\\\\uFDEF\\\\uFFF0-\\\\uFFFF\") + \"\\\\u2047\\\\u2048\\\\uFE56\\\\uFE5F\\\\uFF03\\\\uFF0F\\\\uFF1F]\")), n = new RegExp((\"^(?:[^/]*:|\" + \"[\\\\x00-\\\\x1f]*/[\\\\x00-\\\\x1f]*/)\"));\n    function o(q, r, s) {\n        if (!r) {\n            return true\n        };\n        if ((r instanceof p)) {\n            q.setProtocol(r.getProtocol());\n            q.setDomain(r.getDomain());\n            q.setPort(r.getPort());\n            q.setPath(r.getPath());\n            q.setQueryData(g.deserialize(g.serialize(r.getQueryData())));\n            q.setFragment(r.getFragment());\n            return true;\n        }\n    ;\n        r = r.toString();\n        var t = (h.parse(r) || {\n        });\n        if ((!s && !i.isAllowed(t.scheme))) {\n            return false\n        };\n        q.setProtocol((t.scheme || \"\"));\n        if ((!s && m.test(t.host))) {\n            return false\n        };\n        q.setDomain((t.host || \"\"));\n        q.setPort((t.port || \"\"));\n        q.setPath((t.path || \"\"));\n        if (s) {\n            q.setQueryData((g.deserialize(t.query) || {\n            }));\n        }\n         else try {\n            q.setQueryData((g.deserialize(t.query) || {\n            }));\n        } catch (u) {\n            return false;\n        }\n    ;\n        q.setFragment((t.fragment || \"\"));\n        if ((t.userinfo !== null)) {\n            if (s) {\n                throw new Error(k(\"URI.parse: invalid URI (userinfo is not allowed in a URI): %s\", q.toString()));\n            }\n             else return false\n        \n        };\n        if ((!q.getDomain() && (q.getPath().indexOf(\"\\\\\") !== -1))) {\n            if (s) {\n                throw new Error(k(\"URI.parse: invalid URI (no domain but multiple back-slashes): %s\", q.toString()));\n            }\n             else return false\n        \n        };\n        if ((!q.getProtocol() && n.test(r))) {\n            if (s) {\n                throw new Error(k(\"URI.parse: invalid URI (unsafe protocol-relative URLs): %s\", q.toString()));\n            }\n             else return false\n        \n        };\n        return true;\n    };\n    function p(q) {\n        this.$URIBase0 = \"\";\n        this.$URIBase1 = \"\";\n        this.$URIBase2 = \"\";\n        this.$URIBase3 = \"\";\n        this.$URIBase4 = \"\";\n        this.$URIBase5 = {\n        };\n        o(this, q, true);\n    };\n    p.prototype.setProtocol = function(q) {\n        l(i.isAllowed(q));\n        this.$URIBase0 = q;\n        return this;\n    };\n    p.prototype.getProtocol = function(q) {\n        return this.$URIBase0;\n    };\n    p.prototype.setSecure = function(q) {\n        return this.setProtocol((q ? \"https\" : \"http\"));\n    };\n    p.prototype.isSecure = function() {\n        return (this.getProtocol() === \"https\");\n    };\n    p.prototype.setDomain = function(q) {\n        if (m.test(q)) {\n            throw new Error(k(\"URI.setDomain: unsafe domain specified: %s for url %s\", q, this.toString()))\n        };\n        this.$URIBase1 = q;\n        return this;\n    };\n    p.prototype.getDomain = function() {\n        return this.$URIBase1;\n    };\n    p.prototype.setPort = function(q) {\n        this.$URIBase2 = q;\n        return this;\n    };\n    p.prototype.getPort = function() {\n        return this.$URIBase2;\n    };\n    p.prototype.setPath = function(q) {\n        this.$URIBase3 = q;\n        return this;\n    };\n    p.prototype.getPath = function() {\n        return this.$URIBase3;\n    };\n    p.prototype.addQueryData = function(q, r) {\n        if ((q instanceof Object)) {\n            j(this.$URIBase5, q);\n        }\n         else this.$URIBase5[q] = r;\n    ;\n        return this;\n    };\n    p.prototype.setQueryData = function(q) {\n        this.$URIBase5 = q;\n        return this;\n    };\n    p.prototype.getQueryData = function() {\n        return this.$URIBase5;\n    };\n    p.prototype.removeQueryData = function(q) {\n        if (!Array.isArray(q)) {\n            q = [q,];\n        };\n        for (var r = 0, s = q.length; (r < s); ++r) {\n            delete this.$URIBase5[q[r]];;\n        };\n        return this;\n    };\n    p.prototype.setFragment = function(q) {\n        this.$URIBase4 = q;\n        return this;\n    };\n    p.prototype.getFragment = function() {\n        return this.$URIBase4;\n    };\n    p.prototype.toString = function() {\n        var q = \"\";\n        if (this.$URIBase0) {\n            q += (this.$URIBase0 + \"://\");\n        };\n        if (this.$URIBase1) {\n            q += this.$URIBase1;\n        };\n        if (this.$URIBase2) {\n            q += (\":\" + this.$URIBase2);\n        };\n        if (this.$URIBase3) {\n            q += this.$URIBase3;\n        }\n         else if (q) {\n            q += \"/\";\n        }\n    ;\n        var r = g.serialize(this.$URIBase5);\n        if (r) {\n            q += (\"?\" + r);\n        };\n        if (this.$URIBase4) {\n            q += (\"#\" + this.$URIBase4);\n        };\n        return q;\n    };\n    p.prototype.getOrigin = function() {\n        return (((this.$URIBase0 + \"://\") + this.$URIBase1) + ((this.$URIBase2 ? (\":\" + this.$URIBase2) : \"\")));\n    };\n    p.isValidURI = function(q) {\n        return o(new p(), q, false);\n    };\n    e.exports = p;\n});\n__d(\"URI\", [\"URIBase\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URIBase\"), h = b(\"copyProperties\"), i = b(\"goURI\");\n    for (var j in g) {\n        if ((g.hasOwnProperty(j) && (j !== \"_metaprototype\"))) {\n            l[j] = g[j];\n        };\n    };\n    var k = ((g === null) ? null : g.prototype);\n    l.prototype = Object.create(k);\n    l.prototype.constructor = l;\n    l.__superConstructor__ = g;\n    function l(m) {\n        if (!((this instanceof l))) {\n            return new l((m || window.location.href))\n        };\n        g.call(this, (m || \"\"));\n    };\n    l.prototype.setPath = function(m) {\n        this.path = m;\n        return k.setPath.call(this, m);\n    };\n    l.prototype.getPath = function() {\n        var m = k.getPath.call(this);\n        if (m) {\n            return m.replace(/^\\/+/, \"/\")\n        };\n        return m;\n    };\n    l.prototype.setProtocol = function(m) {\n        this.protocol = m;\n        return k.setProtocol.call(this, m);\n    };\n    l.prototype.setDomain = function(m) {\n        this.domain = m;\n        return k.setDomain.call(this, m);\n    };\n    l.prototype.setPort = function(m) {\n        this.port = m;\n        return k.setPort.call(this, m);\n    };\n    l.prototype.setFragment = function(m) {\n        this.fragment = m;\n        return k.setFragment.call(this, m);\n    };\n    l.prototype.isEmpty = function() {\n        return !((((((this.getPath() || this.getProtocol()) || this.getDomain()) || this.getPort()) || (Object.keys(this.getQueryData()).length > 0)) || this.getFragment()));\n    };\n    l.prototype.valueOf = function() {\n        return this.toString();\n    };\n    l.prototype.isFacebookURI = function() {\n        if (!l.$URI5) {\n            l.$URI5 = new RegExp(\"(^|\\\\.)facebook\\\\.com$\", \"i\");\n        };\n        if (this.isEmpty()) {\n            return false\n        };\n        if ((!this.getDomain() && !this.getProtocol())) {\n            return true\n        };\n        return ((([\"http\",\"https\",].indexOf(this.getProtocol()) !== -1) && l.$URI5.test(this.getDomain())));\n    };\n    l.prototype.getRegisteredDomain = function() {\n        if (!this.getDomain()) {\n            return \"\"\n        };\n        if (!this.isFacebookURI()) {\n            return null\n        };\n        var m = this.getDomain().split(\".\"), n = m.indexOf(\"facebook\");\n        return m.slice(n).join(\".\");\n    };\n    l.prototype.getUnqualifiedURI = function() {\n        return new l(this).setProtocol(null).setDomain(null).setPort(null);\n    };\n    l.prototype.getQualifiedURI = function() {\n        return new l(this).$URI6();\n    };\n    l.prototype.$URI6 = function() {\n        if (!this.getDomain()) {\n            var m = l();\n            this.setProtocol(m.getProtocol()).setDomain(m.getDomain()).setPort(m.getPort());\n        }\n    ;\n        return this;\n    };\n    l.prototype.isSameOrigin = function(m) {\n        var n = (m || window.location.href);\n        if (!((n instanceof l))) {\n            n = new l(n.toString());\n        };\n        if ((this.isEmpty() || n.isEmpty())) {\n            return false\n        };\n        if ((this.getProtocol() && (this.getProtocol() != n.getProtocol()))) {\n            return false\n        };\n        if ((this.getDomain() && (this.getDomain() != n.getDomain()))) {\n            return false\n        };\n        if ((this.getPort() && (this.getPort() != n.getPort()))) {\n            return false\n        };\n        return true;\n    };\n    l.prototype.go = function(m) {\n        i(this, m);\n    };\n    l.prototype.setSubdomain = function(m) {\n        var n = this.$URI6().getDomain().split(\".\");\n        if ((n.length <= 2)) {\n            n.unshift(m);\n        }\n         else n[0] = m;\n    ;\n        return this.setDomain(n.join(\".\"));\n    };\n    l.prototype.getSubdomain = function() {\n        if (!this.getDomain()) {\n            return \"\"\n        };\n        var m = this.getDomain().split(\".\");\n        if ((m.length <= 2)) {\n            return \"\";\n        }\n         else return m[0]\n    ;\n    };\n    h(l, {\n        getRequestURI: function(m, n) {\n            m = ((m === undefined) || m);\n            var o = a.PageTransitions;\n            if (((m && o) && o.isInitialized())) {\n                return o.getCurrentURI(!!n).getQualifiedURI();\n            }\n             else return new l(window.location.href)\n        ;\n        },\n        getMostRecentURI: function() {\n            var m = a.PageTransitions;\n            if ((m && m.isInitialized())) {\n                return m.getMostRecentURI().getQualifiedURI();\n            }\n             else return new l(window.location.href)\n        ;\n        },\n        getNextURI: function() {\n            var m = a.PageTransitions;\n            if ((m && m.isInitialized())) {\n                return m.getNextURI().getQualifiedURI();\n            }\n             else return new l(window.location.href)\n        ;\n        },\n        expression: /(((\\w+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/,\n        arrayQueryExpression: /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/,\n        explodeQuery: function(m) {\n            if (!m) {\n                return {\n                }\n            };\n            var n = {\n            };\n            m = m.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n            m = m.split(\"&\");\n            var o = Object.prototype.hasOwnProperty;\n            for (var p = 0, q = m.length; (p < q); p++) {\n                var r = m[p].match(l.arrayQueryExpression);\n                if (!r) {\n                    var s = m[p].split(\"=\");\n                    n[l.decodeComponent(s[0])] = ((s[1] === undefined) ? null : l.decodeComponent(s[1]));\n                }\n                 else {\n                    var t = r[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), u = r[1], v = l.decodeComponent((r[3] || \"\"));\n                    t[0] = u;\n                    var w = n;\n                    for (var x = 0; (x < (t.length - 1)); x++) {\n                        if (t[x]) {\n                            if (!o.call(w, t[x])) {\n                                var y = ((t[(x + 1)] && !t[(x + 1)].match(/^\\d{1,3}$/)) ? {\n                                } : []);\n                                w[t[x]] = y;\n                                if ((w[t[x]] !== y)) {\n                                    return n\n                                };\n                            }\n                        ;\n                            w = w[t[x]];\n                        }\n                         else {\n                            if ((t[(x + 1)] && !t[(x + 1)].match(/^\\d{1,3}$/))) {\n                                w.push({\n                                });\n                            }\n                             else w.push([]);\n                        ;\n                            w = w[(w.length - 1)];\n                        }\n                    ;\n                    };\n                    if (((w instanceof Array) && (t[(t.length - 1)] === \"\"))) {\n                        w.push(v);\n                    }\n                     else w[t[(t.length - 1)]] = v;\n                ;\n                }\n            ;\n            };\n            return n;\n        },\n        implodeQuery: function(m, n, o) {\n            n = (n || \"\");\n            if ((o === undefined)) {\n                o = true;\n            };\n            var p = [];\n            if (((m === null) || (m === undefined))) {\n                p.push((o ? l.encodeComponent(n) : n));\n            }\n             else if ((m instanceof Array)) {\n                for (var q = 0; (q < m.length); ++q) {\n                    try {\n                        if ((m[q] !== undefined)) {\n                            p.push(l.implodeQuery(m[q], (n ? ((((n + \"[\") + q) + \"]\")) : q), o));\n                        };\n                    } catch (r) {\n                    \n                    };\n                };\n            }\n             else if ((typeof (m) == \"object\")) {\n                if ((((\"nodeName\" in m)) && ((\"nodeType\" in m)))) {\n                    p.push(\"{node}\");\n                }\n                 else for (var s in m) {\n                    try {\n                        if ((m[s] !== undefined)) {\n                            p.push(l.implodeQuery(m[s], (n ? ((((n + \"[\") + s) + \"]\")) : s), o));\n                        };\n                    } catch (r) {\n                    \n                    };\n                }\n            ;\n            }\n             else if (o) {\n                p.push(((l.encodeComponent(n) + \"=\") + l.encodeComponent(m)));\n            }\n             else p.push(((n + \"=\") + m));\n            \n            \n            \n        ;\n            return p.join(\"&\");\n        },\n        encodeComponent: function(m) {\n            return encodeURIComponent(m).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n        },\n        decodeComponent: function(m) {\n            return decodeURIComponent(m.replace(/\\+/g, \" \"));\n        }\n    });\n    e.exports = l;\n});\n__d(\"AsyncSignal\", [\"Env\",\"ErrorUtils\",\"QueryString\",\"URI\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ErrorUtils\"), i = b(\"QueryString\"), j = b(\"URI\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(n, o) {\n        this.data = (o || {\n        });\n        if ((g.tracking_domain && (n.charAt(0) == \"/\"))) {\n            n = (g.tracking_domain + n);\n        };\n        this.uri = n;\n    };\n    m.prototype.setHandler = function(n) {\n        this.handler = n;\n        return this;\n    };\n    m.prototype.send = function() {\n        var n = this.handler, o = this.data, p = new Image();\n        if (n) {\n            p.onload = p.onerror = function() {\n                h.applyWithGuard(n, null, [(p.height == 1),]);\n            };\n        };\n        o.asyncSignal = ((((Math.random() * 10000) | 0)) + 1);\n        var q = new j(this.uri).isFacebookURI();\n        l(o, k.getAsyncParams((q ? \"POST\" : \"GET\")));\n        p.src = i.appendToUrl(this.uri, o);\n        return this;\n    };\n    e.exports = m;\n});\n__d(\"DOMQuery\", [\"CSS\",\"UserAgent\",\"createArrayFrom\",\"createObjectFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"UserAgent\"), i = b(\"createArrayFrom\"), j = b(\"createObjectFrom\"), k = b(\"ge\"), l = null;\n    function m(o, p) {\n        return (o.hasAttribute ? o.hasAttribute(p) : (o.getAttribute(p) !== null));\n    };\n    var n = {\n        find: function(o, p) {\n            var q = n.scry(o, p);\n            return q[0];\n        },\n        scry: function(o, p) {\n            if ((!o || !o.getElementsByTagName)) {\n                return []\n            };\n            var q = p.split(\" \"), r = [o,];\n            for (var s = 0; (s < q.length); s++) {\n                if ((r.length === 0)) {\n                    break;\n                };\n                if ((q[s] === \"\")) {\n                    continue;\n                };\n                var t = q[s], u = q[s], v = [], w = false;\n                if ((t.charAt(0) == \"^\")) {\n                    if ((s === 0)) {\n                        w = true;\n                        t = t.slice(1);\n                    }\n                     else return []\n                \n                };\n                t = t.replace(/\\[(?:[^=\\]]*=(?:\"[^\"]*\"|'[^']*'))?|[.#]/g, \" $&\");\n                var x = t.split(\" \"), y = (x[0] || \"*\"), z = (y == \"*\"), aa = (x[1] && (x[1].charAt(0) == \"#\"));\n                if (aa) {\n                    var ba = k(x[1].slice(1), o, y);\n                    if ((ba && ((z || (ba.tagName.toLowerCase() == y))))) {\n                        for (var ca = 0; (ca < r.length); ca++) {\n                            if ((w && n.contains(ba, r[ca]))) {\n                                v = [ba,];\n                                break;\n                            }\n                             else if (((document == r[ca]) || n.contains(r[ca], ba))) {\n                                v = [ba,];\n                                break;\n                            }\n                            \n                        ;\n                        }\n                    };\n                }\n                 else {\n                    var da = [], ea = r.length, fa, ga = ((!w && (u.indexOf(\"[\") < 0)) && document.querySelectorAll);\n                    for (var ha = 0; (ha < ea); ha++) {\n                        if (w) {\n                            fa = [];\n                            var ia = r[ha].parentNode;\n                            while (n.isElementNode(ia)) {\n                                if ((z || (ia.tagName.toLowerCase() == y))) {\n                                    fa.push(ia);\n                                };\n                                ia = ia.parentNode;\n                            };\n                        }\n                         else if (ga) {\n                            fa = r[ha].querySelectorAll(u);\n                        }\n                         else fa = r[ha].getElementsByTagName(y);\n                        \n                    ;\n                        var ja = fa.length;\n                        for (var ka = 0; (ka < ja); ka++) {\n                            da.push(fa[ka]);;\n                        };\n                    };\n                    if (!ga) {\n                        for (var la = 1; (la < x.length); la++) {\n                            var ma = x[la], na = (ma.charAt(0) == \".\"), oa = ma.substring(1);\n                            for (ha = 0; (ha < da.length); ha++) {\n                                var pa = da[ha];\n                                if ((!pa || (pa.nodeType !== 1))) {\n                                    continue;\n                                };\n                                if (na) {\n                                    if (!g.hasClass(pa, oa)) {\n                                        delete da[ha];\n                                    };\n                                    continue;\n                                }\n                                 else {\n                                    var qa = ma.slice(1, (ma.length - 1));\n                                    if ((qa.indexOf(\"=\") == -1)) {\n                                        if (!m(pa, qa)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    }\n                                     else {\n                                        var ra = qa.split(\"=\"), sa = ra[0], ta = ra[1];\n                                        ta = ta.slice(1, (ta.length - 1));\n                                        if ((pa.getAttribute(sa) != ta)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    }\n                                ;\n                                }\n                            ;\n                            };\n                        }\n                    };\n                    for (ha = 0; (ha < da.length); ha++) {\n                        if (da[ha]) {\n                            v.push(da[ha]);\n                            if (w) {\n                                break;\n                            };\n                        }\n                    ;\n                    };\n                }\n            ;\n                r = v;\n            };\n            return r;\n        },\n        getText: function(o) {\n            if (n.isTextNode(o)) {\n                return o.data;\n            }\n             else if (n.isElementNode(o)) {\n                if ((l === null)) {\n                    var p = document.createElement(\"div\");\n                    l = ((p.textContent != null) ? \"textContent\" : \"innerText\");\n                }\n            ;\n                return o[l];\n            }\n             else return \"\"\n            \n        ;\n        },\n        getSelection: function() {\n            var o = window.getSelection, p = document.selection;\n            if (o) {\n                return (o() + \"\");\n            }\n             else if (p) {\n                return p.createRange().text\n            }\n        ;\n            return null;\n        },\n        contains: function(o, p) {\n            o = k(o);\n            p = k(p);\n            if ((!o || !p)) {\n                return false;\n            }\n             else if ((o === p)) {\n                return true;\n            }\n             else if (n.isTextNode(o)) {\n                return false;\n            }\n             else if (n.isTextNode(p)) {\n                return n.contains(o, p.parentNode);\n            }\n             else if (o.contains) {\n                return o.contains(p);\n            }\n             else if (o.compareDocumentPosition) {\n                return !!((o.compareDocumentPosition(p) & 16));\n            }\n             else return false\n            \n            \n            \n            \n            \n        ;\n        },\n        getRootElement: function() {\n            var o = null;\n            if ((window.Quickling && Quickling.isActive())) {\n                o = k(\"content\");\n            };\n            return (o || document.body);\n        },\n        isNode: function(o) {\n            return !!((o && (((typeof Node !== \"undefined\") ? (o instanceof Node) : (((typeof o == \"object\") && (typeof o.nodeType == \"number\")) && (typeof o.nodeName == \"string\"))))));\n        },\n        isNodeOfType: function(o, p) {\n            var q = i(p).join(\"|\").toUpperCase().split(\"|\"), r = j(q);\n            return (n.isNode(o) && (o.nodeName in r));\n        },\n        isElementNode: function(o) {\n            return (n.isNode(o) && (o.nodeType == 1));\n        },\n        isTextNode: function(o) {\n            return (n.isNode(o) && (o.nodeType == 3));\n        },\n        isInputNode: function(o) {\n            return (n.isNodeOfType(o, [\"input\",\"textarea\",]) || (o.contentEditable === \"true\"));\n        },\n        getDocumentScrollElement: function(o) {\n            o = (o || document);\n            var p = (h.chrome() || h.webkit());\n            return ((!p && (o.compatMode === \"CSS1Compat\")) ? o.documentElement : o.body);\n        }\n    };\n    e.exports = n;\n});\n__d(\"DataStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = 1;\n    function i(l) {\n        if ((typeof l == \"string\")) {\n            return (\"str_\" + l);\n        }\n         else return (\"elem_\" + ((l.__FB_TOKEN || (l.__FB_TOKEN = [h++,])))[0])\n    ;\n    };\n    function j(l) {\n        var m = i(l);\n        return (g[m] || (g[m] = {\n        }));\n    };\n    var k = {\n        set: function(l, m, n) {\n            if (!l) {\n                throw new TypeError((\"DataStore.set: namespace is required, got \" + (typeof l)))\n            };\n            var o = j(l);\n            o[m] = n;\n            return l;\n        },\n        get: function(l, m, n) {\n            if (!l) {\n                throw new TypeError((\"DataStore.get: namespace is required, got \" + (typeof l)))\n            };\n            var o = j(l), p = o[m];\n            if (((typeof p === \"undefined\") && l.getAttribute)) {\n                if ((l.hasAttribute && !l.hasAttribute((\"data-\" + m)))) {\n                    p = undefined;\n                }\n                 else {\n                    var q = l.getAttribute((\"data-\" + m));\n                    p = (((null === q)) ? undefined : q);\n                }\n            \n            };\n            if ((((n !== undefined)) && ((p === undefined)))) {\n                p = o[m] = n;\n            };\n            return p;\n        },\n        remove: function(l, m) {\n            if (!l) {\n                throw new TypeError((\"DataStore.remove: namespace is required, got \" + (typeof l)))\n            };\n            var n = j(l), o = n[m];\n            delete n[m];\n            return o;\n        },\n        purge: function(l) {\n            delete g[i(l)];\n        }\n    };\n    e.exports = k;\n});\n__d(\"DOMEvent\", [\"copyProperties\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"invariant\");\n    function i(j) {\n        this.event = (j || window.event);\n        h((typeof (this.event.srcElement) != \"unknown\"));\n        this.target = (this.event.target || this.event.srcElement);\n    };\n    i.killThenCall = function(j) {\n        return function(k) {\n            new i(k).kill();\n            return j();\n        };\n    };\n    g(i.prototype, {\n        preventDefault: function() {\n            var j = this.event;\n            if (j.preventDefault) {\n                j.preventDefault();\n                if (!((\"defaultPrevented\" in j))) {\n                    j.defaultPrevented = true;\n                };\n            }\n             else j.returnValue = false;\n        ;\n            return this;\n        },\n        isDefaultPrevented: function() {\n            var j = this.event;\n            return (((\"defaultPrevented\" in j)) ? j.defaultPrevented : (j.returnValue === false));\n        },\n        stopPropagation: function() {\n            var j = this.event;\n            (j.stopPropagation ? j.stopPropagation() : j.cancelBubble = true);\n            return this;\n        },\n        kill: function() {\n            this.stopPropagation().preventDefault();\n            return this;\n        }\n    });\n    e.exports = i;\n});\n__d(\"getObjectValues\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        var j = [];\n        for (var k in i) {\n            j.push(i[k]);;\n        };\n        return j;\n    };\n    e.exports = h;\n});\n__d(\"Event\", [\"event-form-bubbling\",\"Arbiter\",\"DataStore\",\"DOMQuery\",\"DOMEvent\",\"ErrorUtils\",\"Parent\",\"UserAgent\",\"$\",\"copyProperties\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    b(\"event-form-bubbling\");\n    var g = b(\"Arbiter\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"DOMEvent\"), k = b(\"ErrorUtils\"), l = b(\"Parent\"), m = b(\"UserAgent\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"getObjectValues\"), q = a.Event;\n    q.DATASTORE_KEY = \"Event.listeners\";\n    if (!q.prototype) {\n        q.prototype = {\n        };\n    };\n    function r(ca) {\n        if ((((ca.type === \"click\") || (ca.type === \"mouseover\")) || (ca.type === \"keydown\"))) {\n            g.inform(\"Event/stop\", {\n                event: ca\n            });\n        };\n    };\n    function s(ca, da, ea) {\n        this.target = ca;\n        this.type = da;\n        this.data = ea;\n    };\n    o(s.prototype, {\n        getData: function() {\n            this.data = (this.data || {\n            });\n            return this.data;\n        },\n        stop: function() {\n            return q.stop(this);\n        },\n        prevent: function() {\n            return q.prevent(this);\n        },\n        isDefaultPrevented: function() {\n            return q.isDefaultPrevented(this);\n        },\n        kill: function() {\n            return q.kill(this);\n        },\n        getTarget: function() {\n            return (new j(this).target || null);\n        }\n    });\n    function t(ca) {\n        if ((ca instanceof s)) {\n            return ca\n        };\n        if (!ca) {\n            if ((!window.addEventListener && document.createEventObject)) {\n                ca = (window.event ? document.createEventObject(window.event) : {\n                });\n            }\n             else ca = {\n            };\n        \n        };\n        if (!ca._inherits_from_prototype) {\n            for (var da in q.prototype) {\n                try {\n                    ca[da] = q.prototype[da];\n                } catch (ea) {\n                \n                };\n            }\n        };\n        return ca;\n    };\n    o(q.prototype, {\n        _inherits_from_prototype: true,\n        getRelatedTarget: function() {\n            var ca = (this.relatedTarget || (((this.fromElement === this.srcElement) ? this.toElement : this.fromElement)));\n            return ((ca && ca.nodeType) ? ca : null);\n        },\n        getModifiers: function() {\n            var ca = {\n                control: !!this.ctrlKey,\n                shift: !!this.shiftKey,\n                alt: !!this.altKey,\n                meta: !!this.metaKey\n            };\n            ca.access = (m.osx() ? ca.control : ca.alt);\n            ca.any = (((ca.control || ca.shift) || ca.alt) || ca.meta);\n            return ca;\n        },\n        isRightClick: function() {\n            if (this.which) {\n                return (this.which === 3)\n            };\n            return (this.button && (this.button === 2));\n        },\n        isMiddleClick: function() {\n            if (this.which) {\n                return (this.which === 2)\n            };\n            return (this.button && (this.button === 4));\n        },\n        isDefaultRequested: function() {\n            return ((this.getModifiers().any || this.isMiddleClick()) || this.isRightClick());\n        }\n    });\n    o(q.prototype, s.prototype);\n    o(q, {\n        listen: function(ca, da, ea, fa) {\n            if ((typeof ca == \"string\")) {\n                ca = n(ca);\n            };\n            if ((typeof fa == \"undefined\")) {\n                fa = q.Priority.NORMAL;\n            };\n            if ((typeof da == \"object\")) {\n                var ga = {\n                };\n                for (var ha in da) {\n                    ga[ha] = q.listen(ca, ha, da[ha], fa);;\n                };\n                return ga;\n            }\n        ;\n            if (da.match(/^on/i)) {\n                throw new TypeError(((\"Bad event name `\" + da) + \"': use `click', not `onclick'.\"))\n            };\n            if (((ca.nodeName == \"LABEL\") && (da == \"click\"))) {\n                var ia = ca.getElementsByTagName(\"input\");\n                ca = ((ia.length == 1) ? ia[0] : ca);\n            }\n             else if (((ca === window) && (da === \"scroll\"))) {\n                var ja = i.getDocumentScrollElement();\n                if (((ja !== document.documentElement) && (ja !== document.body))) {\n                    ca = ja;\n                };\n            }\n            \n        ;\n            var ka = h.get(ca, v, {\n            });\n            if (x[da]) {\n                var la = x[da];\n                da = la.base;\n                if (la.wrap) {\n                    ea = la.wrap(ea);\n                };\n            }\n        ;\n            z(ca, da);\n            var ma = ka[da];\n            if (!((fa in ma))) {\n                ma[fa] = [];\n            };\n            var na = ma[fa].length, oa = new ba(ea, ma[fa], na);\n            ma[fa].push(oa);\n            return oa;\n        },\n        stop: function(ca) {\n            var da = new j(ca).stopPropagation();\n            r(da.event);\n            return ca;\n        },\n        prevent: function(ca) {\n            new j(ca).preventDefault();\n            return ca;\n        },\n        isDefaultPrevented: function(ca) {\n            return new j(ca).isDefaultPrevented(ca);\n        },\n        kill: function(ca) {\n            var da = new j(ca).kill();\n            r(da.event);\n            return false;\n        },\n        getKeyCode: function(event) {\n            event = new j(event).event;\n            if (!event) {\n                return false\n            };\n            switch (event.keyCode) {\n              case 63232:\n                return 38;\n              case 63233:\n                return 40;\n              case 63234:\n                return 37;\n              case 63235:\n                return 39;\n              case 63272:\n            \n              case 63273:\n            \n              case 63275:\n                return null;\n              case 63276:\n                return 33;\n              case 63277:\n                return 34;\n            };\n            if (event.shiftKey) {\n                switch (event.keyCode) {\n                  case 33:\n                \n                  case 34:\n                \n                  case 37:\n                \n                  case 38:\n                \n                  case 39:\n                \n                  case 40:\n                    return null;\n                }\n            };\n            return event.keyCode;\n        },\n        getPriorities: function() {\n            if (!u) {\n                var ca = p(q.Priority);\n                ca.sort(function(da, ea) {\n                    return (da - ea);\n                });\n                u = ca;\n            }\n        ;\n            return u;\n        },\n        fire: function(ca, da, ea) {\n            var fa = new s(ca, da, ea), ga;\n            do {\n                var ha = q.__getHandler(ca, da);\n                if (ha) {\n                    ga = ha(fa);\n                };\n                ca = ca.parentNode;\n            } while (((ca && (ga !== false)) && !fa.cancelBubble));\n            return (ga !== false);\n        },\n        __fire: function(ca, da, event) {\n            var ea = q.__getHandler(ca, da);\n            if (ea) {\n                return ea(t(event))\n            };\n        },\n        __getHandler: function(ca, da) {\n            return h.get(ca, (q.DATASTORE_KEY + da));\n        },\n        getPosition: function(ca) {\n            ca = new j(ca).event;\n            var da = i.getDocumentScrollElement(), ea = (ca.clientX + da.scrollLeft), fa = (ca.clientY + da.scrollTop);\n            return {\n                x: ea,\n                y: fa\n            };\n        }\n    });\n    var u = null, v = q.DATASTORE_KEY, w = function(ca) {\n        return function(da) {\n            if (!i.contains(this, da.getRelatedTarget())) {\n                return ca.call(this, da)\n            };\n        };\n    }, x;\n    if (!window.navigator.msPointerEnabled) {\n        x = {\n            mouseenter: {\n                base: \"mouseover\",\n                wrap: w\n            },\n            mouseleave: {\n                base: \"mouseout\",\n                wrap: w\n            }\n        };\n    }\n     else x = {\n        mousedown: {\n            base: \"MSPointerDown\"\n        },\n        mousemove: {\n            base: \"MSPointerMove\"\n        },\n        mouseup: {\n            base: \"MSPointerUp\"\n        },\n        mouseover: {\n            base: \"MSPointerOver\"\n        },\n        mouseout: {\n            base: \"MSPointerOut\"\n        },\n        mouseenter: {\n            base: \"MSPointerOver\",\n            wrap: w\n        },\n        mouseleave: {\n            base: \"MSPointerOut\",\n            wrap: w\n        }\n    };\n;\n    if (m.firefox()) {\n        var y = function(ca, event) {\n            event = t(event);\n            var da = event.getTarget();\n            while (da) {\n                q.__fire(da, ca, event);\n                da = da.parentNode;\n            };\n        };\n        document.documentElement.addEventListener(\"focus\", y.curry(\"focusin\"), true);\n        document.documentElement.addEventListener(\"blur\", y.curry(\"focusout\"), true);\n    }\n;\n    var z = function(ca, da) {\n        var ea = (\"on\" + da), fa = aa.bind(ca, da), ga = h.get(ca, v);\n        if ((da in ga)) {\n            return\n        };\n        ga[da] = {\n        };\n        if (ca.addEventListener) {\n            ca.addEventListener(da, fa, false);\n        }\n         else if (ca.attachEvent) {\n            ca.attachEvent(ea, fa);\n        }\n    ;\n        h.set(ca, (v + da), fa);\n        if (ca[ea]) {\n            var ha = ((ca === document.documentElement) ? q.Priority._BUBBLE : q.Priority.TRADITIONAL), ia = ca[ea];\n            ca[ea] = null;\n            q.listen(ca, da, ia, ha);\n        }\n    ;\n        if (((ca.nodeName === \"FORM\") && (da === \"submit\"))) {\n            q.listen(ca, da, q.__bubbleSubmit.curry(ca), q.Priority._BUBBLE);\n        };\n    }, aa = k.guard(function(ca, event) {\n        event = t(event);\n        if (!h.get(this, v)) {\n            throw new Error(\"Bad listenHandler context.\")\n        };\n        var da = h.get(this, v)[ca];\n        if (!da) {\n            throw new Error(((\"No registered handlers for `\" + ca) + \"'.\"))\n        };\n        if ((ca == \"click\")) {\n            var ea = l.byTag(event.getTarget(), \"a\");\n            if (window.userAction) {\n                var fa = window.userAction(\"evt_ext\", ea, event, {\n                    mode: \"DEDUP\"\n                }).uai_fallback(\"click\");\n                if (window.ArbiterMonitor) {\n                    window.ArbiterMonitor.initUA(fa, [ea,]);\n                };\n            }\n        ;\n            if (window.clickRefAction) {\n                window.clickRefAction(\"click\", ea, event);\n            };\n        }\n    ;\n        var ga = q.getPriorities();\n        for (var ha = 0; (ha < ga.length); ha++) {\n            var ia = ga[ha];\n            if ((ia in da)) {\n                var ja = da[ia];\n                for (var ka = 0; (ka < ja.length); ka++) {\n                    if (!ja[ka]) {\n                        continue;\n                    };\n                    var la = ja[ka].fire(this, event);\n                    if ((la === false)) {\n                        return event.kill();\n                    }\n                     else if (event.cancelBubble) {\n                        event.stop();\n                    }\n                ;\n                };\n            }\n        ;\n        };\n        return event.returnValue;\n    });\n    q.Priority = {\n        URGENT: -20,\n        TRADITIONAL: -10,\n        NORMAL: 0,\n        _BUBBLE: 1000\n    };\n    function ba(ca, da, ea) {\n        this._handler = ca;\n        this._container = da;\n        this._index = ea;\n    };\n    o(ba.prototype, {\n        remove: function() {\n            delete this._handler;\n            delete this._container[this._index];\n        },\n        fire: function(ca, event) {\n            return k.applyWithGuard(this._handler, ca, [event,], function(da) {\n                da.event_type = event.type;\n                da.dom_element = (ca.name || ca.id);\n                da.category = \"eventhandler\";\n            });\n        }\n    });\n    a.$E = q.$E = t;\n    e.exports = q;\n});\n__d(\"evalGlobal\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if ((typeof h != \"string\")) {\n            throw new TypeError(\"JS sent to evalGlobal is not a string. Only strings are permitted.\")\n        };\n        if (!h) {\n            return\n        };\n        var i = document.createElement(\"script\");\n        try {\n            i.appendChild(document.createTextNode(h));\n        } catch (j) {\n            i.text = h;\n        };\n        var k = (document.getElementsByTagName(\"head\")[0] || document.documentElement);\n        k.appendChild(i);\n        k.removeChild(i);\n    };\n    e.exports = g;\n});\n__d(\"HTML\", [\"function-extensions\",\"Bootloader\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"evalGlobal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"UserAgent\"), i = b(\"copyProperties\"), j = b(\"createArrayFrom\"), k = b(\"emptyFunction\"), l = b(\"evalGlobal\");\n    function m(n) {\n        if ((n && (typeof n.__html == \"string\"))) {\n            n = n.__html;\n        };\n        if (!((this instanceof m))) {\n            if ((n instanceof m)) {\n                return n\n            };\n            return new m(n);\n        }\n    ;\n        this._content = n;\n        this._defer = false;\n        this._extra_action = \"\";\n        this._nodes = null;\n        this._inline_js = k;\n        this._rootNode = null;\n        return this;\n    };\n    m.isHTML = function(n) {\n        return (n && (((n instanceof m) || (n.__html !== undefined))));\n    };\n    m.replaceJSONWrapper = function(n) {\n        return ((n && (n.__html !== undefined)) ? new m(n.__html) : n);\n    };\n    i(m.prototype, {\n        toString: function() {\n            var n = (this._content || \"\");\n            if (this._extra_action) {\n                n += (((\"\\u003Cscript type=\\\"text/javascript\\\"\\u003E\" + this._extra_action) + \"\\u003C/scr\") + \"ipt\\u003E\");\n            };\n            return n;\n        },\n        setAction: function(n) {\n            this._extra_action = n;\n            return this;\n        },\n        getAction: function() {\n            this._fillCache();\n            var n = function() {\n                this._inline_js();\n                l(this._extra_action);\n            }.bind(this);\n            if (this.getDeferred()) {\n                return n.defer.bind(n);\n            }\n             else return n\n        ;\n        },\n        setDeferred: function(n) {\n            this._defer = !!n;\n            return this;\n        },\n        getDeferred: function() {\n            return this._defer;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getNodes: function() {\n            this._fillCache();\n            return this._nodes;\n        },\n        getRootNode: function() {\n            var n = this.getNodes();\n            if ((n.length === 1)) {\n                this._rootNode = n[0];\n            }\n             else {\n                var o = document.createDocumentFragment();\n                for (var p = 0; (p < n.length); p++) {\n                    o.appendChild(n[p]);;\n                };\n                this._rootNode = o;\n            }\n        ;\n            return this._rootNode;\n        },\n        _fillCache: function() {\n            if ((null !== this._nodes)) {\n                return\n            };\n            var n = this._content;\n            if (!n) {\n                this._nodes = [];\n                return;\n            }\n        ;\n            n = n.replace(/(<(\\w+)[^>]*?)\\/>/g, function(y, z, aa) {\n                return (aa.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? y : (((z + \"\\u003E\\u003C/\") + aa) + \"\\u003E\"));\n            });\n            var o = n.trim().toLowerCase(), p = document.createElement(\"div\"), q = false, r = ((((((((!o.indexOf(\"\\u003Copt\") && [1,\"\\u003Cselect multiple=\\\"multiple\\\" class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/select\\u003E\",])) || ((!o.indexOf(\"\\u003Cleg\") && [1,\"\\u003Cfieldset class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/fieldset\\u003E\",]))) || ((o.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1,\"\\u003Ctable class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/table\\u003E\",]))) || ((!o.indexOf(\"\\u003Ctr\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",]))) || ((((!o.indexOf(\"\\u003Ctd\") || !o.indexOf(\"\\u003Cth\"))) && [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",]))) || ((!o.indexOf(\"\\u003Ccol\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",]))) || null);\n            if ((null === r)) {\n                p.className = \"__WRAPPER\";\n                if (h.ie()) {\n                    r = [0,\"\\u003Cspan style=\\\"display:none\\\"\\u003E&nbsp;\\u003C/span\\u003E\",\"\",];\n                    q = true;\n                }\n                 else r = [0,\"\",\"\",];\n            ;\n            }\n        ;\n            p.innerHTML = ((r[1] + n) + r[2]);\n            while (r[0]--) {\n                p = p.lastChild;;\n            };\n            if (q) {\n                p.removeChild(p.firstChild);\n            };\n            (p.className != \"__WRAPPER\");\n            if (h.ie()) {\n                var s;\n                if ((!o.indexOf(\"\\u003Ctable\") && (-1 == o.indexOf(\"\\u003Ctbody\")))) {\n                    s = (p.firstChild && p.firstChild.childNodes);\n                }\n                 else if (((r[1] == \"\\u003Ctable\\u003E\") && (-1 == o.indexOf(\"\\u003Ctbody\")))) {\n                    s = p.childNodes;\n                }\n                 else s = [];\n                \n            ;\n                for (var t = (s.length - 1); (t >= 0); --t) {\n                    if (((s[t].nodeName && (s[t].nodeName.toLowerCase() == \"tbody\")) && (s[t].childNodes.length == 0))) {\n                        s[t].parentNode.removeChild(s[t]);\n                    };\n                };\n            }\n        ;\n            var u = p.getElementsByTagName(\"script\"), v = [];\n            for (var w = 0; (w < u.length); w++) {\n                if (u[w].src) {\n                    v.push(g.requestJSResource.bind(g, u[w].src));\n                }\n                 else v.push(l.bind(null, u[w].innerHTML));\n            ;\n            };\n            for (var w = (u.length - 1); (w >= 0); w--) {\n                u[w].parentNode.removeChild(u[w]);;\n            };\n            var x = function() {\n                for (var y = 0; (y < v.length); y++) {\n                    v[y]();;\n                };\n            };\n            this._nodes = j(p.childNodes);\n            this._inline_js = x;\n        }\n    });\n    e.exports = m;\n});\n__d(\"isScalar\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/string|number|boolean/).test(typeof h);\n    };\n    e.exports = g;\n});\n__d(\"Intl\", [], function(a, b, c, d, e, f) {\n    var g;\n    function h(j) {\n        if ((typeof j != \"string\")) {\n            return false\n        };\n        return j.match(new RegExp(((((((((((((((((((((((((((h.punct_char_class + \"[\") + \")\\\"\") + \"'\") + \"\\u00bb\") + \"\\u0f3b\") + \"\\u0f3d\") + \"\\u2019\") + \"\\u201d\") + \"\\u203a\") + \"\\u3009\") + \"\\u300b\") + \"\\u300d\") + \"\\u300f\") + \"\\u3011\") + \"\\u3015\") + \"\\u3017\") + \"\\u3019\") + \"\\u301b\") + \"\\u301e\") + \"\\u301f\") + \"\\ufd3f\") + \"\\uff07\") + \"\\uff09\") + \"\\uff3d\") + \"\\\\s\") + \"]*$\")));\n    };\n    h.punct_char_class = (((((((((((\"[\" + \".!?\") + \"\\u3002\") + \"\\uff01\") + \"\\uff1f\") + \"\\u0964\") + \"\\u2026\") + \"\\u0eaf\") + \"\\u1801\") + \"\\u0e2f\") + \"\\uff0e\") + \"]\");\n    function i(j) {\n        if (g) {\n            var k = [], l = [];\n            for (var m in g.patterns) {\n                var n = g.patterns[m];\n                for (var o in g.meta) {\n                    var p = new RegExp(o.slice(1, -1), \"g\"), q = g.meta[o];\n                    m = m.replace(p, q);\n                    n = n.replace(p, q);\n                };\n                k.push(m);\n                l.push(n);\n            };\n            for (var r = 0; (r < k.length); r++) {\n                var s = new RegExp(k[r].slice(1, -1), \"g\");\n                if ((l[r] == \"javascript\")) {\n                    j.replace(s, function(t) {\n                        return t.slice(1).toLowerCase();\n                    });\n                }\n                 else j = j.replace(s, l[r]);\n            ;\n            };\n        }\n    ;\n        return j.replace(/\\x01/g, \"\");\n    };\n    e.exports = {\n        endsInPunct: h,\n        applyPhonologicalRules: i,\n        setPhonologicalRules: function(j) {\n            g = j;\n        }\n    };\n});\n__d(\"substituteTokens\", [\"invariant\",\"Intl\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"Intl\");\n    function i(j, k) {\n        if (!k) {\n            return j\n        };\n        g((typeof k === \"object\"));\n        var l = ((\"\\\\{([^}]+)\\\\}(\" + h.endsInPunct.punct_char_class) + \"*)\"), m = new RegExp(l, \"g\"), n = [], o = j.replace(m, function(r, s, t) {\n            var u = k[s];\n            if ((u && (typeof u === \"object\"))) {\n                n.push(u);\n                return (\"\\u0017\" + t);\n            }\n        ;\n            return (u + ((h.endsInPunct(u) ? \"\" : t)));\n        }).split(\"\\u0017\").map(h.applyPhonologicalRules);\n        if ((o.length === 1)) {\n            return o[0]\n        };\n        var p = [o[0],];\n        for (var q = 0; (q < n.length); q++) {\n            p.push(n[q], o[(q + 1)]);;\n        };\n        return p;\n    };\n    e.exports = i;\n});\n__d(\"tx\", [\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"substituteTokens\");\n    function h(i, j) {\n        if ((typeof _string_table == \"undefined\")) {\n            return\n        };\n        i = _string_table[i];\n        return g(i, j);\n    };\n    h._ = g;\n    e.exports = h;\n});\n__d(\"DOM\", [\"function-extensions\",\"DOMQuery\",\"Event\",\"HTML\",\"UserAgent\",\"$\",\"copyProperties\",\"createArrayFrom\",\"isScalar\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Event\"), i = b(\"HTML\"), j = b(\"UserAgent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"isScalar\"), o = b(\"tx\"), p = \"js_\", q = 0, r = {\n    };\n    l(r, g);\n    l(r, {\n        create: function(u, v, w) {\n            var x = document.createElement(u);\n            if (v) {\n                r.setAttributes(x, v);\n            };\n            if ((w != null)) {\n                r.setContent(x, w);\n            };\n            return x;\n        },\n        setAttributes: function(u, v) {\n            if (v.type) {\n                u.type = v.type;\n            };\n            for (var w in v) {\n                var x = v[w], y = (/^on/i).test(w);\n                if ((w == \"type\")) {\n                    continue;\n                }\n                 else if ((w == \"style\")) {\n                    if ((typeof x == \"string\")) {\n                        u.style.cssText = x;\n                    }\n                     else l(u.style, x);\n                ;\n                }\n                 else if (y) {\n                    h.listen(u, w.substr(2), x);\n                }\n                 else if ((w in u)) {\n                    u[w] = x;\n                }\n                 else if (u.setAttribute) {\n                    u.setAttribute(w, x);\n                }\n                \n                \n                \n            ;\n            };\n        },\n        prependContent: function(u, v) {\n            return s(v, u, function(w) {\n                (u.firstChild ? u.insertBefore(w, u.firstChild) : u.appendChild(w));\n            });\n        },\n        insertAfter: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                (u.nextSibling ? w.insertBefore(x, u.nextSibling) : w.appendChild(x));\n            });\n        },\n        insertBefore: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.insertBefore(x, u);\n            });\n        },\n        setContent: function(u, v) {\n            r.empty(u);\n            return r.appendContent(u, v);\n        },\n        appendContent: function(u, v) {\n            return s(v, u, function(w) {\n                u.appendChild(w);\n            });\n        },\n        replace: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.replaceChild(x, u);\n            });\n        },\n        remove: function(u) {\n            u = k(u);\n            if (u.parentNode) {\n                u.parentNode.removeChild(u);\n            };\n        },\n        empty: function(u) {\n            u = k(u);\n            while (u.firstChild) {\n                r.remove(u.firstChild);;\n            };\n        },\n        getID: function(u) {\n            var v = u.id;\n            if (!v) {\n                v = (p + q++);\n                u.id = v;\n            }\n        ;\n            return v;\n        }\n    });\n    function s(u, v, w) {\n        u = i.replaceJSONWrapper(u);\n        if ((((u instanceof i) && (\"\" === v.innerHTML)) && (-1 === u.toString().indexOf((\"\\u003Cscr\" + \"ipt\"))))) {\n            var x = j.ie();\n            if ((!x || (((x > 7) && !g.isNodeOfType(v, [\"table\",\"tbody\",\"thead\",\"tfoot\",\"tr\",\"select\",\"fieldset\",]))))) {\n                var y = (x ? \"\\u003Cem style=\\\"display:none;\\\"\\u003E&nbsp;\\u003C/em\\u003E\" : \"\");\n                v.innerHTML = (y + u);\n                (x && v.removeChild(v.firstChild));\n                return m(v.childNodes);\n            }\n        ;\n        }\n         else if (g.isTextNode(v)) {\n            v.data = u;\n            return [u,];\n        }\n        \n    ;\n        var z = document.createDocumentFragment(), aa, ba = [], ca = [];\n        u = m(u);\n        for (var da = 0; (da < u.length); da++) {\n            aa = i.replaceJSONWrapper(u[da]);\n            if ((aa instanceof i)) {\n                ca.push(aa.getAction());\n                var ea = aa.getNodes();\n                for (var fa = 0; (fa < ea.length); fa++) {\n                    ba.push(ea[fa]);\n                    z.appendChild(ea[fa]);\n                };\n            }\n             else if (n(aa)) {\n                var ga = document.createTextNode(aa);\n                ba.push(ga);\n                z.appendChild(ga);\n            }\n             else if (g.isNode(aa)) {\n                ba.push(aa);\n                z.appendChild(aa);\n            }\n            \n            \n        ;\n        };\n        w(z);\n        ca.forEach(function(ha) {\n            ha();\n        });\n        return ba;\n    };\n    function t(u) {\n        function v(w) {\n            return r.create(\"div\", {\n            }, w).innerHTML;\n        };\n        return function(w, x) {\n            var y = {\n            };\n            if (x) {\n                for (var z in x) {\n                    y[z] = v(x[z]);;\n                }\n            };\n            return i(u(w, y));\n        };\n    };\n    r.tx = t(o);\n    r.tx._ = r._tx = t(o._);\n    e.exports = r;\n});\n__d(\"LinkshimAsyncLink\", [\"$\",\"AsyncSignal\",\"DOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncSignal\"), i = b(\"DOM\"), j = b(\"UserAgent\"), k = {\n        swap: function(l, m) {\n            var n = (j.ie() <= 8);\n            if (n) {\n                var o = i.create(\"wbr\", {\n                }, null);\n                i.appendContent(l, o);\n            }\n        ;\n            l.href = m;\n            if (n) {\n                i.remove(o);\n            };\n        },\n        referrer_log: function(l, m, n) {\n            var o = g(\"meta_referrer\");\n            o.content = \"origin\";\n            k.swap(l, m);\n            (function() {\n                o.content = \"default\";\n                new h(n, {\n                }).send();\n            }).defer(100);\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:dom-asynclinkshim\", [\"LinkshimAsyncLink\",], function(a, b, c, d) {\n    a.LinkshimAsyncLink = b(\"LinkshimAsyncLink\");\n}, 3);\n__d(\"debounce\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k) {\n        if ((i == null)) {\n            i = 100;\n        };\n        var l;\n        function m(n, o, p, q, r) {\n            m.reset();\n            l = setTimeout(function() {\n                h.call(j, n, o, p, q, r);\n            }, i, !k);\n        };\n        m.reset = function() {\n            clearTimeout(l);\n        };\n        return m;\n    };\n    e.exports = g;\n});\n__d(\"LitestandViewportHeight\", [\"Arbiter\",\"CSS\",\"Event\",\"cx\",\"debounce\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"cx\"), k = b(\"debounce\"), l = b(\"emptyFunction\"), m, n = {\n        SMALL: \"small\",\n        NORMAL: \"normal\",\n        LARGE: \"large\",\n        getSize: function() {\n            if ((m === \"-cx-PUBLIC-litestandViewportSize__small\")) {\n                return n.SMALL\n            };\n            if ((m === \"-cx-PUBLIC-litestandViewportSize__large\")) {\n                return n.LARGE\n            };\n            return n.NORMAL;\n        },\n        init: function(o) {\n            n.init = l;\n            var p = k(function() {\n                var q = document.documentElement, r = q.clientHeight, s;\n                if ((r <= o.max_small_height)) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__small\";\n                }\n                 else if ((r >= o.min_large_height)) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__large\";\n                }\n            ;\n                if ((s !== m)) {\n                    (m && h.removeClass(q, m));\n                    m = s;\n                    (m && h.addClass(q, m));\n                    g.inform(\"ViewportSizeChange\");\n                }\n            ;\n            });\n            p();\n            i.listen(window, \"resize\", p);\n        }\n    };\n    e.exports = n;\n});\n__d(\"JSLogger\", [], function(a, b, c, d, e, f) {\n    var g = {\n        MAX_HISTORY: 500,\n        counts: {\n        },\n        categories: {\n        },\n        seq: 0,\n        pageId: (((Math.random() * 2147483648) | 0)).toString(36),\n        forwarding: false\n    };\n    function h(l) {\n        if (((l instanceof Error) && a.ErrorUtils)) {\n            l = a.ErrorUtils.normalizeError(l);\n        };\n        try {\n            return JSON.stringify(l);\n        } catch (m) {\n            return \"{}\";\n        };\n    };\n    function i(l, event, m) {\n        if (!g.counts[l]) {\n            g.counts[l] = {\n            };\n        };\n        if (!g.counts[l][event]) {\n            g.counts[l][event] = 0;\n        };\n        m = ((m == null) ? 1 : Number(m));\n        g.counts[l][event] += (isFinite(m) ? m : 0);\n    };\n    g.logAction = function(event, l, m) {\n        if ((this.type == \"bump\")) {\n            i(this.cat, event, l);\n        }\n         else if ((this.type == \"rate\")) {\n            ((l && i(this.cat, (event + \"_n\"), m)));\n            i(this.cat, (event + \"_d\"), m);\n        }\n         else {\n            var n = {\n                cat: this.cat,\n                type: this.type,\n                event: event,\n                data: ((l != null) ? h(l) : null),\n                date: Date.now(),\n                seq: g.seq++\n            };\n            g.head = (g.head ? (g.head.next = n) : (g.tail = n));\n            while (((g.head.seq - g.tail.seq) > g.MAX_HISTORY)) {\n                g.tail = g.tail.next;;\n            };\n            return n;\n        }\n        \n    ;\n    };\n    function j(l) {\n        if (!g.categories[l]) {\n            g.categories[l] = {\n            };\n            var m = function(n) {\n                var o = {\n                    cat: l,\n                    type: n\n                };\n                g.categories[l][n] = function() {\n                    g.forwarding = false;\n                    var p = null;\n                    if ((document.domain != \"facebook.com\")) {\n                        return\n                    };\n                    p = g.logAction;\n                    if (/^\\/+(dialogs|plugins?)\\//.test(location.pathname)) {\n                        g.forwarding = false;\n                    }\n                     else try {\n                        p = a.top.require(\"JSLogger\")._.logAction;\n                        g.forwarding = (p !== g.logAction);\n                    } catch (q) {\n                    \n                    }\n                ;\n                    ((p && p.apply(o, arguments)));\n                };\n            };\n            m(\"debug\");\n            m(\"log\");\n            m(\"warn\");\n            m(\"error\");\n            m(\"bump\");\n            m(\"rate\");\n        }\n    ;\n        return g.categories[l];\n    };\n    function k(l, m) {\n        var n = [];\n        for (var o = (m || g.tail); o; o = o.next) {\n            if ((!l || l(o))) {\n                var p = {\n                    type: o.type,\n                    cat: o.cat,\n                    date: o.date,\n                    event: o.event,\n                    seq: o.seq\n                };\n                if (o.data) {\n                    p.data = JSON.parse(o.data);\n                };\n                n.push(p);\n            }\n        ;\n        };\n        return n;\n    };\n    e.exports = {\n        _: g,\n        DUMP_EVENT: \"jslogger/dump\",\n        create: j,\n        getEntries: k\n    };\n});\n__d(\"startsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = String(h);\n        j = Math.min(Math.max((j || 0), 0), k.length);\n        return (k.lastIndexOf(String(i), j) === j);\n    };\n    e.exports = g;\n});\n__d(\"getContextualParent\", [\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\");\n    function h(i, j) {\n        var k, l = false;\n        do {\n            if ((i.getAttribute && (k = i.getAttribute(\"data-ownerid\")))) {\n                i = g(k);\n                l = true;\n            }\n             else i = i.parentNode;\n        ;\n        } while (((j && i) && !l));\n        return i;\n    };\n    e.exports = h;\n});\n__d(\"Nectar\", [\"Env\",\"startsWith\",\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"startsWith\"), i = b(\"getContextualParent\");\n    function j(m) {\n        if (!m.nctr) {\n            m.nctr = {\n            };\n        };\n    };\n    function k(m) {\n        if ((g.module || !m)) {\n            return g.module\n        };\n        var n = {\n            fbpage_fan_confirm: true,\n            photos_snowlift: true\n        }, o;\n        while ((m && m.getAttributeNode)) {\n            var p = ((m.getAttributeNode(\"id\") || {\n            })).value;\n            if (h(p, \"pagelet_\")) {\n                return p\n            };\n            if ((!o && n[p])) {\n                o = p;\n            };\n            m = i(m);\n        };\n        return o;\n    };\n    var l = {\n        addModuleData: function(m, n) {\n            var o = k(n);\n            if (o) {\n                j(m);\n                m.nctr._mod = o;\n            }\n        ;\n        },\n        addImpressionID: function(m) {\n            if (g.impid) {\n                j(m);\n                m.nctr._impid = g.impid;\n            }\n        ;\n        }\n    };\n    e.exports = l;\n});\n__d(\"AsyncResponse\", [\"Bootloader\",\"Env\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Env\"), i = b(\"copyProperties\"), j = b(\"tx\");\n    function k(l, m) {\n        i(this, {\n            error: 0,\n            errorSummary: null,\n            errorDescription: null,\n            onload: null,\n            replay: false,\n            payload: (m || null),\n            request: (l || null),\n            silentError: false,\n            transientError: false,\n            is_last: true\n        });\n        return this;\n    };\n    i(k, {\n        defaultErrorHandler: function(l) {\n            try {\n                if (!l.silentError) {\n                    k.verboseErrorHandler(l);\n                }\n                 else l.logErrorByGroup(\"silent\", 10);\n            ;\n            } catch (m) {\n                alert(l);\n            };\n        },\n        verboseErrorHandler: function(l) {\n            try {\n                var n = l.getErrorSummary(), o = l.getErrorDescription();\n                l.logErrorByGroup(\"popup\", 10);\n                if ((l.silentError && (o === \"\"))) {\n                    o = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n                };\n                g.loadModules([\"Dialog\",], function(p) {\n                    new p().setTitle(n).setBody(o).setButtons([p.OK,]).setModal(true).setCausalElement(this.relativeTo).show();\n                });\n            } catch (m) {\n                alert(l);\n            };\n        }\n    });\n    i(k.prototype, {\n        getRequest: function() {\n            return this.request;\n        },\n        getPayload: function() {\n            return this.payload;\n        },\n        getError: function() {\n            return this.error;\n        },\n        getErrorSummary: function() {\n            return this.errorSummary;\n        },\n        setErrorSummary: function(l) {\n            l = (((l === undefined) ? null : l));\n            this.errorSummary = l;\n            return this;\n        },\n        getErrorDescription: function() {\n            return this.errorDescription;\n        },\n        getErrorIsWarning: function() {\n            return !!this.errorIsWarning;\n        },\n        isTransient: function() {\n            return !!this.transientError;\n        },\n        logError: function(l, m) {\n            var n = a.ErrorSignal;\n            if (n) {\n                var o = {\n                    err_code: this.error,\n                    vip: ((h.vip || \"-\"))\n                };\n                if (m) {\n                    o.duration = m.duration;\n                    o.xfb_ip = m.xfb_ip;\n                }\n            ;\n                var p = this.request.getURI();\n                o.path = (p || \"-\");\n                o.aid = this.request.userActionID;\n                if ((p && (p.indexOf(\"scribe_endpoint.php\") != -1))) {\n                    l = \"async_error_double\";\n                };\n                n.sendErrorSignal(l, JSON.stringify(o));\n            }\n        ;\n        },\n        logErrorByGroup: function(l, m) {\n            if ((Math.floor((Math.random() * m)) === 0)) {\n                if (((this.error == 1357010) || (this.error < 15000))) {\n                    this.logError((\"async_error_oops_\" + l));\n                }\n                 else this.logError((\"async_error_logic_\" + l));\n            \n            };\n        }\n    });\n    e.exports = k;\n});\n__d(\"HTTPErrors\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = {\n        get: g,\n        getAll: g\n    };\n    e.exports = h;\n});\n__d(\"bind\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = Array.prototype.slice.call(arguments, 2);\n        if ((typeof i != \"string\")) {\n            return Function.prototype.bind.apply(i, [h,].concat(j))\n        };\n        function k() {\n            var l = j.concat(Array.prototype.slice.call(arguments));\n            if (h[i]) {\n                return h[i].apply(h, l)\n            };\n        };\n        k.toString = function() {\n            return (\"bound lazily: \" + h[i]);\n        };\n        return k;\n    };\n    e.exports = g;\n});\n__d(\"executeAfter\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return function() {\n            h.apply((j || this), arguments);\n            i.apply((j || this), arguments);\n        };\n    };\n    e.exports = g;\n});\n__d(\"AsyncRequest\", [\"Arbiter\",\"AsyncResponse\",\"Bootloader\",\"CSS\",\"Env\",\"ErrorUtils\",\"Event\",\"HTTPErrors\",\"JSCC\",\"Parent\",\"Run\",\"ServerJS\",\"URI\",\"UserAgent\",\"XHR\",\"asyncCallback\",\"bind\",\"copyProperties\",\"emptyFunction\",\"evalGlobal\",\"ge\",\"goURI\",\"isEmpty\",\"ix\",\"tx\",\"executeAfter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncResponse\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"Env\"), l = b(\"ErrorUtils\"), m = b(\"Event\"), n = b(\"HTTPErrors\"), o = b(\"JSCC\"), p = b(\"Parent\"), q = b(\"Run\"), r = b(\"ServerJS\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"XHR\"), v = b(\"asyncCallback\"), w = b(\"bind\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"evalGlobal\"), aa = b(\"ge\"), ba = b(\"goURI\"), ca = b(\"isEmpty\"), da = b(\"ix\"), ea = b(\"tx\"), fa = b(\"executeAfter\");\n    function ga() {\n        try {\n            return !window.loaded;\n        } catch (pa) {\n            return true;\n        };\n    };\n    function ha(pa) {\n        return (((\"upload\" in pa)) && ((\"onprogress\" in pa.upload)));\n    };\n    function ia(pa) {\n        return (\"withCredentials\" in pa);\n    };\n    function ja(pa) {\n        return (pa.status in {\n            0: 1,\n            12029: 1,\n            12030: 1,\n            12031: 1,\n            12152: 1\n        });\n    };\n    function ka(pa) {\n        var qa = (!pa || (typeof (pa) === \"function\"));\n        return qa;\n    };\n    var la = 2, ma = la;\n    g.subscribe(\"page_transition\", function(pa, qa) {\n        ma = qa.id;\n    });\n    function na(pa) {\n        x(this, {\n            transport: null,\n            method: \"POST\",\n            uri: \"\",\n            timeout: null,\n            timer: null,\n            initialHandler: y,\n            handler: null,\n            uploadProgressHandler: null,\n            errorHandler: null,\n            transportErrorHandler: null,\n            timeoutHandler: null,\n            interceptHandler: y,\n            finallyHandler: y,\n            abortHandler: y,\n            serverDialogCancelHandler: null,\n            relativeTo: null,\n            statusElement: null,\n            statusClass: \"\",\n            data: {\n            },\n            file: null,\n            context: {\n            },\n            readOnly: false,\n            writeRequiredParams: [],\n            remainingRetries: 0,\n            userActionID: \"-\"\n        });\n        this.option = {\n            asynchronous: true,\n            suppressErrorHandlerWarning: false,\n            suppressEvaluation: false,\n            suppressErrorAlerts: false,\n            retries: 0,\n            jsonp: false,\n            bundle: false,\n            useIframeTransport: false,\n            handleErrorAfterUnload: false\n        };\n        this.errorHandler = h.defaultErrorHandler;\n        this.transportErrorHandler = w(this, \"errorHandler\");\n        if ((pa !== undefined)) {\n            this.setURI(pa);\n        };\n    };\n    x(na, {\n        bootstrap: function(pa, qa, ra) {\n            var sa = \"GET\", ta = true, ua = {\n            };\n            if ((ra || (qa && ((qa.rel == \"async-post\"))))) {\n                sa = \"POST\";\n                ta = false;\n                if (pa) {\n                    pa = s(pa);\n                    ua = pa.getQueryData();\n                    pa.setQueryData({\n                    });\n                }\n            ;\n            }\n        ;\n            var va = (p.byClass(qa, \"stat_elem\") || qa);\n            if ((va && j.hasClass(va, \"async_saving\"))) {\n                return false\n            };\n            var wa = new na(pa).setReadOnly(ta).setMethod(sa).setData(ua).setNectarModuleDataSafe(qa).setRelativeTo(qa);\n            if (qa) {\n                wa.setHandler(function(ya) {\n                    m.fire(qa, \"success\", {\n                        response: ya\n                    });\n                });\n                wa.setErrorHandler(function(ya) {\n                    if ((m.fire(qa, \"error\", {\n                        response: ya\n                    }) !== false)) {\n                        h.defaultErrorHandler(ya);\n                    };\n                });\n            }\n        ;\n            if (va) {\n                wa.setStatusElement(va);\n                var xa = va.getAttribute(\"data-status-class\");\n                (xa && wa.setStatusClass(xa));\n            }\n        ;\n            if (qa) {\n                m.fire(qa, \"AsyncRequest/send\", {\n                    request: wa\n                });\n            };\n            wa.send();\n            return false;\n        },\n        post: function(pa, qa) {\n            new na(pa).setReadOnly(false).setMethod(\"POST\").setData(qa).send();\n            return false;\n        },\n        getLastID: function() {\n            return la;\n        },\n        suppressOnloadToken: {\n        },\n        _inflight: [],\n        _inflightCount: 0,\n        _inflightAdd: y,\n        _inflightPurge: y,\n        getInflightCount: function() {\n            return this._inflightCount;\n        },\n        _inflightEnable: function() {\n            if (t.ie()) {\n                x(na, {\n                    _inflightAdd: function(pa) {\n                        this._inflight.push(pa);\n                    },\n                    _inflightPurge: function() {\n                        na._inflight = na._inflight.filter(function(pa) {\n                            return (pa.transport && (pa.transport.readyState < 4));\n                        });\n                    }\n                });\n                q.onUnload(function() {\n                    na._inflight.forEach(function(pa) {\n                        if ((pa.transport && (pa.transport.readyState < 4))) {\n                            pa.transport.abort();\n                            delete pa.transport;\n                        }\n                    ;\n                    });\n                });\n            }\n        ;\n        }\n    });\n    x(na.prototype, {\n        _dispatchResponse: function(pa) {\n            this.clearStatusIndicator();\n            if (!this._isRelevant()) {\n                this._invokeErrorHandler(1010);\n                return;\n            }\n        ;\n            if ((this.initialHandler(pa) === false)) {\n                return\n            };\n            clearTimeout(this.timer);\n            if (pa.jscc_map) {\n                var qa = (eval)(pa.jscc_map);\n                o.init(qa);\n            }\n        ;\n            var ra;\n            if (this.handler) {\n                try {\n                    ra = this._shouldSuppressJS(this.handler(pa));\n                } catch (sa) {\n                    (pa.is_last && this.finallyHandler(pa));\n                    throw sa;\n                }\n            };\n            if (!ra) {\n                this._handleJSResponse(pa);\n            };\n            (pa.is_last && this.finallyHandler(pa));\n        },\n        _shouldSuppressJS: function(pa) {\n            return (pa === na.suppressOnloadToken);\n        },\n        _handleJSResponse: function(pa) {\n            var qa = this.getRelativeTo(), ra = pa.domops, sa = pa.jsmods, ta = new r().setRelativeTo(qa), ua;\n            if ((sa && sa.require)) {\n                ua = sa.require;\n                delete sa.require;\n            }\n        ;\n            if (sa) {\n                ta.handle(sa);\n            };\n            var va = function(wa) {\n                if ((ra && wa)) {\n                    wa.invoke(ra, qa);\n                };\n                if (ua) {\n                    ta.handle({\n                        require: ua\n                    });\n                };\n                this._handleJSRegisters(pa, \"onload\");\n                if (this.lid) {\n                    g.inform(\"tti_ajax\", {\n                        s: this.lid,\n                        d: [(this._sendTimeStamp || 0),(((this._sendTimeStamp && this._responseTime)) ? ((this._responseTime - this._sendTimeStamp)) : 0),]\n                    }, g.BEHAVIOR_EVENT);\n                };\n                this._handleJSRegisters(pa, \"onafterload\");\n                ta.cleanup();\n            }.bind(this);\n            if (ra) {\n                i.loadModules([\"AsyncDOM\",], va);\n            }\n             else va(null);\n        ;\n        },\n        _handleJSRegisters: function(pa, qa) {\n            var ra = pa[qa];\n            if (ra) {\n                for (var sa = 0; (sa < ra.length); sa++) {\n                    l.applyWithGuard(new Function(ra[sa]), this);;\n                }\n            };\n        },\n        invokeResponseHandler: function(pa) {\n            if ((typeof (pa.redirect) !== \"undefined\")) {\n                (function() {\n                    this.setURI(pa.redirect).send();\n                }).bind(this).defer();\n                return;\n            }\n        ;\n            if (((!this.handler && !this.errorHandler) && !this.transportErrorHandler)) {\n                return\n            };\n            var qa = pa.asyncResponse;\n            if ((typeof (qa) !== \"undefined\")) {\n                if (!this._isRelevant()) {\n                    this._invokeErrorHandler(1010);\n                    return;\n                }\n            ;\n                if (qa.inlinejs) {\n                    z(qa.inlinejs);\n                };\n                if (qa.lid) {\n                    this._responseTime = Date.now();\n                    if (a.CavalryLogger) {\n                        this.cavalry = a.CavalryLogger.getInstance(qa.lid);\n                    };\n                    this.lid = qa.lid;\n                }\n            ;\n                if (qa.resource_map) {\n                    i.setResourceMap(qa.resource_map);\n                };\n                if (qa.bootloadable) {\n                    i.enableBootload(qa.bootloadable);\n                };\n                da.add(qa.ixData);\n                var ra, sa;\n                if ((qa.getError() && !qa.getErrorIsWarning())) {\n                    var ta = this.errorHandler.bind(this);\n                    ra = l.guard(this._dispatchErrorResponse, (\"AsyncRequest#_dispatchErrorResponse for \" + this.getURI()));\n                    ra = ra.bind(this, qa, ta);\n                    sa = \"error\";\n                }\n                 else {\n                    ra = l.guard(this._dispatchResponse, (\"AsyncRequest#_dispatchResponse for \" + this.getURI()));\n                    ra = ra.bind(this, qa);\n                    sa = \"response\";\n                }\n            ;\n                ra = fa(ra, function() {\n                    g.inform((\"AsyncRequest/\" + sa), {\n                        request: this,\n                        response: qa\n                    });\n                }.bind(this));\n                ra = ra.defer.bind(ra);\n                var ua = false;\n                if (this.preBootloadHandler) {\n                    ua = this.preBootloadHandler(qa);\n                };\n                qa.css = (qa.css || []);\n                qa.js = (qa.js || []);\n                i.loadResources(qa.css.concat(qa.js), ra, ua, this.getURI());\n            }\n             else if ((typeof (pa.transportError) !== \"undefined\")) {\n                if (this._xFbServer) {\n                    this._invokeErrorHandler(1008);\n                }\n                 else this._invokeErrorHandler(1012);\n            ;\n            }\n             else this._invokeErrorHandler(1007);\n            \n        ;\n        },\n        _invokeErrorHandler: function(pa) {\n            var qa;\n            if ((this.responseText === \"\")) {\n                qa = 1002;\n            }\n             else if (this._requestAborted) {\n                qa = 1011;\n            }\n             else {\n                try {\n                    qa = ((pa || this.transport.status) || 1004);\n                } catch (ra) {\n                    qa = 1005;\n                };\n                if ((false === navigator.onLine)) {\n                    qa = 1006;\n                };\n            }\n            \n        ;\n            var sa, ta, ua = true;\n            if ((qa === 1006)) {\n                ta = \"No Network Connection\";\n                sa = \"Your browser appears to be offline. Please check your internet connection and try again.\";\n            }\n             else if (((qa >= 300) && (qa <= 399))) {\n                ta = \"Redirection\";\n                sa = \"Your access to Facebook was redirected or blocked by a third party at this time, please contact your ISP or reload. \";\n                var va = this.transport.getResponseHeader(\"Location\");\n                if (va) {\n                    ba(va, true);\n                };\n                ua = true;\n            }\n             else {\n                ta = \"Oops\";\n                sa = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n            }\n            \n        ;\n            var wa = new h(this);\n            x(wa, {\n                error: qa,\n                errorSummary: ta,\n                errorDescription: sa,\n                silentError: ua\n            });\n            (function() {\n                g.inform(\"AsyncRequest/error\", {\n                    request: this,\n                    response: wa\n                });\n            }).bind(this).defer();\n            if ((ga() && !this.getOption(\"handleErrorAfterUnload\"))) {\n                return\n            };\n            if (!this.transportErrorHandler) {\n                return\n            };\n            var xa = this.transportErrorHandler.bind(this);\n            !this.getOption(\"suppressErrorAlerts\");\n            l.applyWithGuard(this._dispatchErrorResponse, this, [wa,xa,]);\n        },\n        _dispatchErrorResponse: function(pa, qa) {\n            var ra = pa.getError();\n            this.clearStatusIndicator();\n            var sa = (this._sendTimeStamp && {\n                duration: (Date.now() - this._sendTimeStamp),\n                xfb_ip: (this._xFbServer || \"-\")\n            });\n            pa.logError(\"async_error\", sa);\n            if ((!this._isRelevant() || (ra === 1010))) {\n                this.abort();\n                return;\n            }\n        ;\n            if (((((ra == 1357008) || (ra == 1357007)) || (ra == 1442002)) || (ra == 1357001))) {\n                var ta = ((ra == 1357008) || (ra == 1357007));\n                this.interceptHandler(pa);\n                this._displayServerDialog(pa, ta);\n            }\n             else if ((this.initialHandler(pa) !== false)) {\n                clearTimeout(this.timer);\n                try {\n                    qa(pa);\n                } catch (ua) {\n                    this.finallyHandler(pa);\n                    throw ua;\n                };\n                this.finallyHandler(pa);\n            }\n            \n        ;\n        },\n        _displayServerDialog: function(pa, qa) {\n            var ra = pa.getPayload();\n            if ((ra.__dialog !== undefined)) {\n                this._displayServerLegacyDialog(pa, qa);\n                return;\n            }\n        ;\n            var sa = ra.__dialogx;\n            new r().handle(sa);\n            i.loadModules([\"ConfirmationDialog\",], function(ta) {\n                ta.setupConfirmation(pa, this);\n            }.bind(this));\n        },\n        _displayServerLegacyDialog: function(pa, qa) {\n            var ra = pa.getPayload().__dialog;\n            i.loadModules([\"Dialog\",], function(sa) {\n                var ta = new sa(ra);\n                if (qa) {\n                    ta.setHandler(this._displayConfirmationHandler.bind(this, ta));\n                };\n                ta.setCancelHandler(function() {\n                    var ua = this.getServerDialogCancelHandler();\n                    try {\n                        (ua && ua(pa));\n                    } catch (va) {\n                        throw va;\n                    } finally {\n                        this.finallyHandler(pa);\n                    };\n                }.bind(this)).setCausalElement(this.relativeTo).show();\n            }.bind(this));\n        },\n        _displayConfirmationHandler: function(pa) {\n            this.data.confirmed = 1;\n            x(this.data, pa.getFormData());\n            this.send();\n        },\n        setJSONPTransport: function(pa) {\n            pa.subscribe(\"response\", this._handleJSONPResponse.bind(this));\n            pa.subscribe(\"abort\", this._handleJSONPAbort.bind(this));\n            this.transport = pa;\n        },\n        _handleJSONPResponse: function(pa, qa) {\n            this.is_first = ((this.is_first === undefined));\n            var ra = this._interpretResponse(qa);\n            ra.asyncResponse.is_first = this.is_first;\n            ra.asyncResponse.is_last = this.transport.hasFinished();\n            this.invokeResponseHandler(ra);\n            if (this.transport.hasFinished()) {\n                delete this.transport;\n            };\n        },\n        _handleJSONPAbort: function() {\n            this._invokeErrorHandler();\n            delete this.transport;\n        },\n        _handleXHRResponse: function(pa) {\n            var qa;\n            if (this.getOption(\"suppressEvaluation\")) {\n                qa = {\n                    asyncResponse: new h(this, pa)\n                };\n            }\n             else {\n                var ra = pa.responseText, sa = null;\n                try {\n                    var ua = this._unshieldResponseText(ra);\n                    try {\n                        var va = (eval)(((\"(\" + ua) + \")\"));\n                        qa = this._interpretResponse(va);\n                    } catch (ta) {\n                        sa = \"excep\";\n                        qa = {\n                            transportError: (\"eval() failed on async to \" + this.getURI())\n                        };\n                    };\n                } catch (ta) {\n                    sa = \"empty\";\n                    qa = {\n                        transportError: ta.message\n                    };\n                };\n                if (sa) {\n                    var wa = a.ErrorSignal;\n                    (wa && wa.sendErrorSignal(\"async_xport_resp\", [(((this._xFbServer ? \"1008_\" : \"1012_\")) + sa),(this._xFbServer || \"-\"),this.getURI(),ra.length,ra.substr(0, 1600),].join(\":\")));\n                }\n            ;\n            }\n        ;\n            this.invokeResponseHandler(qa);\n        },\n        _unshieldResponseText: function(pa) {\n            var qa = \"for (;;);\", ra = qa.length;\n            if ((pa.length <= ra)) {\n                throw new Error((\"Response too short on async to \" + this.getURI()))\n            };\n            var sa = 0;\n            while (((pa.charAt(sa) == \" \") || (pa.charAt(sa) == \"\\u000a\"))) {\n                sa++;;\n            };\n            (sa && (pa.substring(sa, (sa + ra)) == qa));\n            return pa.substring((sa + ra));\n        },\n        _interpretResponse: function(pa) {\n            if (pa.redirect) {\n                return {\n                    redirect: pa.redirect\n                }\n            };\n            var qa = new h(this);\n            if ((pa.__ar != 1)) {\n                qa.payload = pa;\n            }\n             else x(qa, pa);\n        ;\n            return {\n                asyncResponse: qa\n            };\n        },\n        _onStateChange: function() {\n            try {\n                if ((this.transport.readyState == 4)) {\n                    na._inflightCount--;\n                    na._inflightPurge();\n                    try {\n                        if (((typeof (this.transport.getResponseHeader) !== \"undefined\") && this.transport.getResponseHeader(\"X-FB-Debug\"))) {\n                            this._xFbServer = this.transport.getResponseHeader(\"X-FB-Debug\");\n                        };\n                    } catch (qa) {\n                    \n                    };\n                    if (((this.transport.status >= 200) && (this.transport.status < 300))) {\n                        na.lastSuccessTime = Date.now();\n                        this._handleXHRResponse(this.transport);\n                    }\n                     else if ((t.webkit() && ((typeof (this.transport.status) == \"undefined\")))) {\n                        this._invokeErrorHandler(1002);\n                    }\n                     else if (((k.retry_ajax_on_network_error && ja(this.transport)) && (this.remainingRetries > 0))) {\n                        this.remainingRetries--;\n                        delete this.transport;\n                        this.send(true);\n                        return;\n                    }\n                     else this._invokeErrorHandler();\n                    \n                    \n                ;\n                    if ((this.getOption(\"asynchronous\") !== false)) {\n                        delete this.transport;\n                    };\n                }\n            ;\n            } catch (pa) {\n                if (ga()) {\n                    return\n                };\n                delete this.transport;\n                if ((this.remainingRetries > 0)) {\n                    this.remainingRetries--;\n                    this.send(true);\n                }\n                 else {\n                    !this.getOption(\"suppressErrorAlerts\");\n                    var ra = a.ErrorSignal;\n                    (ra && ra.sendErrorSignal(\"async_xport_resp\", [1007,(this._xFbServer || \"-\"),this.getURI(),pa.message,].join(\":\")));\n                    this._invokeErrorHandler(1007);\n                }\n            ;\n            };\n        },\n        _isMultiplexable: function() {\n            if ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))) {\n                return false\n            };\n            if (!this.uri.isFacebookURI()) {\n                return false\n            };\n            if (!this.getOption(\"asynchronous\")) {\n                return false\n            };\n            return true;\n        },\n        handleResponse: function(pa) {\n            var qa = this._interpretResponse(pa);\n            this.invokeResponseHandler(qa);\n        },\n        setMethod: function(pa) {\n            this.method = pa.toString().toUpperCase();\n            return this;\n        },\n        getMethod: function() {\n            return this.method;\n        },\n        setData: function(pa) {\n            this.data = pa;\n            return this;\n        },\n        _setDataHash: function() {\n            if (((this.method != \"POST\") || this.data.ttstamp)) {\n                return\n            };\n            if ((typeof this.data.fb_dtsg !== \"string\")) {\n                return\n            };\n            var pa = \"\";\n            for (var qa = 0; (qa < this.data.fb_dtsg.length); qa++) {\n                pa += this.data.fb_dtsg.charCodeAt(qa);;\n            };\n            this.data.ttstamp = (\"2\" + pa);\n        },\n        setRawData: function(pa) {\n            this.rawData = pa;\n            return this;\n        },\n        getData: function() {\n            return this.data;\n        },\n        setContextData: function(pa, qa, ra) {\n            ra = ((ra === undefined) ? true : ra);\n            if (ra) {\n                this.context[(\"_log_\" + pa)] = qa;\n            };\n            return this;\n        },\n        _setUserActionID: function() {\n            var pa = ((a.ArbiterMonitor && a.ArbiterMonitor.getUE()) || \"-\");\n            this.userActionID = (((((a.EagleEye && a.EagleEye.getSessionID()) || \"-\")) + \"/\") + pa);\n        },\n        setURI: function(pa) {\n            var qa = s(pa);\n            if ((this.getOption(\"useIframeTransport\") && !qa.isFacebookURI())) {\n                return this\n            };\n            if ((((!this._allowCrossOrigin && !this.getOption(\"jsonp\")) && !this.getOption(\"useIframeTransport\")) && !qa.isSameOrigin())) {\n                return this\n            };\n            this._setUserActionID();\n            if ((!pa || qa.isEmpty())) {\n                var ra = a.ErrorSignal, sa = a.getErrorStack;\n                if ((ra && sa)) {\n                    var ta = {\n                        err_code: 1013,\n                        vip: \"-\",\n                        duration: 0,\n                        xfb_ip: \"-\",\n                        path: window.location.href,\n                        aid: this.userActionID\n                    };\n                    ra.sendErrorSignal(\"async_error\", JSON.stringify(ta));\n                    ra.sendErrorSignal(\"async_xport_stack\", [1013,window.location.href,null,sa(),].join(\":\"));\n                }\n            ;\n                return this;\n            }\n        ;\n            this.uri = qa;\n            return this;\n        },\n        getURI: function() {\n            return this.uri.toString();\n        },\n        setInitialHandler: function(pa) {\n            this.initialHandler = pa;\n            return this;\n        },\n        setHandler: function(pa) {\n            if (ka(pa)) {\n                this.handler = pa;\n            };\n            return this;\n        },\n        getHandler: function() {\n            return this.handler;\n        },\n        setUploadProgressHandler: function(pa) {\n            if (ka(pa)) {\n                this.uploadProgressHandler = pa;\n            };\n            return this;\n        },\n        setErrorHandler: function(pa) {\n            if (ka(pa)) {\n                this.errorHandler = pa;\n            };\n            return this;\n        },\n        setTransportErrorHandler: function(pa) {\n            this.transportErrorHandler = pa;\n            return this;\n        },\n        getErrorHandler: function() {\n            return this.errorHandler;\n        },\n        getTransportErrorHandler: function() {\n            return this.transportErrorHandler;\n        },\n        setTimeoutHandler: function(pa, qa) {\n            if (ka(qa)) {\n                this.timeout = pa;\n                this.timeoutHandler = qa;\n            }\n        ;\n            return this;\n        },\n        resetTimeout: function(pa) {\n            if (!((this.timeoutHandler === null))) {\n                if ((pa === null)) {\n                    this.timeout = null;\n                    clearTimeout(this.timer);\n                    this.timer = null;\n                }\n                 else {\n                    var qa = !this._allowCrossPageTransition;\n                    this.timeout = pa;\n                    clearTimeout(this.timer);\n                    this.timer = this._handleTimeout.bind(this).defer(this.timeout, qa);\n                }\n            \n            };\n            return this;\n        },\n        _handleTimeout: function() {\n            this.abandon();\n            this.timeoutHandler(this);\n        },\n        setNewSerial: function() {\n            this.id = ++la;\n            return this;\n        },\n        setInterceptHandler: function(pa) {\n            this.interceptHandler = pa;\n            return this;\n        },\n        setFinallyHandler: function(pa) {\n            this.finallyHandler = pa;\n            return this;\n        },\n        setAbortHandler: function(pa) {\n            this.abortHandler = pa;\n            return this;\n        },\n        getServerDialogCancelHandler: function() {\n            return this.serverDialogCancelHandler;\n        },\n        setServerDialogCancelHandler: function(pa) {\n            this.serverDialogCancelHandler = pa;\n            return this;\n        },\n        setPreBootloadHandler: function(pa) {\n            this.preBootloadHandler = pa;\n            return this;\n        },\n        setReadOnly: function(pa) {\n            if (!((typeof (pa) != \"boolean\"))) {\n                this.readOnly = pa;\n            };\n            return this;\n        },\n        setFBMLForm: function() {\n            this.writeRequiredParams = [\"fb_sig\",];\n            return this;\n        },\n        getReadOnly: function() {\n            return this.readOnly;\n        },\n        setRelativeTo: function(pa) {\n            this.relativeTo = pa;\n            return this;\n        },\n        getRelativeTo: function() {\n            return this.relativeTo;\n        },\n        setStatusClass: function(pa) {\n            this.statusClass = pa;\n            return this;\n        },\n        setStatusElement: function(pa) {\n            this.statusElement = pa;\n            return this;\n        },\n        getStatusElement: function() {\n            return aa(this.statusElement);\n        },\n        _isRelevant: function() {\n            if (this._allowCrossPageTransition) {\n                return true\n            };\n            if (!this.id) {\n                return true\n            };\n            return (this.id > ma);\n        },\n        clearStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.removeClass(pa, \"async_saving\");\n                j.removeClass(pa, this.statusClass);\n            }\n        ;\n        },\n        addStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.addClass(pa, \"async_saving\");\n                j.addClass(pa, this.statusClass);\n            }\n        ;\n        },\n        specifiesWriteRequiredParams: function() {\n            return this.writeRequiredParams.every(function(pa) {\n                this.data[pa] = ((this.data[pa] || k[pa]) || ((aa(pa) || {\n                })).value);\n                if ((this.data[pa] !== undefined)) {\n                    return true\n                };\n                return false;\n            }, this);\n        },\n        setOption: function(pa, qa) {\n            if ((typeof (this.option[pa]) != \"undefined\")) {\n                this.option[pa] = qa;\n            };\n            return this;\n        },\n        getOption: function(pa) {\n            (typeof (this.option[pa]) == \"undefined\");\n            return this.option[pa];\n        },\n        abort: function() {\n            if (this.transport) {\n                var pa = this.getTransportErrorHandler();\n                this.setOption(\"suppressErrorAlerts\", true);\n                this.setTransportErrorHandler(y);\n                this._requestAborted = true;\n                this.transport.abort();\n                this.setTransportErrorHandler(pa);\n            }\n        ;\n            this.abortHandler();\n        },\n        abandon: function() {\n            clearTimeout(this.timer);\n            this.setOption(\"suppressErrorAlerts\", true).setHandler(y).setErrorHandler(y).setTransportErrorHandler(y);\n            if (this.transport) {\n                this._requestAborted = true;\n                this.transport.abort();\n            }\n        ;\n        },\n        setNectarData: function(pa) {\n            if (pa) {\n                if ((this.data.nctr === undefined)) {\n                    this.data.nctr = {\n                    };\n                };\n                x(this.data.nctr, pa);\n            }\n        ;\n            return this;\n        },\n        setNectarModuleDataSafe: function(pa) {\n            if (this.setNectarModuleData) {\n                this.setNectarModuleData(pa);\n            };\n            return this;\n        },\n        setNectarImpressionIdSafe: function() {\n            if (this.setNectarImpressionId) {\n                this.setNectarImpressionId();\n            };\n            return this;\n        },\n        setAllowCrossPageTransition: function(pa) {\n            this._allowCrossPageTransition = !!pa;\n            if (this.timer) {\n                this.resetTimeout(this.timeout);\n            };\n            return this;\n        },\n        setAllowCrossOrigin: function(pa) {\n            this._allowCrossOrigin = pa;\n            return this;\n        },\n        send: function(pa) {\n            pa = (pa || false);\n            if (!this.uri) {\n                return false\n            };\n            (!this.errorHandler && !this.getOption(\"suppressErrorHandlerWarning\"));\n            if ((this.getOption(\"jsonp\") && (this.method != \"GET\"))) {\n                this.setMethod(\"GET\");\n            };\n            if ((this.getOption(\"useIframeTransport\") && (this.method != \"GET\"))) {\n                this.setMethod(\"GET\");\n            };\n            ((this.timeoutHandler !== null) && ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))));\n            if (!this.getReadOnly()) {\n                this.specifiesWriteRequiredParams();\n                if ((this.method != \"POST\")) {\n                    return false\n                };\n            }\n        ;\n            x(this.data, u.getAsyncParams(this.method));\n            if (!ca(this.context)) {\n                x(this.data, this.context);\n                this.data.ajax_log = 1;\n            }\n        ;\n            if (k.force_param) {\n                x(this.data, k.force_param);\n            };\n            this._setUserActionID();\n            if ((this.getOption(\"bundle\") && this._isMultiplexable())) {\n                oa.schedule(this);\n                return true;\n            }\n        ;\n            this.setNewSerial();\n            if (!this.getOption(\"asynchronous\")) {\n                this.uri.addQueryData({\n                    __s: 1\n                });\n            };\n            this.finallyHandler = v(this.finallyHandler, \"final\");\n            var qa, ra;\n            if (((this.method == \"GET\") || this.rawData)) {\n                qa = this.uri.addQueryData(this.data).toString();\n                ra = (this.rawData || \"\");\n            }\n             else {\n                qa = this.uri.toString();\n                this._setDataHash();\n                ra = s.implodeQuery(this.data);\n            }\n        ;\n            if (this.transport) {\n                return false\n            };\n            if ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\"))) {\n                d([\"JSONPTransport\",], function(va) {\n                    var wa = new va((this.getOption(\"jsonp\") ? \"jsonp\" : \"iframe\"), this.uri);\n                    this.setJSONPTransport(wa);\n                    wa.send();\n                }.bind(this));\n                return true;\n            }\n        ;\n            var sa = u.create();\n            if (!sa) {\n                return false\n            };\n            sa.onreadystatechange = v(this._onStateChange.bind(this), \"xhr\");\n            if ((this.uploadProgressHandler && ha(sa))) {\n                sa.upload.onprogress = this.uploadProgressHandler.bind(this);\n            };\n            if (!pa) {\n                this.remainingRetries = this.getOption(\"retries\");\n            };\n            if ((a.ErrorSignal || a.ArbiterMonitor)) {\n                this._sendTimeStamp = (this._sendTimeStamp || Date.now());\n            };\n            this.transport = sa;\n            try {\n                this.transport.open(this.method, qa, this.getOption(\"asynchronous\"));\n            } catch (ta) {\n                return false;\n            };\n            var ua = k.svn_rev;\n            if (ua) {\n                this.transport.setRequestHeader(\"X-SVN-Rev\", String(ua));\n            };\n            if (((!this.uri.isSameOrigin() && !this.getOption(\"jsonp\")) && !this.getOption(\"useIframeTransport\"))) {\n                if (!ia(this.transport)) {\n                    return false\n                };\n                if (this.uri.isFacebookURI()) {\n                    this.transport.withCredentials = true;\n                };\n            }\n        ;\n            if (((this.method == \"POST\") && !this.rawData)) {\n                this.transport.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            };\n            g.inform(\"AsyncRequest/send\", {\n                request: this\n            });\n            this.addStatusIndicator();\n            this.transport.send(ra);\n            if ((this.timeout !== null)) {\n                this.resetTimeout(this.timeout);\n            };\n            na._inflightCount++;\n            na._inflightAdd(this);\n            return true;\n        }\n    });\n    function oa() {\n        this._requests = [];\n    };\n    x(oa, {\n        multiplex: null,\n        schedule: function(pa) {\n            if (!oa.multiplex) {\n                oa.multiplex = new oa();\n                (function() {\n                    oa.multiplex.send();\n                    oa.multiplex = null;\n                }).defer();\n            }\n        ;\n            oa.multiplex.add(pa);\n        }\n    });\n    x(oa.prototype, {\n        add: function(pa) {\n            this._requests.push(pa);\n        },\n        send: function() {\n            var pa = this._requests;\n            if (!pa.length) {\n                return\n            };\n            var qa;\n            if ((pa.length === 1)) {\n                qa = pa[0];\n            }\n             else {\n                var ra = pa.map(function(sa) {\n                    return [sa.uri.getPath(),s.implodeQuery(sa.data),];\n                });\n                qa = new na(\"/ajax/proxy.php\").setAllowCrossPageTransition(true).setData({\n                    data: ra\n                }).setHandler(this._handler.bind(this)).setTransportErrorHandler(this._transportErrorHandler.bind(this));\n            }\n        ;\n            qa.setOption(\"bundle\", false).send();\n        },\n        _handler: function(pa) {\n            var qa = pa.getPayload().responses;\n            if ((qa.length !== this._requests.length)) {\n                return\n            };\n            for (var ra = 0; (ra < this._requests.length); ra++) {\n                var sa = this._requests[ra], ta = sa.uri.getPath();\n                sa.id = this.id;\n                if ((qa[ra][0] !== ta)) {\n                    sa.invokeResponseHandler({\n                        transportError: (\"Wrong response order in bundled request to \" + ta)\n                    });\n                    continue;\n                }\n            ;\n                sa.handleResponse(qa[ra][1]);\n            };\n        },\n        _transportErrorHandler: function(pa) {\n            var qa = {\n                transportError: pa.errorDescription\n            }, ra = this._requests.map(function(sa) {\n                sa.id = this.id;\n                sa.invokeResponseHandler(qa);\n                return sa.uri.getPath();\n            });\n        }\n    });\n    e.exports = na;\n});\n__d(\"CookieCore\", [], function(a, b, c, d, e, f) {\n    var g = {\n        set: function(h, i, j, k, l) {\n            document.cookie = (((((((((h + \"=\") + encodeURIComponent(i)) + \"; \") + ((j ? ((\"expires=\" + (new Date((Date.now() + j))).toGMTString()) + \"; \") : \"\"))) + \"path=\") + ((k || \"/\"))) + \"; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")) + ((l ? \"; secure\" : \"\")));\n        },\n        clear: function(h, i) {\n            i = (i || \"/\");\n            document.cookie = (((((h + \"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; \") + \"path=\") + i) + \"; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        },\n        get: function(h) {\n            var i = document.cookie.match(((\"(?:^|;\\\\s*)\" + h) + \"=(.*?)(?:;|$)\"));\n            return ((i ? decodeURIComponent(i[1]) : i));\n        }\n    };\n    e.exports = g;\n});\n__d(\"Cookie\", [\"CookieCore\",\"Env\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CookieCore\"), h = b(\"Env\"), i = b(\"copyProperties\");\n    function j(l, m, n, o, p) {\n        if ((h.no_cookies && (l != \"tpa\"))) {\n            return\n        };\n        g.set(l, m, n, o, p);\n    };\n    var k = i({\n    }, g);\n    k.set = j;\n    e.exports = k;\n});\n__d(\"DOMControl\", [\"DataStore\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.root = h(k);\n        this.updating = false;\n        g.set(k, \"DOMControl\", this);\n    };\n    i(j.prototype, {\n        getRoot: function() {\n            return this.root;\n        },\n        beginUpdate: function() {\n            if (this.updating) {\n                return false\n            };\n            this.updating = true;\n            return true;\n        },\n        endUpdate: function() {\n            this.updating = false;\n        },\n        update: function(k) {\n            if (!this.beginUpdate()) {\n                return this\n            };\n            this.onupdate(k);\n            this.endUpdate();\n        },\n        onupdate: function(k) {\n        \n        }\n    });\n    j.getInstance = function(k) {\n        return g.get(k, \"DOMControl\");\n    };\n    e.exports = j;\n});\n__d(\"hyphenate\", [], function(a, b, c, d, e, f) {\n    var g = /([A-Z])/g;\n    function h(i) {\n        return i.replace(g, \"-$1\").toLowerCase();\n    };\n    e.exports = h;\n});\n__d(\"Style\", [\"DOMQuery\",\"UserAgent\",\"$\",\"copyProperties\",\"hyphenate\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"UserAgent\"), i = b(\"$\"), j = b(\"copyProperties\"), k = b(\"hyphenate\");\n    function l(s) {\n        return s.replace(/-(.)/g, function(t, u) {\n            return u.toUpperCase();\n        });\n    };\n    function m(s, t) {\n        var u = r.get(s, t);\n        return (((u === \"auto\") || (u === \"scroll\")));\n    };\n    var n = new RegExp((((((\"\\\\s*\" + \"([^\\\\s:]+)\") + \"\\\\s*:\\\\s*\") + \"([^;('\\\"]*(?:(?:\\\\([^)]*\\\\)|\\\"[^\\\"]*\\\"|'[^']*')[^;(?:'\\\"]*)*)\") + \"(?:;|$)\")), \"g\");\n    function o(s) {\n        var t = {\n        };\n        s.replace(n, function(u, v, w) {\n            t[v] = w;\n        });\n        return t;\n    };\n    function p(s) {\n        var t = \"\";\n        for (var u in s) {\n            if (s[u]) {\n                t += (((u + \":\") + s[u]) + \";\");\n            };\n        };\n        return t;\n    };\n    function q(s) {\n        return ((s !== \"\") ? ((\"alpha(opacity=\" + (s * 100)) + \")\") : \"\");\n    };\n    var r = {\n        set: function(s, t, u) {\n            switch (t) {\n              case \"opacity\":\n                if ((h.ie() < 9)) {\n                    s.style.filter = q(u);\n                }\n                 else s.style.opacity = u;\n            ;\n                break;\n              case \"float\":\n                s.style.cssFloat = s.style.styleFloat = (u || \"\");\n                break;\n              default:\n                try {\n                    s.style[l(t)] = u;\n                } catch (v) {\n                    throw new Error(((((\"Style.set: \\\"\" + t) + \"\\\" argument is invalid: \\\"\") + u) + \"\\\"\"));\n                };\n            };\n        },\n        apply: function(s, t) {\n            var u;\n            if (((\"opacity\" in t) && (h.ie() < 9))) {\n                var v = t.opacity;\n                t.filter = q(v);\n                delete t.opacity;\n            }\n        ;\n            var w = o(s.style.cssText);\n            for (u in t) {\n                var x = t[u];\n                delete t[u];\n                u = k(u);\n                for (var y in w) {\n                    if (((y === u) || (y.indexOf((u + \"-\")) === 0))) {\n                        delete w[y];\n                    };\n                };\n                t[u] = x;\n            };\n            t = j(w, t);\n            s.style.cssText = p(t);\n            if ((h.ie() < 9)) {\n                for (u in t) {\n                    if (!t[u]) {\n                        r.set(s, u, \"\");\n                    };\n                }\n            };\n        },\n        get: function(s, t) {\n            s = i(s);\n            var u;\n            if (window.getComputedStyle) {\n                u = window.getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t))\n                };\n            }\n        ;\n            if ((document.defaultView && document.defaultView.getComputedStyle)) {\n                u = document.defaultView.getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t))\n                };\n                if ((t == \"display\")) {\n                    return \"none\"\n                };\n            }\n        ;\n            t = l(t);\n            if (s.currentStyle) {\n                if ((t === \"float\")) {\n                    return (s.currentStyle.cssFloat || s.currentStyle.styleFloat)\n                };\n                return s.currentStyle[t];\n            }\n        ;\n            return (s.style && s.style[t]);\n        },\n        getFloat: function(s, t) {\n            return parseFloat(r.get(s, t), 10);\n        },\n        getOpacity: function(s) {\n            s = i(s);\n            var t = r.get(s, \"filter\"), u = null;\n            if ((t && (u = /(\\d+(?:\\.\\d+)?)/.exec(t)))) {\n                return (parseFloat(u.pop()) / 100);\n            }\n             else if (t = r.get(s, \"opacity\")) {\n                return parseFloat(t);\n            }\n             else return 1\n            \n        ;\n        },\n        isFixed: function(s) {\n            while (g.contains(document.body, s)) {\n                if ((r.get(s, \"position\") === \"fixed\")) {\n                    return true\n                };\n                s = s.parentNode;\n            };\n            return false;\n        },\n        getScrollParent: function(s) {\n            if (!s) {\n                return null\n            };\n            while ((s !== document.body)) {\n                if (((m(s, \"overflow\") || m(s, \"overflowY\")) || m(s, \"overflowX\"))) {\n                    return s\n                };\n                s = s.parentNode;\n            };\n            return window;\n        }\n    };\n    e.exports = r;\n});\n__d(\"DOMDimensions\", [\"DOMQuery\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Style\"), i = {\n        getElementDimensions: function(j) {\n            return {\n                width: (j.offsetWidth || 0),\n                height: (j.offsetHeight || 0)\n            };\n        },\n        getViewportDimensions: function() {\n            var j = (((((window && window.innerWidth)) || (((document && document.documentElement) && document.documentElement.clientWidth))) || (((document && document.body) && document.body.clientWidth))) || 0), k = (((((window && window.innerHeight)) || (((document && document.documentElement) && document.documentElement.clientHeight))) || (((document && document.body) && document.body.clientHeight))) || 0);\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getViewportWithoutScrollbarDimensions: function() {\n            var j = (((((document && document.documentElement) && document.documentElement.clientWidth)) || (((document && document.body) && document.body.clientWidth))) || 0), k = (((((document && document.documentElement) && document.documentElement.clientHeight)) || (((document && document.body) && document.body.clientHeight))) || 0);\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getDocumentDimensions: function(j) {\n            j = (j || document);\n            var k = g.getDocumentScrollElement(j), l = (k.scrollWidth || 0), m = (k.scrollHeight || 0);\n            return {\n                width: l,\n                height: m\n            };\n        },\n        measureElementBox: function(j, k, l, m, n) {\n            var o;\n            switch (k) {\n              case \"left\":\n            \n              case \"right\":\n            \n              case \"top\":\n            \n              case \"bottom\":\n                o = [k,];\n                break;\n              case \"width\":\n                o = [\"left\",\"right\",];\n                break;\n              case \"height\":\n                o = [\"top\",\"bottom\",];\n                break;\n              default:\n                throw Error((\"Invalid plane: \" + k));\n            };\n            var p = function(q, r) {\n                var s = 0;\n                for (var t = 0; (t < o.length); t++) {\n                    s += (parseInt(h.get(j, (((q + \"-\") + o[t]) + r)), 10) || 0);;\n                };\n                return s;\n            };\n            return ((((l ? p(\"padding\", \"\") : 0)) + ((m ? p(\"border\", \"-width\") : 0))) + ((n ? p(\"margin\", \"\") : 0)));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Focus\", [\"CSS\",\"DOM\",\"Event\",\"Run\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"Run\"), k = b(\"cx\"), l = b(\"ge\"), m = {\n    }, n, o = {\n        set: function(s) {\n            try {\n                s.tabIndex = s.tabIndex;\n                s.focus();\n            } catch (t) {\n            \n            };\n        },\n        setWithoutOutline: function(s) {\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            var t = i.listen(s, \"blur\", function() {\n                g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n                t.remove();\n            });\n            o.set(s);\n        },\n        relocate: function(s, t) {\n            p();\n            var u = h.getID(s);\n            m[u] = t;\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            j.onLeave(r.curry(u));\n        },\n        reset: function(s) {\n            var t = h.getID(s);\n            g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            if (m[t]) {\n                g.removeClass(m[t], \"-cx-PRIVATE-focus__nativeoutline\");\n                delete m[t];\n            }\n        ;\n        }\n    };\n    function p() {\n        if (n) {\n            return\n        };\n        i.listen(document.documentElement, \"focusout\", q);\n        i.listen(document.documentElement, \"focusin\", q);\n        n = true;\n    };\n    function q(event) {\n        var s = event.getTarget();\n        if (!g.hasClass(s, \"-cx-PRIVATE-focus__nooutline\")) {\n            return\n        };\n        if (m[s.id]) {\n            g.conditionClass(m[s.id], \"-cx-PRIVATE-focus__nativeoutline\", ((event.type === \"focusin\") || (event.type === \"focus\")));\n        };\n    };\n    function r(s) {\n        if ((m[s] && !l(s))) {\n            delete m[s];\n        };\n    };\n    e.exports = o;\n});\n__d(\"Input\", [\"CSS\",\"DOMQuery\",\"DOMControl\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOMQuery\"), i = b(\"DOMControl\"), j = function(l) {\n        var m = l.getAttribute(\"maxlength\");\n        if ((m && (m > 0))) {\n            d([\"enforceMaxLength\",], function(n) {\n                n(l, m);\n            });\n        };\n    }, k = {\n        isEmpty: function(l) {\n            return (!(/\\S/).test((l.value || \"\")) || g.hasClass(l, \"DOMControl_placeholder\"));\n        },\n        getValue: function(l) {\n            return (k.isEmpty(l) ? \"\" : l.value);\n        },\n        setValue: function(l, m) {\n            g.removeClass(l, \"DOMControl_placeholder\");\n            l.value = (m || \"\");\n            j(l);\n            var n = i.getInstance(l);\n            ((n && n.resetHeight) && n.resetHeight());\n        },\n        setPlaceholder: function(l, m) {\n            l.setAttribute(\"aria-label\", m);\n            l.setAttribute(\"placeholder\", m);\n            if ((l == document.activeElement)) {\n                return\n            };\n            if (k.isEmpty(l)) {\n                g.conditionClass(l, \"DOMControl_placeholder\", m);\n                l.value = (m || \"\");\n            }\n        ;\n        },\n        reset: function(l) {\n            var m = ((l !== document.activeElement) ? ((l.getAttribute(\"placeholder\") || \"\")) : \"\");\n            l.value = m;\n            g.conditionClass(l, \"DOMControl_placeholder\", m);\n            l.style.height = \"\";\n        },\n        setSubmitOnEnter: function(l, m) {\n            g.conditionClass(l, \"enter_submit\", m);\n        },\n        getSubmitOnEnter: function(l) {\n            return g.hasClass(l, \"enter_submit\");\n        },\n        setMaxLength: function(l, m) {\n            if ((m > 0)) {\n                l.setAttribute(\"maxlength\", m);\n                j(l);\n            }\n             else l.removeAttribute(\"maxlength\");\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"flattenArray\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = h.slice(), j = [];\n        while (i.length) {\n            var k = i.pop();\n            if (Array.isArray(k)) {\n                Array.prototype.push.apply(i, k);\n            }\n             else j.push(k);\n        ;\n        };\n        return j.reverse();\n    };\n    e.exports = g;\n});\n__d(\"JSXDOM\", [\"DOM\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"flattenArray\"), i = [\"a\",\"br\",\"button\",\"canvas\",\"checkbox\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"i\",\"iframe\",\"img\",\"input\",\"label\",\"li\",\"option\",\"p\",\"pre\",\"select\",\"span\",\"strong\",\"table\",\"tbody\",\"thead\",\"td\",\"textarea\",\"th\",\"tr\",\"ul\",\"video\",], j = {\n    };\n    i.forEach(function(k) {\n        var l = function(m, n) {\n            if ((arguments.length > 2)) {\n                n = Array.prototype.slice.call(arguments, 1);\n            };\n            if ((!n && m)) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n            if (n) {\n                n = (Array.isArray(n) ? h(n) : h([n,]));\n            };\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"TidyArbiterMixin\", [\"Arbiter\",\"ArbiterMixin\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = {\n    };\n    j(k, h, {\n        _getArbiterInstance: function() {\n            if (!this._arbiter) {\n                this._arbiter = new g();\n                i.onLeave(function() {\n                    delete this._arbiter;\n                }.bind(this));\n            }\n        ;\n            return this._arbiter;\n        }\n    });\n    e.exports = k;\n});\n__d(\"TidyArbiter\", [\"TidyArbiterMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TidyArbiterMixin\"), h = b(\"copyProperties\"), i = {\n    };\n    h(i, g);\n    e.exports = i;\n});\n__d(\"collectDataAttributes\", [\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"getContextualParent\");\n    function h(i, j) {\n        var k = {\n        }, l = {\n        }, m = j.length, n;\n        for (n = 0; (n < m); ++n) {\n            k[j[n]] = {\n            };\n            l[j[n]] = (\"data-\" + j[n]);\n        };\n        var o = {\n            tn: \"\",\n            \"tn-debug\": \",\"\n        };\n        while (i) {\n            if (i.getAttribute) {\n                for (n = 0; (n < m); ++n) {\n                    var p = i.getAttribute(l[j[n]]);\n                    if (p) {\n                        var q = JSON.parse(p);\n                        for (var r in q) {\n                            if ((o[r] !== undefined)) {\n                                if ((k[j[n]][r] === undefined)) {\n                                    k[j[n]][r] = [];\n                                };\n                                k[j[n]][r].push(q[r]);\n                            }\n                             else if ((k[j[n]][r] === undefined)) {\n                                k[j[n]][r] = q[r];\n                            }\n                        ;\n                        };\n                    }\n                ;\n                }\n            };\n            i = g(i);\n        };\n        for (var s in k) {\n            for (var t in o) {\n                if ((k[s][t] !== undefined)) {\n                    k[s][t] = k[s][t].join(o[t]);\n                };\n            };\n        };\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"csx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(\"csx(...): Unexpected class selector transformation.\");\n    };\n    e.exports = g;\n});\n__d(\"isInIframe\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return (window != window.top);\n    };\n    e.exports = g;\n});\n__d(\"TimelineCoverCollapse\", [\"Arbiter\",\"DOMDimensions\",\"Style\",\"TidyArbiter\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMDimensions\"), i = b(\"Style\"), j = b(\"TidyArbiter\"), k = b(\"$\");\n    f.collapse = function(l, m) {\n        m--;\n        var n = h.getViewportDimensions().height, o = h.getDocumentDimensions().height, p = (n + m);\n        if ((o <= p)) {\n            i.set(k(\"pagelet_timeline_main_column\"), \"min-height\", (p + \"px\"));\n        };\n        window.scrollBy(0, m);\n        j.inform(\"TimelineCover/coverCollapsed\", m, g.BEHAVIOR_STATE);\n    };\n});\n__d(\"foldl\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = 0, l = i.length;\n        if ((l === 0)) {\n            if ((j === undefined)) {\n                throw new TypeError(\"Reduce of empty array with no initial value\")\n            };\n            return j;\n        }\n    ;\n        if ((j === undefined)) {\n            j = i[k++];\n        };\n        while ((k < l)) {\n            if ((k in i)) {\n                j = h(j, i[k]);\n            };\n            k++;\n        };\n        return j;\n    };\n    e.exports = g;\n});\n__d(\"FacebarStructuredFragment\", [], function(a, b, c, d, e, f) {\n    function g(i, j) {\n        if ((i && j)) {\n            return (i.toLowerCase() == j.toLowerCase());\n        }\n         else return (!i && !j)\n    ;\n    };\n    function h(i) {\n        this._text = String(i.text);\n        this._uid = (i.uid ? String(i.uid) : null);\n        this._type = (i.type ? String(i.type) : null);\n        this._typeParts = null;\n    };\n    h.prototype.getText = function() {\n        return this._text;\n    };\n    h.prototype.getUID = function() {\n        return this._uid;\n    };\n    h.prototype.getType = function() {\n        return this._type;\n    };\n    h.prototype.getTypePart = function(i) {\n        return this._getTypeParts()[i];\n    };\n    h.prototype.getLength = function() {\n        return this._text.length;\n    };\n    h.prototype.isType = function(i) {\n        for (var j = 0; (j < arguments.length); j++) {\n            if (!g(arguments[j], this.getTypePart(j))) {\n                return false\n            };\n        };\n        return true;\n    };\n    h.prototype.isWhitespace = function() {\n        return (/^\\s*$/).test(this._text);\n    };\n    h.prototype.toStruct = function() {\n        return {\n            text: this._text,\n            type: this._type,\n            uid: this._uid\n        };\n    };\n    h.prototype.getHash = function(i) {\n        var j = ((i != null) ? this._getTypeParts().slice(0, i).join(\":\") : this._type);\n        return ((j + \"::\") + this._text);\n    };\n    h.prototype._getTypeParts = function() {\n        if ((this._typeParts === null)) {\n            this._typeParts = (this._type ? this._type.split(\":\") : []);\n        };\n        return this._typeParts;\n    };\n    e.exports = h;\n});\n__d(\"FacebarStructuredText\", [\"createArrayFrom\",\"foldl\",\"FacebarStructuredFragment\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"foldl\"), i = b(\"FacebarStructuredFragment\"), j = /\\s+$/;\n    function k(o) {\n        if (!o) {\n            return [];\n        }\n         else if ((o instanceof n)) {\n            return o.toArray();\n        }\n         else return g(o).map(function(p) {\n            return new i(p);\n        })\n        \n    ;\n    };\n    function l(o) {\n        return new i({\n            text: o,\n            type: \"text\"\n        });\n    };\n    function m(o, p, q) {\n        var r = o.getText(), s = r.replace(p, q);\n        if ((r != s)) {\n            return new i({\n                text: s,\n                type: o.getType(),\n                uid: o.getUID()\n            });\n        }\n         else return o\n    ;\n    };\n    function n(o) {\n        this._fragments = (o || []);\n        this._hash = null;\n    };\n    n.prototype.matches = function(o, p) {\n        if (o) {\n            var q = this._fragments, r = o._fragments;\n            return ((q.length == r.length) && !q.some(function(s, t) {\n                if ((!p && s.getUID())) {\n                    return (s.getUID() != r[t].getUID());\n                }\n                 else return ((s.getText() != r[t].getText()) || (s.getType() != r[t].getType()))\n            ;\n            }));\n        }\n    ;\n        return false;\n    };\n    n.prototype.trim = function() {\n        var o = null, p = null;\n        this.forEach(function(r, s) {\n            if (!r.isWhitespace()) {\n                if ((o === null)) {\n                    o = s;\n                };\n                p = s;\n            }\n        ;\n        });\n        if ((p !== null)) {\n            var q = this._fragments.slice(o, (p + 1));\n            q.push(m(q.pop(), j, \"\"));\n            return new n(q);\n        }\n         else return new n([])\n    ;\n    };\n    n.prototype.pad = function() {\n        var o = this.getFragment(-1);\n        if (((o && !j.test(o.getText())) && (o.getText() !== \"\"))) {\n            return new n(this._fragments.concat(l(\" \")));\n        }\n         else return this\n    ;\n    };\n    n.prototype.forEach = function(o) {\n        this._fragments.forEach(o);\n        return this;\n    };\n    n.prototype.matchType = function(o) {\n        var p = null;\n        for (var q = 0; (q < this._fragments.length); q++) {\n            var r = this._fragments[q], s = r.isType.apply(r, arguments);\n            if ((s && !p)) {\n                p = r;\n            }\n             else if ((s || !r.isWhitespace())) {\n                return null\n            }\n        ;\n        };\n        return p;\n    };\n    n.prototype.hasType = function(o) {\n        var p = arguments;\n        return this._fragments.some(function(q) {\n            return (!q.isWhitespace() && q.isType.apply(q, p));\n        });\n    };\n    n.prototype.isEmptyOrWhitespace = function() {\n        return !this._fragments.some(function(o) {\n            return !o.isWhitespace();\n        });\n    };\n    n.prototype.isEmpty = function() {\n        return (this.getLength() === 0);\n    };\n    n.prototype.getFragment = function(o) {\n        return this._fragments[((o >= 0) ? o : (this._fragments.length + o))];\n    };\n    n.prototype.getCount = function() {\n        return this._fragments.length;\n    };\n    n.prototype.getLength = function() {\n        return h(function(o, p) {\n            return (o + p.getLength());\n        }, this._fragments, 0);\n    };\n    n.prototype.toStruct = function() {\n        return this._fragments.map(function(o) {\n            return o.toStruct();\n        });\n    };\n    n.prototype.toArray = function() {\n        return this._fragments.slice();\n    };\n    n.prototype.toString = function() {\n        return this._fragments.map(function(o) {\n            return o.getText();\n        }).join(\"\");\n    };\n    n.prototype.getHash = function() {\n        if ((this._hash === null)) {\n            this._hash = this._fragments.map(function(o) {\n                if (o.getUID()) {\n                    return ((\"[[\" + o.getHash(1)) + \"]]\");\n                }\n                 else return o.getText()\n            ;\n            }).join(\"\");\n        };\n        return this._hash;\n    };\n    n.fromStruct = function(o) {\n        return new n(k(o));\n    };\n    n.fromString = function(o) {\n        return new n([l(o),]);\n    };\n    e.exports = n;\n});\n__d(\"FacebarNavigation\", [\"Arbiter\",\"csx\",\"DOMQuery\",\"FacebarStructuredText\",\"Input\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"csx\"), i = b(\"DOMQuery\"), j = b(\"FacebarStructuredText\"), k = b(\"Input\"), l = b(\"URI\"), m = null, n = null, o = null, p = false, q = true, r = (function() {\n        var v = {\n        }, w = function(x) {\n            return (\"uri-\" + x.getQualifiedURI().toString());\n        };\n        return {\n            set: function(x, y) {\n                v[w(x)] = y;\n            },\n            get: function(x) {\n                return v[w(x)];\n            }\n        };\n    })();\n    function s(v, w) {\n        o = v;\n        p = w;\n        q = false;\n        t();\n    };\n    function t() {\n        if (q) {\n            return;\n        }\n         else if (n) {\n            (p && n.pageTransition());\n            n.setPageQuery(o);\n            q = true;\n        }\n         else if (((m && o) && !k.getValue(m))) {\n            k.setValue(m, (o.structure.toString() + \" \"));\n        }\n        \n    ;\n    };\n    g.subscribe(\"page_transition\", function(v, w) {\n        s(r.get(w.uri), true);\n    });\n    var u = {\n        registerInput: function(v) {\n            m = i.scry(v, \".-cx-PUBLIC-uiStructuredInput__text\")[0];\n            t();\n        },\n        registerBehavior: function(v) {\n            n = v;\n            t();\n        },\n        setPageQuery: function(v) {\n            r.set(l.getNextURI(), v);\n            v.structure = j.fromStruct(v.structure);\n            s(v, false);\n        }\n    };\n    e.exports = u;\n});\n__d(\"LayerRemoveOnHide\", [\"function-extensions\",\"DOM\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOM\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", g.remove.curry(this._layer.getRoot()));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Keys\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        BACKSPACE: 8,\n        TAB: 9,\n        RETURN: 13,\n        ESC: 27,\n        SPACE: 32,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        END: 35,\n        HOME: 36,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        DELETE: 46,\n        COMMA: 188\n    };\n});\n__d(\"areObjectsEqual\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return (JSON.stringify(h) == JSON.stringify(i));\n    };\n    e.exports = g;\n});\n__d(\"sprintf\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        i = Array.prototype.slice.call(arguments, 1);\n        var j = 0;\n        return h.replace(/%s/g, function(k) {\n            return i[j++];\n        });\n    };\n    e.exports = g;\n});");
// 1114
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s0a1060a4e309eb327794aa50fb03bc4e8e002205");
// 1115
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"OH3xD\",]);\n}\n;\n;\n__d(\"XdArbiterBuffer\", [], function(a, b, c, d, e, f) {\n    if (!a.XdArbiter) {\n        a.XdArbiter = {\n            _m: [],\n            _p: [],\n            register: function(g, h, i) {\n                h = ((h || (((/^apps\\./).test(JSBNG__location.hostname) ? \"canvas\" : \"tab\"))));\n                this._p.push([g,h,i,]);\n                return h;\n            },\n            handleMessage: function(g, h) {\n                this._m.push([g,h,]);\n            }\n        };\n    }\n;\n;\n});\n__d(\"CanvasIFrameLoader\", [\"XdArbiterBuffer\",\"$\",], function(a, b, c, d, e, f) {\n    b(\"XdArbiterBuffer\");\n    var g = b(\"$\"), h = {\n        loadFromForm: function(i) {\n            i.submit();\n        }\n    };\n    e.exports = h;\n});\n__d(\"PHPQuerySerializer\", [], function(a, b, c, d, e, f) {\n    function g(n) {\n        return h(n, null);\n    };\n;\n    function h(n, o) {\n        o = ((o || \"\"));\n        var p = [];\n        if (((((n === null)) || ((n === undefined))))) {\n            p.push(i(o));\n        }\n         else if (((typeof (n) == \"object\"))) {\n            {\n                var fin29keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin29i = (0);\n                var q;\n                for (; (fin29i < fin29keys.length); (fin29i++)) {\n                    ((q) = (fin29keys[fin29i]));\n                    {\n                        if (((n.hasOwnProperty(q) && ((n[q] !== undefined))))) {\n                            p.push(h(n[q], ((o ? ((((((o + \"[\")) + q)) + \"]\")) : q))));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n         else p.push(((((i(o) + \"=\")) + i(n))));\n        \n    ;\n    ;\n        return p.join(\"&\");\n    };\n;\n    function i(n) {\n        return encodeURIComponent(n).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n    };\n;\n    var j = /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/;\n    function k(n) {\n        if (!n) {\n            return {\n            };\n        }\n    ;\n    ;\n        var o = {\n        };\n        n = n.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n        n = n.split(\"&\");\n        var p = Object.prototype.hasOwnProperty;\n        for (var q = 0, r = n.length; ((q < r)); q++) {\n            var s = n[q].match(j);\n            if (!s) {\n                var t = n[q].split(\"=\");\n                o[l(t[0])] = ((((t[1] === undefined)) ? null : l(t[1])));\n            }\n             else {\n                var u = s[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), v = s[1], w = l(((s[3] || \"\")));\n                u[0] = v;\n                var x = o;\n                for (var y = 0; ((y < ((u.length - 1)))); y++) {\n                    if (u[y]) {\n                        if (!p.call(x, u[y])) {\n                            var z = ((((u[((y + 1))] && !u[((y + 1))].match(/^\\d{1,3}$/))) ? {\n                            } : []));\n                            x[u[y]] = z;\n                            if (((x[u[y]] !== z))) {\n                                return o;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        x = x[u[y]];\n                    }\n                     else {\n                        if (((u[((y + 1))] && !u[((y + 1))].match(/^\\d{1,3}$/)))) {\n                            x.push({\n                            });\n                        }\n                         else x.push([]);\n                    ;\n                    ;\n                        x = x[((x.length - 1))];\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((((x instanceof Array)) && ((u[((u.length - 1))] === \"\"))))) {\n                    x.push(w);\n                }\n                 else x[u[((u.length - 1))]] = w;\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function l(n) {\n        return decodeURIComponent(n.replace(/\\+/g, \" \"));\n    };\n;\n    var m = {\n        serialize: g,\n        encodeComponent: i,\n        deserialize: k,\n        decodeComponent: l\n    };\n    e.exports = m;\n});\n__d(\"URIRFC3986\", [], function(a, b, c, d, e, f) {\n    var g = new RegExp(((((((((((((((((((((((((\"^\" + \"([^:/?#]+:)?\")) + \"(//\")) + \"([^\\\\\\\\/?#@]*@)?\")) + \"(\")) + \"\\\\[[A-Fa-f0-9:.]+\\\\]|\")) + \"[^\\\\/?#:]*\")) + \")\")) + \"(:[0-9]*)?\")) + \")?\")) + \"([^?#]*)\")) + \"(\\\\?[^#]*)?\")) + \"(#.*)?\"))), h = {\n        parse: function(i) {\n            if (((i.trim() === \"\"))) {\n                return null;\n            }\n        ;\n        ;\n            var j = i.match(g), k = {\n            };\n            k.uri = ((j[0] ? j[0] : null));\n            k.scheme = ((j[1] ? j[1].substr(0, ((j[1].length - 1))) : null));\n            k.authority = ((j[2] ? j[2].substr(2) : null));\n            k.userinfo = ((j[3] ? j[3].substr(0, ((j[3].length - 1))) : null));\n            k.host = ((j[2] ? j[4] : null));\n            k.port = ((j[5] ? ((j[5].substr(1) ? parseInt(j[5].substr(1), 10) : null)) : null));\n            k.path = ((j[6] ? j[6] : null));\n            k.query = ((j[7] ? j[7].substr(1) : null));\n            k.fragment = ((j[8] ? j[8].substr(1) : null));\n            k.isGenericURI = ((((k.authority === null)) && !!k.scheme));\n            return k;\n        }\n    };\n    e.exports = h;\n});\n__d(\"createObjectFrom\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i, j) {\n        var k = {\n        }, l = g(j);\n        if (((typeof j == \"undefined\"))) {\n            j = true;\n        }\n    ;\n    ;\n        for (var m = i.length; m--; ) {\n            k[i[m]] = ((l ? j[m] : j));\n        ;\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"URISchemes\", [\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = g([\"fb\",\"fbcf\",\"fbconnect\",\"fb-messenger\",\"fbrpc\",\"ftp\",\"http\",\"https\",\"mailto\",\"itms\",\"itms-apps\",\"market\",\"svn+ssh\",\"fbstaging\",\"tel\",\"sms\",]), i = {\n        isAllowed: function(j) {\n            if (!j) {\n                return true;\n            }\n        ;\n        ;\n            return h.hasOwnProperty(j.toLowerCase());\n        }\n    };\n    e.exports = i;\n});\n__d(\"URIBase\", [\"PHPQuerySerializer\",\"URIRFC3986\",\"URISchemes\",\"copyProperties\",\"ex\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"PHPQuerySerializer\"), h = b(\"URIRFC3986\"), i = b(\"URISchemes\"), j = b(\"copyProperties\"), k = b(\"ex\"), l = b(\"invariant\"), m = new RegExp(((((\"[\\\\x00-\\\\x2c\\\\x2f\\\\x3b-\\\\x40\\\\x5c\\\\x5e\\\\x60\\\\x7b-\\\\x7f\" + \"\\\\uFDD0-\\\\uFDEF\\\\uFFF0-\\\\uFFFF\")) + \"\\\\u2047\\\\u2048\\\\uFE56\\\\uFE5F\\\\uFF03\\\\uFF0F\\\\uFF1F]\"))), n = new RegExp(((\"^(?:[^/]*:|\" + \"[\\\\x00-\\\\x1f]*/[\\\\x00-\\\\x1f]*/)\")));\n    function o(q, r, s) {\n        if (!r) {\n            return true;\n        }\n    ;\n    ;\n        if (((r instanceof p))) {\n            q.setProtocol(r.getProtocol());\n            q.setDomain(r.getDomain());\n            q.setPort(r.getPort());\n            q.setPath(r.getPath());\n            q.setQueryData(g.deserialize(g.serialize(r.getQueryData())));\n            q.setFragment(r.getFragment());\n            return true;\n        }\n    ;\n    ;\n        r = r.toString();\n        var t = ((h.parse(r) || {\n        }));\n        if (((!s && !i.isAllowed(t.scheme)))) {\n            return false;\n        }\n    ;\n    ;\n        q.setProtocol(((t.scheme || \"\")));\n        if (((!s && m.test(t.host)))) {\n            return false;\n        }\n    ;\n    ;\n        q.setDomain(((t.host || \"\")));\n        q.setPort(((t.port || \"\")));\n        q.setPath(((t.path || \"\")));\n        if (s) {\n            q.setQueryData(((g.deserialize(t.query) || {\n            })));\n        }\n         else try {\n            q.setQueryData(((g.deserialize(t.query) || {\n            })));\n        } catch (u) {\n            return false;\n        }\n    ;\n    ;\n        q.setFragment(((t.fragment || \"\")));\n        if (((t.userinfo !== null))) {\n            if (s) {\n                throw new Error(k(\"URI.parse: invalid URI (userinfo is not allowed in a URI): %s\", q.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        if (((!q.getDomain() && ((q.getPath().indexOf(\"\\\\\") !== -1))))) {\n            if (s) {\n                throw new Error(k(\"URI.parse: invalid URI (no domain but multiple back-slashes): %s\", q.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        if (((!q.getProtocol() && n.test(r)))) {\n            if (s) {\n                throw new Error(k(\"URI.parse: invalid URI (unsafe protocol-relative URLs): %s\", q.toString()));\n            }\n             else return false\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function p(q) {\n        this.$URIBase0 = \"\";\n        this.$URIBase1 = \"\";\n        this.$URIBase2 = \"\";\n        this.$URIBase3 = \"\";\n        this.$URIBase4 = \"\";\n        this.$URIBase5 = {\n        };\n        o(this, q, true);\n    };\n;\n    p.prototype.setProtocol = function(q) {\n        l(i.isAllowed(q));\n        this.$URIBase0 = q;\n        return this;\n    };\n    p.prototype.getProtocol = function(q) {\n        return this.$URIBase0;\n    };\n    p.prototype.setSecure = function(q) {\n        return this.setProtocol(((q ? \"https\" : \"http\")));\n    };\n    p.prototype.isSecure = function() {\n        return ((this.getProtocol() === \"https\"));\n    };\n    p.prototype.setDomain = function(q) {\n        if (m.test(q)) {\n            throw new Error(k(\"URI.setDomain: unsafe domain specified: %s for url %s\", q, this.toString()));\n        }\n    ;\n    ;\n        this.$URIBase1 = q;\n        return this;\n    };\n    p.prototype.getDomain = function() {\n        return this.$URIBase1;\n    };\n    p.prototype.setPort = function(q) {\n        this.$URIBase2 = q;\n        return this;\n    };\n    p.prototype.getPort = function() {\n        return this.$URIBase2;\n    };\n    p.prototype.setPath = function(q) {\n        this.$URIBase3 = q;\n        return this;\n    };\n    p.prototype.getPath = function() {\n        return this.$URIBase3;\n    };\n    p.prototype.addQueryData = function(q, r) {\n        if (((q instanceof Object))) {\n            j(this.$URIBase5, q);\n        }\n         else this.$URIBase5[q] = r;\n    ;\n    ;\n        return this;\n    };\n    p.prototype.setQueryData = function(q) {\n        this.$URIBase5 = q;\n        return this;\n    };\n    p.prototype.getQueryData = function() {\n        return this.$URIBase5;\n    };\n    p.prototype.removeQueryData = function(q) {\n        if (!Array.isArray(q)) {\n            q = [q,];\n        }\n    ;\n    ;\n        for (var r = 0, s = q.length; ((r < s)); ++r) {\n            delete this.$URIBase5[q[r]];\n        ;\n        };\n    ;\n        return this;\n    };\n    p.prototype.setFragment = function(q) {\n        this.$URIBase4 = q;\n        return this;\n    };\n    p.prototype.getFragment = function() {\n        return this.$URIBase4;\n    };\n    p.prototype.toString = function() {\n        var q = \"\";\n        if (this.$URIBase0) {\n            q += ((this.$URIBase0 + \"://\"));\n        }\n    ;\n    ;\n        if (this.$URIBase1) {\n            q += this.$URIBase1;\n        }\n    ;\n    ;\n        if (this.$URIBase2) {\n            q += ((\":\" + this.$URIBase2));\n        }\n    ;\n    ;\n        if (this.$URIBase3) {\n            q += this.$URIBase3;\n        }\n         else if (q) {\n            q += \"/\";\n        }\n        \n    ;\n    ;\n        var r = g.serialize(this.$URIBase5);\n        if (r) {\n            q += ((\"?\" + r));\n        }\n    ;\n    ;\n        if (this.$URIBase4) {\n            q += ((\"#\" + this.$URIBase4));\n        }\n    ;\n    ;\n        return q;\n    };\n    p.prototype.getOrigin = function() {\n        return ((((((this.$URIBase0 + \"://\")) + this.$URIBase1)) + ((this.$URIBase2 ? ((\":\" + this.$URIBase2)) : \"\"))));\n    };\n    p.isValidURI = function(q) {\n        return o(new p(), q, false);\n    };\n    e.exports = p;\n});\n__d(\"URI\", [\"URIBase\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URIBase\"), h = b(\"copyProperties\"), i = b(\"goURI\");\n    {\n        var fin30keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin30i = (0);\n        var j;\n        for (; (fin30i < fin30keys.length); (fin30i++)) {\n            ((j) = (fin30keys[fin30i]));\n            {\n                if (((g.hasOwnProperty(j) && ((j !== \"_metaprototype\"))))) {\n                    l[j] = g[j];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var k = ((((g === null)) ? null : g.prototype));\n    l.prototype = Object.create(k);\n    l.prototype.constructor = l;\n    l.__superConstructor__ = g;\n    function l(m) {\n        if (!((this instanceof l))) {\n            return new l(((m || window.JSBNG__location.href)));\n        }\n    ;\n    ;\n        g.call(this, ((m || \"\")));\n    };\n;\n    l.prototype.setPath = function(m) {\n        this.path = m;\n        return k.setPath.call(this, m);\n    };\n    l.prototype.getPath = function() {\n        var m = k.getPath.call(this);\n        if (m) {\n            return m.replace(/^\\/+/, \"/\");\n        }\n    ;\n    ;\n        return m;\n    };\n    l.prototype.setProtocol = function(m) {\n        this.protocol = m;\n        return k.setProtocol.call(this, m);\n    };\n    l.prototype.setDomain = function(m) {\n        this.domain = m;\n        return k.setDomain.call(this, m);\n    };\n    l.prototype.setPort = function(m) {\n        this.port = m;\n        return k.setPort.call(this, m);\n    };\n    l.prototype.setFragment = function(m) {\n        this.fragment = m;\n        return k.setFragment.call(this, m);\n    };\n    l.prototype.isEmpty = function() {\n        return !((((((((((this.getPath() || this.getProtocol())) || this.getDomain())) || this.getPort())) || ((Object.keys(this.getQueryData()).length > 0)))) || this.getFragment()));\n    };\n    l.prototype.valueOf = function() {\n        return this.toString();\n    };\n    l.prototype.isFacebookURI = function() {\n        if (!l.$URI5) {\n            l.$URI5 = new RegExp(\"(^|\\\\.)facebook\\\\.com$\", \"i\");\n        }\n    ;\n    ;\n        if (this.isEmpty()) {\n            return false;\n        }\n    ;\n    ;\n        if (((!this.getDomain() && !this.getProtocol()))) {\n            return true;\n        }\n    ;\n    ;\n        return (((([\"http\",\"https\",].indexOf(this.getProtocol()) !== -1)) && l.$URI5.test(this.getDomain())));\n    };\n    l.prototype.getRegisteredDomain = function() {\n        if (!this.getDomain()) {\n            return \"\";\n        }\n    ;\n    ;\n        if (!this.isFacebookURI()) {\n            return null;\n        }\n    ;\n    ;\n        var m = this.getDomain().split(\".\"), n = m.indexOf(\"facebook\");\n        return m.slice(n).join(\".\");\n    };\n    l.prototype.getUnqualifiedURI = function() {\n        return new l(this).setProtocol(null).setDomain(null).setPort(null);\n    };\n    l.prototype.getQualifiedURI = function() {\n        return new l(this).$URI6();\n    };\n    l.prototype.$URI6 = function() {\n        if (!this.getDomain()) {\n            var m = l();\n            this.setProtocol(m.getProtocol()).setDomain(m.getDomain()).setPort(m.getPort());\n        }\n    ;\n    ;\n        return this;\n    };\n    l.prototype.isSameOrigin = function(m) {\n        var n = ((m || window.JSBNG__location.href));\n        if (!((n instanceof l))) {\n            n = new l(n.toString());\n        }\n    ;\n    ;\n        if (((this.isEmpty() || n.isEmpty()))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getProtocol() && ((this.getProtocol() != n.getProtocol()))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getDomain() && ((this.getDomain() != n.getDomain()))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.getPort() && ((this.getPort() != n.getPort()))))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n    l.prototype.go = function(m) {\n        i(this, m);\n    };\n    l.prototype.setSubdomain = function(m) {\n        var n = this.$URI6().getDomain().split(\".\");\n        if (((n.length <= 2))) {\n            n.unshift(m);\n        }\n         else n[0] = m;\n    ;\n    ;\n        return this.setDomain(n.join(\".\"));\n    };\n    l.prototype.getSubdomain = function() {\n        if (!this.getDomain()) {\n            return \"\";\n        }\n    ;\n    ;\n        var m = this.getDomain().split(\".\");\n        if (((m.length <= 2))) {\n            return \"\";\n        }\n         else return m[0]\n    ;\n    };\n    h(l, {\n        getRequestURI: function(m, n) {\n            m = ((((m === undefined)) || m));\n            var o = a.PageTransitions;\n            if (((((m && o)) && o.isInitialized()))) {\n                return o.getCurrentURI(!!n).getQualifiedURI();\n            }\n             else return new l(window.JSBNG__location.href)\n        ;\n        },\n        getMostRecentURI: function() {\n            var m = a.PageTransitions;\n            if (((m && m.isInitialized()))) {\n                return m.getMostRecentURI().getQualifiedURI();\n            }\n             else return new l(window.JSBNG__location.href)\n        ;\n        },\n        getNextURI: function() {\n            var m = a.PageTransitions;\n            if (((m && m.isInitialized()))) {\n                return m.getNextURI().getQualifiedURI();\n            }\n             else return new l(window.JSBNG__location.href)\n        ;\n        },\n        expression: /(((\\w+):\\/\\/)([^\\/:]*)(:(\\d+))?)?([^#?]*)(\\?([^#]*))?(#(.*))?/,\n        arrayQueryExpression: /^(\\w+)((?:\\[\\w*\\])+)=?(.*)/,\n        explodeQuery: function(m) {\n            if (!m) {\n                return {\n                };\n            }\n        ;\n        ;\n            var n = {\n            };\n            m = m.replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n            m = m.split(\"&\");\n            var o = Object.prototype.hasOwnProperty;\n            for (var p = 0, q = m.length; ((p < q)); p++) {\n                var r = m[p].match(l.arrayQueryExpression);\n                if (!r) {\n                    var s = m[p].split(\"=\");\n                    n[l.decodeComponent(s[0])] = ((((s[1] === undefined)) ? null : l.decodeComponent(s[1])));\n                }\n                 else {\n                    var t = r[2].split(/\\]\\[|\\[|\\]/).slice(0, -1), u = r[1], v = l.decodeComponent(((r[3] || \"\")));\n                    t[0] = u;\n                    var w = n;\n                    for (var x = 0; ((x < ((t.length - 1)))); x++) {\n                        if (t[x]) {\n                            if (!o.call(w, t[x])) {\n                                var y = ((((t[((x + 1))] && !t[((x + 1))].match(/^\\d{1,3}$/))) ? {\n                                } : []));\n                                w[t[x]] = y;\n                                if (((w[t[x]] !== y))) {\n                                    return n;\n                                }\n                            ;\n                            ;\n                            }\n                        ;\n                        ;\n                            w = w[t[x]];\n                        }\n                         else {\n                            if (((t[((x + 1))] && !t[((x + 1))].match(/^\\d{1,3}$/)))) {\n                                w.push({\n                                });\n                            }\n                             else w.push([]);\n                        ;\n                        ;\n                            w = w[((w.length - 1))];\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    if (((((w instanceof Array)) && ((t[((t.length - 1))] === \"\"))))) {\n                        w.push(v);\n                    }\n                     else w[t[((t.length - 1))]] = v;\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return n;\n        },\n        implodeQuery: function(m, n, o) {\n            n = ((n || \"\"));\n            if (((o === undefined))) {\n                o = true;\n            }\n        ;\n        ;\n            var p = [];\n            if (((((m === null)) || ((m === undefined))))) {\n                p.push(((o ? l.encodeComponent(n) : n)));\n            }\n             else if (((m instanceof Array))) {\n                for (var q = 0; ((q < m.length)); ++q) {\n                    try {\n                        if (((m[q] !== undefined))) {\n                            p.push(l.implodeQuery(m[q], ((n ? ((((((n + \"[\")) + q)) + \"]\")) : q)), o));\n                        }\n                    ;\n                    ;\n                    } catch (r) {\n                    \n                    };\n                ;\n                };\n            ;\n            }\n             else if (((typeof (m) == \"object\"))) {\n                if (((((\"nodeName\" in m)) && ((\"nodeType\" in m))))) {\n                    p.push(\"{node}\");\n                }\n                 else {\n                    var fin31keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin31i = (0);\n                    var s;\n                    for (; (fin31i < fin31keys.length); (fin31i++)) {\n                        ((s) = (fin31keys[fin31i]));\n                        {\n                            try {\n                                if (((m[s] !== undefined))) {\n                                    p.push(l.implodeQuery(m[s], ((n ? ((((((n + \"[\")) + s)) + \"]\")) : s)), o));\n                                }\n                            ;\n                            ;\n                            } catch (r) {\n                            \n                            };\n                        ;\n                        };\n                    };\n                }\n            ;\n            ;\n            }\n             else if (o) {\n                p.push(((((l.encodeComponent(n) + \"=\")) + l.encodeComponent(m))));\n            }\n             else p.push(((((n + \"=\")) + m)));\n            \n            \n            \n        ;\n        ;\n            return p.join(\"&\");\n        },\n        encodeComponent: function(m) {\n            return encodeURIComponent(m).replace(/%5D/g, \"]\").replace(/%5B/g, \"[\");\n        },\n        decodeComponent: function(m) {\n            return decodeURIComponent(m.replace(/\\+/g, \" \"));\n        }\n    });\n    e.exports = l;\n});\n__d(\"AsyncSignal\", [\"Env\",\"ErrorUtils\",\"QueryString\",\"URI\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ErrorUtils\"), i = b(\"QueryString\"), j = b(\"URI\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(n, o) {\n        this.data = ((o || {\n        }));\n        if (((g.tracking_domain && ((n.charAt(0) == \"/\"))))) {\n            n = ((g.tracking_domain + n));\n        }\n    ;\n    ;\n        this.uri = n;\n    };\n;\n    m.prototype.setHandler = function(n) {\n        this.handler = n;\n        return this;\n    };\n    m.prototype.send = function() {\n        var n = this.handler, o = this.data, p = new JSBNG__Image();\n        if (n) {\n            p.JSBNG__onload = p.JSBNG__onerror = function() {\n                h.applyWithGuard(n, null, [((p.height == 1)),]);\n            };\n        }\n    ;\n    ;\n        o.asyncSignal = ((((((Math.JSBNG__random() * 10000)) | 0)) + 1));\n        var q = new j(this.uri).isFacebookURI();\n        l(o, k.getAsyncParams(((q ? \"POST\" : \"GET\"))));\n        p.src = i.appendToUrl(this.uri, o);\n        return this;\n    };\n    e.exports = m;\n});\n__d(\"DOMQuery\", [\"JSBNG__CSS\",\"UserAgent\",\"createArrayFrom\",\"createObjectFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"UserAgent\"), i = b(\"createArrayFrom\"), j = b(\"createObjectFrom\"), k = b(\"ge\"), l = null;\n    function m(o, p) {\n        return ((o.hasAttribute ? o.hasAttribute(p) : ((o.getAttribute(p) !== null))));\n    };\n;\n    var n = {\n        JSBNG__find: function(o, p) {\n            var q = n.scry(o, p);\n            return q[0];\n        },\n        scry: function(o, p) {\n            if (((!o || !o.getElementsByTagName))) {\n                return [];\n            }\n        ;\n        ;\n            var q = p.split(\" \"), r = [o,];\n            for (var s = 0; ((s < q.length)); s++) {\n                if (((r.length === 0))) {\n                    break;\n                }\n            ;\n            ;\n                if (((q[s] === \"\"))) {\n                    continue;\n                }\n            ;\n            ;\n                var t = q[s], u = q[s], v = [], w = false;\n                if (((t.charAt(0) == \"^\"))) {\n                    if (((s === 0))) {\n                        w = true;\n                        t = t.slice(1);\n                    }\n                     else return []\n                ;\n                }\n            ;\n            ;\n                t = t.replace(/\\[(?:[^=\\]]*=(?:\"[^\"]*\"|'[^']*'))?|[.#]/g, \" $&\");\n                var x = t.split(\" \"), y = ((x[0] || \"*\")), z = ((y == \"*\")), aa = ((x[1] && ((x[1].charAt(0) == \"#\"))));\n                if (aa) {\n                    var ba = k(x[1].slice(1), o, y);\n                    if (((ba && ((z || ((ba.tagName.toLowerCase() == y))))))) {\n                        for (var ca = 0; ((ca < r.length)); ca++) {\n                            if (((w && n.contains(ba, r[ca])))) {\n                                v = [ba,];\n                                break;\n                            }\n                             else if (((((JSBNG__document == r[ca])) || n.contains(r[ca], ba)))) {\n                                v = [ba,];\n                                break;\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    }\n                ;\n                ;\n                }\n                 else {\n                    var da = [], ea = r.length, fa, ga = ((((!w && ((u.indexOf(\"[\") < 0)))) && JSBNG__document.querySelectorAll));\n                    for (var ha = 0; ((ha < ea)); ha++) {\n                        if (w) {\n                            fa = [];\n                            var ia = r[ha].parentNode;\n                            while (n.isElementNode(ia)) {\n                                if (((z || ((ia.tagName.toLowerCase() == y))))) {\n                                    fa.push(ia);\n                                }\n                            ;\n                            ;\n                                ia = ia.parentNode;\n                            };\n                        ;\n                        }\n                         else if (ga) {\n                            fa = r[ha].querySelectorAll(u);\n                        }\n                         else fa = r[ha].getElementsByTagName(y);\n                        \n                    ;\n                    ;\n                        var ja = fa.length;\n                        for (var ka = 0; ((ka < ja)); ka++) {\n                            da.push(fa[ka]);\n                        ;\n                        };\n                    ;\n                    };\n                ;\n                    if (!ga) {\n                        for (var la = 1; ((la < x.length)); la++) {\n                            var ma = x[la], na = ((ma.charAt(0) == \".\")), oa = ma.substring(1);\n                            for (ha = 0; ((ha < da.length)); ha++) {\n                                var pa = da[ha];\n                                if (((!pa || ((pa.nodeType !== 1))))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                if (na) {\n                                    if (!g.hasClass(pa, oa)) {\n                                        delete da[ha];\n                                    }\n                                ;\n                                ;\n                                    continue;\n                                }\n                                 else {\n                                    var qa = ma.slice(1, ((ma.length - 1)));\n                                    if (((qa.indexOf(\"=\") == -1))) {\n                                        if (!m(pa, qa)) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                     else {\n                                        var ra = qa.split(\"=\"), sa = ra[0], ta = ra[1];\n                                        ta = ta.slice(1, ((ta.length - 1)));\n                                        if (((pa.getAttribute(sa) != ta))) {\n                                            delete da[ha];\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        };\n                    }\n                ;\n                ;\n                    for (ha = 0; ((ha < da.length)); ha++) {\n                        if (da[ha]) {\n                            v.push(da[ha]);\n                            if (w) {\n                                break;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                r = v;\n            };\n        ;\n            return r;\n        },\n        getText: function(o) {\n            if (n.isTextNode(o)) {\n                return o.data;\n            }\n             else if (n.isElementNode(o)) {\n                if (((l === null))) {\n                    var p = JSBNG__document.createElement(\"div\");\n                    l = ((((p.textContent != null)) ? \"textContent\" : \"innerText\"));\n                }\n            ;\n            ;\n                return o[l];\n            }\n             else return \"\"\n            \n        ;\n        },\n        JSBNG__getSelection: function() {\n            var o = window.JSBNG__getSelection, p = JSBNG__document.selection;\n            if (o) {\n                return ((o() + \"\"));\n            }\n             else if (p) {\n                return p.createRange().text;\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        contains: function(o, p) {\n            o = k(o);\n            p = k(p);\n            if (((!o || !p))) {\n                return false;\n            }\n             else if (((o === p))) {\n                return true;\n            }\n             else if (n.isTextNode(o)) {\n                return false;\n            }\n             else if (n.isTextNode(p)) {\n                return n.contains(o, p.parentNode);\n            }\n             else if (o.contains) {\n                return o.contains(p);\n            }\n             else if (o.compareDocumentPosition) {\n                return !!((o.compareDocumentPosition(p) & 16));\n            }\n             else return false\n            \n            \n            \n            \n            \n        ;\n        },\n        getRootElement: function() {\n            var o = null;\n            if (((window.Quickling && Quickling.isActive()))) {\n                o = k(\"JSBNG__content\");\n            }\n        ;\n        ;\n            return ((o || JSBNG__document.body));\n        },\n        isNode: function(o) {\n            return !!((o && ((((typeof JSBNG__Node !== \"undefined\")) ? ((o instanceof JSBNG__Node)) : ((((((typeof o == \"object\")) && ((typeof o.nodeType == \"number\")))) && ((typeof o.nodeName == \"string\"))))))));\n        },\n        isNodeOfType: function(o, p) {\n            var q = i(p).join(\"|\").toUpperCase().split(\"|\"), r = j(q);\n            return ((n.isNode(o) && ((o.nodeName in r))));\n        },\n        isElementNode: function(o) {\n            return ((n.isNode(o) && ((o.nodeType == 1))));\n        },\n        isTextNode: function(o) {\n            return ((n.isNode(o) && ((o.nodeType == 3))));\n        },\n        isInputNode: function(o) {\n            return ((n.isNodeOfType(o, [\"input\",\"textarea\",]) || ((o.contentEditable === \"true\"))));\n        },\n        getDocumentScrollElement: function(o) {\n            o = ((o || JSBNG__document));\n            var p = ((h.chrome() || h.webkit()));\n            return ((((!p && ((o.compatMode === \"CSS1Compat\")))) ? o.documentElement : o.body));\n        }\n    };\n    e.exports = n;\n});\n__d(\"DataStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = 1;\n    function i(l) {\n        if (((typeof l == \"string\"))) {\n            return ((\"str_\" + l));\n        }\n         else return ((\"elem_\" + ((l.__FB_TOKEN || (l.__FB_TOKEN = [h++,])))[0]))\n    ;\n    };\n;\n    function j(l) {\n        var m = i(l);\n        return ((g[m] || (g[m] = {\n        })));\n    };\n;\n    var k = {\n        set: function(l, m, n) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.set: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var o = j(l);\n            o[m] = n;\n            return l;\n        },\n        get: function(l, m, n) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.get: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var o = j(l), p = o[m];\n            if (((((typeof p === \"undefined\")) && l.getAttribute))) {\n                if (((l.hasAttribute && !l.hasAttribute(((\"data-\" + m)))))) {\n                    p = undefined;\n                }\n                 else {\n                    var q = l.getAttribute(((\"data-\" + m)));\n                    p = ((((null === q)) ? undefined : q));\n                }\n            ;\n            }\n        ;\n        ;\n            if (((((n !== undefined)) && ((p === undefined))))) {\n                p = o[m] = n;\n            }\n        ;\n        ;\n            return p;\n        },\n        remove: function(l, m) {\n            if (!l) {\n                throw new TypeError(((\"DataStore.remove: namespace is required, got \" + (typeof l))));\n            }\n        ;\n        ;\n            var n = j(l), o = n[m];\n            delete n[m];\n            return o;\n        },\n        purge: function(l) {\n            delete g[i(l)];\n        }\n    };\n    e.exports = k;\n});\n__d(\"DOMEvent\", [\"copyProperties\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"invariant\");\n    function i(j) {\n        this.JSBNG__event = ((j || window.JSBNG__event));\n        h(((typeof (this.JSBNG__event.srcElement) != \"unknown\")));\n        this.target = ((this.JSBNG__event.target || this.JSBNG__event.srcElement));\n    };\n;\n    i.killThenCall = function(j) {\n        return function(k) {\n            new i(k).kill();\n            return j();\n        };\n    };\n    g(i.prototype, {\n        preventDefault: function() {\n            var j = this.JSBNG__event;\n            if (j.preventDefault) {\n                j.preventDefault();\n                if (!((\"defaultPrevented\" in j))) {\n                    j.defaultPrevented = true;\n                }\n            ;\n            ;\n            }\n             else j.returnValue = false;\n        ;\n        ;\n            return this;\n        },\n        isDefaultPrevented: function() {\n            var j = this.JSBNG__event;\n            return ((((\"defaultPrevented\" in j)) ? j.defaultPrevented : ((j.returnValue === false))));\n        },\n        stopPropagation: function() {\n            var j = this.JSBNG__event;\n            ((j.stopPropagation ? j.stopPropagation() : j.cancelBubble = true));\n            return this;\n        },\n        kill: function() {\n            this.stopPropagation().preventDefault();\n            return this;\n        }\n    });\n    e.exports = i;\n});\n__d(\"getObjectValues\", [\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\");\n    function h(i) {\n        var j = [];\n        {\n            var fin32keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin32i = (0);\n            var k;\n            for (; (fin32i < fin32keys.length); (fin32i++)) {\n                ((k) = (fin32keys[fin32i]));\n                {\n                    j.push(i[k]);\n                ;\n                };\n            };\n        };\n    ;\n        return j;\n    };\n;\n    e.exports = h;\n});\n__d(\"JSBNG__Event\", [\"event-form-bubbling\",\"Arbiter\",\"DataStore\",\"DOMQuery\",\"DOMEvent\",\"ErrorUtils\",\"Parent\",\"UserAgent\",\"$\",\"copyProperties\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    b(\"event-form-bubbling\");\n    var g = b(\"Arbiter\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"DOMEvent\"), k = b(\"ErrorUtils\"), l = b(\"Parent\"), m = b(\"UserAgent\"), n = b(\"$\"), o = b(\"copyProperties\"), p = b(\"getObjectValues\"), q = a.JSBNG__Event;\n    q.DATASTORE_KEY = \"JSBNG__Event.listeners\";\n    if (!q.prototype) {\n        q.prototype = {\n        };\n    }\n;\n;\n    function r(ca) {\n        if (((((((ca.type === \"click\")) || ((ca.type === \"mouseover\")))) || ((ca.type === \"keydown\"))))) {\n            g.inform(\"Event/stop\", {\n                JSBNG__event: ca\n            });\n        }\n    ;\n    ;\n    };\n;\n    function s(ca, da, ea) {\n        this.target = ca;\n        this.type = da;\n        this.data = ea;\n    };\n;\n    o(s.prototype, {\n        getData: function() {\n            this.data = ((this.data || {\n            }));\n            return this.data;\n        },\n        JSBNG__stop: function() {\n            return q.JSBNG__stop(this);\n        },\n        prevent: function() {\n            return q.prevent(this);\n        },\n        isDefaultPrevented: function() {\n            return q.isDefaultPrevented(this);\n        },\n        kill: function() {\n            return q.kill(this);\n        },\n        getTarget: function() {\n            return ((new j(this).target || null));\n        }\n    });\n    function t(ca) {\n        if (((ca instanceof s))) {\n            return ca;\n        }\n    ;\n    ;\n        if (!ca) {\n            if (((!window.JSBNG__addEventListener && JSBNG__document.createEventObject))) {\n                ca = ((window.JSBNG__event ? JSBNG__document.createEventObject(window.JSBNG__event) : {\n                }));\n            }\n             else ca = {\n            };\n        ;\n        }\n    ;\n    ;\n        if (!ca._inherits_from_prototype) {\n            {\n                var fin33keys = ((window.top.JSBNG_Replay.forInKeys)((q.prototype))), fin33i = (0);\n                var da;\n                for (; (fin33i < fin33keys.length); (fin33i++)) {\n                    ((da) = (fin33keys[fin33i]));\n                    {\n                        try {\n                            ca[da] = q.prototype[da];\n                        } catch (ea) {\n                        \n                        };\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    o(q.prototype, {\n        _inherits_from_prototype: true,\n        getRelatedTarget: function() {\n            var ca = ((this.relatedTarget || ((((this.fromElement === this.srcElement)) ? this.toElement : this.fromElement))));\n            return ((((ca && ca.nodeType)) ? ca : null));\n        },\n        getModifiers: function() {\n            var ca = {\n                control: !!this.ctrlKey,\n                shift: !!this.shiftKey,\n                alt: !!this.altKey,\n                meta: !!this.metaKey\n            };\n            ca.access = ((m.osx() ? ca.control : ca.alt));\n            ca.any = ((((((ca.control || ca.shift)) || ca.alt)) || ca.meta));\n            return ca;\n        },\n        isRightClick: function() {\n            if (this.which) {\n                return ((this.which === 3));\n            }\n        ;\n        ;\n            return ((this.button && ((this.button === 2))));\n        },\n        isMiddleClick: function() {\n            if (this.which) {\n                return ((this.which === 2));\n            }\n        ;\n        ;\n            return ((this.button && ((this.button === 4))));\n        },\n        isDefaultRequested: function() {\n            return ((((this.getModifiers().any || this.isMiddleClick())) || this.isRightClick()));\n        }\n    });\n    o(q.prototype, s.prototype);\n    o(q, {\n        listen: function(ca, da, ea, fa) {\n            if (((typeof ca == \"string\"))) {\n                ca = n(ca);\n            }\n        ;\n        ;\n            if (((typeof fa == \"undefined\"))) {\n                fa = q.Priority.NORMAL;\n            }\n        ;\n        ;\n            if (((typeof da == \"object\"))) {\n                var ga = {\n                };\n                {\n                    var fin34keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin34i = (0);\n                    var ha;\n                    for (; (fin34i < fin34keys.length); (fin34i++)) {\n                        ((ha) = (fin34keys[fin34i]));\n                        {\n                            ga[ha] = q.listen(ca, ha, da[ha], fa);\n                        ;\n                        };\n                    };\n                };\n            ;\n                return ga;\n            }\n        ;\n        ;\n            if (da.match(/^on/i)) {\n                throw new TypeError(((((\"Bad event name `\" + da)) + \"': use `click', not `onclick'.\")));\n            }\n        ;\n        ;\n            if (((((ca.nodeName == \"LABEL\")) && ((da == \"click\"))))) {\n                var ia = ca.getElementsByTagName(\"input\");\n                ca = ((((ia.length == 1)) ? ia[0] : ca));\n            }\n             else if (((((ca === window)) && ((da === \"JSBNG__scroll\"))))) {\n                var ja = i.getDocumentScrollElement();\n                if (((((ja !== JSBNG__document.documentElement)) && ((ja !== JSBNG__document.body))))) {\n                    ca = ja;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ka = h.get(ca, v, {\n            });\n            if (x[da]) {\n                var la = x[da];\n                da = la.base;\n                if (la.wrap) {\n                    ea = la.wrap(ea);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            z(ca, da);\n            var ma = ka[da];\n            if (!((fa in ma))) {\n                ma[fa] = [];\n            }\n        ;\n        ;\n            var na = ma[fa].length, oa = new ba(ea, ma[fa], na);\n            ma[fa].push(oa);\n            return oa;\n        },\n        JSBNG__stop: function(ca) {\n            var da = new j(ca).stopPropagation();\n            r(da.JSBNG__event);\n            return ca;\n        },\n        prevent: function(ca) {\n            new j(ca).preventDefault();\n            return ca;\n        },\n        isDefaultPrevented: function(ca) {\n            return new j(ca).isDefaultPrevented(ca);\n        },\n        kill: function(ca) {\n            var da = new j(ca).kill();\n            r(da.JSBNG__event);\n            return false;\n        },\n        getKeyCode: function(JSBNG__event) {\n            JSBNG__event = new j(JSBNG__event).JSBNG__event;\n            if (!JSBNG__event) {\n                return false;\n            }\n        ;\n        ;\n            switch (JSBNG__event.keyCode) {\n              case 63232:\n                return 38;\n              case 63233:\n                return 40;\n              case 63234:\n                return 37;\n              case 63235:\n                return 39;\n              case 63272:\n            \n              case 63273:\n            \n              case 63275:\n                return null;\n              case 63276:\n                return 33;\n              case 63277:\n                return 34;\n            };\n        ;\n            if (JSBNG__event.shiftKey) {\n                switch (JSBNG__event.keyCode) {\n                  case 33:\n                \n                  case 34:\n                \n                  case 37:\n                \n                  case 38:\n                \n                  case 39:\n                \n                  case 40:\n                    return null;\n                };\n            }\n        ;\n        ;\n            return JSBNG__event.keyCode;\n        },\n        getPriorities: function() {\n            if (!u) {\n                var ca = p(q.Priority);\n                ca.sort(function(da, ea) {\n                    return ((da - ea));\n                });\n                u = ca;\n            }\n        ;\n        ;\n            return u;\n        },\n        fire: function(ca, da, ea) {\n            var fa = new s(ca, da, ea), ga;\n            do {\n                var ha = q.__getHandler(ca, da);\n                if (ha) {\n                    ga = ha(fa);\n                }\n            ;\n            ;\n                ca = ca.parentNode;\n            } while (((((ca && ((ga !== false)))) && !fa.cancelBubble)));\n            return ((ga !== false));\n        },\n        __fire: function(ca, da, JSBNG__event) {\n            var ea = q.__getHandler(ca, da);\n            if (ea) {\n                return ea(t(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        __getHandler: function(ca, da) {\n            return h.get(ca, ((q.DATASTORE_KEY + da)));\n        },\n        getPosition: function(ca) {\n            ca = new j(ca).JSBNG__event;\n            var da = i.getDocumentScrollElement(), ea = ((ca.clientX + da.scrollLeft)), fa = ((ca.clientY + da.scrollTop));\n            return {\n                x: ea,\n                y: fa\n            };\n        }\n    });\n    var u = null, v = q.DATASTORE_KEY, w = function(ca) {\n        return function(da) {\n            if (!i.contains(this, da.getRelatedTarget())) {\n                return ca.call(this, da);\n            }\n        ;\n        ;\n        };\n    }, x;\n    if (!window.JSBNG__navigator.msPointerEnabled) {\n        x = {\n            mouseenter: {\n                base: \"mouseover\",\n                wrap: w\n            },\n            mouseleave: {\n                base: \"mouseout\",\n                wrap: w\n            }\n        };\n    }\n     else x = {\n        mousedown: {\n            base: \"MSPointerDown\"\n        },\n        mousemove: {\n            base: \"MSPointerMove\"\n        },\n        mouseup: {\n            base: \"MSPointerUp\"\n        },\n        mouseover: {\n            base: \"MSPointerOver\"\n        },\n        mouseout: {\n            base: \"MSPointerOut\"\n        },\n        mouseenter: {\n            base: \"MSPointerOver\",\n            wrap: w\n        },\n        mouseleave: {\n            base: \"MSPointerOut\",\n            wrap: w\n        }\n    };\n;\n;\n    if (m.firefox()) {\n        var y = function(ca, JSBNG__event) {\n            JSBNG__event = t(JSBNG__event);\n            var da = JSBNG__event.getTarget();\n            while (da) {\n                q.__fire(da, ca, JSBNG__event);\n                da = da.parentNode;\n            };\n        ;\n        };\n        JSBNG__document.documentElement.JSBNG__addEventListener(\"JSBNG__focus\", y.curry(\"focusin\"), true);\n        JSBNG__document.documentElement.JSBNG__addEventListener(\"JSBNG__blur\", y.curry(\"focusout\"), true);\n    }\n;\n;\n    var z = function(ca, da) {\n        var ea = ((\"JSBNG__on\" + da)), fa = aa.bind(ca, da), ga = h.get(ca, v);\n        if (((da in ga))) {\n            return;\n        }\n    ;\n    ;\n        ga[da] = {\n        };\n        if (ca.JSBNG__addEventListener) {\n            ca.JSBNG__addEventListener(da, fa, false);\n        }\n         else if (ca.JSBNG__attachEvent) {\n            ca.JSBNG__attachEvent(ea, fa);\n        }\n        \n    ;\n    ;\n        h.set(ca, ((v + da)), fa);\n        if (ca[ea]) {\n            var ha = ((((ca === JSBNG__document.documentElement)) ? q.Priority._BUBBLE : q.Priority.TRADITIONAL)), ia = ca[ea];\n            ca[ea] = null;\n            q.listen(ca, da, ia, ha);\n        }\n    ;\n    ;\n        if (((((ca.nodeName === \"FORM\")) && ((da === \"submit\"))))) {\n            q.listen(ca, da, q.__bubbleSubmit.curry(ca), q.Priority._BUBBLE);\n        }\n    ;\n    ;\n    }, aa = k.guard(function(ca, JSBNG__event) {\n        JSBNG__event = t(JSBNG__event);\n        if (!h.get(this, v)) {\n            throw new Error(\"Bad listenHandler context.\");\n        }\n    ;\n    ;\n        var da = h.get(this, v)[ca];\n        if (!da) {\n            throw new Error(((((\"No registered handlers for `\" + ca)) + \"'.\")));\n        }\n    ;\n    ;\n        if (((ca == \"click\"))) {\n            var ea = l.byTag(JSBNG__event.getTarget(), \"a\");\n            if (window.userAction) {\n                var fa = window.userAction(\"evt_ext\", ea, JSBNG__event, {\n                    mode: \"DEDUP\"\n                }).uai_fallback(\"click\");\n                if (window.ArbiterMonitor) {\n                    window.ArbiterMonitor.initUA(fa, [ea,]);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (window.clickRefAction) {\n                window.clickRefAction(\"click\", ea, JSBNG__event);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var ga = q.getPriorities();\n        for (var ha = 0; ((ha < ga.length)); ha++) {\n            var ia = ga[ha];\n            if (((ia in da))) {\n                var ja = da[ia];\n                for (var ka = 0; ((ka < ja.length)); ka++) {\n                    if (!ja[ka]) {\n                        continue;\n                    }\n                ;\n                ;\n                    var la = ja[ka].fire(this, JSBNG__event);\n                    if (((la === false))) {\n                        return JSBNG__event.kill();\n                    }\n                     else if (JSBNG__event.cancelBubble) {\n                        JSBNG__event.JSBNG__stop();\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return JSBNG__event.returnValue;\n    });\n    q.Priority = {\n        URGENT: -20,\n        TRADITIONAL: -10,\n        NORMAL: 0,\n        _BUBBLE: 1000\n    };\n    function ba(ca, da, ea) {\n        this._handler = ca;\n        this._container = da;\n        this._index = ea;\n    };\n;\n    o(ba.prototype, {\n        remove: function() {\n            delete this._handler;\n            delete this._container[this._index];\n        },\n        fire: function(ca, JSBNG__event) {\n            return k.applyWithGuard(this._handler, ca, [JSBNG__event,], function(da) {\n                da.event_type = JSBNG__event.type;\n                da.dom_element = ((ca.JSBNG__name || ca.id));\n                da.category = \"eventhandler\";\n            });\n        }\n    });\n    a.$E = q.$E = t;\n    e.exports = q;\n});\n__d(\"evalGlobal\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((typeof h != \"string\"))) {\n            throw new TypeError(\"JS sent to evalGlobal is not a string. Only strings are permitted.\");\n        }\n    ;\n    ;\n        if (!h) {\n            return;\n        }\n    ;\n    ;\n        var i = JSBNG__document.createElement(\"script\");\n        try {\n            i.appendChild(JSBNG__document.createTextNode(h));\n        } catch (j) {\n            i.text = h;\n        };\n    ;\n        var k = ((JSBNG__document.getElementsByTagName(\"head\")[0] || JSBNG__document.documentElement));\n        k.appendChild(i);\n        k.removeChild(i);\n    };\n;\n    e.exports = g;\n});\n__d(\"HTML\", [\"function-extensions\",\"Bootloader\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"evalGlobal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"UserAgent\"), i = b(\"copyProperties\"), j = b(\"createArrayFrom\"), k = b(\"emptyFunction\"), l = b(\"evalGlobal\");\n    function m(n) {\n        if (((n && ((typeof n.__html == \"string\"))))) {\n            n = n.__html;\n        }\n    ;\n    ;\n        if (!((this instanceof m))) {\n            if (((n instanceof m))) {\n                return n;\n            }\n        ;\n        ;\n            return new m(n);\n        }\n    ;\n    ;\n        this._content = n;\n        this._defer = false;\n        this._extra_action = \"\";\n        this._nodes = null;\n        this._inline_js = k;\n        this._rootNode = null;\n        return this;\n    };\n;\n    m.isHTML = function(n) {\n        return ((n && ((((n instanceof m)) || ((n.__html !== undefined))))));\n    };\n    m.replaceJSONWrapper = function(n) {\n        return ((((n && ((n.__html !== undefined)))) ? new m(n.__html) : n));\n    };\n    i(m.prototype, {\n        toString: function() {\n            var n = ((this._content || \"\"));\n            if (this._extra_action) {\n                n += ((((((\"\\u003Cscript type=\\\"text/javascript\\\"\\u003E\" + this._extra_action)) + \"\\u003C/scr\")) + \"ipt\\u003E\"));\n            }\n        ;\n        ;\n            return n;\n        },\n        setAction: function(n) {\n            this._extra_action = n;\n            return this;\n        },\n        getAction: function() {\n            this._fillCache();\n            var n = function() {\n                this._inline_js();\n                l(this._extra_action);\n            }.bind(this);\n            if (this.getDeferred()) {\n                return n.defer.bind(n);\n            }\n             else return n\n        ;\n        },\n        setDeferred: function(n) {\n            this._defer = !!n;\n            return this;\n        },\n        getDeferred: function() {\n            return this._defer;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getNodes: function() {\n            this._fillCache();\n            return this._nodes;\n        },\n        getRootNode: function() {\n            var n = this.getNodes();\n            if (((n.length === 1))) {\n                this._rootNode = n[0];\n            }\n             else {\n                var o = JSBNG__document.createDocumentFragment();\n                for (var p = 0; ((p < n.length)); p++) {\n                    o.appendChild(n[p]);\n                ;\n                };\n            ;\n                this._rootNode = o;\n            }\n        ;\n        ;\n            return this._rootNode;\n        },\n        _fillCache: function() {\n            if (((null !== this._nodes))) {\n                return;\n            }\n        ;\n        ;\n            var n = this._content;\n            if (!n) {\n                this._nodes = [];\n                return;\n            }\n        ;\n        ;\n            n = n.replace(/(<(\\w+)[^>]*?)\\/>/g, function(y, z, aa) {\n                return ((aa.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? y : ((((((z + \"\\u003E\\u003C/\")) + aa)) + \"\\u003E\"))));\n            });\n            var o = n.trim().toLowerCase(), p = JSBNG__document.createElement(\"div\"), q = false, r = ((((((((((((((!o.indexOf(\"\\u003Copt\") && [1,\"\\u003Cselect multiple=\\\"multiple\\\" class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/select\\u003E\",])) || ((!o.indexOf(\"\\u003Cleg\") && [1,\"\\u003Cfieldset class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/fieldset\\u003E\",])))) || ((o.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1,\"\\u003Ctable class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/table\\u003E\",])))) || ((!o.indexOf(\"\\u003Ctr\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",])))) || ((((!o.indexOf(\"\\u003Ctd\") || !o.indexOf(\"\\u003Cth\"))) && [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",])))) || ((!o.indexOf(\"\\u003Ccol\") && [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup class=\\\"__WRAPPER\\\"\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",])))) || null));\n            if (((null === r))) {\n                p.className = \"__WRAPPER\";\n                if (h.ie()) {\n                    r = [0,\"\\u003Cspan style=\\\"display:none\\\"\\u003E&nbsp;\\u003C/span\\u003E\",\"\",];\n                    q = true;\n                }\n                 else r = [0,\"\",\"\",];\n            ;\n            ;\n            }\n        ;\n        ;\n            p.innerHTML = ((((r[1] + n)) + r[2]));\n            while (r[0]--) {\n                p = p.lastChild;\n            ;\n            };\n        ;\n            if (q) {\n                p.removeChild(p.firstChild);\n            }\n        ;\n        ;\n            ((p.className != \"__WRAPPER\"));\n            if (h.ie()) {\n                var s;\n                if (((!o.indexOf(\"\\u003Ctable\") && ((-1 == o.indexOf(\"\\u003Ctbody\")))))) {\n                    s = ((p.firstChild && p.firstChild.childNodes));\n                }\n                 else if (((((r[1] == \"\\u003Ctable\\u003E\")) && ((-1 == o.indexOf(\"\\u003Ctbody\")))))) {\n                    s = p.childNodes;\n                }\n                 else s = [];\n                \n            ;\n            ;\n                for (var t = ((s.length - 1)); ((t >= 0)); --t) {\n                    if (((((s[t].nodeName && ((s[t].nodeName.toLowerCase() == \"tbody\")))) && ((s[t].childNodes.length == 0))))) {\n                        s[t].parentNode.removeChild(s[t]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var u = p.getElementsByTagName(\"script\"), v = [];\n            for (var w = 0; ((w < u.length)); w++) {\n                if (u[w].src) {\n                    v.push(g.requestJSResource.bind(g, u[w].src));\n                }\n                 else v.push(l.bind(null, u[w].innerHTML));\n            ;\n            ;\n            };\n        ;\n            for (var w = ((u.length - 1)); ((w >= 0)); w--) {\n                u[w].parentNode.removeChild(u[w]);\n            ;\n            };\n        ;\n            var x = function() {\n                for (var y = 0; ((y < v.length)); y++) {\n                    v[y]();\n                ;\n                };\n            ;\n            };\n            this._nodes = j(p.childNodes);\n            this._inline_js = x;\n        }\n    });\n    e.exports = m;\n});\n__d(\"isScalar\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/string|number|boolean/).test(typeof h);\n    };\n;\n    e.exports = g;\n});\n__d(\"JSBNG__Intl\", [], function(a, b, c, d, e, f) {\n    var g;\n    function h(j) {\n        if (((typeof j != \"string\"))) {\n            return false;\n        }\n    ;\n    ;\n        return j.match(new RegExp(((((((((((((((((((((((((((((((((((((((((((((((((((((h.punct_char_class + \"[\")) + \")\\\"\")) + \"'\")) + \"\\u00bb\")) + \"\\u0f3b\")) + \"\\u0f3d\")) + \"\\u2019\")) + \"\\u201d\")) + \"\\u203a\")) + \"\\u3009\")) + \"\\u300b\")) + \"\\u300d\")) + \"\\u300f\")) + \"\\u3011\")) + \"\\u3015\")) + \"\\u3017\")) + \"\\u3019\")) + \"\\u301b\")) + \"\\u301e\")) + \"\\u301f\")) + \"\\ufd3f\")) + \"\\uff07\")) + \"\\uff09\")) + \"\\uff3d\")) + \"\\\\s\")) + \"]*$\"))));\n    };\n;\n    h.punct_char_class = ((((((((((((((((((((((\"[\" + \".!?\")) + \"\\u3002\")) + \"\\uff01\")) + \"\\uff1f\")) + \"\\u0964\")) + \"\\u2026\")) + \"\\u0eaf\")) + \"\\u1801\")) + \"\\u0e2f\")) + \"\\uff0e\")) + \"]\"));\n    function i(j) {\n        if (g) {\n            var k = [], l = [];\n            {\n                var fin35keys = ((window.top.JSBNG_Replay.forInKeys)((g.patterns))), fin35i = (0);\n                var m;\n                for (; (fin35i < fin35keys.length); (fin35i++)) {\n                    ((m) = (fin35keys[fin35i]));\n                    {\n                        var n = g.patterns[m];\n                        {\n                            var fin36keys = ((window.top.JSBNG_Replay.forInKeys)((g.meta))), fin36i = (0);\n                            var o;\n                            for (; (fin36i < fin36keys.length); (fin36i++)) {\n                                ((o) = (fin36keys[fin36i]));\n                                {\n                                    var p = new RegExp(o.slice(1, -1), \"g\"), q = g.meta[o];\n                                    m = m.replace(p, q);\n                                    n = n.replace(p, q);\n                                };\n                            };\n                        };\n                    ;\n                        k.push(m);\n                        l.push(n);\n                    };\n                };\n            };\n        ;\n            for (var r = 0; ((r < k.length)); r++) {\n                var s = new RegExp(k[r].slice(1, -1), \"g\");\n                if (((l[r] == \"javascript\"))) {\n                    j.replace(s, function(t) {\n                        return t.slice(1).toLowerCase();\n                    });\n                }\n                 else j = j.replace(s, l[r]);\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return j.replace(/\\x01/g, \"\");\n    };\n;\n    e.exports = {\n        endsInPunct: h,\n        applyPhonologicalRules: i,\n        setPhonologicalRules: function(j) {\n            g = j;\n        }\n    };\n});\n__d(\"substituteTokens\", [\"invariant\",\"JSBNG__Intl\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"JSBNG__Intl\");\n    function i(j, k) {\n        if (!k) {\n            return j;\n        }\n    ;\n    ;\n        g(((typeof k === \"object\")));\n        var l = ((((\"\\\\{([^}]+)\\\\}(\" + h.endsInPunct.punct_char_class)) + \"*)\")), m = new RegExp(l, \"g\"), n = [], o = j.replace(m, function(r, s, t) {\n            var u = k[s];\n            if (((u && ((typeof u === \"object\"))))) {\n                n.push(u);\n                return ((\"\\u0017\" + t));\n            }\n        ;\n        ;\n            return ((u + ((h.endsInPunct(u) ? \"\" : t))));\n        }).split(\"\\u0017\").map(h.applyPhonologicalRules);\n        if (((o.length === 1))) {\n            return o[0];\n        }\n    ;\n    ;\n        var p = [o[0],];\n        for (var q = 0; ((q < n.length)); q++) {\n            p.push(n[q], o[((q + 1))]);\n        ;\n        };\n    ;\n        return p;\n    };\n;\n    e.exports = i;\n});\n__d(\"tx\", [\"substituteTokens\",], function(a, b, c, d, e, f) {\n    var g = b(\"substituteTokens\");\n    function h(i, j) {\n        if (((typeof _string_table == \"undefined\"))) {\n            return;\n        }\n    ;\n    ;\n        i = _string_table[i];\n        return g(i, j);\n    };\n;\n    h._ = g;\n    e.exports = h;\n});\n__d(\"DOM\", [\"function-extensions\",\"DOMQuery\",\"JSBNG__Event\",\"HTML\",\"UserAgent\",\"$\",\"copyProperties\",\"createArrayFrom\",\"isScalar\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"JSBNG__Event\"), i = b(\"HTML\"), j = b(\"UserAgent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"isScalar\"), o = b(\"tx\"), p = \"js_\", q = 0, r = {\n    };\n    l(r, g);\n    l(r, {\n        create: function(u, v, w) {\n            var x = JSBNG__document.createElement(u);\n            if (v) {\n                r.setAttributes(x, v);\n            }\n        ;\n        ;\n            if (((w != null))) {\n                r.setContent(x, w);\n            }\n        ;\n        ;\n            return x;\n        },\n        setAttributes: function(u, v) {\n            if (v.type) {\n                u.type = v.type;\n            }\n        ;\n        ;\n            {\n                var fin37keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin37i = (0);\n                var w;\n                for (; (fin37i < fin37keys.length); (fin37i++)) {\n                    ((w) = (fin37keys[fin37i]));\n                    {\n                        var x = v[w], y = (/^on/i).test(w);\n                        if (((w == \"type\"))) {\n                            continue;\n                        }\n                         else if (((w == \"style\"))) {\n                            if (((typeof x == \"string\"))) {\n                                u.style.cssText = x;\n                            }\n                             else l(u.style, x);\n                        ;\n                        ;\n                        }\n                         else if (y) {\n                            h.listen(u, w.substr(2), x);\n                        }\n                         else if (((w in u))) {\n                            u[w] = x;\n                        }\n                         else if (u.setAttribute) {\n                            u.setAttribute(w, x);\n                        }\n                        \n                        \n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        prependContent: function(u, v) {\n            return s(v, u, function(w) {\n                ((u.firstChild ? u.insertBefore(w, u.firstChild) : u.appendChild(w)));\n            });\n        },\n        insertAfter: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                ((u.nextSibling ? w.insertBefore(x, u.nextSibling) : w.appendChild(x)));\n            });\n        },\n        insertBefore: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.insertBefore(x, u);\n            });\n        },\n        setContent: function(u, v) {\n            r.empty(u);\n            return r.appendContent(u, v);\n        },\n        appendContent: function(u, v) {\n            return s(v, u, function(w) {\n                u.appendChild(w);\n            });\n        },\n        replace: function(u, v) {\n            var w = u.parentNode;\n            return s(v, w, function(x) {\n                w.replaceChild(x, u);\n            });\n        },\n        remove: function(u) {\n            u = k(u);\n            if (u.parentNode) {\n                u.parentNode.removeChild(u);\n            }\n        ;\n        ;\n        },\n        empty: function(u) {\n            u = k(u);\n            while (u.firstChild) {\n                r.remove(u.firstChild);\n            ;\n            };\n        ;\n        },\n        getID: function(u) {\n            var v = u.id;\n            if (!v) {\n                v = ((p + q++));\n                u.id = v;\n            }\n        ;\n        ;\n            return v;\n        }\n    });\n    function s(u, v, w) {\n        u = i.replaceJSONWrapper(u);\n        if (((((((u instanceof i)) && ((\"\" === v.innerHTML)))) && ((-1 === u.toString().indexOf(((\"\\u003Cscr\" + \"ipt\")))))))) {\n            var x = j.ie();\n            if (((!x || ((((x > 7)) && !g.isNodeOfType(v, [\"table\",\"tbody\",\"thead\",\"tfoot\",\"tr\",\"select\",\"fieldset\",])))))) {\n                var y = ((x ? \"\\u003Cem style=\\\"display:none;\\\"\\u003E&nbsp;\\u003C/em\\u003E\" : \"\"));\n                v.innerHTML = ((y + u));\n                ((x && v.removeChild(v.firstChild)));\n                return m(v.childNodes);\n            }\n        ;\n        ;\n        }\n         else if (g.isTextNode(v)) {\n            v.data = u;\n            return [u,];\n        }\n        \n    ;\n    ;\n        var z = JSBNG__document.createDocumentFragment(), aa, ba = [], ca = [];\n        u = m(u);\n        for (var da = 0; ((da < u.length)); da++) {\n            aa = i.replaceJSONWrapper(u[da]);\n            if (((aa instanceof i))) {\n                ca.push(aa.getAction());\n                var ea = aa.getNodes();\n                for (var fa = 0; ((fa < ea.length)); fa++) {\n                    ba.push(ea[fa]);\n                    z.appendChild(ea[fa]);\n                };\n            ;\n            }\n             else if (n(aa)) {\n                var ga = JSBNG__document.createTextNode(aa);\n                ba.push(ga);\n                z.appendChild(ga);\n            }\n             else if (g.isNode(aa)) {\n                ba.push(aa);\n                z.appendChild(aa);\n            }\n            \n            \n        ;\n        ;\n        };\n    ;\n        w(z);\n        ca.forEach(function(ha) {\n            ha();\n        });\n        return ba;\n    };\n;\n    function t(u) {\n        function v(w) {\n            return r.create(\"div\", {\n            }, w).innerHTML;\n        };\n    ;\n        return function(w, x) {\n            var y = {\n            };\n            if (x) {\n                {\n                    var fin38keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin38i = (0);\n                    var z;\n                    for (; (fin38i < fin38keys.length); (fin38i++)) {\n                        ((z) = (fin38keys[fin38i]));\n                        {\n                            y[z] = v(x[z]);\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            return i(u(w, y));\n        };\n    };\n;\n    r.tx = t(o);\n    r.tx._ = r._tx = t(o._);\n    e.exports = r;\n});\n__d(\"LinkshimAsyncLink\", [\"$\",\"AsyncSignal\",\"DOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncSignal\"), i = b(\"DOM\"), j = b(\"UserAgent\"), k = {\n        swap: function(l, m) {\n            var n = ((j.ie() <= 8));\n            if (n) {\n                var o = i.create(\"wbr\", {\n                }, null);\n                i.appendContent(l, o);\n            }\n        ;\n        ;\n            l.href = m;\n            if (n) {\n                i.remove(o);\n            }\n        ;\n        ;\n        },\n        referrer_log: function(l, m, n) {\n            var o = g(\"meta_referrer\");\n            o.JSBNG__content = \"origin\";\n            k.swap(l, m);\n            (function() {\n                o.JSBNG__content = \"default\";\n                new h(n, {\n                }).send();\n            }).defer(100);\n        }\n    };\n    e.exports = k;\n});\n__d(\"legacy:dom-asynclinkshim\", [\"LinkshimAsyncLink\",], function(a, b, c, d) {\n    a.LinkshimAsyncLink = b(\"LinkshimAsyncLink\");\n}, 3);\n__d(\"debounce\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k) {\n        if (((i == null))) {\n            i = 100;\n        }\n    ;\n    ;\n        var l;\n        function m(n, o, p, q, r) {\n            m.reset();\n            l = JSBNG__setTimeout(function() {\n                h.call(j, n, o, p, q, r);\n            }, i, !k);\n        };\n    ;\n        m.reset = function() {\n            JSBNG__clearTimeout(l);\n        };\n        return m;\n    };\n;\n    e.exports = g;\n});\n__d(\"LitestandViewportHeight\", [\"Arbiter\",\"JSBNG__CSS\",\"JSBNG__Event\",\"cx\",\"debounce\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"JSBNG__Event\"), j = b(\"cx\"), k = b(\"debounce\"), l = b(\"emptyFunction\"), m, n = {\n        SMALL: \"small\",\n        NORMAL: \"normal\",\n        LARGE: \"large\",\n        getSize: function() {\n            if (((m === \"-cx-PUBLIC-litestandViewportSize__small\"))) {\n                return n.SMALL;\n            }\n        ;\n        ;\n            if (((m === \"-cx-PUBLIC-litestandViewportSize__large\"))) {\n                return n.LARGE;\n            }\n        ;\n        ;\n            return n.NORMAL;\n        },\n        init: function(o) {\n            n.init = l;\n            var p = k(function() {\n                var q = JSBNG__document.documentElement, r = q.clientHeight, s;\n                if (((r <= o.max_small_height))) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__small\";\n                }\n                 else if (((r >= o.min_large_height))) {\n                    s = \"-cx-PUBLIC-litestandViewportSize__large\";\n                }\n                \n            ;\n            ;\n                if (((s !== m))) {\n                    ((m && h.removeClass(q, m)));\n                    m = s;\n                    ((m && h.addClass(q, m)));\n                    g.inform(\"ViewportSizeChange\");\n                }\n            ;\n            ;\n            });\n            p();\n            i.listen(window, \"resize\", p);\n        }\n    };\n    e.exports = n;\n});\n__d(\"JSLogger\", [], function(a, b, c, d, e, f) {\n    var g = {\n        MAX_HISTORY: 500,\n        counts: {\n        },\n        categories: {\n        },\n        seq: 0,\n        pageId: ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(36),\n        forwarding: false\n    };\n    function h(l) {\n        if (((((l instanceof Error)) && a.ErrorUtils))) {\n            l = a.ErrorUtils.normalizeError(l);\n        }\n    ;\n    ;\n        try {\n            return JSON.stringify(l);\n        } catch (m) {\n            return \"{}\";\n        };\n    ;\n    };\n;\n    function i(l, JSBNG__event, m) {\n        if (!g.counts[l]) {\n            g.counts[l] = {\n            };\n        }\n    ;\n    ;\n        if (!g.counts[l][JSBNG__event]) {\n            g.counts[l][JSBNG__event] = 0;\n        }\n    ;\n    ;\n        m = ((((m == null)) ? 1 : Number(m)));\n        g.counts[l][JSBNG__event] += ((isFinite(m) ? m : 0));\n    };\n;\n    g.logAction = function(JSBNG__event, l, m) {\n        if (((this.type == \"bump\"))) {\n            i(this.cat, JSBNG__event, l);\n        }\n         else if (((this.type == \"rate\"))) {\n            ((l && i(this.cat, ((JSBNG__event + \"_n\")), m)));\n            i(this.cat, ((JSBNG__event + \"_d\")), m);\n        }\n         else {\n            var n = {\n                cat: this.cat,\n                type: this.type,\n                JSBNG__event: JSBNG__event,\n                data: ((((l != null)) ? h(l) : null)),\n                date: JSBNG__Date.now(),\n                seq: g.seq++\n            };\n            g.head = ((g.head ? (g.head.next = n) : (g.tail = n)));\n            while (((((g.head.seq - g.tail.seq)) > g.MAX_HISTORY))) {\n                g.tail = g.tail.next;\n            ;\n            };\n        ;\n            return n;\n        }\n        \n    ;\n    ;\n    };\n    function j(l) {\n        if (!g.categories[l]) {\n            g.categories[l] = {\n            };\n            var m = function(n) {\n                var o = {\n                    cat: l,\n                    type: n\n                };\n                g.categories[l][n] = function() {\n                    g.forwarding = false;\n                    var p = null;\n                    if (((JSBNG__document.domain != \"facebook.com\"))) {\n                        return;\n                    }\n                ;\n                ;\n                    p = g.logAction;\n                    if (/^\\/+(dialogs|plugins?)\\//.test(JSBNG__location.pathname)) {\n                        g.forwarding = false;\n                    }\n                     else try {\n                        p = a.JSBNG__top.require(\"JSLogger\")._.logAction;\n                        g.forwarding = ((p !== g.logAction));\n                    } catch (q) {\n                    \n                    }\n                ;\n                ;\n                    ((p && p.apply(o, arguments)));\n                };\n            };\n            m(\"debug\");\n            m(\"log\");\n            m(\"warn\");\n            m(\"error\");\n            m(\"bump\");\n            m(\"rate\");\n        }\n    ;\n    ;\n        return g.categories[l];\n    };\n;\n    function k(l, m) {\n        var n = [];\n        for (var o = ((m || g.tail)); o; o = o.next) {\n            if (((!l || l(o)))) {\n                var p = {\n                    type: o.type,\n                    cat: o.cat,\n                    date: o.date,\n                    JSBNG__event: o.JSBNG__event,\n                    seq: o.seq\n                };\n                if (o.data) {\n                    p.data = JSON.parse(o.data);\n                }\n            ;\n            ;\n                n.push(p);\n            }\n        ;\n        ;\n        };\n    ;\n        return n;\n    };\n;\n    e.exports = {\n        _: g,\n        DUMP_EVENT: \"jslogger/dump\",\n        create: j,\n        getEntries: k\n    };\n});\n__d(\"startsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = String(h);\n        j = Math.min(Math.max(((j || 0)), 0), k.length);\n        return ((k.lastIndexOf(String(i), j) === j));\n    };\n;\n    e.exports = g;\n});\n__d(\"getContextualParent\", [\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ge\");\n    function h(i, j) {\n        var k, l = false;\n        do {\n            if (((i.getAttribute && (k = i.getAttribute(\"data-ownerid\"))))) {\n                i = g(k);\n                l = true;\n            }\n             else i = i.parentNode;\n        ;\n        ;\n        } while (((((j && i)) && !l)));\n        return i;\n    };\n;\n    e.exports = h;\n});\n__d(\"Nectar\", [\"Env\",\"startsWith\",\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"startsWith\"), i = b(\"getContextualParent\");\n    function j(m) {\n        if (!m.nctr) {\n            m.nctr = {\n            };\n        }\n    ;\n    ;\n    };\n;\n    function k(m) {\n        if (((g.module || !m))) {\n            return g.module;\n        }\n    ;\n    ;\n        var n = {\n            fbpage_fan_confirm: true,\n            photos_snowlift: true\n        }, o;\n        while (((m && m.getAttributeNode))) {\n            var p = ((m.getAttributeNode(\"id\") || {\n            })).value;\n            if (h(p, \"pagelet_\")) {\n                return p;\n            }\n        ;\n        ;\n            if (((!o && n[p]))) {\n                o = p;\n            }\n        ;\n        ;\n            m = i(m);\n        };\n    ;\n        return o;\n    };\n;\n    var l = {\n        addModuleData: function(m, n) {\n            var o = k(n);\n            if (o) {\n                j(m);\n                m.nctr._mod = o;\n            }\n        ;\n        ;\n        },\n        addImpressionID: function(m) {\n            if (g.impid) {\n                j(m);\n                m.nctr._impid = g.impid;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = l;\n});\n__d(\"AsyncResponse\", [\"Bootloader\",\"Env\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Env\"), i = b(\"copyProperties\"), j = b(\"tx\");\n    function k(l, m) {\n        i(this, {\n            error: 0,\n            errorSummary: null,\n            errorDescription: null,\n            JSBNG__onload: null,\n            replay: false,\n            payload: ((m || null)),\n            request: ((l || null)),\n            silentError: false,\n            transientError: false,\n            is_last: true\n        });\n        return this;\n    };\n;\n    i(k, {\n        defaultErrorHandler: function(l) {\n            try {\n                if (!l.silentError) {\n                    k.verboseErrorHandler(l);\n                }\n                 else l.logErrorByGroup(\"silent\", 10);\n            ;\n            ;\n            } catch (m) {\n                JSBNG__alert(l);\n            };\n        ;\n        },\n        verboseErrorHandler: function(l) {\n            try {\n                var n = l.getErrorSummary(), o = l.getErrorDescription();\n                l.logErrorByGroup(\"popup\", 10);\n                if (((l.silentError && ((o === \"\"))))) {\n                    o = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n                }\n            ;\n            ;\n                g.loadModules([\"Dialog\",], function(p) {\n                    new p().setTitle(n).setBody(o).setButtons([p.OK,]).setModal(true).setCausalElement(this.relativeTo).show();\n                });\n            } catch (m) {\n                JSBNG__alert(l);\n            };\n        ;\n        }\n    });\n    i(k.prototype, {\n        getRequest: function() {\n            return this.request;\n        },\n        getPayload: function() {\n            return this.payload;\n        },\n        getError: function() {\n            return this.error;\n        },\n        getErrorSummary: function() {\n            return this.errorSummary;\n        },\n        setErrorSummary: function(l) {\n            l = ((((l === undefined)) ? null : l));\n            this.errorSummary = l;\n            return this;\n        },\n        getErrorDescription: function() {\n            return this.errorDescription;\n        },\n        getErrorIsWarning: function() {\n            return !!this.errorIsWarning;\n        },\n        isTransient: function() {\n            return !!this.transientError;\n        },\n        logError: function(l, m) {\n            var n = a.ErrorSignal;\n            if (n) {\n                var o = {\n                    err_code: this.error,\n                    vip: ((h.vip || \"-\"))\n                };\n                if (m) {\n                    o.duration = m.duration;\n                    o.xfb_ip = m.xfb_ip;\n                }\n            ;\n            ;\n                var p = this.request.getURI();\n                o.path = ((p || \"-\"));\n                o.aid = this.request.userActionID;\n                if (((p && ((p.indexOf(\"scribe_endpoint.php\") != -1))))) {\n                    l = \"async_error_double\";\n                }\n            ;\n            ;\n                n.sendErrorSignal(l, JSON.stringify(o));\n            }\n        ;\n        ;\n        },\n        logErrorByGroup: function(l, m) {\n            if (((Math.floor(((Math.JSBNG__random() * m))) === 0))) {\n                if (((((this.error == 1357010)) || ((this.error < 15000))))) {\n                    this.logError(((\"async_error_oops_\" + l)));\n                }\n                 else this.logError(((\"async_error_logic_\" + l)));\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"HTTPErrors\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = {\n        get: g,\n        getAll: g\n    };\n    e.exports = h;\n});\n__d(\"bind\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = Array.prototype.slice.call(arguments, 2);\n        if (((typeof i != \"string\"))) {\n            return Function.prototype.bind.apply(i, [h,].concat(j));\n        }\n    ;\n    ;\n        function k() {\n            var l = j.concat(Array.prototype.slice.call(arguments));\n            if (h[i]) {\n                return h[i].apply(h, l);\n            }\n        ;\n        ;\n        };\n    ;\n        k.toString = function() {\n            return ((\"bound lazily: \" + h[i]));\n        };\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"executeAfter\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return function() {\n            h.apply(((j || this)), arguments);\n            i.apply(((j || this)), arguments);\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"AsyncRequest\", [\"Arbiter\",\"AsyncResponse\",\"Bootloader\",\"JSBNG__CSS\",\"Env\",\"ErrorUtils\",\"JSBNG__Event\",\"HTTPErrors\",\"JSCC\",\"Parent\",\"Run\",\"ServerJS\",\"URI\",\"UserAgent\",\"XHR\",\"asyncCallback\",\"bind\",\"copyProperties\",\"emptyFunction\",\"evalGlobal\",\"ge\",\"goURI\",\"isEmpty\",\"ix\",\"tx\",\"executeAfter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncResponse\"), i = b(\"Bootloader\"), j = b(\"JSBNG__CSS\"), k = b(\"Env\"), l = b(\"ErrorUtils\"), m = b(\"JSBNG__Event\"), n = b(\"HTTPErrors\"), o = b(\"JSCC\"), p = b(\"Parent\"), q = b(\"Run\"), r = b(\"ServerJS\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"XHR\"), v = b(\"asyncCallback\"), w = b(\"bind\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"evalGlobal\"), aa = b(\"ge\"), ba = b(\"goURI\"), ca = b(\"isEmpty\"), da = b(\"ix\"), ea = b(\"tx\"), fa = b(\"executeAfter\");\n    function ga() {\n        try {\n            return !window.loaded;\n        } catch (pa) {\n            return true;\n        };\n    ;\n    };\n;\n    function ha(pa) {\n        return ((((\"upload\" in pa)) && ((\"JSBNG__onprogress\" in pa.upload))));\n    };\n;\n    function ia(pa) {\n        return ((\"withCredentials\" in pa));\n    };\n;\n    function ja(pa) {\n        return ((pa.JSBNG__status in {\n            0: 1,\n            12029: 1,\n            12030: 1,\n            12031: 1,\n            12152: 1\n        }));\n    };\n;\n    function ka(pa) {\n        var qa = ((!pa || ((typeof (pa) === \"function\"))));\n        return qa;\n    };\n;\n    var la = 2, ma = la;\n    g.subscribe(\"page_transition\", function(pa, qa) {\n        ma = qa.id;\n    });\n    function na(pa) {\n        x(this, {\n            transport: null,\n            method: \"POST\",\n            uri: \"\",\n            timeout: null,\n            timer: null,\n            initialHandler: y,\n            handler: null,\n            uploadProgressHandler: null,\n            errorHandler: null,\n            transportErrorHandler: null,\n            timeoutHandler: null,\n            interceptHandler: y,\n            finallyHandler: y,\n            abortHandler: y,\n            serverDialogCancelHandler: null,\n            relativeTo: null,\n            statusElement: null,\n            statusClass: \"\",\n            data: {\n            },\n            file: null,\n            context: {\n            },\n            readOnly: false,\n            writeRequiredParams: [],\n            remainingRetries: 0,\n            userActionID: \"-\"\n        });\n        this.option = {\n            asynchronous: true,\n            suppressErrorHandlerWarning: false,\n            suppressEvaluation: false,\n            suppressErrorAlerts: false,\n            retries: 0,\n            jsonp: false,\n            bundle: false,\n            useIframeTransport: false,\n            handleErrorAfterUnload: false\n        };\n        this.errorHandler = h.defaultErrorHandler;\n        this.transportErrorHandler = w(this, \"errorHandler\");\n        if (((pa !== undefined))) {\n            this.setURI(pa);\n        }\n    ;\n    ;\n    };\n;\n    x(na, {\n        bootstrap: function(pa, qa, ra) {\n            var sa = \"GET\", ta = true, ua = {\n            };\n            if (((ra || ((qa && ((qa.rel == \"async-post\"))))))) {\n                sa = \"POST\";\n                ta = false;\n                if (pa) {\n                    pa = s(pa);\n                    ua = pa.getQueryData();\n                    pa.setQueryData({\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var va = ((p.byClass(qa, \"stat_elem\") || qa));\n            if (((va && j.hasClass(va, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var wa = new na(pa).setReadOnly(ta).setMethod(sa).setData(ua).setNectarModuleDataSafe(qa).setRelativeTo(qa);\n            if (qa) {\n                wa.setHandler(function(ya) {\n                    m.fire(qa, \"success\", {\n                        response: ya\n                    });\n                });\n                wa.setErrorHandler(function(ya) {\n                    if (((m.fire(qa, \"error\", {\n                        response: ya\n                    }) !== false))) {\n                        h.defaultErrorHandler(ya);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            if (va) {\n                wa.setStatusElement(va);\n                var xa = va.getAttribute(\"data-status-class\");\n                ((xa && wa.setStatusClass(xa)));\n            }\n        ;\n        ;\n            if (qa) {\n                m.fire(qa, \"AsyncRequest/send\", {\n                    request: wa\n                });\n            }\n        ;\n        ;\n            wa.send();\n            return false;\n        },\n        post: function(pa, qa) {\n            new na(pa).setReadOnly(false).setMethod(\"POST\").setData(qa).send();\n            return false;\n        },\n        getLastID: function() {\n            return la;\n        },\n        suppressOnloadToken: {\n        },\n        _inflight: [],\n        _inflightCount: 0,\n        _inflightAdd: y,\n        _inflightPurge: y,\n        getInflightCount: function() {\n            return this._inflightCount;\n        },\n        _inflightEnable: function() {\n            if (t.ie()) {\n                x(na, {\n                    _inflightAdd: function(pa) {\n                        this._inflight.push(pa);\n                    },\n                    _inflightPurge: function() {\n                        na._inflight = na._inflight.filter(function(pa) {\n                            return ((pa.transport && ((pa.transport.readyState < 4))));\n                        });\n                    }\n                });\n                q.onUnload(function() {\n                    na._inflight.forEach(function(pa) {\n                        if (((pa.transport && ((pa.transport.readyState < 4))))) {\n                            pa.transport.abort();\n                            delete pa.transport;\n                        }\n                    ;\n                    ;\n                    });\n                });\n            }\n        ;\n        ;\n        }\n    });\n    x(na.prototype, {\n        _dispatchResponse: function(pa) {\n            this.clearStatusIndicator();\n            if (!this._isRelevant()) {\n                this._invokeErrorHandler(1010);\n                return;\n            }\n        ;\n        ;\n            if (((this.initialHandler(pa) === false))) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__clearTimeout(this.timer);\n            if (pa.jscc_map) {\n                var qa = (eval)(pa.jscc_map);\n                o.init(qa);\n            }\n        ;\n        ;\n            var ra;\n            if (this.handler) {\n                try {\n                    ra = this._shouldSuppressJS(this.handler(pa));\n                } catch (sa) {\n                    ((pa.is_last && this.finallyHandler(pa)));\n                    throw sa;\n                };\n            }\n        ;\n        ;\n            if (!ra) {\n                this._handleJSResponse(pa);\n            }\n        ;\n        ;\n            ((pa.is_last && this.finallyHandler(pa)));\n        },\n        _shouldSuppressJS: function(pa) {\n            return ((pa === na.suppressOnloadToken));\n        },\n        _handleJSResponse: function(pa) {\n            var qa = this.getRelativeTo(), ra = pa.domops, sa = pa.jsmods, ta = new r().setRelativeTo(qa), ua;\n            if (((sa && sa.require))) {\n                ua = sa.require;\n                delete sa.require;\n            }\n        ;\n        ;\n            if (sa) {\n                ta.handle(sa);\n            }\n        ;\n        ;\n            var va = function(wa) {\n                if (((ra && wa))) {\n                    wa.invoke(ra, qa);\n                }\n            ;\n            ;\n                if (ua) {\n                    ta.handle({\n                        require: ua\n                    });\n                }\n            ;\n            ;\n                this._handleJSRegisters(pa, \"JSBNG__onload\");\n                if (this.lid) {\n                    g.inform(\"tti_ajax\", {\n                        s: this.lid,\n                        d: [((this._sendTimeStamp || 0)),((((this._sendTimeStamp && this._responseTime)) ? ((this._responseTime - this._sendTimeStamp)) : 0)),]\n                    }, g.BEHAVIOR_EVENT);\n                }\n            ;\n            ;\n                this._handleJSRegisters(pa, \"onafterload\");\n                ta.cleanup();\n            }.bind(this);\n            if (ra) {\n                i.loadModules([\"AsyncDOM\",], va);\n            }\n             else va(null);\n        ;\n        ;\n        },\n        _handleJSRegisters: function(pa, qa) {\n            var ra = pa[qa];\n            if (ra) {\n                for (var sa = 0; ((sa < ra.length)); sa++) {\n                    l.applyWithGuard(new Function(ra[sa]), this);\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        invokeResponseHandler: function(pa) {\n            if (((typeof (pa.redirect) !== \"undefined\"))) {\n                (function() {\n                    this.setURI(pa.redirect).send();\n                }).bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            if (((((!this.handler && !this.errorHandler)) && !this.transportErrorHandler))) {\n                return;\n            }\n        ;\n        ;\n            var qa = pa.asyncResponse;\n            if (((typeof (qa) !== \"undefined\"))) {\n                if (!this._isRelevant()) {\n                    this._invokeErrorHandler(1010);\n                    return;\n                }\n            ;\n            ;\n                if (qa.inlinejs) {\n                    z(qa.inlinejs);\n                }\n            ;\n            ;\n                if (qa.lid) {\n                    this._responseTime = JSBNG__Date.now();\n                    if (a.CavalryLogger) {\n                        this.cavalry = a.CavalryLogger.getInstance(qa.lid);\n                    }\n                ;\n                ;\n                    this.lid = qa.lid;\n                }\n            ;\n            ;\n                if (qa.resource_map) {\n                    i.setResourceMap(qa.resource_map);\n                }\n            ;\n            ;\n                if (qa.bootloadable) {\n                    i.enableBootload(qa.bootloadable);\n                }\n            ;\n            ;\n                da.add(qa.ixData);\n                var ra, sa;\n                if (((qa.getError() && !qa.getErrorIsWarning()))) {\n                    var ta = this.errorHandler.bind(this);\n                    ra = l.guard(this._dispatchErrorResponse, ((\"AsyncRequest#_dispatchErrorResponse for \" + this.getURI())));\n                    ra = ra.bind(this, qa, ta);\n                    sa = \"error\";\n                }\n                 else {\n                    ra = l.guard(this._dispatchResponse, ((\"AsyncRequest#_dispatchResponse for \" + this.getURI())));\n                    ra = ra.bind(this, qa);\n                    sa = \"response\";\n                }\n            ;\n            ;\n                ra = fa(ra, function() {\n                    g.inform(((\"AsyncRequest/\" + sa)), {\n                        request: this,\n                        response: qa\n                    });\n                }.bind(this));\n                ra = ra.defer.bind(ra);\n                var ua = false;\n                if (this.preBootloadHandler) {\n                    ua = this.preBootloadHandler(qa);\n                }\n            ;\n            ;\n                qa.css = ((qa.css || []));\n                qa.js = ((qa.js || []));\n                i.loadResources(qa.css.concat(qa.js), ra, ua, this.getURI());\n            }\n             else if (((typeof (pa.transportError) !== \"undefined\"))) {\n                if (this._xFbServer) {\n                    this._invokeErrorHandler(1008);\n                }\n                 else this._invokeErrorHandler(1012);\n            ;\n            ;\n            }\n             else this._invokeErrorHandler(1007);\n            \n        ;\n        ;\n        },\n        _invokeErrorHandler: function(pa) {\n            var qa;\n            if (((this.responseText === \"\"))) {\n                qa = 1002;\n            }\n             else if (this._requestAborted) {\n                qa = 1011;\n            }\n             else {\n                try {\n                    qa = ((((pa || this.transport.JSBNG__status)) || 1004));\n                } catch (ra) {\n                    qa = 1005;\n                };\n            ;\n                if (((false === JSBNG__navigator.onLine))) {\n                    qa = 1006;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var sa, ta, ua = true;\n            if (((qa === 1006))) {\n                ta = \"No Network Connection\";\n                sa = \"Your browser appears to be offline. Please check your internet connection and try again.\";\n            }\n             else if (((((qa >= 300)) && ((qa <= 399))))) {\n                ta = \"Redirection\";\n                sa = \"Your access to Facebook was redirected or blocked by a third party at this time, please contact your ISP or reload. \";\n                var va = this.transport.getResponseHeader(\"Location\");\n                if (va) {\n                    ba(va, true);\n                }\n            ;\n            ;\n                ua = true;\n            }\n             else {\n                ta = \"Oops\";\n                sa = \"Something went wrong. We're working on getting this fixed as soon as we can. You may be able to try again.\";\n            }\n            \n        ;\n        ;\n            var wa = new h(this);\n            x(wa, {\n                error: qa,\n                errorSummary: ta,\n                errorDescription: sa,\n                silentError: ua\n            });\n            (function() {\n                g.inform(\"AsyncRequest/error\", {\n                    request: this,\n                    response: wa\n                });\n            }).bind(this).defer();\n            if (((ga() && !this.getOption(\"handleErrorAfterUnload\")))) {\n                return;\n            }\n        ;\n        ;\n            if (!this.transportErrorHandler) {\n                return;\n            }\n        ;\n        ;\n            var xa = this.transportErrorHandler.bind(this);\n            !this.getOption(\"suppressErrorAlerts\");\n            l.applyWithGuard(this._dispatchErrorResponse, this, [wa,xa,]);\n        },\n        _dispatchErrorResponse: function(pa, qa) {\n            var ra = pa.getError();\n            this.clearStatusIndicator();\n            var sa = ((this._sendTimeStamp && {\n                duration: ((JSBNG__Date.now() - this._sendTimeStamp)),\n                xfb_ip: ((this._xFbServer || \"-\"))\n            }));\n            pa.logError(\"async_error\", sa);\n            if (((!this._isRelevant() || ((ra === 1010))))) {\n                this.abort();\n                return;\n            }\n        ;\n        ;\n            if (((((((((ra == 1357008)) || ((ra == 1357007)))) || ((ra == 1442002)))) || ((ra == 1357001))))) {\n                var ta = ((((ra == 1357008)) || ((ra == 1357007))));\n                this.interceptHandler(pa);\n                this._displayServerDialog(pa, ta);\n            }\n             else if (((this.initialHandler(pa) !== false))) {\n                JSBNG__clearTimeout(this.timer);\n                try {\n                    qa(pa);\n                } catch (ua) {\n                    this.finallyHandler(pa);\n                    throw ua;\n                };\n            ;\n                this.finallyHandler(pa);\n            }\n            \n        ;\n        ;\n        },\n        _displayServerDialog: function(pa, qa) {\n            var ra = pa.getPayload();\n            if (((ra.__dialog !== undefined))) {\n                this._displayServerLegacyDialog(pa, qa);\n                return;\n            }\n        ;\n        ;\n            var sa = ra.__dialogx;\n            new r().handle(sa);\n            i.loadModules([\"ConfirmationDialog\",], function(ta) {\n                ta.setupConfirmation(pa, this);\n            }.bind(this));\n        },\n        _displayServerLegacyDialog: function(pa, qa) {\n            var ra = pa.getPayload().__dialog;\n            i.loadModules([\"Dialog\",], function(sa) {\n                var ta = new sa(ra);\n                if (qa) {\n                    ta.setHandler(this._displayConfirmationHandler.bind(this, ta));\n                }\n            ;\n            ;\n                ta.setCancelHandler(function() {\n                    var ua = this.getServerDialogCancelHandler();\n                    try {\n                        ((ua && ua(pa)));\n                    } catch (va) {\n                        throw va;\n                    } finally {\n                        this.finallyHandler(pa);\n                    };\n                ;\n                }.bind(this)).setCausalElement(this.relativeTo).show();\n            }.bind(this));\n        },\n        _displayConfirmationHandler: function(pa) {\n            this.data.confirmed = 1;\n            x(this.data, pa.getFormData());\n            this.send();\n        },\n        setJSONPTransport: function(pa) {\n            pa.subscribe(\"response\", this._handleJSONPResponse.bind(this));\n            pa.subscribe(\"abort\", this._handleJSONPAbort.bind(this));\n            this.transport = pa;\n        },\n        _handleJSONPResponse: function(pa, qa) {\n            this.is_first = ((this.is_first === undefined));\n            var ra = this._interpretResponse(qa);\n            ra.asyncResponse.is_first = this.is_first;\n            ra.asyncResponse.is_last = this.transport.hasFinished();\n            this.invokeResponseHandler(ra);\n            if (this.transport.hasFinished()) {\n                delete this.transport;\n            }\n        ;\n        ;\n        },\n        _handleJSONPAbort: function() {\n            this._invokeErrorHandler();\n            delete this.transport;\n        },\n        _handleXHRResponse: function(pa) {\n            var qa;\n            if (this.getOption(\"suppressEvaluation\")) {\n                qa = {\n                    asyncResponse: new h(this, pa)\n                };\n            }\n             else {\n                var ra = pa.responseText, sa = null;\n                try {\n                    var ua = this._unshieldResponseText(ra);\n                    try {\n                        var va = (eval)(((((\"(\" + ua)) + \")\")));\n                        qa = this._interpretResponse(va);\n                    } catch (ta) {\n                        sa = \"excep\";\n                        qa = {\n                            transportError: ((\"eval() failed on async to \" + this.getURI()))\n                        };\n                    };\n                ;\n                } catch (ta) {\n                    sa = \"empty\";\n                    qa = {\n                        transportError: ta.message\n                    };\n                };\n            ;\n                if (sa) {\n                    var wa = a.ErrorSignal;\n                    ((wa && wa.sendErrorSignal(\"async_xport_resp\", [((((this._xFbServer ? \"1008_\" : \"1012_\")) + sa)),((this._xFbServer || \"-\")),this.getURI(),ra.length,ra.substr(0, 1600),].join(\":\"))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.invokeResponseHandler(qa);\n        },\n        _unshieldResponseText: function(pa) {\n            var qa = \"for (;;);\", ra = qa.length;\n            if (((pa.length <= ra))) {\n                throw new Error(((\"Response too short on async to \" + this.getURI())));\n            }\n        ;\n        ;\n            var sa = 0;\n            while (((((pa.charAt(sa) == \" \")) || ((pa.charAt(sa) == \"\\u000a\"))))) {\n                sa++;\n            ;\n            };\n        ;\n            ((sa && ((pa.substring(sa, ((sa + ra))) == qa))));\n            return pa.substring(((sa + ra)));\n        },\n        _interpretResponse: function(pa) {\n            if (pa.redirect) {\n                return {\n                    redirect: pa.redirect\n                };\n            }\n        ;\n        ;\n            var qa = new h(this);\n            if (((pa.__ar != 1))) {\n                qa.payload = pa;\n            }\n             else x(qa, pa);\n        ;\n        ;\n            return {\n                asyncResponse: qa\n            };\n        },\n        _onStateChange: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286), function() {\n            try {\n                if (((this.transport.readyState == 4))) {\n                    na._inflightCount--;\n                    na._inflightPurge();\n                    try {\n                        if (((((typeof (this.transport.getResponseHeader) !== \"undefined\")) && this.transport.getResponseHeader(\"X-FB-Debug\")))) {\n                            this._xFbServer = this.transport.getResponseHeader(\"X-FB-Debug\");\n                        }\n                    ;\n                    ;\n                    } catch (qa) {\n                    \n                    };\n                ;\n                    if (((((this.transport.JSBNG__status >= 200)) && ((this.transport.JSBNG__status < 300))))) {\n                        na.lastSuccessTime = JSBNG__Date.now();\n                        this._handleXHRResponse(this.transport);\n                    }\n                     else if (((t.webkit() && ((typeof (this.transport.JSBNG__status) == \"undefined\"))))) {\n                        this._invokeErrorHandler(1002);\n                    }\n                     else if (((((k.retry_ajax_on_network_error && ja(this.transport))) && ((this.remainingRetries > 0))))) {\n                        this.remainingRetries--;\n                        delete this.transport;\n                        this.send(true);\n                        return;\n                    }\n                     else this._invokeErrorHandler();\n                    \n                    \n                ;\n                ;\n                    if (((this.getOption(\"asynchronous\") !== false))) {\n                        delete this.transport;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            } catch (pa) {\n                if (ga()) {\n                    return;\n                }\n            ;\n            ;\n                delete this.transport;\n                if (((this.remainingRetries > 0))) {\n                    this.remainingRetries--;\n                    this.send(true);\n                }\n                 else {\n                    !this.getOption(\"suppressErrorAlerts\");\n                    var ra = a.ErrorSignal;\n                    ((ra && ra.sendErrorSignal(\"async_xport_resp\", [1007,((this._xFbServer || \"-\")),this.getURI(),pa.message,].join(\":\"))));\n                    this._invokeErrorHandler(1007);\n                }\n            ;\n            ;\n            };\n        ;\n        })),\n        _isMultiplexable: function() {\n            if (((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))) {\n                return false;\n            }\n        ;\n        ;\n            if (!this.uri.isFacebookURI()) {\n                return false;\n            }\n        ;\n        ;\n            if (!this.getOption(\"asynchronous\")) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        handleResponse: function(pa) {\n            var qa = this._interpretResponse(pa);\n            this.invokeResponseHandler(qa);\n        },\n        setMethod: function(pa) {\n            this.method = pa.toString().toUpperCase();\n            return this;\n        },\n        getMethod: function() {\n            return this.method;\n        },\n        setData: function(pa) {\n            this.data = pa;\n            return this;\n        },\n        _setDataHash: function() {\n            if (((((this.method != \"POST\")) || this.data.ttstamp))) {\n                return;\n            }\n        ;\n        ;\n            if (((typeof this.data.fb_dtsg !== \"string\"))) {\n                return;\n            }\n        ;\n        ;\n            var pa = \"\";\n            for (var qa = 0; ((qa < this.data.fb_dtsg.length)); qa++) {\n                pa += this.data.fb_dtsg.charCodeAt(qa);\n            ;\n            };\n        ;\n            this.data.ttstamp = ((\"2\" + pa));\n        },\n        setRawData: function(pa) {\n            this.rawData = pa;\n            return this;\n        },\n        getData: function() {\n            return this.data;\n        },\n        setContextData: function(pa, qa, ra) {\n            ra = ((((ra === undefined)) ? true : ra));\n            if (ra) {\n                this.context[((\"_log_\" + pa))] = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        _setUserActionID: function() {\n            var pa = ((((a.ArbiterMonitor && a.ArbiterMonitor.getUE())) || \"-\"));\n            this.userActionID = ((((((((a.EagleEye && a.EagleEye.getSessionID())) || \"-\")) + \"/\")) + pa));\n        },\n        setURI: function(pa) {\n            var qa = s(pa);\n            if (((this.getOption(\"useIframeTransport\") && !qa.isFacebookURI()))) {\n                return this;\n            }\n        ;\n        ;\n            if (((((((!this._allowCrossOrigin && !this.getOption(\"jsonp\"))) && !this.getOption(\"useIframeTransport\"))) && !qa.isSameOrigin()))) {\n                return this;\n            }\n        ;\n        ;\n            this._setUserActionID();\n            if (((!pa || qa.isEmpty()))) {\n                var ra = a.ErrorSignal, sa = a.getErrorStack;\n                if (((ra && sa))) {\n                    var ta = {\n                        err_code: 1013,\n                        vip: \"-\",\n                        duration: 0,\n                        xfb_ip: \"-\",\n                        path: window.JSBNG__location.href,\n                        aid: this.userActionID\n                    };\n                    ra.sendErrorSignal(\"async_error\", JSON.stringify(ta));\n                    ra.sendErrorSignal(\"async_xport_stack\", [1013,window.JSBNG__location.href,null,sa(),].join(\":\"));\n                }\n            ;\n            ;\n                return this;\n            }\n        ;\n        ;\n            this.uri = qa;\n            return this;\n        },\n        getURI: function() {\n            return this.uri.toString();\n        },\n        setInitialHandler: function(pa) {\n            this.initialHandler = pa;\n            return this;\n        },\n        setHandler: function(pa) {\n            if (ka(pa)) {\n                this.handler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        getHandler: function() {\n            return this.handler;\n        },\n        setUploadProgressHandler: function(pa) {\n            if (ka(pa)) {\n                this.uploadProgressHandler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setErrorHandler: function(pa) {\n            if (ka(pa)) {\n                this.errorHandler = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setTransportErrorHandler: function(pa) {\n            this.transportErrorHandler = pa;\n            return this;\n        },\n        getErrorHandler: function() {\n            return this.errorHandler;\n        },\n        getTransportErrorHandler: function() {\n            return this.transportErrorHandler;\n        },\n        setTimeoutHandler: function(pa, qa) {\n            if (ka(qa)) {\n                this.timeout = pa;\n                this.timeoutHandler = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        resetTimeout: function(pa) {\n            if (!((this.timeoutHandler === null))) {\n                if (((pa === null))) {\n                    this.timeout = null;\n                    JSBNG__clearTimeout(this.timer);\n                    this.timer = null;\n                }\n                 else {\n                    var qa = !this._allowCrossPageTransition;\n                    this.timeout = pa;\n                    JSBNG__clearTimeout(this.timer);\n                    this.timer = this._handleTimeout.bind(this).defer(this.timeout, qa);\n                }\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        _handleTimeout: function() {\n            this.abandon();\n            this.timeoutHandler(this);\n        },\n        setNewSerial: function() {\n            this.id = ++la;\n            return this;\n        },\n        setInterceptHandler: function(pa) {\n            this.interceptHandler = pa;\n            return this;\n        },\n        setFinallyHandler: function(pa) {\n            this.finallyHandler = pa;\n            return this;\n        },\n        setAbortHandler: function(pa) {\n            this.abortHandler = pa;\n            return this;\n        },\n        getServerDialogCancelHandler: function() {\n            return this.serverDialogCancelHandler;\n        },\n        setServerDialogCancelHandler: function(pa) {\n            this.serverDialogCancelHandler = pa;\n            return this;\n        },\n        setPreBootloadHandler: function(pa) {\n            this.preBootloadHandler = pa;\n            return this;\n        },\n        setReadOnly: function(pa) {\n            if (!((typeof (pa) != \"boolean\"))) {\n                this.readOnly = pa;\n            }\n        ;\n        ;\n            return this;\n        },\n        setFBMLForm: function() {\n            this.writeRequiredParams = [\"fb_sig\",];\n            return this;\n        },\n        getReadOnly: function() {\n            return this.readOnly;\n        },\n        setRelativeTo: function(pa) {\n            this.relativeTo = pa;\n            return this;\n        },\n        getRelativeTo: function() {\n            return this.relativeTo;\n        },\n        setStatusClass: function(pa) {\n            this.statusClass = pa;\n            return this;\n        },\n        setStatusElement: function(pa) {\n            this.statusElement = pa;\n            return this;\n        },\n        getStatusElement: function() {\n            return aa(this.statusElement);\n        },\n        _isRelevant: function() {\n            if (this._allowCrossPageTransition) {\n                return true;\n            }\n        ;\n        ;\n            if (!this.id) {\n                return true;\n            }\n        ;\n        ;\n            return ((this.id > ma));\n        },\n        clearStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.removeClass(pa, \"async_saving\");\n                j.removeClass(pa, this.statusClass);\n            }\n        ;\n        ;\n        },\n        addStatusIndicator: function() {\n            var pa = this.getStatusElement();\n            if (pa) {\n                j.addClass(pa, \"async_saving\");\n                j.addClass(pa, this.statusClass);\n            }\n        ;\n        ;\n        },\n        specifiesWriteRequiredParams: function() {\n            return this.writeRequiredParams.every(function(pa) {\n                this.data[pa] = ((((this.data[pa] || k[pa])) || ((aa(pa) || {\n                })).value));\n                if (((this.data[pa] !== undefined))) {\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            }, this);\n        },\n        setOption: function(pa, qa) {\n            if (((typeof (this.option[pa]) != \"undefined\"))) {\n                this.option[pa] = qa;\n            }\n        ;\n        ;\n            return this;\n        },\n        getOption: function(pa) {\n            ((typeof (this.option[pa]) == \"undefined\"));\n            return this.option[pa];\n        },\n        abort: function() {\n            if (this.transport) {\n                var pa = this.getTransportErrorHandler();\n                this.setOption(\"suppressErrorAlerts\", true);\n                this.setTransportErrorHandler(y);\n                this._requestAborted = true;\n                this.transport.abort();\n                this.setTransportErrorHandler(pa);\n            }\n        ;\n        ;\n            this.abortHandler();\n        },\n        abandon: function() {\n            JSBNG__clearTimeout(this.timer);\n            this.setOption(\"suppressErrorAlerts\", true).setHandler(y).setErrorHandler(y).setTransportErrorHandler(y);\n            if (this.transport) {\n                this._requestAborted = true;\n                this.transport.abort();\n            }\n        ;\n        ;\n        },\n        setNectarData: function(pa) {\n            if (pa) {\n                if (((this.data.nctr === undefined))) {\n                    this.data.nctr = {\n                    };\n                }\n            ;\n            ;\n                x(this.data.nctr, pa);\n            }\n        ;\n        ;\n            return this;\n        },\n        setNectarModuleDataSafe: function(pa) {\n            if (this.setNectarModuleData) {\n                this.setNectarModuleData(pa);\n            }\n        ;\n        ;\n            return this;\n        },\n        setNectarImpressionIdSafe: function() {\n            if (this.setNectarImpressionId) {\n                this.setNectarImpressionId();\n            }\n        ;\n        ;\n            return this;\n        },\n        setAllowCrossPageTransition: function(pa) {\n            this._allowCrossPageTransition = !!pa;\n            if (this.timer) {\n                this.resetTimeout(this.timeout);\n            }\n        ;\n        ;\n            return this;\n        },\n        setAllowCrossOrigin: function(pa) {\n            this._allowCrossOrigin = pa;\n            return this;\n        },\n        send: function(pa) {\n            pa = ((pa || false));\n            if (!this.uri) {\n                return false;\n            }\n        ;\n        ;\n            ((!this.errorHandler && !this.getOption(\"suppressErrorHandlerWarning\")));\n            if (((this.getOption(\"jsonp\") && ((this.method != \"GET\"))))) {\n                this.setMethod(\"GET\");\n            }\n        ;\n        ;\n            if (((this.getOption(\"useIframeTransport\") && ((this.method != \"GET\"))))) {\n                this.setMethod(\"GET\");\n            }\n        ;\n        ;\n            ((((this.timeoutHandler !== null)) && ((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))));\n            if (!this.getReadOnly()) {\n                this.specifiesWriteRequiredParams();\n                if (((this.method != \"POST\"))) {\n                    return false;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            x(this.data, u.getAsyncParams(this.method));\n            if (!ca(this.context)) {\n                x(this.data, this.context);\n                this.data.ajax_log = 1;\n            }\n        ;\n        ;\n            if (k.force_param) {\n                x(this.data, k.force_param);\n            }\n        ;\n        ;\n            this._setUserActionID();\n            if (((this.getOption(\"bundle\") && this._isMultiplexable()))) {\n                oa.schedule(this);\n                return true;\n            }\n        ;\n        ;\n            this.setNewSerial();\n            if (!this.getOption(\"asynchronous\")) {\n                this.uri.addQueryData({\n                    __s: 1\n                });\n            }\n        ;\n        ;\n            this.finallyHandler = v(this.finallyHandler, \"final\");\n            var qa, ra;\n            if (((((this.method == \"GET\")) || this.rawData))) {\n                qa = this.uri.addQueryData(this.data).toString();\n                ra = ((this.rawData || \"\"));\n            }\n             else {\n                qa = this.uri.toString();\n                this._setDataHash();\n                ra = s.implodeQuery(this.data);\n            }\n        ;\n        ;\n            if (this.transport) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.getOption(\"jsonp\") || this.getOption(\"useIframeTransport\")))) {\n                d([\"JSONPTransport\",], function(va) {\n                    var wa = new va(((this.getOption(\"jsonp\") ? \"jsonp\" : \"div\")), this.uri);\n                    this.setJSONPTransport(wa);\n                    wa.send();\n                }.bind(this));\n                return true;\n            }\n        ;\n        ;\n            var sa = u.create();\n            if (!sa) {\n                return false;\n            }\n        ;\n        ;\n            sa.JSBNG__onreadystatechange = v(this._onStateChange.bind(this), \"xhr\");\n            if (((this.uploadProgressHandler && ha(sa)))) {\n                sa.upload.JSBNG__onprogress = this.uploadProgressHandler.bind(this);\n            }\n        ;\n        ;\n            if (!pa) {\n                this.remainingRetries = this.getOption(\"retries\");\n            }\n        ;\n        ;\n            if (((a.ErrorSignal || a.ArbiterMonitor))) {\n                this._sendTimeStamp = ((this._sendTimeStamp || JSBNG__Date.now()));\n            }\n        ;\n        ;\n            this.transport = sa;\n            try {\n                this.transport.open(this.method, qa, this.getOption(\"asynchronous\"));\n            } catch (ta) {\n                return false;\n            };\n        ;\n            var ua = k.svn_rev;\n            if (ua) {\n                this.transport.setRequestHeader(\"X-SVN-Rev\", String(ua));\n            }\n        ;\n        ;\n            if (((((!this.uri.isSameOrigin() && !this.getOption(\"jsonp\"))) && !this.getOption(\"useIframeTransport\")))) {\n                if (!ia(this.transport)) {\n                    return false;\n                }\n            ;\n            ;\n                if (this.uri.isFacebookURI()) {\n                    this.transport.withCredentials = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((this.method == \"POST\")) && !this.rawData))) {\n                this.transport.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            }\n        ;\n        ;\n            g.inform(\"AsyncRequest/send\", {\n                request: this\n            });\n            this.addStatusIndicator();\n            this.transport.send(ra);\n            if (((this.timeout !== null))) {\n                this.resetTimeout(this.timeout);\n            }\n        ;\n        ;\n            na._inflightCount++;\n            na._inflightAdd(this);\n            return true;\n        }\n    });\n    function oa() {\n        this._requests = [];\n    };\n;\n    x(oa, {\n        multiplex: null,\n        schedule: function(pa) {\n            if (!oa.multiplex) {\n                oa.multiplex = new oa();\n                (function() {\n                    oa.multiplex.send();\n                    oa.multiplex = null;\n                }).defer();\n            }\n        ;\n        ;\n            oa.multiplex.add(pa);\n        }\n    });\n    x(oa.prototype, {\n        add: function(pa) {\n            this._requests.push(pa);\n        },\n        send: function() {\n            var pa = this._requests;\n            if (!pa.length) {\n                return;\n            }\n        ;\n        ;\n            var qa;\n            if (((pa.length === 1))) {\n                qa = pa[0];\n            }\n             else {\n                var ra = pa.map(function(sa) {\n                    return [sa.uri.getPath(),s.implodeQuery(sa.data),];\n                });\n                qa = new na(\"/ajax/proxy.php\").setAllowCrossPageTransition(true).setData({\n                    data: ra\n                }).setHandler(this._handler.bind(this)).setTransportErrorHandler(this._transportErrorHandler.bind(this));\n            }\n        ;\n        ;\n            qa.setOption(\"bundle\", false).send();\n        },\n        _handler: function(pa) {\n            var qa = pa.getPayload().responses;\n            if (((qa.length !== this._requests.length))) {\n                return;\n            }\n        ;\n        ;\n            for (var ra = 0; ((ra < this._requests.length)); ra++) {\n                var sa = this._requests[ra], ta = sa.uri.getPath();\n                sa.id = this.id;\n                if (((qa[ra][0] !== ta))) {\n                    sa.invokeResponseHandler({\n                        transportError: ((\"Wrong response order in bundled request to \" + ta))\n                    });\n                    continue;\n                }\n            ;\n            ;\n                sa.handleResponse(qa[ra][1]);\n            };\n        ;\n        },\n        _transportErrorHandler: function(pa) {\n            var qa = {\n                transportError: pa.errorDescription\n            }, ra = this._requests.map(function(sa) {\n                sa.id = this.id;\n                sa.invokeResponseHandler(qa);\n                return sa.uri.getPath();\n            });\n        }\n    });\n    e.exports = na;\n});\n__d(\"CookieCore\", [], function(a, b, c, d, e, f) {\n    var g = {\n        set: function(h, i, j, k, l) {\n            JSBNG__document.cookie = ((((((((((((((((((h + \"=\")) + encodeURIComponent(i))) + \"; \")) + ((j ? ((((\"expires=\" + (new JSBNG__Date(((JSBNG__Date.now() + j)))).toGMTString())) + \"; \")) : \"\")))) + \"path=\")) + ((k || \"/\")))) + \"; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"))) + ((l ? \"; secure\" : \"\"))));\n        },\n        clear: function(h, i) {\n            i = ((i || \"/\"));\n            JSBNG__document.cookie = ((((((((((h + \"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; \")) + \"path=\")) + i)) + \"; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        },\n        get: function(h) {\n            var i = JSBNG__document.cookie.match(((((\"(?:^|;\\\\s*)\" + h)) + \"=(.*?)(?:;|$)\")));\n            return ((i ? decodeURIComponent(i[1]) : i));\n        }\n    };\n    e.exports = g;\n});\n__d(\"Cookie\", [\"CookieCore\",\"Env\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CookieCore\"), h = b(\"Env\"), i = b(\"copyProperties\");\n    function j(l, m, n, o, p) {\n        if (((h.no_cookies && ((l != \"tpa\"))))) {\n            return;\n        }\n    ;\n    ;\n        g.set(l, m, n, o, p);\n    };\n;\n    var k = i({\n    }, g);\n    k.set = j;\n    e.exports = k;\n});\n__d(\"DOMControl\", [\"DataStore\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.root = h(k);\n        this.updating = false;\n        g.set(k, \"DOMControl\", this);\n    };\n;\n    i(j.prototype, {\n        getRoot: function() {\n            return this.root;\n        },\n        beginUpdate: function() {\n            if (this.updating) {\n                return false;\n            }\n        ;\n        ;\n            this.updating = true;\n            return true;\n        },\n        endUpdate: function() {\n            this.updating = false;\n        },\n        update: function(k) {\n            if (!this.beginUpdate()) {\n                return this;\n            }\n        ;\n        ;\n            this.onupdate(k);\n            this.endUpdate();\n        },\n        onupdate: function(k) {\n        \n        }\n    });\n    j.getInstance = function(k) {\n        return g.get(k, \"DOMControl\");\n    };\n    e.exports = j;\n});\n__d(\"hyphenate\", [], function(a, b, c, d, e, f) {\n    var g = /([A-Z])/g;\n    function h(i) {\n        return i.replace(g, \"-$1\").toLowerCase();\n    };\n;\n    e.exports = h;\n});\n__d(\"Style\", [\"DOMQuery\",\"UserAgent\",\"$\",\"copyProperties\",\"hyphenate\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"UserAgent\"), i = b(\"$\"), j = b(\"copyProperties\"), k = b(\"hyphenate\");\n    function l(s) {\n        return s.replace(/-(.)/g, function(t, u) {\n            return u.toUpperCase();\n        });\n    };\n;\n    function m(s, t) {\n        var u = r.get(s, t);\n        return ((((u === \"auto\")) || ((u === \"JSBNG__scroll\"))));\n    };\n;\n    var n = new RegExp(((((((((\"\\\\s*\" + \"([^\\\\s:]+)\")) + \"\\\\s*:\\\\s*\")) + \"([^;('\\\"]*(?:(?:\\\\([^)]*\\\\)|\\\"[^\\\"]*\\\"|'[^']*')[^;(?:'\\\"]*)*)\")) + \"(?:;|$)\")), \"g\");\n    function o(s) {\n        var t = {\n        };\n        s.replace(n, function(u, v, w) {\n            t[v] = w;\n        });\n        return t;\n    };\n;\n    function p(s) {\n        var t = \"\";\n        {\n            var fin39keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin39i = (0);\n            var u;\n            for (; (fin39i < fin39keys.length); (fin39i++)) {\n                ((u) = (fin39keys[fin39i]));\n                {\n                    if (s[u]) {\n                        t += ((((((u + \":\")) + s[u])) + \";\"));\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n;\n    function q(s) {\n        return ((((s !== \"\")) ? ((((\"alpha(opacity=\" + ((s * 100)))) + \")\")) : \"\"));\n    };\n;\n    var r = {\n        set: function(s, t, u) {\n            switch (t) {\n              case \"opacity\":\n                if (((h.ie() < 9))) {\n                    s.style.filter = q(u);\n                }\n                 else s.style.opacity = u;\n            ;\n            ;\n                break;\n              case \"float\":\n                s.style.cssFloat = s.style.styleFloat = ((u || \"\"));\n                break;\n              default:\n                try {\n                    s.style[l(t)] = u;\n                } catch (v) {\n                    throw new Error(((((((((\"Style.set: \\\"\" + t)) + \"\\\" argument is invalid: \\\"\")) + u)) + \"\\\"\")));\n                };\n            ;\n            };\n        ;\n        },\n        apply: function(s, t) {\n            var u;\n            if (((((\"opacity\" in t)) && ((h.ie() < 9))))) {\n                var v = t.opacity;\n                t.filter = q(v);\n                delete t.opacity;\n            }\n        ;\n        ;\n            var w = o(s.style.cssText);\n            {\n                var fin40keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin40i = (0);\n                (0);\n                for (; (fin40i < fin40keys.length); (fin40i++)) {\n                    ((u) = (fin40keys[fin40i]));\n                    {\n                        var x = t[u];\n                        delete t[u];\n                        u = k(u);\n                        {\n                            var fin41keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin41i = (0);\n                            var y;\n                            for (; (fin41i < fin41keys.length); (fin41i++)) {\n                                ((y) = (fin41keys[fin41i]));\n                                {\n                                    if (((((y === u)) || ((y.indexOf(((u + \"-\"))) === 0))))) {\n                                        delete w[y];\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                        t[u] = x;\n                    };\n                };\n            };\n        ;\n            t = j(w, t);\n            s.style.cssText = p(t);\n            if (((h.ie() < 9))) {\n                {\n                    var fin42keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin42i = (0);\n                    (0);\n                    for (; (fin42i < fin42keys.length); (fin42i++)) {\n                        ((u) = (fin42keys[fin42i]));\n                        {\n                            if (!t[u]) {\n                                r.set(s, u, \"\");\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        get: function(s, t) {\n            s = i(s);\n            var u;\n            if (window.JSBNG__getComputedStyle) {\n                u = window.JSBNG__getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((JSBNG__document.defaultView && JSBNG__document.defaultView.JSBNG__getComputedStyle))) {\n                u = JSBNG__document.defaultView.JSBNG__getComputedStyle(s, null);\n                if (u) {\n                    return u.getPropertyValue(k(t));\n                }\n            ;\n            ;\n                if (((t == \"display\"))) {\n                    return \"none\";\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            t = l(t);\n            if (s.currentStyle) {\n                if (((t === \"float\"))) {\n                    return ((s.currentStyle.cssFloat || s.currentStyle.styleFloat));\n                }\n            ;\n            ;\n                return s.currentStyle[t];\n            }\n        ;\n        ;\n            return ((s.style && s.style[t]));\n        },\n        getFloat: function(s, t) {\n            return parseFloat(r.get(s, t), 10);\n        },\n        getOpacity: function(s) {\n            s = i(s);\n            var t = r.get(s, \"filter\"), u = null;\n            if (((t && (u = /(\\d+(?:\\.\\d+)?)/.exec(t))))) {\n                return ((parseFloat(u.pop()) / 100));\n            }\n             else if (t = r.get(s, \"opacity\")) {\n                return parseFloat(t);\n            }\n             else return 1\n            \n        ;\n        },\n        isFixed: function(s) {\n            while (g.contains(JSBNG__document.body, s)) {\n                if (((r.get(s, \"position\") === \"fixed\"))) {\n                    return true;\n                }\n            ;\n            ;\n                s = s.parentNode;\n            };\n        ;\n            return false;\n        },\n        getScrollParent: function(s) {\n            if (!s) {\n                return null;\n            }\n        ;\n        ;\n            while (((s !== JSBNG__document.body))) {\n                if (((((m(s, \"overflow\") || m(s, \"overflowY\"))) || m(s, \"overflowX\")))) {\n                    return s;\n                }\n            ;\n            ;\n                s = s.parentNode;\n            };\n        ;\n            return window;\n        }\n    };\n    e.exports = r;\n});\n__d(\"DOMDimensions\", [\"DOMQuery\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Style\"), i = {\n        getElementDimensions: function(j) {\n            return {\n                width: ((j.offsetWidth || 0)),\n                height: ((j.offsetHeight || 0))\n            };\n        },\n        getViewportDimensions: function() {\n            var j = ((((((((window && window.JSBNG__innerWidth)) || ((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientWidth)))) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientWidth)))) || 0)), k = ((((((((window && window.JSBNG__innerHeight)) || ((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientHeight)))) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientHeight)))) || 0));\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getViewportWithoutScrollbarDimensions: function() {\n            var j = ((((((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientWidth)) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientWidth)))) || 0)), k = ((((((((JSBNG__document && JSBNG__document.documentElement)) && JSBNG__document.documentElement.clientHeight)) || ((((JSBNG__document && JSBNG__document.body)) && JSBNG__document.body.clientHeight)))) || 0));\n            return {\n                width: j,\n                height: k\n            };\n        },\n        getDocumentDimensions: function(j) {\n            j = ((j || JSBNG__document));\n            var k = g.getDocumentScrollElement(j), l = ((k.scrollWidth || 0)), m = ((k.scrollHeight || 0));\n            return {\n                width: l,\n                height: m\n            };\n        },\n        measureElementBox: function(j, k, l, m, n) {\n            var o;\n            switch (k) {\n              case \"left\":\n            \n              case \"right\":\n            \n              case \"JSBNG__top\":\n            \n              case \"bottom\":\n                o = [k,];\n                break;\n              case \"width\":\n                o = [\"left\",\"right\",];\n                break;\n              case \"height\":\n                o = [\"JSBNG__top\",\"bottom\",];\n                break;\n              default:\n                throw Error(((\"Invalid plane: \" + k)));\n            };\n        ;\n            var p = function(q, r) {\n                var s = 0;\n                for (var t = 0; ((t < o.length)); t++) {\n                    s += ((parseInt(h.get(j, ((((((q + \"-\")) + o[t])) + r))), 10) || 0));\n                ;\n                };\n            ;\n                return s;\n            };\n            return ((((((l ? p(\"padding\", \"\") : 0)) + ((m ? p(\"border\", \"-width\") : 0)))) + ((n ? p(\"margin\", \"\") : 0))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Focus\", [\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"Run\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Run\"), k = b(\"cx\"), l = b(\"ge\"), m = {\n    }, n, o = {\n        set: function(s) {\n            try {\n                s.tabIndex = s.tabIndex;\n                s.JSBNG__focus();\n            } catch (t) {\n            \n            };\n        ;\n        },\n        setWithoutOutline: function(s) {\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            var t = i.listen(s, \"JSBNG__blur\", function() {\n                g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n                t.remove();\n            });\n            o.set(s);\n        },\n        relocate: function(s, t) {\n            p();\n            var u = h.getID(s);\n            m[u] = t;\n            g.addClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            j.onLeave(r.curry(u));\n        },\n        reset: function(s) {\n            var t = h.getID(s);\n            g.removeClass(s, \"-cx-PRIVATE-focus__nooutline\");\n            if (m[t]) {\n                g.removeClass(m[t], \"-cx-PRIVATE-focus__nativeoutline\");\n                delete m[t];\n            }\n        ;\n        ;\n        }\n    };\n    function p() {\n        if (n) {\n            return;\n        }\n    ;\n    ;\n        i.listen(JSBNG__document.documentElement, \"focusout\", q);\n        i.listen(JSBNG__document.documentElement, \"focusin\", q);\n        n = true;\n    };\n;\n    function q(JSBNG__event) {\n        var s = JSBNG__event.getTarget();\n        if (!g.hasClass(s, \"-cx-PRIVATE-focus__nooutline\")) {\n            return;\n        }\n    ;\n    ;\n        if (m[s.id]) {\n            g.conditionClass(m[s.id], \"-cx-PRIVATE-focus__nativeoutline\", ((((JSBNG__event.type === \"focusin\")) || ((JSBNG__event.type === \"JSBNG__focus\")))));\n        }\n    ;\n    ;\n    };\n;\n    function r(s) {\n        if (((m[s] && !l(s)))) {\n            delete m[s];\n        }\n    ;\n    ;\n    };\n;\n    e.exports = o;\n});\n__d(\"Input\", [\"JSBNG__CSS\",\"DOMQuery\",\"DOMControl\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOMQuery\"), i = b(\"DOMControl\"), j = function(l) {\n        var m = l.getAttribute(\"maxlength\");\n        if (((m && ((m > 0))))) {\n            d([\"enforceMaxLength\",], function(n) {\n                n(l, m);\n            });\n        }\n    ;\n    ;\n    }, k = {\n        isEmpty: function(l) {\n            return ((!(/\\S/).test(((l.value || \"\"))) || g.hasClass(l, \"DOMControl_placeholder\")));\n        },\n        getValue: function(l) {\n            return ((k.isEmpty(l) ? \"\" : l.value));\n        },\n        setValue: function(l, m) {\n            g.removeClass(l, \"DOMControl_placeholder\");\n            l.value = ((m || \"\"));\n            j(l);\n            var n = i.getInstance(l);\n            ((((n && n.resetHeight)) && n.resetHeight()));\n        },\n        setPlaceholder: function(l, m) {\n            l.setAttribute(\"aria-label\", m);\n            l.setAttribute(\"placeholder\", m);\n            if (((l == JSBNG__document.activeElement))) {\n                return;\n            }\n        ;\n        ;\n            if (k.isEmpty(l)) {\n                g.conditionClass(l, \"DOMControl_placeholder\", m);\n                l.value = ((m || \"\"));\n            }\n        ;\n        ;\n        },\n        reset: function(l) {\n            var m = ((((l !== JSBNG__document.activeElement)) ? ((l.getAttribute(\"placeholder\") || \"\")) : \"\"));\n            l.value = m;\n            g.conditionClass(l, \"DOMControl_placeholder\", m);\n            l.style.height = \"\";\n        },\n        setSubmitOnEnter: function(l, m) {\n            g.conditionClass(l, \"enter_submit\", m);\n        },\n        getSubmitOnEnter: function(l) {\n            return g.hasClass(l, \"enter_submit\");\n        },\n        setMaxLength: function(l, m) {\n            if (((m > 0))) {\n                l.setAttribute(\"maxlength\", m);\n                j(l);\n            }\n             else l.removeAttribute(\"maxlength\");\n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"flattenArray\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = h.slice(), j = [];\n        while (i.length) {\n            var k = i.pop();\n            if (Array.isArray(k)) {\n                Array.prototype.push.apply(i, k);\n            }\n             else j.push(k);\n        ;\n        ;\n        };\n    ;\n        return j.reverse();\n    };\n;\n    e.exports = g;\n});\n__d(\"JSXDOM\", [\"DOM\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"flattenArray\"), i = [\"a\",\"br\",\"button\",\"canvas\",\"checkbox\",\"dd\",\"div\",\"dl\",\"dt\",\"em\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"i\",\"div\",\"img\",\"input\",\"label\",\"li\",\"option\",\"p\",\"pre\",\"select\",\"span\",\"strong\",\"table\",\"tbody\",\"thead\",\"td\",\"textarea\",\"th\",\"tr\",\"ul\",\"video\",], j = {\n    };\n    i.forEach(function(k) {\n        var l = function(m, n) {\n            if (((arguments.length > 2))) {\n                n = Array.prototype.slice.call(arguments, 1);\n            }\n        ;\n        ;\n            if (((!n && m))) {\n                n = m.children;\n                delete m.children;\n            }\n        ;\n        ;\n            if (n) {\n                n = ((Array.isArray(n) ? h(n) : h([n,])));\n            }\n        ;\n        ;\n            return g.create(k, m, n);\n        };\n        j[k] = l;\n    });\n    e.exports = j;\n});\n__d(\"TidyArbiterMixin\", [\"Arbiter\",\"ArbiterMixin\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = {\n    };\n    j(k, h, {\n        _getArbiterInstance: function() {\n            if (!this._arbiter) {\n                this._arbiter = new g();\n                i.onLeave(function() {\n                    delete this._arbiter;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this._arbiter;\n        }\n    });\n    e.exports = k;\n});\n__d(\"TidyArbiter\", [\"TidyArbiterMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TidyArbiterMixin\"), h = b(\"copyProperties\"), i = {\n    };\n    h(i, g);\n    e.exports = i;\n});\n__d(\"collectDataAttributes\", [\"getContextualParent\",], function(a, b, c, d, e, f) {\n    var g = b(\"getContextualParent\");\n    function h(i, j) {\n        var k = {\n        }, l = {\n        }, m = j.length, n;\n        for (n = 0; ((n < m)); ++n) {\n            k[j[n]] = {\n            };\n            l[j[n]] = ((\"data-\" + j[n]));\n        };\n    ;\n        var o = {\n            tn: \"\",\n            \"tn-debug\": \",\"\n        };\n        while (i) {\n            if (i.getAttribute) {\n                for (n = 0; ((n < m)); ++n) {\n                    var p = i.getAttribute(l[j[n]]);\n                    if (p) {\n                        var q = JSON.parse(p);\n                        {\n                            var fin43keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin43i = (0);\n                            var r;\n                            for (; (fin43i < fin43keys.length); (fin43i++)) {\n                                ((r) = (fin43keys[fin43i]));\n                                {\n                                    if (((o[r] !== undefined))) {\n                                        if (((k[j[n]][r] === undefined))) {\n                                            k[j[n]][r] = [];\n                                        }\n                                    ;\n                                    ;\n                                        k[j[n]][r].push(q[r]);\n                                    }\n                                     else if (((k[j[n]][r] === undefined))) {\n                                        k[j[n]][r] = q[r];\n                                    }\n                                    \n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            i = g(i);\n        };\n    ;\n        {\n            var fin44keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin44i = (0);\n            var s;\n            for (; (fin44i < fin44keys.length); (fin44i++)) {\n                ((s) = (fin44keys[fin44i]));\n                {\n                    {\n                        var fin45keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin45i = (0);\n                        var t;\n                        for (; (fin45i < fin45keys.length); (fin45i++)) {\n                            ((t) = (fin45keys[fin45i]));\n                            {\n                                if (((k[s][t] !== undefined))) {\n                                    k[s][t] = k[s][t].join(o[t]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"csx\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        throw new Error(\"csx(...): Unexpected class selector transformation.\");\n    };\n;\n    e.exports = g;\n});\n__d(\"isInIframe\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((window != window.JSBNG__top));\n    };\n;\n    e.exports = g;\n});\n__d(\"TimelineCoverCollapse\", [\"Arbiter\",\"DOMDimensions\",\"Style\",\"TidyArbiter\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMDimensions\"), i = b(\"Style\"), j = b(\"TidyArbiter\"), k = b(\"$\");\n    f.collapse = function(l, m) {\n        m--;\n        var n = h.getViewportDimensions().height, o = h.getDocumentDimensions().height, p = ((n + m));\n        if (((o <= p))) {\n            i.set(k(\"pagelet_timeline_main_column\"), \"min-height\", ((p + \"px\")));\n        }\n    ;\n    ;\n        window.JSBNG__scrollBy(0, m);\n        j.inform(\"TimelineCover/coverCollapsed\", m, g.BEHAVIOR_STATE);\n    };\n});\n__d(\"foldl\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = 0, l = i.length;\n        if (((l === 0))) {\n            if (((j === undefined))) {\n                throw new TypeError(\"Reduce of empty array with no initial value\");\n            }\n        ;\n        ;\n            return j;\n        }\n    ;\n    ;\n        if (((j === undefined))) {\n            j = i[k++];\n        }\n    ;\n    ;\n        while (((k < l))) {\n            if (((k in i))) {\n                j = h(j, i[k]);\n            }\n        ;\n        ;\n            k++;\n        };\n    ;\n        return j;\n    };\n;\n    e.exports = g;\n});\n__d(\"FacebarStructuredFragment\", [], function(a, b, c, d, e, f) {\n    function g(i, j) {\n        if (((i && j))) {\n            return ((i.toLowerCase() == j.toLowerCase()));\n        }\n         else return ((!i && !j))\n    ;\n    };\n;\n    function h(i) {\n        this._text = String(i.text);\n        this._uid = ((i.uid ? String(i.uid) : null));\n        this._type = ((i.type ? String(i.type) : null));\n        this._typeParts = null;\n    };\n;\n    h.prototype.getText = function() {\n        return this._text;\n    };\n    h.prototype.getUID = function() {\n        return this._uid;\n    };\n    h.prototype.getType = function() {\n        return this._type;\n    };\n    h.prototype.getTypePart = function(i) {\n        return this._getTypeParts()[i];\n    };\n    h.prototype.getLength = function() {\n        return this._text.length;\n    };\n    h.prototype.isType = function(i) {\n        for (var j = 0; ((j < arguments.length)); j++) {\n            if (!g(arguments[j], this.getTypePart(j))) {\n                return false;\n            }\n        ;\n        ;\n        };\n    ;\n        return true;\n    };\n    h.prototype.isWhitespace = function() {\n        return (/^\\s*$/).test(this._text);\n    };\n    h.prototype.toStruct = function() {\n        return {\n            text: this._text,\n            type: this._type,\n            uid: this._uid\n        };\n    };\n    h.prototype.getHash = function(i) {\n        var j = ((((i != null)) ? this._getTypeParts().slice(0, i).join(\":\") : this._type));\n        return ((((j + \"::\")) + this._text));\n    };\n    h.prototype._getTypeParts = function() {\n        if (((this._typeParts === null))) {\n            this._typeParts = ((this._type ? this._type.split(\":\") : []));\n        }\n    ;\n    ;\n        return this._typeParts;\n    };\n    e.exports = h;\n});\n__d(\"FacebarStructuredText\", [\"createArrayFrom\",\"foldl\",\"FacebarStructuredFragment\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"foldl\"), i = b(\"FacebarStructuredFragment\"), j = /\\s+$/;\n    function k(o) {\n        if (!o) {\n            return [];\n        }\n         else if (((o instanceof n))) {\n            return o.toArray();\n        }\n         else return g(o).map(function(p) {\n            return new i(p);\n        })\n        \n    ;\n    };\n;\n    function l(o) {\n        return new i({\n            text: o,\n            type: \"text\"\n        });\n    };\n;\n    function m(o, p, q) {\n        var r = o.getText(), s = r.replace(p, q);\n        if (((r != s))) {\n            return new i({\n                text: s,\n                type: o.getType(),\n                uid: o.getUID()\n            });\n        }\n         else return o\n    ;\n    };\n;\n    function n(o) {\n        this._fragments = ((o || []));\n        this._hash = null;\n    };\n;\n    n.prototype.matches = function(o, p) {\n        if (o) {\n            var q = this._fragments, r = o._fragments;\n            return ((((q.length == r.length)) && !q.some(function(s, t) {\n                if (((!p && s.getUID()))) {\n                    return ((s.getUID() != r[t].getUID()));\n                }\n                 else return ((((s.getText() != r[t].getText())) || ((s.getType() != r[t].getType()))))\n            ;\n            })));\n        }\n    ;\n    ;\n        return false;\n    };\n    n.prototype.trim = function() {\n        var o = null, p = null;\n        this.forEach(function(r, s) {\n            if (!r.isWhitespace()) {\n                if (((o === null))) {\n                    o = s;\n                }\n            ;\n            ;\n                p = s;\n            }\n        ;\n        ;\n        });\n        if (((p !== null))) {\n            var q = this._fragments.slice(o, ((p + 1)));\n            q.push(m(q.pop(), j, \"\"));\n            return new n(q);\n        }\n         else return new n([])\n    ;\n    };\n    n.prototype.pad = function() {\n        var o = this.getFragment(-1);\n        if (((((o && !j.test(o.getText()))) && ((o.getText() !== \"\"))))) {\n            return new n(this._fragments.concat(l(\" \")));\n        }\n         else return this\n    ;\n    };\n    n.prototype.forEach = function(o) {\n        this._fragments.forEach(o);\n        return this;\n    };\n    n.prototype.matchType = function(o) {\n        var p = null;\n        for (var q = 0; ((q < this._fragments.length)); q++) {\n            var r = this._fragments[q], s = r.isType.apply(r, arguments);\n            if (((s && !p))) {\n                p = r;\n            }\n             else if (((s || !r.isWhitespace()))) {\n                return null;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return p;\n    };\n    n.prototype.hasType = function(o) {\n        var p = arguments;\n        return this._fragments.some(function(q) {\n            return ((!q.isWhitespace() && q.isType.apply(q, p)));\n        });\n    };\n    n.prototype.isEmptyOrWhitespace = function() {\n        return !this._fragments.some(function(o) {\n            return !o.isWhitespace();\n        });\n    };\n    n.prototype.isEmpty = function() {\n        return ((this.getLength() === 0));\n    };\n    n.prototype.getFragment = function(o) {\n        return this._fragments[((((o >= 0)) ? o : ((this._fragments.length + o))))];\n    };\n    n.prototype.getCount = function() {\n        return this._fragments.length;\n    };\n    n.prototype.getLength = function() {\n        return h(function(o, p) {\n            return ((o + p.getLength()));\n        }, this._fragments, 0);\n    };\n    n.prototype.toStruct = function() {\n        return this._fragments.map(function(o) {\n            return o.toStruct();\n        });\n    };\n    n.prototype.toArray = function() {\n        return this._fragments.slice();\n    };\n    n.prototype.toString = function() {\n        return this._fragments.map(function(o) {\n            return o.getText();\n        }).join(\"\");\n    };\n    n.prototype.getHash = function() {\n        if (((this._hash === null))) {\n            this._hash = this._fragments.map(function(o) {\n                if (o.getUID()) {\n                    return ((((\"[[\" + o.getHash(1))) + \"]]\"));\n                }\n                 else return o.getText()\n            ;\n            }).join(\"\");\n        }\n    ;\n    ;\n        return this._hash;\n    };\n    n.fromStruct = function(o) {\n        return new n(k(o));\n    };\n    n.fromString = function(o) {\n        return new n([l(o),]);\n    };\n    e.exports = n;\n});\n__d(\"FacebarNavigation\", [\"Arbiter\",\"csx\",\"DOMQuery\",\"FacebarStructuredText\",\"Input\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"csx\"), i = b(\"DOMQuery\"), j = b(\"FacebarStructuredText\"), k = b(\"Input\"), l = b(\"URI\"), m = null, n = null, o = null, p = false, q = true, r = (function() {\n        var v = {\n        }, w = function(x) {\n            return ((\"uri-\" + x.getQualifiedURI().toString()));\n        };\n        return {\n            set: function(x, y) {\n                v[w(x)] = y;\n            },\n            get: function(x) {\n                return v[w(x)];\n            }\n        };\n    })();\n    function s(v, w) {\n        o = v;\n        p = w;\n        q = false;\n        t();\n    };\n;\n    function t() {\n        if (q) {\n            return;\n        }\n         else if (n) {\n            ((p && n.pageTransition()));\n            n.setPageQuery(o);\n            q = true;\n        }\n         else if (((((m && o)) && !k.getValue(m)))) {\n            k.setValue(m, ((o.structure.toString() + \" \")));\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    g.subscribe(\"page_transition\", function(v, w) {\n        s(r.get(w.uri), true);\n    });\n    var u = {\n        registerInput: function(v) {\n            m = i.scry(v, \".-cx-PUBLIC-uiStructuredInput__text\")[0];\n            t();\n        },\n        registerBehavior: function(v) {\n            n = v;\n            t();\n        },\n        setPageQuery: function(v) {\n            r.set(l.getNextURI(), v);\n            v.structure = j.fromStruct(v.structure);\n            s(v, false);\n        }\n    };\n    e.exports = u;\n});\n__d(\"LayerRemoveOnHide\", [\"function-extensions\",\"DOM\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOM\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", g.remove.curry(this._layer.getRoot()));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"Keys\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        BACKSPACE: 8,\n        TAB: 9,\n        RETURN: 13,\n        ESC: 27,\n        SPACE: 32,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        END: 35,\n        HOME: 36,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        DELETE: 46,\n        COMMA: 188\n    };\n});\n__d(\"areObjectsEqual\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((JSON.stringify(h) == JSON.stringify(i)));\n    };\n;\n    e.exports = g;\n});\n__d(\"sprintf\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        i = Array.prototype.slice.call(arguments, 1);\n        var j = 0;\n        return h.replace(/%s/g, function(k) {\n            return i[j++];\n        });\n    };\n;\n    e.exports = g;\n});");
// 1151
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o10,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/MAGRPTCpjAg.js",o11);
// undefined
o10 = null;
// undefined
o11 = null;
// 1156
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"XH2Cu\",]);\n}\n;\n__d(\"AjaxRequest\", [\"ErrorUtils\",\"Keys\",\"URI\",\"UserAgent\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"Keys\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(q, r, s) {\n        this.xhr = k.create();\n        if (!((r instanceof i))) {\n            r = new i(r);\n        };\n        if ((s && (q == \"GET\"))) {\n            r.setQueryData(s);\n        }\n         else this._params = s;\n    ;\n        this.method = q;\n        this.uri = r;\n        this.xhr.open(q, r);\n    };\n    var n = (window.XMLHttpRequest && ((\"withCredentials\" in new XMLHttpRequest())));\n    m.supportsCORS = function() {\n        return n;\n    };\n    m.ERROR = \"ar:error\";\n    m.TIMEOUT = \"ar:timeout\";\n    m.PROXY_ERROR = \"ar:proxy error\";\n    m.TRANSPORT_ERROR = \"ar:transport error\";\n    m.SERVER_ERROR = \"ar:http error\";\n    m.PARSE_ERROR = \"ar:parse error\";\n    m._inflight = [];\n    function o() {\n        var q = m._inflight;\n        m._inflight = [];\n        q.forEach(function(r) {\n            r.abort();\n        });\n    };\n    function p(q) {\n        q.onJSON = q.onError = q.onSuccess = null;\n        clearTimeout(q._timer);\n        if ((q.xhr && (q.xhr.readyState < 4))) {\n            q.xhr.abort();\n            q.xhr = null;\n        }\n    ;\n        m._inflight = m._inflight.filter(function(r) {\n            return (((r && (r != q)) && r.xhr) && (r.xhr.readyState < 4));\n        });\n    };\n    l(m.prototype, {\n        timeout: 60000,\n        streamMode: true,\n        prelude: /^for \\(;;\\);/,\n        status: null,\n        _eol: -1,\n        _call: function(q) {\n            if (this[q]) {\n                this[q](this);\n            };\n        },\n        _parseStatus: function() {\n            var q;\n            try {\n                this.status = this.xhr.status;\n                q = this.xhr.statusText;\n            } catch (r) {\n                if ((this.xhr.readyState >= 4)) {\n                    this.errorType = m.TRANSPORT_ERROR;\n                    this.errorText = r.message;\n                }\n            ;\n                return;\n            };\n            if (((this.status === 0) && !(/^(file|ftp)/.test(this.uri)))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else if (((this.status >= 100) && (this.status < 200))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.status >= 200) && (this.status < 300))) {\n                return;\n            }\n             else if (((this.status >= 300) && (this.status < 400))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.status >= 400) && (this.status < 500))) {\n                this.errorType = m.SERVER_ERROR;\n            }\n             else if (((this.status >= 500) && (this.status < 600))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if ((this.status == 1223)) {\n                return;\n            }\n             else if (((this.status >= 12001) && (this.status <= 12156))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else {\n                q = (\"unrecognized status code: \" + this.status);\n                this.errorType = m.ERROR;\n            }\n            \n            \n            \n            \n            \n            \n            \n        ;\n            if (!this.errorText) {\n                this.errorText = q;\n            };\n        },\n        _parseResponse: function() {\n            var q, r = this.xhr.readyState;\n            try {\n                q = (this.xhr.responseText || \"\");\n            } catch (s) {\n                if ((r >= 4)) {\n                    this.errorType = m.ERROR;\n                    this.errorText = (\"responseText not available - \" + s.message);\n                }\n            ;\n                return;\n            };\n            while (this.xhr) {\n                var t = (this._eol + 1), u = (this.streamMode ? q.indexOf(\"\\u000a\", t) : q.length);\n                if (((u < 0) && (r == 4))) {\n                    u = q.length;\n                };\n                if ((u <= this._eol)) {\n                    break;\n                };\n                var v = q;\n                if (this.streamMode) {\n                    v = q.substr(t, (u - t)).replace(/^\\s*|\\s*$/g, \"\");\n                };\n                if (((t === 0) && this.prelude)) {\n                    if (this.prelude.test(v)) {\n                        v = v.replace(this.prelude, \"\");\n                    }\n                };\n                this._eol = u;\n                if (v) {\n                    try {\n                        this.json = JSON.parse(v);\n                    } catch (s) {\n                        var w = ((/(<body[\\S\\s]+?<\\/body>)/i).test(q) && RegExp.$1), x = {\n                            message: s.message,\n                            char: t,\n                            excerpt: (((((t === 0) && w)) || v)).substr(512)\n                        };\n                        this.errorType = m.PARSE_ERROR;\n                        this.errorText = (\"parse error - \" + JSON.stringify(x));\n                        return;\n                    };\n                    g.applyWithGuard(this._call, this, [\"onJSON\",]);\n                }\n            ;\n            };\n        },\n        _onReadyState: function() {\n            var q = ((this.xhr && this.xhr.readyState) || 0);\n            if (((this.status == null) && (q >= 2))) {\n                this._parseStatus();\n            };\n            if ((!this.errorType && (this.status != null))) {\n                if (((((q == 3) && this.streamMode)) || (q == 4))) {\n                    this._parseResponse();\n                }\n            };\n            if ((this.errorType || (q == 4))) {\n                this._time = (Date.now() - this._sentAt);\n                this._call((!this.errorType ? \"onSuccess\" : \"onError\"));\n                p(this);\n            }\n        ;\n        },\n        send: function(q) {\n            this.xhr.onreadystatechange = function() {\n                g.applyWithGuard(this._onReadyState, this, arguments);\n            }.bind(this);\n            var r = this.timeout;\n            if (r) {\n                this._timer = setTimeout((function() {\n                    this.errorType = m.TIMEOUT;\n                    this.errorText = \"timeout\";\n                    this._time = (Date.now() - this._sentAt);\n                    this._call(\"onError\");\n                    p(this);\n                }).bind(this), r, false);\n            };\n            m._inflight.push(this);\n            if ((this.method == \"POST\")) {\n                this.xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            };\n            this._sentAt = Date.now();\n            this.xhr.send((q ? i.implodeQuery(q) : \"\"));\n        },\n        abort: function() {\n            p(this);\n        },\n        toString: function() {\n            var q = (\"[AjaxRequest readyState=\" + this.xhr.readyState);\n            if (this.errorType) {\n                q += ((((\" errorType=\" + this.errorType) + \" (\") + this.errorText) + \")\");\n            };\n            return (q + \"]\");\n        },\n        toJSON: function() {\n            var q = {\n                json: this.json,\n                status: this.status,\n                errorType: this.errorType,\n                errorText: this.errorText,\n                time: this._time\n            };\n            if (this.errorType) {\n                q.uri = this.uri;\n            };\n            for (var r in q) {\n                if ((q[r] == null)) {\n                    delete q[r];\n                };\n            };\n            return q;\n        }\n    });\n    if ((window.addEventListener && j.firefox())) {\n        window.addEventListener(\"keydown\", function(event) {\n            if ((event.keyCode === h.ESC)) {\n                event.prevent();\n            };\n        }, false);\n    };\n    if (window.attachEvent) {\n        window.attachEvent(\"onunload\", o);\n    };\n    e.exports = m;\n});\n__d(\"FBAjaxRequest\", [\"AjaxRequest\",\"copyProperties\",\"XHR\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxRequest\"), h = b(\"copyProperties\"), i = b(\"XHR\");\n    function j(k, l, m) {\n        m = h(i.getAsyncParams(k), m);\n        var n = new g(k, l, m);\n        n.streamMode = false;\n        var o = n._call;\n        n._call = function(p) {\n            if (((p == \"onJSON\") && this.json)) {\n                if (this.json.error) {\n                    this.errorType = g.SERVER_ERROR;\n                    this.errorText = (\"AsyncResponse error: \" + this.json.error);\n                }\n            ;\n                this.json = this.json.payload;\n            }\n        ;\n            o.apply(this, arguments);\n        };\n        n.ajaxReqSend = n.send;\n        n.send = function(p) {\n            this.ajaxReqSend(h(p, m));\n        };\n        return n;\n    };\n    e.exports = j;\n});\n__d(\"CallbackManagerController\", [\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"copyProperties\"), i = function(j) {\n        this._pendingIDs = [];\n        this._allRequests = [undefined,];\n        this._callbackArgHandler = j;\n    };\n    h(i.prototype, {\n        executeOrEnqueue: function(j, k, l) {\n            l = (l || {\n            });\n            var m = this._attemptCallback(k, j, l);\n            if (m) {\n                return 0\n            };\n            this._allRequests.push({\n                fn: k,\n                request: j,\n                options: l\n            });\n            var n = (this._allRequests.length - 1);\n            this._pendingIDs.push(n);\n            return n;\n        },\n        unsubscribe: function(j) {\n            delete this._allRequests[j];\n        },\n        reset: function() {\n            this._allRequests = [];\n        },\n        getRequest: function(j) {\n            return this._allRequests[j];\n        },\n        runPossibleCallbacks: function() {\n            var j = this._pendingIDs;\n            this._pendingIDs = [];\n            var k = [];\n            j.forEach(function(l) {\n                var m = this._allRequests[l];\n                if (!m) {\n                    return\n                };\n                if (this._callbackArgHandler(m.request, m.options)) {\n                    k.push(l);\n                }\n                 else this._pendingIDs.push(l);\n            ;\n            }.bind(this));\n            k.forEach(function(l) {\n                var m = this._allRequests[l];\n                delete this._allRequests[l];\n                this._attemptCallback(m.fn, m.request, m.options);\n            }.bind(this));\n        },\n        _attemptCallback: function(j, k, l) {\n            var m = this._callbackArgHandler(k, l);\n            if (m) {\n                var n = {\n                    ids: k\n                };\n                g.applyWithGuard(j, n, m);\n            }\n        ;\n            return !!m;\n        }\n    });\n    e.exports = i;\n});\n__d(\"deferred\", [], function(a, b, c, d, e, f) {\n    var g = 0, h = 1, i = 2, j = 4, k = \"callbacks\", l = \"errbacks\", m = \"cancelbacks\", n = \"completeCallbacks\", o = [], p = o.slice, q = o.unshift;\n    function r(x, y) {\n        return (x ? p.call(x, y) : o);\n    };\n    function s(x, y) {\n        return ((y < x.length) ? r(x, y) : o);\n    };\n    function t() {\n        this.$Deferred0 = g;\n    };\n    t.prototype.addCallback = function(x, y) {\n        return this.$Deferred1(h, this.$Deferred2(k), x, y, s(arguments, 2));\n    };\n    t.prototype.removeCallback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(k), x, y);\n    };\n    t.prototype.addCompleteCallback = function(x, y) {\n        return this.$Deferred1(null, this.$Deferred2(n), x, y, s(arguments, 2));\n    };\n    t.prototype.removeCompleteCallback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(n), x, y);\n    };\n    t.prototype.addErrback = function(x, y) {\n        return this.$Deferred1(i, this.$Deferred2(l), x, y, s(arguments, 2));\n    };\n    t.prototype.removeErrback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(l), x, y);\n    };\n    t.prototype.addCancelback = function(x, y) {\n        return this.$Deferred1(j, this.$Deferred2(m), x, y, s(arguments, 2));\n    };\n    t.prototype.removeCancelback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(m), x, y);\n    };\n    t.prototype.getStatus = function() {\n        return this.$Deferred0;\n    };\n    t.prototype.setStatus = function(x) {\n        var y;\n        this.$Deferred0 = x;\n        this.callbackArgs = r(arguments, 1);\n        if ((x === i)) {\n            y = l;\n        }\n         else if ((x === h)) {\n            y = k;\n        }\n         else if ((x === j)) {\n            y = m;\n        }\n        \n    ;\n        if (y) {\n            this.$Deferred4(this[y], this.callbackArgs);\n        };\n        this.$Deferred4(this[n], this.callbackArgs);\n        return this;\n    };\n    t.prototype.setTimeout = function(x) {\n        if (this.timeout) {\n            this.clearTimeout();\n        };\n        this.$Deferred5 = (this.$Deferred5 || this.fail.bind(this));\n        this.timeout = window.setTimeout(this.$Deferred5, x);\n    };\n    t.prototype.clearTimeout = function() {\n        window.clearTimeout(this.timeout);\n        delete this.timeout;\n    };\n    t.prototype.succeed = function() {\n        return this.$Deferred6(h, arguments);\n    };\n    t.prototype.fail = function() {\n        return this.$Deferred6(i, arguments);\n    };\n    t.prototype.cancel = function() {\n        delete this[k];\n        delete this[l];\n        return this.$Deferred6(j, arguments);\n    };\n    t.prototype.$Deferred6 = function(x, y) {\n        q.call(y, x);\n        return this.setStatus.apply(this, y);\n    };\n    t.prototype.$Deferred2 = function(x) {\n        return (this[x] || (this[x] = []));\n    };\n    t.prototype.then = function(x, y, z, aa) {\n        var ba = new t(), x, ca, da, ea = r(arguments, 0);\n        if ((typeof ea[0] === \"function\")) {\n            x = ea.shift();\n        };\n        if ((typeof ea[0] === \"function\")) {\n            ca = ea.shift();\n        };\n        if ((typeof ea[0] === \"function\")) {\n            da = ea.shift();\n        };\n        var fa = ea.shift();\n        if (x) {\n            var ga = [this.$Deferred7,this,ba,\"succeed\",x,fa,].concat(ea);\n            this.addCallback.apply(this, ga);\n        }\n         else this.addCallback(ba.succeed, ba);\n    ;\n        if (ca) {\n            var ha = [this.$Deferred7,this,ba,\"fail\",ca,fa,].concat(ea);\n            this.addErrback.apply(this, ha);\n        }\n         else this.addErrback(ba.fail, ba);\n    ;\n        if (da) {\n            var ia = [this.$Deferred7,this,ba,\"cancel\",da,fa,].concat(ea);\n            this.addCancelback.apply(this, ia);\n        }\n         else this.addCancelback(ba.cancel, ba);\n    ;\n        return ba;\n    };\n    t.prototype.$Deferred1 = function(x, y, z, aa, ba) {\n        var ca = this.getStatus();\n        if ((((!x && (ca !== g))) || (ca === x))) {\n            z.apply((aa || this), ba.concat(this.callbackArgs));\n        }\n         else y.push(z, aa, ba);\n    ;\n        return this;\n    };\n    t.prototype.$Deferred3 = function(x, y, z) {\n        for (var aa = 0; (aa < x.length); aa += 3) {\n            if (((x[aa] === y) && ((!z || (x[(aa + 1)] === z))))) {\n                x.splice(aa, 3);\n                if (z) {\n                    break;\n                };\n                aa -= 3;\n            }\n        ;\n        };\n        return this;\n    };\n    t.prototype.pipe = function(x) {\n        this.addCallback(x.succeed, x).addErrback(x.fail, x).addCancelback(x.cancel, x);\n    };\n    t.prototype.$Deferred4 = function(x, y) {\n        for (var z = 0; (z < ((x || o)).length); z += 3) {\n            x[z].apply((x[(z + 1)] || this), ((x[(z + 2)] || o)).concat(y));;\n        };\n    };\n    t.prototype.$Deferred7 = function(x, y, z, aa) {\n        var ba = r(arguments, 4), ca = z.apply(aa, ba);\n        if ((ca instanceof t)) {\n            ca.pipe(x);\n        }\n         else x[y](ca);\n    ;\n    };\n    for (var u in t) {\n        if ((t.hasOwnProperty(u) && (u !== \"_metaprototype\"))) {\n            w[u] = t[u];\n        };\n    };\n    var v = ((t === null) ? null : t.prototype);\n    w.prototype = Object.create(v);\n    w.prototype.constructor = w;\n    w.__superConstructor__ = t;\n    function w(x) {\n        t.call(this);\n        this.completed = 0;\n        this.list = [];\n        if (x) {\n            x.forEach(this.waitFor, this);\n            this.startWaiting();\n        }\n    ;\n    };\n    w.prototype.startWaiting = function() {\n        this.waiting = true;\n        this.checkDeferreds();\n        return this;\n    };\n    w.prototype.waitFor = function(x) {\n        this.list.push(x);\n        this.checkDeferreds();\n        x.addCompleteCallback(this.deferredComplete, this);\n        return this;\n    };\n    w.prototype.createWaitForDeferred = function() {\n        var x = new t();\n        this.waitFor(x);\n        return x;\n    };\n    w.prototype.createWaitForCallback = function() {\n        var x = this.createWaitForDeferred();\n        return x.succeed.bind(x);\n    };\n    w.prototype.deferredComplete = function() {\n        this.completed++;\n        if ((this.completed === this.list.length)) {\n            this.checkDeferreds();\n        };\n    };\n    w.prototype.checkDeferreds = function() {\n        if ((!this.waiting || (this.completed !== this.list.length))) {\n            return\n        };\n        var x = false, y = false, z = [g,];\n        for (var aa = 0, ba = this.list.length; (aa < ba); aa++) {\n            var ca = this.list[aa];\n            z.push([ca,].concat(ca.callbackArgs));\n            if ((ca.getStatus() === i)) {\n                x = true;\n            }\n             else if ((ca.getStatus() === j)) {\n                y = true;\n            }\n        ;\n        };\n        if (x) {\n            z[0] = i;\n            this.fail.apply(this, z);\n        }\n         else if (y) {\n            z[0] = j;\n            this.cancel.apply(this, z);\n        }\n         else {\n            z[0] = h;\n            this.succeed.apply(this, z);\n        }\n        \n    ;\n    };\n    f.Deferred = t;\n    f.DeferredList = w;\n    f.Deferred.toArray = r;\n    f.Deferred.STATUS_UNKNOWN = g;\n    f.Deferred.STATUS_SUCCEEDED = h;\n    f.Deferred.STATUS_CANCELED = j;\n    f.Deferred.STATUS_FAILED = i;\n});\n__d(\"KeyedCallbackManager\", [\"CallbackManagerController\",\"deferred\",\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"deferred\").Deferred, i = b(\"ErrorUtils\"), j = b(\"copyProperties\"), k = function() {\n        this._resources = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n    };\n    j(k.prototype, {\n        executeOrEnqueue: function(l, m) {\n            if (!((l instanceof Array))) {\n                var n = l, o = m;\n                l = [l,];\n                m = function(p) {\n                    o(p[n]);\n                };\n            }\n        ;\n            l = l.filter(function(p) {\n                var q = (((p !== null) && (p !== undefined)));\n                if (!q) {\n                    i.applyWithGuard(function() {\n                        throw new Error(((\"KeyedCallbackManager.executeOrEnqueue: key \" + JSON.stringify(p)) + \" is invalid\"));\n                    });\n                };\n                return q;\n            });\n            return this._controller.executeOrEnqueue(l, m);\n        },\n        deferredExecuteOrEnqueue: function(l) {\n            var m = new h();\n            this.executeOrEnqueue(l, m.succeed.bind(m));\n            return m;\n        },\n        unsubscribe: function(l) {\n            this._controller.unsubscribe(l);\n        },\n        reset: function() {\n            this._controller.reset();\n            this._resources = {\n            };\n        },\n        getUnavailableResources: function(l) {\n            var m = this._controller.getRequest(l), n = [];\n            if (m) {\n                n = m.request.filter(function(o) {\n                    return !this._resources[o];\n                }.bind(this));\n            };\n            return n;\n        },\n        getUnavailableResourcesFromRequest: function(l) {\n            var m = (Array.isArray(l) ? l : [l,]);\n            return m.filter(function(n) {\n                if (((n !== null) && (n !== undefined))) {\n                    return !this._resources[n]\n                };\n            }, this);\n        },\n        addResourcesAndExecute: function(l) {\n            j(this._resources, l);\n            this._controller.runPossibleCallbacks();\n        },\n        setResource: function(l, m) {\n            this._resources[l] = m;\n            this._controller.runPossibleCallbacks();\n        },\n        getResource: function(l) {\n            return this._resources[l];\n        },\n        getAllResources: function() {\n            return this._resources;\n        },\n        dumpResources: function() {\n            var l = {\n            };\n            for (var m in this._resources) {\n                var n = this._resources[m];\n                if ((typeof n === \"object\")) {\n                    n = j({\n                    }, n);\n                };\n                l[m] = n;\n            };\n            return l;\n        },\n        _constructCallbackArg: function(l) {\n            var m = {\n            };\n            for (var n = 0; (n < l.length); n++) {\n                var o = l[n], p = this._resources[o];\n                if ((typeof p == \"undefined\")) {\n                    return false\n                };\n                m[o] = p;\n            };\n            return [m,];\n        }\n    });\n    e.exports = k;\n});\n__d(\"BaseAsyncLoader\", [\"KeyedCallbackManager\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"copyProperties\"), i = {\n    };\n    function j(l, m, n) {\n        var o = new g(), p = false, q = [];\n        function r() {\n            if ((!q.length || p)) {\n                return\n            };\n            p = true;\n            t.defer();\n        };\n        function s(w) {\n            p = false;\n            w.forEach(o.unsubscribe.bind(o));\n            r();\n        };\n        function t() {\n            var w = {\n            }, x = [];\n            q = q.filter(function(z) {\n                var aa = o.getUnavailableResources(z);\n                if (aa.length) {\n                    aa.forEach(function(ba) {\n                        w[ba] = true;\n                    });\n                    x.push(z);\n                    return true;\n                }\n            ;\n                return false;\n            });\n            var y = Object.keys(w);\n            if (y.length) {\n                n(l, y, x, u.curry(x), v.curry(x));\n            }\n             else p = false;\n        ;\n        };\n        function u(w, x) {\n            var y = (x.payload[m] || x.payload);\n            o.addResourcesAndExecute(y);\n            s(w);\n        };\n        function v(w) {\n            s(w);\n        };\n        return {\n            get: function(w, x) {\n                var y = o.executeOrEnqueue(w, x), z = o.getUnavailableResources(y);\n                if (z.length) {\n                    q.push(y);\n                    r();\n                }\n            ;\n            },\n            getCachedKeys: function() {\n                return Object.keys(o.getAllResources());\n            },\n            getNow: function(w) {\n                return (o.getResource(w) || null);\n            },\n            set: function(w) {\n                o.addResourcesAndExecute(w);\n            }\n        };\n    };\n    function k(l, m) {\n        throw (\"BaseAsyncLoader can't be instantiated\");\n    };\n    h(k.prototype, {\n        _getLoader: function() {\n            if (!i[this._endpoint]) {\n                i[this._endpoint] = j(this._endpoint, this._type, this.send);\n            };\n            return i[this._endpoint];\n        },\n        get: function(l, m) {\n            return this._getLoader().get(l, m);\n        },\n        getCachedKeys: function() {\n            return this._getLoader().getCachedKeys();\n        },\n        getNow: function(l) {\n            return this._getLoader().getNow(l);\n        },\n        reset: function() {\n            i[this._endpoint] = null;\n        },\n        set: function(l) {\n            this._getLoader().set(l);\n        }\n    });\n    e.exports = k;\n});\n__d(\"AjaxLoader\", [\"copyProperties\",\"FBAjaxRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"FBAjaxRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        var p = new h(\"GET\", k, {\n            ids: l\n        });\n        p.onJSON = function(q) {\n            n({\n                payload: q.json\n            });\n        };\n        p.onError = o;\n        p.send();\n    };\n    e.exports = j;\n});\n__d(\"ChannelConstants\", [], function(a, b, c, d, e, f) {\n    var g = \"channel/\", h = {\n        ON_SHUTDOWN: (g + \"shutdown\"),\n        ON_INVALID_HISTORY: (g + \"invalid_history\"),\n        ON_CONFIG: (g + \"config\"),\n        ON_ENTER_STATE: (g + \"enter_state\"),\n        ON_EXIT_STATE: (g + \"exit_state\"),\n        OK: \"ok\",\n        ERROR: \"error\",\n        ERROR_MAX: \"error_max\",\n        ERROR_MISSING: \"error_missing\",\n        ERROR_MSG_TYPE: \"error_msg_type\",\n        ERROR_SHUTDOWN: \"error_shutdown\",\n        ERROR_STALE: \"error_stale\",\n        SYS_OWNER: \"sys_owner\",\n        SYS_NONOWNER: \"sys_nonowner\",\n        SYS_ONLINE: \"sys_online\",\n        SYS_OFFLINE: \"sys_offline\",\n        SYS_TIMETRAVEL: \"sys_timetravel\",\n        HINT_AUTH: \"shutdown auth\",\n        HINT_CONN: \"shutdown conn\",\n        HINT_DISABLED: \"shutdown disabled\",\n        HINT_INVALID_STATE: \"shutdown invalid state\",\n        HINT_MAINT: \"shutdown maint\",\n        HINT_UNSUPPORTED: \"shutdown unsupported\",\n        reason_Unknown: 0,\n        reason_AsyncError: 1,\n        reason_TooLong: 2,\n        reason_Refresh: 3,\n        reason_RefreshDelay: 4,\n        reason_UIRestart: 5,\n        reason_NeedSeq: 6,\n        reason_PrevFailed: 7,\n        reason_IFrameLoadGiveUp: 8,\n        reason_IFrameLoadRetry: 9,\n        reason_IFrameLoadRetryWorked: 10,\n        reason_PageTransitionRetry: 11,\n        reason_IFrameLoadMaxSubdomain: 12,\n        reason_NoChannelInfo: 13,\n        reason_NoChannelHost: 14,\n        CAPABILITY_VOIP: 8,\n        getArbiterType: function(i) {\n            return ((g + \"message:\") + i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"ShortProfiles\", [\"ArbiterMixin\",\"AjaxLoader\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AjaxLoader\"), i = b(\"Env\"), j = b(\"FBAjaxRequest\"), k = b(\"JSLogger\"), l = b(\"copyProperties\"), m = \"/ajax/chat/user_info.php\", n = \"/ajax/chat/user_info_all.php\", o = new h(m, \"profiles\"), p = false, q = k.create(\"short_profiles\");\n    function r() {\n        if (!p) {\n            q.log(\"fetch_all\");\n            p = true;\n            var u = new j(\"GET\", n, {\n                viewer: i.user\n            });\n            u.onJSON = function(v) {\n                o.set(v.json);\n                t.inform(\"updated\");\n            };\n            u.send();\n        }\n    ;\n    };\n    function s(u) {\n        return JSON.parse(JSON.stringify(u));\n    };\n    var t = {\n    };\n    l(t, g, {\n        get: function(u, v) {\n            this.getMulti([u,], function(w) {\n                v(w[u], u);\n            });\n        },\n        getMulti: function(u, v) {\n            function w(x) {\n                v(s(x));\n            };\n            o.get(u, w);\n        },\n        getNow: function(u) {\n            return s((o.getNow(u) || null));\n        },\n        getNowUnsafe: function(u) {\n            return (o.getNow(u) || null);\n        },\n        getCachedProfileIDs: function() {\n            return o.getCachedKeys();\n        },\n        hasAll: function() {\n            return p;\n        },\n        fetchAll: function() {\n            r();\n        },\n        set: function(u, v) {\n            var w = {\n            };\n            w[u] = v;\n            this.setMulti(w);\n        },\n        setMulti: function(u) {\n            o.set(s(u));\n        }\n    });\n    e.exports = t;\n});\n__d(\"ReactCurrentOwner\", [], function(a, b, c, d, e, f) {\n    var g = {\n        current: null\n    };\n    e.exports = g;\n});\n__d(\"CSSProperty\", [], function(a, b, c, d, e, f) {\n    var g = {\n        fillOpacity: true,\n        fontWeight: true,\n        opacity: true,\n        orphans: true,\n        zIndex: true,\n        zoom: true\n    }, h = {\n        background: {\n            backgroundImage: true,\n            backgroundPosition: true,\n            backgroundRepeat: true,\n            backgroundColor: true\n        },\n        border: {\n            borderWidth: true,\n            borderStyle: true,\n            borderColor: true\n        },\n        borderBottom: {\n            borderBottomWidth: true,\n            borderBottomStyle: true,\n            borderBottomColor: true\n        },\n        borderLeft: {\n            borderLeftWidth: true,\n            borderLeftStyle: true,\n            borderLeftColor: true\n        },\n        borderRight: {\n            borderRightWidth: true,\n            borderRightStyle: true,\n            borderRightColor: true\n        },\n        borderTop: {\n            borderTopWidth: true,\n            borderTopStyle: true,\n            borderTopColor: true\n        },\n        font: {\n            fontStyle: true,\n            fontVariant: true,\n            fontWeight: true,\n            fontSize: true,\n            lineHeight: true,\n            fontFamily: true\n        }\n    }, i = {\n        isUnitlessNumber: g,\n        shorthandPropertyExpansions: h\n    };\n    e.exports = i;\n});\n__d(\"dangerousStyleValue\", [\"CSSProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\");\n    function h(i, j) {\n        var k = (((j == null) || (typeof j === \"boolean\")) || (j === \"\"));\n        if (k) {\n            return \"\"\n        };\n        var l = isNaN(j);\n        if (((l || (j === 0)) || g.isUnitlessNumber[i])) {\n            return (\"\" + j)\n        };\n        return (j + \"px\");\n    };\n    e.exports = h;\n});\n__d(\"throwIf\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        if (h) {\n            throw new Error(i)\n        };\n    };\n    e.exports = g;\n});\n__d(\"escapeTextForBrowser\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h, i = {\n        \"&\": \"&amp;\",\n        \"\\u003E\": \"&gt;\",\n        \"\\u003C\": \"&lt;\",\n        \"\\\"\": \"&quot;\",\n        \"'\": \"&#x27;\",\n        \"/\": \"&#x2f;\"\n    };\n    function j(l) {\n        return i[l];\n    };\n    var k = function(l) {\n        var m = typeof l, n = (m === \"object\");\n        if (((l === \"\") || n)) {\n            return \"\";\n        }\n         else if ((m === \"string\")) {\n            return l.replace(/[&><\"'\\/]/g, j);\n        }\n         else return ((\"\" + l)).replace(/[&><\"'\\/]/g, j)\n        \n    ;\n    };\n    e.exports = k;\n});\n__d(\"memoizeStringOnly\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = {\n        };\n        return function(j) {\n            if (i.hasOwnProperty(j)) {\n                return i[j];\n            }\n             else return i[j] = h.call(this, j)\n        ;\n        };\n    };\n    e.exports = g;\n});\n__d(\"CSSPropertyOperations\", [\"CSSProperty\",\"dangerousStyleValue\",\"escapeTextForBrowser\",\"hyphenate\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\"), h = b(\"dangerousStyleValue\"), i = b(\"escapeTextForBrowser\"), j = b(\"hyphenate\"), k = b(\"memoizeStringOnly\"), l = k(function(n) {\n        return i(j(n));\n    }), m = {\n        createMarkupForStyles: function(n) {\n            var o = \"\";\n            for (var p in n) {\n                if (!n.hasOwnProperty(p)) {\n                    continue;\n                };\n                var q = n[p];\n                if ((q != null)) {\n                    o += (l(p) + \":\");\n                    o += (h(p, q) + \";\");\n                }\n            ;\n            };\n            return (o || null);\n        },\n        setValueForStyles: function(n, o) {\n            var p = n.style;\n            for (var q in o) {\n                if (!o.hasOwnProperty(q)) {\n                    continue;\n                };\n                var r = h(q, o[q]);\n                if (r) {\n                    p[q] = r;\n                }\n                 else {\n                    var s = g.shorthandPropertyExpansions[q];\n                    if (s) {\n                        for (var t in s) {\n                            p[t] = \"\";;\n                        };\n                    }\n                     else p[q] = \"\";\n                ;\n                }\n            ;\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ExecutionEnvironment\", [], function(a, b, c, d, e, f) {\n    var g = (typeof window !== \"undefined\"), h = {\n        canUseDOM: g,\n        canUseWorkers: (typeof Worker !== \"undefined\"),\n        isInWorker: !g,\n        global: new Function(\"return this;\")()\n    };\n    e.exports = h;\n});\n__d(\"Danger\", [\"ExecutionEnvironment\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"throwIf\"), i, j, k, l, m = (g.canUseDOM ? document.createElement(\"div\") : null), n = {\n        option: [1,\"\\u003Cselect multiple=\\\"true\\\"\\u003E\",\"\\u003C/select\\u003E\",],\n        legend: [1,\"\\u003Cfieldset\\u003E\",\"\\u003C/fieldset\\u003E\",],\n        area: [1,\"\\u003Cmap\\u003E\",\"\\u003C/map\\u003E\",],\n        param: [1,\"\\u003Cobject\\u003E\",\"\\u003C/object\\u003E\",],\n        thead: [1,\"\\u003Ctable\\u003E\",\"\\u003C/table\\u003E\",],\n        tr: [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",],\n        col: [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",],\n        td: [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",]\n    };\n    n.optgroup = n.option;\n    n.tbody = n.thead;\n    n.tfoot = n.thead;\n    n.colgroup = n.thead;\n    n.caption = n.thead;\n    n.th = n.td;\n    var o = [1,\"?\\u003Cdiv\\u003E\",\"\\u003C/div\\u003E\",];\n    if (m) {\n        for (var p in n) {\n            if (!n.hasOwnProperty(p)) {\n                continue;\n            };\n            m.innerHTML = ((((\"\\u003C\" + p) + \"\\u003E\\u003C/\") + p) + \"\\u003E\");\n            if (m.firstChild) {\n                n[p] = null;\n            };\n        };\n        m.innerHTML = \"\\u003Clink /\\u003E\";\n        if (m.firstChild) {\n            o = null;\n        };\n    }\n;\n    function q(w) {\n        var x = m, y = w.substring(1, w.indexOf(\" \")), z = (n[y.toLowerCase()] || o);\n        if (z) {\n            x.innerHTML = ((z[1] + w) + z[2]);\n            var aa = z[0];\n            while (aa--) {\n                x = x.lastChild;;\n            };\n        }\n         else x.innerHTML = w;\n    ;\n        return x.childNodes;\n    };\n    function r(w, x, y) {\n        if (y) {\n            if (y.nextSibling) {\n                return w.insertBefore(x, y.nextSibling);\n            }\n             else return w.appendChild(x)\n        ;\n        }\n         else return w.insertBefore(x, w.firstChild)\n    ;\n    };\n    function s(w, x, y) {\n        var z, aa = x.length;\n        for (var ba = 0; (ba < aa); ba++) {\n            z = r(w, x[0], (z || y));;\n        };\n    };\n    function t(w, x, y) {\n        var z = q(x), aa = (y ? w.childNodes[(y - 1)] : null);\n        s(w, z, aa);\n    };\n    function u(w, x) {\n        var y = w.parentNode, z = q(x);\n        y.replaceChild(z[0], w);\n    };\n    var v = {\n        dangerouslyInsertMarkupAt: t,\n        dangerouslyReplaceNodeWithMarkup: u\n    };\n    e.exports = v;\n});\n__d(\"insertNodeAt\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = h.childNodes, l = h.childNodes[j];\n        if ((l === i)) {\n            return i\n        };\n        if (i.parentNode) {\n            i.parentNode.removeChild(i);\n        };\n        if ((j >= k.length)) {\n            h.appendChild(i);\n        }\n         else h.insertBefore(i, k[j]);\n    ;\n        return i;\n    };\n    e.exports = g;\n});\n__d(\"keyOf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i;\n        for (i in h) {\n            if (!h.hasOwnProperty(i)) {\n                continue;\n            };\n            return i;\n        };\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"DOMChildrenOperations\", [\"Danger\",\"insertNodeAt\",\"keyOf\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"Danger\"), h = b(\"insertNodeAt\"), i = b(\"keyOf\"), j = b(\"throwIf\"), k, l = i({\n        moveFrom: null\n    }), m = i({\n        insertMarkup: null\n    }), n = i({\n        removeAt: null\n    }), o = function(t, u) {\n        var v, w, x;\n        for (var y = 0; (y < u.length); y++) {\n            w = u[y];\n            if ((l in w)) {\n                v = (v || []);\n                x = w.moveFrom;\n                v[x] = t.childNodes[x];\n            }\n             else if ((n in w)) {\n                v = (v || []);\n                x = w.removeAt;\n                v[x] = t.childNodes[x];\n            }\n            \n        ;\n        };\n        return v;\n    }, p = function(t, u) {\n        for (var v = 0; (v < u.length); v++) {\n            var w = u[v];\n            if (w) {\n                t.removeChild(u[v]);\n            };\n        };\n    }, q = function(t, u, v) {\n        var w, x, y = -1, z;\n        for (var aa = 0; (aa < u.length); aa++) {\n            z = u[aa];\n            if ((l in z)) {\n                w = v[z.moveFrom];\n                x = z.finalIndex;\n                h(t, w, x);\n            }\n             else if (!((n in z))) {\n                if ((m in z)) {\n                    x = z.finalIndex;\n                    var ba = z.insertMarkup;\n                    g.dangerouslyInsertMarkupAt(t, ba, x);\n                }\n            \n            }\n        ;\n        };\n    }, r = function(t, u) {\n        var v = o(t, u);\n        if (v) {\n            p(t, v);\n        };\n        q(t, u, v);\n    }, s = {\n        dangerouslyReplaceNodeWithMarkup: g.dangerouslyReplaceNodeWithMarkup,\n        manageChildren: r\n    };\n    e.exports = s;\n});\n__d(\"DOMProperty\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        MUST_USE_ATTRIBUTE: 1,\n        MUST_USE_PROPERTY: 2,\n        HAS_BOOLEAN_VALUE: 4,\n        HAS_SIDE_EFFECTS: 8,\n        injectDOMPropertyConfig: function(k) {\n            var l = (k.Properties || {\n            }), m = (k.DOMAttributeNames || {\n            }), n = (k.DOMPropertyNames || {\n            }), o = (k.DOMMutationMethods || {\n            });\n            if (k.isCustomAttribute) {\n                j._isCustomAttributeFunctions.push(k.isCustomAttribute);\n            };\n            for (var p in l) {\n                g(!j.isStandardName[p]);\n                j.isStandardName[p] = true;\n                j.getAttributeName[p] = (m[p] || p.toLowerCase());\n                j.getPropertyName[p] = (n[p] || p);\n                var q = o[p];\n                if (q) {\n                    j.getMutationMethod[p] = q;\n                };\n                var r = l[p];\n                j.mustUseAttribute[p] = (r & h.MUST_USE_ATTRIBUTE);\n                j.mustUseProperty[p] = (r & h.MUST_USE_PROPERTY);\n                j.hasBooleanValue[p] = (r & h.HAS_BOOLEAN_VALUE);\n                j.hasSideEffects[p] = (r & h.HAS_SIDE_EFFECTS);\n                g((!j.mustUseAttribute[p] || !j.mustUseProperty[p]));\n                g((j.mustUseProperty[p] || !j.hasSideEffects[p]));\n            };\n        }\n    }, i = {\n    }, j = {\n        isStandardName: {\n        },\n        getAttributeName: {\n        },\n        getPropertyName: {\n        },\n        getMutationMethod: {\n        },\n        mustUseAttribute: {\n        },\n        mustUseProperty: {\n        },\n        hasBooleanValue: {\n        },\n        hasSideEffects: {\n        },\n        _isCustomAttributeFunctions: [],\n        isCustomAttribute: function(k) {\n            return j._isCustomAttributeFunctions.some(function(l) {\n                return l.call(null, k);\n            });\n        },\n        getDefaultValueForProperty: function(k, l) {\n            var m = i[k], n;\n            if (!m) {\n                i[k] = m = {\n                };\n            };\n            if (!((l in m))) {\n                n = document.createElement(k);\n                m[l] = n[l];\n            }\n        ;\n            return m[l];\n        },\n        injection: h\n    };\n    e.exports = j;\n});\n__d(\"DOMPropertyOperations\", [\"DOMProperty\",\"escapeTextForBrowser\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = b(\"escapeTextForBrowser\"), i = b(\"memoizeStringOnly\"), j = i(function(l) {\n        return (h(l) + \"=\\\"\");\n    }), k = {\n        createMarkupForProperty: function(l, m) {\n            if (g.isStandardName[l]) {\n                if (((m == null) || (g.hasBooleanValue[l] && !m))) {\n                    return \"\"\n                };\n                var n = g.getAttributeName[l];\n                return ((j(n) + h(m)) + \"\\\"\");\n            }\n             else if (g.isCustomAttribute(l)) {\n                if ((m == null)) {\n                    return \"\"\n                };\n                return ((j(l) + h(m)) + \"\\\"\");\n            }\n             else return null\n            \n        ;\n        },\n        setValueForProperty: function(l, m, n) {\n            if (g.isStandardName[m]) {\n                var o = g.getMutationMethod[m];\n                if (o) {\n                    o(l, n);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    if ((g.hasBooleanValue[m] && !n)) {\n                        l.removeAttribute(g.getAttributeName[m]);\n                    }\n                     else l.setAttribute(g.getAttributeName[m], n);\n                ;\n                }\n                 else {\n                    var p = g.getPropertyName[m];\n                    if ((!g.hasSideEffects[m] || (l[p] !== n))) {\n                        l[p] = n;\n                    };\n                }\n                \n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.setAttribute(m, n);\n            }\n        ;\n        },\n        deleteValueForProperty: function(l, m) {\n            if (g.isStandardName[m]) {\n                var n = g.getMutationMethod[m];\n                if (n) {\n                    n(l, undefined);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    l.removeAttribute(g.getAttributeName[m]);\n                }\n                 else {\n                    var o = g.getPropertyName[m];\n                    l[o] = g.getDefaultValueForProperty(l.nodeName, m);\n                }\n                \n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.removeAttribute(m);\n            }\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"keyMirror\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"NOT_OBJECT_ERROR\", i = function(j) {\n        var k = {\n        }, l;\n        g((!((j instanceof Object)) || Array.isArray(j)), h);\n        for (l in j) {\n            if (!j.hasOwnProperty(l)) {\n                continue;\n            };\n            k[l] = l;\n        };\n        return k;\n    };\n    e.exports = i;\n});\n__d(\"EventConstants\", [\"keyMirror\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = g({\n        bubbled: null,\n        captured: null\n    }), i = g({\n        topBlur: null,\n        topChange: null,\n        topClick: null,\n        topDOMCharacterDataModified: null,\n        topDoubleClick: null,\n        topDrag: null,\n        topDragEnd: null,\n        topDragEnter: null,\n        topDragExit: null,\n        topDragLeave: null,\n        topDragOver: null,\n        topDragStart: null,\n        topDrop: null,\n        topFocus: null,\n        topInput: null,\n        topKeyDown: null,\n        topKeyPress: null,\n        topKeyUp: null,\n        topMouseDown: null,\n        topMouseMove: null,\n        topMouseOut: null,\n        topMouseOver: null,\n        topMouseUp: null,\n        topScroll: null,\n        topSelectionChange: null,\n        topSubmit: null,\n        topTouchCancel: null,\n        topTouchEnd: null,\n        topTouchMove: null,\n        topTouchStart: null,\n        topWheel: null\n    }), j = {\n        topLevelTypes: i,\n        PropagationPhases: h\n    };\n    e.exports = j;\n});\n__d(\"EventListener\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = {\n        listen: g.listen,\n        capture: function(i, j, k) {\n            if (!i.addEventListener) {\n                return;\n            }\n             else i.addEventListener(j, k, true);\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"CallbackRegistry\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        putListener: function(i, j, k) {\n            var l = (g[j] || (g[j] = {\n            }));\n            l[i] = k;\n        },\n        getListener: function(i, j) {\n            var k = g[j];\n            return (k && k[i]);\n        },\n        deleteListener: function(i, j) {\n            var k = g[j];\n            if (k) {\n                delete k[i];\n            };\n        },\n        deleteAllListeners: function(i) {\n            for (var j in g) {\n                delete g[j][i];;\n            };\n        },\n        __purge: function() {\n            g = {\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"EventPluginRegistry\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = null, i = {\n    };\n    function j() {\n        if (!h) {\n            return\n        };\n        for (var n in i) {\n            var o = i[n], p = h.indexOf(n);\n            g((p > -1));\n            if (m.plugins[p]) {\n                continue;\n            };\n            g(o.extractEvents);\n            m.plugins[p] = o;\n            var q = o.eventTypes;\n            for (var r in q) {\n                g(k(q[r], o));;\n            };\n        };\n    };\n    function k(n, o) {\n        var p = n.phasedRegistrationNames;\n        if (p) {\n            for (var q in p) {\n                if (p.hasOwnProperty(q)) {\n                    var r = p[q];\n                    l(r, o);\n                }\n            ;\n            };\n            return true;\n        }\n         else if (n.registrationName) {\n            l(n.registrationName, o);\n            return true;\n        }\n        \n    ;\n        return false;\n    };\n    function l(n, o) {\n        g(!m.registrationNames[n]);\n        m.registrationNames[n] = o;\n        m.registrationNamesKeys.push(n);\n    };\n    var m = {\n        plugins: [],\n        registrationNames: {\n        },\n        registrationNamesKeys: [],\n        injectEventPluginOrder: function(n) {\n            g(!h);\n            h = Array.prototype.slice.call(n);\n            j();\n        },\n        injectEventPluginsByName: function(n) {\n            var o = false;\n            for (var p in n) {\n                if (!n.hasOwnProperty(p)) {\n                    continue;\n                };\n                var q = n[p];\n                if ((i[p] !== q)) {\n                    g(!i[p]);\n                    i[p] = q;\n                    o = true;\n                }\n            ;\n            };\n            if (o) {\n                j();\n            };\n        },\n        getPluginModuleForEvent: function(event) {\n            var n = event.dispatchConfig;\n            if (n.registrationName) {\n                return (m.registrationNames[n.registrationName] || null)\n            };\n            for (var o in n.phasedRegistrationNames) {\n                if (!n.phasedRegistrationNames.hasOwnProperty(o)) {\n                    continue;\n                };\n                var p = m.registrationNames[n.phasedRegistrationNames[o]];\n                if (p) {\n                    return p\n                };\n            };\n            return null;\n        },\n        _resetEventPlugins: function() {\n            h = null;\n            for (var n in i) {\n                if (i.hasOwnProperty(n)) {\n                    delete i[n];\n                };\n            };\n            m.plugins.length = 0;\n            var o = m.registrationNames;\n            for (var p in o) {\n                if (o.hasOwnProperty(p)) {\n                    delete o[p];\n                };\n            };\n            m.registrationNamesKeys.length = 0;\n        }\n    };\n    e.exports = m;\n});\n__d(\"EventPluginUtils\", [\"EventConstants\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"invariant\"), i = g.topLevelTypes;\n    function j(u) {\n        return (((u === i.topMouseUp) || (u === i.topTouchEnd)) || (u === i.topTouchCancel));\n    };\n    function k(u) {\n        return ((u === i.topMouseMove) || (u === i.topTouchMove));\n    };\n    function l(u) {\n        return ((u === i.topMouseDown) || (u === i.topTouchStart));\n    };\n    var m;\n    function n(event, u) {\n        var v = event._dispatchListeners, w = event._dispatchIDs;\n        if (Array.isArray(v)) {\n            for (var x = 0; (x < v.length); x++) {\n                if (event.isPropagationStopped()) {\n                    break;\n                };\n                u(event, v[x], w[x]);\n            };\n        }\n         else if (v) {\n            u(event, v, w);\n        }\n    ;\n    };\n    function o(event, u, v) {\n        u(event, v);\n    };\n    function p(event, u) {\n        n(event, u);\n        event._dispatchListeners = null;\n        event._dispatchIDs = null;\n    };\n    function q(event) {\n        var u = event._dispatchListeners, v = event._dispatchIDs;\n        if (Array.isArray(u)) {\n            for (var w = 0; (w < u.length); w++) {\n                if (event.isPropagationStopped()) {\n                    break;\n                };\n                if (u[w](event, v[w])) {\n                    return v[w]\n                };\n            };\n        }\n         else if (u) {\n            if (u(event, v)) {\n                return v\n            }\n        }\n    ;\n        return null;\n    };\n    function r(event) {\n        var u = event._dispatchListeners, v = event._dispatchIDs;\n        h(!Array.isArray(u));\n        var w = (u ? u(event, v) : null);\n        event._dispatchListeners = null;\n        event._dispatchIDs = null;\n        return w;\n    };\n    function s(event) {\n        return !!event._dispatchListeners;\n    };\n    var t = {\n        isEndish: j,\n        isMoveish: k,\n        isStartish: l,\n        executeDispatchesInOrder: p,\n        executeDispatchesInOrderStopAtTrue: q,\n        executeDirectDispatch: r,\n        hasDispatches: s,\n        executeDispatch: o\n    };\n    e.exports = t;\n});\n__d(\"accumulate\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"INVALID_ACCUM_ARGS\";\n    function i(j, k) {\n        var l = (j == null), m = (k === null);\n        if (m) {\n            return j;\n        }\n         else if (l) {\n            return k;\n        }\n         else {\n            var n = Array.isArray(j), o = Array.isArray(k);\n            if (n) {\n                return j.concat(k);\n            }\n             else if (o) {\n                return [j,].concat(k);\n            }\n             else return [j,k,]\n            \n        ;\n        }\n        \n    ;\n    };\n    e.exports = i;\n});\n__d(\"forEachAccumulated\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i, j) {\n        if (Array.isArray(h)) {\n            h.forEach(i, j);\n        }\n         else if (h) {\n            i.call(j, h);\n        }\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventPropagators\", [\"CallbackRegistry\",\"EventConstants\",\"accumulate\",\"forEachAccumulated\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventConstants\"), i = b(\"accumulate\"), j = b(\"forEachAccumulated\"), k = g.getListener, l = h.PropagationPhases, m = {\n        InstanceHandle: null,\n        injectInstanceHandle: function(w) {\n            m.InstanceHandle = w;\n        },\n        validate: function() {\n            var w = ((!m.InstanceHandle || !m.InstanceHandle.traverseTwoPhase) || !m.InstanceHandle.traverseEnterLeave);\n            if (w) {\n                throw new Error(\"InstanceHandle not injected before use!\")\n            };\n        }\n    };\n    function n(w, event, x) {\n        var y = event.dispatchConfig.phasedRegistrationNames[x];\n        return k(w, y);\n    };\n    function o(w, x, event) {\n        var y = (x ? l.bubbled : l.captured), z = n(w, event, y);\n        if (z) {\n            event._dispatchListeners = i(event._dispatchListeners, z);\n            event._dispatchIDs = i(event._dispatchIDs, w);\n        }\n    ;\n    };\n    function p(event) {\n        if ((event && event.dispatchConfig.phasedRegistrationNames)) {\n            m.InstanceHandle.traverseTwoPhase(event.dispatchMarker, o, event);\n        };\n    };\n    function q(w, x, event) {\n        if ((event && event.dispatchConfig.registrationName)) {\n            var y = event.dispatchConfig.registrationName, z = k(w, y);\n            if (z) {\n                event._dispatchListeners = i(event._dispatchListeners, z);\n                event._dispatchIDs = i(event._dispatchIDs, w);\n            }\n        ;\n        }\n    ;\n    };\n    function r(event) {\n        if ((event && event.dispatchConfig.registrationName)) {\n            q(event.dispatchMarker, null, event);\n        };\n    };\n    function s(w) {\n        j(w, p);\n    };\n    function t(w, x, y, z) {\n        m.InstanceHandle.traverseEnterLeave(y, z, q, w, x);\n    };\n    function u(w) {\n        j(w, r);\n    };\n    var v = {\n        accumulateTwoPhaseDispatches: s,\n        accumulateDirectDispatches: u,\n        accumulateEnterLeaveDispatches: t,\n        injection: m\n    };\n    e.exports = v;\n});\n__d(\"EventPluginHub\", [\"CallbackRegistry\",\"EventPluginRegistry\",\"EventPluginUtils\",\"EventPropagators\",\"ExecutionEnvironment\",\"accumulate\",\"forEachAccumulated\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventPluginRegistry\"), i = b(\"EventPluginUtils\"), j = b(\"EventPropagators\"), k = b(\"ExecutionEnvironment\"), l = b(\"accumulate\"), m = b(\"forEachAccumulated\"), n = b(\"invariant\"), o = null, p = function(event) {\n        if (event) {\n            var r = i.executeDispatch, s = h.getPluginModuleForEvent(event);\n            if ((s && s.executeDispatch)) {\n                r = s.executeDispatch;\n            };\n            i.executeDispatchesInOrder(event, r);\n            if (!event.isPersistent()) {\n                event.constructor.release(event);\n            };\n        }\n    ;\n    }, q = {\n        injection: {\n            injectInstanceHandle: j.injection.injectInstanceHandle,\n            injectEventPluginOrder: h.injectEventPluginOrder,\n            injectEventPluginsByName: h.injectEventPluginsByName\n        },\n        registrationNames: h.registrationNames,\n        putListener: g.putListener,\n        getListener: g.getListener,\n        deleteListener: g.deleteListener,\n        deleteAllListeners: g.deleteAllListeners,\n        extractEvents: function(r, s, t, u) {\n            var v, w = h.plugins;\n            for (var x = 0, y = w.length; (x < y); x++) {\n                var z = w[x];\n                if (z) {\n                    var aa = z.extractEvents(r, s, t, u);\n                    if (aa) {\n                        v = l(v, aa);\n                    };\n                }\n            ;\n            };\n            return v;\n        },\n        enqueueEvents: function(r) {\n            if (r) {\n                o = l(o, r);\n            };\n        },\n        processEventQueue: function() {\n            var r = o;\n            o = null;\n            m(r, p);\n            n(!o);\n        }\n    };\n    if (k.canUseDOM) {\n        window.EventPluginHub = q;\n    };\n    e.exports = q;\n});\n__d(\"ReactUpdates\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = false, i = [];\n    function j(m) {\n        if (h) {\n            m();\n            return;\n        }\n    ;\n        h = true;\n        try {\n            m();\n            for (var o = 0; (o < i.length); o++) {\n                var p = i[o];\n                if (p.isMounted()) {\n                    var q = p._pendingCallbacks;\n                    p._pendingCallbacks = null;\n                    p.performUpdateIfNecessary();\n                    if (q) {\n                        for (var r = 0; (r < q.length); r++) {\n                            q[r]();;\n                        }\n                    };\n                }\n            ;\n            };\n        } catch (n) {\n            throw n;\n        } finally {\n            i.length = 0;\n            h = false;\n        };\n    };\n    function k(m, n) {\n        g((!n || (typeof n === \"function\")));\n        if (!h) {\n            m.performUpdateIfNecessary();\n            (n && n());\n            return;\n        }\n    ;\n        i.push(m);\n        if (n) {\n            if (m._pendingCallbacks) {\n                m._pendingCallbacks.push(n);\n            }\n             else m._pendingCallbacks = [n,];\n        \n        };\n    };\n    var l = {\n        batchedUpdates: j,\n        enqueueUpdate: k\n    };\n    e.exports = l;\n});\n__d(\"ViewportMetrics\", [], function(a, b, c, d, e, f) {\n    var g = {\n        currentScrollLeft: 0,\n        currentScrollTop: 0,\n        refreshScrollValues: function() {\n            g.currentScrollLeft = (document.body.scrollLeft + document.documentElement.scrollLeft);\n            g.currentScrollTop = (document.body.scrollTop + document.documentElement.scrollTop);\n        }\n    };\n    e.exports = g;\n});\n__d(\"isEventSupported\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h, i;\n    if (g.canUseDOM) {\n        h = document.createElement(\"div\");\n        i = ((document.implementation && document.implementation.hasFeature) && (document.implementation.hasFeature(\"\", \"\") !== true));\n    }\n;\n    function j(k, l) {\n        if ((!h || ((l && !h.addEventListener)))) {\n            return false\n        };\n        var m = document.createElement(\"div\"), n = (\"on\" + k), o = (n in m);\n        if (!o) {\n            m.setAttribute(n, \"\");\n            o = (typeof m[n] === \"function\");\n            if ((typeof m[n] !== \"undefined\")) {\n                m[n] = undefined;\n            };\n            m.removeAttribute(n);\n        }\n    ;\n        if (((!o && i) && (k === \"wheel\"))) {\n            o = document.implementation.hasFeature(\"Events.wheel\", \"3.0\");\n        };\n        m = null;\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"ReactEventEmitter\", [\"EventConstants\",\"EventListener\",\"EventPluginHub\",\"ExecutionEnvironment\",\"ReactUpdates\",\"ViewportMetrics\",\"invariant\",\"isEventSupported\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventListener\"), i = b(\"EventPluginHub\"), j = b(\"ExecutionEnvironment\"), k = b(\"ReactUpdates\"), l = b(\"ViewportMetrics\"), m = b(\"invariant\"), n = b(\"isEventSupported\"), o = false;\n    function p(u, v, w) {\n        h.listen(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n    function q(u, v, w) {\n        h.capture(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n    function r() {\n        var u = l.refreshScrollValues;\n        h.listen(window, \"scroll\", u);\n        h.listen(window, \"resize\", u);\n    };\n    function s(u) {\n        m(!o);\n        var v = g.topLevelTypes, w = document;\n        r();\n        p(v.topMouseOver, \"mouseover\", w);\n        p(v.topMouseDown, \"mousedown\", w);\n        p(v.topMouseUp, \"mouseup\", w);\n        p(v.topMouseMove, \"mousemove\", w);\n        p(v.topMouseOut, \"mouseout\", w);\n        p(v.topClick, \"click\", w);\n        p(v.topDoubleClick, \"dblclick\", w);\n        if (u) {\n            p(v.topTouchStart, \"touchstart\", w);\n            p(v.topTouchEnd, \"touchend\", w);\n            p(v.topTouchMove, \"touchmove\", w);\n            p(v.topTouchCancel, \"touchcancel\", w);\n        }\n    ;\n        p(v.topKeyUp, \"keyup\", w);\n        p(v.topKeyPress, \"keypress\", w);\n        p(v.topKeyDown, \"keydown\", w);\n        p(v.topInput, \"input\", w);\n        p(v.topChange, \"change\", w);\n        p(v.topSelectionChange, \"selectionchange\", w);\n        p(v.topDOMCharacterDataModified, \"DOMCharacterDataModified\", w);\n        if (n(\"drag\")) {\n            p(v.topDrag, \"drag\", w);\n            p(v.topDragEnd, \"dragend\", w);\n            p(v.topDragEnter, \"dragenter\", w);\n            p(v.topDragExit, \"dragexit\", w);\n            p(v.topDragLeave, \"dragleave\", w);\n            p(v.topDragOver, \"dragover\", w);\n            p(v.topDragStart, \"dragstart\", w);\n            p(v.topDrop, \"drop\", w);\n        }\n    ;\n        if (n(\"wheel\")) {\n            p(v.topWheel, \"wheel\", w);\n        }\n         else if (n(\"mousewheel\")) {\n            p(v.topWheel, \"mousewheel\", w);\n        }\n         else p(v.topWheel, \"DOMMouseScroll\", w);\n        \n    ;\n        if (n(\"scroll\", true)) {\n            q(v.topScroll, \"scroll\", w);\n        }\n         else p(v.topScroll, \"scroll\", window);\n    ;\n        if (n(\"focus\", true)) {\n            q(v.topFocus, \"focus\", w);\n            q(v.topBlur, \"blur\", w);\n        }\n         else if (n(\"focusin\")) {\n            p(v.topFocus, \"focusin\", w);\n            p(v.topBlur, \"focusout\", w);\n        }\n        \n    ;\n    };\n    var t = {\n        TopLevelCallbackCreator: null,\n        ensureListening: function(u, v) {\n            m(j.canUseDOM);\n            if (!o) {\n                t.TopLevelCallbackCreator = v;\n                s(u);\n                o = true;\n            }\n        ;\n        },\n        setEnabled: function(u) {\n            m(j.canUseDOM);\n            if (t.TopLevelCallbackCreator) {\n                t.TopLevelCallbackCreator.setEnabled(u);\n            };\n        },\n        isEnabled: function() {\n            return !!((t.TopLevelCallbackCreator && t.TopLevelCallbackCreator.isEnabled()));\n        },\n        handleTopLevel: function(u, v, w, x) {\n            var y = i.extractEvents(u, v, w, x);\n            k.batchedUpdates(function() {\n                i.enqueueEvents(y);\n                i.processEventQueue();\n            });\n        },\n        registrationNames: i.registrationNames,\n        putListener: i.putListener,\n        getListener: i.getListener,\n        deleteListener: i.deleteListener,\n        deleteAllListeners: i.deleteAllListeners,\n        trapBubbledEvent: p,\n        trapCapturedEvent: q\n    };\n    e.exports = t;\n});\n__d(\"getEventTarget\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\");\n    function h(i) {\n        var j = ((i.target || i.srcElement) || g.global);\n        return ((j.nodeType === 3) ? j.parentNode : j);\n    };\n    e.exports = h;\n});\n__d(\"ReactEventTopLevelCallback\", [\"ExecutionEnvironment\",\"ReactEventEmitter\",\"ReactID\",\"ReactInstanceHandles\",\"getEventTarget\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactID\"), j = b(\"ReactInstanceHandles\"), k = b(\"getEventTarget\"), l = true, m = {\n        setEnabled: function(n) {\n            l = !!n;\n        },\n        isEnabled: function() {\n            return l;\n        },\n        createTopLevelCallback: function(n) {\n            return function(o) {\n                if (!l) {\n                    return\n                };\n                if ((o.srcElement && (o.srcElement !== o.target))) {\n                    o.target = o.srcElement;\n                };\n                var p = (j.getFirstReactDOM(k(o)) || g.global), q = (i.getID(p) || \"\");\n                h.handleTopLevel(n, p, q, o);\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReactInstanceHandles\", [\"ReactID\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactID\"), h = b(\"invariant\"), i = \".\", j = i.length, k = 100, l = 9999999;\n    function m(v) {\n        return (((i + \"r[\") + v.toString(36)) + \"]\");\n    };\n    function n(v, w) {\n        return ((v.charAt(w) === i) || (w === v.length));\n    };\n    function o(v) {\n        return ((v === \"\") || (((v.charAt(0) === i) && (v.charAt((v.length - 1)) !== i))));\n    };\n    function p(v, w) {\n        return (((w.indexOf(v) === 0) && n(w, v.length)));\n    };\n    function q(v) {\n        return (v ? v.substr(0, v.lastIndexOf(i)) : \"\");\n    };\n    function r(v, w) {\n        h((o(v) && o(w)));\n        h(p(v, w));\n        if ((v === w)) {\n            return v\n        };\n        var x = (v.length + j);\n        for (var y = x; (y < w.length); y++) {\n            if (n(w, y)) {\n                break;\n            };\n        };\n        return w.substr(0, y);\n    };\n    function s(v, w) {\n        var x = Math.min(v.length, w.length);\n        if ((x === 0)) {\n            return \"\"\n        };\n        var y = 0;\n        for (var z = 0; (z <= x); z++) {\n            if ((n(v, z) && n(w, z))) {\n                y = z;\n            }\n             else if ((v.charAt(z) !== w.charAt(z))) {\n                break;\n            }\n        ;\n        };\n        var aa = v.substr(0, y);\n        h(o(aa));\n        return aa;\n    };\n    function t(v, w, x, y, z, aa) {\n        v = (v || \"\");\n        w = (w || \"\");\n        h((v !== w));\n        var ba = p(w, v);\n        h((ba || p(v, w)));\n        var ca = 0, da = (ba ? q : r);\n        for (var ea = v; ; ea = da(ea, w)) {\n            if ((((!z || (ea !== v))) && ((!aa || (ea !== w))))) {\n                x(ea, ba, y);\n            };\n            if ((ea === w)) {\n                break;\n            };\n            h((ca++ < k));\n        };\n    };\n    var u = {\n        separator: i,\n        createReactRootID: function() {\n            return m(Math.ceil((Math.random() * l)));\n        },\n        isRenderedByReact: function(v) {\n            if ((v.nodeType !== 1)) {\n                return false\n            };\n            var w = g.getID(v);\n            return (w ? (w.charAt(0) === i) : false);\n        },\n        getFirstReactDOM: function(v) {\n            var w = v;\n            while ((w && (w.parentNode !== w))) {\n                if (u.isRenderedByReact(w)) {\n                    return w\n                };\n                w = w.parentNode;\n            };\n            return null;\n        },\n        findComponentRoot: function(v, w) {\n            var x = [v.firstChild,], y = 0;\n            while ((y < x.length)) {\n                var z = x[y++];\n                while (z) {\n                    var aa = g.getID(z);\n                    if (aa) {\n                        if ((w === aa)) {\n                            return z;\n                        }\n                         else if (p(aa, w)) {\n                            x.length = y = 0;\n                            x.push(z.firstChild);\n                            break;\n                        }\n                         else x.push(z.firstChild);\n                        \n                    ;\n                    }\n                     else x.push(z.firstChild);\n                ;\n                    z = z.nextSibling;\n                };\n            };\n            h(false);\n        },\n        getReactRootIDFromNodeID: function(v) {\n            var w = /\\.r\\[[^\\]]+\\]/.exec(v);\n            return (w && w[0]);\n        },\n        traverseEnterLeave: function(v, w, x, y, z) {\n            var aa = s(v, w);\n            if ((aa !== v)) {\n                t(v, aa, x, y, false, true);\n            };\n            if ((aa !== w)) {\n                t(aa, w, x, z, true, false);\n            };\n        },\n        traverseTwoPhase: function(v, w, x) {\n            if (v) {\n                t(\"\", v, w, x, true, false);\n                t(v, \"\", w, x, false, true);\n            }\n        ;\n        },\n        _getFirstCommonAncestorID: s,\n        _getNextDescendantID: r\n    };\n    e.exports = u;\n});\n__d(\"ReactMount\", [\"invariant\",\"ReactEventEmitter\",\"ReactInstanceHandles\",\"ReactEventTopLevelCallback\",\"ReactID\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactInstanceHandles\"), j = b(\"ReactEventTopLevelCallback\"), k = b(\"ReactID\"), l = b(\"$\"), m = {\n    }, n = {\n    };\n    function o(r) {\n        return (r && r.firstChild);\n    };\n    function p(r) {\n        var s = o(r);\n        return (s && k.getID(s));\n    };\n    var q = {\n        totalInstantiationTime: 0,\n        totalInjectionTime: 0,\n        useTouchEvents: false,\n        scrollMonitor: function(r, s) {\n            s();\n        },\n        prepareTopLevelEvents: function(r) {\n            h.ensureListening(q.useTouchEvents, r);\n        },\n        _updateRootComponent: function(r, s, t, u) {\n            var v = s.props;\n            q.scrollMonitor(t, function() {\n                r.replaceProps(v, u);\n            });\n            return r;\n        },\n        _registerComponent: function(r, s) {\n            q.prepareTopLevelEvents(j);\n            var t = q.registerContainer(s);\n            m[t] = r;\n            return t;\n        },\n        _renderNewRootComponent: function(r, s, t) {\n            var u = q._registerComponent(r, s);\n            r.mountComponentIntoNode(u, s, t);\n            return r;\n        },\n        renderComponent: function(r, s, t) {\n            var u = m[p(s)];\n            if (u) {\n                if ((u.constructor === r.constructor)) {\n                    return q._updateRootComponent(u, r, s, t);\n                }\n                 else q.unmountAndReleaseReactRootNode(s);\n            \n            };\n            var v = o(s), w = (v && i.isRenderedByReact(v)), x = (w && !u), y = q._renderNewRootComponent(r, s, x);\n            (t && t());\n            return y;\n        },\n        constructAndRenderComponent: function(r, s, t) {\n            return q.renderComponent(r(s), t);\n        },\n        constructAndRenderComponentByID: function(r, s, t) {\n            return q.constructAndRenderComponent(r, s, l(t));\n        },\n        registerContainer: function(r) {\n            var s = p(r);\n            if (s) {\n                s = i.getReactRootIDFromNodeID(s);\n            };\n            if (!s) {\n                s = i.createReactRootID();\n            };\n            n[s] = r;\n            return s;\n        },\n        unmountAndReleaseReactRootNode: function(r) {\n            var s = p(r), t = m[s];\n            if (!t) {\n                return false\n            };\n            t.unmountComponentFromNode(r);\n            delete m[s];\n            delete n[s];\n            return true;\n        },\n        findReactContainerForID: function(r) {\n            var s = i.getReactRootIDFromNodeID(r), t = n[s];\n            return t;\n        },\n        findReactNodeByID: function(r) {\n            var s = q.findReactContainerForID(r);\n            return i.findComponentRoot(s, r);\n        }\n    };\n    e.exports = q;\n});\n__d(\"ReactID\", [\"invariant\",\"ReactMount\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactMount\"), i = \"data-reactid\", j = {\n    };\n    function k(r) {\n        var s = l(r);\n        if (s) {\n            if (j.hasOwnProperty(s)) {\n                var t = j[s];\n                if ((t !== r)) {\n                    g(!o(t, s));\n                    j[s] = r;\n                }\n            ;\n            }\n             else j[s] = r;\n        \n        };\n        return s;\n    };\n    function l(r) {\n        return (((r && r.getAttribute) && r.getAttribute(i)) || \"\");\n    };\n    function m(r, s) {\n        var t = l(r);\n        if ((t !== s)) {\n            delete j[t];\n        };\n        r.setAttribute(i, s);\n        j[s] = r;\n    };\n    function n(r) {\n        if ((!j.hasOwnProperty(r) || !o(j[r], r))) {\n            j[r] = h.findReactNodeByID(r);\n        };\n        return j[r];\n    };\n    function o(r, s) {\n        if (r) {\n            g((l(r) === s));\n            var t = h.findReactContainerForID(s);\n            if ((t && p(t, r))) {\n                return true\n            };\n        }\n    ;\n        return false;\n    };\n    function p(r, s) {\n        if (r.contains) {\n            return r.contains(s)\n        };\n        if ((s === r)) {\n            return true\n        };\n        if ((s.nodeType === 3)) {\n            s = s.parentNode;\n        };\n        while ((s && (s.nodeType === 1))) {\n            if ((s === r)) {\n                return true\n            };\n            s = s.parentNode;\n        };\n        return false;\n    };\n    function q(r) {\n        delete j[r];\n    };\n    f.ATTR_NAME = i;\n    f.getID = k;\n    f.rawGetID = l;\n    f.setID = m;\n    f.getNode = n;\n    f.purgeID = q;\n});\n__d(\"getTextContentAccessor\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = null;\n    function i() {\n        if ((!h && g.canUseDOM)) {\n            h = ((\"innerText\" in document.createElement(\"div\")) ? \"innerText\" : \"textContent\");\n        };\n        return h;\n    };\n    e.exports = i;\n});\n__d(\"ReactDOMIDOperations\", [\"CSSPropertyOperations\",\"DOMChildrenOperations\",\"DOMPropertyOperations\",\"ReactID\",\"getTextContentAccessor\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMChildrenOperations\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactID\"), k = b(\"getTextContentAccessor\"), l = b(\"invariant\"), m = {\n        dangerouslySetInnerHTML: \"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",\n        style: \"`style` must be set using `updateStylesByID()`.\"\n    }, n = (k() || \"NA\"), o = {\n        updatePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            if ((r != null)) {\n                i.setValueForProperty(s, q, r);\n            }\n             else i.deleteValueForProperty(s, q);\n        ;\n        },\n        deletePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.deleteValueForProperty(s, q, r);\n        },\n        updatePropertiesByID: function(p, q) {\n            for (var r in q) {\n                if (!q.hasOwnProperty(r)) {\n                    continue;\n                };\n                o.updatePropertiesByID(p, r, q[r]);\n            };\n        },\n        updateStylesByID: function(p, q) {\n            var r = j.getNode(p);\n            g.setValueForStyles(r, q);\n        },\n        updateInnerHTMLByID: function(p, q) {\n            var r = j.getNode(p);\n            r.innerHTML = (((q && q.__html) || \"\")).replace(/^ /g, \"&nbsp;\");\n        },\n        updateTextContentByID: function(p, q) {\n            var r = j.getNode(p);\n            r[n] = q;\n        },\n        dangerouslyReplaceNodeWithMarkupByID: function(p, q) {\n            var r = j.getNode(p);\n            h.dangerouslyReplaceNodeWithMarkup(r, q);\n        },\n        manageChildrenByParentID: function(p, q) {\n            var r = j.getNode(p);\n            h.manageChildren(r, q);\n        }\n    };\n    e.exports = o;\n});\n__d(\"ReactOwner\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        isValidOwner: function(i) {\n            return !!(((i && (typeof i.attachRef === \"function\")) && (typeof i.detachRef === \"function\")));\n        },\n        addComponentAsRefTo: function(i, j, k) {\n            g(h.isValidOwner(k));\n            k.attachRef(j, i);\n        },\n        removeComponentAsRefFrom: function(i, j, k) {\n            g(h.isValidOwner(k));\n            if ((k.refs[j] === i)) {\n                k.detachRef(j);\n            };\n        },\n        Mixin: {\n            attachRef: function(i, j) {\n                g(j.isOwnedBy(this));\n                var k = (this.refs || (this.refs = {\n                }));\n                k[i] = j;\n            },\n            detachRef: function(i) {\n                delete this.refs[i];\n            }\n        }\n    };\n    e.exports = h;\n});\n__d(\"PooledClass\", [], function(a, b, c, d, e, f) {\n    var g = function(p) {\n        var q = this;\n        if (q.instancePool.length) {\n            var r = q.instancePool.pop();\n            q.call(r, p);\n            return r;\n        }\n         else return new q(p)\n    ;\n    }, h = function(p, q) {\n        var r = this;\n        if (r.instancePool.length) {\n            var s = r.instancePool.pop();\n            r.call(s, p, q);\n            return s;\n        }\n         else return new r(p, q)\n    ;\n    }, i = function(p, q, r) {\n        var s = this;\n        if (s.instancePool.length) {\n            var t = s.instancePool.pop();\n            s.call(t, p, q, r);\n            return t;\n        }\n         else return new s(p, q, r)\n    ;\n    }, j = function(p, q, r, s, t) {\n        var u = this;\n        if (u.instancePool.length) {\n            var v = u.instancePool.pop();\n            u.call(v, p, q, r, s, t);\n            return v;\n        }\n         else return new u(p, q, r, s, t)\n    ;\n    }, k = function(p) {\n        var q = this;\n        if (p.destructor) {\n            p.destructor();\n        };\n        if ((q.instancePool.length < q.poolSize)) {\n            q.instancePool.push(p);\n        };\n    }, l = 10, m = g, n = function(p, q) {\n        var r = p;\n        r.instancePool = [];\n        r.getPooled = (q || m);\n        if (!r.poolSize) {\n            r.poolSize = l;\n        };\n        r.release = k;\n        return r;\n    }, o = {\n        addPoolingTo: n,\n        oneArgumentPooler: g,\n        twoArgumentPooler: h,\n        threeArgumentPooler: i,\n        fiveArgumentPooler: j\n    };\n    e.exports = o;\n});\n__d(\"ReactInputSelection\", [], function(a, b, c, d, e, f) {\n    function g() {\n        try {\n            return document.activeElement;\n        } catch (j) {\n        \n        };\n    };\n    function h(j) {\n        return document.documentElement.contains(j);\n    };\n    var i = {\n        hasSelectionCapabilities: function(j) {\n            return (j && ((((((j.nodeName === \"INPUT\") && (j.type === \"text\"))) || (j.nodeName === \"TEXTAREA\")) || (j.contentEditable === \"true\"))));\n        },\n        getSelectionInformation: function() {\n            var j = g();\n            return {\n                focusedElem: j,\n                selectionRange: (i.hasSelectionCapabilities(j) ? i.getSelection(j) : null)\n            };\n        },\n        restoreSelection: function(j) {\n            var k = g(), l = j.focusedElem, m = j.selectionRange;\n            if (((k !== l) && h(l))) {\n                if (i.hasSelectionCapabilities(l)) {\n                    i.setSelection(l, m);\n                };\n                l.focus();\n            }\n        ;\n        },\n        getSelection: function(j) {\n            var k;\n            if (((j.contentEditable === \"true\") && window.getSelection)) {\n                k = window.getSelection().getRangeAt(0);\n                var l = k.commonAncestorContainer;\n                if ((l && (l.nodeType === 3))) {\n                    l = l.parentNode;\n                };\n                if ((l !== j)) {\n                    return {\n                        start: 0,\n                        end: 0\n                    };\n                }\n                 else return {\n                    start: k.startOffset,\n                    end: k.endOffset\n                }\n            ;\n            }\n        ;\n            if (!document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                }\n            };\n            k = document.selection.createRange();\n            if ((k.parentElement() !== j)) {\n                return {\n                    start: 0,\n                    end: 0\n                }\n            };\n            var m = j.value.length;\n            if ((j.nodeName === \"INPUT\")) {\n                return {\n                    start: -k.moveStart(\"character\", -m),\n                    end: -k.moveEnd(\"character\", -m)\n                };\n            }\n             else {\n                var n = k.duplicate();\n                n.moveToElementText(j);\n                n.setEndPoint(\"StartToEnd\", k);\n                var o = (m - n.text.length);\n                n.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: (m - n.text.length),\n                    end: o\n                };\n            }\n        ;\n        },\n        setSelection: function(j, k) {\n            var l, m = k.start, n = k.end;\n            if ((typeof n === \"undefined\")) {\n                n = m;\n            };\n            if (document.selection) {\n                if ((j.tagName === \"TEXTAREA\")) {\n                    var o = ((j.value.slice(0, m).match(/\\r/g) || [])).length, p = ((j.value.slice(m, n).match(/\\r/g) || [])).length;\n                    m -= o;\n                    n -= (o + p);\n                }\n            ;\n                l = j.createTextRange();\n                l.collapse(true);\n                l.moveStart(\"character\", m);\n                l.moveEnd(\"character\", (n - m));\n                l.select();\n            }\n             else if ((j.contentEditable === \"true\")) {\n                if ((j.childNodes.length === 1)) {\n                    l = document.createRange();\n                    l.setStart(j.childNodes[0], m);\n                    l.setEnd(j.childNodes[0], n);\n                    var q = window.getSelection();\n                    q.removeAllRanges();\n                    q.addRange(l);\n                }\n            ;\n            }\n             else {\n                j.selectionStart = m;\n                j.selectionEnd = Math.min(n, j.value.length);\n                j.focus();\n            }\n            \n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"mixInto\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        var j;\n        for (j in i) {\n            if (!i.hasOwnProperty(j)) {\n                continue;\n            };\n            h.prototype[j] = i[j];\n        };\n    };\n    e.exports = g;\n});\n__d(\"ReactOnDOMReady\", [\"PooledClass\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"mixInto\");\n    function i(j) {\n        this._queue = (j || null);\n    };\n    h(i, {\n        enqueue: function(j, k) {\n            this._queue = (this._queue || []);\n            this._queue.push({\n                component: j,\n                callback: k\n            });\n        },\n        notifyAll: function() {\n            var j = this._queue;\n            if (j) {\n                this._queue = null;\n                for (var k = 0, l = j.length; (k < l); k++) {\n                    var m = j[k].component, n = j[k].callback;\n                    n.call(m, m.getDOMNode());\n                };\n                j.length = 0;\n            }\n        ;\n        },\n        reset: function() {\n            this._queue = null;\n        },\n        destructor: function() {\n            this.reset();\n        }\n    });\n    g.addPoolingTo(i);\n    e.exports = i;\n});\n__d(\"Transaction\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"DUAL_TRANSACTION\", i = \"MISSING_TRANSACTION\", j = {\n        reinitializeTransaction: function() {\n            this.transactionWrappers = this.getTransactionWrappers();\n            if (!this.wrapperInitData) {\n                this.wrapperInitData = [];\n            }\n             else this.wrapperInitData.length = 0;\n        ;\n            if (!this.timingMetrics) {\n                this.timingMetrics = {\n                };\n            };\n            this.timingMetrics.methodInvocationTime = 0;\n            if (!this.timingMetrics.wrapperInitTimes) {\n                this.timingMetrics.wrapperInitTimes = [];\n            }\n             else this.timingMetrics.wrapperInitTimes.length = 0;\n        ;\n            if (!this.timingMetrics.wrapperCloseTimes) {\n                this.timingMetrics.wrapperCloseTimes = [];\n            }\n             else this.timingMetrics.wrapperCloseTimes.length = 0;\n        ;\n            this._isInTransaction = false;\n        },\n        _isInTransaction: false,\n        getTransactionWrappers: null,\n        isInTransaction: function() {\n            return !!this._isInTransaction;\n        },\n        perform: function(l, m, n, o, p, q, r, s) {\n            g(this.isInTransaction(), h);\n            var t = Date.now(), u = null, v;\n            try {\n                this.initializeAll();\n                v = l.call(m, n, o, p, q, r, s);\n            } catch (w) {\n                u = w;\n            } finally {\n                var x = Date.now();\n                this.methodInvocationTime += ((x - t));\n                try {\n                    this.closeAll();\n                } catch (y) {\n                    u = (u || y);\n                };\n            };\n            if (u) {\n                throw u\n            };\n            return v;\n        },\n        initializeAll: function() {\n            this._isInTransaction = true;\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperInitTimes, n = null;\n            for (var o = 0; (o < l.length); o++) {\n                var p = Date.now(), q = l[o];\n                try {\n                    this.wrapperInitData[o] = (q.initialize ? q.initialize.call(this) : null);\n                } catch (r) {\n                    n = (n || r);\n                    this.wrapperInitData[o] = k.OBSERVED_ERROR;\n                } finally {\n                    var s = m[o], t = Date.now();\n                    m[o] = (((s || 0)) + ((t - p)));\n                };\n            };\n            if (n) {\n                throw n\n            };\n        },\n        closeAll: function() {\n            g(!this.isInTransaction(), i);\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperCloseTimes, n = null;\n            for (var o = 0; (o < l.length); o++) {\n                var p = l[o], q = Date.now(), r = this.wrapperInitData[o];\n                try {\n                    if ((r !== k.OBSERVED_ERROR)) {\n                        (p.close && p.close.call(this, r));\n                    };\n                } catch (s) {\n                    n = (n || s);\n                } finally {\n                    var t = Date.now(), u = m[o];\n                    m[o] = (((u || 0)) + ((t - q)));\n                };\n            };\n            this.wrapperInitData.length = 0;\n            this._isInTransaction = false;\n            if (n) {\n                throw n\n            };\n        }\n    }, k = {\n        Mixin: j,\n        OBSERVED_ERROR: {\n        }\n    };\n    e.exports = k;\n});\n__d(\"ReactReconcileTransaction\", [\"ExecutionEnvironment\",\"PooledClass\",\"ReactEventEmitter\",\"ReactInputSelection\",\"ReactOnDOMReady\",\"Transaction\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"PooledClass\"), i = b(\"ReactEventEmitter\"), j = b(\"ReactInputSelection\"), k = b(\"ReactOnDOMReady\"), l = b(\"Transaction\"), m = b(\"mixInto\"), n = {\n        initialize: j.getSelectionInformation,\n        close: j.restoreSelection\n    }, o = {\n        initialize: function() {\n            var t = i.isEnabled();\n            i.setEnabled(false);\n            return t;\n        },\n        close: function(t) {\n            i.setEnabled(t);\n        }\n    }, p = {\n        initialize: function() {\n            this.reactOnDOMReady.reset();\n        },\n        close: function() {\n            this.reactOnDOMReady.notifyAll();\n        }\n    }, q = [n,o,p,];\n    function r() {\n        this.reinitializeTransaction();\n        this.reactOnDOMReady = k.getPooled(null);\n    };\n    var s = {\n        getTransactionWrappers: function() {\n            if (g.canUseDOM) {\n                return q;\n            }\n             else return []\n        ;\n        },\n        getReactOnDOMReady: function() {\n            return this.reactOnDOMReady;\n        },\n        destructor: function() {\n            k.release(this.reactOnDOMReady);\n            this.reactOnDOMReady = null;\n        }\n    };\n    m(r, l.Mixin);\n    m(r, s);\n    h.addPoolingTo(r);\n    e.exports = r;\n});\n__d(\"mergeHelpers\", [\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"throwIf\"), i = 36, j = g({\n        MERGE_ARRAY_FAIL: null,\n        MERGE_CORE_FAILURE: null,\n        MERGE_TYPE_USAGE_FAILURE: null,\n        MERGE_DEEP_MAX_LEVELS: null,\n        MERGE_DEEP_NO_ARR_STRATEGY: null\n    }), k = function(m) {\n        return ((typeof m !== \"object\") || (m === null));\n    }, l = {\n        MAX_MERGE_DEPTH: i,\n        isTerminal: k,\n        normalizeMergeArg: function(m) {\n            return (((m === undefined) || (m === null)) ? {\n            } : m);\n        },\n        checkMergeArrayArgs: function(m, n) {\n            h((!Array.isArray(m) || !Array.isArray(n)), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeObjectArgs: function(m, n) {\n            l.checkMergeObjectArg(m);\n            l.checkMergeObjectArg(n);\n        },\n        checkMergeObjectArg: function(m) {\n            h((k(m) || Array.isArray(m)), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeLevel: function(m) {\n            h((m >= i), j.MERGE_DEEP_MAX_LEVELS);\n        },\n        checkArrayStrategy: function(m) {\n            h(((m !== undefined) && !((m in l.ArrayStrategies))), j.MERGE_DEEP_NO_ARR_STRATEGY);\n        },\n        ArrayStrategies: g({\n            Clobber: true,\n            IndexByIndex: true\n        }),\n        ERRORS: j\n    };\n    e.exports = l;\n});\n__d(\"mergeInto\", [\"mergeHelpers\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeHelpers\"), h = g.checkMergeObjectArg;\n    function i(j, k) {\n        h(j);\n        if ((k != null)) {\n            h(k);\n            for (var l in k) {\n                if (!k.hasOwnProperty(l)) {\n                    continue;\n                };\n                j[l] = k[l];\n            };\n        }\n    ;\n    };\n    e.exports = i;\n});\n__d(\"merge\", [\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeInto\"), h = function(i, j) {\n        var k = {\n        };\n        g(k, i);\n        g(k, j);\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"ReactComponent\", [\"ReactCurrentOwner\",\"ReactDOMIDOperations\",\"ReactID\",\"ReactOwner\",\"ReactReconcileTransaction\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCurrentOwner\"), h = b(\"ReactDOMIDOperations\"), i = b(\"ReactID\"), j = b(\"ReactOwner\"), k = b(\"ReactReconcileTransaction\"), l = b(\"ReactUpdates\"), m = b(\"invariant\"), n = b(\"keyMirror\"), o = b(\"merge\"), p = \"{owner}\", q = \"{is.key.validated}\", r = n({\n        MOUNTED: null,\n        UNMOUNTED: null\n    }), s = {\n    };\n    function t(w) {\n        if ((w[q] || (w.props.key != null))) {\n            return\n        };\n        w[q] = true;\n        if (!g.current) {\n            return\n        };\n        var x = g.current.constructor.displayName;\n        if (s.hasOwnProperty(x)) {\n            return\n        };\n        s[x] = true;\n        var y = (((\"Each child in an array should have a unique \\\"key\\\" prop. \" + \"Check the render method of \") + x) + \".\");\n        if (!w.isOwnedBy(g.current)) {\n            var z = (w.props[p] && w.props[p].constructor.displayName);\n            y += ((\" It was passed a child from \" + z) + \".\");\n        }\n    ;\n    };\n    function u(w) {\n        if (Array.isArray(w)) {\n            for (var x = 0; (x < w.length); x++) {\n                var y = w[x];\n                if (v.isValidComponent(y)) {\n                    t(y);\n                };\n            };\n        }\n         else if (v.isValidComponent(w)) {\n            w[q] = true;\n        }\n    ;\n    };\n    var v = {\n        isValidComponent: function(w) {\n            return !!(((w && (typeof w.mountComponentIntoNode === \"function\")) && (typeof w.receiveProps === \"function\")));\n        },\n        getKey: function(w, x) {\n            if (((w && w.props) && (w.props.key != null))) {\n                return (\"\" + w.props.key)\n            };\n            return (\"\" + x);\n        },\n        LifeCycle: r,\n        DOMIDOperations: h,\n        ReactReconcileTransaction: k,\n        setDOMOperations: function(w) {\n            v.DOMIDOperations = w;\n        },\n        setReactReconcileTransaction: function(w) {\n            v.ReactReconcileTransaction = w;\n        },\n        Mixin: {\n            isMounted: function() {\n                return (this._lifeCycleState === r.MOUNTED);\n            },\n            getDOMNode: function() {\n                m(this.isMounted());\n                return i.getNode(this._rootNodeID);\n            },\n            setProps: function(w, x) {\n                this.replaceProps(o((this._pendingProps || this.props), w), x);\n            },\n            replaceProps: function(w, x) {\n                m(!this.props[p]);\n                this._pendingProps = w;\n                l.enqueueUpdate(this, x);\n            },\n            construct: function(w, x) {\n                this.props = (w || {\n                });\n                this.props[p] = g.current;\n                this._lifeCycleState = r.UNMOUNTED;\n                this._pendingProps = null;\n                this._pendingCallbacks = null;\n                var y = (arguments.length - 1);\n                if ((y === 1)) {\n                    this.props.children = x;\n                }\n                 else if ((y > 1)) {\n                    var z = Array(y);\n                    for (var aa = 0; (aa < y); aa++) {\n                        z[aa] = arguments[(aa + 1)];;\n                    };\n                    this.props.children = z;\n                }\n                \n            ;\n            },\n            mountComponent: function(w, x) {\n                m(!this.isMounted());\n                var y = this.props;\n                if ((y.ref != null)) {\n                    j.addComponentAsRefTo(this, y.ref, y[p]);\n                };\n                this._rootNodeID = w;\n                this._lifeCycleState = r.MOUNTED;\n            },\n            unmountComponent: function() {\n                m(this.isMounted());\n                var w = this.props;\n                if ((w.ref != null)) {\n                    j.removeComponentAsRefFrom(this, w.ref, w[p]);\n                };\n                i.purgeID(this._rootNodeID);\n                this._rootNodeID = null;\n                this._lifeCycleState = r.UNMOUNTED;\n            },\n            receiveProps: function(w, x) {\n                m(this.isMounted());\n                this._pendingProps = w;\n                this._performUpdateIfNecessary(x);\n            },\n            performUpdateIfNecessary: function() {\n                var w = v.ReactReconcileTransaction.getPooled();\n                w.perform(this._performUpdateIfNecessary, this, w);\n                v.ReactReconcileTransaction.release(w);\n            },\n            _performUpdateIfNecessary: function(w) {\n                if ((this._pendingProps == null)) {\n                    return\n                };\n                var x = this.props;\n                this.props = this._pendingProps;\n                this._pendingProps = null;\n                this.updateComponent(w, x);\n            },\n            updateComponent: function(w, x) {\n                var y = this.props;\n                if (((y[p] !== x[p]) || (y.ref !== x.ref))) {\n                    if ((x.ref != null)) {\n                        j.removeComponentAsRefFrom(this, x.ref, x[p]);\n                    };\n                    if ((y.ref != null)) {\n                        j.addComponentAsRefTo(this, y.ref, y[p]);\n                    };\n                }\n            ;\n            },\n            mountComponentIntoNode: function(w, x, y) {\n                var z = v.ReactReconcileTransaction.getPooled();\n                z.perform(this._mountComponentIntoNode, this, w, x, z, y);\n                v.ReactReconcileTransaction.release(z);\n            },\n            _mountComponentIntoNode: function(w, x, y, z) {\n                m((x && (x.nodeType === 1)));\n                var aa = this.mountComponent(w, y);\n                if (z) {\n                    return\n                };\n                var ba = x.parentNode;\n                if (ba) {\n                    var ca = x.nextSibling;\n                    ba.removeChild(x);\n                    x.innerHTML = aa;\n                    if (ca) {\n                        ba.insertBefore(x, ca);\n                    }\n                     else ba.appendChild(x);\n                ;\n                }\n                 else x.innerHTML = aa;\n            ;\n            },\n            unmountComponentFromNode: function(w) {\n                this.unmountComponent();\n                while (w.lastChild) {\n                    w.removeChild(w.lastChild);;\n                };\n            },\n            isOwnedBy: function(w) {\n                return (this.props[p] === w);\n            },\n            getSiblingByRef: function(w) {\n                var x = this.props[p];\n                if ((!x || !x.refs)) {\n                    return null\n                };\n                return x.refs[w];\n            }\n        }\n    };\n    e.exports = v;\n});\n__d(\"joinClasses\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            h = \"\";\n        };\n        var i, j = arguments.length;\n        if ((j > 1)) {\n            for (var k = 1; (k < j); k++) {\n                i = arguments[k];\n                (i && (h += (\" \" + i)));\n            }\n        };\n        return h;\n    };\n    e.exports = g;\n});\n__d(\"ReactPropTransferer\", [\"emptyFunction\",\"joinClasses\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"joinClasses\"), i = b(\"merge\");\n    function j(m) {\n        return function(n, o, p) {\n            if (!n.hasOwnProperty(o)) {\n                n[o] = p;\n            }\n             else n[o] = m(n[o], p);\n        ;\n        };\n    };\n    var k = {\n        children: g,\n        className: j(h),\n        ref: g,\n        style: j(i)\n    }, l = {\n        TransferStrategies: k,\n        Mixin: {\n            transferPropsTo: function(m) {\n                var n = {\n                };\n                for (var o in m.props) {\n                    if (m.props.hasOwnProperty(o)) {\n                        n[o] = m.props[o];\n                    };\n                };\n                for (var p in this.props) {\n                    if (!this.props.hasOwnProperty(p)) {\n                        continue;\n                    };\n                    var q = k[p];\n                    if (q) {\n                        q(n, p, this.props[p]);\n                    }\n                     else if (!n.hasOwnProperty(p)) {\n                        n[p] = this.props[p];\n                    }\n                ;\n                };\n                m.props = n;\n                return m;\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"ReactCompositeComponent\", [\"ReactComponent\",\"ReactCurrentOwner\",\"ReactOwner\",\"ReactPropTransferer\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactCurrentOwner\"), i = b(\"ReactOwner\"), j = b(\"ReactPropTransferer\"), k = b(\"ReactUpdates\"), l = b(\"invariant\"), m = b(\"keyMirror\"), n = b(\"merge\"), o = b(\"mixInto\"), p = m({\n        DEFINE_ONCE: null,\n        DEFINE_MANY: null,\n        OVERRIDE_BASE: null\n    }), q = {\n        mixins: p.DEFINE_MANY,\n        propTypes: p.DEFINE_ONCE,\n        getDefaultProps: p.DEFINE_ONCE,\n        getInitialState: p.DEFINE_ONCE,\n        render: p.DEFINE_ONCE,\n        componentWillMount: p.DEFINE_MANY,\n        componentDidMount: p.DEFINE_MANY,\n        componentWillReceiveProps: p.DEFINE_MANY,\n        shouldComponentUpdate: p.DEFINE_ONCE,\n        componentWillUpdate: p.DEFINE_MANY,\n        componentDidUpdate: p.DEFINE_MANY,\n        componentWillUnmount: p.DEFINE_MANY,\n        updateComponent: p.OVERRIDE_BASE\n    }, r = {\n        displayName: function(aa, ba) {\n            aa.displayName = ba;\n        },\n        mixins: function(aa, ba) {\n            if (ba) {\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    u(aa, ba[ca]);;\n                }\n            };\n        },\n        propTypes: function(aa, ba) {\n            aa.propTypes = ba;\n        }\n    };\n    function s(aa, ba) {\n        var ca = q[ba];\n        if (x.hasOwnProperty(ba)) {\n            l((ca === p.OVERRIDE_BASE));\n        };\n        if (aa.hasOwnProperty(ba)) {\n            l((ca === p.DEFINE_MANY));\n        };\n    };\n    function t(aa) {\n        var ba = aa._compositeLifeCycleState;\n        l((aa.isMounted() || (ba === w.MOUNTING)));\n        l(((ba !== w.RECEIVING_STATE) && (ba !== w.UNMOUNTING)));\n    };\n    function u(aa, ba) {\n        var ca = aa.prototype;\n        for (var da in ba) {\n            var ea = ba[da];\n            if ((!ba.hasOwnProperty(da) || !ea)) {\n                continue;\n            };\n            s(ca, da);\n            if (r.hasOwnProperty(da)) {\n                r[da](aa, ea);\n            }\n             else {\n                var fa = (da in q), ga = (da in ca), ha = ea.__reactDontBind, ia = (typeof ea === \"function\"), ja = (((ia && !fa) && !ga) && !ha);\n                if (ja) {\n                    if (!ca.__reactAutoBindMap) {\n                        ca.__reactAutoBindMap = {\n                        };\n                    };\n                    ca.__reactAutoBindMap[da] = ea;\n                    ca[da] = ea;\n                }\n                 else if (ga) {\n                    ca[da] = v(ca[da], ea);\n                }\n                 else ca[da] = ea;\n                \n            ;\n            }\n        ;\n        };\n    };\n    function v(aa, ba) {\n        return function ca() {\n            aa.apply(this, arguments);\n            ba.apply(this, arguments);\n        };\n    };\n    var w = m({\n        MOUNTING: null,\n        UNMOUNTING: null,\n        RECEIVING_PROPS: null,\n        RECEIVING_STATE: null\n    }), x = {\n        construct: function(aa, ba) {\n            g.Mixin.construct.apply(this, arguments);\n            this.state = null;\n            this._pendingState = null;\n            this._compositeLifeCycleState = null;\n        },\n        isMounted: function() {\n            return (g.Mixin.isMounted.call(this) && (this._compositeLifeCycleState !== w.MOUNTING));\n        },\n        mountComponent: function(aa, ba) {\n            g.Mixin.mountComponent.call(this, aa, ba);\n            this._compositeLifeCycleState = w.MOUNTING;\n            this._defaultProps = (this.getDefaultProps ? this.getDefaultProps() : null);\n            this._processProps(this.props);\n            if (this.__reactAutoBindMap) {\n                this._bindAutoBindMethods();\n            };\n            this.state = (this.getInitialState ? this.getInitialState() : null);\n            this._pendingState = null;\n            this._pendingForceUpdate = false;\n            if (this.componentWillMount) {\n                this.componentWillMount();\n                if (this._pendingState) {\n                    this.state = this._pendingState;\n                    this._pendingState = null;\n                }\n            ;\n            }\n        ;\n            this._renderedComponent = this._renderValidatedComponent();\n            this._compositeLifeCycleState = null;\n            var ca = this._renderedComponent.mountComponent(aa, ba);\n            if (this.componentDidMount) {\n                ba.getReactOnDOMReady().enqueue(this, this.componentDidMount);\n            };\n            return ca;\n        },\n        unmountComponent: function() {\n            this._compositeLifeCycleState = w.UNMOUNTING;\n            if (this.componentWillUnmount) {\n                this.componentWillUnmount();\n            };\n            this._compositeLifeCycleState = null;\n            this._defaultProps = null;\n            g.Mixin.unmountComponent.call(this);\n            this._renderedComponent.unmountComponent();\n            this._renderedComponent = null;\n            if (this.refs) {\n                this.refs = null;\n            };\n        },\n        setState: function(aa, ba) {\n            this.replaceState(n((this._pendingState || this.state), aa), ba);\n        },\n        replaceState: function(aa, ba) {\n            t(this);\n            this._pendingState = aa;\n            k.enqueueUpdate(this, ba);\n        },\n        _processProps: function(aa) {\n            var ba, ca = this._defaultProps;\n            for (ba in ca) {\n                if (!((ba in aa))) {\n                    aa[ba] = ca[ba];\n                };\n            };\n            var da = this.constructor.propTypes;\n            if (da) {\n                var ea = this.constructor.displayName;\n                for (ba in da) {\n                    var fa = da[ba];\n                    if (fa) {\n                        fa(aa, ba, ea);\n                    };\n                };\n            }\n        ;\n        },\n        performUpdateIfNecessary: function() {\n            var aa = this._compositeLifeCycleState;\n            if (((aa === w.MOUNTING) || (aa === w.RECEIVING_PROPS))) {\n                return\n            };\n            g.Mixin.performUpdateIfNecessary.call(this);\n        },\n        _performUpdateIfNecessary: function(aa) {\n            if ((((this._pendingProps == null) && (this._pendingState == null)) && !this._pendingForceUpdate)) {\n                return\n            };\n            var ba = this.props;\n            if ((this._pendingProps != null)) {\n                ba = this._pendingProps;\n                this._processProps(ba);\n                this._pendingProps = null;\n                this._compositeLifeCycleState = w.RECEIVING_PROPS;\n                if (this.componentWillReceiveProps) {\n                    this.componentWillReceiveProps(ba, aa);\n                };\n            }\n        ;\n            this._compositeLifeCycleState = w.RECEIVING_STATE;\n            var ca = (this._pendingState || this.state);\n            this._pendingState = null;\n            if (((this._pendingForceUpdate || !this.shouldComponentUpdate) || this.shouldComponentUpdate(ba, ca))) {\n                this._pendingForceUpdate = false;\n                this._performComponentUpdate(ba, ca, aa);\n            }\n             else {\n                this.props = ba;\n                this.state = ca;\n            }\n        ;\n            this._compositeLifeCycleState = null;\n        },\n        _performComponentUpdate: function(aa, ba, ca) {\n            var da = this.props, ea = this.state;\n            if (this.componentWillUpdate) {\n                this.componentWillUpdate(aa, ba, ca);\n            };\n            this.props = aa;\n            this.state = ba;\n            this.updateComponent(ca, da, ea);\n            if (this.componentDidUpdate) {\n                ca.getReactOnDOMReady().enqueue(this, this.componentDidUpdate.bind(this, da, ea));\n            };\n        },\n        updateComponent: function(aa, ba, ca) {\n            g.Mixin.updateComponent.call(this, aa, ba);\n            var da = this._renderedComponent, ea = this._renderValidatedComponent();\n            if ((da.constructor === ea.constructor)) {\n                da.receiveProps(ea.props, aa);\n            }\n             else {\n                var fa = this._rootNodeID, ga = da._rootNodeID;\n                da.unmountComponent();\n                var ha = ea.mountComponent(fa, aa);\n                g.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(ga, ha);\n                this._renderedComponent = ea;\n            }\n        ;\n        },\n        forceUpdate: function(aa) {\n            var ba = this._compositeLifeCycleState;\n            l((this.isMounted() || (ba === w.MOUNTING)));\n            l(((ba !== w.RECEIVING_STATE) && (ba !== w.UNMOUNTING)));\n            this._pendingForceUpdate = true;\n            k.enqueueUpdate(this, aa);\n        },\n        _renderValidatedComponent: function() {\n            var aa;\n            h.current = this;\n            try {\n                aa = this.render();\n            } catch (ba) {\n                throw ba;\n            } finally {\n                h.current = null;\n            };\n            l(g.isValidComponent(aa));\n            return aa;\n        },\n        _bindAutoBindMethods: function() {\n            for (var aa in this.__reactAutoBindMap) {\n                if (!this.__reactAutoBindMap.hasOwnProperty(aa)) {\n                    continue;\n                };\n                var ba = this.__reactAutoBindMap[aa];\n                this[aa] = this._bindAutoBindMethod(ba);\n            };\n        },\n        _bindAutoBindMethod: function(aa) {\n            var ba = this, ca = function() {\n                return aa.apply(ba, arguments);\n            };\n            return ca;\n        }\n    }, y = function() {\n    \n    };\n    o(y, g.Mixin);\n    o(y, i.Mixin);\n    o(y, j.Mixin);\n    o(y, x);\n    var z = {\n        LifeCycle: w,\n        Base: y,\n        createClass: function(aa) {\n            var ba = function() {\n            \n            };\n            ba.prototype = new y();\n            ba.prototype.constructor = ba;\n            u(ba, aa);\n            l(ba.prototype.render);\n            for (var ca in q) {\n                if (!ba.prototype[ca]) {\n                    ba.prototype[ca] = null;\n                };\n            };\n            var da = function(ea, fa) {\n                var ga = new ba();\n                ga.construct.apply(ga, arguments);\n                return ga;\n            };\n            da.componentConstructor = ba;\n            da.originalSpec = aa;\n            return da;\n        },\n        autoBind: function(aa) {\n            return aa;\n        }\n    };\n    e.exports = z;\n});\n__d(\"ReactMultiChild\", [\"ReactComponent\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\");\n    function h(k, l) {\n        return ((k && l) && (k.constructor === l.constructor));\n    };\n    var i = {\n        enqueueMarkupAt: function(k, l) {\n            this.domOperations = (this.domOperations || []);\n            this.domOperations.push({\n                insertMarkup: k,\n                finalIndex: l\n            });\n        },\n        enqueueMove: function(k, l) {\n            this.domOperations = (this.domOperations || []);\n            this.domOperations.push({\n                moveFrom: k,\n                finalIndex: l\n            });\n        },\n        enqueueUnmountChildByName: function(k, l) {\n            if (g.isValidComponent(l)) {\n                this.domOperations = (this.domOperations || []);\n                this.domOperations.push({\n                    removeAt: l._domIndex\n                });\n                (l.unmountComponent && l.unmountComponent());\n                delete this._renderedChildren[k];\n            }\n        ;\n        },\n        processChildDOMOperationsQueue: function() {\n            if (this.domOperations) {\n                g.DOMIDOperations.manageChildrenByParentID(this._rootNodeID, this.domOperations);\n                this.domOperations = null;\n            }\n        ;\n        },\n        unmountMultiChild: function() {\n            var k = this._renderedChildren;\n            for (var l in k) {\n                if ((k.hasOwnProperty(l) && k[l])) {\n                    var m = k[l];\n                    (m.unmountComponent && m.unmountComponent());\n                }\n            ;\n            };\n            this._renderedChildren = null;\n        },\n        mountMultiChild: function(k, l) {\n            var m = \"\", n = 0;\n            for (var o in k) {\n                var p = k[o];\n                if ((k.hasOwnProperty(o) && p)) {\n                    m += p.mountComponent(((this._rootNodeID + \".\") + o), l);\n                    p._domIndex = n;\n                    n++;\n                }\n            ;\n            };\n            this._renderedChildren = k;\n            this.domOperations = null;\n            return m;\n        },\n        updateMultiChild: function(k, l) {\n            if ((!k && !this._renderedChildren)) {\n                return;\n            }\n             else if ((k && !this._renderedChildren)) {\n                this._renderedChildren = {\n                };\n            }\n             else if ((!k && this._renderedChildren)) {\n                k = {\n                };\n            }\n            \n        ;\n            var m = (this._rootNodeID + \".\"), n = null, o = 0, p = 0, q = 0;\n            for (var r in k) {\n                if (!k.hasOwnProperty(r)) {\n                    continue;\n                };\n                var s = this._renderedChildren[r], t = k[r];\n                if (h(s, t)) {\n                    if (n) {\n                        this.enqueueMarkupAt(n, (p - o));\n                        n = null;\n                    }\n                ;\n                    o = 0;\n                    if ((s._domIndex < q)) {\n                        this.enqueueMove(s._domIndex, p);\n                    };\n                    q = Math.max(s._domIndex, q);\n                    s.receiveProps(t.props, l);\n                    s._domIndex = p;\n                }\n                 else {\n                    if (s) {\n                        this.enqueueUnmountChildByName(r, s);\n                        q = Math.max(s._domIndex, q);\n                    }\n                ;\n                    if (t) {\n                        this._renderedChildren[r] = t;\n                        var u = t.mountComponent((m + r), l);\n                        n = (n ? (n + u) : u);\n                        o++;\n                        t._domIndex = p;\n                    }\n                ;\n                }\n            ;\n                p = (t ? (p + 1) : p);\n            };\n            if (n) {\n                this.enqueueMarkupAt(n, (p - o));\n            };\n            for (var v in this._renderedChildren) {\n                if (!this._renderedChildren.hasOwnProperty(v)) {\n                    continue;\n                };\n                var w = this._renderedChildren[v];\n                if ((w && !k[v])) {\n                    this.enqueueUnmountChildByName(v, w);\n                };\n            };\n            this.processChildDOMOperationsQueue();\n        }\n    }, j = {\n        Mixin: i\n    };\n    e.exports = j;\n});\n__d(\"ReactTextComponent\", [\"ReactComponent\",\"ReactID\",\"escapeTextForBrowser\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactID\"), i = b(\"escapeTextForBrowser\"), j = b(\"mixInto\"), k = function(l) {\n        this.construct({\n            text: l\n        });\n    };\n    j(k, g.Mixin);\n    j(k, {\n        mountComponent: function(l) {\n            g.Mixin.mountComponent.call(this, l);\n            return (((((((\"\\u003Cspan \" + h.ATTR_NAME) + \"=\\\"\") + l) + \"\\\"\\u003E\") + i(this.props.text)) + \"\\u003C/span\\u003E\"));\n        },\n        receiveProps: function(l, m) {\n            if ((l.text !== this.props.text)) {\n                this.props.text = l.text;\n                g.DOMIDOperations.updateTextContentByID(this._rootNodeID, l.text);\n            }\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"traverseAllChildren\", [\"ReactComponent\",\"ReactTextComponent\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactTextComponent\"), i = b(\"throwIf\"), j = \"DUPLICATE_KEY_ERROR\", k = \"INVALID_CHILD\", l = function(n, o, p, q, r) {\n        var s = 0;\n        if (Array.isArray(n)) {\n            for (var t = 0; (t < n.length); t++) {\n                var u = n[t], v = (((o + \"[\") + g.getKey(u, t)) + \"]\"), w = (p + s);\n                s += l(u, v, w, q, r);\n            };\n        }\n         else {\n            var x = typeof n, y = (o === \"\"), z = (y ? ((\"[\" + g.getKey(n, 0)) + \"]\") : o);\n            if ((((n === null) || (n === undefined)) || (x === \"boolean\"))) {\n                q(r, null, z, p);\n                s = 1;\n            }\n             else if (n.mountComponentIntoNode) {\n                q(r, n, z, p);\n                s = 1;\n            }\n             else if ((x === \"object\")) {\n                i((n && (n.nodeType === 1)), k);\n                for (var aa in n) {\n                    if (n.hasOwnProperty(aa)) {\n                        s += l(n[aa], (((o + \"{\") + aa) + \"}\"), (p + s), q, r);\n                    };\n                };\n            }\n             else if ((x === \"string\")) {\n                var ba = new h(n);\n                q(r, ba, z, p);\n                s += 1;\n            }\n             else if ((x === \"number\")) {\n                var ca = new h((\"\" + n));\n                q(r, ca, z, p);\n                s += 1;\n            }\n            \n            \n            \n            \n        ;\n        }\n    ;\n        return s;\n    };\n    function m(n, o, p) {\n        if (((n !== null) && (n !== undefined))) {\n            l(n, \"\", 0, o, p);\n        };\n    };\n    m.DUPLICATE_KEY_ERROR = j;\n    e.exports = m;\n});\n__d(\"flattenChildren\", [\"throwIf\",\"traverseAllChildren\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = b(\"traverseAllChildren\");\n    function i(k, l, m) {\n        var n = k;\n        n[m] = l;\n    };\n    function j(k) {\n        if (((k === null) || (k === undefined))) {\n            return k\n        };\n        var l = {\n        };\n        h(k, i, l);\n        return l;\n    };\n    e.exports = j;\n});\n__d(\"ReactNativeComponent\", [\"CSSPropertyOperations\",\"DOMProperty\",\"DOMPropertyOperations\",\"ReactComponent\",\"ReactEventEmitter\",\"ReactMultiChild\",\"ReactID\",\"escapeTextForBrowser\",\"flattenChildren\",\"invariant\",\"keyOf\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMProperty\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactComponent\"), k = b(\"ReactEventEmitter\"), l = b(\"ReactMultiChild\"), m = b(\"ReactID\"), n = b(\"escapeTextForBrowser\"), o = b(\"flattenChildren\"), p = b(\"invariant\"), q = b(\"keyOf\"), r = b(\"merge\"), s = b(\"mixInto\"), t = k.putListener, u = k.deleteListener, v = k.registrationNames, w = {\n        string: true,\n        number: true\n    }, x = q({\n        dangerouslySetInnerHTML: null\n    }), y = q({\n        style: null\n    });\n    function z(ba) {\n        if (!ba) {\n            return\n        };\n        p(((ba.children == null) || (ba.dangerouslySetInnerHTML == null)));\n        p(((ba.style == null) || (typeof ba.style === \"object\")));\n    };\n    function aa(ba, ca) {\n        this._tagOpen = (\"\\u003C\" + ba);\n        this._tagClose = (ca ? \"\" : ((\"\\u003C/\" + ba) + \"\\u003E\"));\n        this.tagName = ba.toUpperCase();\n    };\n    aa.Mixin = {\n        mountComponent: function(ba, ca) {\n            j.Mixin.mountComponent.call(this, ba, ca);\n            z(this.props);\n            return (((this._createOpenTagMarkup() + this._createContentMarkup(ca)) + this._tagClose));\n        },\n        _createOpenTagMarkup: function() {\n            var ba = this.props, ca = this._tagOpen;\n            for (var da in ba) {\n                if (!ba.hasOwnProperty(da)) {\n                    continue;\n                };\n                var ea = ba[da];\n                if ((ea == null)) {\n                    continue;\n                };\n                if (v[da]) {\n                    t(this._rootNodeID, da, ea);\n                }\n                 else {\n                    if ((da === y)) {\n                        if (ea) {\n                            ea = ba.style = r(ba.style);\n                        };\n                        ea = g.createMarkupForStyles(ea);\n                    }\n                ;\n                    var fa = i.createMarkupForProperty(da, ea);\n                    if (fa) {\n                        ca += (\" \" + fa);\n                    };\n                }\n            ;\n            };\n            var ga = n(this._rootNodeID);\n            return (((((ca + \" \") + m.ATTR_NAME) + \"=\\\"\") + ga) + \"\\\"\\u003E\");\n        },\n        _createContentMarkup: function(ba) {\n            var ca = this.props.dangerouslySetInnerHTML;\n            if ((ca != null)) {\n                if ((ca.__html != null)) {\n                    return ca.__html\n                };\n            }\n             else {\n                var da = (w[typeof this.props.children] ? this.props.children : null), ea = ((da != null) ? null : this.props.children);\n                if ((da != null)) {\n                    return n(da);\n                }\n                 else if ((ea != null)) {\n                    return this.mountMultiChild(o(ea), ba)\n                }\n            ;\n            }\n        ;\n            return \"\";\n        },\n        receiveProps: function(ba, ca) {\n            z(ba);\n            j.Mixin.receiveProps.call(this, ba, ca);\n        },\n        updateComponent: function(ba, ca) {\n            j.Mixin.updateComponent.call(this, ba, ca);\n            this._updateDOMProperties(ca);\n            this._updateDOMChildren(ca, ba);\n        },\n        _updateDOMProperties: function(ba) {\n            var ca = this.props, da, ea, fa;\n            for (da in ba) {\n                if ((ca.hasOwnProperty(da) || !ba.hasOwnProperty(da))) {\n                    continue;\n                };\n                if ((da === y)) {\n                    var ga = ba[da];\n                    for (ea in ga) {\n                        if (ga.hasOwnProperty(ea)) {\n                            fa = (fa || {\n                            });\n                            fa[ea] = \"\";\n                        }\n                    ;\n                    };\n                }\n                 else if ((da === x)) {\n                    j.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                }\n                 else if (v[da]) {\n                    u(this._rootNodeID, da);\n                }\n                 else j.DOMIDOperations.deletePropertyByID(this._rootNodeID, da);\n                \n                \n            ;\n            };\n            for (da in ca) {\n                var ha = ca[da], ia = ba[da];\n                if ((!ca.hasOwnProperty(da) || (ha === ia))) {\n                    continue;\n                };\n                if ((da === y)) {\n                    if (ha) {\n                        ha = ca.style = r(ha);\n                    };\n                    if (ia) {\n                        for (ea in ia) {\n                            if ((ia.hasOwnProperty(ea) && !ha.hasOwnProperty(ea))) {\n                                fa = (fa || {\n                                });\n                                fa[ea] = \"\";\n                            }\n                        ;\n                        };\n                        for (ea in ha) {\n                            if ((ha.hasOwnProperty(ea) && (ia[ea] !== ha[ea]))) {\n                                fa = (fa || {\n                                });\n                                fa[ea] = ha[ea];\n                            }\n                        ;\n                        };\n                    }\n                     else fa = ha;\n                ;\n                }\n                 else if ((da === x)) {\n                    var ja = (ia && ia.__html), ka = (ha && ha.__html);\n                    if ((ja !== ka)) {\n                        j.DOMIDOperations.updateInnerHTMLByID(this._rootNodeID, ha);\n                    };\n                }\n                 else if (v[da]) {\n                    t(this._rootNodeID, da, ha);\n                }\n                 else if ((h.isStandardName[da] || h.isCustomAttribute(da))) {\n                    j.DOMIDOperations.updatePropertyByID(this._rootNodeID, da, ha);\n                }\n                \n                \n            ;\n            };\n            if (fa) {\n                j.DOMIDOperations.updateStylesByID(this._rootNodeID, fa);\n            };\n        },\n        _updateDOMChildren: function(ba, ca) {\n            var da = this.props, ea = (w[typeof ba.children] ? ba.children : null), fa = (w[typeof da.children] ? da.children : null), ga = ((ea != null) ? null : ba.children), ha = ((fa != null) ? null : da.children);\n            if ((fa != null)) {\n                var ia = ((ga != null) && (ha == null));\n                if (ia) {\n                    this.updateMultiChild(null, ca);\n                };\n                if ((ea !== fa)) {\n                    j.DOMIDOperations.updateTextContentByID(this._rootNodeID, (\"\" + fa));\n                };\n            }\n             else {\n                var ja = ((ea != null) && (fa == null));\n                if (ja) {\n                    j.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                };\n                this.updateMultiChild(o(da.children), ca);\n            }\n        ;\n        },\n        unmountComponent: function() {\n            k.deleteAllListeners(this._rootNodeID);\n            j.Mixin.unmountComponent.call(this);\n            this.unmountMultiChild();\n        }\n    };\n    s(aa, j.Mixin);\n    s(aa, aa.Mixin);\n    s(aa, l.Mixin);\n    e.exports = aa;\n});\n__d(\"objMapKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (!h) {\n            return null\n        };\n        var k = 0, l = {\n        };\n        for (var m in h) {\n            if (h.hasOwnProperty(m)) {\n                l[m] = i.call(j, m, h[m], k++);\n            };\n        };\n        return l;\n    };\n    e.exports = g;\n});\n__d(\"ReactDOM\", [\"ReactNativeComponent\",\"mergeInto\",\"objMapKeyVal\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactNativeComponent\"), h = b(\"mergeInto\"), i = b(\"objMapKeyVal\");\n    function j(m, n) {\n        var o = function() {\n        \n        };\n        o.prototype = new g(m, n);\n        o.prototype.constructor = o;\n        var p = function(q, r) {\n            var s = new o();\n            s.construct.apply(s, arguments);\n            return s;\n        };\n        p.componentConstructor = o;\n        return p;\n    };\n    var k = i({\n        a: false,\n        abbr: false,\n        address: false,\n        area: false,\n        article: false,\n        aside: false,\n        audio: false,\n        b: false,\n        base: false,\n        bdi: false,\n        bdo: false,\n        big: false,\n        blockquote: false,\n        body: false,\n        br: true,\n        button: false,\n        canvas: false,\n        caption: false,\n        cite: false,\n        code: false,\n        col: true,\n        colgroup: false,\n        data: false,\n        datalist: false,\n        dd: false,\n        del: false,\n        details: false,\n        dfn: false,\n        div: false,\n        dl: false,\n        dt: false,\n        em: false,\n        embed: true,\n        fieldset: false,\n        figcaption: false,\n        figure: false,\n        footer: false,\n        form: false,\n        h1: false,\n        h2: false,\n        h3: false,\n        h4: false,\n        h5: false,\n        h6: false,\n        head: false,\n        header: false,\n        hr: true,\n        html: false,\n        i: false,\n        iframe: false,\n        img: true,\n        input: true,\n        ins: false,\n        kbd: false,\n        keygen: true,\n        label: false,\n        legend: false,\n        li: false,\n        link: false,\n        main: false,\n        map: false,\n        mark: false,\n        menu: false,\n        menuitem: false,\n        meta: true,\n        meter: false,\n        nav: false,\n        noscript: false,\n        object: false,\n        ol: false,\n        optgroup: false,\n        option: false,\n        output: false,\n        p: false,\n        param: true,\n        pre: false,\n        progress: false,\n        q: false,\n        rp: false,\n        rt: false,\n        ruby: false,\n        s: false,\n        samp: false,\n        script: false,\n        section: false,\n        select: false,\n        small: false,\n        source: false,\n        span: false,\n        strong: false,\n        style: false,\n        sub: false,\n        summary: false,\n        sup: false,\n        table: false,\n        tbody: false,\n        td: false,\n        textarea: false,\n        tfoot: false,\n        th: false,\n        thead: false,\n        time: false,\n        title: false,\n        tr: false,\n        track: true,\n        u: false,\n        ul: false,\n        \"var\": false,\n        video: false,\n        wbr: false,\n        circle: false,\n        g: false,\n        line: false,\n        path: false,\n        polyline: false,\n        rect: false,\n        svg: false,\n        text: false\n    }, j), l = {\n        injectComponentClasses: function(m) {\n            h(k, m);\n        }\n    };\n    k.injection = l;\n    e.exports = k;\n});\n__d(\"ReactPropTypes\", [\"createObjectFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = b(\"invariant\"), i = {\n        array: k(\"array\"),\n        bool: k(\"boolean\"),\n        func: k(\"function\"),\n        number: k(\"number\"),\n        object: k(\"object\"),\n        string: k(\"string\"),\n        oneOf: l,\n        instanceOf: m\n    }, j = \"\\u003C\\u003Canonymous\\u003E\\u003E\";\n    function k(o) {\n        function p(q, r, s) {\n            var t = typeof q;\n            if (((t === \"object\") && Array.isArray(q))) {\n                t = \"array\";\n            };\n            h((t === o));\n        };\n        return n(p);\n    };\n    function l(o) {\n        var p = g(o);\n        function q(r, s, t) {\n            h(p[r]);\n        };\n        return n(q);\n    };\n    function m(o) {\n        function p(q, r, s) {\n            h((q instanceof o));\n        };\n        return n(p);\n    };\n    function n(o) {\n        function p(q) {\n            function r(s, t, u) {\n                var v = s[t];\n                if ((v != null)) {\n                    o(v, t, (u || j));\n                }\n                 else h(!q);\n            ;\n            };\n            if (!q) {\n                r.isRequired = p(true);\n            };\n            return r;\n        };\n        return p(false);\n    };\n    e.exports = i;\n});\n__d(\"ReactServerRendering\", [\"ReactReconcileTransaction\",\"ReactInstanceHandles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactReconcileTransaction\"), h = b(\"ReactInstanceHandles\");\n    function i(j, k) {\n        var l = h.createReactRootID(), m = g.getPooled();\n        m.reinitializeTransaction();\n        try {\n            m.perform(function() {\n                k(j.mountComponent(l, m));\n            }, null);\n        } finally {\n            g.release(m);\n        };\n    };\n    e.exports = {\n        renderComponentToString: i\n    };\n});\n__d(\"ReactDOMForm\", [\"ReactCompositeComponent\",\"ReactDOM\",\"ReactEventEmitter\",\"EventConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"ReactEventEmitter\"), j = b(\"EventConstants\"), k = h.form, l = g.createClass({\n        render: function() {\n            return this.transferPropsTo(k(null, this.props.children));\n        },\n        componentDidMount: function(m) {\n            i.trapBubbledEvent(j.topLevelTypes.topSubmit, \"submit\", m);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMInput\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"merge\"), k = i.input, l = h.createClass({\n        getInitialState: function() {\n            return {\n                checked: (this.props.defaultChecked || false),\n                value: (this.props.defaultValue || \"\")\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getChecked: function() {\n            return ((this.props.checked != null) ? this.props.checked : this.state.checked);\n        },\n        getValue: function() {\n            return ((this.props.value != null) ? (\"\" + this.props.value) : this.state.value);\n        },\n        render: function() {\n            var m = j(this.props);\n            m.checked = this.getChecked();\n            m.value = this.getValue();\n            m.onChange = this.handleChange;\n            return k(m, this.props.children);\n        },\n        componentDidUpdate: function(m, n, o) {\n            if ((this.props.checked != null)) {\n                g.setValueForProperty(o, \"checked\", (this.props.checked || false));\n            };\n            if ((this.props.value != null)) {\n                g.setValueForProperty(o, \"value\", ((\"\" + this.props.value) || \"\"));\n            };\n        },\n        handleChange: function(event) {\n            var m;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                m = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            this.setState({\n                checked: event.target.checked,\n                value: event.target.value\n            });\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMOption\", [\"ReactCompositeComponent\",\"ReactDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = h.option, j = g.createClass({\n        componentWillMount: function() {\n            (this.props.selected != null);\n        },\n        render: function() {\n            return i(this.props, this.props.children);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ReactDOMSelect\", [\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"invariant\"), j = b(\"merge\"), k = h.select;\n    function l(o, p, q) {\n        if ((o[p] == null)) {\n            return\n        };\n        if (o.multiple) {\n            i(Array.isArray(o[p]));\n        }\n         else i(!Array.isArray(o[p]));\n    ;\n    };\n    function m() {\n        if ((this.props.value == null)) {\n            return\n        };\n        var o = this.getDOMNode().options, p = (\"\" + this.props.value);\n        for (var q = 0, r = o.length; (q < r); q++) {\n            var s = (this.props.multiple ? (p.indexOf(o[q].value) >= 0) : s = (o[q].value === p));\n            if ((s !== o[q].selected)) {\n                o[q].selected = s;\n            };\n        };\n    };\n    var n = g.createClass({\n        propTypes: {\n            defaultValue: l,\n            value: l\n        },\n        getInitialState: function() {\n            return {\n                value: (this.props.defaultValue || ((this.props.multiple ? [] : \"\")))\n            };\n        },\n        componentWillReceiveProps: function(o) {\n            if ((!this.props.multiple && o.multiple)) {\n                this.setState({\n                    value: [this.state.value,]\n                });\n            }\n             else if ((this.props.multiple && !o.multiple)) {\n                this.setState({\n                    value: this.state.value[0]\n                });\n            }\n        ;\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        render: function() {\n            var o = j(this.props);\n            o.onChange = this.handleChange;\n            o.value = null;\n            return k(o, this.props.children);\n        },\n        componentDidMount: m,\n        componentDidUpdate: m,\n        handleChange: function(event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            var p;\n            if (this.props.multiple) {\n                p = [];\n                var q = event.target.options;\n                for (var r = 0, s = q.length; (r < s); r++) {\n                    if (q[r].selected) {\n                        p.push(q[r].value);\n                    };\n                };\n            }\n             else p = event.target.value;\n        ;\n            this.setState({\n                value: p\n            });\n            return o;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ReactDOMTextarea\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"invariant\"), k = b(\"merge\"), l = i.textarea, m = {\n        string: true,\n        number: true\n    }, n = h.createClass({\n        getInitialState: function() {\n            var o = this.props.defaultValue, p = this.props.children;\n            if ((p != null)) {\n                j((o == null));\n                if (Array.isArray(p)) {\n                    j((p.length <= 1));\n                    p = p[0];\n                }\n            ;\n                j(m[typeof p]);\n                o = (\"\" + p);\n            }\n        ;\n            o = (o || \"\");\n            return {\n                initialValue: ((this.props.value != null) ? this.props.value : o),\n                value: o\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getValue: function() {\n            return ((this.props.value != null) ? this.props.value : this.state.value);\n        },\n        render: function() {\n            var o = k(this.props);\n            j((o.dangerouslySetInnerHTML == null));\n            o.value = this.getValue();\n            o.onChange = this.handleChange;\n            return l(o, this.state.initialValue);\n        },\n        componentDidUpdate: function(o, p, q) {\n            if ((this.props.value != null)) {\n                g.setValueForProperty(q, \"value\", (this.props.value || \"\"));\n            };\n        },\n        handleChange: function(event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(event);\n                this._isChanging = false;\n            }\n        ;\n            this.setState({\n                value: event.target.value\n            });\n            return o;\n        }\n    });\n    e.exports = n;\n});\n__d(\"DefaultDOMPropertyConfig\", [\"DOMProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = g.injection.MUST_USE_ATTRIBUTE, i = g.injection.MUST_USE_PROPERTY, j = g.injection.HAS_BOOLEAN_VALUE, k = g.injection.HAS_SIDE_EFFECTS, l = {\n        isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n        Properties: {\n            accessKey: null,\n            accept: null,\n            action: null,\n            ajaxify: h,\n            allowFullScreen: (h | j),\n            allowTransparency: h,\n            alt: null,\n            autoComplete: null,\n            autoFocus: j,\n            autoPlay: j,\n            cellPadding: null,\n            cellSpacing: null,\n            checked: (i | j),\n            className: i,\n            colSpan: null,\n            contentEditable: null,\n            contextMenu: h,\n            controls: (i | j),\n            data: null,\n            dateTime: h,\n            dir: null,\n            disabled: (i | j),\n            draggable: null,\n            encType: null,\n            frameBorder: h,\n            height: h,\n            hidden: (h | j),\n            href: null,\n            htmlFor: null,\n            icon: null,\n            id: i,\n            label: null,\n            lang: null,\n            list: null,\n            max: null,\n            maxLength: h,\n            method: null,\n            min: null,\n            multiple: (i | j),\n            name: null,\n            pattern: null,\n            poster: null,\n            preload: null,\n            placeholder: null,\n            radioGroup: null,\n            rel: null,\n            readOnly: (i | j),\n            required: j,\n            role: h,\n            scrollLeft: i,\n            scrollTop: i,\n            selected: (i | j),\n            size: null,\n            spellCheck: null,\n            src: null,\n            step: null,\n            style: null,\n            tabIndex: null,\n            target: null,\n            title: null,\n            type: null,\n            value: (i | k),\n            width: h,\n            wmode: h,\n            cx: i,\n            cy: i,\n            d: i,\n            fill: i,\n            fx: i,\n            fy: i,\n            points: i,\n            r: i,\n            stroke: i,\n            strokeLinecap: i,\n            strokeWidth: i,\n            transform: i,\n            x: i,\n            x1: i,\n            x2: i,\n            version: i,\n            viewBox: i,\n            y: i,\n            y1: i,\n            y2: i,\n            spreadMethod: i,\n            offset: i,\n            stopColor: i,\n            stopOpacity: i,\n            gradientUnits: i,\n            gradientTransform: i\n        },\n        DOMAttributeNames: {\n            className: \"class\",\n            htmlFor: \"for\",\n            strokeLinecap: \"stroke-linecap\",\n            strokeWidth: \"stroke-width\",\n            stopColor: \"stop-color\",\n            stopOpacity: \"stop-opacity\"\n        },\n        DOMPropertyNames: {\n            autoComplete: \"autocomplete\",\n            autoFocus: \"autofocus\",\n            autoPlay: \"autoplay\",\n            encType: \"enctype\",\n            radioGroup: \"radiogroup\",\n            spellCheck: \"spellcheck\"\n        },\n        DOMMutationMethods: {\n            className: function(m, n) {\n                m.className = (n || \"\");\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"DefaultEventPluginOrder\", [\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyOf\"), h = [g({\n        ResponderEventPlugin: null\n    }),g({\n        SimpleEventPlugin: null\n    }),g({\n        TapEventPlugin: null\n    }),g({\n        EnterLeaveEventPlugin: null\n    }),g({\n        ChangeEventPlugin: null\n    }),g({\n        AnalyticsEventPlugin: null\n    }),];\n    e.exports = h;\n});\n__d(\"SyntheticEvent\", [\"PooledClass\",\"emptyFunction\",\"getEventTarget\",\"merge\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"emptyFunction\"), i = b(\"getEventTarget\"), j = b(\"merge\"), k = b(\"mergeInto\"), l = {\n        type: null,\n        target: i,\n        currentTarget: null,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(event) {\n            return (event.timeStamp || Date.now());\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    function m(n, o, p) {\n        this.dispatchConfig = n;\n        this.dispatchMarker = o;\n        this.nativeEvent = p;\n        var q = this.constructor.Interface;\n        for (var r in q) {\n            var s = q[r];\n            if (s) {\n                this[r] = s(p);\n            }\n             else this[r] = p[r];\n        ;\n        };\n        if ((p.defaultPrevented || (p.returnValue === false))) {\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        }\n         else this.isDefaultPrevented = h.thatReturnsFalse;\n    ;\n        this.isPropagationStopped = h.thatReturnsFalse;\n    };\n    k(m.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = true;\n            var event = this.nativeEvent;\n            (event.preventDefault ? event.preventDefault() : event.returnValue = false);\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        },\n        stopPropagation: function() {\n            var event = this.nativeEvent;\n            (event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true);\n            this.isPropagationStopped = h.thatReturnsTrue;\n        },\n        persist: function() {\n            this.isPersistent = h.thatReturnsTrue;\n        },\n        isPersistent: h.thatReturnsFalse,\n        destructor: function() {\n            var n = this.constructor.Interface;\n            for (var o in n) {\n                this[o] = null;;\n            };\n            this.dispatchConfig = null;\n            this.dispatchMarker = null;\n            this.nativeEvent = null;\n        }\n    });\n    m.Interface = l;\n    m.augmentClass = function(n, o) {\n        var p = this, q = Object.create(p.prototype);\n        k(q, n.prototype);\n        n.prototype = q;\n        n.prototype.constructor = n;\n        n.Interface = j(p.Interface, o);\n        n.augmentClass = p.augmentClass;\n        g.addPoolingTo(n, g.threeArgumentPooler);\n    };\n    g.addPoolingTo(m, g.threeArgumentPooler);\n    e.exports = m;\n});\n__d(\"SyntheticUIEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        view: null,\n        detail: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMouseEvent\", [\"SyntheticUIEvent\",\"ViewportMetrics\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = b(\"ViewportMetrics\"), i = {\n        screenX: null,\n        screenY: null,\n        clientX: null,\n        clientY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        button: function(event) {\n            var k = event.button;\n            if ((\"which\" in event)) {\n                return k\n            };\n            return ((k === 2) ? 2 : ((k === 4) ? 1 : 0));\n        },\n        buttons: null,\n        relatedTarget: function(event) {\n            return (event.relatedTarget || (((event.fromElement === event.srcElement) ? event.toElement : event.fromElement)));\n        },\n        pageX: function(event) {\n            return ((\"pageX\" in event) ? event.pageX : (event.clientX + h.currentScrollLeft));\n        },\n        pageY: function(event) {\n            return ((\"pageY\" in event) ? event.pageY : (event.clientY + h.currentScrollTop));\n        }\n    };\n    function j(k, l, m) {\n        g.call(this, k, l, m);\n    };\n    g.augmentClass(j, i);\n    e.exports = j;\n});\n__d(\"EnterLeaveEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"ExecutionEnvironment\",\"ReactInstanceHandles\",\"SyntheticMouseEvent\",\"ReactID\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"ExecutionEnvironment\"), j = b(\"ReactInstanceHandles\"), k = b(\"SyntheticMouseEvent\"), l = b(\"ReactID\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = j.getFirstReactDOM, p = {\n        mouseEnter: {\n            registrationName: m({\n                onMouseEnter: null\n            })\n        },\n        mouseLeave: {\n            registrationName: m({\n                onMouseLeave: null\n            })\n        }\n    }, q = {\n        eventTypes: p,\n        extractEvents: function(r, s, t, u) {\n            if (((r === n.topMouseOver) && ((u.relatedTarget || u.fromElement)))) {\n                return null\n            };\n            if (((r !== n.topMouseOut) && (r !== n.topMouseOver))) {\n                return null\n            };\n            var v, w;\n            if ((r === n.topMouseOut)) {\n                v = s;\n                w = (o((u.relatedTarget || u.toElement)) || i.global);\n            }\n             else {\n                v = i.global;\n                w = s;\n            }\n        ;\n            if ((v === w)) {\n                return null\n            };\n            var x = (v ? l.getID(v) : \"\"), y = (w ? l.getID(w) : \"\"), z = k.getPooled(p.mouseLeave, x, u), aa = k.getPooled(p.mouseEnter, y, u);\n            h.accumulateEnterLeaveDispatches(z, aa, x, y);\n            return [z,aa,];\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChangeEventPlugin\", [\"EventConstants\",\"EventPluginHub\",\"EventPropagators\",\"ExecutionEnvironment\",\"SyntheticEvent\",\"isEventSupported\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPluginHub\"), i = b(\"EventPropagators\"), j = b(\"ExecutionEnvironment\"), k = b(\"SyntheticEvent\"), l = b(\"isEventSupported\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: m({\n                    onChange: null\n                }),\n                captured: m({\n                    onChangeCapture: null\n                })\n            }\n        }\n    }, p = null, q = null, r = null, s = null;\n    function t(na) {\n        return (((na.nodeName === \"SELECT\") || (((na.nodeName === \"INPUT\") && (na.type === \"file\")))));\n    };\n    var u = false;\n    if (j.canUseDOM) {\n        u = (l(\"change\") && ((!((\"documentMode\" in document)) || (document.documentMode > 8))));\n    };\n    function v(na) {\n        var event = k.getPooled(o.change, q, na);\n        i.accumulateTwoPhaseDispatches(event);\n        h.enqueueEvents(event);\n        h.processEventQueue();\n    };\n    function w(na, oa) {\n        p = na;\n        q = oa;\n        p.attachEvent(\"onchange\", v);\n    };\n    function x() {\n        if (!p) {\n            return\n        };\n        p.detachEvent(\"onchange\", v);\n        p = null;\n        q = null;\n    };\n    function y(na, oa, pa) {\n        if ((na === n.topChange)) {\n            return pa\n        };\n    };\n    function z(na, oa, pa) {\n        if ((na === n.topFocus)) {\n            x();\n            w(oa, pa);\n        }\n         else if ((na === n.topBlur)) {\n            x();\n        }\n    ;\n    };\n    var aa = false;\n    if (j.canUseDOM) {\n        aa = (l(\"input\") && ((!((\"documentMode\" in document)) || (document.documentMode > 9))));\n    };\n    var ba = {\n        color: true,\n        date: true,\n        datetime: true,\n        \"datetime-local\": true,\n        email: true,\n        month: true,\n        number: true,\n        password: true,\n        range: true,\n        search: true,\n        tel: true,\n        text: true,\n        time: true,\n        url: true,\n        week: true\n    };\n    function ca(na) {\n        return (((((na.nodeName === \"INPUT\") && ba[na.type])) || (na.nodeName === \"TEXTAREA\")));\n    };\n    var da = {\n        get: function() {\n            return s.get.call(this);\n        },\n        set: function(na) {\n            r = (\"\" + na);\n            s.set.call(this, na);\n        }\n    };\n    function ea(na, oa) {\n        p = na;\n        q = oa;\n        r = na.value;\n        s = Object.getOwnPropertyDescriptor(na.constructor.prototype, \"value\");\n        Object.defineProperty(p, \"value\", da);\n        p.attachEvent(\"onpropertychange\", ga);\n    };\n    function fa() {\n        if (!p) {\n            return\n        };\n        delete p.value;\n        p.detachEvent(\"onpropertychange\", ga);\n        p = null;\n        q = null;\n        r = null;\n        s = null;\n    };\n    function ga(na) {\n        if ((na.propertyName !== \"value\")) {\n            return\n        };\n        var oa = na.srcElement.value;\n        if ((oa === r)) {\n            return\n        };\n        r = oa;\n        v(na);\n    };\n    function ha(na, oa, pa) {\n        if ((na === n.topInput)) {\n            return pa\n        };\n    };\n    function ia(na, oa, pa) {\n        if ((na === n.topFocus)) {\n            fa();\n            ea(oa, pa);\n        }\n         else if ((na === n.topBlur)) {\n            fa();\n        }\n    ;\n    };\n    function ja(na, oa, pa) {\n        if ((((na === n.topSelectionChange) || (na === n.topKeyUp)) || (na === n.topKeyDown))) {\n            if ((p && (p.value !== r))) {\n                r = p.value;\n                return q;\n            }\n        \n        };\n    };\n    function ka(na) {\n        return (((na.nodeName === \"INPUT\") && (((na.type === \"checkbox\") || (na.type === \"radio\")))));\n    };\n    function la(na, oa, pa) {\n        if ((na === n.topClick)) {\n            return pa\n        };\n    };\n    var ma = {\n        eventTypes: o,\n        extractEvents: function(na, oa, pa, qa) {\n            var ra, sa;\n            if (t(oa)) {\n                if (u) {\n                    ra = y;\n                }\n                 else sa = z;\n            ;\n            }\n             else if (ca(oa)) {\n                if (aa) {\n                    ra = ha;\n                }\n                 else {\n                    ra = ja;\n                    sa = ia;\n                }\n            ;\n            }\n             else if (ka(oa)) {\n                ra = la;\n            }\n            \n        ;\n            if (ra) {\n                var ta = ra(na, oa, pa);\n                if (ta) {\n                    var event = k.getPooled(o.change, ta, qa);\n                    i.accumulateTwoPhaseDispatches(event);\n                    return event;\n                }\n            ;\n            }\n        ;\n            if (sa) {\n                sa(na, oa, pa);\n            };\n        }\n    };\n    e.exports = ma;\n});\n__d(\"SyntheticFocusEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        relatedTarget: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticKeyboardEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        char: null,\n        key: null,\n        location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        charCode: null,\n        keyCode: null,\n        which: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMutationEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        relatedNode: null,\n        prevValue: null,\n        newValue: null,\n        attrName: null,\n        attrChange: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticTouchEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticWheelEvent\", [\"SyntheticMouseEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticMouseEvent\"), h = {\n        deltaX: function(event) {\n            return (((\"deltaX\" in event) ? event.deltaX : ((\"wheelDeltaX\" in event) ? -event.wheelDeltaX : 0)));\n        },\n        deltaY: function(event) {\n            return (((\"deltaY\" in event) ? -event.deltaY : ((\"wheelDeltaY\" in event) ? event.wheelDeltaY : ((\"wheelDelta\" in event) ? event.wheelData : 0))));\n        },\n        deltaZ: null,\n        deltaMode: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SimpleEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"SyntheticEvent\",\"SyntheticFocusEvent\",\"SyntheticKeyboardEvent\",\"SyntheticMouseEvent\",\"SyntheticMutationEvent\",\"SyntheticTouchEvent\",\"SyntheticUIEvent\",\"SyntheticWheelEvent\",\"invariant\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"SyntheticEvent\"), j = b(\"SyntheticFocusEvent\"), k = b(\"SyntheticKeyboardEvent\"), l = b(\"SyntheticMouseEvent\"), m = b(\"SyntheticMutationEvent\"), n = b(\"SyntheticTouchEvent\"), o = b(\"SyntheticUIEvent\"), p = b(\"SyntheticWheelEvent\"), q = b(\"invariant\"), r = b(\"keyOf\"), s = g.topLevelTypes, t = {\n        blur: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onBlur: true\n                }),\n                captured: r({\n                    onBlurCapture: true\n                })\n            }\n        },\n        click: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onClick: true\n                }),\n                captured: r({\n                    onClickCapture: true\n                })\n            }\n        },\n        doubleClick: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDoubleClick: true\n                }),\n                captured: r({\n                    onDoubleClickCapture: true\n                })\n            }\n        },\n        drag: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrag: true\n                }),\n                captured: r({\n                    onDragCapture: true\n                })\n            }\n        },\n        dragEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnd: true\n                }),\n                captured: r({\n                    onDragEndCapture: true\n                })\n            }\n        },\n        dragEnter: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnter: true\n                }),\n                captured: r({\n                    onDragEnterCapture: true\n                })\n            }\n        },\n        dragExit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragExit: true\n                }),\n                captured: r({\n                    onDragExitCapture: true\n                })\n            }\n        },\n        dragLeave: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragLeave: true\n                }),\n                captured: r({\n                    onDragLeaveCapture: true\n                })\n            }\n        },\n        dragOver: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragOver: true\n                }),\n                captured: r({\n                    onDragOverCapture: true\n                })\n            }\n        },\n        dragStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragStart: true\n                }),\n                captured: r({\n                    onDragStartCapture: true\n                })\n            }\n        },\n        drop: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrop: true\n                }),\n                captured: r({\n                    onDropCapture: true\n                })\n            }\n        },\n        DOMCharacterDataModified: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDOMCharacterDataModified: true\n                }),\n                captured: r({\n                    onDOMCharacterDataModifiedCapture: true\n                })\n            }\n        },\n        focus: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onFocus: true\n                }),\n                captured: r({\n                    onFocusCapture: true\n                })\n            }\n        },\n        input: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onInput: true\n                }),\n                captured: r({\n                    onInputCapture: true\n                })\n            }\n        },\n        keyDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyDown: true\n                }),\n                captured: r({\n                    onKeyDownCapture: true\n                })\n            }\n        },\n        keyPress: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyPress: true\n                }),\n                captured: r({\n                    onKeyPressCapture: true\n                })\n            }\n        },\n        keyUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyUp: true\n                }),\n                captured: r({\n                    onKeyUpCapture: true\n                })\n            }\n        },\n        mouseDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseDown: true\n                }),\n                captured: r({\n                    onMouseDownCapture: true\n                })\n            }\n        },\n        mouseMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseMove: true\n                }),\n                captured: r({\n                    onMouseMoveCapture: true\n                })\n            }\n        },\n        mouseUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseUp: true\n                }),\n                captured: r({\n                    onMouseUpCapture: true\n                })\n            }\n        },\n        scroll: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onScroll: true\n                }),\n                captured: r({\n                    onScrollCapture: true\n                })\n            }\n        },\n        submit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onSubmit: true\n                }),\n                captured: r({\n                    onSubmitCapture: true\n                })\n            }\n        },\n        touchCancel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchCancel: true\n                }),\n                captured: r({\n                    onTouchCancelCapture: true\n                })\n            }\n        },\n        touchEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchEnd: true\n                }),\n                captured: r({\n                    onTouchEndCapture: true\n                })\n            }\n        },\n        touchMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchMove: true\n                }),\n                captured: r({\n                    onTouchMoveCapture: true\n                })\n            }\n        },\n        touchStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchStart: true\n                }),\n                captured: r({\n                    onTouchStartCapture: true\n                })\n            }\n        },\n        wheel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onWheel: true\n                }),\n                captured: r({\n                    onWheelCapture: true\n                })\n            }\n        }\n    }, u = {\n        topBlur: t.blur,\n        topClick: t.click,\n        topDoubleClick: t.doubleClick,\n        topDOMCharacterDataModified: t.DOMCharacterDataModified,\n        topDrag: t.drag,\n        topDragEnd: t.dragEnd,\n        topDragEnter: t.dragEnter,\n        topDragExit: t.dragExit,\n        topDragLeave: t.dragLeave,\n        topDragOver: t.dragOver,\n        topDragStart: t.dragStart,\n        topDrop: t.drop,\n        topFocus: t.focus,\n        topInput: t.input,\n        topKeyDown: t.keyDown,\n        topKeyPress: t.keyPress,\n        topKeyUp: t.keyUp,\n        topMouseDown: t.mouseDown,\n        topMouseMove: t.mouseMove,\n        topMouseUp: t.mouseUp,\n        topScroll: t.scroll,\n        topSubmit: t.submit,\n        topTouchCancel: t.touchCancel,\n        topTouchEnd: t.touchEnd,\n        topTouchMove: t.touchMove,\n        topTouchStart: t.touchStart,\n        topWheel: t.wheel\n    }, v = {\n        eventTypes: t,\n        executeDispatch: function(event, w, x) {\n            var y = w(event, x);\n            if ((y === false)) {\n                event.stopPropagation();\n                event.preventDefault();\n            }\n        ;\n        },\n        extractEvents: function(w, x, y, z) {\n            var aa = u[w];\n            if (!aa) {\n                return null\n            };\n            var ba;\n            switch (w) {\n              case s.topInput:\n            \n              case s.topSubmit:\n                ba = i;\n                break;\n              case s.topKeyDown:\n            \n              case s.topKeyPress:\n            \n              case s.topKeyUp:\n                ba = k;\n                break;\n              case s.topBlur:\n            \n              case s.topFocus:\n                ba = j;\n                break;\n              case s.topClick:\n            \n              case s.topDoubleClick:\n            \n              case s.topDrag:\n            \n              case s.topDragEnd:\n            \n              case s.topDragEnter:\n            \n              case s.topDragExit:\n            \n              case s.topDragLeave:\n            \n              case s.topDragOver:\n            \n              case s.topDragStart:\n            \n              case s.topDrop:\n            \n              case s.topMouseDown:\n            \n              case s.topMouseMove:\n            \n              case s.topMouseUp:\n                ba = l;\n                break;\n              case s.topDOMCharacterDataModified:\n                ba = m;\n                break;\n              case s.topTouchCancel:\n            \n              case s.topTouchEnd:\n            \n              case s.topTouchMove:\n            \n              case s.topTouchStart:\n                ba = n;\n                break;\n              case s.topScroll:\n                ba = o;\n                break;\n              case s.topWheel:\n                ba = p;\n                break;\n            };\n            q(ba);\n            var event = ba.getPooled(aa, y, z);\n            h.accumulateTwoPhaseDispatches(event);\n            return event;\n        }\n    };\n    e.exports = v;\n});\n__d(\"ReactDefaultInjection\", [\"ReactDOM\",\"ReactDOMForm\",\"ReactDOMInput\",\"ReactDOMOption\",\"ReactDOMSelect\",\"ReactDOMTextarea\",\"DefaultDOMPropertyConfig\",\"DOMProperty\",\"DefaultEventPluginOrder\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"EventPluginHub\",\"ReactInstanceHandles\",\"SimpleEventPlugin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactDOM\"), h = b(\"ReactDOMForm\"), i = b(\"ReactDOMInput\"), j = b(\"ReactDOMOption\"), k = b(\"ReactDOMSelect\"), l = b(\"ReactDOMTextarea\"), m = b(\"DefaultDOMPropertyConfig\"), n = b(\"DOMProperty\"), o = b(\"DefaultEventPluginOrder\"), p = b(\"EnterLeaveEventPlugin\"), q = b(\"ChangeEventPlugin\"), r = b(\"EventPluginHub\"), s = b(\"ReactInstanceHandles\"), t = b(\"SimpleEventPlugin\");\n    function u() {\n        r.injection.injectEventPluginOrder(o);\n        r.injection.injectInstanceHandle(s);\n        r.injection.injectEventPluginsByName({\n            SimpleEventPlugin: t,\n            EnterLeaveEventPlugin: p,\n            ChangeEventPlugin: q\n        });\n        g.injection.injectComponentClasses({\n            form: h,\n            input: i,\n            option: j,\n            select: k,\n            textarea: l\n        });\n        n.injection.injectDOMPropertyConfig(m);\n    };\n    e.exports = {\n        inject: u\n    };\n});\n__d(\"React\", [\"ReactCompositeComponent\",\"ReactComponent\",\"ReactDOM\",\"ReactMount\",\"ReactPropTypes\",\"ReactServerRendering\",\"ReactDefaultInjection\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactComponent\"), i = b(\"ReactDOM\"), j = b(\"ReactMount\"), k = b(\"ReactPropTypes\"), l = b(\"ReactServerRendering\"), m = b(\"ReactDefaultInjection\");\n    m.inject();\n    var n = {\n        DOM: i,\n        PropTypes: k,\n        initializeTouchEvents: function(o) {\n            j.useTouchEvents = o;\n        },\n        autoBind: g.autoBind,\n        createClass: g.createClass,\n        constructAndRenderComponent: j.constructAndRenderComponent,\n        constructAndRenderComponentByID: j.constructAndRenderComponentByID,\n        renderComponent: j.renderComponent,\n        renderComponentToString: l.renderComponentToString,\n        unmountAndReleaseReactRootNode: j.unmountAndReleaseReactRootNode,\n        isValidComponent: h.isValidComponent\n    };\n    e.exports = n;\n});\n__d(\"CloseButton.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"CloseButton\",\n        render: function() {\n            var j = this.props, k = (j.size || \"medium\"), l = (j.appearance || \"normal\"), m = (k === \"small\"), n = (k === \"huge\"), o = (l === \"dark\"), p = (l === \"inverted\"), q = ((((((((\"uiCloseButton\") + ((m ? (\" \" + \"uiCloseButtonSmall\") : \"\"))) + ((n ? (\" \" + \"uiCloseButtonHuge\") : \"\"))) + (((m && o) ? (\" \" + \"uiCloseButtonSmallDark\") : \"\"))) + (((m && p) ? (\" \" + \"uiCloseButtonSmallInverted\") : \"\"))) + (((!m && o) ? (\" \" + \"uiCloseButtonDark\") : \"\"))) + (((!m && p) ? (\" \" + \"uiCloseButtonInverted\") : \"\"))));\n            return this.transferPropsTo(g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                \"aria-label\": j.tooltip,\n                \"data-hover\": (j.tooltip && \"tooltip\"),\n                \"data-tooltip-alignh\": (j.tooltip && \"center\"),\n                className: q\n            }));\n        }\n    });\n    e.exports = i;\n});\n__d(\"HovercardLink\", [\"Bootloader\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"URI\"), i = {\n        getBaseURI: function() {\n            return h(\"/ajax/hovercard/hovercard.php\");\n        },\n        constructEndpoint: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, k, null);\n        },\n        constructEndpointWithLocation: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, null, k);\n        },\n        constructEndpointWithGroupAndLocation: function(j, k, l) {\n            g.loadModules([\"Hovercard\",], function() {\n            \n            });\n            var m = new h(i.getBaseURI()).setQueryData({\n                id: j.id\n            }), n = {\n            };\n            if ((j.weakreference && k)) {\n                n.group_id = k;\n            };\n            if (l) {\n                n.hc_location = l;\n            };\n            m.addQueryData({\n                extragetparams: JSON.stringify(n)\n            });\n            return m;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Image.react\", [\"React\",\"invariant\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"invariant\"), i = b(\"joinClasses\"), j = g.createClass({\n        displayName: \"ReactImage\",\n        propTypes: {\n            src: function(k, l, m) {\n                var n = k[l];\n                h(((typeof n === \"string\") || (((typeof n === \"object\") && (((((n.sprited && n.spriteMapCssClass) && n.spriteCssClass)) || ((!n.sprited && n.uri))))))));\n            }\n        },\n        render: function() {\n            var k, l, m = this.props.src, n = \"img\";\n            l = true;\n            if ((typeof m === \"string\")) {\n                k = g.DOM.img({\n                    className: n,\n                    src: m\n                });\n            }\n             else if (m.sprited) {\n                n = i(n, m.spriteMapCssClass, m.spriteCssClass);\n                k = g.DOM.i({\n                    className: n,\n                    src: null\n                });\n                l = false;\n            }\n             else {\n                k = g.DOM.img({\n                    className: n,\n                    src: m.uri\n                });\n                if (((typeof this.props.width === \"undefined\") && (typeof this.props.height === \"undefined\"))) {\n                    k.props.width = m.width;\n                    k.props.height = m.height;\n                }\n            ;\n            }\n            \n        ;\n            if (this.props.alt) {\n                if (l) {\n                    k.props.alt = this.props.alt;\n                }\n                 else k.props.children = g.DOM.u(null, this.props.alt);\n            \n            };\n            return this.transferPropsTo(k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"LeftRight.react\", [\"React\",\"cx\",\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = b(\"keyMirror\"), j = b(\"throwIf\"), k = i({\n        left: true,\n        right: true,\n        both: true\n    });\n    function l(n) {\n        j(((!n.children || (n.children.length < 1)) || (n.children.length > 2)), \"LeftRight component must have one or two children.\");\n    };\n    var m = g.createClass({\n        displayName: \"LeftRight\",\n        render: function() {\n            l(this.props);\n            var n = (this.props.direction || k.both), o = ((n === k.both)), p = g.DOM.div({\n                key: \"left\",\n                className: (((o || (n === k.left)) ? \"lfloat\" : \"\"))\n            }, this.props.children[0]), q = (((this.props.children.length < 2)) ? null : g.DOM.div({\n                key: \"right\",\n                className: (((o || (n === k.right)) ? \"rfloat\" : \"\"))\n            }, this.props.children[1])), r = ((((n === k.right) && q)) ? [q,p,] : [p,q,]);\n            return this.transferPropsTo(g.DOM.div({\n                className: \"clearfix\"\n            }, r));\n        }\n    });\n    m.DIRECTION = k;\n    e.exports = m;\n});\n__d(\"ImageBlock.react\", [\"LeftRight.react\",\"React\",\"cx\",\"joinClasses\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"throwIf\");\n    function l(p) {\n        k(((!p.children || (p.children.length > 3)) || (p.children.length < 1)), \"ImageBlock requires two or three children.\");\n    };\n    function m(p) {\n        return ((((((\"img\") + ((\" \" + \"-cx-PRIVATE-uiImageBlock__image\"))) + (((p === \"small\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__smallimage\") : \"\"))) + (((p === \"medium\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__mediumimage\") : \"\"))) + (((p === \"large\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__largeimage\") : \"\"))));\n    };\n    function n(p, q, r) {\n        p.props.className = j(m(q), p.props.className, r);\n    };\n    var o = h.createClass({\n        displayName: \"ImageBlock\",\n        render: function() {\n            l(this.props);\n            var p = this.props.children[0], q = this.props.children[1], r = this.props.children[2], s = (this.props.spacing || \"small\");\n            n(p, s, this.props.imageClassName);\n            var t = j(this.props.contentClassName, (((\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\") + (((s === \"small\") ? (\" \" + \"-cx-PRIVATE-uiImageBlock__smallcontent\") : \"\")))));\n            if ((p.tagName == \"IMG\")) {\n                if ((p.props.alt === undefined)) {\n                    p.props.alt = \"\";\n                };\n            }\n             else if (((((((p.tagName == \"A\") || (p.tagName == \"LINK\"))) && (p.props.tabIndex === undefined)) && (p.props.title === undefined)) && (p.props[\"aria-label\"] === undefined))) {\n                p.props.tabIndex = \"-1\";\n                p.props[\"aria-hidden\"] = \"true\";\n            }\n            \n        ;\n            var u;\n            if (!r) {\n                u = h.DOM.div({\n                    className: t\n                }, q);\n            }\n             else u = g({\n                className: t,\n                direction: g.DIRECTION.right\n            }, q, r);\n        ;\n            return this.transferPropsTo(g({\n                direction: g.DIRECTION.left\n            }, p, u));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UntrustedLink\", [\"DOM\",\"Event\",\"URI\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m, n, o, p) {\n        this.dom = m;\n        this.url = m.href;\n        this.hash = n;\n        this.func_get_params = (p || function() {\n            return {\n            };\n        });\n        h.listen(this.dom, \"click\", this.onclick.bind(this));\n        h.listen(this.dom, \"mousedown\", this.onmousedown.bind(this));\n        h.listen(this.dom, \"mouseup\", this.onmouseup.bind(this));\n        h.listen(this.dom, \"mouseout\", this.onmouseout.bind(this));\n        this.onmousedown(h.$E(o));\n    };\n    l.bootstrap = function(m, n, o, p) {\n        if (m.__untrusted) {\n            return\n        };\n        m.__untrusted = true;\n        new l(m, n, o, p);\n    };\n    l.prototype.getRewrittenURI = function() {\n        var m = k({\n            u: this.url,\n            h: this.hash\n        }, this.func_get_params(this.dom)), n = new i(\"/l.php\");\n        return n.setQueryData(m).setSubdomain(\"www\").setProtocol(\"http\");\n    };\n    l.prototype.onclick = function() {\n        (function() {\n            this.setHref(this.url);\n        }).bind(this).defer(100);\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.onmousedown = function(m) {\n        if ((m.button == 2)) {\n            this.setHref(this.getRewrittenURI());\n        };\n    };\n    l.prototype.onmouseup = function() {\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.onmouseout = function() {\n        this.setHref(this.url);\n    };\n    l.prototype.setHref = function(m) {\n        if ((j.ie() < 9)) {\n            var n = g.create(\"span\");\n            g.appendContent(this.dom, n);\n            this.dom.href = m;\n            g.remove(n);\n        }\n         else this.dom.href = m;\n    ;\n    };\n    e.exports = l;\n});\n__d(\"Link.react\", [\"React\",\"UntrustedLink\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UntrustedLink\"), i = b(\"mergeInto\"), j = g.createClass({\n        displayName: \"Link\",\n        _installLinkshimOnMouseDown: function(event) {\n            var k = this.props.href;\n            if (k.shimhash) {\n                h.bootstrap(this.getDOMNode(), k.shimhash);\n            };\n            (this.props.onMouseDown && this.props.onMouseDown(event));\n        },\n        render: function() {\n            var k = this.props.href, l = g.DOM.a(null);\n            i(l.props, this.props);\n            if (k) {\n                l.props.href = k.url;\n                var m = !!k.shimhash;\n                if (m) {\n                    l.props.rel = (l.props.rel ? ((l.props.rel + \" nofollow\")) : \"nofollow\");\n                    l.props.onMouseDown = this._installLinkshimOnMouseDown;\n                }\n            ;\n            }\n             else l.props.href = \"#\";\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LoadingIndicator.react\", [\"React\",\"joinClasses\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"joinClasses\"), i = b(\"keyMirror\"), j = b(\"merge\"), k = i({\n        white: true,\n        blue: true,\n        black: true\n    }), l = i({\n        small: true,\n        medium: true,\n        large: true\n    }), m = {\n        white: {\n            large: \"/images/loaders/indicator_blue_large.gif\",\n            medium: \"/images/loaders/indicator_blue_medium.gif\",\n            small: \"/images/loaders/indicator_blue_small.gif\"\n        },\n        blue: {\n            large: \"/images/loaders/indicator_white_large.gif\",\n            small: \"/images/loaders/indicator_white_small.gif\"\n        },\n        black: {\n            large: \"/images/loaders/indicator_black.gif\"\n        }\n    }, n = g.createClass({\n        displayName: \"LoadingIndicator\",\n        render: function() {\n            var o = this.props.color, p = this.props.size;\n            if (!m[o]) {\n                return g.DOM.span(null)\n            };\n            if (!m[o][p]) {\n                return g.DOM.span(null)\n            };\n            var q = ((this.props.showonasync ? \"uiLoadingIndicatorAsync\" : \"\"));\n            if (this.props.className) {\n                q = h(this.props.className, q);\n            };\n            var r = m[o][p], s = g.DOM.img({\n                src: r,\n                className: q\n            });\n            s.props = j(this.props, s.props);\n            return s;\n        }\n    });\n    n.SIZES = l;\n    n.COLORS = k;\n    e.exports = n;\n});\n__d(\"ProfileBrowserLink\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = \"/ajax/browser/dialog/\", i = \"/browse/\", j = function(l, m, n) {\n        return new g((l + m)).setQueryData(n);\n    }, k = {\n        constructPageURI: function(l, m) {\n            return j(i, l, m);\n        },\n        constructDialogURI: function(l, m) {\n            return j(h, l, m);\n        }\n    };\n    e.exports = k;\n});\n__d(\"ProfileBrowserTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LIKES: \"likes\",\n        GROUP_MESSAGE_VIEWERS: \"group_message_viewers\",\n        MUTUAL_FRIENDS: \"mutual_friends\"\n    };\n    e.exports = g;\n});\n__d(\"TransformTextToDOMMixin\", [\"DOMQuery\",\"createArrayFrom\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"createArrayFrom\"), i = b(\"flattenArray\"), j = 3, k = {\n        transform: function(l, m) {\n            return i(l.map(function(n) {\n                if (!g.isElementNode(n)) {\n                    var o = n, p = [], q = (this.MAX_ITEMS || j);\n                    while (q--) {\n                        var r = (m ? [o,].concat(m) : [o,]), s = this.match.apply(this, r);\n                        if (!s) {\n                            break;\n                        };\n                        p.push(o.substring(0, s.startIndex));\n                        p.push(s.element);\n                        o = o.substring(s.endIndex);\n                    };\n                    (o && p.push(o));\n                    return p;\n                }\n            ;\n                return n;\n            }.bind(this)));\n        },\n        params: function() {\n            var l = this;\n            return {\n                __params: true,\n                obj: l,\n                params: h(arguments)\n            };\n        }\n    };\n    e.exports = k;\n});\n__d(\"SupportedEmoji\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        utf16Regex: /[\\u203C\\u2049\\u2100-\\u21FF\\u2300-\\u27FF\\u2900-\\u29FF\\u2B00-\\u2BFF\\u3000-\\u30FF\\u3200-\\u32FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDEFF]/,\n        emoji: {\n            127744: \"-cx-PRIVATE-fbEmoji__icon_1f300\",\n            127746: \"-cx-PRIVATE-fbEmoji__icon_1f302\",\n            127754: \"-cx-PRIVATE-fbEmoji__icon_1f30a\",\n            127769: \"-cx-PRIVATE-fbEmoji__icon_1f319\",\n            127775: \"-cx-PRIVATE-fbEmoji__icon_1f31f\",\n            127793: \"-cx-PRIVATE-fbEmoji__icon_1f331\",\n            127796: \"-cx-PRIVATE-fbEmoji__icon_1f334\",\n            127797: \"-cx-PRIVATE-fbEmoji__icon_1f335\",\n            127799: \"-cx-PRIVATE-fbEmoji__icon_1f337\",\n            127800: \"-cx-PRIVATE-fbEmoji__icon_1f338\",\n            127801: \"-cx-PRIVATE-fbEmoji__icon_1f339\",\n            127802: \"-cx-PRIVATE-fbEmoji__icon_1f33a\",\n            127803: \"-cx-PRIVATE-fbEmoji__icon_1f33b\",\n            127806: \"-cx-PRIVATE-fbEmoji__icon_1f33e\",\n            127808: \"-cx-PRIVATE-fbEmoji__icon_1f340\",\n            127809: \"-cx-PRIVATE-fbEmoji__icon_1f341\",\n            127810: \"-cx-PRIVATE-fbEmoji__icon_1f342\",\n            127811: \"-cx-PRIVATE-fbEmoji__icon_1f343\",\n            127818: \"-cx-PRIVATE-fbEmoji__icon_1f34a\",\n            127822: \"-cx-PRIVATE-fbEmoji__icon_1f34e\",\n            127827: \"-cx-PRIVATE-fbEmoji__icon_1f353\",\n            127828: \"-cx-PRIVATE-fbEmoji__icon_1f354\",\n            127864: \"-cx-PRIVATE-fbEmoji__icon_1f378\",\n            127866: \"-cx-PRIVATE-fbEmoji__icon_1f37a\",\n            127873: \"-cx-PRIVATE-fbEmoji__icon_1f381\",\n            127875: \"-cx-PRIVATE-fbEmoji__icon_1f383\",\n            127876: \"-cx-PRIVATE-fbEmoji__icon_1f384\",\n            127877: \"-cx-PRIVATE-fbEmoji__icon_1f385\",\n            127880: \"-cx-PRIVATE-fbEmoji__icon_1f388\",\n            127881: \"-cx-PRIVATE-fbEmoji__icon_1f389\",\n            127885: \"-cx-PRIVATE-fbEmoji__icon_1f38d\",\n            127886: \"-cx-PRIVATE-fbEmoji__icon_1f38e\",\n            127887: \"-cx-PRIVATE-fbEmoji__icon_1f38f\",\n            127888: \"-cx-PRIVATE-fbEmoji__icon_1f390\",\n            127891: \"-cx-PRIVATE-fbEmoji__icon_1f393\",\n            127925: \"-cx-PRIVATE-fbEmoji__icon_1f3b5\",\n            127926: \"-cx-PRIVATE-fbEmoji__icon_1f3b6\",\n            127932: \"-cx-PRIVATE-fbEmoji__icon_1f3bc\",\n            128013: \"-cx-PRIVATE-fbEmoji__icon_1f40d\",\n            128014: \"-cx-PRIVATE-fbEmoji__icon_1f40e\",\n            128017: \"-cx-PRIVATE-fbEmoji__icon_1f411\",\n            128018: \"-cx-PRIVATE-fbEmoji__icon_1f412\",\n            128020: \"-cx-PRIVATE-fbEmoji__icon_1f414\",\n            128023: \"-cx-PRIVATE-fbEmoji__icon_1f417\",\n            128024: \"-cx-PRIVATE-fbEmoji__icon_1f418\",\n            128025: \"-cx-PRIVATE-fbEmoji__icon_1f419\",\n            128026: \"-cx-PRIVATE-fbEmoji__icon_1f41a\",\n            128027: \"-cx-PRIVATE-fbEmoji__icon_1f41b\",\n            128031: \"-cx-PRIVATE-fbEmoji__icon_1f41f\",\n            128032: \"-cx-PRIVATE-fbEmoji__icon_1f420\",\n            128033: \"-cx-PRIVATE-fbEmoji__icon_1f421\",\n            128037: \"-cx-PRIVATE-fbEmoji__icon_1f425\",\n            128038: \"-cx-PRIVATE-fbEmoji__icon_1f426\",\n            128039: \"-cx-PRIVATE-fbEmoji__icon_1f427\",\n            128040: \"-cx-PRIVATE-fbEmoji__icon_1f428\",\n            128041: \"-cx-PRIVATE-fbEmoji__icon_1f429\",\n            128043: \"-cx-PRIVATE-fbEmoji__icon_1f42b\",\n            128044: \"-cx-PRIVATE-fbEmoji__icon_1f42c\",\n            128045: \"-cx-PRIVATE-fbEmoji__icon_1f42d\",\n            128046: \"-cx-PRIVATE-fbEmoji__icon_1f42e\",\n            128047: \"-cx-PRIVATE-fbEmoji__icon_1f42f\",\n            128048: \"-cx-PRIVATE-fbEmoji__icon_1f430\",\n            128049: \"-cx-PRIVATE-fbEmoji__icon_1f431\",\n            128051: \"-cx-PRIVATE-fbEmoji__icon_1f433\",\n            128052: \"-cx-PRIVATE-fbEmoji__icon_1f434\",\n            128053: \"-cx-PRIVATE-fbEmoji__icon_1f435\",\n            128054: \"-cx-PRIVATE-fbEmoji__icon_1f436\",\n            128055: \"-cx-PRIVATE-fbEmoji__icon_1f437\",\n            128056: \"-cx-PRIVATE-fbEmoji__icon_1f438\",\n            128057: \"-cx-PRIVATE-fbEmoji__icon_1f439\",\n            128058: \"-cx-PRIVATE-fbEmoji__icon_1f43a\",\n            128059: \"-cx-PRIVATE-fbEmoji__icon_1f43b\",\n            128062: \"-cx-PRIVATE-fbEmoji__icon_1f43e\",\n            128064: \"-cx-PRIVATE-fbEmoji__icon_1f440\",\n            128066: \"-cx-PRIVATE-fbEmoji__icon_1f442\",\n            128067: \"-cx-PRIVATE-fbEmoji__icon_1f443\",\n            128068: \"-cx-PRIVATE-fbEmoji__icon_1f444\",\n            128069: \"-cx-PRIVATE-fbEmoji__icon_1f445\",\n            128070: \"-cx-PRIVATE-fbEmoji__icon_1f446\",\n            128071: \"-cx-PRIVATE-fbEmoji__icon_1f447\",\n            128072: \"-cx-PRIVATE-fbEmoji__icon_1f448\",\n            128073: \"-cx-PRIVATE-fbEmoji__icon_1f449\",\n            128074: \"-cx-PRIVATE-fbEmoji__icon_1f44a\",\n            128075: \"-cx-PRIVATE-fbEmoji__icon_1f44b\",\n            128076: \"-cx-PRIVATE-fbEmoji__icon_1f44c\",\n            128077: \"-cx-PRIVATE-fbEmoji__icon_1f44d\",\n            128078: \"-cx-PRIVATE-fbEmoji__icon_1f44e\",\n            128079: \"-cx-PRIVATE-fbEmoji__icon_1f44f\",\n            128080: \"-cx-PRIVATE-fbEmoji__icon_1f450\",\n            128102: \"-cx-PRIVATE-fbEmoji__icon_1f466\",\n            128103: \"-cx-PRIVATE-fbEmoji__icon_1f467\",\n            128104: \"-cx-PRIVATE-fbEmoji__icon_1f468\",\n            128105: \"-cx-PRIVATE-fbEmoji__icon_1f469\",\n            128107: \"-cx-PRIVATE-fbEmoji__icon_1f46b\",\n            128110: \"-cx-PRIVATE-fbEmoji__icon_1f46e\",\n            128111: \"-cx-PRIVATE-fbEmoji__icon_1f46f\",\n            128113: \"-cx-PRIVATE-fbEmoji__icon_1f471\",\n            128114: \"-cx-PRIVATE-fbEmoji__icon_1f472\",\n            128115: \"-cx-PRIVATE-fbEmoji__icon_1f473\",\n            128116: \"-cx-PRIVATE-fbEmoji__icon_1f474\",\n            128117: \"-cx-PRIVATE-fbEmoji__icon_1f475\",\n            128118: \"-cx-PRIVATE-fbEmoji__icon_1f476\",\n            128119: \"-cx-PRIVATE-fbEmoji__icon_1f477\",\n            128120: \"-cx-PRIVATE-fbEmoji__icon_1f478\",\n            128123: \"-cx-PRIVATE-fbEmoji__icon_1f47b\",\n            128124: \"-cx-PRIVATE-fbEmoji__icon_1f47c\",\n            128125: \"-cx-PRIVATE-fbEmoji__icon_1f47d\",\n            128126: \"-cx-PRIVATE-fbEmoji__icon_1f47e\",\n            128127: \"-cx-PRIVATE-fbEmoji__icon_1f47f\",\n            128128: \"-cx-PRIVATE-fbEmoji__icon_1f480\",\n            128130: \"-cx-PRIVATE-fbEmoji__icon_1f482\",\n            128131: \"-cx-PRIVATE-fbEmoji__icon_1f483\",\n            128133: \"-cx-PRIVATE-fbEmoji__icon_1f485\",\n            128139: \"-cx-PRIVATE-fbEmoji__icon_1f48b\",\n            128143: \"-cx-PRIVATE-fbEmoji__icon_1f48f\",\n            128144: \"-cx-PRIVATE-fbEmoji__icon_1f490\",\n            128145: \"-cx-PRIVATE-fbEmoji__icon_1f491\",\n            128147: \"-cx-PRIVATE-fbEmoji__icon_1f493\",\n            128148: \"-cx-PRIVATE-fbEmoji__icon_1f494\",\n            128150: \"-cx-PRIVATE-fbEmoji__icon_1f496\",\n            128151: \"-cx-PRIVATE-fbEmoji__icon_1f497\",\n            128152: \"-cx-PRIVATE-fbEmoji__icon_1f498\",\n            128153: \"-cx-PRIVATE-fbEmoji__icon_1f499\",\n            128154: \"-cx-PRIVATE-fbEmoji__icon_1f49a\",\n            128155: \"-cx-PRIVATE-fbEmoji__icon_1f49b\",\n            128156: \"-cx-PRIVATE-fbEmoji__icon_1f49c\",\n            128157: \"-cx-PRIVATE-fbEmoji__icon_1f49d\",\n            128162: \"-cx-PRIVATE-fbEmoji__icon_1f4a2\",\n            128164: \"-cx-PRIVATE-fbEmoji__icon_1f4a4\",\n            128166: \"-cx-PRIVATE-fbEmoji__icon_1f4a6\",\n            128168: \"-cx-PRIVATE-fbEmoji__icon_1f4a8\",\n            128169: \"-cx-PRIVATE-fbEmoji__icon_1f4a9\",\n            128170: \"-cx-PRIVATE-fbEmoji__icon_1f4aa\",\n            128187: \"-cx-PRIVATE-fbEmoji__icon_1f4bb\",\n            128189: \"-cx-PRIVATE-fbEmoji__icon_1f4bd\",\n            128190: \"-cx-PRIVATE-fbEmoji__icon_1f4be\",\n            128191: \"-cx-PRIVATE-fbEmoji__icon_1f4bf\",\n            128192: \"-cx-PRIVATE-fbEmoji__icon_1f4c0\",\n            128222: \"-cx-PRIVATE-fbEmoji__icon_1f4de\",\n            128224: \"-cx-PRIVATE-fbEmoji__icon_1f4e0\",\n            128241: \"-cx-PRIVATE-fbEmoji__icon_1f4f1\",\n            128242: \"-cx-PRIVATE-fbEmoji__icon_1f4f2\",\n            128250: \"-cx-PRIVATE-fbEmoji__icon_1f4fa\",\n            128276: \"-cx-PRIVATE-fbEmoji__icon_1f514\",\n            128293: \"-cx-PRIVATE-fbEmoji__icon_1f525\",\n            128513: \"-cx-PRIVATE-fbEmoji__icon_1f601\",\n            128514: \"-cx-PRIVATE-fbEmoji__icon_1f602\",\n            128515: \"-cx-PRIVATE-fbEmoji__icon_1f603\",\n            128516: \"-cx-PRIVATE-fbEmoji__icon_1f604\",\n            128518: \"-cx-PRIVATE-fbEmoji__icon_1f606\",\n            128521: \"-cx-PRIVATE-fbEmoji__icon_1f609\",\n            128523: \"-cx-PRIVATE-fbEmoji__icon_1f60b\",\n            128524: \"-cx-PRIVATE-fbEmoji__icon_1f60c\",\n            128525: \"-cx-PRIVATE-fbEmoji__icon_1f60d\",\n            128527: \"-cx-PRIVATE-fbEmoji__icon_1f60f\",\n            128530: \"-cx-PRIVATE-fbEmoji__icon_1f612\",\n            128531: \"-cx-PRIVATE-fbEmoji__icon_1f613\",\n            128532: \"-cx-PRIVATE-fbEmoji__icon_1f614\",\n            128534: \"-cx-PRIVATE-fbEmoji__icon_1f616\",\n            128536: \"-cx-PRIVATE-fbEmoji__icon_1f618\",\n            128538: \"-cx-PRIVATE-fbEmoji__icon_1f61a\",\n            128540: \"-cx-PRIVATE-fbEmoji__icon_1f61c\",\n            128541: \"-cx-PRIVATE-fbEmoji__icon_1f61d\",\n            128542: \"-cx-PRIVATE-fbEmoji__icon_1f61e\",\n            128544: \"-cx-PRIVATE-fbEmoji__icon_1f620\",\n            128545: \"-cx-PRIVATE-fbEmoji__icon_1f621\",\n            128546: \"-cx-PRIVATE-fbEmoji__icon_1f622\",\n            128547: \"-cx-PRIVATE-fbEmoji__icon_1f623\",\n            128548: \"-cx-PRIVATE-fbEmoji__icon_1f624\",\n            128549: \"-cx-PRIVATE-fbEmoji__icon_1f625\",\n            128552: \"-cx-PRIVATE-fbEmoji__icon_1f628\",\n            128553: \"-cx-PRIVATE-fbEmoji__icon_1f629\",\n            128554: \"-cx-PRIVATE-fbEmoji__icon_1f62a\",\n            128555: \"-cx-PRIVATE-fbEmoji__icon_1f62b\",\n            128557: \"-cx-PRIVATE-fbEmoji__icon_1f62d\",\n            128560: \"-cx-PRIVATE-fbEmoji__icon_1f630\",\n            128561: \"-cx-PRIVATE-fbEmoji__icon_1f631\",\n            128562: \"-cx-PRIVATE-fbEmoji__icon_1f632\",\n            128563: \"-cx-PRIVATE-fbEmoji__icon_1f633\",\n            128565: \"-cx-PRIVATE-fbEmoji__icon_1f635\",\n            128567: \"-cx-PRIVATE-fbEmoji__icon_1f637\",\n            128568: \"-cx-PRIVATE-fbEmoji__icon_1f638\",\n            128569: \"-cx-PRIVATE-fbEmoji__icon_1f639\",\n            128570: \"-cx-PRIVATE-fbEmoji__icon_1f63a\",\n            128571: \"-cx-PRIVATE-fbEmoji__icon_1f63b\",\n            128572: \"-cx-PRIVATE-fbEmoji__icon_1f63c\",\n            128573: \"-cx-PRIVATE-fbEmoji__icon_1f63d\",\n            128575: \"-cx-PRIVATE-fbEmoji__icon_1f63f\",\n            128576: \"-cx-PRIVATE-fbEmoji__icon_1f640\",\n            128587: \"-cx-PRIVATE-fbEmoji__icon_1f64b\",\n            128588: \"-cx-PRIVATE-fbEmoji__icon_1f64c\",\n            128589: \"-cx-PRIVATE-fbEmoji__icon_1f64d\",\n            128591: \"-cx-PRIVATE-fbEmoji__icon_1f64f\",\n            9757: \"-cx-PRIVATE-fbEmoji__icon_261d\",\n            9786: \"-cx-PRIVATE-fbEmoji__icon_263a\",\n            9889: \"-cx-PRIVATE-fbEmoji__icon_26a1\",\n            9924: \"-cx-PRIVATE-fbEmoji__icon_26c4\",\n            9994: \"-cx-PRIVATE-fbEmoji__icon_270a\",\n            9995: \"-cx-PRIVATE-fbEmoji__icon_270b\",\n            9996: \"-cx-PRIVATE-fbEmoji__icon_270c\",\n            9728: \"-cx-PRIVATE-fbEmoji__icon_2600\",\n            9729: \"-cx-PRIVATE-fbEmoji__icon_2601\",\n            9748: \"-cx-PRIVATE-fbEmoji__icon_2614\",\n            9749: \"-cx-PRIVATE-fbEmoji__icon_2615\",\n            10024: \"-cx-PRIVATE-fbEmoji__icon_2728\",\n            10084: \"-cx-PRIVATE-fbEmoji__icon_2764\"\n        }\n    };\n});\n__d(\"Utf16\", [], function(a, b, c, d, e, f) {\n    var g = {\n        decode: function(h) {\n            switch (h.length) {\n              case 1:\n                return h.charCodeAt(0);\n              case 2:\n                return ((65536 | ((((h.charCodeAt(0) - 55296)) * 1024))) | ((h.charCodeAt(1) - 56320)));\n            };\n        },\n        encode: function(h) {\n            if ((h < 65536)) {\n                return String.fromCharCode(h);\n            }\n             else return (String.fromCharCode((55296 + ((((h - 65536)) >> 10)))) + String.fromCharCode((56320 + ((h % 1024)))))\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"DOMEmoji\", [\"CSS\",\"JSXDOM\",\"TransformTextToDOMMixin\",\"SupportedEmoji\",\"Utf16\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"JSXDOM\"), i = b(\"TransformTextToDOMMixin\"), j = b(\"SupportedEmoji\"), k = b(\"Utf16\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = {\n        MAX_ITEMS: 40,\n        match: function(o) {\n            var p = j.utf16Regex.exec(o);\n            if ((!p || !p.length)) {\n                return false\n            };\n            var q = p[0], r = p.index, s = k.decode(q), t = j.emoji[s];\n            if (!t) {\n                return false\n            };\n            return {\n                startIndex: r,\n                endIndex: (r + q.length),\n                element: this._element(t)\n            };\n        },\n        _element: function(o) {\n            var p = h.span(null);\n            g.addClass(p, \"-cx-PRIVATE-fbEmoji__icon\");\n            g.addClass(p, \"-cx-PRIVATE-fbEmoji__size_16\");\n            g.addClass(p, o);\n            return p;\n        }\n    };\n    e.exports = l(n, i);\n});\n__d(\"EmoticonsList\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        emotes: {\n            \":)\": \"smile\",\n            \":-)\": \"smile\",\n            \":]\": \"smile\",\n            \"=)\": \"smile\",\n            \":(\": \"frown\",\n            \":-(\": \"frown\",\n            \":[\": \"frown\",\n            \"=(\": \"frown\",\n            \":P\": \"tongue\",\n            \":-P\": \"tongue\",\n            \":-p\": \"tongue\",\n            \":p\": \"tongue\",\n            \"=P\": \"tongue\",\n            \"=D\": \"grin\",\n            \":-D\": \"grin\",\n            \":D\": \"grin\",\n            \":o\": \"gasp\",\n            \":-O\": \"gasp\",\n            \":O\": \"gasp\",\n            \":-o\": \"gasp\",\n            \";)\": \"wink\",\n            \";-)\": \"wink\",\n            \"8)\": \"glasses\",\n            \"8-)\": \"glasses\",\n            \"B)\": \"glasses\",\n            \"B-)\": \"glasses\",\n            \"B|\": \"sunglasses\",\n            \"8-|\": \"sunglasses\",\n            \"8|\": \"sunglasses\",\n            \"B-|\": \"sunglasses\",\n            \"\\u003E:(\": \"grumpy\",\n            \"\\u003E:-(\": \"grumpy\",\n            \":/\": \"unsure\",\n            \":-/\": \"unsure\",\n            \":\\\\\": \"unsure\",\n            \":-\\\\\": \"unsure\",\n            \"=/\": \"unsure\",\n            \"=\\\\\": \"unsure\",\n            \":'(\": \"cry\",\n            \"3:)\": \"devil\",\n            \"3:-)\": \"devil\",\n            \"O:)\": \"angel\",\n            \"O:-)\": \"angel\",\n            \":*\": \"kiss\",\n            \":-*\": \"kiss\",\n            \"\\u003C3\": \"heart\",\n            \"&lt;3\": \"heart\",\n            \"\\u2665\": \"heart\",\n            \"^_^\": \"kiki\",\n            \"-_-\": \"squint\",\n            \"o.O\": \"confused\",\n            \"O.o\": \"confused_rev\",\n            \"\\u003E:o\": \"upset\",\n            \"\\u003E:O\": \"upset\",\n            \"\\u003E:-O\": \"upset\",\n            \"\\u003E:-o\": \"upset\",\n            \"\\u003E_\\u003C\": \"upset\",\n            \"\\u003E.\\u003C\": \"upset\",\n            \":v\": \"pacman\",\n            \":|]\": \"robot\",\n            \":3\": \"colonthree\",\n            \"\\u003C(\\\")\": \"penguin\",\n            \":putnam:\": \"putnam\",\n            \"(^^^)\": \"shark\",\n            \"(y)\": \"like\",\n            \":like:\": \"like\",\n            \"(Y)\": \"like\",\n            \":poop:\": \"poop\"\n        },\n        symbols: {\n            smile: \":)\",\n            frown: \":(\",\n            tongue: \":P\",\n            grin: \"=D\",\n            gasp: \":o\",\n            wink: \";)\",\n            glasses: \"8)\",\n            sunglasses: \"B|\",\n            grumpy: \"\\u003E:(\",\n            unsure: \":/\",\n            cry: \":'(\",\n            devil: \"3:)\",\n            angel: \"O:)\",\n            kiss: \":*\",\n            heart: \"\\u003C3\",\n            kiki: \"^_^\",\n            squint: \"-_-\",\n            confused: \"o.O\",\n            confused_rev: \"O.o\",\n            upset: \"\\u003E:o\",\n            pacman: \":v\",\n            robot: \":|]\",\n            colonthree: \":3\",\n            penguin: \"\\u003C(\\\")\",\n            putnam: \":putnam:\",\n            shark: \"(^^^)\",\n            like: \"(y)\",\n            poop: \":poop:\"\n        },\n        regexp: /(^|[\\s'\".])(:\\)|:\\-\\)|:\\]|=\\)|:\\(|:\\-\\(|:\\[|=\\(|:P|:\\-P|:\\-p|:p|=P|=D|:\\-D|:D|:o|:\\-O|:O|:\\-o|;\\)|;\\-\\)|8\\)|8\\-\\)|B\\)|B\\-\\)|B\\||8\\-\\||8\\||B\\-\\||>:\\(|>:\\-\\(|:\\/|:\\-\\/|:\\\\|:\\-\\\\|=\\/|=\\\\|:'\\(|3:\\)|3:\\-\\)|O:\\)|O:\\-\\)|:\\*|:\\-\\*|<3|&lt;3|\\u2665|\\^_\\^|\\-_\\-|o\\.O|O\\.o|>:o|>:O|>:\\-O|>:\\-o|>_<|>\\.<|:v|:\\|\\]|:3|<\\(\"\\)|:putnam:|\\(\\^\\^\\^\\)|\\(y\\)|:like:|\\(Y\\)|:poop:)([\\s'\".,!?]|<br>|$)/\n    };\n});\n__d(\"DOMEmote\", [\"CSS\",\"EmoticonsList\",\"JSXDOM\",\"TransformTextToDOMMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"EmoticonsList\"), i = b(\"JSXDOM\"), j = b(\"TransformTextToDOMMixin\"), k = b(\"copyProperties\"), l = {\n        MAX_ITEMS: 40,\n        match: function(m) {\n            var n = h.regexp.exec(m);\n            if ((!n || !n.length)) {\n                return false\n            };\n            var o = n[2], p = (n.index + n[1].length);\n            return {\n                startIndex: p,\n                endIndex: (p + o.length),\n                element: this._element(o, h.emotes[o])\n            };\n        },\n        _element: function(m, n) {\n            var o = i.span({\n                className: \"emoticon_text\",\n                \"aria-hidden\": \"true\"\n            }, m), p = i.span({\n                title: m,\n                className: \"emoticon\"\n            });\n            g.addClass(p, (\"emoticon_\" + n));\n            return [o,p,];\n        }\n    };\n    e.exports = k(l, j);\n});\n__d(\"FBIDEmote\", [\"JSXDOM\",\"TransformTextToDOMMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"TransformTextToDOMMixin\"), i = b(\"copyProperties\"), j = /\\[\\[([a-z\\d\\.]+)\\]\\]/i, k = {\n        MAX_ITEMS: 40,\n        match: function(l) {\n            var m = j.exec(l);\n            if ((!m || !m.length)) {\n                return false\n            };\n            var n = m[0], o = m[1];\n            return {\n                startIndex: m.index,\n                endIndex: (m.index + n.length),\n                element: this._element(n, o)\n            };\n        },\n        _element: function(l, m) {\n            var n = g.span({\n                className: \"emoticon_text\",\n                \"aria-hidden\": \"true\"\n            }, l), o = g.img({\n                alt: l,\n                className: \"emoticon emoticon_custom\",\n                src: (((window.location.protocol + \"//graph.facebook.com/\") + encodeURIComponent(m)) + \"/picture\")\n            });\n            return [n,o,];\n        }\n    };\n    e.exports = i(k, h);\n});\n__d(\"transformTextToDOM\", [\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\");\n    function h(i, j) {\n        var k = [i,];\n        j = g(j);\n        j.forEach(function(l) {\n            var m, n = l;\n            if (l.__params) {\n                m = l.params;\n                n = l.obj;\n            }\n        ;\n            k = n.transform(k, m);\n        });\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"emojiAndEmote\", [\"DOMEmoji\",\"DOMEmote\",\"FBIDEmote\",\"transformTextToDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMEmoji\"), h = b(\"DOMEmote\"), i = b(\"FBIDEmote\"), j = b(\"transformTextToDOM\"), k = function(l, m) {\n        var n = [g,h,i,];\n        if ((m === false)) {\n            n.pop();\n        };\n        return j(l, n);\n    };\n    e.exports = k;\n});\n__d(\"Emoji\", [\"DOMEmoji\",\"JSXDOM\",\"emojiAndEmote\",\"transformTextToDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMEmoji\"), h = b(\"JSXDOM\"), i = b(\"emojiAndEmote\"), j = b(\"transformTextToDOM\"), k = {\n        htmlEmojiAndEmote: function(l, m) {\n            return (h.span(null, i(l))).innerHTML;\n        },\n        htmlEmojiAndEmoteWithoutFBID: function(l, m) {\n            return (h.span(null, i(l, false))).innerHTML;\n        },\n        htmlEmoji: function(l) {\n            return (h.span(null, j(l, g))).innerHTML;\n        }\n    };\n    e.exports = k;\n});\n__d(\"Emote\", [\"DOMEmote\",\"FBIDEmote\",\"JSXDOM\",\"transformTextToDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMEmote\"), h = b(\"FBIDEmote\"), i = b(\"JSXDOM\"), j = b(\"transformTextToDOM\"), k = {\n        htmlEmoteWithoutFBID: function(l, m) {\n            return (i.span(null, j(l, g))).innerHTML;\n        },\n        htmlEmote: function(l, m) {\n            return (i.span(null, j(l, [g,h,]))).innerHTML;\n        }\n    };\n    e.exports = k;\n});\n__d(\"TextWithEmoticons.react\", [\"Emoji\",\"Emote\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"Emoji\"), h = b(\"Emote\"), i = b(\"React\"), j = i.createClass({\n        displayName: \"ReactTextWithEmoticons\",\n        render: function() {\n            if ((!this.props.renderEmoticons && !this.props.renderEmoji)) {\n                return i.DOM.span(null, this.props.text)\n            };\n            var k;\n            if ((this.props.renderEmoticons && this.props.renderEmoji)) {\n                k = g.htmlEmojiAndEmoteWithoutFBID(this.props.text);\n            }\n             else if (this.props.renderEmoticons) {\n                k = h.htmlEmoteWithoutFBID(this.props.text);\n            }\n             else k = g.htmlEmoji(this.props.text);\n            \n        ;\n            return i.DOM.span({\n                dangerouslySetInnerHTML: {\n                    __html: k\n                }\n            });\n        }\n    });\n    e.exports = j;\n});\n__d(\"TextWithEntities.react\", [\"Link.react\",\"React\",\"TextWithEmoticons.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"React\"), i = b(\"TextWithEmoticons.react\");\n    function j(o) {\n        return (o).replace(/<3\\b|&hearts;/g, \"\\u2665\");\n    };\n    function k(o, p) {\n        return (g({\n            href: p.entities[0]\n        }, o));\n    };\n    function l(o, p) {\n        return (o.offset - p.offset);\n    };\n    var m = /(\\r\\n|[\\r\\n])/, n = h.createClass({\n        displayName: \"ReactTextWithEntities\",\n        _formatStandardText: function(o) {\n            var p = o.split(m), q = [];\n            for (var r = 0; (r < p.length); r++) {\n                var s = p[r];\n                if (s) {\n                    if (m.test(s)) {\n                        q.push(h.DOM.br(null));\n                    }\n                     else if ((this.props.renderEmoticons || this.props.renderEmoji)) {\n                        q.push(i({\n                            text: s,\n                            renderEmoticons: this.props.renderEmoticons,\n                            renderEmoji: this.props.renderEmoji\n                        }));\n                    }\n                     else q.push(j(s));\n                    \n                \n                };\n            };\n            return q;\n        },\n        render: function() {\n            var o = 0, p = this.props.ranges, q = this.props.aggregatedRanges, r = this.props.text, s = null;\n            if (p) {\n                s = (q ? p.concat(q) : p.slice());\n            }\n             else if (q) {\n                s = q.slice();\n            }\n        ;\n            if (s) {\n                s.sort(l);\n            };\n            var t = [], u = (s ? s.length : 0);\n            for (var v = 0, w = u; (v < w); v++) {\n                var x = s[v];\n                if ((x.offset < o)) {\n                    continue;\n                };\n                if ((x.offset > o)) {\n                    t = t.concat(this._formatStandardText(r.substring(o, x.offset)));\n                };\n                var y = r.substr(x.offset, x.length);\n                t = t.concat([(this.props.interpolator ? this.props.interpolator(y, x) : k(y, x)),]);\n                o = (x.offset + x.length);\n            };\n            if ((r.length > o)) {\n                t = t.concat(this._formatStandardText(r.substr(o)));\n            };\n            return h.DOM.span(null, t);\n        }\n    });\n    e.exports = n;\n});\n__d(\"fbt\", [\"copyProperties\",\"substituteTokens\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"substituteTokens\"), i = b(\"invariant\"), j = {\n        INDEX: 0,\n        SUBSTITUTION: 1\n    }, k = function() {\n    \n    };\n    k._ = function(l, m) {\n        var n = {\n        }, o = l;\n        for (var p = 0; (p < m.length); p++) {\n            var q = m[p][j.INDEX];\n            if ((q !== null)) {\n                i((q in o));\n                o = o[q];\n            }\n        ;\n            g(n, m[p][j.SUBSTITUTION]);\n        };\n        i((typeof o === \"string\"));\n        return h(o, n);\n    };\n    k[\"enum\"] = function(l, m) {\n        return [l,null,];\n    };\n    k.param = function(l, m) {\n        var n = {\n        };\n        n[l] = m;\n        return [null,n,];\n    };\n    e.exports = k;\n});\n__d(\"LiveTimer\", [\"CSS\",\"DOM\",\"UserAgent\",\"emptyFunction\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"emptyFunction\"), k = b(\"fbt\"), l = b(\"tx\"), m = 1000, n = 60, o = 3600, p = 43200, q = 60, r = 20000, s = {\n        restart: function(t) {\n            this.serverTime = t;\n            this.localStartTime = (Date.now() / 1000);\n            this.updateTimeStamps();\n        },\n        getApproximateServerTime: function() {\n            return (this.getServerTimeOffset() + Date.now());\n        },\n        getServerTimeOffset: function() {\n            return (((this.serverTime - this.localStartTime)) * m);\n        },\n        updateTimeStamps: function() {\n            s.timestamps = h.scry(document.body, \"abbr.livetimestamp\");\n            s.startLoop(r);\n        },\n        addTimeStamps: function(t) {\n            if (!t) {\n                return\n            };\n            s.timestamps = (s.timestamps || []);\n            if ((h.isNodeOfType(t, \"abbr\") && g.hasClass(t, \"livetimestamp\"))) {\n                s.timestamps.push(t);\n            }\n             else {\n                var u = h.scry(t, \"abbr.livetimestamp\");\n                for (var v = 0; (v < u.length); ++v) {\n                    s.timestamps.push(u[v]);;\n                };\n            }\n        ;\n            s.startLoop(0);\n        },\n        startLoop: function(t) {\n            this.stop();\n            this.timeout = setTimeout(function() {\n                s.loop();\n            }, t);\n        },\n        stop: function() {\n            clearTimeout(this.timeout);\n        },\n        updateNode: function(t, u) {\n            s.updateNode = ((i.ie() < 7) ? j : h.setContent);\n            s.updateNode(t, u);\n        },\n        loop: function(t) {\n            if (t) {\n                s.updateTimeStamps();\n            };\n            var u = Math.floor((s.getApproximateServerTime() / m)), v = -1;\n            (s.timestamps && s.timestamps.forEach(function(x) {\n                var y = x.getAttribute(\"data-utime\"), z = x.getAttribute(\"data-shorten\"), aa = s.renderRelativeTime(u, y, z);\n                if (aa.text) {\n                    s.updateNode(x, aa.text);\n                };\n                if (((aa.next != -1) && (((aa.next < v) || (v == -1))))) {\n                    v = aa.next;\n                };\n            }));\n            if ((v != -1)) {\n                var w = Math.max(r, (v * m));\n                s.timeout = setTimeout(function() {\n                    s.loop();\n                }, w);\n            }\n        ;\n        },\n        renderRelativeTime: function(t, u, v) {\n            var w = {\n                text: \"\",\n                next: -1\n            };\n            if (((t - u) > (p))) {\n                return w\n            };\n            var x = (t - u), y = Math.floor((x / n)), z = Math.floor((y / q));\n            if ((y < 1)) {\n                if (v) {\n                    x = ((x > 1) ? x : 2);\n                    w.text = k._(\"{number} secs\", [k.param(\"number\", x),]);\n                    w.next = (20 - (x % 20));\n                }\n                 else {\n                    w.text = \"a few seconds ago\";\n                    w.next = (n - (x % n));\n                }\n            ;\n                return w;\n            }\n        ;\n            if ((z < 1)) {\n                if ((v && (y == 1))) {\n                    w.text = \"1 min\";\n                }\n                 else if (v) {\n                    w.text = k._(\"{number} mins\", [k.param(\"number\", y),]);\n                }\n                 else w.text = ((y == 1) ? \"about a minute ago\" : l._(\"{number} minutes ago\", {\n                    number: y\n                }));\n                \n            ;\n                w.next = (n - (x % n));\n                return w;\n            }\n        ;\n            if ((z < 11)) {\n                w.next = (o - (x % o));\n            };\n            if ((v && (z == 1))) {\n                w.text = \"1 hr\";\n            }\n             else if (v) {\n                w.text = k._(\"{number} hrs\", [k.param(\"number\", z),]);\n            }\n             else w.text = ((z == 1) ? \"about an hour ago\" : l._(\"{number} hours ago\", {\n                number: z\n            }));\n            \n        ;\n            return w;\n        },\n        renderRelativeTimeToServer: function(t) {\n            return s.renderRelativeTime(Math.floor((s.getApproximateServerTime() / m)), t);\n        }\n    };\n    e.exports = s;\n});\n__d(\"Timestamp.react\", [\"LiveTimer\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"Timestamp\",\n        render: function() {\n            var j = g.renderRelativeTimeToServer(this.props.time);\n            return this.transferPropsTo(h.DOM.abbr({\n                className: \"livetimestamp\",\n                title: this.props.verbose,\n                \"data-utime\": this.props.time\n            }, (j.text || this.props.text)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIClassNames\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        ACTOR_IMAGE: \"img UFIActorImage -cx-PRIVATE-uiSquareImage__size32\",\n        ROW: \"UFIRow\",\n        UNSEEN_ITEM: \"UFIUnseenItem\"\n    };\n});\n__d(\"UFIImageBlock.react\", [\"ImageBlock.react\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ImageBlock.react\"), h = b(\"React\"), i = b(\"cx\"), j = h.createClass({\n        displayName: \"UFIImageBlock\",\n        render: function() {\n            return this.transferPropsTo(g({\n                imageClassName: \"UFIImageBlockImage\",\n                contentClassName: \"UFIImageBlockContent\"\n            }, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"debounceAcrossTransitions\", [\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"debounce\");\n    function h(i, j, k) {\n        return g(i, j, k, true);\n    };\n    e.exports = h;\n});\n__d(\"MercuryServerDispatcher\", [\"AsyncRequest\",\"FBAjaxRequest\",\"Env\",\"JSLogger\",\"Run\",\"areObjectsEqual\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"FBAjaxRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = b(\"areObjectsEqual\"), m = b(\"copyProperties\"), n = b(\"debounceAcrossTransitions\"), o = {\n    }, p = j.create(\"mercury_dispatcher\"), q = false, r = {\n        IMMEDIATE: \"immediate\",\n        IDEMPOTENT: \"idempotent\",\n        BATCH_SUCCESSIVE: \"batch-successive\",\n        BATCH_SUCCESSIVE_UNIQUE: \"batch-successive-unique\",\n        BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR: \"batch-successive-piggyback-retry\",\n        BATCH_DEFERRED_MULTI: \"batch-deferred-multi\",\n        BATCH_CONDITIONAL: \"batch-conditional\",\n        registerEndpoints: function(v) {\n            for (var w in v) {\n                var x = v[w], y = (x.request_user_id || i.user);\n                if (!o[w]) {\n                    o[w] = {\n                    };\n                };\n                if (!o[w][y]) {\n                    o[w][y] = {\n                    };\n                };\n                o[w][y] = new s(w, x);\n            };\n        },\n        trySend: function(v, w, x, y) {\n            y = (y || i.user);\n            if (((v == \"/ajax/mercury/client_reliability.php\") && !o[v][y])) {\n                o[v][y] = o[v][undefined];\n            };\n            o[v][y].trySend(w, x);\n        }\n    };\n    function s(v, w) {\n        var x = (w.mode || r.IMMEDIATE);\n        switch (x) {\n          case r.IMMEDIATE:\n        \n          case r.IDEMPOTENT:\n        \n          case r.BATCH_SUCCESSIVE:\n        \n          case r.BATCH_SUCCESSIVE_UNIQUE:\n        \n          case r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR:\n        \n          case r.BATCH_DEFERRED_MULTI:\n        \n          case r.BATCH_CONDITIONAL:\n            break;\n          default:\n            throw new Error((\"Invalid MercuryServerDispatcher mode \" + x));\n        };\n        this._endpoint = v;\n        this._mode = x;\n        this._requestUserID = w.request_user_id;\n        this._combineData = w.batch_function;\n        this._combineDataIf = w.batch_if;\n        this._batchSizeLimit = w.batch_size_limit;\n        this._batches = [];\n        this._handler = w.handler;\n        this._errorHandler = w.error_handler;\n        this._transportErrorHandler = (w.transport_error_handler || w.error_handler);\n        this._connectionRetries = (w.connection_retries || 0);\n        this._timeoutHandler = w.timeout_handler;\n        this._timeout = w.timeout;\n        this._serverDialogCancelHandler = (w.server_dialog_cancel_handler || w.error_handler);\n        this._deferredSend = n(this._batchSend, 0, this);\n        if (this._batchSizeLimit) {\n            k.onUnload(function() {\n                p.bump((\"unload_batches_count_\" + u(this._batches.length)));\n            }.bind(this));\n        };\n    };\n    m(s.prototype, {\n        _inFlight: 0,\n        _handler: null,\n        _errorHandler: null,\n        _transportErrorHandler: null,\n        _timeoutHandler: null,\n        _timeout: null,\n        _serverDialogCancelHandler: null,\n        _combineData: null,\n        trySend: function(v, w) {\n            if (q) {\n                return\n            };\n            if ((typeof v == \"undefined\")) {\n                v = null;\n            };\n            var x = (w || this._mode);\n            if ((x == r.IMMEDIATE)) {\n                this._send(v);\n            }\n             else if ((x == r.IDEMPOTENT)) {\n                if (!this._inFlight) {\n                    this._send(v);\n                };\n            }\n             else if (((x == r.BATCH_SUCCESSIVE) || (x == r.BATCH_SUCCESSIVE_UNIQUE))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n                 else this._batchData(v);\n            ;\n            }\n             else if ((x == r.BATCH_CONDITIONAL)) {\n                var y = (this._batches[0] && this._batches[0].getData());\n                if ((this._inFlight && ((this._combineDataIf(this._pendingRequestData, v) || this._combineDataIf(y, v))))) {\n                    this._batchData(v);\n                }\n                 else this._send(v);\n            ;\n            }\n             else if ((x == r.BATCH_DEFERRED_MULTI)) {\n                this._batchData(v);\n                this._deferredSend();\n            }\n             else if ((x == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) {\n                this._batchData(v);\n                if (!this._inFlight) {\n                    this._batchSend();\n                };\n            }\n            \n            \n            \n            \n            \n        ;\n        },\n        _send: function(v) {\n            this._inFlight++;\n            this._pendingRequestData = m({\n            }, v);\n            if ((this._requestUserID != i.user)) {\n                v.request_user_id = this._requestUserID;\n            };\n            p.log(\"send\", {\n                endpoint: this._endpoint,\n                data: v,\n                inflight_count: this._inFlight\n            });\n            var w = null;\n            if (i.worker_context) {\n                w = new h(\"POST\", this._endpoint, v);\n                w.onError = function(x) {\n                    x.getPayload = function() {\n                        return x.errorText;\n                    };\n                    x.getRequest = function() {\n                        var y = x;\n                        x.getData = function() {\n                            return v;\n                        };\n                        return y;\n                    };\n                    x.getError = function() {\n                        return x.errorText;\n                    };\n                    x.getErrorDescription = function() {\n                        return x.errorText;\n                    };\n                    x.isTransient = function() {\n                        return false;\n                    };\n                    this._handleError(x);\n                }.bind(this);\n                w.onJSON = function(x) {\n                    x.getPayload = function() {\n                        return x.json;\n                    };\n                    x.getRequest = function() {\n                        return w;\n                    };\n                    this._handleResponse(x);\n                }.bind(this);\n                w.getData = function() {\n                    return v;\n                };\n                w.send();\n            }\n             else {\n                w = new g(this._endpoint).setData(v).setOption(\"retries\", this._connectionRetries).setHandler(this._handleResponse.bind(this)).setErrorHandler(this._handleError.bind(this)).setTransportErrorHandler(this._handleTransportError.bind(this)).setServerDialogCancelHandler(this._handleServerDialogCancel.bind(this)).setAllowCrossPageTransition(true);\n                if ((this._timeout && this._timeoutHandler)) {\n                    w.setTimeoutHandler(this._timeout, this._handleTimeout.bind(this));\n                };\n                w.send();\n            }\n        ;\n        },\n        _batchData: function(v, w) {\n            if ((((this._mode == r.BATCH_SUCCESSIVE_UNIQUE) && (typeof this._pendingRequestData != \"undefined\")) && l(v, this._pendingRequestData))) {\n                return;\n            }\n             else {\n                var x = (this._batches.length - 1);\n                if (((x >= 0) && !this._hasReachedBatchLimit(this._batches[x]))) {\n                    (w ? this._batches[x].combineWithOlder(v, this._combineData) : this._batches[x].combineWith(v, this._combineData));\n                }\n                 else {\n                    this._batches.push(new t(v));\n                    p.bump((\"batches_count_\" + u(this._batches.length)));\n                }\n            ;\n                p.debug(\"batch\", {\n                    endpoint: this._endpoint,\n                    batches: this._batches,\n                    batch_limit: this._batchSizeLimit\n                });\n            }\n        ;\n        },\n        _hasReachedBatchLimit: function(v) {\n            return (this._batchSizeLimit && (v.getSize() >= this._batchSizeLimit));\n        },\n        _batchSend: function() {\n            if (this._batches[0]) {\n                this._send(this._batches[0].getData());\n                this._batches.shift();\n            }\n        ;\n        },\n        _handleResponse: function(v) {\n            this._inFlight--;\n            p.log(\"response\", {\n                endpoint: this._endpoint,\n                inflight_count: this._inFlight\n            });\n            var w = v.getPayload();\n            q = (w && w.kill_chat);\n            if (q) {\n                p.log(\"killswitch_enabled\", {\n                    endpoint: this._endpoint,\n                    inflight_count: this._inFlight\n                });\n            };\n            if ((w && w.error_payload)) {\n                if (this._errorHandler) {\n                    this._errorHandler(v);\n                };\n            }\n             else (this._handler && this._handler(w, v.getRequest()));\n        ;\n            if (((((this._mode == r.BATCH_SUCCESSIVE) || (this._mode == r.BATCH_SUCCESSIVE_UNIQUE)) || (this._mode == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) || (this._mode == r.BATCH_CONDITIONAL))) {\n                this._batchSend();\n            };\n            delete this._pendingRequestData;\n        },\n        _postErrorHandler: function() {\n            p.error(\"error\", {\n                endpoint: this._endpoint,\n                inflight_count: (this._inFlight - 1)\n            });\n            this._inFlight--;\n            var v = this._mode;\n            if ((((v == r.BATCH_SUCCESSIVE) || (v == r.BATCH_SUCCESSIVE_UNIQUE)) || (v == r.BATCH_CONDITIONAL))) {\n                this._batchSend();\n            }\n             else if ((v == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)) {\n                if (this._batches[0]) {\n                    this._batchData(this._pendingRequestData, true);\n                    this._batchSend();\n                }\n                 else this._batchData(this._pendingRequestData, true);\n            \n            }\n        ;\n            delete this._pendingRequestData;\n        },\n        _handleError: function(v) {\n            (this._errorHandler && this._errorHandler(v));\n            this._postErrorHandler();\n        },\n        _handleTransportError: function(v) {\n            (this._transportErrorHandler && this._transportErrorHandler(v));\n            this._postErrorHandler();\n        },\n        _handleTimeout: function(v) {\n            (this._timeoutHandler && this._timeoutHandler(v));\n            this._postErrorHandler();\n        },\n        _handleServerDialogCancel: function(v) {\n            (this._serverDialogCancelHandler && this._serverDialogCancelHandler(v));\n            this._postErrorHandler();\n        }\n    });\n    function t(v) {\n        this._data = v;\n        this._size = 1;\n    };\n    m(t.prototype, {\n        getData: function() {\n            return this._data;\n        },\n        getSize: function() {\n            return this._size;\n        },\n        combineWith: function(v, w) {\n            this._data = w(this._data, v);\n            this._size++;\n        },\n        combineWithOlder: function(v, w) {\n            this._data = w(v, this._data);\n            this._size++;\n        }\n    });\n    function u(v) {\n        if ((v === 1)) {\n            return \"equals1\";\n        }\n         else if (((v >= 2) && (v <= 3))) {\n            return \"between2and3\";\n        }\n         else return \"over4\"\n        \n    ;\n    };\n    e.exports = r;\n});\n__d(\"TokenizeUtil\", [\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"repeatString\"), h = /[ ]+/g, i = /[^ ]+/g, j = new RegExp(k(), \"g\");\n    function k() {\n        return ((((\"[.,+*?$|#{}()'\\\\^\\\\-\\\\[\\\\]\\\\\\\\\\\\/!@%\\\"~=\\u003C\\u003E_:;\" + \"\\u30fb\\u3001\\u3002\\u3008-\\u3011\\u3014-\\u301f\\uff1a-\\uff1f\\uff01-\\uff0f\") + \"\\uff3b-\\uff40\\uff5b-\\uff65\\u2e2e\\u061f\\u066a-\\u066c\\u061b\\u060c\\u060d\") + \"\\ufd3e\\ufd3f\\u1801\\u0964\\u104a\\u104b\\u2010-\\u2027\\u2030-\\u205e\") + \"\\u00a1-\\u00b1\\u00b4-\\u00b8\\u00ba\\u00bb\\u00bf]\");\n    };\n    var l = {\n    }, m = {\n        a: \"\\u0430 \\u00e0 \\u00e1 \\u00e2 \\u00e3 \\u00e4 \\u00e5\",\n        b: \"\\u0431\",\n        c: \"\\u0446 \\u00e7 \\u010d\",\n        d: \"\\u0434 \\u00f0 \\u010f \\u0111\",\n        e: \"\\u044d \\u0435 \\u00e8 \\u00e9 \\u00ea \\u00eb \\u011b\",\n        f: \"\\u0444\",\n        g: \"\\u0433 \\u011f\",\n        h: \"\\u0445 \\u0127\",\n        i: \"\\u0438 \\u00ec \\u00ed \\u00ee \\u00ef \\u0131\",\n        j: \"\\u0439\",\n        k: \"\\u043a \\u0138\",\n        l: \"\\u043b \\u013e \\u013a \\u0140 \\u0142\",\n        m: \"\\u043c\",\n        n: \"\\u043d \\u00f1 \\u0148 \\u0149 \\u014b\",\n        o: \"\\u043e \\u00f8 \\u00f6 \\u00f5 \\u00f4 \\u00f3 \\u00f2\",\n        p: \"\\u043f\",\n        r: \"\\u0440 \\u0159 \\u0155\",\n        s: \"\\u0441 \\u015f \\u0161 \\u017f\",\n        t: \"\\u0442 \\u0165 \\u0167 \\u00fe\",\n        u: \"\\u0443 \\u044e \\u00fc \\u00fb \\u00fa \\u00f9 \\u016f\",\n        v: \"\\u0432\",\n        y: \"\\u044b \\u00ff \\u00fd\",\n        z: \"\\u0437 \\u017e\",\n        ae: \"\\u00e6\",\n        oe: \"\\u0153\",\n        ts: \"\\u0446\",\n        ch: \"\\u0447\",\n        ij: \"\\u0133\",\n        sh: \"\\u0448\",\n        ss: \"\\u00df\",\n        ya: \"\\u044f\"\n    };\n    for (var n in m) {\n        var o = m[n].split(\" \");\n        for (var p = 0; (p < o.length); p++) {\n            l[o[p]] = n;;\n        };\n    };\n    var q = {\n    };\n    function r(x) {\n        return (x ? x.replace(j, \" \") : \"\");\n    };\n    function s(x) {\n        x = x.toLowerCase();\n        var y = \"\", z = \"\";\n        for (var aa = x.length; aa--; ) {\n            z = x.charAt(aa);\n            y = (((l[z] || z)) + y);\n        };\n        return y.replace(h, \" \");\n    };\n    function t(x) {\n        var y = [], z = i.exec(x);\n        while (z) {\n            z = z[0];\n            y.push(z);\n            z = i.exec(x);\n        };\n        return y;\n    };\n    function u(x, y) {\n        if (!q.hasOwnProperty(x)) {\n            var z = s(x), aa = r(z);\n            q[x] = {\n                value: x,\n                flatValue: z,\n                tokens: t(aa),\n                isPrefixQuery: (aa && (aa[(aa.length - 1)] != \" \"))\n            };\n        }\n    ;\n        if ((y && (typeof q[x].sortedTokens == \"undefined\"))) {\n            q[x].sortedTokens = q[x].tokens.slice();\n            q[x].sortedTokens.sort(function(ba, ca) {\n                return (ca.length - ba.length);\n            });\n        }\n    ;\n        return q[x];\n    };\n    function v(x, y, z) {\n        var aa = u(y, (x == \"prefix\")), ba = ((x == \"prefix\") ? aa.sortedTokens : aa.tokens), ca = u(z).tokens, da = {\n        }, ea = ((aa.isPrefixQuery && (x == \"query\")) ? (ba.length - 1) : null), fa = function(ga, ha) {\n            for (var ia = 0; (ia < ca.length); ++ia) {\n                var ja = ca[ia];\n                if ((!da[ia] && (((ja == ga) || ((((((x == \"query\") && (ha === ea)) || (x == \"prefix\"))) && (ja.indexOf(ga) === 0))))))) {\n                    return (da[ia] = true)\n                };\n            };\n            return false;\n        };\n        return Boolean((ba.length && ba.every(fa)));\n    };\n    var w = {\n        flatten: s,\n        parse: u,\n        getPunctuation: k,\n        isExactMatch: v.bind(null, \"exact\"),\n        isQueryMatch: v.bind(null, \"query\"),\n        isPrefixMatch: v.bind(null, \"prefix\")\n    };\n    e.exports = w;\n});\n__d(\"KanaUtils\", [], function(a, b, c, d, e, f) {\n    var g = 12353, h = 12436, i = 96, j = {\n        normalizeHiragana: function(k) {\n            if ((k !== null)) {\n                var l = [];\n                for (var m = 0; (m < k.length); m++) {\n                    var n = k.charCodeAt(m);\n                    if (((n < g) || (n > h))) {\n                        l.push(k.charAt(m));\n                    }\n                     else {\n                        var o = (n + i);\n                        l.push(String.fromCharCode(o));\n                    }\n                ;\n                };\n                return l.join(\"\");\n            }\n             else return null\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DataSource\", [\"ArbiterMixin\",\"AsyncRequest\",\"TokenizeUtil\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"KanaUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"TokenizeUtil\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\"), n = b(\"KanaUtils\");\n    function o(p) {\n        this._maxResults = (p.maxResults || 10);\n        this.token = p.token;\n        this.queryData = (p.queryData || {\n        });\n        this.queryEndpoint = (p.queryEndpoint || \"\");\n        this.bootstrapData = (p.bootstrapData || {\n        });\n        this.bootstrapEndpoint = (p.bootstrapEndpoint || \"\");\n        this._exclusions = (p.exclusions || []);\n        this._indexedFields = (p.indexedFields || [\"text\",\"tokens\",]);\n        this._titleFields = (p.titleFields || []);\n        this._alwaysPrefixMatch = (p.alwaysPrefixMatch || false);\n        this._deduplicationKey = (p.deduplicationKey || null);\n        this._enabledQueryCache = (p.enabledQueryCache || true);\n        this._queryExactMatch = (p.queryExactMatch || false);\n        this._acrossTransitions = (p.acrossTransitions || false);\n        this._kanaNormalization = (p.kanaNormalization || false);\n        this._minQueryLength = (p.minQueryLength || -1);\n        this._minExactMatchLength = 4;\n        this._filters = [];\n    };\n    j(o.prototype, g, {\n        events: [\"bootstrap\",\"query\",\"respond\",],\n        init: function() {\n            this.init = m;\n            this._fields = l(this._indexedFields);\n            this._activeQueries = 0;\n            this.dirty();\n        },\n        dirty: function() {\n            this.value = \"\";\n            this._bootstrapped = false;\n            this._bootstrapping = false;\n            this._data = {\n            };\n            this.localCache = {\n            };\n            this.queryCache = {\n            };\n            this.inform(\"dirty\", {\n            });\n            return this;\n        },\n        bootstrap: function() {\n            if (this._bootstrapped) {\n                return\n            };\n            this.bootstrapWithoutToken();\n            this._bootstrapped = true;\n            this._bootstrapping = true;\n            this.inform(\"bootstrap\", {\n                bootstrapping: true\n            });\n        },\n        bootstrapWithoutToken: function() {\n            this.fetch(this.bootstrapEndpoint, this.bootstrapData, {\n                bootstrap: true,\n                token: this.token\n            });\n        },\n        bootstrapWithToken: function() {\n            var p = j({\n            }, this.bootstrapData);\n            p.token = this.token;\n            this.fetch(this.bootstrapEndpoint, p, {\n                bootstrap: true,\n                replaceCache: true\n            });\n        },\n        query: function(p, q, r, s) {\n            this.inform(\"beforeQuery\", {\n                value: p,\n                local_only: q,\n                exclusions: r,\n                time_waited: s\n            });\n            if (!this._enabledQueryCache) {\n                this.queryCache = {\n                };\n            };\n            var t = this.buildUids(p, [], r), u = this.respond(p, t);\n            this.value = p;\n            this.inform(\"query\", {\n                value: p,\n                results: u\n            });\n            var v = this._normalizeString(p).flatValue;\n            if ((((((q || !v) || this._isQueryTooShort(v)) || !this.queryEndpoint) || this.getQueryCache().hasOwnProperty(v)) || !this.shouldFetchMoreResults(u))) {\n                return false\n            };\n            this.inform(\"queryEndpoint\", {\n                value: p\n            });\n            this.fetch(this.queryEndpoint, this.getQueryData(p, t), {\n                value: p,\n                exclusions: r\n            });\n            return true;\n        },\n        _isQueryTooShort: function(p) {\n            return ((p.length < this._minQueryLength));\n        },\n        _normalizeString: function(p, q) {\n            var r = p;\n            if (this._kanaNormalization) {\n                r = n.normalizeHiragana(p);\n            };\n            return i.parse(r, q);\n        },\n        shouldFetchMoreResults: function(p) {\n            return (p.length < this._maxResults);\n        },\n        getQueryData: function(p, q) {\n            var r = j({\n                value: p\n            }, (this.queryData || {\n            }));\n            q = (q || []);\n            if (q.length) {\n                r.existing_ids = q.join(\",\");\n            };\n            if (this._bootstrapping) {\n                r.bsp = true;\n            };\n            return r;\n        },\n        setQueryData: function(p, q) {\n            if (q) {\n                this.queryData = {\n                };\n            };\n            j(this.queryData, p);\n            return this;\n        },\n        setBootstrapData: function(p, q) {\n            if (q) {\n                this.bootstrapData = {\n                };\n            };\n            j(this.bootstrapData, p);\n            return this;\n        },\n        getExclusions: function() {\n            return k(this._exclusions);\n        },\n        setExclusions: function(p) {\n            this._exclusions = (p || []);\n        },\n        addFilter: function(p) {\n            var q = this._filters;\n            q.push(p);\n            return {\n                remove: function() {\n                    q.splice(q.indexOf(p), 1);\n                }\n            };\n        },\n        clearFilters: function() {\n            this._filters = [];\n        },\n        respond: function(p, q, r) {\n            var s = this.buildData(q);\n            this.inform(\"respond\", {\n                value: p,\n                results: s,\n                isAsync: !!r\n            });\n            return s;\n        },\n        asyncErrorHandler: m,\n        fetch: function(p, q, r) {\n            if (!p) {\n                return\n            };\n            var s = new h().setURI(p).setData(q).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._acrossTransitions).setHandler(function(t) {\n                this.fetchHandler(t, (r || {\n                }));\n            }.bind(this));\n            if ((p === this.queryEndpoint)) {\n                s.setFinallyHandler(function() {\n                    this._activeQueries--;\n                    if (!this._activeQueries) {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                    };\n                }.bind(this));\n            };\n            s.setErrorHandler(this.asyncErrorHandler);\n            this.inform(\"beforeFetch\", {\n                request: s,\n                fetch_context: r\n            });\n            s.send();\n            if ((p === this.queryEndpoint)) {\n                if (!this._activeQueries) {\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                };\n                this._activeQueries++;\n            }\n        ;\n        },\n        fetchHandler: function(p, q) {\n            var r = q.value, s = q.exclusions;\n            if ((!r && q.replaceCache)) {\n                this.localCache = {\n                };\n            };\n            this.inform(\"buildQueryCache\", {\n            });\n            var t = p.getPayload().entries;\n            this.addEntries(t, r);\n            this.inform(\"fetchComplete\", {\n                entries: t,\n                response: p,\n                value: r,\n                fetch_context: q\n            });\n            var u = (((!r && this.value)) ? this.value : r);\n            this.respond(u, this.buildUids(u, [], s), true);\n            if (!r) {\n                if (this._bootstrapping) {\n                    this._bootstrapping = false;\n                    this.inform(\"bootstrap\", {\n                        bootstrapping: false\n                    });\n                }\n            ;\n                if ((q.token && (p.getPayload().token !== q.token))) {\n                    this.bootstrapWithToken();\n                };\n            }\n        ;\n        },\n        addEntries: function(p, q) {\n            var r = this.processEntries(k((p || [])), q), s = this.buildUids(q, r);\n            if (q) {\n                var t = this.getQueryCache();\n                t[this._normalizeString(q).flatValue] = s;\n            }\n             else this.fillCache(s);\n        ;\n        },\n        processEntries: function(p, q) {\n            return p.map(function(r, s) {\n                var t = (r.uid = (r.uid + \"\")), u = this.getEntry(t);\n                if (!u) {\n                    u = r;\n                    u.query = q;\n                    this.setEntry(t, u);\n                }\n                 else j(u, r);\n            ;\n                ((u.index === undefined) && (u.index = s));\n                return t;\n            }, this);\n        },\n        getAllEntries: function() {\n            return (this._data || {\n            });\n        },\n        getEntry: function(p) {\n            return (this._data[p] || null);\n        },\n        setEntry: function(p, q) {\n            this._data[p] = q;\n        },\n        fillCache: function(p) {\n            var q = this.localCache;\n            p.forEach(function(r) {\n                var s = this.getEntry(r);\n                if (!s) {\n                    return\n                };\n                s.bootstrapped = true;\n                var t = this._normalizeString(this.getTextToIndex(s)).tokens;\n                for (var u = 0, v = t.length; (u < v); ++u) {\n                    var w = t[u];\n                    if (!q.hasOwnProperty(w)) {\n                        q[w] = {\n                        };\n                    };\n                    q[w][r] = true;\n                };\n            }, this);\n        },\n        getTextToIndex: function(p) {\n            if ((p.textToIndex && !p.needs_update)) {\n                return p.textToIndex\n            };\n            p.needs_update = false;\n            p.textToIndex = this.getTextToIndexFromFields(p, this._indexedFields);\n            return p.textToIndex;\n        },\n        getTextToIndexFromFields: function(p, q) {\n            var r = [];\n            for (var s = 0; (s < q.length); ++s) {\n                var t = p[q[s]];\n                if (t) {\n                    r.push((t.join ? t.join(\" \") : t));\n                };\n            };\n            return r.join(\" \");\n        },\n        mergeUids: function(p, q, r, s) {\n            this.inform(\"mergeUids\", {\n                local_uids: p,\n                query_uids: q,\n                new_uids: r,\n                value: s\n            });\n            var t = function(u, v) {\n                var w = this.getEntry(u), x = this.getEntry(v);\n                if ((w.extended_match !== x.extended_match)) {\n                    return (w.extended_match ? 1 : -1)\n                };\n                if ((w.index !== x.index)) {\n                    return (w.index - x.index)\n                };\n                if ((w.text.length !== x.text.length)) {\n                    return (w.text.length - x.text.length)\n                };\n                return (w.uid < x.uid);\n            }.bind(this);\n            this._checkExtendedMatch(s, p);\n            return this.deduplicateByKey(p.sort(t).concat(q, r));\n        },\n        _checkExtendedMatch: function(p, q) {\n            var r = (this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch);\n            for (var s = 0; (s < q.length); ++s) {\n                var t = this.getEntry(q[s]);\n                t.extended_match = (t.tokens ? !r(p, t.text) : false);\n            };\n        },\n        buildUids: function(p, q, r) {\n            if (!q) {\n                q = [];\n            };\n            if (!p) {\n                return q\n            };\n            if (!r) {\n                r = [];\n            };\n            var s = this.buildCacheResults(p, this.localCache), t = this.buildQueryResults(p), u = this.mergeUids(s, t, q, p), v = l(r.concat(this._exclusions)), w = u.filter(function(x) {\n                if ((v.hasOwnProperty(x) || !this.getEntry(x))) {\n                    return false\n                };\n                for (var y = 0; (y < this._filters.length); ++y) {\n                    if (!this._filters[y](this.getEntry(x), p)) {\n                        return false\n                    };\n                };\n                return (v[x] = true);\n            }, this);\n            return this.uidsIncludingExact(p, w, v);\n        },\n        uidsIncludingExact: function(p, q) {\n            var r = q.length;\n            if (((p.length < this._minExactMatchLength) || (r <= this._maxResults))) {\n                return q\n            };\n            for (var s = 0; (s < r); ++s) {\n                var t = this.getEntry(q[s]);\n                (t.text_lower || (t.text_lower = t.text.toLowerCase()));\n                if ((t.text_lower === this._normalizeString(p).flatValue)) {\n                    if ((s >= this._maxResults)) {\n                        var u = q.splice(s, 1);\n                        q.splice((this._maxResults - 1), 0, u);\n                    }\n                ;\n                    break;\n                }\n            ;\n            };\n            return q;\n        },\n        buildData: function(p) {\n            var q = [], r = Math.min(p.length, this._maxResults);\n            for (var s = 0; (s < r); ++s) {\n                q.push(this.getEntry(p[s]));;\n            };\n            return q;\n        },\n        findQueryCache: function(p) {\n            var q = 0, r = null, s = this.getQueryCache();\n            if (this._queryExactMatch) {\n                return (s[p] || [])\n            };\n            for (var t in s) {\n                if (((p.indexOf(t) === 0) && (t.length > q))) {\n                    q = t.length;\n                    r = t;\n                }\n            ;\n            };\n            return (s[r] || []);\n        },\n        buildQueryResults: function(p) {\n            var q = this._normalizeString(p).flatValue, r = this.findQueryCache(q);\n            if (this.getQueryCache().hasOwnProperty(q)) {\n                return r\n            };\n            return this.filterQueryResults(p, r);\n        },\n        filterQueryResults: function(p, q) {\n            var r = (this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch);\n            return q.filter(function(s) {\n                return r(p, this.getTextToIndex(this.getEntry(s)));\n            }, this);\n        },\n        buildCacheResults: function(p, q) {\n            var r = this._normalizeString(p, this._alwaysPrefixMatch), s = (this._alwaysPrefixMatch ? r.sortedTokens : r.tokens), t = s.length, u = (r.isPrefixQuery ? (t - 1) : null), v = {\n            }, w = {\n            }, x = {\n            }, y = [], z = false, aa = {\n            }, ba = 0;\n            for (var ca = 0; (ca < t); ++ca) {\n                var da = s[ca];\n                if (!aa.hasOwnProperty(da)) {\n                    ba++;\n                    aa[da] = true;\n                }\n                 else continue;\n            ;\n                for (var ea in q) {\n                    if ((((!v.hasOwnProperty(ea) && (ea === da))) || ((((this._alwaysPrefixMatch || (u === ca))) && (ea.indexOf(da) === 0))))) {\n                        if ((ea === da)) {\n                            if (w.hasOwnProperty(ea)) {\n                                z = true;\n                            };\n                            v[ea] = true;\n                        }\n                         else {\n                            if ((v.hasOwnProperty(ea) || w.hasOwnProperty(ea))) {\n                                z = true;\n                            };\n                            w[ea] = true;\n                        }\n                    ;\n                        for (var fa in q[ea]) {\n                            if (((ca === 0) || ((x.hasOwnProperty(fa) && (x[fa] == (ba - 1)))))) {\n                                x[fa] = ba;\n                            };\n                        };\n                    }\n                ;\n                };\n            };\n            for (var ga in x) {\n                if ((x[ga] == ba)) {\n                    y.push(ga);\n                };\n            };\n            if ((z || (ba < t))) {\n                y = this.filterQueryResults(p, y);\n            };\n            if ((this._titleFields && (this._titleFields.length > 0))) {\n                y = this.filterNonTitleMatchQueryResults(p, y);\n            };\n            return y;\n        },\n        filterNonTitleMatchQueryResults: function(p, q) {\n            return q.filter(function(r) {\n                var s = this._normalizeString(p), t = s.tokens.length;\n                if ((t === 0)) {\n                    return true\n                };\n                var u = this.getTitleTerms(this.getEntry(r)), v = s.tokens[0];\n                return (((((t === 1)) || this._alwaysPrefixMatch)) ? i.isPrefixMatch(v, u) : i.isQueryMatch(v, u));\n            }, this);\n        },\n        getTitleTerms: function(p) {\n            if (!p.titleToIndex) {\n                p.titleToIndex = this.getTextToIndexFromFields(p, this._titleFields);\n            };\n            return p.titleToIndex;\n        },\n        deduplicateByKey: function(p) {\n            if (!this._deduplicationKey) {\n                return p\n            };\n            var q = l(p.map(this._getDeduplicationKey.bind(this)), p);\n            return p.filter(function(r) {\n                return (q[this._getDeduplicationKey(r)] == r);\n            }.bind(this));\n        },\n        _getDeduplicationKey: function(p) {\n            var q = this.getEntry(p);\n            return (q[this._deduplicationKey] || ((\"__\" + p) + \"__\"));\n        },\n        getQueryCache: function() {\n            return this.queryCache;\n        },\n        setMaxResults: function(p) {\n            this._maxResults = p;\n            (this.value && this.respond(this.value, this.buildUids(this.value)));\n        },\n        updateToken: function(p) {\n            this.token = p;\n            this.dirty();\n            return this;\n        }\n    });\n    e.exports = o;\n});\n__d(\"Ease\", [], function(a, b, c, d, e, f) {\n    var g = {\n        makePowerOut: function(h) {\n            return function(i) {\n                var j = (1 - Math.pow((1 - i), h));\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        makePowerIn: function(h) {\n            return function(i) {\n                var j = Math.pow(i, h);\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        makePowerInOut: function(h) {\n            return function(i) {\n                var j = ((((i *= 2) < 1)) ? (Math.pow(i, h) * 140977) : (1 - (Math.abs(Math.pow((2 - i), h)) * 141008)));\n                return ((((j * 10000) | 0)) / 10000);\n            };\n        },\n        sineOut: function(h) {\n            return Math.sin(((h * Math.PI) * 141086));\n        },\n        sineIn: function(h) {\n            return (1 - Math.cos(((h * Math.PI) * 141139)));\n        },\n        sineInOut: function(h) {\n            return (-141175 * ((Math.cos((Math.PI * h)) - 1)));\n        },\n        circOut: function(h) {\n            return Math.sqrt((1 - ((--h) * h)));\n        },\n        circIn: function(h) {\n            return -((Math.sqrt((1 - (h * h))) - 1));\n        },\n        circInOut: function(h) {\n            return ((((h *= 2) < 1)) ? (-141345 * ((Math.sqrt((1 - (h * h))) - 1))) : (141369 * ((Math.sqrt((1 - ((h -= 2) * h))) + 1))));\n        },\n        bounceOut: function(h) {\n            if ((h < (1 / 2.75))) {\n                return (((7.5625 * h) * h));\n            }\n             else if ((h < (2 / 2.75))) {\n                return ((((7.5625 * (h -= (1.5 / 2.75))) * h) + 141505));\n            }\n             else if ((h < (2.5 / 2.75))) {\n                return ((((7.5625 * (h -= (2.25 / 2.75))) * h) + 141563));\n            }\n             else return ((((7.5625 * (h -= (2.625 / 2.75))) * h) + 141609))\n            \n            \n        ;\n        },\n        bounceIn: function(h) {\n            return (1 - g.bounceOut((1 - h)));\n        },\n        bounceInOut: function(h) {\n            return (((h < 141703)) ? (g.bounceIn((h * 2)) * 141723) : ((g.bounceOut(((h * 2) - 1)) * 141745) + 141748));\n        },\n        _makeBouncy: function(h) {\n            h = (h || 1);\n            return function(i) {\n                i = (((((1 - Math.cos(((i * Math.PI) * h)))) * ((1 - i)))) + i);\n                return ((i <= 1) ? i : (2 - i));\n            };\n        },\n        makeBounceOut: function(h) {\n            return this._makeBouncy(h);\n        },\n        makeBounceIn: function(h) {\n            var i = this._makeBouncy(h);\n            return function(j) {\n                return (1 - i((1 - j)));\n            };\n        },\n        makeElasticOut: function(h, i) {\n            ((h < 1) && (h = 1));\n            var j = (Math.PI * 2);\n            return function(k) {\n                if (((k === 0) || (k === 1))) {\n                    return k\n                };\n                var l = ((i / j) * Math.asin((1 / h)));\n                return (((h * Math.pow(2, (-10 * k))) * Math.sin(((((k - l)) * j) / i))) + 1);\n            };\n        },\n        makeElasticIn: function(h, i) {\n            ((h < 1) && (h = 1));\n            var j = (Math.PI * 2);\n            return function(k) {\n                if (((k === 0) || (k === 1))) {\n                    return k\n                };\n                var l = ((i / j) * Math.asin((1 / h)));\n                return -(((h * Math.pow(2, (10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i))));\n            };\n        },\n        makeElasticInOut: function(h, i) {\n            ((h < 1) && (h = 1));\n            i *= 1.5;\n            var j = (Math.PI * 2);\n            return function(k) {\n                var l = ((i / j) * Math.asin((1 / h)));\n                return ((((k *= 2) < 1)) ? (((-142496 * h) * Math.pow(2, (10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i))) : (1 + (((142545 * h) * Math.pow(2, (-10 * (k -= 1)))) * Math.sin(((((k - l)) * j) / i)))));\n            };\n        },\n        makeBackOut: function(h) {\n            return function(i) {\n                return ((((--i * i) * (((((h + 1)) * i) + h))) + 1));\n            };\n        },\n        makeBackIn: function(h) {\n            return function(i) {\n                return ((i * i) * (((((h + 1)) * i) - h)));\n            };\n        },\n        makeBackInOut: function(h) {\n            h *= 1.525;\n            return function(i) {\n                return ((((i *= 2) < 1)) ? (142814 * (((i * i) * (((((h + 1)) * i) - h))))) : (142835 * (((((i -= 2) * i) * (((((h + 1)) * i) + h))) + 2))));\n            };\n        },\n        easeOutExpo: function(h) {\n            return (-Math.pow(2, (-10 * h)) + 1);\n        }\n    };\n    g.elasticOut = g.makeElasticOut(1, 142954);\n    g.elasticIn = g.makeElasticIn(1, 142988);\n    g.elasticInOut = g.makeElasticInOut(1, 143028);\n    g.backOut = g.makeBackOut(1.7);\n    g.backIn = g.makeBackIn(1.7);\n    g.backInOut = g.makeBackInOut(1.7);\n    e.exports = g;\n});\n__d(\"MultiBootstrapDataSource\", [\"Class\",\"DataSource\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\");\n    function i(j) {\n        this._bootstrapEndpoints = j.bootstrapEndpoints;\n        this.parent.construct(this, j);\n    };\n    g.extend(i, h);\n    i.prototype.bootstrapWithoutToken = function() {\n        for (var j = 0; (j < this._bootstrapEndpoints.length); j++) {\n            this.fetch(this._bootstrapEndpoints[j].endpoint, (this._bootstrapEndpoints[j].data || {\n            }), {\n                bootstrap: true\n            });;\n        };\n    };\n    e.exports = i;\n});\n__d(\"XHPTemplate\", [\"DataStore\",\"DOM\",\"HTML\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"copyProperties\");\n    function k(m) {\n        this._model = m;\n    };\n    j(k.prototype, {\n        render: function() {\n            if (i.isHTML(this._model)) {\n                this._model = h.setContent(document.createDocumentFragment(), this._model)[0];\n            };\n            return this._model.cloneNode(true);\n        },\n        build: function() {\n            return new l(this.render());\n        }\n    });\n    j(k, {\n        getNode: function(m, n) {\n            return k.getNodes(m)[n];\n        },\n        getNodes: function(m) {\n            var n = g.get(m, \"XHPTemplate:nodes\");\n            if (!n) {\n                n = {\n                };\n                var o = h.scry(m, \"[data-jsid]\");\n                o.push(m);\n                var p = o.length;\n                while (p--) {\n                    var q = o[p];\n                    n[q.getAttribute(\"data-jsid\")] = q;\n                    q.removeAttribute(\"data-jsid\");\n                };\n                g.set(m, \"XHPTemplate:nodes\", n);\n            }\n        ;\n            return n;\n        }\n    });\n    function l(m) {\n        this._root = m;\n        this._populateNodes();\n    };\n    j(l.prototype, {\n        _populateNodes: function() {\n            this._nodes = {\n            };\n            this._leaves = {\n            };\n            var m = this._root.getElementsByTagName(\"*\");\n            for (var n = 0, o = m.length; (n < o); n++) {\n                var p = m[n], q = p.getAttribute(\"data-jsid\");\n                if (q) {\n                    p.removeAttribute(\"data-jsid\");\n                    this._nodes[q] = p;\n                    this._leaves[q] = !p.childNodes.length;\n                }\n            ;\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNode: function(m) {\n            return this._nodes[m];\n        },\n        setNodeProperty: function(m, n, o) {\n            this.getNode(m)[n] = o;\n            return this;\n        },\n        setNodeContent: function(m, n) {\n            if (!this._leaves[m]) {\n                throw new Error((\"Can't setContent on non-leaf node: \" + m))\n            };\n            h.setContent(this.getNode(m), n);\n            return this;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Scrollable\", [\"Event\",\"Parent\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Parent\"), i = b(\"UserAgent\"), j = function(event) {\n        var m = h.byClass(event.getTarget(), \"scrollable\");\n        if (!m) {\n            return\n        };\n        if ((((((typeof event.axis !== \"undefined\") && (event.axis === event.HORIZONTAL_AXIS))) || ((event.wheelDeltaX && !event.wheelDeltaY))) || ((event.deltaX && !event.deltaY)))) {\n            return\n        };\n        var n = ((event.wheelDelta || -event.deltaY) || -event.detail), o = m.scrollHeight, p = m.clientHeight;\n        if ((o > p)) {\n            var q = m.scrollTop;\n            if (((((n > 0) && (q === 0))) || (((n < 0) && (q >= (o - p)))))) {\n                event.prevent();\n            }\n             else if ((i.ie() < 9)) {\n                if (m.currentStyle) {\n                    var r = m.currentStyle.fontSize;\n                    if ((r.indexOf(\"px\") < 0)) {\n                        var s = document.createElement(\"div\");\n                        s.style.fontSize = r;\n                        s.style.height = \"1em\";\n                        r = s.style.pixelHeight;\n                    }\n                     else r = parseInt(r, 10);\n                ;\n                    m.scrollTop = (q - Math.round(((n / 120) * r)));\n                    event.prevent();\n                }\n            \n            }\n        ;\n        }\n    ;\n    }, k = document.documentElement;\n    if (i.firefox()) {\n        var l = (((\"WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\");\n        k.addEventListener(l, j, false);\n    }\n     else g.listen(k, \"mousewheel\", j);\n;\n});\n__d(\"randomInt\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        var k = arguments.length;\n        g(((k > 0) && (k <= 2)));\n        if ((k === 1)) {\n            j = i;\n            i = 0;\n        }\n    ;\n        g((j > i));\n        var l = (this.random || Math.random);\n        return Math.floor((i + (l() * ((j - i)))));\n    };\n    e.exports = h;\n});");
// 1157
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s81fc64c5910c4e7af7041771eb415de765bf3aaa");
// 1158
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"XH2Cu\",]);\n}\n;\n;\n__d(\"AjaxRequest\", [\"ErrorUtils\",\"Keys\",\"URI\",\"UserAgent\",\"XHR\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"Keys\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"XHR\"), l = b(\"copyProperties\");\n    function m(q, r, s) {\n        this.xhr = k.create();\n        if (!((r instanceof i))) {\n            r = new i(r);\n        }\n    ;\n    ;\n        if (((s && ((q == \"GET\"))))) {\n            r.setQueryData(s);\n        }\n         else this._params = s;\n    ;\n    ;\n        this.method = q;\n        this.uri = r;\n        this.xhr.open(q, r);\n    };\n;\n    var n = ((window.JSBNG__XMLHttpRequest && ((\"withCredentials\" in new JSBNG__XMLHttpRequest()))));\n    m.supportsCORS = function() {\n        return n;\n    };\n    m.ERROR = \"ar:error\";\n    m.TIMEOUT = \"ar:timeout\";\n    m.PROXY_ERROR = \"ar:proxy error\";\n    m.TRANSPORT_ERROR = \"ar:transport error\";\n    m.SERVER_ERROR = \"ar:http error\";\n    m.PARSE_ERROR = \"ar:parse error\";\n    m._inflight = [];\n    function o() {\n        var q = m._inflight;\n        m._inflight = [];\n        q.forEach(function(r) {\n            r.abort();\n        });\n    };\n;\n    function p(q) {\n        q.onJSON = q.onError = q.onSuccess = null;\n        JSBNG__clearTimeout(q._timer);\n        if (((q.xhr && ((q.xhr.readyState < 4))))) {\n            q.xhr.abort();\n            q.xhr = null;\n        }\n    ;\n    ;\n        m._inflight = m._inflight.filter(function(r) {\n            return ((((((r && ((r != q)))) && r.xhr)) && ((r.xhr.readyState < 4))));\n        });\n    };\n;\n    l(m.prototype, {\n        timeout: 60000,\n        streamMode: true,\n        prelude: /^for \\(;;\\);/,\n        JSBNG__status: null,\n        _eol: -1,\n        _call: function(q) {\n            if (this[q]) {\n                this[q](this);\n            }\n        ;\n        ;\n        },\n        _parseStatus: function() {\n            var q;\n            try {\n                this.JSBNG__status = this.xhr.JSBNG__status;\n                q = this.xhr.statusText;\n            } catch (r) {\n                if (((this.xhr.readyState >= 4))) {\n                    this.errorType = m.TRANSPORT_ERROR;\n                    this.errorText = r.message;\n                }\n            ;\n            ;\n                return;\n            };\n        ;\n            if (((((this.JSBNG__status === 0)) && !(/^(file|ftp)/.test(this.uri))))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 100)) && ((this.JSBNG__status < 200))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 200)) && ((this.JSBNG__status < 300))))) {\n                return;\n            }\n             else if (((((this.JSBNG__status >= 300)) && ((this.JSBNG__status < 400))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 400)) && ((this.JSBNG__status < 500))))) {\n                this.errorType = m.SERVER_ERROR;\n            }\n             else if (((((this.JSBNG__status >= 500)) && ((this.JSBNG__status < 600))))) {\n                this.errorType = m.PROXY_ERROR;\n            }\n             else if (((this.JSBNG__status == 1223))) {\n                return;\n            }\n             else if (((((this.JSBNG__status >= 12001)) && ((this.JSBNG__status <= 12156))))) {\n                this.errorType = m.TRANSPORT_ERROR;\n            }\n             else {\n                q = ((\"unrecognized status code: \" + this.JSBNG__status));\n                this.errorType = m.ERROR;\n            }\n            \n            \n            \n            \n            \n            \n            \n        ;\n        ;\n            if (!this.errorText) {\n                this.errorText = q;\n            }\n        ;\n        ;\n        },\n        _parseResponse: function() {\n            var q, r = this.xhr.readyState;\n            try {\n                q = ((this.xhr.responseText || \"\"));\n            } catch (s) {\n                if (((r >= 4))) {\n                    this.errorType = m.ERROR;\n                    this.errorText = ((\"responseText not available - \" + s.message));\n                }\n            ;\n            ;\n                return;\n            };\n        ;\n            while (this.xhr) {\n                var t = ((this._eol + 1)), u = ((this.streamMode ? q.indexOf(\"\\u000a\", t) : q.length));\n                if (((((u < 0)) && ((r == 4))))) {\n                    u = q.length;\n                }\n            ;\n            ;\n                if (((u <= this._eol))) {\n                    break;\n                }\n            ;\n            ;\n                var v = q;\n                if (this.streamMode) {\n                    v = q.substr(t, ((u - t))).replace(/^\\s*|\\s*$/g, \"\");\n                }\n            ;\n            ;\n                if (((((t === 0)) && this.prelude))) {\n                    if (this.prelude.test(v)) {\n                        v = v.replace(this.prelude, \"\");\n                    }\n                ;\n                }\n            ;\n            ;\n                this._eol = u;\n                if (v) {\n                    try {\n                        this.json = JSON.parse(v);\n                    } catch (s) {\n                        var w = (((/(<body[\\S\\s]+?<\\/body>)/i).test(q) && RegExp.$1)), x = {\n                            message: s.message,\n                            char: t,\n                            excerpt: ((((((t === 0)) && w)) || v)).substr(512)\n                        };\n                        this.errorType = m.PARSE_ERROR;\n                        this.errorText = ((\"parse error - \" + JSON.stringify(x)));\n                        return;\n                    };\n                ;\n                    g.applyWithGuard(this._call, this, [\"onJSON\",]);\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onReadyState: function() {\n            var q = ((((this.xhr && this.xhr.readyState)) || 0));\n            if (((((this.JSBNG__status == null)) && ((q >= 2))))) {\n                this._parseStatus();\n            }\n        ;\n        ;\n            if (((!this.errorType && ((this.JSBNG__status != null))))) {\n                if (((((((q == 3)) && this.streamMode)) || ((q == 4))))) {\n                    this._parseResponse();\n                }\n            ;\n            }\n        ;\n        ;\n            if (((this.errorType || ((q == 4))))) {\n                this._time = ((JSBNG__Date.now() - this._sentAt));\n                this._call(((!this.errorType ? \"onSuccess\" : \"onError\")));\n                p(this);\n            }\n        ;\n        ;\n        },\n        send: function(q) {\n            this.xhr.JSBNG__onreadystatechange = function() {\n                g.applyWithGuard(this._onReadyState, this, arguments);\n            }.bind(this);\n            var r = this.timeout;\n            if (r) {\n                this._timer = JSBNG__setTimeout((function() {\n                    this.errorType = m.TIMEOUT;\n                    this.errorText = \"timeout\";\n                    this._time = ((JSBNG__Date.now() - this._sentAt));\n                    this._call(\"onError\");\n                    p(this);\n                }).bind(this), r, false);\n            }\n        ;\n        ;\n            m._inflight.push(this);\n            if (((this.method == \"POST\"))) {\n                this.xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            }\n        ;\n        ;\n            this._sentAt = JSBNG__Date.now();\n            this.xhr.send(((q ? i.implodeQuery(q) : \"\")));\n        },\n        abort: function() {\n            p(this);\n        },\n        toString: function() {\n            var q = ((\"[AjaxRequest readyState=\" + this.xhr.readyState));\n            if (this.errorType) {\n                q += ((((((((\" errorType=\" + this.errorType)) + \" (\")) + this.errorText)) + \")\"));\n            }\n        ;\n        ;\n            return ((q + \"]\"));\n        },\n        toJSON: function() {\n            var q = {\n                json: this.json,\n                JSBNG__status: this.JSBNG__status,\n                errorType: this.errorType,\n                errorText: this.errorText,\n                time: this._time\n            };\n            if (this.errorType) {\n                q.uri = this.uri;\n            }\n        ;\n        ;\n            {\n                var fin46keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin46i = (0);\n                var r;\n                for (; (fin46i < fin46keys.length); (fin46i++)) {\n                    ((r) = (fin46keys[fin46i]));\n                    {\n                        if (((q[r] == null))) {\n                            delete q[r];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return q;\n        }\n    });\n    if (((window.JSBNG__addEventListener && j.firefox()))) {\n        window.JSBNG__addEventListener(\"keydown\", function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === h.ESC))) {\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        }, false);\n    }\n;\n;\n    if (window.JSBNG__attachEvent) {\n        window.JSBNG__attachEvent(\"JSBNG__onunload\", o);\n    }\n;\n;\n    e.exports = m;\n});\n__d(\"FBAjaxRequest\", [\"AjaxRequest\",\"copyProperties\",\"XHR\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxRequest\"), h = b(\"copyProperties\"), i = b(\"XHR\");\n    function j(k, l, m) {\n        m = h(i.getAsyncParams(k), m);\n        var n = new g(k, l, m);\n        n.streamMode = false;\n        var o = n._call;\n        n._call = function(p) {\n            if (((((p == \"onJSON\")) && this.json))) {\n                if (this.json.error) {\n                    this.errorType = g.SERVER_ERROR;\n                    this.errorText = ((\"AsyncResponse error: \" + this.json.error));\n                }\n            ;\n            ;\n                this.json = this.json.payload;\n            }\n        ;\n        ;\n            o.apply(this, arguments);\n        };\n        n.ajaxReqSend = n.send;\n        n.send = function(p) {\n            this.ajaxReqSend(h(p, m));\n        };\n        return n;\n    };\n;\n    e.exports = j;\n});\n__d(\"CallbackManagerController\", [\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = b(\"copyProperties\"), i = function(j) {\n        this._pendingIDs = [];\n        this._allRequests = [undefined,];\n        this._callbackArgHandler = j;\n    };\n    h(i.prototype, {\n        executeOrEnqueue: function(j, k, l) {\n            l = ((l || {\n            }));\n            var m = this._attemptCallback(k, j, l);\n            if (m) {\n                return 0;\n            }\n        ;\n        ;\n            this._allRequests.push({\n                fn: k,\n                request: j,\n                options: l\n            });\n            var n = ((this._allRequests.length - 1));\n            this._pendingIDs.push(n);\n            return n;\n        },\n        unsubscribe: function(j) {\n            delete this._allRequests[j];\n        },\n        reset: function() {\n            this._allRequests = [];\n        },\n        getRequest: function(j) {\n            return this._allRequests[j];\n        },\n        runPossibleCallbacks: function() {\n            var j = this._pendingIDs;\n            this._pendingIDs = [];\n            var k = [];\n            j.forEach(function(l) {\n                var m = this._allRequests[l];\n                if (!m) {\n                    return;\n                }\n            ;\n            ;\n                if (this._callbackArgHandler(m.request, m.options)) {\n                    k.push(l);\n                }\n                 else this._pendingIDs.push(l);\n            ;\n            ;\n            }.bind(this));\n            k.forEach(function(l) {\n                var m = this._allRequests[l];\n                delete this._allRequests[l];\n                this._attemptCallback(m.fn, m.request, m.options);\n            }.bind(this));\n        },\n        _attemptCallback: function(j, k, l) {\n            var m = this._callbackArgHandler(k, l);\n            if (m) {\n                var n = {\n                    ids: k\n                };\n                g.applyWithGuard(j, n, m);\n            }\n        ;\n        ;\n            return !!m;\n        }\n    });\n    e.exports = i;\n});\n__d(\"deferred\", [], function(a, b, c, d, e, f) {\n    var g = 0, h = 1, i = 2, j = 4, k = \"callbacks\", l = \"errbacks\", m = \"cancelbacks\", n = \"completeCallbacks\", o = [], p = o.slice, q = o.unshift;\n    function r(x, y) {\n        return ((x ? p.call(x, y) : o));\n    };\n;\n    function s(x, y) {\n        return ((((y < x.length)) ? r(x, y) : o));\n    };\n;\n    function t() {\n        this.$Deferred0 = g;\n    };\n;\n    t.prototype.addCallback = function(x, y) {\n        return this.$Deferred1(h, this.$Deferred2(k), x, y, s(arguments, 2));\n    };\n    t.prototype.removeCallback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(k), x, y);\n    };\n    t.prototype.addCompleteCallback = function(x, y) {\n        return this.$Deferred1(null, this.$Deferred2(n), x, y, s(arguments, 2));\n    };\n    t.prototype.removeCompleteCallback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(n), x, y);\n    };\n    t.prototype.addErrback = function(x, y) {\n        return this.$Deferred1(i, this.$Deferred2(l), x, y, s(arguments, 2));\n    };\n    t.prototype.removeErrback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(l), x, y);\n    };\n    t.prototype.addCancelback = function(x, y) {\n        return this.$Deferred1(j, this.$Deferred2(m), x, y, s(arguments, 2));\n    };\n    t.prototype.removeCancelback = function(x, y) {\n        return this.$Deferred3(this.$Deferred2(m), x, y);\n    };\n    t.prototype.getStatus = function() {\n        return this.$Deferred0;\n    };\n    t.prototype.setStatus = function(x) {\n        var y;\n        this.$Deferred0 = x;\n        this.callbackArgs = r(arguments, 1);\n        if (((x === i))) {\n            y = l;\n        }\n         else if (((x === h))) {\n            y = k;\n        }\n         else if (((x === j))) {\n            y = m;\n        }\n        \n        \n    ;\n    ;\n        if (y) {\n            this.$Deferred4(this[y], this.callbackArgs);\n        }\n    ;\n    ;\n        this.$Deferred4(this[n], this.callbackArgs);\n        return this;\n    };\n    t.prototype.JSBNG__setTimeout = function(x) {\n        if (this.timeout) {\n            this.JSBNG__clearTimeout();\n        }\n    ;\n    ;\n        this.$Deferred5 = ((this.$Deferred5 || this.fail.bind(this)));\n        this.timeout = window.JSBNG__setTimeout(this.$Deferred5, x);\n    };\n    t.prototype.JSBNG__clearTimeout = function() {\n        window.JSBNG__clearTimeout(this.timeout);\n        delete this.timeout;\n    };\n    t.prototype.succeed = function() {\n        return this.$Deferred6(h, arguments);\n    };\n    t.prototype.fail = function() {\n        return this.$Deferred6(i, arguments);\n    };\n    t.prototype.cancel = function() {\n        delete this[k];\n        delete this[l];\n        return this.$Deferred6(j, arguments);\n    };\n    t.prototype.$Deferred6 = function(x, y) {\n        q.call(y, x);\n        return this.setStatus.apply(this, y);\n    };\n    t.prototype.$Deferred2 = function(x) {\n        return ((this[x] || (this[x] = [])));\n    };\n    t.prototype.then = function(x, y, z, aa) {\n        var ba = new t(), x, ca, da, ea = r(arguments, 0);\n        if (((typeof ea[0] === \"function\"))) {\n            x = ea.shift();\n        }\n    ;\n    ;\n        if (((typeof ea[0] === \"function\"))) {\n            ca = ea.shift();\n        }\n    ;\n    ;\n        if (((typeof ea[0] === \"function\"))) {\n            da = ea.shift();\n        }\n    ;\n    ;\n        var fa = ea.shift();\n        if (x) {\n            var ga = [this.$Deferred7,this,ba,\"succeed\",x,fa,].concat(ea);\n            this.addCallback.apply(this, ga);\n        }\n         else this.addCallback(ba.succeed, ba);\n    ;\n    ;\n        if (ca) {\n            var ha = [this.$Deferred7,this,ba,\"fail\",ca,fa,].concat(ea);\n            this.addErrback.apply(this, ha);\n        }\n         else this.addErrback(ba.fail, ba);\n    ;\n    ;\n        if (da) {\n            var ia = [this.$Deferred7,this,ba,\"cancel\",da,fa,].concat(ea);\n            this.addCancelback.apply(this, ia);\n        }\n         else this.addCancelback(ba.cancel, ba);\n    ;\n    ;\n        return ba;\n    };\n    t.prototype.$Deferred1 = function(x, y, z, aa, ba) {\n        var ca = this.getStatus();\n        if (((((!x && ((ca !== g)))) || ((ca === x))))) {\n            z.apply(((aa || this)), ba.concat(this.callbackArgs));\n        }\n         else y.push(z, aa, ba);\n    ;\n    ;\n        return this;\n    };\n    t.prototype.$Deferred3 = function(x, y, z) {\n        for (var aa = 0; ((aa < x.length)); aa += 3) {\n            if (((((x[aa] === y)) && ((!z || ((x[((aa + 1))] === z))))))) {\n                x.splice(aa, 3);\n                if (z) {\n                    break;\n                }\n            ;\n            ;\n                aa -= 3;\n            }\n        ;\n        ;\n        };\n    ;\n        return this;\n    };\n    t.prototype.pipe = function(x) {\n        this.addCallback(x.succeed, x).addErrback(x.fail, x).addCancelback(x.cancel, x);\n    };\n    t.prototype.$Deferred4 = function(x, y) {\n        for (var z = 0; ((z < ((x || o)).length)); z += 3) {\n            x[z].apply(((x[((z + 1))] || this)), ((x[((z + 2))] || o)).concat(y));\n        ;\n        };\n    ;\n    };\n    t.prototype.$Deferred7 = function(x, y, z, aa) {\n        var ba = r(arguments, 4), ca = z.apply(aa, ba);\n        if (((ca instanceof t))) {\n            ca.pipe(x);\n        }\n         else x[y](ca);\n    ;\n    ;\n    };\n    {\n        var fin47keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin47i = (0);\n        var u;\n        for (; (fin47i < fin47keys.length); (fin47i++)) {\n            ((u) = (fin47keys[fin47i]));\n            {\n                if (((t.hasOwnProperty(u) && ((u !== \"_metaprototype\"))))) {\n                    w[u] = t[u];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var v = ((((t === null)) ? null : t.prototype));\n    w.prototype = Object.create(v);\n    w.prototype.constructor = w;\n    w.__superConstructor__ = t;\n    function w(x) {\n        t.call(this);\n        this.completed = 0;\n        this.list = [];\n        if (x) {\n            x.forEach(this.waitFor, this);\n            this.startWaiting();\n        }\n    ;\n    ;\n    };\n;\n    w.prototype.startWaiting = function() {\n        this.waiting = true;\n        this.checkDeferreds();\n        return this;\n    };\n    w.prototype.waitFor = function(x) {\n        this.list.push(x);\n        this.checkDeferreds();\n        x.addCompleteCallback(this.deferredComplete, this);\n        return this;\n    };\n    w.prototype.createWaitForDeferred = function() {\n        var x = new t();\n        this.waitFor(x);\n        return x;\n    };\n    w.prototype.createWaitForCallback = function() {\n        var x = this.createWaitForDeferred();\n        return x.succeed.bind(x);\n    };\n    w.prototype.deferredComplete = function() {\n        this.completed++;\n        if (((this.completed === this.list.length))) {\n            this.checkDeferreds();\n        }\n    ;\n    ;\n    };\n    w.prototype.checkDeferreds = function() {\n        if (((!this.waiting || ((this.completed !== this.list.length))))) {\n            return;\n        }\n    ;\n    ;\n        var x = false, y = false, z = [g,];\n        for (var aa = 0, ba = this.list.length; ((aa < ba)); aa++) {\n            var ca = this.list[aa];\n            z.push([ca,].concat(ca.callbackArgs));\n            if (((ca.getStatus() === i))) {\n                x = true;\n            }\n             else if (((ca.getStatus() === j))) {\n                y = true;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (x) {\n            z[0] = i;\n            this.fail.apply(this, z);\n        }\n         else if (y) {\n            z[0] = j;\n            this.cancel.apply(this, z);\n        }\n         else {\n            z[0] = h;\n            this.succeed.apply(this, z);\n        }\n        \n    ;\n    ;\n    };\n    f.Deferred = t;\n    f.DeferredList = w;\n    f.Deferred.toArray = r;\n    f.Deferred.STATUS_UNKNOWN = g;\n    f.Deferred.STATUS_SUCCEEDED = h;\n    f.Deferred.STATUS_CANCELED = j;\n    f.Deferred.STATUS_FAILED = i;\n});\n__d(\"KeyedCallbackManager\", [\"CallbackManagerController\",\"deferred\",\"ErrorUtils\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"deferred\").Deferred, i = b(\"ErrorUtils\"), j = b(\"copyProperties\"), k = function() {\n        this._resources = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n    };\n    j(k.prototype, {\n        executeOrEnqueue: function(l, m) {\n            if (!((l instanceof Array))) {\n                var n = l, o = m;\n                l = [l,];\n                m = function(p) {\n                    o(p[n]);\n                };\n            }\n        ;\n        ;\n            l = l.filter(function(p) {\n                var q = ((((p !== null)) && ((p !== undefined))));\n                if (!q) {\n                    i.applyWithGuard(function() {\n                        throw new Error(((((\"KeyedCallbackManager.executeOrEnqueue: key \" + JSON.stringify(p))) + \" is invalid\")));\n                    });\n                }\n            ;\n            ;\n                return q;\n            });\n            return this._controller.executeOrEnqueue(l, m);\n        },\n        deferredExecuteOrEnqueue: function(l) {\n            var m = new h();\n            this.executeOrEnqueue(l, m.succeed.bind(m));\n            return m;\n        },\n        unsubscribe: function(l) {\n            this._controller.unsubscribe(l);\n        },\n        reset: function() {\n            this._controller.reset();\n            this._resources = {\n            };\n        },\n        getUnavailableResources: function(l) {\n            var m = this._controller.getRequest(l), n = [];\n            if (m) {\n                n = m.request.filter(function(o) {\n                    return !this._resources[o];\n                }.bind(this));\n            }\n        ;\n        ;\n            return n;\n        },\n        getUnavailableResourcesFromRequest: function(l) {\n            var m = ((Array.isArray(l) ? l : [l,]));\n            return m.filter(function(n) {\n                if (((((n !== null)) && ((n !== undefined))))) {\n                    return !this._resources[n];\n                }\n            ;\n            ;\n            }, this);\n        },\n        addResourcesAndExecute: function(l) {\n            j(this._resources, l);\n            this._controller.runPossibleCallbacks();\n        },\n        setResource: function(l, m) {\n            this._resources[l] = m;\n            this._controller.runPossibleCallbacks();\n        },\n        getResource: function(l) {\n            return this._resources[l];\n        },\n        getAllResources: function() {\n            return this._resources;\n        },\n        dumpResources: function() {\n            var l = {\n            };\n            {\n                var fin48keys = ((window.top.JSBNG_Replay.forInKeys)((this._resources))), fin48i = (0);\n                var m;\n                for (; (fin48i < fin48keys.length); (fin48i++)) {\n                    ((m) = (fin48keys[fin48i]));\n                    {\n                        var n = this._resources[m];\n                        if (((typeof n === \"object\"))) {\n                            n = j({\n                            }, n);\n                        }\n                    ;\n                    ;\n                        l[m] = n;\n                    };\n                };\n            };\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(l) {\n            var m = {\n            };\n            for (var n = 0; ((n < l.length)); n++) {\n                var o = l[n], p = this._resources[o];\n                if (((typeof p == \"undefined\"))) {\n                    return false;\n                }\n            ;\n            ;\n                m[o] = p;\n            };\n        ;\n            return [m,];\n        }\n    });\n    e.exports = k;\n});\n__d(\"BaseAsyncLoader\", [\"KeyedCallbackManager\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"copyProperties\"), i = {\n    };\n    function j(l, m, n) {\n        var o = new g(), p = false, q = [];\n        function r() {\n            if (((!q.length || p))) {\n                return;\n            }\n        ;\n        ;\n            p = true;\n            t.defer();\n        };\n    ;\n        function s(w) {\n            p = false;\n            w.forEach(o.unsubscribe.bind(o));\n            r();\n        };\n    ;\n        function t() {\n            var w = {\n            }, x = [];\n            q = q.filter(function(z) {\n                var aa = o.getUnavailableResources(z);\n                if (aa.length) {\n                    aa.forEach(function(ba) {\n                        w[ba] = true;\n                    });\n                    x.push(z);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            });\n            var y = Object.keys(w);\n            if (y.length) {\n                n(l, y, x, u.curry(x), v.curry(x));\n            }\n             else p = false;\n        ;\n        ;\n        };\n    ;\n        function u(w, x) {\n            var y = ((x.payload[m] || x.payload));\n            o.addResourcesAndExecute(y);\n            s(w);\n        };\n    ;\n        function v(w) {\n            s(w);\n        };\n    ;\n        return {\n            get: function(w, x) {\n                var y = o.executeOrEnqueue(w, x), z = o.getUnavailableResources(y);\n                if (z.length) {\n                    q.push(y);\n                    r();\n                }\n            ;\n            ;\n            },\n            getCachedKeys: function() {\n                return Object.keys(o.getAllResources());\n            },\n            getNow: function(w) {\n                return ((o.getResource(w) || null));\n            },\n            set: function(w) {\n                o.addResourcesAndExecute(w);\n            }\n        };\n    };\n;\n    function k(l, m) {\n        throw (\"BaseAsyncLoader can't be instantiated\");\n    };\n;\n    h(k.prototype, {\n        _getLoader: function() {\n            if (!i[this._endpoint]) {\n                i[this._endpoint] = j(this._endpoint, this._type, this.send);\n            }\n        ;\n        ;\n            return i[this._endpoint];\n        },\n        get: function(l, m) {\n            return this._getLoader().get(l, m);\n        },\n        getCachedKeys: function() {\n            return this._getLoader().getCachedKeys();\n        },\n        getNow: function(l) {\n            return this._getLoader().getNow(l);\n        },\n        reset: function() {\n            i[this._endpoint] = null;\n        },\n        set: function(l) {\n            this._getLoader().set(l);\n        }\n    });\n    e.exports = k;\n});\n__d(\"AjaxLoader\", [\"copyProperties\",\"FBAjaxRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"FBAjaxRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n;\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        var p = new h(\"GET\", k, {\n            ids: l\n        });\n        p.onJSON = function(q) {\n            n({\n                payload: q.json\n            });\n        };\n        p.onError = o;\n        p.send();\n    };\n    e.exports = j;\n});\n__d(\"ChannelConstants\", [], function(a, b, c, d, e, f) {\n    var g = \"channel/\", h = {\n        ON_SHUTDOWN: ((g + \"shutdown\")),\n        ON_INVALID_HISTORY: ((g + \"invalid_history\")),\n        ON_CONFIG: ((g + \"config\")),\n        ON_ENTER_STATE: ((g + \"enter_state\")),\n        ON_EXIT_STATE: ((g + \"exit_state\")),\n        OK: \"ok\",\n        ERROR: \"error\",\n        ERROR_MAX: \"error_max\",\n        ERROR_MISSING: \"error_missing\",\n        ERROR_MSG_TYPE: \"error_msg_type\",\n        ERROR_SHUTDOWN: \"error_shutdown\",\n        ERROR_STALE: \"error_stale\",\n        SYS_OWNER: \"sys_owner\",\n        SYS_NONOWNER: \"sys_nonowner\",\n        SYS_ONLINE: \"sys_online\",\n        SYS_OFFLINE: \"sys_offline\",\n        SYS_TIMETRAVEL: \"sys_timetravel\",\n        HINT_AUTH: \"shutdown auth\",\n        HINT_CONN: \"shutdown conn\",\n        HINT_DISABLED: \"shutdown disabled\",\n        HINT_INVALID_STATE: \"shutdown invalid state\",\n        HINT_MAINT: \"shutdown maint\",\n        HINT_UNSUPPORTED: \"shutdown unsupported\",\n        reason_Unknown: 0,\n        reason_AsyncError: 1,\n        reason_TooLong: 2,\n        reason_Refresh: 3,\n        reason_RefreshDelay: 4,\n        reason_UIRestart: 5,\n        reason_NeedSeq: 6,\n        reason_PrevFailed: 7,\n        reason_IFrameLoadGiveUp: 8,\n        reason_IFrameLoadRetry: 9,\n        reason_IFrameLoadRetryWorked: 10,\n        reason_PageTransitionRetry: 11,\n        reason_IFrameLoadMaxSubdomain: 12,\n        reason_NoChannelInfo: 13,\n        reason_NoChannelHost: 14,\n        CAPABILITY_VOIP: 8,\n        getArbiterType: function(i) {\n            return ((((g + \"message:\")) + i));\n        }\n    };\n    e.exports = h;\n});\n__d(\"ShortProfiles\", [\"ArbiterMixin\",\"AjaxLoader\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AjaxLoader\"), i = b(\"Env\"), j = b(\"FBAjaxRequest\"), k = b(\"JSLogger\"), l = b(\"copyProperties\"), m = \"/ajax/chat/user_info.php\", n = \"/ajax/chat/user_info_all.php\", o = new h(m, \"profiles\"), p = false, q = k.create(\"short_profiles\");\n    function r() {\n        if (!p) {\n            q.log(\"fetch_all\");\n            p = true;\n            var u = new j(\"GET\", n, {\n                viewer: i.user\n            });\n            u.onJSON = function(v) {\n                o.set(v.json);\n                t.inform(\"updated\");\n            };\n            u.send();\n        }\n    ;\n    ;\n    };\n;\n    function s(u) {\n        return JSON.parse(JSON.stringify(u));\n    };\n;\n    var t = {\n    };\n    l(t, g, {\n        get: function(u, v) {\n            this.getMulti([u,], function(w) {\n                v(w[u], u);\n            });\n        },\n        getMulti: function(u, v) {\n            function w(x) {\n                v(s(x));\n            };\n        ;\n            o.get(u, w);\n        },\n        getNow: function(u) {\n            return s(((o.getNow(u) || null)));\n        },\n        getNowUnsafe: function(u) {\n            return ((o.getNow(u) || null));\n        },\n        getCachedProfileIDs: function() {\n            return o.getCachedKeys();\n        },\n        hasAll: function() {\n            return p;\n        },\n        fetchAll: function() {\n            r();\n        },\n        set: function(u, v) {\n            var w = {\n            };\n            w[u] = v;\n            this.setMulti(w);\n        },\n        setMulti: function(u) {\n            o.set(s(u));\n        }\n    });\n    e.exports = t;\n});\n__d(\"ReactCurrentOwner\", [], function(a, b, c, d, e, f) {\n    var g = {\n        current: null\n    };\n    e.exports = g;\n});\n__d(\"CSSProperty\", [], function(a, b, c, d, e, f) {\n    var g = {\n        fillOpacity: true,\n        fontWeight: true,\n        opacity: true,\n        orphans: true,\n        zIndex: true,\n        zoom: true\n    }, h = {\n        background: {\n            backgroundImage: true,\n            backgroundPosition: true,\n            backgroundRepeat: true,\n            backgroundColor: true\n        },\n        border: {\n            borderWidth: true,\n            borderStyle: true,\n            borderColor: true\n        },\n        borderBottom: {\n            borderBottomWidth: true,\n            borderBottomStyle: true,\n            borderBottomColor: true\n        },\n        borderLeft: {\n            borderLeftWidth: true,\n            borderLeftStyle: true,\n            borderLeftColor: true\n        },\n        borderRight: {\n            borderRightWidth: true,\n            borderRightStyle: true,\n            borderRightColor: true\n        },\n        borderTop: {\n            borderTopWidth: true,\n            borderTopStyle: true,\n            borderTopColor: true\n        },\n        font: {\n            fontStyle: true,\n            fontVariant: true,\n            fontWeight: true,\n            fontSize: true,\n            lineHeight: true,\n            fontFamily: true\n        }\n    }, i = {\n        isUnitlessNumber: g,\n        shorthandPropertyExpansions: h\n    };\n    e.exports = i;\n});\n__d(\"dangerousStyleValue\", [\"CSSProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\");\n    function h(i, j) {\n        var k = ((((((j == null)) || ((typeof j === \"boolean\")))) || ((j === \"\"))));\n        if (k) {\n            return \"\";\n        }\n    ;\n    ;\n        var l = isNaN(j);\n        if (((((l || ((j === 0)))) || g.isUnitlessNumber[i]))) {\n            return ((\"\" + j));\n        }\n    ;\n    ;\n        return ((j + \"px\"));\n    };\n;\n    e.exports = h;\n});\n__d(\"throwIf\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        if (h) {\n            throw new Error(i);\n        }\n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"escapeTextForBrowser\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h, i = {\n        \"&\": \"&amp;\",\n        \"\\u003E\": \"&gt;\",\n        \"\\u003C\": \"&lt;\",\n        \"\\\"\": \"&quot;\",\n        \"'\": \"&#x27;\",\n        \"/\": \"&#x2f;\"\n    };\n    function j(l) {\n        return i[l];\n    };\n;\n    var k = function(l) {\n        var m = typeof l, n = ((m === \"object\"));\n        if (((((l === \"\")) || n))) {\n            return \"\";\n        }\n         else if (((m === \"string\"))) {\n            return l.replace(/[&><\"'\\/]/g, j);\n        }\n         else return ((\"\" + l)).replace(/[&><\"'\\/]/g, j)\n        \n    ;\n    };\n    e.exports = k;\n});\n__d(\"memoizeStringOnly\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = {\n        };\n        return function(j) {\n            if (i.hasOwnProperty(j)) {\n                return i[j];\n            }\n             else return i[j] = h.call(this, j)\n        ;\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"CSSPropertyOperations\", [\"CSSProperty\",\"dangerousStyleValue\",\"escapeTextForBrowser\",\"hyphenate\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSProperty\"), h = b(\"dangerousStyleValue\"), i = b(\"escapeTextForBrowser\"), j = b(\"hyphenate\"), k = b(\"memoizeStringOnly\"), l = k(function(n) {\n        return i(j(n));\n    }), m = {\n        createMarkupForStyles: function(n) {\n            var o = \"\";\n            {\n                var fin49keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin49i = (0);\n                var p;\n                for (; (fin49i < fin49keys.length); (fin49i++)) {\n                    ((p) = (fin49keys[fin49i]));\n                    {\n                        if (!n.hasOwnProperty(p)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var q = n[p];\n                        if (((q != null))) {\n                            o += ((l(p) + \":\"));\n                            o += ((h(p, q) + \";\"));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ((o || null));\n        },\n        setValueForStyles: function(n, o) {\n            var p = n.style;\n            {\n                var fin50keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin50i = (0);\n                var q;\n                for (; (fin50i < fin50keys.length); (fin50i++)) {\n                    ((q) = (fin50keys[fin50i]));\n                    {\n                        if (!o.hasOwnProperty(q)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var r = h(q, o[q]);\n                        if (r) {\n                            p[q] = r;\n                        }\n                         else {\n                            var s = g.shorthandPropertyExpansions[q];\n                            if (s) {\n                                {\n                                    var fin51keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin51i = (0);\n                                    var t;\n                                    for (; (fin51i < fin51keys.length); (fin51i++)) {\n                                        ((t) = (fin51keys[fin51i]));\n                                        {\n                                            p[t] = \"\";\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                             else p[q] = \"\";\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ExecutionEnvironment\", [], function(a, b, c, d, e, f) {\n    var g = ((typeof window !== \"undefined\")), h = {\n        canUseDOM: g,\n        canUseWorkers: ((typeof JSBNG__Worker !== \"undefined\")),\n        isInWorker: !g,\n        global: new Function(\"return this;\")()\n    };\n    e.exports = h;\n});\n__d(\"Danger\", [\"ExecutionEnvironment\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"throwIf\"), i, j, k, l, m = ((g.canUseDOM ? JSBNG__document.createElement(\"div\") : null)), n = {\n        option: [1,\"\\u003Cselect multiple=\\\"true\\\"\\u003E\",\"\\u003C/select\\u003E\",],\n        legend: [1,\"\\u003Cfieldset\\u003E\",\"\\u003C/fieldset\\u003E\",],\n        area: [1,\"\\u003Cmap\\u003E\",\"\\u003C/map\\u003E\",],\n        param: [1,\"\\u003Cobject\\u003E\",\"\\u003C/object\\u003E\",],\n        thead: [1,\"\\u003Ctable\\u003E\",\"\\u003C/table\\u003E\",],\n        tr: [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\",\"\\u003C/tbody\\u003E\\u003C/table\\u003E\",],\n        col: [2,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003C/tbody\\u003E\\u003Ccolgroup\\u003E\",\"\\u003C/colgroup\\u003E\\u003C/table\\u003E\",],\n        td: [3,\"\\u003Ctable\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\",\"\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\",]\n    };\n    n.optgroup = n.option;\n    n.tbody = n.thead;\n    n.tfoot = n.thead;\n    n.colgroup = n.thead;\n    n.caption = n.thead;\n    n.th = n.td;\n    var o = [1,\"?\\u003Cdiv\\u003E\",\"\\u003C/div\\u003E\",];\n    if (m) {\n        {\n            var fin52keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin52i = (0);\n            var p;\n            for (; (fin52i < fin52keys.length); (fin52i++)) {\n                ((p) = (fin52keys[fin52i]));\n                {\n                    if (!n.hasOwnProperty(p)) {\n                        continue;\n                    }\n                ;\n                ;\n                    m.innerHTML = ((((((((\"\\u003C\" + p)) + \"\\u003E\\u003C/\")) + p)) + \"\\u003E\"));\n                    if (m.firstChild) {\n                        n[p] = null;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        m.innerHTML = \"\\u003Clink /\\u003E\";\n        if (m.firstChild) {\n            o = null;\n        }\n    ;\n    ;\n    }\n;\n;\n    function q(w) {\n        var x = m, y = w.substring(1, w.indexOf(\" \")), z = ((n[y.toLowerCase()] || o));\n        if (z) {\n            x.innerHTML = ((((z[1] + w)) + z[2]));\n            var aa = z[0];\n            while (aa--) {\n                x = x.lastChild;\n            ;\n            };\n        ;\n        }\n         else x.innerHTML = w;\n    ;\n    ;\n        return x.childNodes;\n    };\n;\n    function r(w, x, y) {\n        if (y) {\n            if (y.nextSibling) {\n                return w.insertBefore(x, y.nextSibling);\n            }\n             else return w.appendChild(x)\n        ;\n        }\n         else return w.insertBefore(x, w.firstChild)\n    ;\n    };\n;\n    function s(w, x, y) {\n        var z, aa = x.length;\n        for (var ba = 0; ((ba < aa)); ba++) {\n            z = r(w, x[0], ((z || y)));\n        ;\n        };\n    ;\n    };\n;\n    function t(w, x, y) {\n        var z = q(x), aa = ((y ? w.childNodes[((y - 1))] : null));\n        s(w, z, aa);\n    };\n;\n    function u(w, x) {\n        var y = w.parentNode, z = q(x);\n        y.replaceChild(z[0], w);\n    };\n;\n    var v = {\n        dangerouslyInsertMarkupAt: t,\n        dangerouslyReplaceNodeWithMarkup: u\n    };\n    e.exports = v;\n});\n__d(\"insertNodeAt\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        var k = h.childNodes, l = h.childNodes[j];\n        if (((l === i))) {\n            return i;\n        }\n    ;\n    ;\n        if (i.parentNode) {\n            i.parentNode.removeChild(i);\n        }\n    ;\n    ;\n        if (((j >= k.length))) {\n            h.appendChild(i);\n        }\n         else h.insertBefore(i, k[j]);\n    ;\n    ;\n        return i;\n    };\n;\n    e.exports = g;\n});\n__d(\"keyOf\", [], function(a, b, c, d, e, f) {\n    var g = function(h) {\n        var i;\n        {\n            var fin53keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin53i = (0);\n            (0);\n            for (; (fin53i < fin53keys.length); (fin53i++)) {\n                ((i) = (fin53keys[fin53i]));\n                {\n                    if (!h.hasOwnProperty(i)) {\n                        continue;\n                    }\n                ;\n                ;\n                    return i;\n                };\n            };\n        };\n    ;\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"DOMChildrenOperations\", [\"Danger\",\"insertNodeAt\",\"keyOf\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"Danger\"), h = b(\"insertNodeAt\"), i = b(\"keyOf\"), j = b(\"throwIf\"), k, l = i({\n        moveFrom: null\n    }), m = i({\n        insertMarkup: null\n    }), n = i({\n        removeAt: null\n    }), o = function(t, u) {\n        var v, w, x;\n        for (var y = 0; ((y < u.length)); y++) {\n            w = u[y];\n            if (((l in w))) {\n                v = ((v || []));\n                x = w.moveFrom;\n                v[x] = t.childNodes[x];\n            }\n             else if (((n in w))) {\n                v = ((v || []));\n                x = w.removeAt;\n                v[x] = t.childNodes[x];\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return v;\n    }, p = function(t, u) {\n        for (var v = 0; ((v < u.length)); v++) {\n            var w = u[v];\n            if (w) {\n                t.removeChild(u[v]);\n            }\n        ;\n        ;\n        };\n    ;\n    }, q = function(t, u, v) {\n        var w, x, y = -1, z;\n        for (var aa = 0; ((aa < u.length)); aa++) {\n            z = u[aa];\n            if (((l in z))) {\n                w = v[z.moveFrom];\n                x = z.finalIndex;\n                h(t, w, x);\n            }\n             else if (!((n in z))) {\n                if (((m in z))) {\n                    x = z.finalIndex;\n                    var ba = z.insertMarkup;\n                    g.dangerouslyInsertMarkupAt(t, ba, x);\n                }\n            ;\n            }\n            \n        ;\n        ;\n        };\n    ;\n    }, r = function(t, u) {\n        var v = o(t, u);\n        if (v) {\n            p(t, v);\n        }\n    ;\n    ;\n        q(t, u, v);\n    }, s = {\n        dangerouslyReplaceNodeWithMarkup: g.dangerouslyReplaceNodeWithMarkup,\n        manageChildren: r\n    };\n    e.exports = s;\n});\n__d(\"DOMProperty\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        MUST_USE_ATTRIBUTE: 1,\n        MUST_USE_PROPERTY: 2,\n        HAS_BOOLEAN_VALUE: 4,\n        HAS_SIDE_EFFECTS: 8,\n        injectDOMPropertyConfig: function(k) {\n            var l = ((k.Properties || {\n            })), m = ((k.DOMAttributeNames || {\n            })), n = ((k.DOMPropertyNames || {\n            })), o = ((k.DOMMutationMethods || {\n            }));\n            if (k.isCustomAttribute) {\n                j._isCustomAttributeFunctions.push(k.isCustomAttribute);\n            }\n        ;\n        ;\n            {\n                var fin54keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin54i = (0);\n                var p;\n                for (; (fin54i < fin54keys.length); (fin54i++)) {\n                    ((p) = (fin54keys[fin54i]));\n                    {\n                        g(!j.isStandardName[p]);\n                        j.isStandardName[p] = true;\n                        j.getAttributeName[p] = ((m[p] || p.toLowerCase()));\n                        j.getPropertyName[p] = ((n[p] || p));\n                        var q = o[p];\n                        if (q) {\n                            j.getMutationMethod[p] = q;\n                        }\n                    ;\n                    ;\n                        var r = l[p];\n                        j.mustUseAttribute[p] = ((r & h.MUST_USE_ATTRIBUTE));\n                        j.mustUseProperty[p] = ((r & h.MUST_USE_PROPERTY));\n                        j.hasBooleanValue[p] = ((r & h.HAS_BOOLEAN_VALUE));\n                        j.hasSideEffects[p] = ((r & h.HAS_SIDE_EFFECTS));\n                        g(((!j.mustUseAttribute[p] || !j.mustUseProperty[p])));\n                        g(((j.mustUseProperty[p] || !j.hasSideEffects[p])));\n                    };\n                };\n            };\n        ;\n        }\n    }, i = {\n    }, j = {\n        isStandardName: {\n        },\n        getAttributeName: {\n        },\n        getPropertyName: {\n        },\n        getMutationMethod: {\n        },\n        mustUseAttribute: {\n        },\n        mustUseProperty: {\n        },\n        hasBooleanValue: {\n        },\n        hasSideEffects: {\n        },\n        _isCustomAttributeFunctions: [],\n        isCustomAttribute: function(k) {\n            return j._isCustomAttributeFunctions.some(function(l) {\n                return l.call(null, k);\n            });\n        },\n        getDefaultValueForProperty: function(k, l) {\n            var m = i[k], n;\n            if (!m) {\n                i[k] = m = {\n                };\n            }\n        ;\n        ;\n            if (!((l in m))) {\n                n = JSBNG__document.createElement(k);\n                m[l] = n[l];\n            }\n        ;\n        ;\n            return m[l];\n        },\n        injection: h\n    };\n    e.exports = j;\n});\n__d(\"DOMPropertyOperations\", [\"DOMProperty\",\"escapeTextForBrowser\",\"memoizeStringOnly\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = b(\"escapeTextForBrowser\"), i = b(\"memoizeStringOnly\"), j = i(function(l) {\n        return ((h(l) + \"=\\\"\"));\n    }), k = {\n        createMarkupForProperty: function(l, m) {\n            if (g.isStandardName[l]) {\n                if (((((m == null)) || ((g.hasBooleanValue[l] && !m))))) {\n                    return \"\";\n                }\n            ;\n            ;\n                var n = g.getAttributeName[l];\n                return ((((j(n) + h(m))) + \"\\\"\"));\n            }\n             else if (g.isCustomAttribute(l)) {\n                if (((m == null))) {\n                    return \"\";\n                }\n            ;\n            ;\n                return ((((j(l) + h(m))) + \"\\\"\"));\n            }\n             else return null\n            \n        ;\n        },\n        setValueForProperty: function(l, m, n) {\n            if (g.isStandardName[m]) {\n                var o = g.getMutationMethod[m];\n                if (o) {\n                    o(l, n);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    if (((g.hasBooleanValue[m] && !n))) {\n                        l.removeAttribute(g.getAttributeName[m]);\n                    }\n                     else l.setAttribute(g.getAttributeName[m], n);\n                ;\n                ;\n                }\n                 else {\n                    var p = g.getPropertyName[m];\n                    if (((!g.hasSideEffects[m] || ((l[p] !== n))))) {\n                        l[p] = n;\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.setAttribute(m, n);\n            }\n            \n        ;\n        ;\n        },\n        deleteValueForProperty: function(l, m) {\n            if (g.isStandardName[m]) {\n                var n = g.getMutationMethod[m];\n                if (n) {\n                    n(l, undefined);\n                }\n                 else if (g.mustUseAttribute[m]) {\n                    l.removeAttribute(g.getAttributeName[m]);\n                }\n                 else {\n                    var o = g.getPropertyName[m];\n                    l[o] = g.getDefaultValueForProperty(l.nodeName, m);\n                }\n                \n            ;\n            ;\n            }\n             else if (g.isCustomAttribute(m)) {\n                l.removeAttribute(m);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"keyMirror\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"NOT_OBJECT_ERROR\", i = function(j) {\n        var k = {\n        }, l;\n        g(((!((j instanceof Object)) || Array.isArray(j))), h);\n        {\n            var fin55keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin55i = (0);\n            (0);\n            for (; (fin55i < fin55keys.length); (fin55i++)) {\n                ((l) = (fin55keys[fin55i]));\n                {\n                    if (!j.hasOwnProperty(l)) {\n                        continue;\n                    }\n                ;\n                ;\n                    k[l] = l;\n                };\n            };\n        };\n    ;\n        return k;\n    };\n    e.exports = i;\n});\n__d(\"EventConstants\", [\"keyMirror\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = g({\n        bubbled: null,\n        captured: null\n    }), i = g({\n        topBlur: null,\n        topChange: null,\n        topClick: null,\n        topDOMCharacterDataModified: null,\n        topDoubleClick: null,\n        topDrag: null,\n        topDragEnd: null,\n        topDragEnter: null,\n        topDragExit: null,\n        topDragLeave: null,\n        topDragOver: null,\n        topDragStart: null,\n        topDrop: null,\n        topFocus: null,\n        topInput: null,\n        topKeyDown: null,\n        topKeyPress: null,\n        topKeyUp: null,\n        topMouseDown: null,\n        topMouseMove: null,\n        topMouseOut: null,\n        topMouseOver: null,\n        topMouseUp: null,\n        topScroll: null,\n        topSelectionChange: null,\n        topSubmit: null,\n        topTouchCancel: null,\n        topTouchEnd: null,\n        topTouchMove: null,\n        topTouchStart: null,\n        topWheel: null\n    }), j = {\n        topLevelTypes: i,\n        PropagationPhases: h\n    };\n    e.exports = j;\n});\n__d(\"EventListener\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        listen: g.listen,\n        capture: function(i, j, k) {\n            if (!i.JSBNG__addEventListener) {\n                return;\n            }\n             else i.JSBNG__addEventListener(j, k, true);\n        ;\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"CallbackRegistry\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        putListener: function(i, j, k) {\n            var l = ((g[j] || (g[j] = {\n            })));\n            l[i] = k;\n        },\n        getListener: function(i, j) {\n            var k = g[j];\n            return ((k && k[i]));\n        },\n        deleteListener: function(i, j) {\n            var k = g[j];\n            if (k) {\n                delete k[i];\n            }\n        ;\n        ;\n        },\n        deleteAllListeners: function(i) {\n            {\n                var fin56keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin56i = (0);\n                var j;\n                for (; (fin56i < fin56keys.length); (fin56i++)) {\n                    ((j) = (fin56keys[fin56i]));\n                    {\n                        delete g[j][i];\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        __purge: function() {\n            g = {\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"EventPluginRegistry\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = null, i = {\n    };\n    function j() {\n        if (!h) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin57keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin57i = (0);\n            var n;\n            for (; (fin57i < fin57keys.length); (fin57i++)) {\n                ((n) = (fin57keys[fin57i]));\n                {\n                    var o = i[n], p = h.indexOf(n);\n                    g(((p > -1)));\n                    if (m.plugins[p]) {\n                        continue;\n                    }\n                ;\n                ;\n                    g(o.extractEvents);\n                    m.plugins[p] = o;\n                    var q = o.eventTypes;\n                    {\n                        var fin58keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin58i = (0);\n                        var r;\n                        for (; (fin58i < fin58keys.length); (fin58i++)) {\n                            ((r) = (fin58keys[fin58i]));\n                            {\n                                g(k(q[r], o));\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function k(n, o) {\n        var p = n.phasedRegistrationNames;\n        if (p) {\n            {\n                var fin59keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin59i = (0);\n                var q;\n                for (; (fin59i < fin59keys.length); (fin59i++)) {\n                    ((q) = (fin59keys[fin59i]));\n                    {\n                        if (p.hasOwnProperty(q)) {\n                            var r = p[q];\n                            l(r, o);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return true;\n        }\n         else if (n.registrationName) {\n            l(n.registrationName, o);\n            return true;\n        }\n        \n    ;\n    ;\n        return false;\n    };\n;\n    function l(n, o) {\n        g(!m.registrationNames[n]);\n        m.registrationNames[n] = o;\n        m.registrationNamesKeys.push(n);\n    };\n;\n    var m = {\n        plugins: [],\n        registrationNames: {\n        },\n        registrationNamesKeys: [],\n        injectEventPluginOrder: function(n) {\n            g(!h);\n            h = Array.prototype.slice.call(n);\n            j();\n        },\n        injectEventPluginsByName: function(n) {\n            var o = false;\n            {\n                var fin60keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin60i = (0);\n                var p;\n                for (; (fin60i < fin60keys.length); (fin60i++)) {\n                    ((p) = (fin60keys[fin60i]));\n                    {\n                        if (!n.hasOwnProperty(p)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var q = n[p];\n                        if (((i[p] !== q))) {\n                            g(!i[p]);\n                            i[p] = q;\n                            o = true;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (o) {\n                j();\n            }\n        ;\n        ;\n        },\n        getPluginModuleForEvent: function(JSBNG__event) {\n            var n = JSBNG__event.dispatchConfig;\n            if (n.registrationName) {\n                return ((m.registrationNames[n.registrationName] || null));\n            }\n        ;\n        ;\n            {\n                var fin61keys = ((window.top.JSBNG_Replay.forInKeys)((n.phasedRegistrationNames))), fin61i = (0);\n                var o;\n                for (; (fin61i < fin61keys.length); (fin61i++)) {\n                    ((o) = (fin61keys[fin61i]));\n                    {\n                        if (!n.phasedRegistrationNames.hasOwnProperty(o)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var p = m.registrationNames[n.phasedRegistrationNames[o]];\n                        if (p) {\n                            return p;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return null;\n        },\n        _resetEventPlugins: function() {\n            h = null;\n            {\n                var fin62keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin62i = (0);\n                var n;\n                for (; (fin62i < fin62keys.length); (fin62i++)) {\n                    ((n) = (fin62keys[fin62i]));\n                    {\n                        if (i.hasOwnProperty(n)) {\n                            delete i[n];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            m.plugins.length = 0;\n            var o = m.registrationNames;\n            {\n                var fin63keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin63i = (0);\n                var p;\n                for (; (fin63i < fin63keys.length); (fin63i++)) {\n                    ((p) = (fin63keys[fin63i]));\n                    {\n                        if (o.hasOwnProperty(p)) {\n                            delete o[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            m.registrationNamesKeys.length = 0;\n        }\n    };\n    e.exports = m;\n});\n__d(\"EventPluginUtils\", [\"EventConstants\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"invariant\"), i = g.topLevelTypes;\n    function j(u) {\n        return ((((((u === i.topMouseUp)) || ((u === i.topTouchEnd)))) || ((u === i.topTouchCancel))));\n    };\n;\n    function k(u) {\n        return ((((u === i.topMouseMove)) || ((u === i.topTouchMove))));\n    };\n;\n    function l(u) {\n        return ((((u === i.topMouseDown)) || ((u === i.topTouchStart))));\n    };\n;\n    var m;\n    function n(JSBNG__event, u) {\n        var v = JSBNG__event._dispatchListeners, w = JSBNG__event._dispatchIDs;\n        if (Array.isArray(v)) {\n            for (var x = 0; ((x < v.length)); x++) {\n                if (JSBNG__event.isPropagationStopped()) {\n                    break;\n                }\n            ;\n            ;\n                u(JSBNG__event, v[x], w[x]);\n            };\n        ;\n        }\n         else if (v) {\n            u(JSBNG__event, v, w);\n        }\n        \n    ;\n    ;\n    };\n;\n    function o(JSBNG__event, u, v) {\n        u(JSBNG__event, v);\n    };\n;\n    function p(JSBNG__event, u) {\n        n(JSBNG__event, u);\n        JSBNG__event._dispatchListeners = null;\n        JSBNG__event._dispatchIDs = null;\n    };\n;\n    function q(JSBNG__event) {\n        var u = JSBNG__event._dispatchListeners, v = JSBNG__event._dispatchIDs;\n        if (Array.isArray(u)) {\n            for (var w = 0; ((w < u.length)); w++) {\n                if (JSBNG__event.isPropagationStopped()) {\n                    break;\n                }\n            ;\n            ;\n                if (u[w](JSBNG__event, v[w])) {\n                    return v[w];\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else if (u) {\n            if (u(JSBNG__event, v)) {\n                return v;\n            }\n        ;\n        }\n        \n    ;\n    ;\n        return null;\n    };\n;\n    function r(JSBNG__event) {\n        var u = JSBNG__event._dispatchListeners, v = JSBNG__event._dispatchIDs;\n        h(!Array.isArray(u));\n        var w = ((u ? u(JSBNG__event, v) : null));\n        JSBNG__event._dispatchListeners = null;\n        JSBNG__event._dispatchIDs = null;\n        return w;\n    };\n;\n    function s(JSBNG__event) {\n        return !!JSBNG__event._dispatchListeners;\n    };\n;\n    var t = {\n        isEndish: j,\n        isMoveish: k,\n        isStartish: l,\n        executeDispatchesInOrder: p,\n        executeDispatchesInOrderStopAtTrue: q,\n        executeDirectDispatch: r,\n        hasDispatches: s,\n        executeDispatch: o\n    };\n    e.exports = t;\n});\n__d(\"accumulate\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"INVALID_ACCUM_ARGS\";\n    function i(j, k) {\n        var l = ((j == null)), m = ((k === null));\n        if (m) {\n            return j;\n        }\n         else if (l) {\n            return k;\n        }\n         else {\n            var n = Array.isArray(j), o = Array.isArray(k);\n            if (n) {\n                return j.concat(k);\n            }\n             else if (o) {\n                return [j,].concat(k);\n            }\n             else return [j,k,]\n            \n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"forEachAccumulated\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i, j) {\n        if (Array.isArray(h)) {\n            h.forEach(i, j);\n        }\n         else if (h) {\n            i.call(j, h);\n        }\n        \n    ;\n    ;\n    };\n    e.exports = g;\n});\n__d(\"EventPropagators\", [\"CallbackRegistry\",\"EventConstants\",\"accumulate\",\"forEachAccumulated\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventConstants\"), i = b(\"accumulate\"), j = b(\"forEachAccumulated\"), k = g.getListener, l = h.PropagationPhases, m = {\n        InstanceHandle: null,\n        injectInstanceHandle: function(w) {\n            m.InstanceHandle = w;\n        },\n        validate: function() {\n            var w = ((((!m.InstanceHandle || !m.InstanceHandle.traverseTwoPhase)) || !m.InstanceHandle.traverseEnterLeave));\n            if (w) {\n                throw new Error(\"InstanceHandle not injected before use!\");\n            }\n        ;\n        ;\n        }\n    };\n    function n(w, JSBNG__event, x) {\n        var y = JSBNG__event.dispatchConfig.phasedRegistrationNames[x];\n        return k(w, y);\n    };\n;\n    function o(w, x, JSBNG__event) {\n        var y = ((x ? l.bubbled : l.captured)), z = n(w, JSBNG__event, y);\n        if (z) {\n            JSBNG__event._dispatchListeners = i(JSBNG__event._dispatchListeners, z);\n            JSBNG__event._dispatchIDs = i(JSBNG__event._dispatchIDs, w);\n        }\n    ;\n    ;\n    };\n;\n    function p(JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.phasedRegistrationNames))) {\n            m.InstanceHandle.traverseTwoPhase(JSBNG__event.dispatchMarker, o, JSBNG__event);\n        }\n    ;\n    ;\n    };\n;\n    function q(w, x, JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.registrationName))) {\n            var y = JSBNG__event.dispatchConfig.registrationName, z = k(w, y);\n            if (z) {\n                JSBNG__event._dispatchListeners = i(JSBNG__event._dispatchListeners, z);\n                JSBNG__event._dispatchIDs = i(JSBNG__event._dispatchIDs, w);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function r(JSBNG__event) {\n        if (((JSBNG__event && JSBNG__event.dispatchConfig.registrationName))) {\n            q(JSBNG__event.dispatchMarker, null, JSBNG__event);\n        }\n    ;\n    ;\n    };\n;\n    function s(w) {\n        j(w, p);\n    };\n;\n    function t(w, x, y, z) {\n        m.InstanceHandle.traverseEnterLeave(y, z, q, w, x);\n    };\n;\n    function u(w) {\n        j(w, r);\n    };\n;\n    var v = {\n        accumulateTwoPhaseDispatches: s,\n        accumulateDirectDispatches: u,\n        accumulateEnterLeaveDispatches: t,\n        injection: m\n    };\n    e.exports = v;\n});\n__d(\"EventPluginHub\", [\"CallbackRegistry\",\"EventPluginRegistry\",\"EventPluginUtils\",\"EventPropagators\",\"ExecutionEnvironment\",\"accumulate\",\"forEachAccumulated\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackRegistry\"), h = b(\"EventPluginRegistry\"), i = b(\"EventPluginUtils\"), j = b(\"EventPropagators\"), k = b(\"ExecutionEnvironment\"), l = b(\"accumulate\"), m = b(\"forEachAccumulated\"), n = b(\"invariant\"), o = null, p = function(JSBNG__event) {\n        if (JSBNG__event) {\n            var r = i.executeDispatch, s = h.getPluginModuleForEvent(JSBNG__event);\n            if (((s && s.executeDispatch))) {\n                r = s.executeDispatch;\n            }\n        ;\n        ;\n            i.executeDispatchesInOrder(JSBNG__event, r);\n            if (!JSBNG__event.isPersistent()) {\n                JSBNG__event.constructor.release(JSBNG__event);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, q = {\n        injection: {\n            injectInstanceHandle: j.injection.injectInstanceHandle,\n            injectEventPluginOrder: h.injectEventPluginOrder,\n            injectEventPluginsByName: h.injectEventPluginsByName\n        },\n        registrationNames: h.registrationNames,\n        putListener: g.putListener,\n        getListener: g.getListener,\n        deleteListener: g.deleteListener,\n        deleteAllListeners: g.deleteAllListeners,\n        extractEvents: function(r, s, t, u) {\n            var v, w = h.plugins;\n            for (var x = 0, y = w.length; ((x < y)); x++) {\n                var z = w[x];\n                if (z) {\n                    var aa = z.extractEvents(r, s, t, u);\n                    if (aa) {\n                        v = l(v, aa);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return v;\n        },\n        enqueueEvents: function(r) {\n            if (r) {\n                o = l(o, r);\n            }\n        ;\n        ;\n        },\n        processEventQueue: function() {\n            var r = o;\n            o = null;\n            m(r, p);\n            n(!o);\n        }\n    };\n    if (k.canUseDOM) {\n        window.EventPluginHub = q;\n    }\n;\n;\n    e.exports = q;\n});\n__d(\"ReactUpdates\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = false, i = [];\n    function j(m) {\n        if (h) {\n            m();\n            return;\n        }\n    ;\n    ;\n        h = true;\n        try {\n            m();\n            for (var o = 0; ((o < i.length)); o++) {\n                var p = i[o];\n                if (p.isMounted()) {\n                    var q = p._pendingCallbacks;\n                    p._pendingCallbacks = null;\n                    p.performUpdateIfNecessary();\n                    if (q) {\n                        for (var r = 0; ((r < q.length)); r++) {\n                            q[r]();\n                        ;\n                        };\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        } catch (n) {\n            throw n;\n        } finally {\n            i.length = 0;\n            h = false;\n        };\n    ;\n    };\n;\n    function k(m, n) {\n        g(((!n || ((typeof n === \"function\")))));\n        if (!h) {\n            m.performUpdateIfNecessary();\n            ((n && n()));\n            return;\n        }\n    ;\n    ;\n        i.push(m);\n        if (n) {\n            if (m._pendingCallbacks) {\n                m._pendingCallbacks.push(n);\n            }\n             else m._pendingCallbacks = [n,];\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var l = {\n        batchedUpdates: j,\n        enqueueUpdate: k\n    };\n    e.exports = l;\n});\n__d(\"ViewportMetrics\", [], function(a, b, c, d, e, f) {\n    var g = {\n        currentScrollLeft: 0,\n        currentScrollTop: 0,\n        refreshScrollValues: function() {\n            g.currentScrollLeft = ((JSBNG__document.body.scrollLeft + JSBNG__document.documentElement.scrollLeft));\n            g.currentScrollTop = ((JSBNG__document.body.scrollTop + JSBNG__document.documentElement.scrollTop));\n        }\n    };\n    e.exports = g;\n});\n__d(\"isEventSupported\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h, i;\n    if (g.canUseDOM) {\n        h = JSBNG__document.createElement(\"div\");\n        i = ((((JSBNG__document.implementation && JSBNG__document.implementation.hasFeature)) && ((JSBNG__document.implementation.hasFeature(\"\", \"\") !== true))));\n    }\n;\n;\n    function j(k, l) {\n        if (((!h || ((l && !h.JSBNG__addEventListener))))) {\n            return false;\n        }\n    ;\n    ;\n        var m = JSBNG__document.createElement(\"div\"), n = ((\"JSBNG__on\" + k)), o = ((n in m));\n        if (!o) {\n            m.setAttribute(n, \"\");\n            o = ((typeof m[n] === \"function\"));\n            if (((typeof m[n] !== \"undefined\"))) {\n                m[n] = undefined;\n            }\n        ;\n        ;\n            m.removeAttribute(n);\n        }\n    ;\n    ;\n        if (((((!o && i)) && ((k === \"wheel\"))))) {\n            o = JSBNG__document.implementation.hasFeature(\"Events.wheel\", \"3.0\");\n        }\n    ;\n    ;\n        m = null;\n        return o;\n    };\n;\n    e.exports = j;\n});\n__d(\"ReactEventEmitter\", [\"EventConstants\",\"EventListener\",\"EventPluginHub\",\"ExecutionEnvironment\",\"ReactUpdates\",\"ViewportMetrics\",\"invariant\",\"isEventSupported\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventListener\"), i = b(\"EventPluginHub\"), j = b(\"ExecutionEnvironment\"), k = b(\"ReactUpdates\"), l = b(\"ViewportMetrics\"), m = b(\"invariant\"), n = b(\"isEventSupported\"), o = false;\n    function p(u, v, w) {\n        h.listen(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n;\n    function q(u, v, w) {\n        h.capture(w, v, t.TopLevelCallbackCreator.createTopLevelCallback(u));\n    };\n;\n    function r() {\n        var u = l.refreshScrollValues;\n        h.listen(window, \"JSBNG__scroll\", u);\n        h.listen(window, \"resize\", u);\n    };\n;\n    function s(u) {\n        m(!o);\n        var v = g.topLevelTypes, w = JSBNG__document;\n        r();\n        p(v.topMouseOver, \"mouseover\", w);\n        p(v.topMouseDown, \"mousedown\", w);\n        p(v.topMouseUp, \"mouseup\", w);\n        p(v.topMouseMove, \"mousemove\", w);\n        p(v.topMouseOut, \"mouseout\", w);\n        p(v.topClick, \"click\", w);\n        p(v.topDoubleClick, \"dblclick\", w);\n        if (u) {\n            p(v.topTouchStart, \"touchstart\", w);\n            p(v.topTouchEnd, \"touchend\", w);\n            p(v.topTouchMove, \"touchmove\", w);\n            p(v.topTouchCancel, \"touchcancel\", w);\n        }\n    ;\n    ;\n        p(v.topKeyUp, \"keyup\", w);\n        p(v.topKeyPress, \"keypress\", w);\n        p(v.topKeyDown, \"keydown\", w);\n        p(v.topInput, \"input\", w);\n        p(v.topChange, \"change\", w);\n        p(v.topSelectionChange, \"selectionchange\", w);\n        p(v.topDOMCharacterDataModified, \"DOMCharacterDataModified\", w);\n        if (n(\"drag\")) {\n            p(v.topDrag, \"drag\", w);\n            p(v.topDragEnd, \"dragend\", w);\n            p(v.topDragEnter, \"dragenter\", w);\n            p(v.topDragExit, \"dragexit\", w);\n            p(v.topDragLeave, \"dragleave\", w);\n            p(v.topDragOver, \"dragover\", w);\n            p(v.topDragStart, \"dragstart\", w);\n            p(v.topDrop, \"drop\", w);\n        }\n    ;\n    ;\n        if (n(\"wheel\")) {\n            p(v.topWheel, \"wheel\", w);\n        }\n         else if (n(\"mousewheel\")) {\n            p(v.topWheel, \"mousewheel\", w);\n        }\n         else p(v.topWheel, \"DOMMouseScroll\", w);\n        \n    ;\n    ;\n        if (n(\"JSBNG__scroll\", true)) {\n            q(v.topScroll, \"JSBNG__scroll\", w);\n        }\n         else p(v.topScroll, \"JSBNG__scroll\", window);\n    ;\n    ;\n        if (n(\"JSBNG__focus\", true)) {\n            q(v.topFocus, \"JSBNG__focus\", w);\n            q(v.topBlur, \"JSBNG__blur\", w);\n        }\n         else if (n(\"focusin\")) {\n            p(v.topFocus, \"focusin\", w);\n            p(v.topBlur, \"focusout\", w);\n        }\n        \n    ;\n    ;\n    };\n;\n    var t = {\n        TopLevelCallbackCreator: null,\n        ensureListening: function(u, v) {\n            m(j.canUseDOM);\n            if (!o) {\n                t.TopLevelCallbackCreator = v;\n                s(u);\n                o = true;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(u) {\n            m(j.canUseDOM);\n            if (t.TopLevelCallbackCreator) {\n                t.TopLevelCallbackCreator.setEnabled(u);\n            }\n        ;\n        ;\n        },\n        isEnabled: function() {\n            return !!((t.TopLevelCallbackCreator && t.TopLevelCallbackCreator.isEnabled()));\n        },\n        handleTopLevel: function(u, v, w, x) {\n            var y = i.extractEvents(u, v, w, x);\n            k.batchedUpdates(function() {\n                i.enqueueEvents(y);\n                i.processEventQueue();\n            });\n        },\n        registrationNames: i.registrationNames,\n        putListener: i.putListener,\n        getListener: i.getListener,\n        deleteListener: i.deleteListener,\n        deleteAllListeners: i.deleteAllListeners,\n        trapBubbledEvent: p,\n        trapCapturedEvent: q\n    };\n    e.exports = t;\n});\n__d(\"getEventTarget\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\");\n    function h(i) {\n        var j = ((((i.target || i.srcElement)) || g.global));\n        return ((((j.nodeType === 3)) ? j.parentNode : j));\n    };\n;\n    e.exports = h;\n});\n__d(\"ReactEventTopLevelCallback\", [\"ExecutionEnvironment\",\"ReactEventEmitter\",\"ReactID\",\"ReactInstanceHandles\",\"getEventTarget\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactID\"), j = b(\"ReactInstanceHandles\"), k = b(\"getEventTarget\"), l = true, m = {\n        setEnabled: function(n) {\n            l = !!n;\n        },\n        isEnabled: function() {\n            return l;\n        },\n        createTopLevelCallback: function(n) {\n            return function(o) {\n                if (!l) {\n                    return;\n                }\n            ;\n            ;\n                if (((o.srcElement && ((o.srcElement !== o.target))))) {\n                    o.target = o.srcElement;\n                }\n            ;\n            ;\n                var p = ((j.getFirstReactDOM(k(o)) || g.global)), q = ((i.getID(p) || \"\"));\n                h.handleTopLevel(n, p, q, o);\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReactInstanceHandles\", [\"ReactID\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactID\"), h = b(\"invariant\"), i = \".\", j = i.length, k = 100, l = 9999999;\n    function m(v) {\n        return ((((((i + \"r[\")) + v.toString(36))) + \"]\"));\n    };\n;\n    function n(v, w) {\n        return ((((v.charAt(w) === i)) || ((w === v.length))));\n    };\n;\n    function o(v) {\n        return ((((v === \"\")) || ((((v.charAt(0) === i)) && ((v.charAt(((v.length - 1))) !== i))))));\n    };\n;\n    function p(v, w) {\n        return ((((w.indexOf(v) === 0)) && n(w, v.length)));\n    };\n;\n    function q(v) {\n        return ((v ? v.substr(0, v.lastIndexOf(i)) : \"\"));\n    };\n;\n    function r(v, w) {\n        h(((o(v) && o(w))));\n        h(p(v, w));\n        if (((v === w))) {\n            return v;\n        }\n    ;\n    ;\n        var x = ((v.length + j));\n        for (var y = x; ((y < w.length)); y++) {\n            if (n(w, y)) {\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        return w.substr(0, y);\n    };\n;\n    function s(v, w) {\n        var x = Math.min(v.length, w.length);\n        if (((x === 0))) {\n            return \"\";\n        }\n    ;\n    ;\n        var y = 0;\n        for (var z = 0; ((z <= x)); z++) {\n            if (((n(v, z) && n(w, z)))) {\n                y = z;\n            }\n             else if (((v.charAt(z) !== w.charAt(z)))) {\n                break;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        var aa = v.substr(0, y);\n        h(o(aa));\n        return aa;\n    };\n;\n    function t(v, w, x, y, z, aa) {\n        v = ((v || \"\"));\n        w = ((w || \"\"));\n        h(((v !== w)));\n        var ba = p(w, v);\n        h(((ba || p(v, w))));\n        var ca = 0, da = ((ba ? q : r));\n        for (var ea = v; ; ea = da(ea, w)) {\n            if (((((!z || ((ea !== v)))) && ((!aa || ((ea !== w))))))) {\n                x(ea, ba, y);\n            }\n        ;\n        ;\n            if (((ea === w))) {\n                break;\n            }\n        ;\n        ;\n            h(((ca++ < k)));\n        };\n    ;\n    };\n;\n    var u = {\n        separator: i,\n        createReactRootID: function() {\n            return m(Math.ceil(((Math.JSBNG__random() * l))));\n        },\n        isRenderedByReact: function(v) {\n            if (((v.nodeType !== 1))) {\n                return false;\n            }\n        ;\n        ;\n            var w = g.getID(v);\n            return ((w ? ((w.charAt(0) === i)) : false));\n        },\n        getFirstReactDOM: function(v) {\n            var w = v;\n            while (((w && ((w.parentNode !== w))))) {\n                if (u.isRenderedByReact(w)) {\n                    return w;\n                }\n            ;\n            ;\n                w = w.parentNode;\n            };\n        ;\n            return null;\n        },\n        findComponentRoot: function(v, w) {\n            var x = [v.firstChild,], y = 0;\n            while (((y < x.length))) {\n                var z = x[y++];\n                while (z) {\n                    var aa = g.getID(z);\n                    if (aa) {\n                        if (((w === aa))) {\n                            return z;\n                        }\n                         else if (p(aa, w)) {\n                            x.length = y = 0;\n                            x.push(z.firstChild);\n                            break;\n                        }\n                         else x.push(z.firstChild);\n                        \n                    ;\n                    ;\n                    }\n                     else x.push(z.firstChild);\n                ;\n                ;\n                    z = z.nextSibling;\n                };\n            ;\n            };\n        ;\n            h(false);\n        },\n        getReactRootIDFromNodeID: function(v) {\n            var w = /\\.r\\[[^\\]]+\\]/.exec(v);\n            return ((w && w[0]));\n        },\n        traverseEnterLeave: function(v, w, x, y, z) {\n            var aa = s(v, w);\n            if (((aa !== v))) {\n                t(v, aa, x, y, false, true);\n            }\n        ;\n        ;\n            if (((aa !== w))) {\n                t(aa, w, x, z, true, false);\n            }\n        ;\n        ;\n        },\n        traverseTwoPhase: function(v, w, x) {\n            if (v) {\n                t(\"\", v, w, x, true, false);\n                t(v, \"\", w, x, false, true);\n            }\n        ;\n        ;\n        },\n        _getFirstCommonAncestorID: s,\n        _getNextDescendantID: r\n    };\n    e.exports = u;\n});\n__d(\"ReactMount\", [\"invariant\",\"ReactEventEmitter\",\"ReactInstanceHandles\",\"ReactEventTopLevelCallback\",\"ReactID\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactEventEmitter\"), i = b(\"ReactInstanceHandles\"), j = b(\"ReactEventTopLevelCallback\"), k = b(\"ReactID\"), l = b(\"$\"), m = {\n    }, n = {\n    };\n    function o(r) {\n        return ((r && r.firstChild));\n    };\n;\n    function p(r) {\n        var s = o(r);\n        return ((s && k.getID(s)));\n    };\n;\n    var q = {\n        totalInstantiationTime: 0,\n        totalInjectionTime: 0,\n        useTouchEvents: false,\n        scrollMonitor: function(r, s) {\n            s();\n        },\n        prepareTopLevelEvents: function(r) {\n            h.ensureListening(q.useTouchEvents, r);\n        },\n        _updateRootComponent: function(r, s, t, u) {\n            var v = s.props;\n            q.scrollMonitor(t, function() {\n                r.replaceProps(v, u);\n            });\n            return r;\n        },\n        _registerComponent: function(r, s) {\n            q.prepareTopLevelEvents(j);\n            var t = q.registerContainer(s);\n            m[t] = r;\n            return t;\n        },\n        _renderNewRootComponent: function(r, s, t) {\n            var u = q._registerComponent(r, s);\n            r.mountComponentIntoNode(u, s, t);\n            return r;\n        },\n        renderComponent: function(r, s, t) {\n            var u = m[p(s)];\n            if (u) {\n                if (((u.constructor === r.constructor))) {\n                    return q._updateRootComponent(u, r, s, t);\n                }\n                 else q.unmountAndReleaseReactRootNode(s);\n            ;\n            }\n        ;\n        ;\n            var v = o(s), w = ((v && i.isRenderedByReact(v))), x = ((w && !u)), y = q._renderNewRootComponent(r, s, x);\n            ((t && t()));\n            return y;\n        },\n        constructAndRenderComponent: function(r, s, t) {\n            return q.renderComponent(r(s), t);\n        },\n        constructAndRenderComponentByID: function(r, s, t) {\n            return q.constructAndRenderComponent(r, s, l(t));\n        },\n        registerContainer: function(r) {\n            var s = p(r);\n            if (s) {\n                s = i.getReactRootIDFromNodeID(s);\n            }\n        ;\n        ;\n            if (!s) {\n                s = i.createReactRootID();\n            }\n        ;\n        ;\n            n[s] = r;\n            return s;\n        },\n        unmountAndReleaseReactRootNode: function(r) {\n            var s = p(r), t = m[s];\n            if (!t) {\n                return false;\n            }\n        ;\n        ;\n            t.unmountComponentFromNode(r);\n            delete m[s];\n            delete n[s];\n            return true;\n        },\n        findReactContainerForID: function(r) {\n            var s = i.getReactRootIDFromNodeID(r), t = n[s];\n            return t;\n        },\n        findReactNodeByID: function(r) {\n            var s = q.findReactContainerForID(r);\n            return i.findComponentRoot(s, r);\n        }\n    };\n    e.exports = q;\n});\n__d(\"ReactID\", [\"invariant\",\"ReactMount\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = b(\"ReactMount\"), i = \"data-reactid\", j = {\n    };\n    function k(r) {\n        var s = l(r);\n        if (s) {\n            if (j.hasOwnProperty(s)) {\n                var t = j[s];\n                if (((t !== r))) {\n                    g(!o(t, s));\n                    j[s] = r;\n                }\n            ;\n            ;\n            }\n             else j[s] = r;\n        ;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function l(r) {\n        return ((((((r && r.getAttribute)) && r.getAttribute(i))) || \"\"));\n    };\n;\n    function m(r, s) {\n        var t = l(r);\n        if (((t !== s))) {\n            delete j[t];\n        }\n    ;\n    ;\n        r.setAttribute(i, s);\n        j[s] = r;\n    };\n;\n    function n(r) {\n        if (((!j.hasOwnProperty(r) || !o(j[r], r)))) {\n            j[r] = h.findReactNodeByID(r);\n        }\n    ;\n    ;\n        return j[r];\n    };\n;\n    function o(r, s) {\n        if (r) {\n            g(((l(r) === s)));\n            var t = h.findReactContainerForID(s);\n            if (((t && p(t, r)))) {\n                return true;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function p(r, s) {\n        if (r.contains) {\n            return r.contains(s);\n        }\n    ;\n    ;\n        if (((s === r))) {\n            return true;\n        }\n    ;\n    ;\n        if (((s.nodeType === 3))) {\n            s = s.parentNode;\n        }\n    ;\n    ;\n        while (((s && ((s.nodeType === 1))))) {\n            if (((s === r))) {\n                return true;\n            }\n        ;\n        ;\n            s = s.parentNode;\n        };\n    ;\n        return false;\n    };\n;\n    function q(r) {\n        delete j[r];\n    };\n;\n    f.ATTR_NAME = i;\n    f.getID = k;\n    f.rawGetID = l;\n    f.setID = m;\n    f.getNode = n;\n    f.purgeID = q;\n});\n__d(\"getTextContentAccessor\", [\"ExecutionEnvironment\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = null;\n    function i() {\n        if (((!h && g.canUseDOM))) {\n            h = ((((\"innerText\" in JSBNG__document.createElement(\"div\"))) ? \"innerText\" : \"textContent\"));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ReactDOMIDOperations\", [\"CSSPropertyOperations\",\"DOMChildrenOperations\",\"DOMPropertyOperations\",\"ReactID\",\"getTextContentAccessor\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMChildrenOperations\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactID\"), k = b(\"getTextContentAccessor\"), l = b(\"invariant\"), m = {\n        dangerouslySetInnerHTML: \"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",\n        style: \"`style` must be set using `updateStylesByID()`.\"\n    }, n = ((k() || \"NA\")), o = {\n        updatePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            if (((r != null))) {\n                i.setValueForProperty(s, q, r);\n            }\n             else i.deleteValueForProperty(s, q);\n        ;\n        ;\n        },\n        deletePropertyByID: function(p, q, r) {\n            var s = j.getNode(p);\n            l(!m.hasOwnProperty(q));\n            i.deleteValueForProperty(s, q, r);\n        },\n        updatePropertiesByID: function(p, q) {\n            {\n                var fin64keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin64i = (0);\n                var r;\n                for (; (fin64i < fin64keys.length); (fin64i++)) {\n                    ((r) = (fin64keys[fin64i]));\n                    {\n                        if (!q.hasOwnProperty(r)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        o.updatePropertiesByID(p, r, q[r]);\n                    };\n                };\n            };\n        ;\n        },\n        updateStylesByID: function(p, q) {\n            var r = j.getNode(p);\n            g.setValueForStyles(r, q);\n        },\n        updateInnerHTMLByID: function(p, q) {\n            var r = j.getNode(p);\n            r.innerHTML = ((((q && q.__html)) || \"\")).replace(/^ /g, \"&nbsp;\");\n        },\n        updateTextContentByID: function(p, q) {\n            var r = j.getNode(p);\n            r[n] = q;\n        },\n        dangerouslyReplaceNodeWithMarkupByID: function(p, q) {\n            var r = j.getNode(p);\n            h.dangerouslyReplaceNodeWithMarkup(r, q);\n        },\n        manageChildrenByParentID: function(p, q) {\n            var r = j.getNode(p);\n            h.manageChildren(r, q);\n        }\n    };\n    e.exports = o;\n});\n__d(\"ReactOwner\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\"), h = {\n        isValidOwner: function(i) {\n            return !!((((i && ((typeof i.attachRef === \"function\")))) && ((typeof i.detachRef === \"function\"))));\n        },\n        addComponentAsRefTo: function(i, j, k) {\n            g(h.isValidOwner(k));\n            k.attachRef(j, i);\n        },\n        removeComponentAsRefFrom: function(i, j, k) {\n            g(h.isValidOwner(k));\n            if (((k.refs[j] === i))) {\n                k.detachRef(j);\n            }\n        ;\n        ;\n        },\n        Mixin: {\n            attachRef: function(i, j) {\n                g(j.isOwnedBy(this));\n                var k = ((this.refs || (this.refs = {\n                })));\n                k[i] = j;\n            },\n            detachRef: function(i) {\n                delete this.refs[i];\n            }\n        }\n    };\n    e.exports = h;\n});\n__d(\"PooledClass\", [], function(a, b, c, d, e, f) {\n    var g = function(p) {\n        var q = this;\n        if (q.instancePool.length) {\n            var r = q.instancePool.pop();\n            q.call(r, p);\n            return r;\n        }\n         else return new q(p)\n    ;\n    }, h = function(p, q) {\n        var r = this;\n        if (r.instancePool.length) {\n            var s = r.instancePool.pop();\n            r.call(s, p, q);\n            return s;\n        }\n         else return new r(p, q)\n    ;\n    }, i = function(p, q, r) {\n        var s = this;\n        if (s.instancePool.length) {\n            var t = s.instancePool.pop();\n            s.call(t, p, q, r);\n            return t;\n        }\n         else return new s(p, q, r)\n    ;\n    }, j = function(p, q, r, s, t) {\n        var u = this;\n        if (u.instancePool.length) {\n            var v = u.instancePool.pop();\n            u.call(v, p, q, r, s, t);\n            return v;\n        }\n         else return new u(p, q, r, s, t)\n    ;\n    }, k = function(p) {\n        var q = this;\n        if (p.destructor) {\n            p.destructor();\n        }\n    ;\n    ;\n        if (((q.instancePool.length < q.poolSize))) {\n            q.instancePool.push(p);\n        }\n    ;\n    ;\n    }, l = 10, m = g, n = function(p, q) {\n        var r = p;\n        r.instancePool = [];\n        r.getPooled = ((q || m));\n        if (!r.poolSize) {\n            r.poolSize = l;\n        }\n    ;\n    ;\n        r.release = k;\n        return r;\n    }, o = {\n        addPoolingTo: n,\n        oneArgumentPooler: g,\n        twoArgumentPooler: h,\n        threeArgumentPooler: i,\n        fiveArgumentPooler: j\n    };\n    e.exports = o;\n});\n__d(\"ReactInputSelection\", [], function(a, b, c, d, e, f) {\n    function g() {\n        try {\n            return JSBNG__document.activeElement;\n        } catch (j) {\n        \n        };\n    ;\n    };\n;\n    function h(j) {\n        return JSBNG__document.documentElement.contains(j);\n    };\n;\n    var i = {\n        hasSelectionCapabilities: function(j) {\n            return ((j && ((((((((j.nodeName === \"INPUT\")) && ((j.type === \"text\")))) || ((j.nodeName === \"TEXTAREA\")))) || ((j.contentEditable === \"true\"))))));\n        },\n        getSelectionInformation: function() {\n            var j = g();\n            return {\n                focusedElem: j,\n                selectionRange: ((i.hasSelectionCapabilities(j) ? i.JSBNG__getSelection(j) : null))\n            };\n        },\n        restoreSelection: function(j) {\n            var k = g(), l = j.focusedElem, m = j.selectionRange;\n            if (((((k !== l)) && h(l)))) {\n                if (i.hasSelectionCapabilities(l)) {\n                    i.setSelection(l, m);\n                }\n            ;\n            ;\n                l.JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        JSBNG__getSelection: function(j) {\n            var k;\n            if (((((j.contentEditable === \"true\")) && window.JSBNG__getSelection))) {\n                k = window.JSBNG__getSelection().getRangeAt(0);\n                var l = k.commonAncestorContainer;\n                if (((l && ((l.nodeType === 3))))) {\n                    l = l.parentNode;\n                }\n            ;\n            ;\n                if (((l !== j))) {\n                    return {\n                        start: 0,\n                        end: 0\n                    };\n                }\n                 else return {\n                    start: k.startOffset,\n                    end: k.endOffset\n                }\n            ;\n            }\n        ;\n        ;\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var m = j.value.length;\n            if (((j.nodeName === \"INPUT\"))) {\n                return {\n                    start: -k.moveStart(\"character\", -m),\n                    end: -k.moveEnd(\"character\", -m)\n                };\n            }\n             else {\n                var n = k.duplicate();\n                n.moveToElementText(j);\n                n.setEndPoint(\"StartToEnd\", k);\n                var o = ((m - n.text.length));\n                n.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((m - n.text.length)),\n                    end: o\n                };\n            }\n        ;\n        ;\n        },\n        setSelection: function(j, k) {\n            var l, m = k.start, n = k.end;\n            if (((typeof n === \"undefined\"))) {\n                n = m;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName === \"TEXTAREA\"))) {\n                    var o = ((j.value.slice(0, m).match(/\\r/g) || [])).length, p = ((j.value.slice(m, n).match(/\\r/g) || [])).length;\n                    m -= o;\n                    n -= ((o + p));\n                }\n            ;\n            ;\n                l = j.createTextRange();\n                l.collapse(true);\n                l.moveStart(\"character\", m);\n                l.moveEnd(\"character\", ((n - m)));\n                l.select();\n            }\n             else if (((j.contentEditable === \"true\"))) {\n                if (((j.childNodes.length === 1))) {\n                    l = JSBNG__document.createRange();\n                    l.setStart(j.childNodes[0], m);\n                    l.setEnd(j.childNodes[0], n);\n                    var q = window.JSBNG__getSelection();\n                    q.removeAllRanges();\n                    q.addRange(l);\n                }\n            ;\n            ;\n            }\n             else {\n                j.selectionStart = m;\n                j.selectionEnd = Math.min(n, j.value.length);\n                j.JSBNG__focus();\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"mixInto\", [], function(a, b, c, d, e, f) {\n    var g = function(h, i) {\n        var j;\n        {\n            var fin65keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin65i = (0);\n            (0);\n            for (; (fin65i < fin65keys.length); (fin65i++)) {\n                ((j) = (fin65keys[fin65i]));\n                {\n                    if (!i.hasOwnProperty(j)) {\n                        continue;\n                    }\n                ;\n                ;\n                    h.prototype[j] = i[j];\n                };\n            };\n        };\n    ;\n    };\n    e.exports = g;\n});\n__d(\"ReactOnDOMReady\", [\"PooledClass\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"mixInto\");\n    function i(j) {\n        this._queue = ((j || null));\n    };\n;\n    h(i, {\n        enqueue: function(j, k) {\n            this._queue = ((this._queue || []));\n            this._queue.push({\n                component: j,\n                callback: k\n            });\n        },\n        notifyAll: function() {\n            var j = this._queue;\n            if (j) {\n                this._queue = null;\n                for (var k = 0, l = j.length; ((k < l)); k++) {\n                    var m = j[k].component, n = j[k].callback;\n                    n.call(m, m.getDOMNode());\n                };\n            ;\n                j.length = 0;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this._queue = null;\n        },\n        destructor: function() {\n            this.reset();\n        }\n    });\n    g.addPoolingTo(i);\n    e.exports = i;\n});\n__d(\"Transaction\", [\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = \"DUAL_TRANSACTION\", i = \"MISSING_TRANSACTION\", j = {\n        reinitializeTransaction: function() {\n            this.transactionWrappers = this.getTransactionWrappers();\n            if (!this.wrapperInitData) {\n                this.wrapperInitData = [];\n            }\n             else this.wrapperInitData.length = 0;\n        ;\n        ;\n            if (!this.timingMetrics) {\n                this.timingMetrics = {\n                };\n            }\n        ;\n        ;\n            this.timingMetrics.methodInvocationTime = 0;\n            if (!this.timingMetrics.wrapperInitTimes) {\n                this.timingMetrics.wrapperInitTimes = [];\n            }\n             else this.timingMetrics.wrapperInitTimes.length = 0;\n        ;\n        ;\n            if (!this.timingMetrics.wrapperCloseTimes) {\n                this.timingMetrics.wrapperCloseTimes = [];\n            }\n             else this.timingMetrics.wrapperCloseTimes.length = 0;\n        ;\n        ;\n            this._isInTransaction = false;\n        },\n        _isInTransaction: false,\n        getTransactionWrappers: null,\n        isInTransaction: function() {\n            return !!this._isInTransaction;\n        },\n        perform: function(l, m, n, o, p, q, r, s) {\n            g(this.isInTransaction(), h);\n            var t = JSBNG__Date.now(), u = null, v;\n            try {\n                this.initializeAll();\n                v = l.call(m, n, o, p, q, r, s);\n            } catch (w) {\n                u = w;\n            } finally {\n                var x = JSBNG__Date.now();\n                this.methodInvocationTime += ((x - t));\n                try {\n                    this.closeAll();\n                } catch (y) {\n                    u = ((u || y));\n                };\n            ;\n            };\n        ;\n            if (u) {\n                throw u;\n            }\n        ;\n        ;\n            return v;\n        },\n        initializeAll: function() {\n            this._isInTransaction = true;\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperInitTimes, n = null;\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = JSBNG__Date.now(), q = l[o];\n                try {\n                    this.wrapperInitData[o] = ((q.initialize ? q.initialize.call(this) : null));\n                } catch (r) {\n                    n = ((n || r));\n                    this.wrapperInitData[o] = k.OBSERVED_ERROR;\n                } finally {\n                    var s = m[o], t = JSBNG__Date.now();\n                    m[o] = ((((s || 0)) + ((t - p))));\n                };\n            ;\n            };\n        ;\n            if (n) {\n                throw n;\n            }\n        ;\n        ;\n        },\n        closeAll: function() {\n            g(!this.isInTransaction(), i);\n            var l = this.transactionWrappers, m = this.timingMetrics.wrapperCloseTimes, n = null;\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = l[o], q = JSBNG__Date.now(), r = this.wrapperInitData[o];\n                try {\n                    if (((r !== k.OBSERVED_ERROR))) {\n                        ((p.close && p.close.call(this, r)));\n                    }\n                ;\n                ;\n                } catch (s) {\n                    n = ((n || s));\n                } finally {\n                    var t = JSBNG__Date.now(), u = m[o];\n                    m[o] = ((((u || 0)) + ((t - q))));\n                };\n            ;\n            };\n        ;\n            this.wrapperInitData.length = 0;\n            this._isInTransaction = false;\n            if (n) {\n                throw n;\n            }\n        ;\n        ;\n        }\n    }, k = {\n        Mixin: j,\n        OBSERVED_ERROR: {\n        }\n    };\n    e.exports = k;\n});\n__d(\"ReactReconcileTransaction\", [\"ExecutionEnvironment\",\"PooledClass\",\"ReactEventEmitter\",\"ReactInputSelection\",\"ReactOnDOMReady\",\"Transaction\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ExecutionEnvironment\"), h = b(\"PooledClass\"), i = b(\"ReactEventEmitter\"), j = b(\"ReactInputSelection\"), k = b(\"ReactOnDOMReady\"), l = b(\"Transaction\"), m = b(\"mixInto\"), n = {\n        initialize: j.getSelectionInformation,\n        close: j.restoreSelection\n    }, o = {\n        initialize: function() {\n            var t = i.isEnabled();\n            i.setEnabled(false);\n            return t;\n        },\n        close: function(t) {\n            i.setEnabled(t);\n        }\n    }, p = {\n        initialize: function() {\n            this.reactOnDOMReady.reset();\n        },\n        close: function() {\n            this.reactOnDOMReady.notifyAll();\n        }\n    }, q = [n,o,p,];\n    function r() {\n        this.reinitializeTransaction();\n        this.reactOnDOMReady = k.getPooled(null);\n    };\n;\n    var s = {\n        getTransactionWrappers: function() {\n            if (g.canUseDOM) {\n                return q;\n            }\n             else return []\n        ;\n        },\n        getReactOnDOMReady: function() {\n            return this.reactOnDOMReady;\n        },\n        destructor: function() {\n            k.release(this.reactOnDOMReady);\n            this.reactOnDOMReady = null;\n        }\n    };\n    m(r, l.Mixin);\n    m(r, s);\n    h.addPoolingTo(r);\n    e.exports = r;\n});\n__d(\"mergeHelpers\", [\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"throwIf\"), i = 36, j = g({\n        MERGE_ARRAY_FAIL: null,\n        MERGE_CORE_FAILURE: null,\n        MERGE_TYPE_USAGE_FAILURE: null,\n        MERGE_DEEP_MAX_LEVELS: null,\n        MERGE_DEEP_NO_ARR_STRATEGY: null\n    }), k = function(m) {\n        return ((((typeof m !== \"object\")) || ((m === null))));\n    }, l = {\n        MAX_MERGE_DEPTH: i,\n        isTerminal: k,\n        normalizeMergeArg: function(m) {\n            return ((((((m === undefined)) || ((m === null)))) ? {\n            } : m));\n        },\n        checkMergeArrayArgs: function(m, n) {\n            h(((!Array.isArray(m) || !Array.isArray(n))), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeObjectArgs: function(m, n) {\n            l.checkMergeObjectArg(m);\n            l.checkMergeObjectArg(n);\n        },\n        checkMergeObjectArg: function(m) {\n            h(((k(m) || Array.isArray(m))), j.MERGE_CORE_FAILURE);\n        },\n        checkMergeLevel: function(m) {\n            h(((m >= i)), j.MERGE_DEEP_MAX_LEVELS);\n        },\n        checkArrayStrategy: function(m) {\n            h(((((m !== undefined)) && !((m in l.ArrayStrategies)))), j.MERGE_DEEP_NO_ARR_STRATEGY);\n        },\n        ArrayStrategies: g({\n            Clobber: true,\n            IndexByIndex: true\n        }),\n        ERRORS: j\n    };\n    e.exports = l;\n});\n__d(\"mergeInto\", [\"mergeHelpers\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeHelpers\"), h = g.checkMergeObjectArg;\n    function i(j, k) {\n        h(j);\n        if (((k != null))) {\n            h(k);\n            {\n                var fin66keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin66i = (0);\n                var l;\n                for (; (fin66i < fin66keys.length); (fin66i++)) {\n                    ((l) = (fin66keys[fin66i]));\n                    {\n                        if (!k.hasOwnProperty(l)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        j[l] = k[l];\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"merge\", [\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"mergeInto\"), h = function(i, j) {\n        var k = {\n        };\n        g(k, i);\n        g(k, j);\n        return k;\n    };\n    e.exports = h;\n});\n__d(\"ReactComponent\", [\"ReactCurrentOwner\",\"ReactDOMIDOperations\",\"ReactID\",\"ReactOwner\",\"ReactReconcileTransaction\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCurrentOwner\"), h = b(\"ReactDOMIDOperations\"), i = b(\"ReactID\"), j = b(\"ReactOwner\"), k = b(\"ReactReconcileTransaction\"), l = b(\"ReactUpdates\"), m = b(\"invariant\"), n = b(\"keyMirror\"), o = b(\"merge\"), p = \"{owner}\", q = \"{is.key.validated}\", r = n({\n        MOUNTED: null,\n        UNMOUNTED: null\n    }), s = {\n    };\n    function t(w) {\n        if (((w[q] || ((w.props.key != null))))) {\n            return;\n        }\n    ;\n    ;\n        w[q] = true;\n        if (!g.current) {\n            return;\n        }\n    ;\n    ;\n        var x = g.current.constructor.displayName;\n        if (s.hasOwnProperty(x)) {\n            return;\n        }\n    ;\n    ;\n        s[x] = true;\n        var y = ((((((\"Each child in an array should have a unique \\\"key\\\" prop. \" + \"Check the render method of \")) + x)) + \".\"));\n        if (!w.isOwnedBy(g.current)) {\n            var z = ((w.props[p] && w.props[p].constructor.displayName));\n            y += ((((\" It was passed a child from \" + z)) + \".\"));\n        }\n    ;\n    ;\n    };\n;\n    function u(w) {\n        if (Array.isArray(w)) {\n            for (var x = 0; ((x < w.length)); x++) {\n                var y = w[x];\n                if (v.isValidComponent(y)) {\n                    t(y);\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else if (v.isValidComponent(w)) {\n            w[q] = true;\n        }\n        \n    ;\n    ;\n    };\n;\n    var v = {\n        isValidComponent: function(w) {\n            return !!((((w && ((typeof w.mountComponentIntoNode === \"function\")))) && ((typeof w.receiveProps === \"function\"))));\n        },\n        getKey: function(w, x) {\n            if (((((w && w.props)) && ((w.props.key != null))))) {\n                return ((\"\" + w.props.key));\n            }\n        ;\n        ;\n            return ((\"\" + x));\n        },\n        LifeCycle: r,\n        DOMIDOperations: h,\n        ReactReconcileTransaction: k,\n        setDOMOperations: function(w) {\n            v.DOMIDOperations = w;\n        },\n        setReactReconcileTransaction: function(w) {\n            v.ReactReconcileTransaction = w;\n        },\n        Mixin: {\n            isMounted: function() {\n                return ((this._lifeCycleState === r.MOUNTED));\n            },\n            getDOMNode: function() {\n                m(this.isMounted());\n                return i.getNode(this._rootNodeID);\n            },\n            setProps: function(w, x) {\n                this.replaceProps(o(((this._pendingProps || this.props)), w), x);\n            },\n            replaceProps: function(w, x) {\n                m(!this.props[p]);\n                this._pendingProps = w;\n                l.enqueueUpdate(this, x);\n            },\n            construct: function(w, x) {\n                this.props = ((w || {\n                }));\n                this.props[p] = g.current;\n                this._lifeCycleState = r.UNMOUNTED;\n                this._pendingProps = null;\n                this._pendingCallbacks = null;\n                var y = ((arguments.length - 1));\n                if (((y === 1))) {\n                    this.props.children = x;\n                }\n                 else if (((y > 1))) {\n                    var z = Array(y);\n                    for (var aa = 0; ((aa < y)); aa++) {\n                        z[aa] = arguments[((aa + 1))];\n                    ;\n                    };\n                ;\n                    this.props.children = z;\n                }\n                \n            ;\n            ;\n            },\n            mountComponent: function(w, x) {\n                m(!this.isMounted());\n                var y = this.props;\n                if (((y.ref != null))) {\n                    j.addComponentAsRefTo(this, y.ref, y[p]);\n                }\n            ;\n            ;\n                this._rootNodeID = w;\n                this._lifeCycleState = r.MOUNTED;\n            },\n            unmountComponent: function() {\n                m(this.isMounted());\n                var w = this.props;\n                if (((w.ref != null))) {\n                    j.removeComponentAsRefFrom(this, w.ref, w[p]);\n                }\n            ;\n            ;\n                i.purgeID(this._rootNodeID);\n                this._rootNodeID = null;\n                this._lifeCycleState = r.UNMOUNTED;\n            },\n            receiveProps: function(w, x) {\n                m(this.isMounted());\n                this._pendingProps = w;\n                this._performUpdateIfNecessary(x);\n            },\n            performUpdateIfNecessary: function() {\n                var w = v.ReactReconcileTransaction.getPooled();\n                w.perform(this._performUpdateIfNecessary, this, w);\n                v.ReactReconcileTransaction.release(w);\n            },\n            _performUpdateIfNecessary: function(w) {\n                if (((this._pendingProps == null))) {\n                    return;\n                }\n            ;\n            ;\n                var x = this.props;\n                this.props = this._pendingProps;\n                this._pendingProps = null;\n                this.updateComponent(w, x);\n            },\n            updateComponent: function(w, x) {\n                var y = this.props;\n                if (((((y[p] !== x[p])) || ((y.ref !== x.ref))))) {\n                    if (((x.ref != null))) {\n                        j.removeComponentAsRefFrom(this, x.ref, x[p]);\n                    }\n                ;\n                ;\n                    if (((y.ref != null))) {\n                        j.addComponentAsRefTo(this, y.ref, y[p]);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            },\n            mountComponentIntoNode: function(w, x, y) {\n                var z = v.ReactReconcileTransaction.getPooled();\n                z.perform(this._mountComponentIntoNode, this, w, x, z, y);\n                v.ReactReconcileTransaction.release(z);\n            },\n            _mountComponentIntoNode: function(w, x, y, z) {\n                m(((x && ((x.nodeType === 1)))));\n                var aa = this.mountComponent(w, y);\n                if (z) {\n                    return;\n                }\n            ;\n            ;\n                var ba = x.parentNode;\n                if (ba) {\n                    var ca = x.nextSibling;\n                    ba.removeChild(x);\n                    x.innerHTML = aa;\n                    if (ca) {\n                        ba.insertBefore(x, ca);\n                    }\n                     else ba.appendChild(x);\n                ;\n                ;\n                }\n                 else x.innerHTML = aa;\n            ;\n            ;\n            },\n            unmountComponentFromNode: function(w) {\n                this.unmountComponent();\n                while (w.lastChild) {\n                    w.removeChild(w.lastChild);\n                ;\n                };\n            ;\n            },\n            isOwnedBy: function(w) {\n                return ((this.props[p] === w));\n            },\n            getSiblingByRef: function(w) {\n                var x = this.props[p];\n                if (((!x || !x.refs))) {\n                    return null;\n                }\n            ;\n            ;\n                return x.refs[w];\n            }\n        }\n    };\n    e.exports = v;\n});\n__d(\"joinClasses\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (!h) {\n            h = \"\";\n        }\n    ;\n    ;\n        var i, j = arguments.length;\n        if (((j > 1))) {\n            for (var k = 1; ((k < j)); k++) {\n                i = arguments[k];\n                ((i && (h += ((\" \" + i)))));\n            };\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = g;\n});\n__d(\"ReactPropTransferer\", [\"emptyFunction\",\"joinClasses\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = b(\"joinClasses\"), i = b(\"merge\");\n    function j(m) {\n        return function(n, o, p) {\n            if (!n.hasOwnProperty(o)) {\n                n[o] = p;\n            }\n             else n[o] = m(n[o], p);\n        ;\n        ;\n        };\n    };\n;\n    var k = {\n        children: g,\n        className: j(h),\n        ref: g,\n        style: j(i)\n    }, l = {\n        TransferStrategies: k,\n        Mixin: {\n            transferPropsTo: function(m) {\n                var n = {\n                };\n                {\n                    var fin67keys = ((window.top.JSBNG_Replay.forInKeys)((m.props))), fin67i = (0);\n                    var o;\n                    for (; (fin67i < fin67keys.length); (fin67i++)) {\n                        ((o) = (fin67keys[fin67i]));\n                        {\n                            if (m.props.hasOwnProperty(o)) {\n                                n[o] = m.props[o];\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin68keys = ((window.top.JSBNG_Replay.forInKeys)((this.props))), fin68i = (0);\n                    var p;\n                    for (; (fin68i < fin68keys.length); (fin68i++)) {\n                        ((p) = (fin68keys[fin68i]));\n                        {\n                            if (!this.props.hasOwnProperty(p)) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            var q = k[p];\n                            if (q) {\n                                q(n, p, this.props[p]);\n                            }\n                             else if (!n.hasOwnProperty(p)) {\n                                n[p] = this.props[p];\n                            }\n                            \n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                m.props = n;\n                return m;\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"ReactCompositeComponent\", [\"ReactComponent\",\"ReactCurrentOwner\",\"ReactOwner\",\"ReactPropTransferer\",\"ReactUpdates\",\"invariant\",\"keyMirror\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactCurrentOwner\"), i = b(\"ReactOwner\"), j = b(\"ReactPropTransferer\"), k = b(\"ReactUpdates\"), l = b(\"invariant\"), m = b(\"keyMirror\"), n = b(\"merge\"), o = b(\"mixInto\"), p = m({\n        DEFINE_ONCE: null,\n        DEFINE_MANY: null,\n        OVERRIDE_BASE: null\n    }), q = {\n        mixins: p.DEFINE_MANY,\n        propTypes: p.DEFINE_ONCE,\n        getDefaultProps: p.DEFINE_ONCE,\n        getInitialState: p.DEFINE_ONCE,\n        render: p.DEFINE_ONCE,\n        componentWillMount: p.DEFINE_MANY,\n        componentDidMount: p.DEFINE_MANY,\n        componentWillReceiveProps: p.DEFINE_MANY,\n        shouldComponentUpdate: p.DEFINE_ONCE,\n        componentWillUpdate: p.DEFINE_MANY,\n        componentDidUpdate: p.DEFINE_MANY,\n        componentWillUnmount: p.DEFINE_MANY,\n        updateComponent: p.OVERRIDE_BASE\n    }, r = {\n        displayName: function(aa, ba) {\n            aa.displayName = ba;\n        },\n        mixins: function(aa, ba) {\n            if (ba) {\n                for (var ca = 0; ((ca < ba.length)); ca++) {\n                    u(aa, ba[ca]);\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        propTypes: function(aa, ba) {\n            aa.propTypes = ba;\n        }\n    };\n    function s(aa, ba) {\n        var ca = q[ba];\n        if (x.hasOwnProperty(ba)) {\n            l(((ca === p.OVERRIDE_BASE)));\n        }\n    ;\n    ;\n        if (aa.hasOwnProperty(ba)) {\n            l(((ca === p.DEFINE_MANY)));\n        }\n    ;\n    ;\n    };\n;\n    function t(aa) {\n        var ba = aa._compositeLifeCycleState;\n        l(((aa.isMounted() || ((ba === w.MOUNTING)))));\n        l(((((ba !== w.RECEIVING_STATE)) && ((ba !== w.UNMOUNTING)))));\n    };\n;\n    function u(aa, ba) {\n        var ca = aa.prototype;\n        {\n            var fin69keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin69i = (0);\n            var da;\n            for (; (fin69i < fin69keys.length); (fin69i++)) {\n                ((da) = (fin69keys[fin69i]));\n                {\n                    var ea = ba[da];\n                    if (((!ba.hasOwnProperty(da) || !ea))) {\n                        continue;\n                    }\n                ;\n                ;\n                    s(ca, da);\n                    if (r.hasOwnProperty(da)) {\n                        r[da](aa, ea);\n                    }\n                     else {\n                        var fa = ((da in q)), ga = ((da in ca)), ha = ea.__reactDontBind, ia = ((typeof ea === \"function\")), ja = ((((((ia && !fa)) && !ga)) && !ha));\n                        if (ja) {\n                            if (!ca.__reactAutoBindMap) {\n                                ca.__reactAutoBindMap = {\n                                };\n                            }\n                        ;\n                        ;\n                            ca.__reactAutoBindMap[da] = ea;\n                            ca[da] = ea;\n                        }\n                         else if (ga) {\n                            ca[da] = v(ca[da], ea);\n                        }\n                         else ca[da] = ea;\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function v(aa, ba) {\n        return function ca() {\n            aa.apply(this, arguments);\n            ba.apply(this, arguments);\n        };\n    };\n;\n    var w = m({\n        MOUNTING: null,\n        UNMOUNTING: null,\n        RECEIVING_PROPS: null,\n        RECEIVING_STATE: null\n    }), x = {\n        construct: function(aa, ba) {\n            g.Mixin.construct.apply(this, arguments);\n            this.state = null;\n            this._pendingState = null;\n            this._compositeLifeCycleState = null;\n        },\n        isMounted: function() {\n            return ((g.Mixin.isMounted.call(this) && ((this._compositeLifeCycleState !== w.MOUNTING))));\n        },\n        mountComponent: function(aa, ba) {\n            g.Mixin.mountComponent.call(this, aa, ba);\n            this._compositeLifeCycleState = w.MOUNTING;\n            this._defaultProps = ((this.getDefaultProps ? this.getDefaultProps() : null));\n            this._processProps(this.props);\n            if (this.__reactAutoBindMap) {\n                this._bindAutoBindMethods();\n            }\n        ;\n        ;\n            this.state = ((this.getInitialState ? this.getInitialState() : null));\n            this._pendingState = null;\n            this._pendingForceUpdate = false;\n            if (this.componentWillMount) {\n                this.componentWillMount();\n                if (this._pendingState) {\n                    this.state = this._pendingState;\n                    this._pendingState = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._renderedComponent = this._renderValidatedComponent();\n            this._compositeLifeCycleState = null;\n            var ca = this._renderedComponent.mountComponent(aa, ba);\n            if (this.componentDidMount) {\n                ba.getReactOnDOMReady().enqueue(this, this.componentDidMount);\n            }\n        ;\n        ;\n            return ca;\n        },\n        unmountComponent: function() {\n            this._compositeLifeCycleState = w.UNMOUNTING;\n            if (this.componentWillUnmount) {\n                this.componentWillUnmount();\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = null;\n            this._defaultProps = null;\n            g.Mixin.unmountComponent.call(this);\n            this._renderedComponent.unmountComponent();\n            this._renderedComponent = null;\n            if (this.refs) {\n                this.refs = null;\n            }\n        ;\n        ;\n        },\n        setState: function(aa, ba) {\n            this.replaceState(n(((this._pendingState || this.state)), aa), ba);\n        },\n        replaceState: function(aa, ba) {\n            t(this);\n            this._pendingState = aa;\n            k.enqueueUpdate(this, ba);\n        },\n        _processProps: function(aa) {\n            var ba, ca = this._defaultProps;\n            {\n                var fin70keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin70i = (0);\n                (0);\n                for (; (fin70i < fin70keys.length); (fin70i++)) {\n                    ((ba) = (fin70keys[fin70i]));\n                    {\n                        if (!((ba in aa))) {\n                            aa[ba] = ca[ba];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = this.constructor.propTypes;\n            if (da) {\n                var ea = this.constructor.displayName;\n                {\n                    var fin71keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin71i = (0);\n                    (0);\n                    for (; (fin71i < fin71keys.length); (fin71i++)) {\n                        ((ba) = (fin71keys[fin71i]));\n                        {\n                            var fa = da[ba];\n                            if (fa) {\n                                fa(aa, ba, ea);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        performUpdateIfNecessary: function() {\n            var aa = this._compositeLifeCycleState;\n            if (((((aa === w.MOUNTING)) || ((aa === w.RECEIVING_PROPS))))) {\n                return;\n            }\n        ;\n        ;\n            g.Mixin.performUpdateIfNecessary.call(this);\n        },\n        _performUpdateIfNecessary: function(aa) {\n            if (((((((this._pendingProps == null)) && ((this._pendingState == null)))) && !this._pendingForceUpdate))) {\n                return;\n            }\n        ;\n        ;\n            var ba = this.props;\n            if (((this._pendingProps != null))) {\n                ba = this._pendingProps;\n                this._processProps(ba);\n                this._pendingProps = null;\n                this._compositeLifeCycleState = w.RECEIVING_PROPS;\n                if (this.componentWillReceiveProps) {\n                    this.componentWillReceiveProps(ba, aa);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = w.RECEIVING_STATE;\n            var ca = ((this._pendingState || this.state));\n            this._pendingState = null;\n            if (((((this._pendingForceUpdate || !this.shouldComponentUpdate)) || this.shouldComponentUpdate(ba, ca)))) {\n                this._pendingForceUpdate = false;\n                this._performComponentUpdate(ba, ca, aa);\n            }\n             else {\n                this.props = ba;\n                this.state = ca;\n            }\n        ;\n        ;\n            this._compositeLifeCycleState = null;\n        },\n        _performComponentUpdate: function(aa, ba, ca) {\n            var da = this.props, ea = this.state;\n            if (this.componentWillUpdate) {\n                this.componentWillUpdate(aa, ba, ca);\n            }\n        ;\n        ;\n            this.props = aa;\n            this.state = ba;\n            this.updateComponent(ca, da, ea);\n            if (this.componentDidUpdate) {\n                ca.getReactOnDOMReady().enqueue(this, this.componentDidUpdate.bind(this, da, ea));\n            }\n        ;\n        ;\n        },\n        updateComponent: function(aa, ba, ca) {\n            g.Mixin.updateComponent.call(this, aa, ba);\n            var da = this._renderedComponent, ea = this._renderValidatedComponent();\n            if (((da.constructor === ea.constructor))) {\n                da.receiveProps(ea.props, aa);\n            }\n             else {\n                var fa = this._rootNodeID, ga = da._rootNodeID;\n                da.unmountComponent();\n                var ha = ea.mountComponent(fa, aa);\n                g.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(ga, ha);\n                this._renderedComponent = ea;\n            }\n        ;\n        ;\n        },\n        forceUpdate: function(aa) {\n            var ba = this._compositeLifeCycleState;\n            l(((this.isMounted() || ((ba === w.MOUNTING)))));\n            l(((((ba !== w.RECEIVING_STATE)) && ((ba !== w.UNMOUNTING)))));\n            this._pendingForceUpdate = true;\n            k.enqueueUpdate(this, aa);\n        },\n        _renderValidatedComponent: function() {\n            var aa;\n            h.current = this;\n            try {\n                aa = this.render();\n            } catch (ba) {\n                throw ba;\n            } finally {\n                h.current = null;\n            };\n        ;\n            l(g.isValidComponent(aa));\n            return aa;\n        },\n        _bindAutoBindMethods: function() {\n            {\n                var fin72keys = ((window.top.JSBNG_Replay.forInKeys)((this.__reactAutoBindMap))), fin72i = (0);\n                var aa;\n                for (; (fin72i < fin72keys.length); (fin72i++)) {\n                    ((aa) = (fin72keys[fin72i]));\n                    {\n                        if (!this.__reactAutoBindMap.hasOwnProperty(aa)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ba = this.__reactAutoBindMap[aa];\n                        this[aa] = this._bindAutoBindMethod(ba);\n                    };\n                };\n            };\n        ;\n        },\n        _bindAutoBindMethod: function(aa) {\n            var ba = this, ca = function() {\n                return aa.apply(ba, arguments);\n            };\n            return ca;\n        }\n    }, y = function() {\n    \n    };\n    o(y, g.Mixin);\n    o(y, i.Mixin);\n    o(y, j.Mixin);\n    o(y, x);\n    var z = {\n        LifeCycle: w,\n        Base: y,\n        createClass: function(aa) {\n            var ba = function() {\n            \n            };\n            ba.prototype = new y();\n            ba.prototype.constructor = ba;\n            u(ba, aa);\n            l(ba.prototype.render);\n            {\n                var fin73keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin73i = (0);\n                var ca;\n                for (; (fin73i < fin73keys.length); (fin73i++)) {\n                    ((ca) = (fin73keys[fin73i]));\n                    {\n                        if (!ba.prototype[ca]) {\n                            ba.prototype[ca] = null;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = function(ea, fa) {\n                var ga = new ba();\n                ga.construct.apply(ga, arguments);\n                return ga;\n            };\n            da.componentConstructor = ba;\n            da.originalSpec = aa;\n            return da;\n        },\n        autoBind: function(aa) {\n            return aa;\n        }\n    };\n    e.exports = z;\n});\n__d(\"ReactMultiChild\", [\"ReactComponent\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\");\n    function h(k, l) {\n        return ((((k && l)) && ((k.constructor === l.constructor))));\n    };\n;\n    var i = {\n        enqueueMarkupAt: function(k, l) {\n            this.domOperations = ((this.domOperations || []));\n            this.domOperations.push({\n                insertMarkup: k,\n                finalIndex: l\n            });\n        },\n        enqueueMove: function(k, l) {\n            this.domOperations = ((this.domOperations || []));\n            this.domOperations.push({\n                moveFrom: k,\n                finalIndex: l\n            });\n        },\n        enqueueUnmountChildByName: function(k, l) {\n            if (g.isValidComponent(l)) {\n                this.domOperations = ((this.domOperations || []));\n                this.domOperations.push({\n                    removeAt: l._domIndex\n                });\n                ((l.unmountComponent && l.unmountComponent()));\n                delete this._renderedChildren[k];\n            }\n        ;\n        ;\n        },\n        processChildDOMOperationsQueue: function() {\n            if (this.domOperations) {\n                g.DOMIDOperations.manageChildrenByParentID(this._rootNodeID, this.domOperations);\n                this.domOperations = null;\n            }\n        ;\n        ;\n        },\n        unmountMultiChild: function() {\n            var k = this._renderedChildren;\n            {\n                var fin74keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin74i = (0);\n                var l;\n                for (; (fin74i < fin74keys.length); (fin74i++)) {\n                    ((l) = (fin74keys[fin74i]));\n                    {\n                        if (((k.hasOwnProperty(l) && k[l]))) {\n                            var m = k[l];\n                            ((m.unmountComponent && m.unmountComponent()));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._renderedChildren = null;\n        },\n        mountMultiChild: function(k, l) {\n            var m = \"\", n = 0;\n            {\n                var fin75keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin75i = (0);\n                var o;\n                for (; (fin75i < fin75keys.length); (fin75i++)) {\n                    ((o) = (fin75keys[fin75i]));\n                    {\n                        var p = k[o];\n                        if (((k.hasOwnProperty(o) && p))) {\n                            m += p.mountComponent(((((this._rootNodeID + \".\")) + o)), l);\n                            p._domIndex = n;\n                            n++;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._renderedChildren = k;\n            this.domOperations = null;\n            return m;\n        },\n        updateMultiChild: function(k, l) {\n            if (((!k && !this._renderedChildren))) {\n                return;\n            }\n             else if (((k && !this._renderedChildren))) {\n                this._renderedChildren = {\n                };\n            }\n             else if (((!k && this._renderedChildren))) {\n                k = {\n                };\n            }\n            \n            \n        ;\n        ;\n            var m = ((this._rootNodeID + \".\")), n = null, o = 0, p = 0, q = 0;\n            {\n                var fin76keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin76i = (0);\n                var r;\n                for (; (fin76i < fin76keys.length); (fin76i++)) {\n                    ((r) = (fin76keys[fin76i]));\n                    {\n                        if (!k.hasOwnProperty(r)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var s = this._renderedChildren[r], t = k[r];\n                        if (h(s, t)) {\n                            if (n) {\n                                this.enqueueMarkupAt(n, ((p - o)));\n                                n = null;\n                            }\n                        ;\n                        ;\n                            o = 0;\n                            if (((s._domIndex < q))) {\n                                this.enqueueMove(s._domIndex, p);\n                            }\n                        ;\n                        ;\n                            q = Math.max(s._domIndex, q);\n                            s.receiveProps(t.props, l);\n                            s._domIndex = p;\n                        }\n                         else {\n                            if (s) {\n                                this.enqueueUnmountChildByName(r, s);\n                                q = Math.max(s._domIndex, q);\n                            }\n                        ;\n                        ;\n                            if (t) {\n                                this._renderedChildren[r] = t;\n                                var u = t.mountComponent(((m + r)), l);\n                                n = ((n ? ((n + u)) : u));\n                                o++;\n                                t._domIndex = p;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        p = ((t ? ((p + 1)) : p));\n                    };\n                };\n            };\n        ;\n            if (n) {\n                this.enqueueMarkupAt(n, ((p - o)));\n            }\n        ;\n        ;\n            {\n                var fin77keys = ((window.top.JSBNG_Replay.forInKeys)((this._renderedChildren))), fin77i = (0);\n                var v;\n                for (; (fin77i < fin77keys.length); (fin77i++)) {\n                    ((v) = (fin77keys[fin77i]));\n                    {\n                        if (!this._renderedChildren.hasOwnProperty(v)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var w = this._renderedChildren[v];\n                        if (((w && !k[v]))) {\n                            this.enqueueUnmountChildByName(v, w);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.processChildDOMOperationsQueue();\n        }\n    }, j = {\n        Mixin: i\n    };\n    e.exports = j;\n});\n__d(\"ReactTextComponent\", [\"ReactComponent\",\"ReactID\",\"escapeTextForBrowser\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactID\"), i = b(\"escapeTextForBrowser\"), j = b(\"mixInto\"), k = function(l) {\n        this.construct({\n            text: l\n        });\n    };\n    j(k, g.Mixin);\n    j(k, {\n        mountComponent: function(l) {\n            g.Mixin.mountComponent.call(this, l);\n            return ((((((((((((\"\\u003Cspan \" + h.ATTR_NAME)) + \"=\\\"\")) + l)) + \"\\\"\\u003E\")) + i(this.props.text))) + \"\\u003C/span\\u003E\"));\n        },\n        receiveProps: function(l, m) {\n            if (((l.text !== this.props.text))) {\n                this.props.text = l.text;\n                g.DOMIDOperations.updateTextContentByID(this._rootNodeID, l.text);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"traverseAllChildren\", [\"ReactComponent\",\"ReactTextComponent\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactComponent\"), h = b(\"ReactTextComponent\"), i = b(\"throwIf\"), j = \"DUPLICATE_KEY_ERROR\", k = \"INVALID_CHILD\", l = function(n, o, p, q, r) {\n        var s = 0;\n        if (Array.isArray(n)) {\n            for (var t = 0; ((t < n.length)); t++) {\n                var u = n[t], v = ((((((o + \"[\")) + g.getKey(u, t))) + \"]\")), w = ((p + s));\n                s += l(u, v, w, q, r);\n            };\n        ;\n        }\n         else {\n            var x = typeof n, y = ((o === \"\")), z = ((y ? ((((\"[\" + g.getKey(n, 0))) + \"]\")) : o));\n            if (((((((n === null)) || ((n === undefined)))) || ((x === \"boolean\"))))) {\n                q(r, null, z, p);\n                s = 1;\n            }\n             else if (n.mountComponentIntoNode) {\n                q(r, n, z, p);\n                s = 1;\n            }\n             else if (((x === \"object\"))) {\n                i(((n && ((n.nodeType === 1)))), k);\n                {\n                    var fin78keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin78i = (0);\n                    var aa;\n                    for (; (fin78i < fin78keys.length); (fin78i++)) {\n                        ((aa) = (fin78keys[fin78i]));\n                        {\n                            if (n.hasOwnProperty(aa)) {\n                                s += l(n[aa], ((((((o + \"{\")) + aa)) + \"}\")), ((p + s)), q, r);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n             else if (((x === \"string\"))) {\n                var ba = new h(n);\n                q(r, ba, z, p);\n                s += 1;\n            }\n             else if (((x === \"number\"))) {\n                var ca = new h(((\"\" + n)));\n                q(r, ca, z, p);\n                s += 1;\n            }\n            \n            \n            \n            \n        ;\n        ;\n        }\n    ;\n    ;\n        return s;\n    };\n    function m(n, o, p) {\n        if (((((n !== null)) && ((n !== undefined))))) {\n            l(n, \"\", 0, o, p);\n        }\n    ;\n    ;\n    };\n;\n    m.DUPLICATE_KEY_ERROR = j;\n    e.exports = m;\n});\n__d(\"flattenChildren\", [\"throwIf\",\"traverseAllChildren\",], function(a, b, c, d, e, f) {\n    var g = b(\"throwIf\"), h = b(\"traverseAllChildren\");\n    function i(k, l, m) {\n        var n = k;\n        n[m] = l;\n    };\n;\n    function j(k) {\n        if (((((k === null)) || ((k === undefined))))) {\n            return k;\n        }\n    ;\n    ;\n        var l = {\n        };\n        h(k, i, l);\n        return l;\n    };\n;\n    e.exports = j;\n});\n__d(\"ReactNativeComponent\", [\"CSSPropertyOperations\",\"DOMProperty\",\"DOMPropertyOperations\",\"ReactComponent\",\"ReactEventEmitter\",\"ReactMultiChild\",\"ReactID\",\"escapeTextForBrowser\",\"flattenChildren\",\"invariant\",\"keyOf\",\"merge\",\"mixInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSSPropertyOperations\"), h = b(\"DOMProperty\"), i = b(\"DOMPropertyOperations\"), j = b(\"ReactComponent\"), k = b(\"ReactEventEmitter\"), l = b(\"ReactMultiChild\"), m = b(\"ReactID\"), n = b(\"escapeTextForBrowser\"), o = b(\"flattenChildren\"), p = b(\"invariant\"), q = b(\"keyOf\"), r = b(\"merge\"), s = b(\"mixInto\"), t = k.putListener, u = k.deleteListener, v = k.registrationNames, w = {\n        string: true,\n        number: true\n    }, x = q({\n        dangerouslySetInnerHTML: null\n    }), y = q({\n        style: null\n    });\n    function z(ba) {\n        if (!ba) {\n            return;\n        }\n    ;\n    ;\n        p(((((ba.children == null)) || ((ba.dangerouslySetInnerHTML == null)))));\n        p(((((ba.style == null)) || ((typeof ba.style === \"object\")))));\n    };\n;\n    function aa(ba, ca) {\n        this._tagOpen = ((\"\\u003C\" + ba));\n        this._tagClose = ((ca ? \"\" : ((((\"\\u003C/\" + ba)) + \"\\u003E\"))));\n        this.tagName = ba.toUpperCase();\n    };\n;\n    aa.Mixin = {\n        mountComponent: function(ba, ca) {\n            j.Mixin.mountComponent.call(this, ba, ca);\n            z(this.props);\n            return ((((this._createOpenTagMarkup() + this._createContentMarkup(ca))) + this._tagClose));\n        },\n        _createOpenTagMarkup: function() {\n            var ba = this.props, ca = this._tagOpen;\n            {\n                var fin79keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin79i = (0);\n                var da;\n                for (; (fin79i < fin79keys.length); (fin79i++)) {\n                    ((da) = (fin79keys[fin79i]));\n                    {\n                        if (!ba.hasOwnProperty(da)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ea = ba[da];\n                        if (((ea == null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (v[da]) {\n                            t(this._rootNodeID, da, ea);\n                        }\n                         else {\n                            if (((da === y))) {\n                                if (ea) {\n                                    ea = ba.style = r(ba.style);\n                                }\n                            ;\n                            ;\n                                ea = g.createMarkupForStyles(ea);\n                            }\n                        ;\n                        ;\n                            var fa = i.createMarkupForProperty(da, ea);\n                            if (fa) {\n                                ca += ((\" \" + fa));\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ga = n(this._rootNodeID);\n            return ((((((((((ca + \" \")) + m.ATTR_NAME)) + \"=\\\"\")) + ga)) + \"\\\"\\u003E\"));\n        },\n        _createContentMarkup: function(ba) {\n            var ca = this.props.dangerouslySetInnerHTML;\n            if (((ca != null))) {\n                if (((ca.__html != null))) {\n                    return ca.__html;\n                }\n            ;\n            ;\n            }\n             else {\n                var da = ((w[typeof this.props.children] ? this.props.children : null)), ea = ((((da != null)) ? null : this.props.children));\n                if (((da != null))) {\n                    return n(da);\n                }\n                 else if (((ea != null))) {\n                    return this.mountMultiChild(o(ea), ba);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return \"\";\n        },\n        receiveProps: function(ba, ca) {\n            z(ba);\n            j.Mixin.receiveProps.call(this, ba, ca);\n        },\n        updateComponent: function(ba, ca) {\n            j.Mixin.updateComponent.call(this, ba, ca);\n            this._updateDOMProperties(ca);\n            this._updateDOMChildren(ca, ba);\n        },\n        _updateDOMProperties: function(ba) {\n            var ca = this.props, da, ea, fa;\n            {\n                var fin80keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin80i = (0);\n                (0);\n                for (; (fin80i < fin80keys.length); (fin80i++)) {\n                    ((da) = (fin80keys[fin80i]));\n                    {\n                        if (((ca.hasOwnProperty(da) || !ba.hasOwnProperty(da)))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((da === y))) {\n                            var ga = ba[da];\n                            {\n                                var fin81keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin81i = (0);\n                                (0);\n                                for (; (fin81i < fin81keys.length); (fin81i++)) {\n                                    ((ea) = (fin81keys[fin81i]));\n                                    {\n                                        if (ga.hasOwnProperty(ea)) {\n                                            fa = ((fa || {\n                                            }));\n                                            fa[ea] = \"\";\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                         else if (((da === x))) {\n                            j.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                        }\n                         else if (v[da]) {\n                            u(this._rootNodeID, da);\n                        }\n                         else j.DOMIDOperations.deletePropertyByID(this._rootNodeID, da);\n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin82keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin82i = (0);\n                (0);\n                for (; (fin82i < fin82keys.length); (fin82i++)) {\n                    ((da) = (fin82keys[fin82i]));\n                    {\n                        var ha = ca[da], ia = ba[da];\n                        if (((!ca.hasOwnProperty(da) || ((ha === ia))))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((da === y))) {\n                            if (ha) {\n                                ha = ca.style = r(ha);\n                            }\n                        ;\n                        ;\n                            if (ia) {\n                                {\n                                    var fin83keys = ((window.top.JSBNG_Replay.forInKeys)((ia))), fin83i = (0);\n                                    (0);\n                                    for (; (fin83i < fin83keys.length); (fin83i++)) {\n                                        ((ea) = (fin83keys[fin83i]));\n                                        {\n                                            if (((ia.hasOwnProperty(ea) && !ha.hasOwnProperty(ea)))) {\n                                                fa = ((fa || {\n                                                }));\n                                                fa[ea] = \"\";\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                                {\n                                    var fin84keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin84i = (0);\n                                    (0);\n                                    for (; (fin84i < fin84keys.length); (fin84i++)) {\n                                        ((ea) = (fin84keys[fin84i]));\n                                        {\n                                            if (((ha.hasOwnProperty(ea) && ((ia[ea] !== ha[ea]))))) {\n                                                fa = ((fa || {\n                                                }));\n                                                fa[ea] = ha[ea];\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                             else fa = ha;\n                        ;\n                        ;\n                        }\n                         else if (((da === x))) {\n                            var ja = ((ia && ia.__html)), ka = ((ha && ha.__html));\n                            if (((ja !== ka))) {\n                                j.DOMIDOperations.updateInnerHTMLByID(this._rootNodeID, ha);\n                            }\n                        ;\n                        ;\n                        }\n                         else if (v[da]) {\n                            t(this._rootNodeID, da, ha);\n                        }\n                         else if (((h.isStandardName[da] || h.isCustomAttribute(da)))) {\n                            j.DOMIDOperations.updatePropertyByID(this._rootNodeID, da, ha);\n                        }\n                        \n                        \n                        \n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (fa) {\n                j.DOMIDOperations.updateStylesByID(this._rootNodeID, fa);\n            }\n        ;\n        ;\n        },\n        _updateDOMChildren: function(ba, ca) {\n            var da = this.props, ea = ((w[typeof ba.children] ? ba.children : null)), fa = ((w[typeof da.children] ? da.children : null)), ga = ((((ea != null)) ? null : ba.children)), ha = ((((fa != null)) ? null : da.children));\n            if (((fa != null))) {\n                var ia = ((((ga != null)) && ((ha == null))));\n                if (ia) {\n                    this.updateMultiChild(null, ca);\n                }\n            ;\n            ;\n                if (((ea !== fa))) {\n                    j.DOMIDOperations.updateTextContentByID(this._rootNodeID, ((\"\" + fa)));\n                }\n            ;\n            ;\n            }\n             else {\n                var ja = ((((ea != null)) && ((fa == null))));\n                if (ja) {\n                    j.DOMIDOperations.updateTextContentByID(this._rootNodeID, \"\");\n                }\n            ;\n            ;\n                this.updateMultiChild(o(da.children), ca);\n            }\n        ;\n        ;\n        },\n        unmountComponent: function() {\n            k.deleteAllListeners(this._rootNodeID);\n            j.Mixin.unmountComponent.call(this);\n            this.unmountMultiChild();\n        }\n    };\n    s(aa, j.Mixin);\n    s(aa, aa.Mixin);\n    s(aa, l.Mixin);\n    e.exports = aa;\n});\n__d(\"objMapKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (!h) {\n            return null;\n        }\n    ;\n    ;\n        var k = 0, l = {\n        };\n        {\n            var fin85keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin85i = (0);\n            var m;\n            for (; (fin85i < fin85keys.length); (fin85i++)) {\n                ((m) = (fin85keys[fin85i]));\n                {\n                    if (h.hasOwnProperty(m)) {\n                        l[m] = i.call(j, m, h[m], k++);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return l;\n    };\n;\n    e.exports = g;\n});\n__d(\"ReactDOM\", [\"ReactNativeComponent\",\"mergeInto\",\"objMapKeyVal\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactNativeComponent\"), h = b(\"mergeInto\"), i = b(\"objMapKeyVal\");\n    function j(m, n) {\n        var o = function() {\n        \n        };\n        o.prototype = new g(m, n);\n        o.prototype.constructor = o;\n        var p = function(q, r) {\n            var s = new o();\n            s.construct.apply(s, arguments);\n            return s;\n        };\n        p.componentConstructor = o;\n        return p;\n    };\n;\n    var k = i({\n        a: false,\n        abbr: false,\n        address: false,\n        area: false,\n        article: false,\n        aside: false,\n        audio: false,\n        b: false,\n        base: false,\n        bdi: false,\n        bdo: false,\n        big: false,\n        blockquote: false,\n        body: false,\n        br: true,\n        button: false,\n        canvas: false,\n        caption: false,\n        cite: false,\n        code: false,\n        col: true,\n        colgroup: false,\n        data: false,\n        datalist: false,\n        dd: false,\n        del: false,\n        details: false,\n        dfn: false,\n        div: false,\n        dl: false,\n        dt: false,\n        em: false,\n        embed: true,\n        fieldset: false,\n        figcaption: false,\n        figure: false,\n        footer: false,\n        form: false,\n        h1: false,\n        h2: false,\n        h3: false,\n        h4: false,\n        h5: false,\n        h6: false,\n        head: false,\n        header: false,\n        hr: true,\n        html: false,\n        i: false,\n        iframe: false,\n        img: true,\n        input: true,\n        ins: false,\n        kbd: false,\n        keygen: true,\n        label: false,\n        legend: false,\n        li: false,\n        link: false,\n        main: false,\n        map: false,\n        mark: false,\n        menu: false,\n        menuitem: false,\n        meta: true,\n        meter: false,\n        nav: false,\n        noscript: false,\n        object: false,\n        ol: false,\n        optgroup: false,\n        option: false,\n        output: false,\n        p: false,\n        param: true,\n        pre: false,\n        progress: false,\n        q: false,\n        rp: false,\n        rt: false,\n        ruby: false,\n        s: false,\n        samp: false,\n        script: false,\n        section: false,\n        select: false,\n        small: false,\n        source: false,\n        span: false,\n        strong: false,\n        style: false,\n        sub: false,\n        summary: false,\n        sup: false,\n        table: false,\n        tbody: false,\n        td: false,\n        textarea: false,\n        tfoot: false,\n        th: false,\n        thead: false,\n        time: false,\n        title: false,\n        tr: false,\n        track: true,\n        u: false,\n        ul: false,\n        \"var\": false,\n        video: false,\n        wbr: false,\n        circle: false,\n        g: false,\n        line: false,\n        path: false,\n        polyline: false,\n        rect: false,\n        svg: false,\n        text: false\n    }, j), l = {\n        injectComponentClasses: function(m) {\n            h(k, m);\n        }\n    };\n    k.injection = l;\n    e.exports = k;\n});\n__d(\"ReactPropTypes\", [\"createObjectFrom\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"createObjectFrom\"), h = b(\"invariant\"), i = {\n        array: k(\"array\"),\n        bool: k(\"boolean\"),\n        func: k(\"function\"),\n        number: k(\"number\"),\n        object: k(\"object\"),\n        string: k(\"string\"),\n        oneOf: l,\n        instanceOf: m\n    }, j = \"\\u003C\\u003Canonymous\\u003E\\u003E\";\n    function k(o) {\n        function p(q, r, s) {\n            var t = typeof q;\n            if (((((t === \"object\")) && Array.isArray(q)))) {\n                t = \"array\";\n            }\n        ;\n        ;\n            h(((t === o)));\n        };\n    ;\n        return n(p);\n    };\n;\n    function l(o) {\n        var p = g(o);\n        function q(r, s, t) {\n            h(p[r]);\n        };\n    ;\n        return n(q);\n    };\n;\n    function m(o) {\n        function p(q, r, s) {\n            h(((q instanceof o)));\n        };\n    ;\n        return n(p);\n    };\n;\n    function n(o) {\n        function p(q) {\n            function r(s, t, u) {\n                var v = s[t];\n                if (((v != null))) {\n                    o(v, t, ((u || j)));\n                }\n                 else h(!q);\n            ;\n            ;\n            };\n        ;\n            if (!q) {\n                r.isRequired = p(true);\n            }\n        ;\n        ;\n            return r;\n        };\n    ;\n        return p(false);\n    };\n;\n    e.exports = i;\n});\n__d(\"ReactServerRendering\", [\"ReactReconcileTransaction\",\"ReactInstanceHandles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactReconcileTransaction\"), h = b(\"ReactInstanceHandles\");\n    function i(j, k) {\n        var l = h.createReactRootID(), m = g.getPooled();\n        m.reinitializeTransaction();\n        try {\n            m.perform(function() {\n                k(j.mountComponent(l, m));\n            }, null);\n        } finally {\n            g.release(m);\n        };\n    ;\n    };\n;\n    e.exports = {\n        renderComponentToString: i\n    };\n});\n__d(\"ReactDOMForm\", [\"ReactCompositeComponent\",\"ReactDOM\",\"ReactEventEmitter\",\"EventConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"ReactEventEmitter\"), j = b(\"EventConstants\"), k = h.form, l = g.createClass({\n        render: function() {\n            return this.transferPropsTo(k(null, this.props.children));\n        },\n        componentDidMount: function(m) {\n            i.trapBubbledEvent(j.topLevelTypes.topSubmit, \"submit\", m);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMInput\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"merge\"), k = i.input, l = h.createClass({\n        getInitialState: function() {\n            return {\n                checked: ((this.props.defaultChecked || false)),\n                value: ((this.props.defaultValue || \"\"))\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getChecked: function() {\n            return ((((this.props.checked != null)) ? this.props.checked : this.state.checked));\n        },\n        getValue: function() {\n            return ((((this.props.value != null)) ? ((\"\" + this.props.value)) : this.state.value));\n        },\n        render: function() {\n            var m = j(this.props);\n            m.checked = this.getChecked();\n            m.value = this.getValue();\n            m.onChange = this.handleChange;\n            return k(m, this.props.children);\n        },\n        componentDidUpdate: function(m, n, o) {\n            if (((this.props.checked != null))) {\n                g.setValueForProperty(o, \"checked\", ((this.props.checked || false)));\n            }\n        ;\n        ;\n            if (((this.props.value != null))) {\n                g.setValueForProperty(o, \"value\", ((((\"\" + this.props.value)) || \"\")));\n            }\n        ;\n        ;\n        },\n        handleChange: function(JSBNG__event) {\n            var m;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                m = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            this.setState({\n                checked: JSBNG__event.target.checked,\n                value: JSBNG__event.target.value\n            });\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"ReactDOMOption\", [\"ReactCompositeComponent\",\"ReactDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = h.option, j = g.createClass({\n        componentWillMount: function() {\n            ((this.props.selected != null));\n        },\n        render: function() {\n            return i(this.props, this.props.children);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ReactDOMSelect\", [\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactDOM\"), i = b(\"invariant\"), j = b(\"merge\"), k = h.select;\n    function l(o, p, q) {\n        if (((o[p] == null))) {\n            return;\n        }\n    ;\n    ;\n        if (o.multiple) {\n            i(Array.isArray(o[p]));\n        }\n         else i(!Array.isArray(o[p]));\n    ;\n    ;\n    };\n;\n    function m() {\n        if (((this.props.value == null))) {\n            return;\n        }\n    ;\n    ;\n        var o = this.getDOMNode().options, p = ((\"\" + this.props.value));\n        for (var q = 0, r = o.length; ((q < r)); q++) {\n            var s = ((this.props.multiple ? ((p.indexOf(o[q].value) >= 0)) : s = ((o[q].value === p))));\n            if (((s !== o[q].selected))) {\n                o[q].selected = s;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    var n = g.createClass({\n        propTypes: {\n            defaultValue: l,\n            value: l\n        },\n        getInitialState: function() {\n            return {\n                value: ((this.props.defaultValue || ((this.props.multiple ? [] : \"\"))))\n            };\n        },\n        componentWillReceiveProps: function(o) {\n            if (((!this.props.multiple && o.multiple))) {\n                this.setState({\n                    value: [this.state.value,]\n                });\n            }\n             else if (((this.props.multiple && !o.multiple))) {\n                this.setState({\n                    value: this.state.value[0]\n                });\n            }\n            \n        ;\n        ;\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        render: function() {\n            var o = j(this.props);\n            o.onChange = this.handleChange;\n            o.value = null;\n            return k(o, this.props.children);\n        },\n        componentDidMount: m,\n        componentDidUpdate: m,\n        handleChange: function(JSBNG__event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            var p;\n            if (this.props.multiple) {\n                p = [];\n                var q = JSBNG__event.target.options;\n                for (var r = 0, s = q.length; ((r < s)); r++) {\n                    if (q[r].selected) {\n                        p.push(q[r].value);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else p = JSBNG__event.target.value;\n        ;\n        ;\n            this.setState({\n                value: p\n            });\n            return o;\n        }\n    });\n    e.exports = n;\n});\n__d(\"ReactDOMTextarea\", [\"DOMPropertyOperations\",\"ReactCompositeComponent\",\"ReactDOM\",\"invariant\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMPropertyOperations\"), h = b(\"ReactCompositeComponent\"), i = b(\"ReactDOM\"), j = b(\"invariant\"), k = b(\"merge\"), l = i.textarea, m = {\n        string: true,\n        number: true\n    }, n = h.createClass({\n        getInitialState: function() {\n            var o = this.props.defaultValue, p = this.props.children;\n            if (((p != null))) {\n                j(((o == null)));\n                if (Array.isArray(p)) {\n                    j(((p.length <= 1)));\n                    p = p[0];\n                }\n            ;\n            ;\n                j(m[typeof p]);\n                o = ((\"\" + p));\n            }\n        ;\n        ;\n            o = ((o || \"\"));\n            return {\n                initialValue: ((((this.props.value != null)) ? this.props.value : o)),\n                value: o\n            };\n        },\n        shouldComponentUpdate: function() {\n            return !this._isChanging;\n        },\n        getValue: function() {\n            return ((((this.props.value != null)) ? this.props.value : this.state.value));\n        },\n        render: function() {\n            var o = k(this.props);\n            j(((o.dangerouslySetInnerHTML == null)));\n            o.value = this.getValue();\n            o.onChange = this.handleChange;\n            return l(o, this.state.initialValue);\n        },\n        componentDidUpdate: function(o, p, q) {\n            if (((this.props.value != null))) {\n                g.setValueForProperty(q, \"value\", ((this.props.value || \"\")));\n            }\n        ;\n        ;\n        },\n        handleChange: function(JSBNG__event) {\n            var o;\n            if (this.props.onChange) {\n                this._isChanging = true;\n                o = this.props.onChange(JSBNG__event);\n                this._isChanging = false;\n            }\n        ;\n        ;\n            this.setState({\n                value: JSBNG__event.target.value\n            });\n            return o;\n        }\n    });\n    e.exports = n;\n});\n__d(\"DefaultDOMPropertyConfig\", [\"DOMProperty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMProperty\"), h = g.injection.MUST_USE_ATTRIBUTE, i = g.injection.MUST_USE_PROPERTY, j = g.injection.HAS_BOOLEAN_VALUE, k = g.injection.HAS_SIDE_EFFECTS, l = {\n        isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n        Properties: {\n            accessKey: null,\n            accept: null,\n            action: null,\n            ajaxify: h,\n            allowFullScreen: ((h | j)),\n            allowTransparency: h,\n            alt: null,\n            autoComplete: null,\n            autoFocus: j,\n            autoPlay: j,\n            cellPadding: null,\n            cellSpacing: null,\n            checked: ((i | j)),\n            className: i,\n            colSpan: null,\n            contentEditable: null,\n            contextMenu: h,\n            controls: ((i | j)),\n            data: null,\n            dateTime: h,\n            dir: null,\n            disabled: ((i | j)),\n            draggable: null,\n            encType: null,\n            frameBorder: h,\n            height: h,\n            hidden: ((h | j)),\n            href: null,\n            htmlFor: null,\n            icon: null,\n            id: i,\n            label: null,\n            lang: null,\n            list: null,\n            max: null,\n            maxLength: h,\n            method: null,\n            min: null,\n            multiple: ((i | j)),\n            JSBNG__name: null,\n            pattern: null,\n            poster: null,\n            preload: null,\n            placeholder: null,\n            radioGroup: null,\n            rel: null,\n            readOnly: ((i | j)),\n            required: j,\n            role: h,\n            scrollLeft: i,\n            scrollTop: i,\n            selected: ((i | j)),\n            size: null,\n            spellCheck: null,\n            src: null,\n            step: null,\n            style: null,\n            tabIndex: null,\n            target: null,\n            title: null,\n            type: null,\n            value: ((i | k)),\n            width: h,\n            wmode: h,\n            cx: i,\n            cy: i,\n            d: i,\n            fill: i,\n            fx: i,\n            fy: i,\n            points: i,\n            r: i,\n            stroke: i,\n            strokeLinecap: i,\n            strokeWidth: i,\n            transform: i,\n            x: i,\n            x1: i,\n            x2: i,\n            version: i,\n            viewBox: i,\n            y: i,\n            y1: i,\n            y2: i,\n            spreadMethod: i,\n            offset: i,\n            stopColor: i,\n            stopOpacity: i,\n            gradientUnits: i,\n            gradientTransform: i\n        },\n        DOMAttributeNames: {\n            className: \"class\",\n            htmlFor: \"for\",\n            strokeLinecap: \"stroke-linecap\",\n            strokeWidth: \"stroke-width\",\n            stopColor: \"stop-color\",\n            stopOpacity: \"stop-opacity\"\n        },\n        DOMPropertyNames: {\n            autoComplete: \"autocomplete\",\n            autoFocus: \"autofocus\",\n            autoPlay: \"autoplay\",\n            encType: \"enctype\",\n            radioGroup: \"radiogroup\",\n            spellCheck: \"spellcheck\"\n        },\n        DOMMutationMethods: {\n            className: function(m, n) {\n                m.className = ((n || \"\"));\n            }\n        }\n    };\n    e.exports = l;\n});\n__d(\"DefaultEventPluginOrder\", [\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyOf\"), h = [g({\n        ResponderEventPlugin: null\n    }),g({\n        SimpleEventPlugin: null\n    }),g({\n        TapEventPlugin: null\n    }),g({\n        EnterLeaveEventPlugin: null\n    }),g({\n        ChangeEventPlugin: null\n    }),g({\n        AnalyticsEventPlugin: null\n    }),];\n    e.exports = h;\n});\n__d(\"SyntheticEvent\", [\"PooledClass\",\"emptyFunction\",\"getEventTarget\",\"merge\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"PooledClass\"), h = b(\"emptyFunction\"), i = b(\"getEventTarget\"), j = b(\"merge\"), k = b(\"mergeInto\"), l = {\n        type: null,\n        target: i,\n        currentTarget: null,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(JSBNG__event) {\n            return ((JSBNG__event.timeStamp || JSBNG__Date.now()));\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    function m(n, o, p) {\n        this.dispatchConfig = n;\n        this.dispatchMarker = o;\n        this.nativeEvent = p;\n        var q = this.constructor.Interface;\n        {\n            var fin86keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin86i = (0);\n            var r;\n            for (; (fin86i < fin86keys.length); (fin86i++)) {\n                ((r) = (fin86keys[fin86i]));\n                {\n                    var s = q[r];\n                    if (s) {\n                        this[r] = s(p);\n                    }\n                     else this[r] = p[r];\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (((p.defaultPrevented || ((p.returnValue === false))))) {\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        }\n         else this.isDefaultPrevented = h.thatReturnsFalse;\n    ;\n    ;\n        this.isPropagationStopped = h.thatReturnsFalse;\n    };\n;\n    k(m.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = true;\n            var JSBNG__event = this.nativeEvent;\n            ((JSBNG__event.preventDefault ? JSBNG__event.preventDefault() : JSBNG__event.returnValue = false));\n            this.isDefaultPrevented = h.thatReturnsTrue;\n        },\n        stopPropagation: function() {\n            var JSBNG__event = this.nativeEvent;\n            ((JSBNG__event.stopPropagation ? JSBNG__event.stopPropagation() : JSBNG__event.cancelBubble = true));\n            this.isPropagationStopped = h.thatReturnsTrue;\n        },\n        persist: function() {\n            this.isPersistent = h.thatReturnsTrue;\n        },\n        isPersistent: h.thatReturnsFalse,\n        destructor: function() {\n            var n = this.constructor.Interface;\n            {\n                var fin87keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin87i = (0);\n                var o;\n                for (; (fin87i < fin87keys.length); (fin87i++)) {\n                    ((o) = (fin87keys[fin87i]));\n                    {\n                        this[o] = null;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.dispatchConfig = null;\n            this.dispatchMarker = null;\n            this.nativeEvent = null;\n        }\n    });\n    m.Interface = l;\n    m.augmentClass = function(n, o) {\n        var p = this, q = Object.create(p.prototype);\n        k(q, n.prototype);\n        n.prototype = q;\n        n.prototype.constructor = n;\n        n.Interface = j(p.Interface, o);\n        n.augmentClass = p.augmentClass;\n        g.addPoolingTo(n, g.threeArgumentPooler);\n    };\n    g.addPoolingTo(m, g.threeArgumentPooler);\n    e.exports = m;\n});\n__d(\"SyntheticUIEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        view: null,\n        detail: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMouseEvent\", [\"SyntheticUIEvent\",\"ViewportMetrics\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = b(\"ViewportMetrics\"), i = {\n        JSBNG__screenX: null,\n        JSBNG__screenY: null,\n        clientX: null,\n        clientY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        button: function(JSBNG__event) {\n            var k = JSBNG__event.button;\n            if (((\"which\" in JSBNG__event))) {\n                return k;\n            }\n        ;\n        ;\n            return ((((k === 2)) ? 2 : ((((k === 4)) ? 1 : 0))));\n        },\n        buttons: null,\n        relatedTarget: function(JSBNG__event) {\n            return ((JSBNG__event.relatedTarget || ((((JSBNG__event.fromElement === JSBNG__event.srcElement)) ? JSBNG__event.toElement : JSBNG__event.fromElement))));\n        },\n        pageX: function(JSBNG__event) {\n            return ((((\"pageX\" in JSBNG__event)) ? JSBNG__event.pageX : ((JSBNG__event.clientX + h.currentScrollLeft))));\n        },\n        pageY: function(JSBNG__event) {\n            return ((((\"pageY\" in JSBNG__event)) ? JSBNG__event.pageY : ((JSBNG__event.clientY + h.currentScrollTop))));\n        }\n    };\n    function j(k, l, m) {\n        g.call(this, k, l, m);\n    };\n;\n    g.augmentClass(j, i);\n    e.exports = j;\n});\n__d(\"EnterLeaveEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"ExecutionEnvironment\",\"ReactInstanceHandles\",\"SyntheticMouseEvent\",\"ReactID\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"ExecutionEnvironment\"), j = b(\"ReactInstanceHandles\"), k = b(\"SyntheticMouseEvent\"), l = b(\"ReactID\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = j.getFirstReactDOM, p = {\n        mouseEnter: {\n            registrationName: m({\n                onMouseEnter: null\n            })\n        },\n        mouseLeave: {\n            registrationName: m({\n                onMouseLeave: null\n            })\n        }\n    }, q = {\n        eventTypes: p,\n        extractEvents: function(r, s, t, u) {\n            if (((((r === n.topMouseOver)) && ((u.relatedTarget || u.fromElement))))) {\n                return null;\n            }\n        ;\n        ;\n            if (((((r !== n.topMouseOut)) && ((r !== n.topMouseOver))))) {\n                return null;\n            }\n        ;\n        ;\n            var v, w;\n            if (((r === n.topMouseOut))) {\n                v = s;\n                w = ((o(((u.relatedTarget || u.toElement))) || i.global));\n            }\n             else {\n                v = i.global;\n                w = s;\n            }\n        ;\n        ;\n            if (((v === w))) {\n                return null;\n            }\n        ;\n        ;\n            var x = ((v ? l.getID(v) : \"\")), y = ((w ? l.getID(w) : \"\")), z = k.getPooled(p.mouseLeave, x, u), aa = k.getPooled(p.mouseEnter, y, u);\n            h.accumulateEnterLeaveDispatches(z, aa, x, y);\n            return [z,aa,];\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChangeEventPlugin\", [\"EventConstants\",\"EventPluginHub\",\"EventPropagators\",\"ExecutionEnvironment\",\"SyntheticEvent\",\"isEventSupported\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPluginHub\"), i = b(\"EventPropagators\"), j = b(\"ExecutionEnvironment\"), k = b(\"SyntheticEvent\"), l = b(\"isEventSupported\"), m = b(\"keyOf\"), n = g.topLevelTypes, o = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: m({\n                    onChange: null\n                }),\n                captured: m({\n                    onChangeCapture: null\n                })\n            }\n        }\n    }, p = null, q = null, r = null, s = null;\n    function t(na) {\n        return ((((na.nodeName === \"SELECT\")) || ((((na.nodeName === \"INPUT\")) && ((na.type === \"file\"))))));\n    };\n;\n    var u = false;\n    if (j.canUseDOM) {\n        u = ((l(\"change\") && ((!((\"documentMode\" in JSBNG__document)) || ((JSBNG__document.documentMode > 8))))));\n    }\n;\n;\n    function v(na) {\n        var JSBNG__event = k.getPooled(o.change, q, na);\n        i.accumulateTwoPhaseDispatches(JSBNG__event);\n        h.enqueueEvents(JSBNG__event);\n        h.processEventQueue();\n    };\n;\n    function w(na, oa) {\n        p = na;\n        q = oa;\n        p.JSBNG__attachEvent(\"JSBNG__onchange\", v);\n    };\n;\n    function x() {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        p.JSBNG__detachEvent(\"JSBNG__onchange\", v);\n        p = null;\n        q = null;\n    };\n;\n    function y(na, oa, pa) {\n        if (((na === n.topChange))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    function z(na, oa, pa) {\n        if (((na === n.topFocus))) {\n            x();\n            w(oa, pa);\n        }\n         else if (((na === n.topBlur))) {\n            x();\n        }\n        \n    ;\n    ;\n    };\n;\n    var aa = false;\n    if (j.canUseDOM) {\n        aa = ((l(\"input\") && ((!((\"documentMode\" in JSBNG__document)) || ((JSBNG__document.documentMode > 9))))));\n    }\n;\n;\n    var ba = {\n        color: true,\n        date: true,\n        datetime: true,\n        \"datetime-local\": true,\n        email: true,\n        month: true,\n        number: true,\n        password: true,\n        range: true,\n        search: true,\n        tel: true,\n        text: true,\n        time: true,\n        url: true,\n        week: true\n    };\n    function ca(na) {\n        return ((((((na.nodeName === \"INPUT\")) && ba[na.type])) || ((na.nodeName === \"TEXTAREA\"))));\n    };\n;\n    var da = {\n        get: function() {\n            return s.get.call(this);\n        },\n        set: function(na) {\n            r = ((\"\" + na));\n            s.set.call(this, na);\n        }\n    };\n    function ea(na, oa) {\n        p = na;\n        q = oa;\n        r = na.value;\n        s = Object.getOwnPropertyDescriptor(na.constructor.prototype, \"value\");\n        Object.defineProperty(p, \"value\", da);\n        p.JSBNG__attachEvent(\"onpropertychange\", ga);\n    };\n;\n    function fa() {\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        delete p.value;\n        p.JSBNG__detachEvent(\"onpropertychange\", ga);\n        p = null;\n        q = null;\n        r = null;\n        s = null;\n    };\n;\n    function ga(na) {\n        if (((na.propertyName !== \"value\"))) {\n            return;\n        }\n    ;\n    ;\n        var oa = na.srcElement.value;\n        if (((oa === r))) {\n            return;\n        }\n    ;\n    ;\n        r = oa;\n        v(na);\n    };\n;\n    function ha(na, oa, pa) {\n        if (((na === n.topInput))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    function ia(na, oa, pa) {\n        if (((na === n.topFocus))) {\n            fa();\n            ea(oa, pa);\n        }\n         else if (((na === n.topBlur))) {\n            fa();\n        }\n        \n    ;\n    ;\n    };\n;\n    function ja(na, oa, pa) {\n        if (((((((na === n.topSelectionChange)) || ((na === n.topKeyUp)))) || ((na === n.topKeyDown))))) {\n            if (((p && ((p.value !== r))))) {\n                r = p.value;\n                return q;\n            }\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ka(na) {\n        return ((((na.nodeName === \"INPUT\")) && ((((na.type === \"checkbox\")) || ((na.type === \"radio\"))))));\n    };\n;\n    function la(na, oa, pa) {\n        if (((na === n.topClick))) {\n            return pa;\n        }\n    ;\n    ;\n    };\n;\n    var ma = {\n        eventTypes: o,\n        extractEvents: function(na, oa, pa, qa) {\n            var ra, sa;\n            if (t(oa)) {\n                if (u) {\n                    ra = y;\n                }\n                 else sa = z;\n            ;\n            ;\n            }\n             else if (ca(oa)) {\n                if (aa) {\n                    ra = ha;\n                }\n                 else {\n                    ra = ja;\n                    sa = ia;\n                }\n            ;\n            ;\n            }\n             else if (ka(oa)) {\n                ra = la;\n            }\n            \n            \n        ;\n        ;\n            if (ra) {\n                var ta = ra(na, oa, pa);\n                if (ta) {\n                    var JSBNG__event = k.getPooled(o.change, ta, qa);\n                    i.accumulateTwoPhaseDispatches(JSBNG__event);\n                    return JSBNG__event;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (sa) {\n                sa(na, oa, pa);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ma;\n});\n__d(\"SyntheticFocusEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        relatedTarget: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticKeyboardEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        char: null,\n        key: null,\n        JSBNG__location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        charCode: null,\n        keyCode: null,\n        which: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticMutationEvent\", [\"SyntheticEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticEvent\"), h = {\n        relatedNode: null,\n        prevValue: null,\n        newValue: null,\n        attrName: null,\n        attrChange: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticTouchEvent\", [\"SyntheticUIEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticUIEvent\"), h = {\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SyntheticWheelEvent\", [\"SyntheticMouseEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SyntheticMouseEvent\"), h = {\n        deltaX: function(JSBNG__event) {\n            return ((((\"deltaX\" in JSBNG__event)) ? JSBNG__event.deltaX : ((((\"wheelDeltaX\" in JSBNG__event)) ? -JSBNG__event.wheelDeltaX : 0))));\n        },\n        deltaY: function(JSBNG__event) {\n            return ((((\"deltaY\" in JSBNG__event)) ? -JSBNG__event.deltaY : ((((\"wheelDeltaY\" in JSBNG__event)) ? JSBNG__event.wheelDeltaY : ((((\"wheelDelta\" in JSBNG__event)) ? JSBNG__event.wheelData : 0))))));\n        },\n        deltaZ: null,\n        deltaMode: null\n    };\n    function i(j, k, l) {\n        g.call(this, j, k, l);\n    };\n;\n    g.augmentClass(i, h);\n    e.exports = i;\n});\n__d(\"SimpleEventPlugin\", [\"EventConstants\",\"EventPropagators\",\"SyntheticEvent\",\"SyntheticFocusEvent\",\"SyntheticKeyboardEvent\",\"SyntheticMouseEvent\",\"SyntheticMutationEvent\",\"SyntheticTouchEvent\",\"SyntheticUIEvent\",\"SyntheticWheelEvent\",\"invariant\",\"keyOf\",], function(a, b, c, d, e, f) {\n    var g = b(\"EventConstants\"), h = b(\"EventPropagators\"), i = b(\"SyntheticEvent\"), j = b(\"SyntheticFocusEvent\"), k = b(\"SyntheticKeyboardEvent\"), l = b(\"SyntheticMouseEvent\"), m = b(\"SyntheticMutationEvent\"), n = b(\"SyntheticTouchEvent\"), o = b(\"SyntheticUIEvent\"), p = b(\"SyntheticWheelEvent\"), q = b(\"invariant\"), r = b(\"keyOf\"), s = g.topLevelTypes, t = {\n        JSBNG__blur: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onBlur: true\n                }),\n                captured: r({\n                    onBlurCapture: true\n                })\n            }\n        },\n        click: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onClick: true\n                }),\n                captured: r({\n                    onClickCapture: true\n                })\n            }\n        },\n        doubleClick: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDoubleClick: true\n                }),\n                captured: r({\n                    onDoubleClickCapture: true\n                })\n            }\n        },\n        drag: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrag: true\n                }),\n                captured: r({\n                    onDragCapture: true\n                })\n            }\n        },\n        dragEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnd: true\n                }),\n                captured: r({\n                    onDragEndCapture: true\n                })\n            }\n        },\n        dragEnter: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragEnter: true\n                }),\n                captured: r({\n                    onDragEnterCapture: true\n                })\n            }\n        },\n        dragExit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragExit: true\n                }),\n                captured: r({\n                    onDragExitCapture: true\n                })\n            }\n        },\n        dragLeave: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragLeave: true\n                }),\n                captured: r({\n                    onDragLeaveCapture: true\n                })\n            }\n        },\n        dragOver: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragOver: true\n                }),\n                captured: r({\n                    onDragOverCapture: true\n                })\n            }\n        },\n        dragStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDragStart: true\n                }),\n                captured: r({\n                    onDragStartCapture: true\n                })\n            }\n        },\n        drop: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDrop: true\n                }),\n                captured: r({\n                    onDropCapture: true\n                })\n            }\n        },\n        DOMCharacterDataModified: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onDOMCharacterDataModified: true\n                }),\n                captured: r({\n                    onDOMCharacterDataModifiedCapture: true\n                })\n            }\n        },\n        JSBNG__focus: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onFocus: true\n                }),\n                captured: r({\n                    onFocusCapture: true\n                })\n            }\n        },\n        input: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onInput: true\n                }),\n                captured: r({\n                    onInputCapture: true\n                })\n            }\n        },\n        keyDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyDown: true\n                }),\n                captured: r({\n                    onKeyDownCapture: true\n                })\n            }\n        },\n        keyPress: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyPress: true\n                }),\n                captured: r({\n                    onKeyPressCapture: true\n                })\n            }\n        },\n        keyUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onKeyUp: true\n                }),\n                captured: r({\n                    onKeyUpCapture: true\n                })\n            }\n        },\n        mouseDown: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseDown: true\n                }),\n                captured: r({\n                    onMouseDownCapture: true\n                })\n            }\n        },\n        mouseMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseMove: true\n                }),\n                captured: r({\n                    onMouseMoveCapture: true\n                })\n            }\n        },\n        mouseUp: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onMouseUp: true\n                }),\n                captured: r({\n                    onMouseUpCapture: true\n                })\n            }\n        },\n        JSBNG__scroll: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onScroll: true\n                }),\n                captured: r({\n                    onScrollCapture: true\n                })\n            }\n        },\n        submit: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onSubmit: true\n                }),\n                captured: r({\n                    onSubmitCapture: true\n                })\n            }\n        },\n        touchCancel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchCancel: true\n                }),\n                captured: r({\n                    onTouchCancelCapture: true\n                })\n            }\n        },\n        touchEnd: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchEnd: true\n                }),\n                captured: r({\n                    onTouchEndCapture: true\n                })\n            }\n        },\n        touchMove: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchMove: true\n                }),\n                captured: r({\n                    onTouchMoveCapture: true\n                })\n            }\n        },\n        touchStart: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onTouchStart: true\n                }),\n                captured: r({\n                    onTouchStartCapture: true\n                })\n            }\n        },\n        wheel: {\n            phasedRegistrationNames: {\n                bubbled: r({\n                    onWheel: true\n                }),\n                captured: r({\n                    onWheelCapture: true\n                })\n            }\n        }\n    }, u = {\n        topBlur: t.JSBNG__blur,\n        topClick: t.click,\n        topDoubleClick: t.doubleClick,\n        topDOMCharacterDataModified: t.DOMCharacterDataModified,\n        topDrag: t.drag,\n        topDragEnd: t.dragEnd,\n        topDragEnter: t.dragEnter,\n        topDragExit: t.dragExit,\n        topDragLeave: t.dragLeave,\n        topDragOver: t.dragOver,\n        topDragStart: t.dragStart,\n        topDrop: t.drop,\n        topFocus: t.JSBNG__focus,\n        topInput: t.input,\n        topKeyDown: t.keyDown,\n        topKeyPress: t.keyPress,\n        topKeyUp: t.keyUp,\n        topMouseDown: t.mouseDown,\n        topMouseMove: t.mouseMove,\n        topMouseUp: t.mouseUp,\n        topScroll: t.JSBNG__scroll,\n        topSubmit: t.submit,\n        topTouchCancel: t.touchCancel,\n        topTouchEnd: t.touchEnd,\n        topTouchMove: t.touchMove,\n        topTouchStart: t.touchStart,\n        topWheel: t.wheel\n    }, v = {\n        eventTypes: t,\n        executeDispatch: function(JSBNG__event, w, x) {\n            var y = w(JSBNG__event, x);\n            if (((y === false))) {\n                JSBNG__event.stopPropagation();\n                JSBNG__event.preventDefault();\n            }\n        ;\n        ;\n        },\n        extractEvents: function(w, x, y, z) {\n            var aa = u[w];\n            if (!aa) {\n                return null;\n            }\n        ;\n        ;\n            var ba;\n            switch (w) {\n              case s.topInput:\n            \n              case s.topSubmit:\n                ba = i;\n                break;\n              case s.topKeyDown:\n            \n              case s.topKeyPress:\n            \n              case s.topKeyUp:\n                ba = k;\n                break;\n              case s.topBlur:\n            \n              case s.topFocus:\n                ba = j;\n                break;\n              case s.topClick:\n            \n              case s.topDoubleClick:\n            \n              case s.topDrag:\n            \n              case s.topDragEnd:\n            \n              case s.topDragEnter:\n            \n              case s.topDragExit:\n            \n              case s.topDragLeave:\n            \n              case s.topDragOver:\n            \n              case s.topDragStart:\n            \n              case s.topDrop:\n            \n              case s.topMouseDown:\n            \n              case s.topMouseMove:\n            \n              case s.topMouseUp:\n                ba = l;\n                break;\n              case s.topDOMCharacterDataModified:\n                ba = m;\n                break;\n              case s.topTouchCancel:\n            \n              case s.topTouchEnd:\n            \n              case s.topTouchMove:\n            \n              case s.topTouchStart:\n                ba = n;\n                break;\n              case s.topScroll:\n                ba = o;\n                break;\n              case s.topWheel:\n                ba = p;\n                break;\n            };\n        ;\n            q(ba);\n            var JSBNG__event = ba.getPooled(aa, y, z);\n            h.accumulateTwoPhaseDispatches(JSBNG__event);\n            return JSBNG__event;\n        }\n    };\n    e.exports = v;\n});\n__d(\"ReactDefaultInjection\", [\"ReactDOM\",\"ReactDOMForm\",\"ReactDOMInput\",\"ReactDOMOption\",\"ReactDOMSelect\",\"ReactDOMTextarea\",\"DefaultDOMPropertyConfig\",\"DOMProperty\",\"DefaultEventPluginOrder\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"EventPluginHub\",\"ReactInstanceHandles\",\"SimpleEventPlugin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactDOM\"), h = b(\"ReactDOMForm\"), i = b(\"ReactDOMInput\"), j = b(\"ReactDOMOption\"), k = b(\"ReactDOMSelect\"), l = b(\"ReactDOMTextarea\"), m = b(\"DefaultDOMPropertyConfig\"), n = b(\"DOMProperty\"), o = b(\"DefaultEventPluginOrder\"), p = b(\"EnterLeaveEventPlugin\"), q = b(\"ChangeEventPlugin\"), r = b(\"EventPluginHub\"), s = b(\"ReactInstanceHandles\"), t = b(\"SimpleEventPlugin\");\n    function u() {\n        r.injection.injectEventPluginOrder(o);\n        r.injection.injectInstanceHandle(s);\n        r.injection.injectEventPluginsByName({\n            SimpleEventPlugin: t,\n            EnterLeaveEventPlugin: p,\n            ChangeEventPlugin: q\n        });\n        g.injection.injectComponentClasses({\n            form: h,\n            input: i,\n            option: j,\n            select: k,\n            textarea: l\n        });\n        n.injection.injectDOMPropertyConfig(m);\n    };\n;\n    e.exports = {\n        inject: u\n    };\n});\n__d(\"React\", [\"ReactCompositeComponent\",\"ReactComponent\",\"ReactDOM\",\"ReactMount\",\"ReactPropTypes\",\"ReactServerRendering\",\"ReactDefaultInjection\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactCompositeComponent\"), h = b(\"ReactComponent\"), i = b(\"ReactDOM\"), j = b(\"ReactMount\"), k = b(\"ReactPropTypes\"), l = b(\"ReactServerRendering\"), m = b(\"ReactDefaultInjection\");\n    m.inject();\n    var n = {\n        DOM: i,\n        PropTypes: k,\n        initializeTouchEvents: function(o) {\n            j.useTouchEvents = o;\n        },\n        autoBind: g.autoBind,\n        createClass: g.createClass,\n        constructAndRenderComponent: j.constructAndRenderComponent,\n        constructAndRenderComponentByID: j.constructAndRenderComponentByID,\n        renderComponent: j.renderComponent,\n        renderComponentToString: l.renderComponentToString,\n        unmountAndReleaseReactRootNode: j.unmountAndReleaseReactRootNode,\n        isValidComponent: h.isValidComponent\n    };\n    e.exports = n;\n});\n__d(\"CloseButton.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"CloseButton\",\n        render: function() {\n            var j = this.props, k = ((j.size || \"medium\")), l = ((j.appearance || \"normal\")), m = ((k === \"small\")), n = ((k === \"huge\")), o = ((l === \"dark\")), p = ((l === \"inverted\")), q = (((((((((((((\"uiCloseButton\") + ((m ? ((\" \" + \"uiCloseButtonSmall\")) : \"\")))) + ((n ? ((\" \" + \"uiCloseButtonHuge\")) : \"\")))) + ((((m && o)) ? ((\" \" + \"uiCloseButtonSmallDark\")) : \"\")))) + ((((m && p)) ? ((\" \" + \"uiCloseButtonSmallInverted\")) : \"\")))) + ((((!m && o)) ? ((\" \" + \"uiCloseButtonDark\")) : \"\")))) + ((((!m && p)) ? ((\" \" + \"uiCloseButtonInverted\")) : \"\"))));\n            return this.transferPropsTo(g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                \"aria-label\": j.tooltip,\n                \"data-hover\": ((j.tooltip && \"tooltip\")),\n                \"data-tooltip-alignh\": ((j.tooltip && \"center\")),\n                className: q\n            }));\n        }\n    });\n    e.exports = i;\n});\n__d(\"HovercardLink\", [\"Bootloader\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"URI\"), i = {\n        getBaseURI: function() {\n            return h(\"/ajax/hovercard/hovercard.php\");\n        },\n        constructEndpoint: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, k, null);\n        },\n        constructEndpointWithLocation: function(j, k) {\n            return i.constructEndpointWithGroupAndLocation(j, null, k);\n        },\n        constructEndpointWithGroupAndLocation: function(j, k, l) {\n            g.loadModules([\"Hovercard\",], function() {\n            \n            });\n            var m = new h(i.getBaseURI()).setQueryData({\n                id: j.id\n            }), n = {\n            };\n            if (((j.weakreference && k))) {\n                n.group_id = k;\n            }\n        ;\n        ;\n            if (l) {\n                n.hc_location = l;\n            }\n        ;\n        ;\n            m.addQueryData({\n                extragetparams: JSON.stringify(n)\n            });\n            return m;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSBNG__Image.react\", [\"React\",\"invariant\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"invariant\"), i = b(\"joinClasses\"), j = g.createClass({\n        displayName: \"ReactImage\",\n        propTypes: {\n            src: function(k, l, m) {\n                var n = k[l];\n                h(((((typeof n === \"string\")) || ((((typeof n === \"object\")) && ((((((n.sprited && n.spriteMapCssClass)) && n.spriteCssClass)) || ((!n.sprited && n.uri)))))))));\n            }\n        },\n        render: function() {\n            var k, l, m = this.props.src, n = \"img\";\n            l = true;\n            if (((typeof m === \"string\"))) {\n                k = g.DOM.img({\n                    className: n,\n                    src: m\n                });\n            }\n             else if (m.sprited) {\n                n = i(n, m.spriteMapCssClass, m.spriteCssClass);\n                k = g.DOM.i({\n                    className: n,\n                    src: null\n                });\n                l = false;\n            }\n             else {\n                k = g.DOM.img({\n                    className: n,\n                    src: m.uri\n                });\n                if (((((typeof this.props.width === \"undefined\")) && ((typeof this.props.height === \"undefined\"))))) {\n                    k.props.width = m.width;\n                    k.props.height = m.height;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (this.props.alt) {\n                if (l) {\n                    k.props.alt = this.props.alt;\n                }\n                 else k.props.children = g.DOM.u(null, this.props.alt);\n            ;\n            }\n        ;\n        ;\n            return this.transferPropsTo(k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"LeftRight.react\", [\"React\",\"cx\",\"keyMirror\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = b(\"keyMirror\"), j = b(\"throwIf\"), k = i({\n        left: true,\n        right: true,\n        both: true\n    });\n    function l(n) {\n        j(((((!n.children || ((n.children.length < 1)))) || ((n.children.length > 2)))), \"LeftRight component must have one or two children.\");\n    };\n;\n    var m = g.createClass({\n        displayName: \"LeftRight\",\n        render: function() {\n            l(this.props);\n            var n = ((this.props.direction || k.both)), o = ((n === k.both)), p = g.DOM.div({\n                key: \"left\",\n                className: ((((o || ((n === k.left)))) ? \"lfloat\" : \"\"))\n            }, this.props.children[0]), q = ((((this.props.children.length < 2)) ? null : g.DOM.div({\n                key: \"right\",\n                className: ((((o || ((n === k.right)))) ? \"rfloat\" : \"\"))\n            }, this.props.children[1]))), r = ((((((n === k.right)) && q)) ? [q,p,] : [p,q,]));\n            return this.transferPropsTo(g.DOM.div({\n                className: \"clearfix\"\n            }, r));\n        }\n    });\n    m.DIRECTION = k;\n    e.exports = m;\n});\n__d(\"ImageBlock.react\", [\"LeftRight.react\",\"React\",\"cx\",\"joinClasses\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"throwIf\");\n    function l(p) {\n        k(((((!p.children || ((p.children.length > 3)))) || ((p.children.length < 1)))), \"ImageBlock requires two or three children.\");\n    };\n;\n    function m(p) {\n        return (((((((((\"img\") + ((\" \" + \"-cx-PRIVATE-uiImageBlock__image\")))) + ((((p === \"small\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__smallimage\")) : \"\")))) + ((((p === \"medium\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__mediumimage\")) : \"\")))) + ((((p === \"large\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__largeimage\")) : \"\"))));\n    };\n;\n    function n(p, q, r) {\n        p.props.className = j(m(q), p.props.className, r);\n    };\n;\n    var o = h.createClass({\n        displayName: \"ImageBlock\",\n        render: function() {\n            l(this.props);\n            var p = this.props.children[0], q = this.props.children[1], r = this.props.children[2], s = ((this.props.spacing || \"small\"));\n            n(p, s, this.props.imageClassName);\n            var t = j(this.props.contentClassName, (((\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\") + ((((s === \"small\")) ? ((\" \" + \"-cx-PRIVATE-uiImageBlock__smallcontent\")) : \"\")))));\n            if (((p.tagName == \"IMG\"))) {\n                if (((p.props.alt === undefined))) {\n                    p.props.alt = \"\";\n                }\n            ;\n            ;\n            }\n             else if (((((((((((p.tagName == \"A\")) || ((p.tagName == \"LINK\")))) && ((p.props.tabIndex === undefined)))) && ((p.props.title === undefined)))) && ((p.props[\"aria-label\"] === undefined))))) {\n                p.props.tabIndex = \"-1\";\n                p.props[\"aria-hidden\"] = \"true\";\n            }\n            \n        ;\n        ;\n            var u;\n            if (!r) {\n                u = h.DOM.div({\n                    className: t\n                }, q);\n            }\n             else u = g({\n                className: t,\n                direction: g.DIRECTION.right\n            }, q, r);\n        ;\n        ;\n            return this.transferPropsTo(g({\n                direction: g.DIRECTION.left\n            }, p, u));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UntrustedLink\", [\"DOM\",\"JSBNG__Event\",\"URI\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"URI\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m, n, o, p) {\n        this.dom = m;\n        this.url = m.href;\n        this.hash = n;\n        this.func_get_params = ((p || function() {\n            return {\n            };\n        }));\n        h.listen(this.dom, \"click\", this.JSBNG__onclick.bind(this));\n        h.listen(this.dom, \"mousedown\", this.JSBNG__onmousedown.bind(this));\n        h.listen(this.dom, \"mouseup\", this.JSBNG__onmouseup.bind(this));\n        h.listen(this.dom, \"mouseout\", this.JSBNG__onmouseout.bind(this));\n        this.JSBNG__onmousedown(h.$E(o));\n    };\n;\n    l.bootstrap = function(m, n, o, p) {\n        if (m.__untrusted) {\n            return;\n        }\n    ;\n    ;\n        m.__untrusted = true;\n        new l(m, n, o, p);\n    };\n    l.prototype.getRewrittenURI = function() {\n        var m = k({\n            u: this.url,\n            h: this.hash\n        }, this.func_get_params(this.dom)), n = new i(\"/l.php\");\n        return n.setQueryData(m).setSubdomain(\"www\").setProtocol(\"http\");\n    };\n    l.prototype.JSBNG__onclick = function() {\n        (function() {\n            this.setHref(this.url);\n        }).bind(this).defer(100);\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.JSBNG__onmousedown = function(m) {\n        if (((m.button == 2))) {\n            this.setHref(this.getRewrittenURI());\n        }\n    ;\n    ;\n    };\n    l.prototype.JSBNG__onmouseup = function() {\n        this.setHref(this.getRewrittenURI());\n    };\n    l.prototype.JSBNG__onmouseout = function() {\n        this.setHref(this.url);\n    };\n    l.prototype.setHref = function(m) {\n        if (((j.ie() < 9))) {\n            var n = g.create(\"span\");\n            g.appendContent(this.dom, n);\n            this.dom.href = m;\n            g.remove(n);\n        }\n         else this.dom.href = m;\n    ;\n    ;\n    };\n    e.exports = l;\n});\n__d(\"Link.react\", [\"React\",\"UntrustedLink\",\"mergeInto\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UntrustedLink\"), i = b(\"mergeInto\"), j = g.createClass({\n        displayName: \"Link\",\n        _installLinkshimOnMouseDown: function(JSBNG__event) {\n            var k = this.props.href;\n            if (k.shimhash) {\n                h.bootstrap(this.getDOMNode(), k.shimhash);\n            }\n        ;\n        ;\n            ((this.props.onMouseDown && this.props.onMouseDown(JSBNG__event)));\n        },\n        render: function() {\n            var k = this.props.href, l = g.DOM.a(null);\n            i(l.props, this.props);\n            if (k) {\n                l.props.href = k.url;\n                var m = !!k.shimhash;\n                if (m) {\n                    l.props.rel = ((l.props.rel ? ((l.props.rel + \" nofollow\")) : \"nofollow\"));\n                    l.props.onMouseDown = this._installLinkshimOnMouseDown;\n                }\n            ;\n            ;\n            }\n             else l.props.href = \"#\";\n        ;\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LoadingIndicator.react\", [\"React\",\"joinClasses\",\"keyMirror\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"joinClasses\"), i = b(\"keyMirror\"), j = b(\"merge\"), k = i({\n        white: true,\n        blue: true,\n        black: true\n    }), l = i({\n        small: true,\n        medium: true,\n        large: true\n    }), m = {\n        white: {\n            large: \"/images/loaders/indicator_blue_large.gif\",\n            medium: \"/images/loaders/indicator_blue_medium.gif\",\n            small: \"/images/loaders/indicator_blue_small.gif\"\n        },\n        blue: {\n            large: \"/images/loaders/indicator_white_large.gif\",\n            small: \"/images/loaders/indicator_white_small.gif\"\n        },\n        black: {\n            large: \"/images/loaders/indicator_black.gif\"\n        }\n    }, n = g.createClass({\n        displayName: \"LoadingIndicator\",\n        render: function() {\n            var o = this.props.color, p = this.props.size;\n            if (!m[o]) {\n                return g.DOM.span(null);\n            }\n        ;\n        ;\n            if (!m[o][p]) {\n                return g.DOM.span(null);\n            }\n        ;\n        ;\n            var q = ((this.props.showonasync ? \"uiLoadingIndicatorAsync\" : \"\"));\n            if (this.props.className) {\n                q = h(this.props.className, q);\n            }\n        ;\n        ;\n            var r = m[o][p], s = g.DOM.img({\n                src: r,\n                className: q\n            });\n            s.props = j(this.props, s.props);\n            return s;\n        }\n    });\n    n.SIZES = l;\n    n.COLORS = k;\n    e.exports = n;\n});\n__d(\"ProfileBrowserLink\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = \"/ajax/browser/dialog/\", i = \"/browse/\", j = function(l, m, n) {\n        return new g(((l + m))).setQueryData(n);\n    }, k = {\n        constructPageURI: function(l, m) {\n            return j(i, l, m);\n        },\n        constructDialogURI: function(l, m) {\n            return j(h, l, m);\n        }\n    };\n    e.exports = k;\n});\n__d(\"ProfileBrowserTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LIKES: \"likes\",\n        GROUP_MESSAGE_VIEWERS: \"group_message_viewers\",\n        MUTUAL_FRIENDS: \"mutual_friends\"\n    };\n    e.exports = g;\n});\n__d(\"TransformTextToDOMMixin\", [\"DOMQuery\",\"createArrayFrom\",\"flattenArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"createArrayFrom\"), i = b(\"flattenArray\"), j = 3, k = {\n        transform: function(l, m) {\n            return i(l.map(function(n) {\n                if (!g.isElementNode(n)) {\n                    var o = n, p = [], q = ((this.MAX_ITEMS || j));\n                    while (q--) {\n                        var r = ((m ? [o,].concat(m) : [o,])), s = this.match.apply(this, r);\n                        if (!s) {\n                            break;\n                        }\n                    ;\n                    ;\n                        p.push(o.substring(0, s.startIndex));\n                        p.push(s.element);\n                        o = o.substring(s.endIndex);\n                    };\n                ;\n                    ((o && p.push(o)));\n                    return p;\n                }\n            ;\n            ;\n                return n;\n            }.bind(this)));\n        },\n        params: function() {\n            var l = this;\n            return {\n                __params: true,\n                obj: l,\n                params: h(arguments)\n            };\n        }\n    };\n    e.exports = k;\n});\n__d(\"SupportedEmoji\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        utf16Regex: /[\\u203C\\u2049\\u2100-\\u21FF\\u2300-\\u27FF\\u2900-\\u29FF\\u2B00-\\u2BFF\\u3000-\\u30FF\\u3200-\\u32FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDEFF]/,\n        emoji: {\n            127744: \"-cx-PRIVATE-fbEmoji__icon_1f300\",\n            127746: \"-cx-PRIVATE-fbEmoji__icon_1f302\",\n            127754: \"-cx-PRIVATE-fbEmoji__icon_1f30a\",\n            127769: \"-cx-PRIVATE-fbEmoji__icon_1f319\",\n            127775: \"-cx-PRIVATE-fbEmoji__icon_1f31f\",\n            127793: \"-cx-PRIVATE-fbEmoji__icon_1f331\",\n            127796: \"-cx-PRIVATE-fbEmoji__icon_1f334\",\n            127797: \"-cx-PRIVATE-fbEmoji__icon_1f335\",\n            127799: \"-cx-PRIVATE-fbEmoji__icon_1f337\",\n            127800: \"-cx-PRIVATE-fbEmoji__icon_1f338\",\n            127801: \"-cx-PRIVATE-fbEmoji__icon_1f339\",\n            127802: \"-cx-PRIVATE-fbEmoji__icon_1f33a\",\n            127803: \"-cx-PRIVATE-fbEmoji__icon_1f33b\",\n            127806: \"-cx-PRIVATE-fbEmoji__icon_1f33e\",\n            127808: \"-cx-PRIVATE-fbEmoji__icon_1f340\",\n            127809: \"-cx-PRIVATE-fbEmoji__icon_1f341\",\n            127810: \"-cx-PRIVATE-fbEmoji__icon_1f342\",\n            127811: \"-cx-PRIVATE-fbEmoji__icon_1f343\",\n            127818: \"-cx-PRIVATE-fbEmoji__icon_1f34a\",\n            127822: \"-cx-PRIVATE-fbEmoji__icon_1f34e\",\n            127827: \"-cx-PRIVATE-fbEmoji__icon_1f353\",\n            127828: \"-cx-PRIVATE-fbEmoji__icon_1f354\",\n            127864: \"-cx-PRIVATE-fbEmoji__icon_1f378\",\n            127866: \"-cx-PRIVATE-fbEmoji__icon_1f37a\",\n            127873: \"-cx-PRIVATE-fbEmoji__icon_1f381\",\n            127875: \"-cx-PRIVATE-fbEmoji__icon_1f383\",\n            127876: \"-cx-PRIVATE-fbEmoji__icon_1f384\",\n            127877: \"-cx-PRIVATE-fbEmoji__icon_1f385\",\n            127880: \"-cx-PRIVATE-fbEmoji__icon_1f388\",\n            127881: \"-cx-PRIVATE-fbEmoji__icon_1f389\",\n            127885: \"-cx-PRIVATE-fbEmoji__icon_1f38d\",\n            127886: \"-cx-PRIVATE-fbEmoji__icon_1f38e\",\n            127887: \"-cx-PRIVATE-fbEmoji__icon_1f38f\",\n            127888: \"-cx-PRIVATE-fbEmoji__icon_1f390\",\n            127891: \"-cx-PRIVATE-fbEmoji__icon_1f393\",\n            127925: \"-cx-PRIVATE-fbEmoji__icon_1f3b5\",\n            127926: \"-cx-PRIVATE-fbEmoji__icon_1f3b6\",\n            127932: \"-cx-PRIVATE-fbEmoji__icon_1f3bc\",\n            128013: \"-cx-PRIVATE-fbEmoji__icon_1f40d\",\n            128014: \"-cx-PRIVATE-fbEmoji__icon_1f40e\",\n            128017: \"-cx-PRIVATE-fbEmoji__icon_1f411\",\n            128018: \"-cx-PRIVATE-fbEmoji__icon_1f412\",\n            128020: \"-cx-PRIVATE-fbEmoji__icon_1f414\",\n            128023: \"-cx-PRIVATE-fbEmoji__icon_1f417\",\n            128024: \"-cx-PRIVATE-fbEmoji__icon_1f418\",\n            128025: \"-cx-PRIVATE-fbEmoji__icon_1f419\",\n            128026: \"-cx-PRIVATE-fbEmoji__icon_1f41a\",\n            128027: \"-cx-PRIVATE-fbEmoji__icon_1f41b\",\n            128031: \"-cx-PRIVATE-fbEmoji__icon_1f41f\",\n            128032: \"-cx-PRIVATE-fbEmoji__icon_1f420\",\n            128033: \"-cx-PRIVATE-fbEmoji__icon_1f421\",\n            128037: \"-cx-PRIVATE-fbEmoji__icon_1f425\",\n            128038: \"-cx-PRIVATE-fbEmoji__icon_1f426\",\n            128039: \"-cx-PRIVATE-fbEmoji__icon_1f427\",\n            128040: \"-cx-PRIVATE-fbEmoji__icon_1f428\",\n            128041: \"-cx-PRIVATE-fbEmoji__icon_1f429\",\n            128043: \"-cx-PRIVATE-fbEmoji__icon_1f42b\",\n            128044: \"-cx-PRIVATE-fbEmoji__icon_1f42c\",\n            128045: \"-cx-PRIVATE-fbEmoji__icon_1f42d\",\n            128046: \"-cx-PRIVATE-fbEmoji__icon_1f42e\",\n            128047: \"-cx-PRIVATE-fbEmoji__icon_1f42f\",\n            128048: \"-cx-PRIVATE-fbEmoji__icon_1f430\",\n            128049: \"-cx-PRIVATE-fbEmoji__icon_1f431\",\n            128051: \"-cx-PRIVATE-fbEmoji__icon_1f433\",\n            128052: \"-cx-PRIVATE-fbEmoji__icon_1f434\",\n            128053: \"-cx-PRIVATE-fbEmoji__icon_1f435\",\n            128054: \"-cx-PRIVATE-fbEmoji__icon_1f436\",\n            128055: \"-cx-PRIVATE-fbEmoji__icon_1f437\",\n            128056: \"-cx-PRIVATE-fbEmoji__icon_1f438\",\n            128057: \"-cx-PRIVATE-fbEmoji__icon_1f439\",\n            128058: \"-cx-PRIVATE-fbEmoji__icon_1f43a\",\n            128059: \"-cx-PRIVATE-fbEmoji__icon_1f43b\",\n            128062: \"-cx-PRIVATE-fbEmoji__icon_1f43e\",\n            128064: \"-cx-PRIVATE-fbEmoji__icon_1f440\",\n            128066: \"-cx-PRIVATE-fbEmoji__icon_1f442\",\n            128067: \"-cx-PRIVATE-fbEmoji__icon_1f443\",\n            128068: \"-cx-PRIVATE-fbEmoji__icon_1f444\",\n            128069: \"-cx-PRIVATE-fbEmoji__icon_1f445\",\n            128070: \"-cx-PRIVATE-fbEmoji__icon_1f446\",\n            128071: \"-cx-PRIVATE-fbEmoji__icon_1f447\",\n            128072: \"-cx-PRIVATE-fbEmoji__icon_1f448\",\n            128073: \"-cx-PRIVATE-fbEmoji__icon_1f449\",\n            128074: \"-cx-PRIVATE-fbEmoji__icon_1f44a\",\n            128075: \"-cx-PRIVATE-fbEmoji__icon_1f44b\",\n            128076: \"-cx-PRIVATE-fbEmoji__icon_1f44c\",\n            128077: \"-cx-PRIVATE-fbEmoji__icon_1f44d\",\n            128078: \"-cx-PRIVATE-fbEmoji__icon_1f44e\",\n            128079: \"-cx-PRIVATE-fbEmoji__icon_1f44f\",\n            128080: \"-cx-PRIVATE-fbEmoji__icon_1f450\",\n            128102: \"-cx-PRIVATE-fbEmoji__icon_1f466\",\n            128103: \"-cx-PRIVATE-fbEmoji__icon_1f467\",\n            128104: \"-cx-PRIVATE-fbEmoji__icon_1f468\",\n            128105: \"-cx-PRIVATE-fbEmoji__icon_1f469\",\n            128107: \"-cx-PRIVATE-fbEmoji__icon_1f46b\",\n            128110: \"-cx-PRIVATE-fbEmoji__icon_1f46e\",\n            128111: \"-cx-PRIVATE-fbEmoji__icon_1f46f\",\n            128113: \"-cx-PRIVATE-fbEmoji__icon_1f471\",\n            128114: \"-cx-PRIVATE-fbEmoji__icon_1f472\",\n            128115: \"-cx-PRIVATE-fbEmoji__icon_1f473\",\n            128116: \"-cx-PRIVATE-fbEmoji__icon_1f474\",\n            128117: \"-cx-PRIVATE-fbEmoji__icon_1f475\",\n            128118: \"-cx-PRIVATE-fbEmoji__icon_1f476\",\n            128119: \"-cx-PRIVATE-fbEmoji__icon_1f477\",\n            128120: \"-cx-PRIVATE-fbEmoji__icon_1f478\",\n            128123: \"-cx-PRIVATE-fbEmoji__icon_1f47b\",\n            128124: \"-cx-PRIVATE-fbEmoji__icon_1f47c\",\n            128125: \"-cx-PRIVATE-fbEmoji__icon_1f47d\",\n            128126: \"-cx-PRIVATE-fbEmoji__icon_1f47e\",\n            128127: \"-cx-PRIVATE-fbEmoji__icon_1f47f\",\n            128128: \"-cx-PRIVATE-fbEmoji__icon_1f480\",\n            128130: \"-cx-PRIVATE-fbEmoji__icon_1f482\",\n            128131: \"-cx-PRIVATE-fbEmoji__icon_1f483\",\n            128133: \"-cx-PRIVATE-fbEmoji__icon_1f485\",\n            128139: \"-cx-PRIVATE-fbEmoji__icon_1f48b\",\n            128143: \"-cx-PRIVATE-fbEmoji__icon_1f48f\",\n            128144: \"-cx-PRIVATE-fbEmoji__icon_1f490\",\n            128145: \"-cx-PRIVATE-fbEmoji__icon_1f491\",\n            128147: \"-cx-PRIVATE-fbEmoji__icon_1f493\",\n            128148: \"-cx-PRIVATE-fbEmoji__icon_1f494\",\n            128150: \"-cx-PRIVATE-fbEmoji__icon_1f496\",\n            128151: \"-cx-PRIVATE-fbEmoji__icon_1f497\",\n            128152: \"-cx-PRIVATE-fbEmoji__icon_1f498\",\n            128153: \"-cx-PRIVATE-fbEmoji__icon_1f499\",\n            128154: \"-cx-PRIVATE-fbEmoji__icon_1f49a\",\n            128155: \"-cx-PRIVATE-fbEmoji__icon_1f49b\",\n            128156: \"-cx-PRIVATE-fbEmoji__icon_1f49c\",\n            128157: \"-cx-PRIVATE-fbEmoji__icon_1f49d\",\n            128162: \"-cx-PRIVATE-fbEmoji__icon_1f4a2\",\n            128164: \"-cx-PRIVATE-fbEmoji__icon_1f4a4\",\n            128166: \"-cx-PRIVATE-fbEmoji__icon_1f4a6\",\n            128168: \"-cx-PRIVATE-fbEmoji__icon_1f4a8\",\n            128169: \"-cx-PRIVATE-fbEmoji__icon_1f4a9\",\n            128170: \"-cx-PRIVATE-fbEmoji__icon_1f4aa\",\n            128187: \"-cx-PRIVATE-fbEmoji__icon_1f4bb\",\n            128189: \"-cx-PRIVATE-fbEmoji__icon_1f4bd\",\n            128190: \"-cx-PRIVATE-fbEmoji__icon_1f4be\",\n            128191: \"-cx-PRIVATE-fbEmoji__icon_1f4bf\",\n            128192: \"-cx-PRIVATE-fbEmoji__icon_1f4c0\",\n            128222: \"-cx-PRIVATE-fbEmoji__icon_1f4de\",\n            128224: \"-cx-PRIVATE-fbEmoji__icon_1f4e0\",\n            128241: \"-cx-PRIVATE-fbEmoji__icon_1f4f1\",\n            128242: \"-cx-PRIVATE-fbEmoji__icon_1f4f2\",\n            128250: \"-cx-PRIVATE-fbEmoji__icon_1f4fa\",\n            128276: \"-cx-PRIVATE-fbEmoji__icon_1f514\",\n            128293: \"-cx-PRIVATE-fbEmoji__icon_1f525\",\n            128513: \"-cx-PRIVATE-fbEmoji__icon_1f601\",\n            128514: \"-cx-PRIVATE-fbEmoji__icon_1f602\",\n            128515: \"-cx-PRIVATE-fbEmoji__icon_1f603\",\n            128516: \"-cx-PRIVATE-fbEmoji__icon_1f604\",\n            128518: \"-cx-PRIVATE-fbEmoji__icon_1f606\",\n            128521: \"-cx-PRIVATE-fbEmoji__icon_1f609\",\n            128523: \"-cx-PRIVATE-fbEmoji__icon_1f60b\",\n            128524: \"-cx-PRIVATE-fbEmoji__icon_1f60c\",\n            128525: \"-cx-PRIVATE-fbEmoji__icon_1f60d\",\n            128527: \"-cx-PRIVATE-fbEmoji__icon_1f60f\",\n            128530: \"-cx-PRIVATE-fbEmoji__icon_1f612\",\n            128531: \"-cx-PRIVATE-fbEmoji__icon_1f613\",\n            128532: \"-cx-PRIVATE-fbEmoji__icon_1f614\",\n            128534: \"-cx-PRIVATE-fbEmoji__icon_1f616\",\n            128536: \"-cx-PRIVATE-fbEmoji__icon_1f618\",\n            128538: \"-cx-PRIVATE-fbEmoji__icon_1f61a\",\n            128540: \"-cx-PRIVATE-fbEmoji__icon_1f61c\",\n            128541: \"-cx-PRIVATE-fbEmoji__icon_1f61d\",\n            128542: \"-cx-PRIVATE-fbEmoji__icon_1f61e\",\n            128544: \"-cx-PRIVATE-fbEmoji__icon_1f620\",\n            128545: \"-cx-PRIVATE-fbEmoji__icon_1f621\",\n            128546: \"-cx-PRIVATE-fbEmoji__icon_1f622\",\n            128547: \"-cx-PRIVATE-fbEmoji__icon_1f623\",\n            128548: \"-cx-PRIVATE-fbEmoji__icon_1f624\",\n            128549: \"-cx-PRIVATE-fbEmoji__icon_1f625\",\n            128552: \"-cx-PRIVATE-fbEmoji__icon_1f628\",\n            128553: \"-cx-PRIVATE-fbEmoji__icon_1f629\",\n            128554: \"-cx-PRIVATE-fbEmoji__icon_1f62a\",\n            128555: \"-cx-PRIVATE-fbEmoji__icon_1f62b\",\n            128557: \"-cx-PRIVATE-fbEmoji__icon_1f62d\",\n            128560: \"-cx-PRIVATE-fbEmoji__icon_1f630\",\n            128561: \"-cx-PRIVATE-fbEmoji__icon_1f631\",\n            128562: \"-cx-PRIVATE-fbEmoji__icon_1f632\",\n            128563: \"-cx-PRIVATE-fbEmoji__icon_1f633\",\n            128565: \"-cx-PRIVATE-fbEmoji__icon_1f635\",\n            128567: \"-cx-PRIVATE-fbEmoji__icon_1f637\",\n            128568: \"-cx-PRIVATE-fbEmoji__icon_1f638\",\n            128569: \"-cx-PRIVATE-fbEmoji__icon_1f639\",\n            128570: \"-cx-PRIVATE-fbEmoji__icon_1f63a\",\n            128571: \"-cx-PRIVATE-fbEmoji__icon_1f63b\",\n            128572: \"-cx-PRIVATE-fbEmoji__icon_1f63c\",\n            128573: \"-cx-PRIVATE-fbEmoji__icon_1f63d\",\n            128575: \"-cx-PRIVATE-fbEmoji__icon_1f63f\",\n            128576: \"-cx-PRIVATE-fbEmoji__icon_1f640\",\n            128587: \"-cx-PRIVATE-fbEmoji__icon_1f64b\",\n            128588: \"-cx-PRIVATE-fbEmoji__icon_1f64c\",\n            128589: \"-cx-PRIVATE-fbEmoji__icon_1f64d\",\n            128591: \"-cx-PRIVATE-fbEmoji__icon_1f64f\",\n            9757: \"-cx-PRIVATE-fbEmoji__icon_261d\",\n            9786: \"-cx-PRIVATE-fbEmoji__icon_263a\",\n            9889: \"-cx-PRIVATE-fbEmoji__icon_26a1\",\n            9924: \"-cx-PRIVATE-fbEmoji__icon_26c4\",\n            9994: \"-cx-PRIVATE-fbEmoji__icon_270a\",\n            9995: \"-cx-PRIVATE-fbEmoji__icon_270b\",\n            9996: \"-cx-PRIVATE-fbEmoji__icon_270c\",\n            9728: \"-cx-PRIVATE-fbEmoji__icon_2600\",\n            9729: \"-cx-PRIVATE-fbEmoji__icon_2601\",\n            9748: \"-cx-PRIVATE-fbEmoji__icon_2614\",\n            9749: \"-cx-PRIVATE-fbEmoji__icon_2615\",\n            10024: \"-cx-PRIVATE-fbEmoji__icon_2728\",\n            10084: \"-cx-PRIVATE-fbEmoji__icon_2764\"\n        }\n    };\n});\n__d(\"Utf16\", [], function(a, b, c, d, e, f) {\n    var g = {\n        decode: function(h) {\n            switch (h.length) {\n              case 1:\n                return h.charCodeAt(0);\n              case 2:\n                return ((((65536 | ((((h.charCodeAt(0) - 55296)) * 1024)))) | ((h.charCodeAt(1) - 56320))));\n            };\n        ;\n        },\n        encode: function(h) {\n            if (((h < 65536))) {\n                return String.fromCharCode(h);\n            }\n             else return ((String.fromCharCode(((55296 + ((((h - 65536)) >> 10))))) + String.fromCharCode(((56320 + ((h % 1024)))))))\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"DOMEmoji\", [\"JSBNG__CSS\",\"JSXDOM\",\"TransformTextToDOMMixin\",\"SupportedEmoji\",\"Utf16\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"JSXDOM\"), i = b(\"TransformTextToDOMMixin\"), j = b(\"SupportedEmoji\"), k = b(\"Utf16\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = {\n        MAX_ITEMS: 40,\n        match: function(o) {\n            var p = j.utf16Regex.exec(o);\n            if (((!p || !p.length))) {\n                return false;\n            }\n        ;\n        ;\n            var q = p[0], r = p.index, s = k.decode(q), t = j.emoji[s];\n            if (!t) {\n                return false;\n            }\n        ;\n        ;\n            return {\n                startIndex: r,\n                endIndex: ((r + q.length)),\n                element: this._element(t)\n            };\n        },\n        _element: function(o) {\n            var p = h.span(null);\n            g.addClass(p, \"-cx-PRIVATE-fbEmoji__icon\");\n            g.addClass(p, \"-cx-PRIVATE-fbEmoji__size_16\");\n            g.addClass(p, o);\n            return p;\n        }\n    };\n    e.exports = l(n, i);\n});\n__d(\"EmoticonsList\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        emotes: {\n            \":)\": \"smile\",\n            \":-)\": \"smile\",\n            \":]\": \"smile\",\n            \"=)\": \"smile\",\n            \":(\": \"frown\",\n            \":-(\": \"frown\",\n            \":[\": \"frown\",\n            \"=(\": \"frown\",\n            \":P\": \"tongue\",\n            \":-P\": \"tongue\",\n            \":-p\": \"tongue\",\n            \":p\": \"tongue\",\n            \"=P\": \"tongue\",\n            \"=D\": \"grin\",\n            \":-D\": \"grin\",\n            \":D\": \"grin\",\n            \":o\": \"gasp\",\n            \":-O\": \"gasp\",\n            \":O\": \"gasp\",\n            \":-o\": \"gasp\",\n            \";)\": \"wink\",\n            \";-)\": \"wink\",\n            \"8)\": \"glasses\",\n            \"8-)\": \"glasses\",\n            \"B)\": \"glasses\",\n            \"B-)\": \"glasses\",\n            \"B|\": \"sunglasses\",\n            \"8-|\": \"sunglasses\",\n            \"8|\": \"sunglasses\",\n            \"B-|\": \"sunglasses\",\n            \"\\u003E:(\": \"grumpy\",\n            \"\\u003E:-(\": \"grumpy\",\n            \":/\": \"unsure\",\n            \":-/\": \"unsure\",\n            \":\\\\\": \"unsure\",\n            \":-\\\\\": \"unsure\",\n            \"=/\": \"unsure\",\n            \"=\\\\\": \"unsure\",\n            \":'(\": \"cry\",\n            \"3:)\": \"devil\",\n            \"3:-)\": \"devil\",\n            \"O:)\": \"angel\",\n            \"O:-)\": \"angel\",\n            \":*\": \"kiss\",\n            \":-*\": \"kiss\",\n            \"\\u003C3\": \"heart\",\n            \"&lt;3\": \"heart\",\n            \"\\u2665\": \"heart\",\n            \"^_^\": \"kiki\",\n            \"-_-\": \"squint\",\n            \"o.O\": \"confused\",\n            \"O.o\": \"confused_rev\",\n            \"\\u003E:o\": \"upset\",\n            \"\\u003E:O\": \"upset\",\n            \"\\u003E:-O\": \"upset\",\n            \"\\u003E:-o\": \"upset\",\n            \"\\u003E_\\u003C\": \"upset\",\n            \"\\u003E.\\u003C\": \"upset\",\n            \":v\": \"pacman\",\n            \":|]\": \"robot\",\n            \":3\": \"colonthree\",\n            \"\\u003C(\\\")\": \"penguin\",\n            \":putnam:\": \"putnam\",\n            \"(^^^)\": \"shark\",\n            \"(y)\": \"like\",\n            \":like:\": \"like\",\n            \"(Y)\": \"like\",\n            \":poop:\": \"poop\"\n        },\n        symbols: {\n            smile: \":)\",\n            frown: \":(\",\n            tongue: \":P\",\n            grin: \"=D\",\n            gasp: \":o\",\n            wink: \";)\",\n            glasses: \"8)\",\n            sunglasses: \"B|\",\n            grumpy: \"\\u003E:(\",\n            unsure: \":/\",\n            cry: \":'(\",\n            devil: \"3:)\",\n            angel: \"O:)\",\n            kiss: \":*\",\n            heart: \"\\u003C3\",\n            kiki: \"^_^\",\n            squint: \"-_-\",\n            confused: \"o.O\",\n            confused_rev: \"O.o\",\n            upset: \"\\u003E:o\",\n            pacman: \":v\",\n            robot: \":|]\",\n            colonthree: \":3\",\n            penguin: \"\\u003C(\\\")\",\n            putnam: \":putnam:\",\n            shark: \"(^^^)\",\n            like: \"(y)\",\n            poop: \":poop:\"\n        },\n        regexp: /(^|[\\s'\".])(:\\)|:\\-\\)|:\\]|=\\)|:\\(|:\\-\\(|:\\[|=\\(|:P|:\\-P|:\\-p|:p|=P|=D|:\\-D|:D|:o|:\\-O|:O|:\\-o|;\\)|;\\-\\)|8\\)|8\\-\\)|B\\)|B\\-\\)|B\\||8\\-\\||8\\||B\\-\\||>:\\(|>:\\-\\(|:\\/|:\\-\\/|:\\\\|:\\-\\\\|=\\/|=\\\\|:'\\(|3:\\)|3:\\-\\)|O:\\)|O:\\-\\)|:\\*|:\\-\\*|<3|&lt;3|\\u2665|\\^_\\^|\\-_\\-|o\\.O|O\\.o|>:o|>:O|>:\\-O|>:\\-o|>_<|>\\.<|:v|:\\|\\]|:3|<\\(\"\\)|:putnam:|\\(\\^\\^\\^\\)|\\(y\\)|:like:|\\(Y\\)|:poop:)([\\s'\".,!?]|<br>|$)/\n    };\n});\n__d(\"DOMEmote\", [\"JSBNG__CSS\",\"EmoticonsList\",\"JSXDOM\",\"TransformTextToDOMMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"EmoticonsList\"), i = b(\"JSXDOM\"), j = b(\"TransformTextToDOMMixin\"), k = b(\"copyProperties\"), l = {\n        MAX_ITEMS: 40,\n        match: function(m) {\n            var n = h.regexp.exec(m);\n            if (((!n || !n.length))) {\n                return false;\n            }\n        ;\n        ;\n            var o = n[2], p = ((n.index + n[1].length));\n            return {\n                startIndex: p,\n                endIndex: ((p + o.length)),\n                element: this._element(o, h.emotes[o])\n            };\n        },\n        _element: function(m, n) {\n            var o = i.span({\n                className: \"emoticon_text\",\n                \"aria-hidden\": \"true\"\n            }, m), p = i.span({\n                title: m,\n                className: \"emoticon\"\n            });\n            g.addClass(p, ((\"emoticon_\" + n)));\n            return [o,p,];\n        }\n    };\n    e.exports = k(l, j);\n});\n__d(\"FBIDEmote\", [\"JSXDOM\",\"TransformTextToDOMMixin\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"TransformTextToDOMMixin\"), i = b(\"copyProperties\"), j = /\\[\\[([a-z\\d\\.]+)\\]\\]/i, k = {\n        MAX_ITEMS: 40,\n        match: function(l) {\n            var m = j.exec(l);\n            if (((!m || !m.length))) {\n                return false;\n            }\n        ;\n        ;\n            var n = m[0], o = m[1];\n            return {\n                startIndex: m.index,\n                endIndex: ((m.index + n.length)),\n                element: this._element(n, o)\n            };\n        },\n        _element: function(l, m) {\n            var n = g.span({\n                className: \"emoticon_text\",\n                \"aria-hidden\": \"true\"\n            }, l), o = g.img({\n                alt: l,\n                className: \"emoticon emoticon_custom\",\n                src: ((((((window.JSBNG__location.protocol + \"//graph.facebook.com/\")) + encodeURIComponent(m))) + \"/picture\"))\n            });\n            return [n,o,];\n        }\n    };\n    e.exports = i(k, h);\n});\n__d(\"transformTextToDOM\", [\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\");\n    function h(i, j) {\n        var k = [i,];\n        j = g(j);\n        j.forEach(function(l) {\n            var m, n = l;\n            if (l.__params) {\n                m = l.params;\n                n = l.obj;\n            }\n        ;\n        ;\n            k = n.transform(k, m);\n        });\n        return k;\n    };\n;\n    e.exports = h;\n});\n__d(\"emojiAndEmote\", [\"DOMEmoji\",\"DOMEmote\",\"FBIDEmote\",\"transformTextToDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMEmoji\"), h = b(\"DOMEmote\"), i = b(\"FBIDEmote\"), j = b(\"transformTextToDOM\"), k = function(l, m) {\n        var n = [g,h,i,];\n        if (((m === false))) {\n            n.pop();\n        }\n    ;\n    ;\n        return j(l, n);\n    };\n    e.exports = k;\n});\n__d(\"Emoji\", [\"DOMEmoji\",\"JSXDOM\",\"emojiAndEmote\",\"transformTextToDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMEmoji\"), h = b(\"JSXDOM\"), i = b(\"emojiAndEmote\"), j = b(\"transformTextToDOM\"), k = {\n        htmlEmojiAndEmote: function(l, m) {\n            return (h.span(null, i(l))).innerHTML;\n        },\n        htmlEmojiAndEmoteWithoutFBID: function(l, m) {\n            return (h.span(null, i(l, false))).innerHTML;\n        },\n        htmlEmoji: function(l) {\n            return (h.span(null, j(l, g))).innerHTML;\n        }\n    };\n    e.exports = k;\n});\n__d(\"Emote\", [\"DOMEmote\",\"FBIDEmote\",\"JSXDOM\",\"transformTextToDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMEmote\"), h = b(\"FBIDEmote\"), i = b(\"JSXDOM\"), j = b(\"transformTextToDOM\"), k = {\n        htmlEmoteWithoutFBID: function(l, m) {\n            return (i.span(null, j(l, g))).innerHTML;\n        },\n        htmlEmote: function(l, m) {\n            return (i.span(null, j(l, [g,h,]))).innerHTML;\n        }\n    };\n    e.exports = k;\n});\n__d(\"TextWithEmoticons.react\", [\"Emoji\",\"Emote\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"Emoji\"), h = b(\"Emote\"), i = b(\"React\"), j = i.createClass({\n        displayName: \"ReactTextWithEmoticons\",\n        render: function() {\n            if (((!this.props.renderEmoticons && !this.props.renderEmoji))) {\n                return i.DOM.span(null, this.props.text);\n            }\n        ;\n        ;\n            var k;\n            if (((this.props.renderEmoticons && this.props.renderEmoji))) {\n                k = g.htmlEmojiAndEmoteWithoutFBID(this.props.text);\n            }\n             else if (this.props.renderEmoticons) {\n                k = h.htmlEmoteWithoutFBID(this.props.text);\n            }\n             else k = g.htmlEmoji(this.props.text);\n            \n        ;\n        ;\n            return i.DOM.span({\n                dangerouslySetInnerHTML: {\n                    __html: k\n                }\n            });\n        }\n    });\n    e.exports = j;\n});\n__d(\"TextWithEntities.react\", [\"Link.react\",\"React\",\"TextWithEmoticons.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"React\"), i = b(\"TextWithEmoticons.react\");\n    function j(o) {\n        return (o).replace(/<3\\b|&hearts;/g, \"\\u2665\");\n    };\n;\n    function k(o, p) {\n        return (g({\n            href: p.entities[0]\n        }, o));\n    };\n;\n    function l(o, p) {\n        return ((o.offset - p.offset));\n    };\n;\n    var m = /(\\r\\n|[\\r\\n])/, n = h.createClass({\n        displayName: \"ReactTextWithEntities\",\n        _formatStandardText: function(o) {\n            var p = o.split(m), q = [];\n            for (var r = 0; ((r < p.length)); r++) {\n                var s = p[r];\n                if (s) {\n                    if (m.test(s)) {\n                        q.push(h.DOM.br(null));\n                    }\n                     else if (((this.props.renderEmoticons || this.props.renderEmoji))) {\n                        q.push(i({\n                            text: s,\n                            renderEmoticons: this.props.renderEmoticons,\n                            renderEmoji: this.props.renderEmoji\n                        }));\n                    }\n                     else q.push(j(s));\n                    \n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        },\n        render: function() {\n            var o = 0, p = this.props.ranges, q = this.props.aggregatedRanges, r = this.props.text, s = null;\n            if (p) {\n                s = ((q ? p.concat(q) : p.slice()));\n            }\n             else if (q) {\n                s = q.slice();\n            }\n            \n        ;\n        ;\n            if (s) {\n                s.sort(l);\n            }\n        ;\n        ;\n            var t = [], u = ((s ? s.length : 0));\n            for (var v = 0, w = u; ((v < w)); v++) {\n                var x = s[v];\n                if (((x.offset < o))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((x.offset > o))) {\n                    t = t.concat(this._formatStandardText(r.substring(o, x.offset)));\n                }\n            ;\n            ;\n                var y = r.substr(x.offset, x.length);\n                t = t.concat([((this.props.interpolator ? this.props.interpolator(y, x) : k(y, x))),]);\n                o = ((x.offset + x.length));\n            };\n        ;\n            if (((r.length > o))) {\n                t = t.concat(this._formatStandardText(r.substr(o)));\n            }\n        ;\n        ;\n            return h.DOM.span(null, t);\n        }\n    });\n    e.exports = n;\n});\n__d(\"fbt\", [\"copyProperties\",\"substituteTokens\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"substituteTokens\"), i = b(\"invariant\"), j = {\n        INDEX: 0,\n        SUBSTITUTION: 1\n    }, k = function() {\n    \n    };\n    k._ = function(l, m) {\n        var n = {\n        }, o = l;\n        for (var p = 0; ((p < m.length)); p++) {\n            var q = m[p][j.INDEX];\n            if (((q !== null))) {\n                i(((q in o)));\n                o = o[q];\n            }\n        ;\n        ;\n            g(n, m[p][j.SUBSTITUTION]);\n        };\n    ;\n        i(((typeof o === \"string\")));\n        return h(o, n);\n    };\n    k[\"enum\"] = function(l, m) {\n        return [l,null,];\n    };\n    k.param = function(l, m) {\n        var n = {\n        };\n        n[l] = m;\n        return [null,n,];\n    };\n    e.exports = k;\n});\n__d(\"LiveTimer\", [\"JSBNG__CSS\",\"DOM\",\"UserAgent\",\"emptyFunction\",\"fbt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"emptyFunction\"), k = b(\"fbt\"), l = b(\"tx\"), m = 1000, n = 60, o = 3600, p = 43200, q = 60, r = 20000, s = {\n        restart: function(t) {\n            this.serverTime = t;\n            this.localStartTime = ((JSBNG__Date.now() / 1000));\n            this.updateTimeStamps();\n        },\n        getApproximateServerTime: function() {\n            return ((this.getServerTimeOffset() + JSBNG__Date.now()));\n        },\n        getServerTimeOffset: function() {\n            return ((((this.serverTime - this.localStartTime)) * m));\n        },\n        updateTimeStamps: function() {\n            s.timestamps = h.scry(JSBNG__document.body, \"abbr.livetimestamp\");\n            s.startLoop(r);\n        },\n        addTimeStamps: function(t) {\n            if (!t) {\n                return;\n            }\n        ;\n        ;\n            s.timestamps = ((s.timestamps || []));\n            if (((h.isNodeOfType(t, \"abbr\") && g.hasClass(t, \"livetimestamp\")))) {\n                s.timestamps.push(t);\n            }\n             else {\n                var u = h.scry(t, \"abbr.livetimestamp\");\n                for (var v = 0; ((v < u.length)); ++v) {\n                    s.timestamps.push(u[v]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            s.startLoop(0);\n        },\n        startLoop: function(t) {\n            this.JSBNG__stop();\n            this.timeout = JSBNG__setTimeout(function() {\n                s.loop();\n            }, t);\n        },\n        JSBNG__stop: function() {\n            JSBNG__clearTimeout(this.timeout);\n        },\n        updateNode: function(t, u) {\n            s.updateNode = ((((i.ie() < 7)) ? j : h.setContent));\n            s.updateNode(t, u);\n        },\n        loop: function(t) {\n            if (t) {\n                s.updateTimeStamps();\n            }\n        ;\n        ;\n            var u = Math.floor(((s.getApproximateServerTime() / m))), v = -1;\n            ((s.timestamps && s.timestamps.forEach(function(x) {\n                var y = x.getAttribute(\"data-utime\"), z = x.getAttribute(\"data-shorten\"), aa = s.renderRelativeTime(u, y, z);\n                if (aa.text) {\n                    s.updateNode(x, aa.text);\n                }\n            ;\n            ;\n                if (((((aa.next != -1)) && ((((aa.next < v)) || ((v == -1))))))) {\n                    v = aa.next;\n                }\n            ;\n            ;\n            })));\n            if (((v != -1))) {\n                var w = Math.max(r, ((v * m)));\n                s.timeout = JSBNG__setTimeout(function() {\n                    s.loop();\n                }, w);\n            }\n        ;\n        ;\n        },\n        renderRelativeTime: function(t, u, v) {\n            var w = {\n                text: \"\",\n                next: -1\n            };\n            if (((((t - u)) > (p)))) {\n                return w;\n            }\n        ;\n        ;\n            var x = ((t - u)), y = Math.floor(((x / n))), z = Math.floor(((y / q)));\n            if (((y < 1))) {\n                if (v) {\n                    x = ((((x > 1)) ? x : 2));\n                    w.text = k._(\"{number} secs\", [k.param(\"number\", x),]);\n                    w.next = ((20 - ((x % 20))));\n                }\n                 else {\n                    w.text = \"a few seconds ago\";\n                    w.next = ((n - ((x % n))));\n                }\n            ;\n            ;\n                return w;\n            }\n        ;\n        ;\n            if (((z < 1))) {\n                if (((v && ((y == 1))))) {\n                    w.text = \"1 min\";\n                }\n                 else if (v) {\n                    w.text = k._(\"{number} mins\", [k.param(\"number\", y),]);\n                }\n                 else w.text = ((((y == 1)) ? \"about a minute ago\" : l._(\"{number} minutes ago\", {\n                    number: y\n                })));\n                \n            ;\n            ;\n                w.next = ((n - ((x % n))));\n                return w;\n            }\n        ;\n        ;\n            if (((z < 11))) {\n                w.next = ((o - ((x % o))));\n            }\n        ;\n        ;\n            if (((v && ((z == 1))))) {\n                w.text = \"1 hr\";\n            }\n             else if (v) {\n                w.text = k._(\"{number} hrs\", [k.param(\"number\", z),]);\n            }\n             else w.text = ((((z == 1)) ? \"about an hour ago\" : l._(\"{number} hours ago\", {\n                number: z\n            })));\n            \n        ;\n        ;\n            return w;\n        },\n        renderRelativeTimeToServer: function(t) {\n            return s.renderRelativeTime(Math.floor(((s.getApproximateServerTime() / m))), t);\n        }\n    };\n    e.exports = s;\n});\n__d(\"Timestamp.react\", [\"LiveTimer\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"Timestamp\",\n        render: function() {\n            var j = g.renderRelativeTimeToServer(this.props.time);\n            return this.transferPropsTo(h.DOM.abbr({\n                className: \"livetimestamp\",\n                title: this.props.verbose,\n                \"data-utime\": this.props.time\n            }, ((j.text || this.props.text))));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIClassNames\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        ACTOR_IMAGE: \"img UFIActorImage -cx-PRIVATE-uiSquareImage__size32\",\n        ROW: \"UFIRow\",\n        UNSEEN_ITEM: \"UFIUnseenItem\"\n    };\n});\n__d(\"UFIImageBlock.react\", [\"ImageBlock.react\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ImageBlock.react\"), h = b(\"React\"), i = b(\"cx\"), j = h.createClass({\n        displayName: \"UFIImageBlock\",\n        render: function() {\n            return this.transferPropsTo(g({\n                imageClassName: \"UFIImageBlockImage\",\n                contentClassName: \"UFIImageBlockContent\"\n            }, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"debounceAcrossTransitions\", [\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"debounce\");\n    function h(i, j, k) {\n        return g(i, j, k, true);\n    };\n;\n    e.exports = h;\n});\n__d(\"MercuryServerDispatcher\", [\"AsyncRequest\",\"FBAjaxRequest\",\"Env\",\"JSLogger\",\"Run\",\"areObjectsEqual\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"FBAjaxRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = b(\"areObjectsEqual\"), m = b(\"copyProperties\"), n = b(\"debounceAcrossTransitions\"), o = {\n    }, p = j.create(\"mercury_dispatcher\"), q = false, r = {\n        IMMEDIATE: \"immediate\",\n        IDEMPOTENT: \"idempotent\",\n        BATCH_SUCCESSIVE: \"batch-successive\",\n        BATCH_SUCCESSIVE_UNIQUE: \"batch-successive-unique\",\n        BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR: \"batch-successive-piggyback-retry\",\n        BATCH_DEFERRED_MULTI: \"batch-deferred-multi\",\n        BATCH_CONDITIONAL: \"batch-conditional\",\n        registerEndpoints: function(v) {\n            {\n                var fin88keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin88i = (0);\n                var w;\n                for (; (fin88i < fin88keys.length); (fin88i++)) {\n                    ((w) = (fin88keys[fin88i]));\n                    {\n                        var x = v[w], y = ((x.request_user_id || i.user));\n                        if (!o[w]) {\n                            o[w] = {\n                            };\n                        }\n                    ;\n                    ;\n                        if (!o[w][y]) {\n                            o[w][y] = {\n                            };\n                        }\n                    ;\n                    ;\n                        o[w][y] = new s(w, x);\n                    };\n                };\n            };\n        ;\n        },\n        trySend: function(v, w, x, y) {\n            y = ((y || i.user));\n            if (((((v == \"/ajax/mercury/client_reliability.php\")) && !o[v][y]))) {\n                o[v][y] = o[v][undefined];\n            }\n        ;\n        ;\n            o[v][y].trySend(w, x);\n        }\n    };\n    function s(v, w) {\n        var x = ((w.mode || r.IMMEDIATE));\n        switch (x) {\n          case r.IMMEDIATE:\n        \n          case r.IDEMPOTENT:\n        \n          case r.BATCH_SUCCESSIVE:\n        \n          case r.BATCH_SUCCESSIVE_UNIQUE:\n        \n          case r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR:\n        \n          case r.BATCH_DEFERRED_MULTI:\n        \n          case r.BATCH_CONDITIONAL:\n            break;\n          default:\n            throw new Error(((\"Invalid MercuryServerDispatcher mode \" + x)));\n        };\n    ;\n        this._endpoint = v;\n        this._mode = x;\n        this._requestUserID = w.request_user_id;\n        this._combineData = w.batch_function;\n        this._combineDataIf = w.batch_if;\n        this._batchSizeLimit = w.batch_size_limit;\n        this._batches = [];\n        this._handler = w.handler;\n        this._errorHandler = w.error_handler;\n        this._transportErrorHandler = ((w.transport_error_handler || w.error_handler));\n        this._connectionRetries = ((w.connection_retries || 0));\n        this._timeoutHandler = w.timeout_handler;\n        this._timeout = w.timeout;\n        this._serverDialogCancelHandler = ((w.server_dialog_cancel_handler || w.error_handler));\n        this._deferredSend = n(this._batchSend, 0, this);\n        if (this._batchSizeLimit) {\n            k.onUnload(function() {\n                p.bump(((\"unload_batches_count_\" + u(this._batches.length))));\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    m(s.prototype, {\n        _inFlight: 0,\n        _handler: null,\n        _errorHandler: null,\n        _transportErrorHandler: null,\n        _timeoutHandler: null,\n        _timeout: null,\n        _serverDialogCancelHandler: null,\n        _combineData: null,\n        trySend: function(v, w) {\n            if (q) {\n                return;\n            }\n        ;\n        ;\n            if (((typeof v == \"undefined\"))) {\n                v = null;\n            }\n        ;\n        ;\n            var x = ((w || this._mode));\n            if (((x == r.IMMEDIATE))) {\n                this._send(v);\n            }\n             else if (((x == r.IDEMPOTENT))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n            ;\n            ;\n            }\n             else if (((((x == r.BATCH_SUCCESSIVE)) || ((x == r.BATCH_SUCCESSIVE_UNIQUE))))) {\n                if (!this._inFlight) {\n                    this._send(v);\n                }\n                 else this._batchData(v);\n            ;\n            ;\n            }\n             else if (((x == r.BATCH_CONDITIONAL))) {\n                var y = ((this._batches[0] && this._batches[0].getData()));\n                if (((this._inFlight && ((this._combineDataIf(this._pendingRequestData, v) || this._combineDataIf(y, v)))))) {\n                    this._batchData(v);\n                }\n                 else this._send(v);\n            ;\n            ;\n            }\n             else if (((x == r.BATCH_DEFERRED_MULTI))) {\n                this._batchData(v);\n                this._deferredSend();\n            }\n             else if (((x == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR))) {\n                this._batchData(v);\n                if (!this._inFlight) {\n                    this._batchSend();\n                }\n            ;\n            ;\n            }\n            \n            \n            \n            \n            \n        ;\n        ;\n        },\n        _send: function(v) {\n            this._inFlight++;\n            this._pendingRequestData = m({\n            }, v);\n            if (((this._requestUserID != i.user))) {\n                v.request_user_id = this._requestUserID;\n            }\n        ;\n        ;\n            p.log(\"send\", {\n                endpoint: this._endpoint,\n                data: v,\n                inflight_count: this._inFlight\n            });\n            var w = null;\n            if (i.worker_context) {\n                w = new h(\"POST\", this._endpoint, v);\n                w.onError = function(x) {\n                    x.getPayload = function() {\n                        return x.errorText;\n                    };\n                    x.getRequest = function() {\n                        var y = x;\n                        x.getData = function() {\n                            return v;\n                        };\n                        return y;\n                    };\n                    x.getError = function() {\n                        return x.errorText;\n                    };\n                    x.getErrorDescription = function() {\n                        return x.errorText;\n                    };\n                    x.isTransient = function() {\n                        return false;\n                    };\n                    this._handleError(x);\n                }.bind(this);\n                w.onJSON = function(x) {\n                    x.getPayload = function() {\n                        return x.json;\n                    };\n                    x.getRequest = function() {\n                        return w;\n                    };\n                    this._handleResponse(x);\n                }.bind(this);\n                w.getData = function() {\n                    return v;\n                };\n                w.send();\n            }\n             else {\n                w = new g(this._endpoint).setData(v).setOption(\"retries\", this._connectionRetries).setHandler(this._handleResponse.bind(this)).setErrorHandler(this._handleError.bind(this)).setTransportErrorHandler(this._handleTransportError.bind(this)).setServerDialogCancelHandler(this._handleServerDialogCancel.bind(this)).setAllowCrossPageTransition(true);\n                if (((this._timeout && this._timeoutHandler))) {\n                    w.setTimeoutHandler(this._timeout, this._handleTimeout.bind(this));\n                }\n            ;\n            ;\n                w.send();\n            }\n        ;\n        ;\n        },\n        _batchData: function(v, w) {\n            if (((((((this._mode == r.BATCH_SUCCESSIVE_UNIQUE)) && ((typeof this._pendingRequestData != \"undefined\")))) && l(v, this._pendingRequestData)))) {\n                return;\n            }\n             else {\n                var x = ((this._batches.length - 1));\n                if (((((x >= 0)) && !this._hasReachedBatchLimit(this._batches[x])))) {\n                    ((w ? this._batches[x].combineWithOlder(v, this._combineData) : this._batches[x].combineWith(v, this._combineData)));\n                }\n                 else {\n                    this._batches.push(new t(v));\n                    p.bump(((\"batches_count_\" + u(this._batches.length))));\n                }\n            ;\n            ;\n                p.debug(\"batch\", {\n                    endpoint: this._endpoint,\n                    batches: this._batches,\n                    batch_limit: this._batchSizeLimit\n                });\n            }\n        ;\n        ;\n        },\n        _hasReachedBatchLimit: function(v) {\n            return ((this._batchSizeLimit && ((v.getSize() >= this._batchSizeLimit))));\n        },\n        _batchSend: function() {\n            if (this._batches[0]) {\n                this._send(this._batches[0].getData());\n                this._batches.shift();\n            }\n        ;\n        ;\n        },\n        _handleResponse: function(v) {\n            this._inFlight--;\n            p.log(\"response\", {\n                endpoint: this._endpoint,\n                inflight_count: this._inFlight\n            });\n            var w = v.getPayload();\n            q = ((w && w.kill_chat));\n            if (q) {\n                p.log(\"killswitch_enabled\", {\n                    endpoint: this._endpoint,\n                    inflight_count: this._inFlight\n                });\n            }\n        ;\n        ;\n            if (((w && w.error_payload))) {\n                if (this._errorHandler) {\n                    this._errorHandler(v);\n                }\n            ;\n            ;\n            }\n             else ((this._handler && this._handler(w, v.getRequest())));\n        ;\n        ;\n            if (((((((((this._mode == r.BATCH_SUCCESSIVE)) || ((this._mode == r.BATCH_SUCCESSIVE_UNIQUE)))) || ((this._mode == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR)))) || ((this._mode == r.BATCH_CONDITIONAL))))) {\n                this._batchSend();\n            }\n        ;\n        ;\n            delete this._pendingRequestData;\n        },\n        _postErrorHandler: function() {\n            p.error(\"error\", {\n                endpoint: this._endpoint,\n                inflight_count: ((this._inFlight - 1))\n            });\n            this._inFlight--;\n            var v = this._mode;\n            if (((((((v == r.BATCH_SUCCESSIVE)) || ((v == r.BATCH_SUCCESSIVE_UNIQUE)))) || ((v == r.BATCH_CONDITIONAL))))) {\n                this._batchSend();\n            }\n             else if (((v == r.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR))) {\n                if (this._batches[0]) {\n                    this._batchData(this._pendingRequestData, true);\n                    this._batchSend();\n                }\n                 else this._batchData(this._pendingRequestData, true);\n            ;\n            }\n            \n        ;\n        ;\n            delete this._pendingRequestData;\n        },\n        _handleError: function(v) {\n            ((this._errorHandler && this._errorHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleTransportError: function(v) {\n            ((this._transportErrorHandler && this._transportErrorHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleTimeout: function(v) {\n            ((this._timeoutHandler && this._timeoutHandler(v)));\n            this._postErrorHandler();\n        },\n        _handleServerDialogCancel: function(v) {\n            ((this._serverDialogCancelHandler && this._serverDialogCancelHandler(v)));\n            this._postErrorHandler();\n        }\n    });\n    function t(v) {\n        this._data = v;\n        this._size = 1;\n    };\n;\n    m(t.prototype, {\n        getData: function() {\n            return this._data;\n        },\n        getSize: function() {\n            return this._size;\n        },\n        combineWith: function(v, w) {\n            this._data = w(this._data, v);\n            this._size++;\n        },\n        combineWithOlder: function(v, w) {\n            this._data = w(v, this._data);\n            this._size++;\n        }\n    });\n    function u(v) {\n        if (((v === 1))) {\n            return \"equals1\";\n        }\n         else if (((((v >= 2)) && ((v <= 3))))) {\n            return \"between2and3\";\n        }\n         else return \"over4\"\n        \n    ;\n    };\n;\n    e.exports = r;\n});\n__d(\"TokenizeUtil\", [\"repeatString\",], function(a, b, c, d, e, f) {\n    var g = b(\"repeatString\"), h = /[ ]+/g, i = /[^ ]+/g, j = new RegExp(k(), \"g\");\n    function k() {\n        return ((((((((\"[.,+*?$|#{}()'\\\\^\\\\-\\\\[\\\\]\\\\\\\\\\\\/!@%\\\"~=\\u003C\\u003E_:;\" + \"\\u30fb\\u3001\\u3002\\u3008-\\u3011\\u3014-\\u301f\\uff1a-\\uff1f\\uff01-\\uff0f\")) + \"\\uff3b-\\uff40\\uff5b-\\uff65\\u2e2e\\u061f\\u066a-\\u066c\\u061b\\u060c\\u060d\")) + \"\\ufd3e\\ufd3f\\u1801\\u0964\\u104a\\u104b\\u2010-\\u2027\\u2030-\\u205e\")) + \"\\u00a1-\\u00b1\\u00b4-\\u00b8\\u00ba\\u00bb\\u00bf]\"));\n    };\n;\n    var l = {\n    }, m = {\n        a: \"\\u0430 \\u00e0 \\u00e1 \\u00e2 \\u00e3 \\u00e4 \\u00e5\",\n        b: \"\\u0431\",\n        c: \"\\u0446 \\u00e7 \\u010d\",\n        d: \"\\u0434 \\u00f0 \\u010f \\u0111\",\n        e: \"\\u044d \\u0435 \\u00e8 \\u00e9 \\u00ea \\u00eb \\u011b\",\n        f: \"\\u0444\",\n        g: \"\\u0433 \\u011f\",\n        h: \"\\u0445 \\u0127\",\n        i: \"\\u0438 \\u00ec \\u00ed \\u00ee \\u00ef \\u0131\",\n        j: \"\\u0439\",\n        k: \"\\u043a \\u0138\",\n        l: \"\\u043b \\u013e \\u013a \\u0140 \\u0142\",\n        m: \"\\u043c\",\n        n: \"\\u043d \\u00f1 \\u0148 \\u0149 \\u014b\",\n        o: \"\\u043e \\u00f8 \\u00f6 \\u00f5 \\u00f4 \\u00f3 \\u00f2\",\n        p: \"\\u043f\",\n        r: \"\\u0440 \\u0159 \\u0155\",\n        s: \"\\u0441 \\u015f \\u0161 \\u017f\",\n        t: \"\\u0442 \\u0165 \\u0167 \\u00fe\",\n        u: \"\\u0443 \\u044e \\u00fc \\u00fb \\u00fa \\u00f9 \\u016f\",\n        v: \"\\u0432\",\n        y: \"\\u044b \\u00ff \\u00fd\",\n        z: \"\\u0437 \\u017e\",\n        ae: \"\\u00e6\",\n        oe: \"\\u0153\",\n        ts: \"\\u0446\",\n        ch: \"\\u0447\",\n        ij: \"\\u0133\",\n        sh: \"\\u0448\",\n        ss: \"\\u00df\",\n        ya: \"\\u044f\"\n    };\n    {\n        var fin89keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin89i = (0);\n        var n;\n        for (; (fin89i < fin89keys.length); (fin89i++)) {\n            ((n) = (fin89keys[fin89i]));\n            {\n                var o = m[n].split(\" \");\n                for (var p = 0; ((p < o.length)); p++) {\n                    l[o[p]] = n;\n                ;\n                };\n            ;\n            };\n        };\n    };\n;\n    var q = {\n    };\n    function r(x) {\n        return ((x ? x.replace(j, \" \") : \"\"));\n    };\n;\n    function s(x) {\n        x = x.toLowerCase();\n        var y = \"\", z = \"\";\n        for (var aa = x.length; aa--; ) {\n            z = x.charAt(aa);\n            y = ((((l[z] || z)) + y));\n        };\n    ;\n        return y.replace(h, \" \");\n    };\n;\n    function t(x) {\n        var y = [], z = i.exec(x);\n        while (z) {\n            z = z[0];\n            y.push(z);\n            z = i.exec(x);\n        };\n    ;\n        return y;\n    };\n;\n    function u(x, y) {\n        if (!q.hasOwnProperty(x)) {\n            var z = s(x), aa = r(z);\n            q[x] = {\n                value: x,\n                flatValue: z,\n                tokens: t(aa),\n                isPrefixQuery: ((aa && ((aa[((aa.length - 1))] != \" \"))))\n            };\n        }\n    ;\n    ;\n        if (((y && ((typeof q[x].sortedTokens == \"undefined\"))))) {\n            q[x].sortedTokens = q[x].tokens.slice();\n            q[x].sortedTokens.sort(function(ba, ca) {\n                return ((ca.length - ba.length));\n            });\n        }\n    ;\n    ;\n        return q[x];\n    };\n;\n    function v(x, y, z) {\n        var aa = u(y, ((x == \"prefix\"))), ba = ((((x == \"prefix\")) ? aa.sortedTokens : aa.tokens)), ca = u(z).tokens, da = {\n        }, ea = ((((aa.isPrefixQuery && ((x == \"query\")))) ? ((ba.length - 1)) : null)), fa = function(ga, ha) {\n            for (var ia = 0; ((ia < ca.length)); ++ia) {\n                var ja = ca[ia];\n                if (((!da[ia] && ((((ja == ga)) || ((((((((x == \"query\")) && ((ha === ea)))) || ((x == \"prefix\")))) && ((ja.indexOf(ga) === 0))))))))) {\n                    return (da[ia] = true);\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        };\n        return Boolean(((ba.length && ba.every(fa))));\n    };\n;\n    var w = {\n        flatten: s,\n        parse: u,\n        getPunctuation: k,\n        isExactMatch: v.bind(null, \"exact\"),\n        isQueryMatch: v.bind(null, \"query\"),\n        isPrefixMatch: v.bind(null, \"prefix\")\n    };\n    e.exports = w;\n});\n__d(\"KanaUtils\", [], function(a, b, c, d, e, f) {\n    var g = 12353, h = 12436, i = 96, j = {\n        normalizeHiragana: function(k) {\n            if (((k !== null))) {\n                var l = [];\n                for (var m = 0; ((m < k.length)); m++) {\n                    var n = k.charCodeAt(m);\n                    if (((((n < g)) || ((n > h))))) {\n                        l.push(k.charAt(m));\n                    }\n                     else {\n                        var o = ((n + i));\n                        l.push(String.fromCharCode(o));\n                    }\n                ;\n                ;\n                };\n            ;\n                return l.join(\"\");\n            }\n             else return null\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DataSource\", [\"ArbiterMixin\",\"AsyncRequest\",\"TokenizeUtil\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"KanaUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"TokenizeUtil\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\"), n = b(\"KanaUtils\");\n    function o(p) {\n        this._maxResults = ((p.maxResults || 10));\n        this.token = p.token;\n        this.queryData = ((p.queryData || {\n        }));\n        this.queryEndpoint = ((p.queryEndpoint || \"\"));\n        this.bootstrapData = ((p.bootstrapData || {\n        }));\n        this.bootstrapEndpoint = ((p.bootstrapEndpoint || \"\"));\n        this._exclusions = ((p.exclusions || []));\n        this._indexedFields = ((p.indexedFields || [\"text\",\"tokens\",]));\n        this._titleFields = ((p.titleFields || []));\n        this._alwaysPrefixMatch = ((p.alwaysPrefixMatch || false));\n        this._deduplicationKey = ((p.deduplicationKey || null));\n        this._enabledQueryCache = ((p.enabledQueryCache || true));\n        this._queryExactMatch = ((p.queryExactMatch || false));\n        this._acrossTransitions = ((p.acrossTransitions || false));\n        this._kanaNormalization = ((p.kanaNormalization || false));\n        this._minQueryLength = ((p.minQueryLength || -1));\n        this._minExactMatchLength = 4;\n        this._filters = [];\n    };\n;\n    j(o.prototype, g, {\n        events: [\"bootstrap\",\"query\",\"respond\",],\n        init: function() {\n            this.init = m;\n            this._fields = l(this._indexedFields);\n            this._activeQueries = 0;\n            this.dirty();\n        },\n        dirty: function() {\n            this.value = \"\";\n            this._bootstrapped = false;\n            this._bootstrapping = false;\n            this._data = {\n            };\n            this.localCache = {\n            };\n            this.queryCache = {\n            };\n            this.inform(\"dirty\", {\n            });\n            return this;\n        },\n        bootstrap: function() {\n            if (this._bootstrapped) {\n                return;\n            }\n        ;\n        ;\n            this.bootstrapWithoutToken();\n            this._bootstrapped = true;\n            this._bootstrapping = true;\n            this.inform(\"bootstrap\", {\n                bootstrapping: true\n            });\n        },\n        bootstrapWithoutToken: function() {\n            this.fetch(this.bootstrapEndpoint, this.bootstrapData, {\n                bootstrap: true,\n                token: this.token\n            });\n        },\n        bootstrapWithToken: function() {\n            var p = j({\n            }, this.bootstrapData);\n            p.token = this.token;\n            this.fetch(this.bootstrapEndpoint, p, {\n                bootstrap: true,\n                replaceCache: true\n            });\n        },\n        query: function(p, q, r, s) {\n            this.inform(\"beforeQuery\", {\n                value: p,\n                local_only: q,\n                exclusions: r,\n                time_waited: s\n            });\n            if (!this._enabledQueryCache) {\n                this.queryCache = {\n                };\n            }\n        ;\n        ;\n            var t = this.buildUids(p, [], r), u = this.respond(p, t);\n            this.value = p;\n            this.inform(\"query\", {\n                value: p,\n                results: u\n            });\n            var v = this._normalizeString(p).flatValue;\n            if (((((((((((q || !v)) || this._isQueryTooShort(v))) || !this.queryEndpoint)) || this.getQueryCache().hasOwnProperty(v))) || !this.shouldFetchMoreResults(u)))) {\n                return false;\n            }\n        ;\n        ;\n            this.inform(\"queryEndpoint\", {\n                value: p\n            });\n            this.fetch(this.queryEndpoint, this.getQueryData(p, t), {\n                value: p,\n                exclusions: r\n            });\n            return true;\n        },\n        _isQueryTooShort: function(p) {\n            return ((p.length < this._minQueryLength));\n        },\n        _normalizeString: function(p, q) {\n            var r = p;\n            if (this._kanaNormalization) {\n                r = n.normalizeHiragana(p);\n            }\n        ;\n        ;\n            return i.parse(r, q);\n        },\n        shouldFetchMoreResults: function(p) {\n            return ((p.length < this._maxResults));\n        },\n        getQueryData: function(p, q) {\n            var r = j({\n                value: p\n            }, ((this.queryData || {\n            })));\n            q = ((q || []));\n            if (q.length) {\n                r.existing_ids = q.join(\",\");\n            }\n        ;\n        ;\n            if (this._bootstrapping) {\n                r.bsp = true;\n            }\n        ;\n        ;\n            return r;\n        },\n        setQueryData: function(p, q) {\n            if (q) {\n                this.queryData = {\n                };\n            }\n        ;\n        ;\n            j(this.queryData, p);\n            return this;\n        },\n        setBootstrapData: function(p, q) {\n            if (q) {\n                this.bootstrapData = {\n                };\n            }\n        ;\n        ;\n            j(this.bootstrapData, p);\n            return this;\n        },\n        getExclusions: function() {\n            return k(this._exclusions);\n        },\n        setExclusions: function(p) {\n            this._exclusions = ((p || []));\n        },\n        addFilter: function(p) {\n            var q = this._filters;\n            q.push(p);\n            return {\n                remove: function() {\n                    q.splice(q.indexOf(p), 1);\n                }\n            };\n        },\n        clearFilters: function() {\n            this._filters = [];\n        },\n        respond: function(p, q, r) {\n            var s = this.buildData(q);\n            this.inform(\"respond\", {\n                value: p,\n                results: s,\n                isAsync: !!r\n            });\n            return s;\n        },\n        asyncErrorHandler: m,\n        fetch: function(p, q, r) {\n            if (!p) {\n                return;\n            }\n        ;\n        ;\n            var s = new h().setURI(p).setData(q).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._acrossTransitions).setHandler(function(t) {\n                this.fetchHandler(t, ((r || {\n                })));\n            }.bind(this));\n            if (((p === this.queryEndpoint))) {\n                s.setFinallyHandler(function() {\n                    this._activeQueries--;\n                    if (!this._activeQueries) {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            s.setErrorHandler(this.asyncErrorHandler);\n            this.inform(\"beforeFetch\", {\n                request: s,\n                fetch_context: r\n            });\n            s.send();\n            if (((p === this.queryEndpoint))) {\n                if (!this._activeQueries) {\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                }\n            ;\n            ;\n                this._activeQueries++;\n            }\n        ;\n        ;\n        },\n        fetchHandler: function(p, q) {\n            var r = q.value, s = q.exclusions;\n            if (((!r && q.replaceCache))) {\n                this.localCache = {\n                };\n            }\n        ;\n        ;\n            this.inform(\"buildQueryCache\", {\n            });\n            var t = p.getPayload().entries;\n            this.addEntries(t, r);\n            this.inform(\"fetchComplete\", {\n                entries: t,\n                response: p,\n                value: r,\n                fetch_context: q\n            });\n            var u = ((((!r && this.value)) ? this.value : r));\n            this.respond(u, this.buildUids(u, [], s), true);\n            if (!r) {\n                if (this._bootstrapping) {\n                    this._bootstrapping = false;\n                    this.inform(\"bootstrap\", {\n                        bootstrapping: false\n                    });\n                }\n            ;\n            ;\n                if (((q.token && ((p.getPayload().token !== q.token))))) {\n                    this.bootstrapWithToken();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        addEntries: function(p, q) {\n            var r = this.processEntries(k(((p || []))), q), s = this.buildUids(q, r);\n            if (q) {\n                var t = this.getQueryCache();\n                t[this._normalizeString(q).flatValue] = s;\n            }\n             else this.fillCache(s);\n        ;\n        ;\n        },\n        processEntries: function(p, q) {\n            return p.map(function(r, s) {\n                var t = (r.uid = ((r.uid + \"\"))), u = this.getEntry(t);\n                if (!u) {\n                    u = r;\n                    u.query = q;\n                    this.setEntry(t, u);\n                }\n                 else j(u, r);\n            ;\n            ;\n                ((((u.index === undefined)) && (u.index = s)));\n                return t;\n            }, this);\n        },\n        getAllEntries: function() {\n            return ((this._data || {\n            }));\n        },\n        getEntry: function(p) {\n            return ((this._data[p] || null));\n        },\n        setEntry: function(p, q) {\n            this._data[p] = q;\n        },\n        fillCache: function(p) {\n            var q = this.localCache;\n            p.forEach(function(r) {\n                var s = this.getEntry(r);\n                if (!s) {\n                    return;\n                }\n            ;\n            ;\n                s.bootstrapped = true;\n                var t = this._normalizeString(this.getTextToIndex(s)).tokens;\n                for (var u = 0, v = t.length; ((u < v)); ++u) {\n                    var w = t[u];\n                    if (!q.hasOwnProperty(w)) {\n                        q[w] = {\n                        };\n                    }\n                ;\n                ;\n                    q[w][r] = true;\n                };\n            ;\n            }, this);\n        },\n        getTextToIndex: function(p) {\n            if (((p.textToIndex && !p.needs_update))) {\n                return p.textToIndex;\n            }\n        ;\n        ;\n            p.needs_update = false;\n            p.textToIndex = this.getTextToIndexFromFields(p, this._indexedFields);\n            return p.textToIndex;\n        },\n        getTextToIndexFromFields: function(p, q) {\n            var r = [];\n            for (var s = 0; ((s < q.length)); ++s) {\n                var t = p[q[s]];\n                if (t) {\n                    r.push(((t.join ? t.join(\" \") : t)));\n                }\n            ;\n            ;\n            };\n        ;\n            return r.join(\" \");\n        },\n        mergeUids: function(p, q, r, s) {\n            this.inform(\"mergeUids\", {\n                local_uids: p,\n                query_uids: q,\n                new_uids: r,\n                value: s\n            });\n            var t = function(u, v) {\n                var w = this.getEntry(u), x = this.getEntry(v);\n                if (((w.extended_match !== x.extended_match))) {\n                    return ((w.extended_match ? 1 : -1));\n                }\n            ;\n            ;\n                if (((w.index !== x.index))) {\n                    return ((w.index - x.index));\n                }\n            ;\n            ;\n                if (((w.text.length !== x.text.length))) {\n                    return ((w.text.length - x.text.length));\n                }\n            ;\n            ;\n                return ((w.uid < x.uid));\n            }.bind(this);\n            this._checkExtendedMatch(s, p);\n            return this.deduplicateByKey(p.sort(t).concat(q, r));\n        },\n        _checkExtendedMatch: function(p, q) {\n            var r = ((this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch));\n            for (var s = 0; ((s < q.length)); ++s) {\n                var t = this.getEntry(q[s]);\n                t.extended_match = ((t.tokens ? !r(p, t.text) : false));\n            };\n        ;\n        },\n        buildUids: function(p, q, r) {\n            if (!q) {\n                q = [];\n            }\n        ;\n        ;\n            if (!p) {\n                return q;\n            }\n        ;\n        ;\n            if (!r) {\n                r = [];\n            }\n        ;\n        ;\n            var s = this.buildCacheResults(p, this.localCache), t = this.buildQueryResults(p), u = this.mergeUids(s, t, q, p), v = l(r.concat(this._exclusions)), w = u.filter(function(x) {\n                if (((v.hasOwnProperty(x) || !this.getEntry(x)))) {\n                    return false;\n                }\n            ;\n            ;\n                for (var y = 0; ((y < this._filters.length)); ++y) {\n                    if (!this._filters[y](this.getEntry(x), p)) {\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n                return (v[x] = true);\n            }, this);\n            return this.uidsIncludingExact(p, w, v);\n        },\n        uidsIncludingExact: function(p, q) {\n            var r = q.length;\n            if (((((p.length < this._minExactMatchLength)) || ((r <= this._maxResults))))) {\n                return q;\n            }\n        ;\n        ;\n            for (var s = 0; ((s < r)); ++s) {\n                var t = this.getEntry(q[s]);\n                ((t.text_lower || (t.text_lower = t.text.toLowerCase())));\n                if (((t.text_lower === this._normalizeString(p).flatValue))) {\n                    if (((s >= this._maxResults))) {\n                        var u = q.splice(s, 1);\n                        q.splice(((this._maxResults - 1)), 0, u);\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        },\n        buildData: function(p) {\n            var q = [], r = Math.min(p.length, this._maxResults);\n            for (var s = 0; ((s < r)); ++s) {\n                q.push(this.getEntry(p[s]));\n            ;\n            };\n        ;\n            return q;\n        },\n        findQueryCache: function(p) {\n            var q = 0, r = null, s = this.getQueryCache();\n            if (this._queryExactMatch) {\n                return ((s[p] || []));\n            }\n        ;\n        ;\n            {\n                var fin90keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin90i = (0);\n                var t;\n                for (; (fin90i < fin90keys.length); (fin90i++)) {\n                    ((t) = (fin90keys[fin90i]));\n                    {\n                        if (((((p.indexOf(t) === 0)) && ((t.length > q))))) {\n                            q = t.length;\n                            r = t;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ((s[r] || []));\n        },\n        buildQueryResults: function(p) {\n            var q = this._normalizeString(p).flatValue, r = this.findQueryCache(q);\n            if (this.getQueryCache().hasOwnProperty(q)) {\n                return r;\n            }\n        ;\n        ;\n            return this.filterQueryResults(p, r);\n        },\n        filterQueryResults: function(p, q) {\n            var r = ((this._alwaysPrefixMatch ? i.isPrefixMatch : i.isQueryMatch));\n            return q.filter(function(s) {\n                return r(p, this.getTextToIndex(this.getEntry(s)));\n            }, this);\n        },\n        buildCacheResults: function(p, q) {\n            var r = this._normalizeString(p, this._alwaysPrefixMatch), s = ((this._alwaysPrefixMatch ? r.sortedTokens : r.tokens)), t = s.length, u = ((r.isPrefixQuery ? ((t - 1)) : null)), v = {\n            }, w = {\n            }, x = {\n            }, y = [], z = false, aa = {\n            }, ba = 0;\n            for (var ca = 0; ((ca < t)); ++ca) {\n                var da = s[ca];\n                if (!aa.hasOwnProperty(da)) {\n                    ba++;\n                    aa[da] = true;\n                }\n                 else continue;\n            ;\n            ;\n                {\n                    var fin91keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin91i = (0);\n                    var ea;\n                    for (; (fin91i < fin91keys.length); (fin91i++)) {\n                        ((ea) = (fin91keys[fin91i]));\n                        {\n                            if (((((!v.hasOwnProperty(ea) && ((ea === da)))) || ((((this._alwaysPrefixMatch || ((u === ca)))) && ((ea.indexOf(da) === 0))))))) {\n                                if (((ea === da))) {\n                                    if (w.hasOwnProperty(ea)) {\n                                        z = true;\n                                    }\n                                ;\n                                ;\n                                    v[ea] = true;\n                                }\n                                 else {\n                                    if (((v.hasOwnProperty(ea) || w.hasOwnProperty(ea)))) {\n                                        z = true;\n                                    }\n                                ;\n                                ;\n                                    w[ea] = true;\n                                }\n                            ;\n                            ;\n                                {\n                                    var fin92keys = ((window.top.JSBNG_Replay.forInKeys)((q[ea]))), fin92i = (0);\n                                    var fa;\n                                    for (; (fin92i < fin92keys.length); (fin92i++)) {\n                                        ((fa) = (fin92keys[fin92i]));\n                                        {\n                                            if (((((ca === 0)) || ((x.hasOwnProperty(fa) && ((x[fa] == ((ba - 1))))))))) {\n                                                x[fa] = ba;\n                                            }\n                                        ;\n                                        ;\n                                        };\n                                    };\n                                };\n                            ;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n            {\n                var fin93keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin93i = (0);\n                var ga;\n                for (; (fin93i < fin93keys.length); (fin93i++)) {\n                    ((ga) = (fin93keys[fin93i]));\n                    {\n                        if (((x[ga] == ba))) {\n                            y.push(ga);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((z || ((ba < t))))) {\n                y = this.filterQueryResults(p, y);\n            }\n        ;\n        ;\n            if (((this._titleFields && ((this._titleFields.length > 0))))) {\n                y = this.filterNonTitleMatchQueryResults(p, y);\n            }\n        ;\n        ;\n            return y;\n        },\n        filterNonTitleMatchQueryResults: function(p, q) {\n            return q.filter(function(r) {\n                var s = this._normalizeString(p), t = s.tokens.length;\n                if (((t === 0))) {\n                    return true;\n                }\n            ;\n            ;\n                var u = this.getTitleTerms(this.getEntry(r)), v = s.tokens[0];\n                return ((((((t === 1)) || this._alwaysPrefixMatch)) ? i.isPrefixMatch(v, u) : i.isQueryMatch(v, u)));\n            }, this);\n        },\n        getTitleTerms: function(p) {\n            if (!p.titleToIndex) {\n                p.titleToIndex = this.getTextToIndexFromFields(p, this._titleFields);\n            }\n        ;\n        ;\n            return p.titleToIndex;\n        },\n        deduplicateByKey: function(p) {\n            if (!this._deduplicationKey) {\n                return p;\n            }\n        ;\n        ;\n            var q = l(p.map(this._getDeduplicationKey.bind(this)), p);\n            return p.filter(function(r) {\n                return ((q[this._getDeduplicationKey(r)] == r));\n            }.bind(this));\n        },\n        _getDeduplicationKey: function(p) {\n            var q = this.getEntry(p);\n            return ((q[this._deduplicationKey] || ((((\"__\" + p)) + \"__\"))));\n        },\n        getQueryCache: function() {\n            return this.queryCache;\n        },\n        setMaxResults: function(p) {\n            this._maxResults = p;\n            ((this.value && this.respond(this.value, this.buildUids(this.value))));\n        },\n        updateToken: function(p) {\n            this.token = p;\n            this.dirty();\n            return this;\n        }\n    });\n    e.exports = o;\n});\n__d(\"Ease\", [], function(a, b, c, d, e, f) {\n    var g = {\n        makePowerOut: function(h) {\n            return function(i) {\n                var j = ((1 - Math.pow(((1 - i)), h)));\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        makePowerIn: function(h) {\n            return function(i) {\n                var j = Math.pow(i, h);\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        makePowerInOut: function(h) {\n            return function(i) {\n                var j = (((((i *= 2) < 1)) ? ((Math.pow(i, h) * 140977)) : ((1 - ((Math.abs(Math.pow(((2 - i)), h)) * 141008))))));\n                return ((((((j * 10000)) | 0)) / 10000));\n            };\n        },\n        sineOut: function(h) {\n            return Math.sin(((((h * Math.PI)) * 141086)));\n        },\n        sineIn: function(h) {\n            return ((1 - Math.cos(((((h * Math.PI)) * 141139)))));\n        },\n        sineInOut: function(h) {\n            return ((-141175 * ((Math.cos(((Math.PI * h))) - 1))));\n        },\n        circOut: function(h) {\n            return Math.sqrt(((1 - (((--h) * h)))));\n        },\n        circIn: function(h) {\n            return -((Math.sqrt(((1 - ((h * h))))) - 1));\n        },\n        circInOut: function(h) {\n            return (((((h *= 2) < 1)) ? ((-141345 * ((Math.sqrt(((1 - ((h * h))))) - 1)))) : ((141369 * ((Math.sqrt(((1 - (((h -= 2) * h))))) + 1))))));\n        },\n        bounceOut: function(h) {\n            if (((h < ((1 / 2.75))))) {\n                return ((((7.5625 * h)) * h));\n            }\n             else if (((h < ((2 / 2.75))))) {\n                return ((((((7.5625 * (h -= ((1.5 / 2.75))))) * h)) + 141505));\n            }\n             else if (((h < ((2.5 / 2.75))))) {\n                return ((((((7.5625 * (h -= ((2.25 / 2.75))))) * h)) + 141563));\n            }\n             else return ((((((7.5625 * (h -= ((2.625 / 2.75))))) * h)) + 141609))\n            \n            \n        ;\n        },\n        bounceIn: function(h) {\n            return ((1 - g.bounceOut(((1 - h)))));\n        },\n        bounceInOut: function(h) {\n            return ((((h < 141703)) ? ((g.bounceIn(((h * 2))) * 141723)) : ((((g.bounceOut(((((h * 2)) - 1))) * 141745)) + 141748))));\n        },\n        _makeBouncy: function(h) {\n            h = ((h || 1));\n            return function(i) {\n                i = ((((((1 - Math.cos(((((i * Math.PI)) * h))))) * ((1 - i)))) + i));\n                return ((((i <= 1)) ? i : ((2 - i))));\n            };\n        },\n        makeBounceOut: function(h) {\n            return this._makeBouncy(h);\n        },\n        makeBounceIn: function(h) {\n            var i = this._makeBouncy(h);\n            return function(j) {\n                return ((1 - i(((1 - j)))));\n            };\n        },\n        makeElasticOut: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            var j = ((Math.PI * 2));\n            return function(k) {\n                if (((((k === 0)) || ((k === 1))))) {\n                    return k;\n                }\n            ;\n            ;\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return ((((((h * Math.pow(2, ((-10 * k))))) * Math.sin(((((((k - l)) * j)) / i))))) + 1));\n            };\n        },\n        makeElasticIn: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            var j = ((Math.PI * 2));\n            return function(k) {\n                if (((((k === 0)) || ((k === 1))))) {\n                    return k;\n                }\n            ;\n            ;\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return -((((h * Math.pow(2, ((10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i)))));\n            };\n        },\n        makeElasticInOut: function(h, i) {\n            ((((h < 1)) && (h = 1)));\n            i *= 1.5;\n            var j = ((Math.PI * 2));\n            return function(k) {\n                var l = ((((i / j)) * Math.asin(((1 / h)))));\n                return (((((k *= 2) < 1)) ? ((((((-142496 * h)) * Math.pow(2, ((10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i))))) : ((1 + ((((((142545 * h)) * Math.pow(2, ((-10 * (k -= 1)))))) * Math.sin(((((((k - l)) * j)) / i)))))))));\n            };\n        },\n        makeBackOut: function(h) {\n            return function(i) {\n                return ((((((--i * i)) * ((((((h + 1)) * i)) + h)))) + 1));\n            };\n        },\n        makeBackIn: function(h) {\n            return function(i) {\n                return ((((i * i)) * ((((((h + 1)) * i)) - h))));\n            };\n        },\n        makeBackInOut: function(h) {\n            h *= 1.525;\n            return function(i) {\n                return (((((i *= 2) < 1)) ? ((142814 * ((((i * i)) * ((((((h + 1)) * i)) - h)))))) : ((142835 * (((((((i -= 2) * i)) * ((((((h + 1)) * i)) + h)))) + 2))))));\n            };\n        },\n        easeOutExpo: function(h) {\n            return ((-Math.pow(2, ((-10 * h))) + 1));\n        }\n    };\n    g.elasticOut = g.makeElasticOut(1, 142954);\n    g.elasticIn = g.makeElasticIn(1, 142988);\n    g.elasticInOut = g.makeElasticInOut(1, 143028);\n    g.backOut = g.makeBackOut(1.7);\n    g.backIn = g.makeBackIn(1.7);\n    g.backInOut = g.makeBackInOut(1.7);\n    e.exports = g;\n});\n__d(\"MultiBootstrapDataSource\", [\"Class\",\"DataSource\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\");\n    function i(j) {\n        this._bootstrapEndpoints = j.bootstrapEndpoints;\n        this.parent.construct(this, j);\n    };\n;\n    g.extend(i, h);\n    i.prototype.bootstrapWithoutToken = function() {\n        for (var j = 0; ((j < this._bootstrapEndpoints.length)); j++) {\n            this.fetch(this._bootstrapEndpoints[j].endpoint, ((this._bootstrapEndpoints[j].data || {\n            })), {\n                bootstrap: true\n            });\n        ;\n        };\n    ;\n    };\n    e.exports = i;\n});\n__d(\"XHPTemplate\", [\"DataStore\",\"DOM\",\"HTML\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataStore\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"copyProperties\");\n    function k(m) {\n        this._model = m;\n    };\n;\n    j(k.prototype, {\n        render: function() {\n            if (i.isHTML(this._model)) {\n                this._model = h.setContent(JSBNG__document.createDocumentFragment(), this._model)[0];\n            }\n        ;\n        ;\n            return this._model.cloneNode(true);\n        },\n        build: function() {\n            return new l(this.render());\n        }\n    });\n    j(k, {\n        getNode: function(m, n) {\n            return k.getNodes(m)[n];\n        },\n        getNodes: function(m) {\n            var n = g.get(m, \"XHPTemplate:nodes\");\n            if (!n) {\n                n = {\n                };\n                var o = h.scry(m, \"[data-jsid]\");\n                o.push(m);\n                var p = o.length;\n                while (p--) {\n                    var q = o[p];\n                    n[q.getAttribute(\"data-jsid\")] = q;\n                    q.removeAttribute(\"data-jsid\");\n                };\n            ;\n                g.set(m, \"XHPTemplate:nodes\", n);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    function l(m) {\n        this._root = m;\n        this._populateNodes();\n    };\n;\n    j(l.prototype, {\n        _populateNodes: function() {\n            this._nodes = {\n            };\n            this._leaves = {\n            };\n            var m = this._root.getElementsByTagName(\"*\");\n            for (var n = 0, o = m.length; ((n < o)); n++) {\n                var p = m[n], q = p.getAttribute(\"data-jsid\");\n                if (q) {\n                    p.removeAttribute(\"data-jsid\");\n                    this._nodes[q] = p;\n                    this._leaves[q] = !p.childNodes.length;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNode: function(m) {\n            return this._nodes[m];\n        },\n        setNodeProperty: function(m, n, o) {\n            this.getNode(m)[n] = o;\n            return this;\n        },\n        setNodeContent: function(m, n) {\n            if (!this._leaves[m]) {\n                throw new Error(((\"Can't setContent on non-leaf node: \" + m)));\n            }\n        ;\n        ;\n            h.setContent(this.getNode(m), n);\n            return this;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Scrollable\", [\"JSBNG__Event\",\"Parent\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"UserAgent\"), j = function(JSBNG__event) {\n        var m = h.byClass(JSBNG__event.getTarget(), \"scrollable\");\n        if (!m) {\n            return;\n        }\n    ;\n    ;\n        if (((((((((typeof JSBNG__event.axis !== \"undefined\")) && ((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)))) || ((JSBNG__event.wheelDeltaX && !JSBNG__event.wheelDeltaY)))) || ((JSBNG__event.deltaX && !JSBNG__event.deltaY))))) {\n            return;\n        }\n    ;\n    ;\n        var n = ((((JSBNG__event.wheelDelta || -JSBNG__event.deltaY)) || -JSBNG__event.detail)), o = m.scrollHeight, p = m.clientHeight;\n        if (((o > p))) {\n            var q = m.scrollTop;\n            if (((((((n > 0)) && ((q === 0)))) || ((((n < 0)) && ((q >= ((o - p))))))))) {\n                JSBNG__event.prevent();\n            }\n             else if (((i.ie() < 9))) {\n                if (m.currentStyle) {\n                    var r = m.currentStyle.fontSize;\n                    if (((r.indexOf(\"px\") < 0))) {\n                        var s = JSBNG__document.createElement(\"div\");\n                        s.style.fontSize = r;\n                        s.style.height = \"1em\";\n                        r = s.style.pixelHeight;\n                    }\n                     else r = parseInt(r, 10);\n                ;\n                ;\n                    m.scrollTop = ((q - Math.round(((((n / 120)) * r)))));\n                    JSBNG__event.prevent();\n                }\n            ;\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    }, k = JSBNG__document.documentElement;\n    if (i.firefox()) {\n        var l = ((((\"JSBNG__WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\"));\n        k.JSBNG__addEventListener(l, j, false);\n    }\n     else g.listen(k, \"mousewheel\", j);\n;\n;\n});\n__d(\"randomInt\", [\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"invariant\");\n    function h(i, j) {\n        var k = arguments.length;\n        g(((((k > 0)) && ((k <= 2)))));\n        if (((k === 1))) {\n            j = i;\n            i = 0;\n        }\n    ;\n    ;\n        g(((j > i)));\n        var l = ((this.JSBNG__random || Math.JSBNG__random));\n        return Math.floor(((i + ((l() * ((j - i)))))));\n    };\n;\n    e.exports = h;\n});");
// 1161
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o12,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/clqWNoT9Gz_.js",o13);
// undefined
o12 = null;
// undefined
o13 = null;
// 1166
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"ociRJ\",]);\n}\n;\n__d(\"CLoggerX\", [\"Banzai\",\"DOM\",\"debounce\",\"Event\",\"ge\",\"Parent\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"DOM\"), i = b(\"debounce\"), j = b(\"Event\"), k = b(\"ge\"), l = b(\"Parent\"), m = ((10 * 60) * 1000), n = b(\"Keys\").RETURN, o = {\n    }, p = function(s) {\n        var t = ((s.target || s.srcElement)).id, u = ((s.target || s.srcElement)).value.trim().length, v = q.getTracker(t);\n        if (!v) {\n            return\n        };\n        if (((u > 5) && !v.submitted)) {\n            g.post(\"censorlogger\", {\n                cl_impid: v.impid,\n                clearcounter: v.clearcounter,\n                instrument: v.type,\n                elementid: t,\n                parent_fbid: (((v.parent_fbid == \"unknown\") ? null : v.parent_fbid)),\n                version: \"x\"\n            }, g.VITAL);\n            q.setSubmitted(t, true);\n        }\n         else if ((((u === 0) && v.submitted) && (s.which != n))) {\n            o[t] = r(t);\n            o[t]();\n        }\n         else if (((u > 0) && v.submitted)) {\n            if (o[t]) {\n                o[t].reset();\n            }\n        }\n        \n    ;\n    }, q = {\n        init: function() {\n            this.trackedElements = (this.trackedElements || {\n            });\n            this.feedbackForms = (this.feedbackForms || {\n            });\n        },\n        setImpressionID: function(s) {\n            this.init();\n            this.impressionID = s;\n            this.clean();\n        },\n        setComposerTargetData: function(s) {\n            this.cTargetID = (s.targetID || \"unknown\");\n            this.cTargetFBType = (s.targetType || \"unknown\");\n        },\n        clean: function() {\n            for (var s in this.trackedElements) {\n                if (o[s]) {\n                    o[s].reset();\n                    delete o[s];\n                }\n            ;\n                delete this.trackedElements[s];\n            };\n        },\n        trackComposer: function(s, t, u) {\n            this.setComposerTargetData(u);\n            this.startTracking(s, \"composer\", this.cTargetID, this.cTargetFBType, t);\n        },\n        trackFeedbackForm: function(s, t, u) {\n            this.init();\n            this.impressionID = (this.impressionID || u);\n            var v, w, x;\n            v = h.getID(s);\n            w = (t ? (t.targetID || \"unknown\") : \"unknown\");\n            x = (t ? (t.targetType || \"unknown\") : \"unknown\");\n            this.feedbackForms[v] = {\n                parent_fbid: w,\n                parent_type: x\n            };\n        },\n        trackMentionsInput: function(s, t) {\n            this.init();\n            var u, v, w;\n            if (!s) {\n                return\n            };\n            u = l.byTag(s, \"form\");\n            if (!u) {\n                return\n            };\n            v = h.getID(u);\n            w = this.feedbackForms[v];\n            if (!w) {\n                return\n            };\n            var x = (t || w.parent_fbid), y = (t ? 416 : w.parent_type);\n            this.startTracking(s, \"comment\", x, y, u);\n        },\n        startTracking: function(s, t, u, v, w) {\n            this.init();\n            var x = h.getID(s);\n            if (this.getTracker(x)) {\n                return\n            };\n            var y = h.getID(w);\n            j.listen(s, \"keyup\", p.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: t,\n                impid: this.impressionID,\n                parent_fbid: u,\n                parent_type: v,\n                parentElID: y\n            };\n            this.addJoinTableInfoToForm(w, x);\n        },\n        getTracker: function(s) {\n            return ((this.trackedElements ? this.trackedElements[s] : null));\n        },\n        setSubmitted: function(s, t) {\n            if (this.trackedElements[s]) {\n                this.trackedElements[s].submitted = t;\n            };\n        },\n        incrementClearCounter: function(s) {\n            var t = this.getTracker(s);\n            if (!t) {\n                return\n            };\n            t.clearcounter++;\n            t.submitted = false;\n            var u = h.scry(k(t.parentElID), \"input[name=\\\"clp\\\"]\")[0];\n            if (u) {\n                u.value = this.getJSONRepForTrackerID(s);\n            };\n            this.trackedElements[s] = t;\n        },\n        addJoinTableInfoToForm: function(s, t) {\n            var u = this.getTracker(t);\n            if (!u) {\n                return\n            };\n            var v = h.scry(s, \"input[name=\\\"clp\\\"]\")[0];\n            if (!v) {\n                h.prependContent(s, h.create(\"input\", {\n                    type: \"hidden\",\n                    name: \"clp\",\n                    value: this.getJSONRepForTrackerID(t)\n                }));\n            };\n        },\n        getCLParamsForTarget: function(s, t) {\n            if (!s) {\n                return \"\"\n            };\n            var u = h.getID(s);\n            return this.getJSONRepForTrackerID(u, t);\n        },\n        getJSONRepForTrackerID: function(s, t) {\n            var u = this.getTracker(s);\n            if (!u) {\n                return \"\"\n            };\n            return JSON.stringify({\n                cl_impid: u.impid,\n                clearcounter: u.clearcounter,\n                elementid: s,\n                version: \"x\",\n                parent_fbid: (t || u.parent_fbid)\n            });\n        }\n    }, r = function(s) {\n        return i(function() {\n            q.incrementClearCounter(s);\n        }, m, q);\n    };\n    e.exports = q;\n});\n__d(\"ClickTTIIdentifiers\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            TIMELINE_SEE_LIKERS: \"timeline:seelikes\"\n        },\n        getUserActionID: function(h) {\n            return ((\"{\\\"ua_id\\\":\\\"\" + h) + \"\\\"}\");\n        }\n    };\n    e.exports = g;\n});\n__d(\"TrackingNodes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            USER_NAME: 2,\n            LIKE_LINK: 5,\n            UNLIKE_LINK: 6,\n            ATTACHMENT: 15,\n            SHARE_LINK: 17,\n            USER_MESSAGE: 18,\n            SOURCE: 21,\n            BLINGBOX: 22,\n            VIEW_ALL_COMMENTS: 24,\n            COMMENT: 25,\n            COMMENT_LINK: 26,\n            SMALL_ACTOR_PHOTO: 27,\n            XBUTTON: 29,\n            HIDE_LINK: 30,\n            REPORT_SPAM_LINK: 31,\n            HIDE_ALL_LINK: 32,\n            ADD_COMMENT_BOX: 34,\n            UFI: 36,\n            DROPDOWN_BUTTON: 55,\n            UNHIDE_LINK: 71,\n            RELATED_SHARE: 73\n        },\n        BASE_CODE_START: 58,\n        BASE_CODE_END: 126,\n        BASE_CODE_SIZE: 69,\n        PREFIX_CODE_START: 42,\n        PREFIX_CODE_END: 47,\n        PREFIX_CODE_SIZE: 6,\n        encodeTrackingInfo: function(h, i) {\n            var j = (((h - 1)) % g.BASE_CODE_SIZE), k = parseInt((((h - 1)) / g.BASE_CODE_SIZE), 10);\n            if (((h < 1) || (k > g.PREFIX_CODE_SIZE))) {\n                throw Error((\"Invalid tracking node: \" + h))\n            };\n            var l = \"\";\n            if ((k > 0)) {\n                l += String.fromCharCode(((k - 1) + g.PREFIX_CODE_START));\n            };\n            l += String.fromCharCode((j + g.BASE_CODE_START));\n            if (((typeof i != \"undefined\") && (i > 0))) {\n                l += String.fromCharCode(((48 + Math.min(i, 10)) - 1));\n            };\n            return l;\n        },\n        decodeTN: function(h) {\n            if ((h.length === 0)) {\n                return [0,]\n            };\n            var i = h.charCodeAt(0), j = 1, k, l;\n            if (((i >= g.PREFIX_CODE_START) && (i <= g.PREFIX_CODE_END))) {\n                if ((h.length == 1)) {\n                    return [0,]\n                };\n                l = ((i - g.PREFIX_CODE_START) + 1);\n                k = h.charCodeAt(1);\n                j = 2;\n            }\n             else {\n                l = 0;\n                k = i;\n            }\n        ;\n            if (((k < g.BASE_CODE_START) || (k > g.BASE_CODE_END))) {\n                return [0,]\n            };\n            var m = (((l * g.BASE_CODE_SIZE) + ((k - g.BASE_CODE_START))) + 1);\n            if (((h.length > j) && (((h.charAt(j) >= \"0\") && (h.charAt(j) <= \"9\"))))) {\n                return [(j + 1),[m,(parseInt(h.charAt(j), 10) + 1),],]\n            };\n            return [j,[m,],];\n        },\n        parseTrackingNodeString: function(h) {\n            var i = [];\n            while ((h.length > 0)) {\n                var j = g.decodeTN(h);\n                if ((j.length == 1)) {\n                    return []\n                };\n                i.push(j[1]);\n                h = h.substring(j[0]);\n            };\n            return i;\n        },\n        getTrackingInfo: function(h, i) {\n            return ((\"{\\\"tn\\\":\\\"\" + g.encodeTrackingInfo(h, i)) + \"\\\"}\");\n        }\n    };\n    e.exports = g;\n});\n__d(\"NumberFormat\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = /(\\d{3})(?=\\d)/g, i = 10000, j = function(l) {\n        return ((\"\" + l)).split(\"\").reverse().join(\"\");\n    }, k = {\n        formatIntegerWithDelimiter: function(l, m) {\n            if (((((g.locale == \"nb_NO\") || (g.locale == \"nn_NO\"))) && ((Math.abs(l) < i)))) {\n                return l.toString()\n            };\n            var n = j(l);\n            return j(n.replace(h, (\"$1\" + m)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UFIBlingItem.react\", [\"React\",\"NumberFormat\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"NumberFormat\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = g.createClass({\n        displayName: \"UFIBlingItem\",\n        render: function() {\n            var l = j(this.props.className, this.props.iconClassName, \"UFIBlingBoxSprite\"), m = h.formatIntegerWithDelimiter(this.props.count, (this.props.contextArgs.numberdelimiter || \",\"));\n            return (g.DOM.span(null, g.DOM.i({\n                className: l\n            }), g.DOM.span({\n                className: \"UFIBlingBoxText\"\n            }, m)));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFIConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COMMENT_LIKE: \"fa-type:comment-like\",\n        COMMENT_SET_SPAM: \"fa-type:mark-spam\",\n        DELETE_COMMENT: \"fa-type:delete-comment\",\n        LIVE_DELETE_COMMENT: \"fa-type:live-delete-comment\",\n        LIKE_ACTION: \"fa-type:like\",\n        REMOVE_PREVIEW: \"fa-type:remove-preview\",\n        CONFIRM_COMMENT_REMOVAL: \"fa-type:confirm-remove\",\n        TRANSLATE_COMMENT: \"fa-type:translate-comment\",\n        SUBSCRIBE_ACTION: \"fa-type:subscribe\",\n        GIFT_SUGGESTION: \"fa-type:gift-suggestion\",\n        UNDO_DELETE_COMMENT: \"fa-type:undo-delete-comment\"\n    }, h = {\n        DELETED: \"status:deleted\",\n        SPAM: \"status:spam\",\n        SPAM_DISPLAY: \"status:spam-display\",\n        LIVE_DELETED: \"status:live-deleted\",\n        FAILED_ADD: \"status:failed-add\",\n        FAILED_EDIT: \"status:failed-edit\",\n        PENDING_EDIT: \"status:pending-edit\",\n        PENDING_UNDO_DELETE: \"status:pending-undo-delete\"\n    }, i = {\n        MOBILE: 1,\n        SMS: 3,\n        EMAIL: 4\n    }, j = {\n        PROFILE: 0,\n        NEWS_FEED: 1,\n        OBJECT: 2,\n        MOBILE: 3,\n        EMAIL: 4,\n        PROFILE_APROVAL: 10,\n        TICKER: 12,\n        NONE: 13,\n        INTERN: 14,\n        ADS: 15,\n        PHOTOS_SNOWLIFT: 17\n    }, k = {\n        UNKNOWN: 0,\n        INITIAL_SERVER: 1,\n        LIVE_SEND: 2,\n        USER_ACTION: 3,\n        COLLAPSED_UFI: 4,\n        ENDPOINT_LIKE: 10,\n        ENDPOINT_COMMENT_LIKE: 11,\n        ENDPOINT_ADD_COMMENT: 12,\n        ENDPOINT_EDIT_COMMENT: 13,\n        ENDPOINT_DELETE_COMMENT: 14,\n        ENDPOINT_UNDO_DELETE_COMMENT: 15,\n        ENDPOINT_COMMENT_SPAM: 16,\n        ENDPOINT_REMOVE_PREVIEW: 17,\n        ENDPOINT_ID_COMMENT_FETCH: 18,\n        ENDPOINT_COMMENT_FETCH: 19,\n        ENDPOINT_TRANSLATE_COMMENT: 20,\n        ENDPOINT_BAN: 21,\n        ENDPOINT_SUBSCRIBE: 22\n    }, l = {\n        CHRONOLOGICAL: \"chronological\",\n        RANKED_THREADED: \"ranked_threaded\",\n        TOPLEVEL: \"toplevel\",\n        RECENT_ACTIVITY: \"recent_activity\"\n    }, m = 50, n = 7114, o = 420, p = 5, q = 80, r = 2;\n    e.exports = {\n        UFIActionType: g,\n        UFIStatus: h,\n        UFISourceType: i,\n        UFIFeedbackSourceType: j,\n        UFIPayloadSourceType: k,\n        UFICommentOrderingMode: l,\n        defaultPageSize: m,\n        commentTruncationLength: o,\n        commentTruncationPercent: n,\n        commentTruncationMaxLines: p,\n        attachmentTruncationLength: q,\n        minCommentsForOrderingModeSelector: r\n    };\n});\n__d(\"UFIBlingBox.react\", [\"React\",\"UFIBlingItem.react\",\"UFIConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIBlingItem.react\"), i = b(\"UFIConstants\"), j = b(\"cx\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIBlingBox\",\n        render: function() {\n            var m = [], n = \"\";\n            if (this.props.likes) {\n                m.push(h({\n                    count: this.props.likes,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxLikeIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.likes == 1)) ? \"1 like\" : k._(\"{count} likes\", {\n                    count: this.props.likes\n                }));\n                n += \" \";\n            }\n        ;\n            if (this.props.comments) {\n                m.push(h({\n                    count: this.props.comments,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxCommentIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.comments == 1)) ? \"1 comment\" : k._(\"{count} comments\", {\n                    count: this.props.comments\n                }));\n                n += \" \";\n            }\n        ;\n            if (this.props.reshares) {\n                m.push(h({\n                    count: this.props.reshares,\n                    className: (((m.length > 0) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxReshareIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += (((this.props.reshares == 1)) ? \"1 share\" : k._(\"{count} shares\", {\n                    count: this.props.reshares\n                }));\n            }\n        ;\n            var o = g.DOM.a({\n                className: \"UFIBlingBox uiBlingBox feedbackBling\",\n                href: this.props.permalink,\n                \"data-ft\": this.props[\"data-ft\"],\n                \"aria-label\": n\n            }, m);\n            if ((this.props.comments < i.defaultPageSize)) {\n                o.props.onClick = this.props.onClick;\n                o.props.rel = \"ignore\";\n            }\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFICentralUpdates\", [\"Arbiter\",\"ChannelConstants\",\"LiveTimer\",\"ShortProfiles\",\"UFIConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveTimer\"), j = b(\"ShortProfiles\"), k = b(\"UFIConstants\"), l = b(\"copyProperties\"), m = b(\"tx\"), n = 0, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [];\n    g.subscribe(h.getArbiterType(\"live-data\"), function(x, y) {\n        if ((y && y.obj)) {\n            var z = y.obj, aa = (z.comments || []);\n            aa.forEach(function(ba) {\n                ba.timestamp.text = \"a few seconds ago\";\n            });\n            w.handleUpdate(k.UFIPayloadSourceType.LIVE_SEND, z);\n        }\n    ;\n    });\n    function t() {\n        if (!n) {\n            var x = q, y = o, z = p, aa = r;\n            q = {\n            };\n            o = {\n            };\n            p = {\n            };\n            r = {\n            };\n            if (Object.keys(x).length) {\n                v(\"feedback-id-changed\", x);\n            };\n            if (Object.keys(y).length) {\n                v(\"feedback-updated\", y);\n            };\n            if (Object.keys(z).length) {\n                v(\"comments-updated\", z);\n            };\n            if (Object.keys(aa).length) {\n                v(\"instance-updated\", aa);\n            };\n            s.pop();\n        }\n    ;\n    };\n    function u() {\n        if (s.length) {\n            return s[(s.length - 1)];\n        }\n         else return k.UFIPayloadSourceType.UNKNOWN\n    ;\n    };\n    function v(event, x) {\n        w.inform(event, {\n            updates: x,\n            payloadSource: u()\n        });\n    };\n    var w = l(new g(), {\n        handleUpdate: function(x, y) {\n            if (Object.keys(y).length) {\n                this.synchronizeInforms(function() {\n                    s.push(x);\n                    var z = l({\n                        payloadsource: u()\n                    }, y);\n                    this.inform(\"update-feedback\", z);\n                    this.inform(\"update-comment-lists\", z);\n                    this.inform(\"update-comments\", z);\n                    this.inform(\"update-actions\", z);\n                    ((y.profiles || [])).forEach(function(aa) {\n                        j.set(aa.id, aa);\n                    });\n                    if (y.servertime) {\n                        i.restart(y.servertime);\n                    };\n                }.bind(this));\n            };\n        },\n        didUpdateFeedback: function(x) {\n            o[x] = true;\n            t();\n        },\n        didUpdateComment: function(x) {\n            p[x] = true;\n            t();\n        },\n        didUpdateFeedbackID: function(x, y) {\n            q[x] = y;\n            t();\n        },\n        didUpdateInstanceState: function(x, y) {\n            if (!r[x]) {\n                r[x] = {\n                };\n            };\n            r[x][y] = true;\n            t();\n        },\n        synchronizeInforms: function(x) {\n            n++;\n            try {\n                x();\n            } catch (y) {\n                throw y;\n            } finally {\n                n--;\n                t();\n            };\n        }\n    });\n    e.exports = w;\n});\n__d(\"ClientIDs\", [\"randomInt\",], function(a, b, c, d, e, f) {\n    var g = b(\"randomInt\"), h = {\n    }, i = {\n        getNewClientID: function() {\n            var j = Date.now(), k = ((j + \":\") + ((g(0, 4294967295) + 1)));\n            h[k] = true;\n            return k;\n        },\n        isExistingClientID: function(j) {\n            return !!h[j];\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImmutableObject\", [\"keyMirror\",\"merge\",\"mergeInto\",\"mergeHelpers\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"merge\"), i = b(\"mergeInto\"), j = b(\"mergeHelpers\"), k = b(\"throwIf\"), l = j.checkMergeObjectArgs, m = j.isTerminal, n, o;\n    n = g({\n        INVALID_MAP_SET_ARG: null\n    });\n    o = function(q) {\n        i(this, q);\n    };\n    o.set = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        var s = new o(q);\n        i(s, r);\n        return s;\n    };\n    o.setField = function(q, r, s) {\n        var t = {\n        };\n        t[r] = s;\n        return o.set(q, t);\n    };\n    o.setDeep = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        return p(q, r);\n    };\n    function p(q, r) {\n        l(q, r);\n        var s = {\n        }, t = Object.keys(q);\n        for (var u = 0; (u < t.length); u++) {\n            var v = t[u];\n            if (!r.hasOwnProperty(v)) {\n                s[v] = q[v];\n            }\n             else if ((m(q[v]) || m(r[v]))) {\n                s[v] = r[v];\n            }\n             else s[v] = p(q[v], r[v]);\n            \n        ;\n        };\n        var w = Object.keys(r);\n        for (u = 0; (u < w.length); u++) {\n            var x = w[u];\n            if (q.hasOwnProperty(x)) {\n                continue;\n            };\n            s[x] = r[x];\n        };\n        return ((((q instanceof o) || (r instanceof o))) ? new o(s) : s);\n    };\n    e.exports = o;\n});\n__d(\"UFIFeedbackTargets\", [\"ClientIDs\",\"KeyedCallbackManager\",\"UFICentralUpdates\",\"UFIConstants\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"KeyedCallbackManager\"), i = b(\"UFICentralUpdates\"), j = b(\"UFIConstants\"), k = b(\"copyProperties\"), l = new h();\n    function m(v) {\n        var w = {\n        };\n        v.forEach(function(x) {\n            var y = k({\n            }, x);\n            delete y.commentlist;\n            delete y.commentcount;\n            w[x.entidentifier] = y;\n            i.didUpdateFeedback(x.entidentifier);\n        });\n        l.addResourcesAndExecute(w);\n    };\n    function n(v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            switch (x.actiontype) {\n              case j.UFIActionType.LIKE_ACTION:\n                p(x);\n                break;\n              case j.UFIActionType.SUBSCRIBE_ACTION:\n                q(x);\n                break;\n              case j.UFIActionType.GIFT_SUGGESTION:\n                r(x);\n                break;\n            };\n        };\n    };\n    function o(v) {\n        for (var w = 0; (w < v.length); w++) {\n            var x = v[w];\n            if (x.orig_ftentidentifier) {\n                t(x.orig_ftentidentifier, x.ftentidentifier);\n            };\n        };\n    };\n    function p(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewerliked = !!v.hasviewerliked;\n            if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewerliked != w.hasviewerliked))) {\n                return\n            };\n            w.likecount = (v.likecount || 0);\n            w.likesentences = v.likesentences;\n            if ((v.actorid == w.actorforpost)) {\n                w.hasviewerliked = v.hasviewerliked;\n            }\n             else if ((v.hasviewerliked != w.hasviewerliked)) {\n                w.likesentences = {\n                    current: v.likesentences.alternate,\n                    alternate: v.likesentences.current\n                };\n                if (w.hasviewerliked) {\n                    w.likecount++;\n                }\n                 else w.likecount--;\n            ;\n            }\n            \n        ;\n            if ((v.actorid != w.actorforpost)) {\n                w.likesentences.isunseen = true;\n            };\n            m([w,]);\n        }\n    ;\n    };\n    function q(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewersubscribed = !!v.hasviewersubscribed;\n            if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewersubscribed != w.hasviewersubscribed))) {\n                return\n            };\n            if ((v.actorid == w.actorforpost)) {\n                w.hasviewersubscribed = v.hasviewersubscribed;\n            };\n            m([w,]);\n        }\n    ;\n    };\n    function r(v) {\n        var w = s(v);\n        if (!w) {\n            return\n        };\n        if (((v.clientid && g.isExistingClientID(v.clientid)) && (v.hasviewerliked != w.hasviewerliked))) {\n            return\n        };\n        w.giftdata = v.giftdata;\n        m([w,]);\n    };\n    function s(v) {\n        if (v.orig_entidentifier) {\n            t(v.orig_entidentifier, v.entidentifier);\n        };\n        return l.getResource(v.entidentifier);\n    };\n    function t(v, w) {\n        var x = l.getResource(v);\n        if (x) {\n            l.setResource(v, null);\n            x.entidentifier = w;\n            l.setResource(w, x);\n            i.didUpdateFeedbackID(v, w);\n        }\n    ;\n    };\n    var u = {\n        getFeedbackTarget: function(v, w) {\n            var x = l.executeOrEnqueue(v, w), y = l.getUnavailableResources(x);\n            y.length;\n            return x;\n        },\n        unsubscribe: function(v) {\n            l.unsubscribe(v);\n        }\n    };\n    i.subscribe(\"update-feedback\", function(v, w) {\n        var x = w.feedbacktargets;\n        if ((x && x.length)) {\n            m(x);\n        };\n    });\n    i.subscribe(\"update-actions\", function(v, w) {\n        if ((w.actions && w.actions.length)) {\n            n(w.actions);\n        };\n    });\n    i.subscribe(\"update-comments\", function(v, w) {\n        if ((w.comments && w.comments.length)) {\n            o(w.comments);\n        };\n    });\n    e.exports = u;\n});\n__d(\"UFIInstanceState\", [\"UFICentralUpdates\",], function(a, b, c, d, e, f) {\n    var g = b(\"UFICentralUpdates\"), h = {\n    };\n    function i(k) {\n        if (!h[k]) {\n            h[k] = {\n            };\n        };\n    };\n    var j = {\n        getKeyForInstance: function(k, l) {\n            i(k);\n            return h[k][l];\n        },\n        updateState: function(k, l, m) {\n            i(k);\n            h[k][l] = m;\n            g.didUpdateInstanceState(k, l);\n        },\n        updateStateField: function(k, l, m, n) {\n            var o = (this.getKeyForInstance(k, l) || {\n            });\n            o[m] = n;\n            this.updateState(k, l, o);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UFIComments\", [\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"UFICentralUpdates\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"URI\",\"keyMirror\",\"merge\",\"randomInt\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"ImmutableObject\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = b(\"UFICentralUpdates\"), m = b(\"UFIConstants\"), n = b(\"UFIFeedbackTargets\"), o = b(\"UFIInstanceState\"), p = b(\"URI\"), q = b(\"keyMirror\"), r = b(\"merge\"), s = b(\"randomInt\"), t = b(\"throwIf\"), u = q({\n        INVALID_COMMENT_TYPE: null\n    }), v = i.create(\"UFIComments\"), w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = \"unavailable_comment_key\";\n    function da(ab) {\n        return ((ab in ba) ? ba[ab] : ab);\n    };\n    function ea(ab, bb) {\n        if (!x[ab]) {\n            x[ab] = {\n            };\n        };\n        if (!x[ab][bb]) {\n            x[ab][bb] = new j();\n        };\n        return x[ab][bb];\n    };\n    function fa(ab) {\n        var bb = [];\n        if (x[ab]) {\n            for (var cb in x[ab]) {\n                bb.push(x[ab][cb]);;\n            }\n        };\n        return bb;\n    };\n    function ga(ab) {\n        if (!y[ab]) {\n            y[ab] = new j();\n        };\n        return y[ab];\n    };\n    function ha(ab) {\n        var bb = fa(ab);\n        bb.forEach(function(cb) {\n            cb.reset();\n        });\n    };\n    function ia(ab, bb) {\n        ab.forEach(function(cb) {\n            var db = cb.ftentidentifier, eb = (cb.parentcommentid || db);\n            n.getFeedbackTarget(db, function(fb) {\n                var gb = m.UFIPayloadSourceType, hb = cb.clientid, ib = false, jb = r({\n                }, cb);\n                if (hb) {\n                    delete jb.clientid;\n                    ib = g.isExistingClientID(hb);\n                    if ((ib && ba[hb])) {\n                        return\n                    };\n                }\n            ;\n                if ((((bb === gb.LIVE_SEND) && cb.parentcommentid) && (z[eb] === undefined))) {\n                    return\n                };\n                if ((((((bb === gb.LIVE_SEND)) || ((bb === gb.USER_ACTION))) || ((bb === gb.ENDPOINT_ADD_COMMENT))) || ((bb === gb.ENDPOINT_EDIT_COMMENT)))) {\n                    jb.isunseen = true;\n                };\n                if (((bb === gb.ENDPOINT_COMMENT_FETCH) || (bb === gb.ENDPOINT_ID_COMMENT_FETCH))) {\n                    jb.fromfetch = true;\n                };\n                if (ib) {\n                    if (w[hb].ufiinstanceid) {\n                        o.updateStateField(w[hb].ufiinstanceid, \"locallycomposed\", cb.id, true);\n                    };\n                    jb.ufiinstanceid = w[hb].ufiinstanceid;\n                    ba[hb] = cb.id;\n                    w[cb.id] = w[hb];\n                    delete w[hb];\n                    l.didUpdateComment(hb);\n                }\n            ;\n                var kb, lb;\n                if (cb.parentcommentid) {\n                    lb = [ga(eb),];\n                }\n                 else lb = fa(eb);\n            ;\n                var mb = false;\n                lb.forEach(function(qb) {\n                    var rb = qb.getAllResources(), sb = {\n                    };\n                    for (var tb in rb) {\n                        var ub = rb[tb];\n                        sb[ub] = tb;\n                    };\n                    if (ib) {\n                        if ((hb in sb)) {\n                            sb[cb.id] = sb[hb];\n                            var vb = sb[hb];\n                            qb.setResource(vb, cb.id);\n                        }\n                    \n                    };\n                    if (sb[cb.id]) {\n                        mb = true;\n                    }\n                     else {\n                        var wb = (z[eb] || 0);\n                        sb[cb.id] = wb;\n                        qb.setResource(wb, cb.id);\n                    }\n                ;\n                    kb = sb[cb.id];\n                });\n                if (!mb) {\n                    var nb = (z[eb] || 0);\n                    z[eb] = (nb + 1);\n                    qa(eb);\n                }\n            ;\n                if ((cb.status === m.UFIStatus.FAILED_ADD)) {\n                    aa[eb] = (aa[eb] + 1);\n                };\n                var ob = z[eb];\n                jb.replycount = (((z[cb.id] || 0)) - ((aa[cb.id] || 0)));\n                var pb = ja(kb, ob);\n                if ((cb.parentcommentid && w[cb.parentcommentid])) {\n                    jb.permalink = p(fb.permalink).addQueryData({\n                        comment_id: w[cb.parentcommentid].legacyid,\n                        reply_comment_id: cb.legacyid,\n                        total_comments: ob\n                    }).toString();\n                }\n                 else jb.permalink = p(fb.permalink).addQueryData({\n                    comment_id: cb.legacyid,\n                    offset: pb,\n                    total_comments: ob\n                }).toString();\n            ;\n                za.setComment(cb.id, new h(jb));\n                l.didUpdateComment(cb.id);\n                l.didUpdateFeedback(db);\n            });\n        });\n    };\n    function ja(ab, bb) {\n        return (Math.floor(((((bb - ab) - 1)) / m.defaultPageSize)) * m.defaultPageSize);\n    };\n    function ka(ab) {\n        for (var bb = 0; (bb < ab.length); bb++) {\n            var cb = ab[bb];\n            switch (cb.actiontype) {\n              case m.UFIActionType.COMMENT_LIKE:\n                na(cb);\n                break;\n              case m.UFIActionType.DELETE_COMMENT:\n                ra(cb);\n                break;\n              case m.UFIActionType.LIVE_DELETE_COMMENT:\n                sa(cb);\n                break;\n              case m.UFIActionType.UNDO_DELETE_COMMENT:\n                ta(cb);\n                break;\n              case m.UFIActionType.REMOVE_PREVIEW:\n                ua(cb);\n                break;\n              case m.UFIActionType.COMMENT_SET_SPAM:\n                va(cb);\n                break;\n              case m.UFIActionType.CONFIRM_COMMENT_REMOVAL:\n                wa(cb);\n                break;\n              case m.UFIActionType.TRANSLATE_COMMENT:\n                oa(cb);\n                break;\n            };\n        };\n    };\n    function la(ab, bb, cb) {\n        var db = bb.range, eb = bb.values;\n        if (!db) {\n            v.error(\"nullrange\", {\n                target: ab,\n                commentList: bb\n            });\n            return;\n        }\n    ;\n        var fb = {\n        };\n        for (var gb = 0; (gb < db.length); gb++) {\n            fb[(db.offset + gb)] = (eb[gb] || ca);;\n        };\n        var hb, ib;\n        if (cb) {\n            hb = ea(ab, cb);\n            ib = ab;\n        }\n         else {\n            hb = ga(ab);\n            ib = bb.ftentidentifier;\n            if ((bb.count !== undefined)) {\n                z[ab] = bb.count;\n                aa[ab] = 0;\n            }\n        ;\n        }\n    ;\n        hb.addResourcesAndExecute(fb);\n        l.didUpdateFeedback(ib);\n    };\n    function ma(ab) {\n        ab.forEach(function(bb) {\n            z[bb.entidentifier] = bb.commentcount;\n            aa[bb.entidentifier] = 0;\n            l.didUpdateFeedback(bb.entidentifier);\n        });\n    };\n    function na(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (bb) {\n            var cb = {\n            }, db = (ab.clientid && g.isExistingClientID(ab.clientid));\n            if (!db) {\n                cb.hasviewerliked = ab.viewerliked;\n                cb.likecount = ab.likecount;\n            }\n        ;\n            cb.likeconfirmhash = s(0, 1024);\n            ya(ab.commentid, cb);\n        }\n    ;\n    };\n    function oa(ab) {\n        var bb = ab.commentid, cb = za.getComment(ab.commentid);\n        if (cb) {\n            ya(bb, {\n                translatedtext: ab.translatedtext\n            });\n        };\n    };\n    function pa(ab) {\n        var bb = {\n            reportLink: ab.reportLink,\n            commenterIsFOF: ab.commenterIsFOF,\n            userIsMinor: ab.userIsMinor\n        };\n        if (ab.undoData) {\n            bb.undoData = ab.undoData;\n        };\n        return bb;\n    };\n    function qa(ab, bb) {\n        if (ab) {\n            if ((bb !== undefined)) {\n                var cb = (((aa[ab] || 0)) + ((bb ? 1 : -1)));\n                aa[ab] = Math.max(cb, 0);\n            }\n        ;\n            var db = za.getComment(ab);\n            if (db) {\n                var eb = {\n                    replycount: za.getDisplayedCommentCount(ab)\n                };\n                ya(ab, eb);\n            }\n        ;\n        }\n    ;\n    };\n    function ra(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb.status !== m.UFIStatus.DELETED)) {\n            var cb = (bb.parentcommentid || bb.ftentidentifier);\n            if ((bb.status === m.UFIStatus.FAILED_ADD)) {\n                qa(cb);\n            }\n             else qa(cb, true);\n        ;\n        }\n    ;\n        xa(bb, m.UFIStatus.DELETED);\n    };\n    function sa(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb && (bb.status !== m.UFIStatus.DELETED))) {\n            xa(bb, m.UFIStatus.LIVE_DELETED);\n        };\n    };\n    function ta(ab) {\n        var bb = za.getComment(ab.commentid);\n        if ((bb.status === m.UFIStatus.DELETED)) {\n            var cb = (bb.parentcommentid || bb.ftentidentifier);\n            qa(cb, false);\n        }\n    ;\n        xa(bb, m.UFIStatus.PENDING_UNDO_DELETE);\n    };\n    function ua(ab) {\n        ya(ab.commentid, {\n            attachment: null\n        });\n    };\n    function va(ab) {\n        var bb = za.getComment(ab.commentid), cb = (ab.shouldHideAsSpam ? m.UFIStatus.SPAM_DISPLAY : null);\n        xa(bb, cb);\n    };\n    function wa(ab) {\n        ya(ab.commentid, pa(ab));\n    };\n    function xa(ab, bb) {\n        ya(ab.id, {\n            priorstatus: ab.status,\n            status: bb\n        });\n    };\n    function ya(ab, bb) {\n        var cb = (za.getComment(ab) || new h({\n        }));\n        za.setComment(ab, h.set(cb, bb));\n        l.didUpdateComment(cb.id);\n        l.didUpdateFeedback(cb.ftentidentifier);\n    };\n    var za = {\n        getComments: function(ab) {\n            var bb = {\n            };\n            for (var cb = 0; (cb < ab.length); cb++) {\n                bb[ab[cb]] = za.getComment(ab[cb]);;\n            };\n            return bb;\n        },\n        getComment: function(ab) {\n            return w[da(ab)];\n        },\n        setComment: function(ab, bb) {\n            w[da(ab)] = bb;\n        },\n        resetFeedbackTarget: function(ab) {\n            var bb = fa(ab), cb = {\n            };\n            bb.forEach(function(eb) {\n                var fb = eb.getAllResources();\n                for (var gb in fb) {\n                    var hb = fb[gb];\n                    cb[hb] = 1;\n                };\n            });\n            for (var db in cb) {\n                delete w[da(db)];;\n            };\n            ha(ab);\n        },\n        getCommentsInRange: function(ab, bb, cb, db, eb) {\n            var fb = ea(ab, cb);\n            n.getFeedbackTarget(ab, function(gb) {\n                var hb = [];\n                for (var ib = 0; (ib < bb.length); ib++) {\n                    hb.push((bb.offset + ib));;\n                };\n                var jb = function(pb) {\n                    var qb = [], rb = bb.offset, sb = ((bb.offset + bb.length) - 1);\n                    for (var tb = 0; (tb < bb.length); tb++) {\n                        var ub = (gb.isranked ? (sb - tb) : (rb + tb));\n                        if ((pb[ub] != ca)) {\n                            var vb = this.getComment(pb[ub]);\n                            if (vb) {\n                                qb.push(vb);\n                            };\n                        }\n                    ;\n                    };\n                    eb(qb);\n                }, kb = fb.getUnavailableResourcesFromRequest(hb);\n                if (kb.length) {\n                    var lb = Math.min.apply(Math, kb), mb = Math.max.apply(Math, kb), nb = lb, ob = ((mb - lb) + 1);\n                    k.trySend(\"/ajax/ufi/comment_fetch.php\", {\n                        ft_ent_identifier: gb.entidentifier,\n                        viewas: db,\n                        source: null,\n                        offset: nb,\n                        length: ob,\n                        orderingmode: cb\n                    });\n                }\n                 else fb.deferredExecuteOrEnqueue(hb).addCallback(jb, this);\n            ;\n            }.bind(this));\n        },\n        getRepliesInRanges: function(ab, bb, cb) {\n            var db = {\n            }, eb = {\n            }, fb = {\n            }, gb = false;\n            n.getFeedbackTarget(ab, function(hb) {\n                for (var ib in bb) {\n                    var jb = ga(ib), kb = bb[ib], lb = [];\n                    for (var mb = 0; (mb < kb.length); mb++) {\n                        lb.push((kb.offset + mb));;\n                    };\n                    db[ib] = jb.executeOrEnqueue(lb, function(wb) {\n                        var xb = [];\n                        for (var yb = 0; (yb < kb.length); yb++) {\n                            var zb = (kb.offset + yb);\n                            if ((wb[zb] != ca)) {\n                                var ac = this.getComment(wb[zb]);\n                                if (ac) {\n                                    xb.push(ac);\n                                };\n                            }\n                        ;\n                        };\n                        eb[ib] = xb;\n                    }.bind(this));\n                    fb[ib] = jb.getUnavailableResources(db[ib]);\n                    if (fb[ib].length) {\n                        gb = true;\n                        jb.unsubscribe(db[ib]);\n                    }\n                ;\n                };\n                if (!gb) {\n                    cb(eb);\n                }\n                 else {\n                    var nb = [], ob = [], pb = [];\n                    for (var qb in fb) {\n                        var rb = fb[qb];\n                        if (rb.length) {\n                            var sb = Math.min.apply(Math, rb), tb = Math.max.apply(Math, rb), ub = sb, vb = ((tb - sb) + 1);\n                            nb.push(qb);\n                            ob.push(ub);\n                            pb.push(vb);\n                        }\n                    ;\n                    };\n                    k.trySend(\"/ajax/ufi/reply_fetch.php\", {\n                        ft_ent_identifier: hb.entidentifier,\n                        parent_comment_ids: nb,\n                        source: null,\n                        offsets: ob,\n                        lengths: pb\n                    });\n                }\n            ;\n            }.bind(this));\n            return db;\n        },\n        getCommentCount: function(ab) {\n            return (z[ab] || 0);\n        },\n        getDeletedCount: function(ab) {\n            return (aa[ab] || 0);\n        },\n        getDisplayedCommentCount: function(ab) {\n            return (((z[ab] || 0)) - ((aa[ab] || 0)));\n        },\n        _dump: function() {\n            var ab = {\n                _comments: w,\n                _commentLists: x,\n                _replyLists: y,\n                _commentCounts: z,\n                _deletedCounts: aa,\n                _localIDMap: ba\n            };\n            return JSON.stringify(ab);\n        }\n    };\n    k.registerEndpoints({\n        \"/ajax/ufi/comment_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/reply_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        }\n    });\n    l.subscribe(\"update-comments\", function(ab, bb) {\n        if ((bb.comments && bb.comments.length)) {\n            ia(bb.comments, bb.payloadsource);\n        };\n    });\n    l.subscribe(\"update-actions\", function(ab, bb) {\n        if ((bb.actions && bb.actions.length)) {\n            ka(bb.actions);\n        };\n    });\n    l.subscribe(\"update-comment-lists\", function(ab, bb) {\n        var cb = bb.commentlists;\n        if ((cb && Object.keys(cb).length)) {\n            if (cb.comments) {\n                for (var db in cb.comments) {\n                    for (var eb in cb.comments[db]) {\n                        la(db, cb.comments[db][eb], eb);;\n                    };\n                }\n            };\n            if (cb.replies) {\n                for (var fb in cb.replies) {\n                    la(fb, cb.replies[fb]);;\n                }\n            };\n        }\n    ;\n    });\n    l.subscribe(\"update-feedback\", function(ab, bb) {\n        var cb = bb.feedbacktargets;\n        if ((cb && cb.length)) {\n            ma(cb);\n        };\n    });\n    e.exports = za;\n});\n__d(\"UFILikeLink.react\", [\"React\",\"TrackingNodes\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"tx\"), j = g.createClass({\n        displayName: \"UFILikeLink\",\n        render: function() {\n            var k = (this.props.likeAction ? \"Like\" : \"Unlike\"), l = h.getTrackingInfo((this.props.likeAction ? h.types.LIKE_LINK : h.types.UNLIKE_LINK)), m = (this.props.likeAction ? \"Like this\" : \"Unlike this\");\n            return (g.DOM.a({\n                className: \"UFILikeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: m,\n                onClick: this.props.onClick,\n                \"data-ft\": l\n            }, k));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFISubscribeLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFISubscribeLink\",\n        render: function() {\n            var j = (this.props.subscribeAction ? \"Follow Post\" : \"Unfollow Post\"), k = (this.props.subscribeAction ? \"Get notified when someone comments\" : \"Stop getting notified when someone comments\");\n            return (g.DOM.a({\n                className: \"UFISubscribeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: k,\n                onClick: this.props.onClick\n            }, j));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFITimelineBlingBox.react\", [\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIBlingItem.react\",\"URI\",\"cx\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"ProfileBrowserLink\"), h = b(\"ProfileBrowserTypes\"), i = b(\"React\"), j = b(\"UFIBlingItem.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"fbt\"), n = i.createClass({\n        displayName: \"UFITimelineBlingBox\",\n        render: function() {\n            var o = [];\n            if ((this.props.likes && this.props.enableShowLikes)) {\n                var p = this._getProfileBrowserURI(), q = \"See who likes this\", r = i.DOM.a({\n                    ajaxify: p.dialog,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-gt\": this.props[\"data-gt\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    \"data-tooltip-uri\": this._getLikeToolTipURI(),\n                    href: p.page,\n                    rel: \"dialog\",\n                    role: \"button\",\n                    title: q\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.likes,\n                    iconClassName: \"UFIBlingBoxTimelineLikeIcon\"\n                }));\n                o.push(r);\n            }\n        ;\n            if ((this.props.comments && this.props.enableShowComments)) {\n                var s = \"Show comments\", t = i.DOM.a({\n                    \"aria-label\": s,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: \"#\",\n                    onClick: this.props.commentOnClick\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.comments,\n                    iconClassName: \"UFIBlingBoxTimelineCommentIcon\"\n                }));\n                o.push(t);\n            }\n        ;\n            if (this.props.reshares) {\n                var u = \"Show shares\", v = this._getShareViewURI(), w = i.DOM.a({\n                    ajaxify: v.dialog,\n                    \"aria-label\": u,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: v.page,\n                    rel: \"async\"\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.reshares,\n                    iconClassName: \"UFIBlingBoxTimelineReshareIcon\"\n                }));\n                o.push(w);\n            }\n        ;\n            return (i.DOM.span(null, o));\n        },\n        _getItemClassName: function(o) {\n            return (((((o.length > 0) ? \"mls\" : \"\")) + ((\" \" + \"UFIBlingBoxTimelineItem\"))));\n        },\n        _getLikeToolTipURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/timeline/likestooltip.php\").setQueryData({\n                    obj_fbid: this.props.feedbackFBID\n                });\n                return o.toString();\n            }\n             else return null\n        ;\n        },\n        _getProfileBrowserURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = h.LIKES, p = {\n                    id: this.props.feedbackFBID\n                }, q = g.constructDialogURI(o, p), r = g.constructPageURI(o, p), s = {\n                    dialog: q.toString(),\n                    page: r.toString()\n                };\n                return s;\n            }\n        ;\n        },\n        _getShareViewURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/shares/view\").setQueryData({\n                    target_fbid: this.props.feedbackFBID\n                }), p = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: this.props.feedbackFBID\n                }), q = {\n                    dialog: o.toString(),\n                    page: p.toString()\n                };\n                return q;\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"UFIUserActions\", [\"AsyncResponse\",\"CLoggerX\",\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"Nectar\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"MercuryServerDispatcher\",\"collectDataAttributes\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncResponse\"), h = b(\"CLoggerX\"), i = b(\"ClientIDs\"), j = b(\"ImmutableObject\"), k = b(\"JSLogger\"), l = b(\"Nectar\"), m = b(\"UFICentralUpdates\"), n = b(\"UFIComments\"), o = b(\"UFIConstants\"), p = b(\"UFIFeedbackTargets\"), q = b(\"MercuryServerDispatcher\"), r = b(\"collectDataAttributes\"), s = b(\"copyProperties\"), t = b(\"tx\"), u = k.create(\"UFIUserActions\"), v = {\n        BAN: \"ban\",\n        UNDO_BAN: \"undo_ban\"\n    }, w = {\n        changeCommentLike: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if ((na.hasviewerliked != la)) {\n                var oa = x(ma.target), pa = (la ? 1 : -1), qa = {\n                    commentid: ka,\n                    actiontype: o.UFIActionType.COMMENT_LIKE,\n                    viewerliked: la,\n                    likecount: (na.likecount + pa)\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [qa,]\n                });\n                q.trySend(\"/ajax/ufi/comment_like.php\", s({\n                    comment_id: ka,\n                    legacy_id: na.legacyid,\n                    like_action: la,\n                    ft_ent_identifier: na.ftentidentifier,\n                    source: ma.source,\n                    client_id: i.getNewClientID()\n                }, oa));\n            }\n        ;\n        },\n        addComment: function(ka, la, ma, na) {\n            p.getFeedbackTarget(ka, function(oa) {\n                var pa = x(na.target), qa = i.getNewClientID();\n                if (!oa.actorforpost) {\n                    return\n                };\n                var ra = {\n                    ftentidentifier: ka,\n                    body: {\n                        text: la\n                    },\n                    author: oa.actorforpost,\n                    id: qa,\n                    islocal: true,\n                    ufiinstanceid: na.ufiinstanceid,\n                    likecount: 0,\n                    hasviewerliked: false,\n                    parentcommentid: na.replyid,\n                    photo_comment: na.attachedphoto,\n                    timestamp: {\n                        time: Date.now(),\n                        text: \"a few seconds ago\"\n                    }\n                }, sa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: oa.actorforpost,\n                    hasviewersubscribed: true,\n                    entidentifier: ka\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    comments: [ra,],\n                    actions: [sa,]\n                });\n                var ta = null;\n                if (na.replyid) {\n                    ta = (n.getComment(na.replyid)).fbid;\n                };\n                var ua = h.getCLParamsForTarget(na.target, ta);\n                q.trySend(\"/ajax/ufi/add_comment.php\", s({\n                    ft_ent_identifier: oa.entidentifier,\n                    comment_text: ma,\n                    source: na.source,\n                    client_id: qa,\n                    reply_fbid: ta,\n                    parent_comment_id: na.replyid,\n                    timeline_log_data: na.timelinelogdata,\n                    rootid: na.rootid,\n                    clp: ua,\n                    attached_photo_fbid: (na.attachedphoto ? na.attachedphoto.fbid : 0),\n                    giftoccasion: na.giftoccasion\n                }, pa));\n            });\n        },\n        editComment: function(ka, la, ma, na) {\n            var oa = x(na.target), pa = n.getComment(ka);\n            pa = j.set(pa, {\n                status: o.UFIStatus.PENDING_EDIT,\n                body: {\n                    text: la\n                },\n                timestamp: {\n                    time: Date.now(),\n                    text: \"a few seconds ago\"\n                },\n                originalTimestamp: pa.timestamp.time,\n                editnux: null,\n                attachment: null\n            });\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                comments: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/edit_comment.php\", s({\n                ft_ent_identifier: pa.ftentidentifier,\n                comment_text: ma,\n                source: na.source,\n                comment_id: pa.id,\n                parent_comment_id: pa.parentcommentid,\n                attached_photo_fbid: (na.attachedPhoto ? na.attachedPhoto.fbid : 0)\n            }, oa));\n        },\n        translateComment: function(ka, la) {\n            q.trySend(\"/ajax/ufi/translate_comment.php\", {\n                ft_ent_identifier: ka.ftentidentifier,\n                comment_ids: [ka.id,],\n                source: la.source\n            });\n        },\n        setHideAsSpam: function(ka, la, ma) {\n            var na = x(ma.target), oa = n.getComment(ka), pa = {\n                commentid: ka,\n                actiontype: o.UFIActionType.COMMENT_SET_SPAM,\n                shouldHideAsSpam: la\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/comment_spam.php\", s({\n                comment_id: ka,\n                spam_action: la,\n                ft_ent_identifier: oa.ftentidentifier,\n                source: ma.source\n            }, na));\n        },\n        removeComment: function(ka, la) {\n            var ma = x(la.target), na = n.getComment(ka), oa = {\n                actiontype: o.UFIActionType.DELETE_COMMENT,\n                commentid: ka,\n                oneclick: la.oneclick\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [oa,]\n            });\n            q.trySend(\"/ajax/ufi/delete_comment.php\", s({\n                comment_id: na.id,\n                comment_legacyid: na.legacyid,\n                ft_ent_identifier: na.ftentidentifier,\n                one_click: la.oneclick,\n                source: la.source,\n                client_id: i.getNewClientID(),\n                timeline_log_data: la.timelinelogdata\n            }, ma));\n        },\n        undoRemoveComment: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (!na.undoData) {\n                u.error(\"noundodata\", {\n                    comment: ka\n                });\n                return;\n            }\n        ;\n            var oa = x(ma.target), pa = {\n                actiontype: o.UFIActionType.UNDO_DELETE_COMMENT,\n                commentid: ka\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            var qa = na.undoData;\n            qa.page_admin = la;\n            var ra = s(oa, qa);\n            q.trySend(\"/ajax/ufi/undo_delete_comment.php\", ra);\n        },\n        banUser: function(ka, la, ma, na) {\n            var oa = (ma ? v.BAN : v.UNDO_BAN);\n            q.trySend(\"/ajax/ufi/ban_user.php\", {\n                page_id: la,\n                commenter_id: ka.author,\n                action: oa,\n                comment_id: ka.id,\n                client_side: true\n            });\n        },\n        changeLike: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if ((na.hasviewerliked !== la)) {\n                    var pa = (la ? 1 : -1), qa = {\n                        actiontype: o.UFIActionType.LIKE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewerliked: la,\n                        likecount: (na.likecount + pa),\n                        entidentifier: ka,\n                        likesentences: {\n                            current: na.likesentences.alternate,\n                            alternate: na.likesentences.current\n                        }\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [qa,]\n                    });\n                    q.trySend(\"/ajax/ufi/like.php\", s({\n                        like_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        giftoccasion: ma.giftoccasion\n                    }, oa));\n                }\n            ;\n            });\n        },\n        changeSubscribe: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if ((na.hasviewersubscribed !== la)) {\n                    var pa = {\n                        actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewersubscribed: la,\n                        entidentifier: ka\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [pa,]\n                    });\n                    q.trySend(\"/ajax/ufi/subscribe.php\", s({\n                        subscribe_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        comment_expand_mode: ma.commentexpandmode\n                    }, oa));\n                }\n            ;\n            });\n        },\n        fetchSpamComments: function(ka, la, ma, na) {\n            q.trySend(\"/ajax/ufi/id_comment_fetch.php\", {\n                ft_ent_identifier: ka,\n                viewas: na,\n                comment_ids: la,\n                parent_comment_id: ma,\n                source: null\n            });\n        },\n        removePreview: function(ka, la) {\n            var ma = x(la.target), na = {\n                commentid: ka.id,\n                actiontype: o.UFIActionType.REMOVE_PREVIEW\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [na,]\n            });\n            q.trySend(\"/ajax/ufi/remove_preview.php\", s({\n                comment_id: ka.id,\n                ft_ent_identifier: ka.ftentidentifier,\n                source: la.source\n            }, ma));\n        }\n    };\n    function x(ka) {\n        if (!ka) {\n            return {\n                ft: {\n                }\n            }\n        };\n        var la = {\n            ft: r(ka, [\"ft\",]).ft\n        };\n        l.addModuleData(la, ka);\n        return la;\n    };\n    function y(ka) {\n        var la = ka.request.data;\n        g.defaultErrorHandler(ka);\n        var ma = (la.client_id || la.comment_id), na = n.getComment(ma), oa = (((na.status === o.UFIStatus.PENDING_EDIT)) ? o.UFIStatus.FAILED_EDIT : o.UFIStatus.FAILED_ADD);\n        na = j.setDeep(na, {\n            status: oa,\n            allowRetry: z(ka),\n            body: {\n                mentionstext: la.comment_text\n            }\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n    function z(ka) {\n        var la = ka.getError();\n        if ((la === 1404102)) {\n            return false\n        };\n        if (ka.silentError) {\n            return true\n        };\n        if (((la === 1357012) || (la === 1357006))) {\n            return false\n        };\n        return true;\n    };\n    function aa(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        na = j.set(na, {\n            status: (na.priorstatus || null),\n            priorstatus: undefined\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n    function ba(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        if ((la.like_action === na.hasviewerliked)) {\n            var oa = (na.hasviewerliked ? -1 : 1), pa = {\n                commentid: ma,\n                actiontype: o.UFIActionType.COMMENT_LIKE,\n                viewerliked: !na.hasviewerliked,\n                likecount: (na.likecount + oa)\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n        }\n    ;\n        g.defaultErrorHandler(ka);\n    };\n    function ca(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if ((na.hasviewerliked === la.like_action)) {\n                var oa = (na.hasviewerliked ? -1 : 1), pa = {\n                    actiontype: o.UFIActionType.LIKE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewerliked: !na.hasviewerliked,\n                    likecount: (na.likecount + oa),\n                    entidentifier: ma,\n                    likesentences: {\n                        current: na.likesentences.alternate,\n                        alternate: na.likesentences.current\n                    }\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [pa,]\n                });\n            }\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n    function da(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if ((na.hasviewersubscribed === la.subscribe_action)) {\n                var oa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewersubscribed: !na.hasviewersubscribed,\n                    entidentifier: ma\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [oa,]\n                });\n            }\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n    var ea = function(ka) {\n        return m.handleUpdate.bind(m, ka);\n    }, fa = o.UFIPayloadSourceType;\n    q.registerEndpoints({\n        \"/ajax/ufi/comment_like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_COMMENT_LIKE),\n            error_handler: ba,\n            batch_if: ga,\n            batch_function: ja\n        },\n        \"/ajax/ufi/comment_spam.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_COMMENT_SPAM),\n            error_handler: aa\n        },\n        \"/ajax/ufi/add_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ADD_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/undo_delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_UNDO_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/ban_user.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_BAN)\n        },\n        \"/ajax/ufi/edit_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_EDIT_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_LIKE),\n            error_handler: ca,\n            batch_if: ha,\n            batch_function: ja\n        },\n        \"/ajax/ufi/subscribe.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_SUBSCRIBE),\n            error_handler: da,\n            batch_if: ia,\n            batch_function: ja\n        },\n        \"/ajax/ufi/id_comment_fetch.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ID_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/remove_preview.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_REMOVE_PREVIEW)\n        },\n        \"/ajax/ufi/translate_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_TRANSLATE_COMMENT)\n        }\n    });\n    function ga(ka, la) {\n        return ((ka && (ka.ft_ent_identifier == la.ft_ent_identifier)) && (ka.comment_id == la.comment_id));\n    };\n    function ha(ka, la) {\n        return (ka && (ka.ft_ent_identifier == la.ft_ent_identifier));\n    };\n    function ia(ka, la) {\n        return (ka && (ka.ft_ent_identifier == la.ft_ent_identifier));\n    };\n    function ja(ka, la) {\n        return la;\n    };\n    e.exports = w;\n});\n__d(\"UFIActionLinkController\", [\"Arbiter\",\"ClickTTIIdentifiers\",\"CSS\",\"DOMQuery\",\"Parent\",\"React\",\"TrackingNodes\",\"UFIBlingBox.react\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFILikeLink.react\",\"UFISubscribeLink.react\",\"UFITimelineBlingBox.react\",\"UFIUserActions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickTTIIdentifiers\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"Parent\"), l = b(\"React\"), m = b(\"TrackingNodes\"), n = b(\"UFIBlingBox.react\"), o = b(\"UFICentralUpdates\"), p = b(\"UFIComments\"), q = b(\"UFIConstants\"), r = b(\"UFIFeedbackTargets\"), s = b(\"UFILikeLink.react\"), t = b(\"UFISubscribeLink.react\"), u = b(\"UFITimelineBlingBox.react\"), v = b(\"UFIUserActions\"), w = b(\"copyProperties\");\n    function x(z, aa, ba) {\n        if (this._root) {\n            throw new Error((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\"))\n        };\n        var ca = j.scry(z, aa)[0];\n        if (ca) {\n            var da = document.createElement(\"span\");\n            ca.parentNode.replaceChild(da, ca);\n            da.appendChild(ca);\n            if ((typeof ba === \"function\")) {\n                ba(da);\n            };\n        }\n         else var ea = g.subscribe(\"PhotoSnowlift.DATA_CHANGE\", function() {\n            g.unsubscribe(ea);\n            x(z, aa, ba);\n        }, g.SUBSCRIBE_NEW)\n    ;\n    };\n    var y = function(z, aa, ba) {\n        this._id = aa.ftentidentifier;\n        this._ftFBID = ba.targetfbid;\n        this._source = aa.source;\n        this._contextArgs = aa;\n        this._ufiRoot = z;\n        if (this._isSourceProfile(this._contextArgs.source)) {\n            this._attemptInitializeTimelineBling();\n        }\n         else this._attemptInitializeBling();\n    ;\n        if (ba.viewercanlike) {\n            this._attemptInitializeLike();\n        };\n        if (ba.viewercansubscribetopost) {\n            this._attemptInitializeSubscribe();\n        };\n        o.subscribe(\"feedback-updated\", function(ca, da) {\n            var ea = da.updates;\n            if ((this._id in ea)) {\n                this.render();\n            };\n        }.bind(this));\n        o.subscribe(\"feedback-id-changed\", function(ca, da) {\n            var ea = da.updates;\n            if ((this._id in ea)) {\n                this._id = ea[this._id];\n            };\n        }.bind(this));\n    };\n    w(y.prototype, {\n        _attemptInitializeBling: function() {\n            x(this._ufiRoot, \"^form .uiBlingBox\", function(z) {\n                this._blingRoot = z;\n                if (this._dataReady) {\n                    this._renderBling();\n                };\n            }.bind(this));\n        },\n        _attemptInitializeTimelineBling: function() {\n            if (this._root) {\n                throw new Error((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\"))\n            };\n            var z = j.scry(this._ufiRoot, \"^form .fbTimelineFeedbackActions span\")[0];\n            if (z) {\n                i.addClass(z, \"UFIBlingBoxTimeline\");\n                var aa = j.scry(z, \".fbTimelineFeedbackLikes\")[0];\n                this._enableShowLikes = (aa ? true : false);\n                var ba = j.scry(z, \".fbTimelineFeedbackComments\")[0];\n                this._enableShowComments = (ba ? true : false);\n            }\n        ;\n            this._blingTimelineRoot = z;\n            if (this._dataReady) {\n                this._renderTimelineBling();\n            };\n        },\n        _attemptInitializeLike: function() {\n            x(this._ufiRoot, \"^form .like_link\", function(z) {\n                this._likeRoot = z;\n                if (this._dataReady) {\n                    this._renderLike();\n                };\n            }.bind(this));\n        },\n        _attemptInitializeSubscribe: function() {\n            x(this._ufiRoot, \"^form .unsub_link\", function(z) {\n                this._subscribeRoot = z;\n                if (this._dataReady) {\n                    this._renderSubscribe();\n                };\n            }.bind(this));\n        },\n        render: function() {\n            this._dataReady = true;\n            if (this._isSourceProfile(this._contextArgs.source)) {\n                this._renderTimelineBling();\n            }\n             else this._renderBling();\n        ;\n            this._renderLike();\n            this._renderSubscribe();\n        },\n        _renderBling: function() {\n            if (this._blingRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = function(event) {\n                        var da = k.byTag(event.target, \"form\");\n                        i.toggleClass(da, \"collapsed_comments\");\n                        i.toggleClass(da, \"hidden_add_comment\");\n                        event.preventDefault();\n                    }.bind(this), ba = m.getTrackingInfo(m.types.BLINGBOX), ca = n({\n                        likes: z.likecount,\n                        comments: p.getDisplayedCommentCount(this._id),\n                        reshares: z.sharecount,\n                        permalink: z.permalink,\n                        contextArgs: this._contextArgs,\n                        onClick: aa,\n                        \"data-ft\": ba\n                    });\n                    this._blingBox = l.renderComponent(ca, this._blingRoot);\n                }.bind(this));\n            };\n        },\n        _renderTimelineBling: function() {\n            if (this._blingTimelineRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = m.getTrackingInfo(m.types.BLINGBOX), ba = h.getUserActionID(h.types.TIMELINE_SEE_LIKERS), ca = function(event) {\n                        var ea = k.byTag(event.target, \"form\");\n                        i.removeClass(ea, \"collapsed_comments\");\n                        var fa = j.scry(ea, \"a.UFIPagerLink\");\n                        if (fa.length) {\n                            fa[0].click();\n                        };\n                        event.preventDefault();\n                    }.bind(this), da = u({\n                        comments: p.getDisplayedCommentCount(this._id),\n                        commentOnClick: ca,\n                        contextArgs: this._contextArgs,\n                        \"data-ft\": aa,\n                        \"data-gt\": ba,\n                        enableShowComments: this._enableShowComments,\n                        enableShowLikes: this._enableShowLikes,\n                        feedbackFBID: this._ftFBID,\n                        likes: z.likecount,\n                        reshares: z.sharecount\n                    });\n                    l.renderComponent(da, this._blingTimelineRoot);\n                }.bind(this));\n            };\n        },\n        _renderLike: function() {\n            if (this._likeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewerliked, ba = function(event) {\n                        v.changeLike(this._id, aa, {\n                            source: this._source,\n                            target: event.target,\n                            rootid: this._contextArgs.rootid,\n                            giftoccasion: this._contextArgs.giftoccasion\n                        });\n                        event.preventDefault();\n                    }.bind(this), ca = s({\n                        onClick: ba,\n                        likeAction: aa\n                    });\n                    this._likeLink = l.renderComponent(ca, this._likeRoot);\n                }.bind(this));\n            };\n        },\n        _renderSubscribe: function() {\n            if (this._subscribeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewersubscribed, ba = function(event) {\n                        v.changeSubscribe(this._id, aa, {\n                            source: this._source,\n                            target: event.target,\n                            rootid: this._contextArgs.rootid,\n                            commentexpandmode: z.commentexpandmode\n                        });\n                        event.preventDefault();\n                    }.bind(this), ca = t({\n                        onClick: ba,\n                        subscribeAction: aa\n                    });\n                    this._subscribeLink = l.renderComponent(ca, this._subscribeRoot);\n                }.bind(this));\n            };\n        },\n        _isSourceProfile: function(z) {\n            return (z === q.UFIFeedbackSourceType.PROFILE);\n        }\n    });\n    e.exports = y;\n});\n__d(\"MentionsInputUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        generateDataFromTextWithEntities: function(h) {\n            var i = h.text, j = [];\n            ((h.ranges || [])).forEach(function(l) {\n                var m = l.entities[0];\n                if (!m.external) {\n                    j.push({\n                        uid: m.id,\n                        text: i.substr(l.offset, l.length),\n                        offset: l.offset,\n                        length: l.length,\n                        weakreference: !!m.weakreference\n                    });\n                };\n            });\n            var k = {\n                value: i,\n                mentions: j\n            };\n            return k;\n        }\n    };\n    e.exports = g;\n});\n__d(\"ClipboardPhotoUploader\", [\"ArbiterMixin\",\"AsyncRequest\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.uploadURIString = k;\n        this.data = l;\n    };\n    i(j.prototype, g, {\n        handlePaste: function(event) {\n            if (!event.clipboardData) {\n                return\n            };\n            var k = event.clipboardData.items;\n            if (!k) {\n                return\n            };\n            for (var l = 0; (l < k.length); ++l) {\n                var m = k[l];\n                if (((m.kind === \"file\") && (m.type.indexOf(\"image/\") !== -1))) {\n                    var n = new FormData();\n                    n.append(\"pasted_file\", m.getAsFile());\n                    var o = new h();\n                    o.setURI(this.uploadURIString).setData(this.data).setRawData(n).setHandler(function(p) {\n                        this.inform(\"upload_success\", p);\n                    }.bind(this)).setErrorHandler(function(p) {\n                        this.inform(\"upload_error\", p);\n                    }.bind(this));\n                    this.inform(\"upload_start\");\n                    o.send();\n                    break;\n                }\n            ;\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"LegacyMentionsInput.react\", [\"PlaceholderListener\",\"Bootloader\",\"Event\",\"Keys\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"PlaceholderListener\");\n    var g = b(\"Bootloader\"), h = b(\"Event\"), i = b(\"Keys\"), j = b(\"React\"), k = b(\"cx\"), l = j.createClass({\n        displayName: \"ReactLegacyMentionsInput\",\n        componentDidMount: function(m) {\n            (this.props.initialData && this._initializeTextarea(m));\n        },\n        hasEnteredText: function() {\n            return !!((this._mentionsInput && this._mentionsInput.getValue().trim()));\n        },\n        _handleKeydown: function(event) {\n            var m = event.nativeEvent, n = this.props.onEnterSubmit, o = ((h.getKeyCode(m) == i.RETURN) && !h.$E(m).getModifiers().any), p = (this._mentionsInput && this._mentionsInput.getTypeahead().getView().getSelection());\n            if (((n && o) && !p)) {\n                if (this.props.isLoadingPhoto) {\n                    return false\n                };\n                var q = event.target, r = (q.value && q.value.trim());\n                if ((r || this.props.acceptEmptyInput)) {\n                    var s = {\n                        visibleValue: r,\n                        encodedValue: r,\n                        attachedPhoto: null\n                    };\n                    if (this._mentionsInput) {\n                        s.encodedValue = this._mentionsInput.getRawValue().trim();\n                        this._mentionsInput.reset();\n                    }\n                ;\n                    n(s, event);\n                }\n            ;\n                event.preventDefault();\n            }\n        ;\n        },\n        _handleFocus: function() {\n            (this.props.onFocus && this.props.onFocus());\n            this._initializeTextarea(this.refs.root.getDOMNode());\n        },\n        _handleBlur: function() {\n            (this.props.onBlur && this.props.onBlur());\n        },\n        _initializeTextarea: function(m) {\n            if ((this._mentionsInput || this._bootloadingMentions)) {\n                return\n            };\n            this._bootloadingMentions = true;\n            g.loadModules([\"CompactTypeaheadRenderer\",\"ContextualTypeaheadView\",\"InputSelection\",\"MentionsInput\",\"TextAreaControl\",\"Typeahead\",\"TypeaheadAreaCore\",\"TypeaheadBestName\",\"TypeaheadHoistFriends\",\"TypeaheadMetrics\",\"TypingDetector\",], function(n, o, p, q, r, s, t, u, v, w, x) {\n                var y = this.refs.textarea.getDOMNode();\n                new r(y);\n                if (this.props.onTypingStateChange) {\n                    var z = new x(y);\n                    z.init();\n                    z.subscribe(\"change\", this.props.onTypingStateChange);\n                }\n            ;\n                var aa = {\n                    autoSelect: true,\n                    renderer: n,\n                    causalElement: y\n                };\n                if (this.props.viewOptionsTypeObjects) {\n                    aa.typeObjects = this.props.viewOptionsTypeObjects;\n                };\n                if (this.props.viewOptionsTypeObjectsOrder) {\n                    aa.typeObjectsOrder = this.props.viewOptionsTypeObjectsOrder;\n                };\n                var ba = new s(this.props.datasource, {\n                    ctor: o,\n                    options: aa\n                }, {\n                    ctor: t\n                }, this.refs.typeahead.getDOMNode()), ca = [u,v,], da = new w({\n                    extraData: {\n                        event_name: \"mentions\"\n                    }\n                });\n                s.initNow(ba, ca, da);\n                this._mentionsInput = new q(m, ba, y, {\n                    hashtags: this.props.sht\n                });\n                this._mentionsInput.init({\n                    max: 6\n                }, this.props.initialData);\n                if (this.props.initialData) {\n                    p.set(y, y.value.length);\n                };\n                if (this.props.onPaste) {\n                    h.listen(y, \"paste\", this.props.onPaste);\n                };\n                this._bootloadingMentions = false;\n            }.bind(this));\n        },\n        focus: function() {\n            try {\n                this.refs.textarea.getDOMNode().focus();\n            } catch (m) {\n            \n            };\n        },\n        render: function() {\n            var m = (((((((\"textInput\") + ((\" \" + \"mentionsTextarea\"))) + ((\" \" + \"uiTextareaAutogrow\"))) + ((\" \" + \"uiTextareaNoResize\"))) + ((\" \" + \"UFIAddCommentInput\"))) + ((\" \" + \"DOMControl_placeholder\"))));\n            return (j.DOM.div({\n                ref: \"root\",\n                className: \"uiMentionsInput textBoxContainer ReactLegacyMentionsInput\"\n            }, j.DOM.div({\n                className: \"highlighter\"\n            }, j.DOM.div(null, j.DOM.span({\n                className: \"highlighterContent hidden_elem\"\n            }))), j.DOM.div({\n                ref: \"typeahead\",\n                className: \"uiTypeahead mentionsTypeahead\"\n            }, j.DOM.div({\n                className: \"wrap\"\n            }, j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"hiddenInput\"\n            }), j.DOM.div({\n                className: \"innerWrap\"\n            }, j.DOM.textarea({\n                ref: \"textarea\",\n                name: \"add_comment_text\",\n                className: m,\n                title: this.props.placeholder,\n                placeholder: this.props.placeholder,\n                onFocus: this._handleFocus,\n                onBlur: this._handleBlur,\n                onKeyDown: this._handleKeydown,\n                defaultValue: this.props.placeholder\n            })))), j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"mentionsHidden\",\n                defaultValue: \"\"\n            })));\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIAddComment.react\", [\"Bootloader\",\"CLogConfig\",\"ClipboardPhotoUploader\",\"CloseButton.react\",\"Event\",\"Keys\",\"LoadingIndicator.react\",\"React\",\"LegacyMentionsInput.react\",\"TrackingNodes\",\"Run\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"fbt\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CLogConfig\"), i = b(\"ClipboardPhotoUploader\"), j = b(\"CloseButton.react\"), k = b(\"Event\"), l = b(\"Keys\"), m = b(\"LoadingIndicator.react\"), n = b(\"React\"), o = b(\"LegacyMentionsInput.react\"), p = b(\"TrackingNodes\"), q = b(\"Run\"), r = b(\"UFIClassNames\"), s = b(\"UFIImageBlock.react\"), t = b(\"cx\"), u = b(\"fbt\"), v = b(\"joinClasses\"), w = b(\"tx\"), x = \"Write a comment...\", y = \"Write a reply...\", z = \"fcg fss UFICommentTip\", aa = 19, ba = \"/ajax/ufi/upload/\", ca = n.createClass({\n        displayName: \"UFIAddComment\",\n        getInitialState: function() {\n            if (this.props.attachedPhoto) {\n                this.props.contextArgs.attachedphoto = this.props.attachedPhoto;\n            };\n            return {\n                attachedPhoto: (this.props.attachedPhoto ? this.props.attachedPhoto : null),\n                isCommenting: false,\n                isLoadingPhoto: false,\n                isOnBeforeUnloadListenerAdded: false\n            };\n        },\n        _onKeyDown: function(event) {\n            if ((this.props.isEditing && (k.getKeyCode(event.nativeEvent) === l.ESC))) {\n                this.props.onCancel();\n            };\n            if ((this.isMounted() && !this.state.isOnBeforeUnloadListenerAdded)) {\n                q.onBeforeUnload(this._handleUnsavedChanges);\n                this.setState({\n                    isOnBeforeUnloadListenerAdded: true\n                });\n            }\n        ;\n        },\n        _handleUnsavedChanges: function() {\n            var da = a.PageTransitions;\n            if (da) {\n                var ea = da.getNextURI(), fa = da.getMostRecentURI();\n                if ((ea.getQueryData().hasOwnProperty(\"theater\") || fa.getQueryData().hasOwnProperty(\"theater\"))) {\n                    return\n                };\n            }\n        ;\n            if (((this.refs && this.refs.mentionsinput) && this.refs.mentionsinput.hasEnteredText())) {\n                return \"You haven't finished your comment yet. Do you want to leave without finishing?\"\n            };\n        },\n        _blur: function() {\n            if ((this.refs.mentionsinput && this.refs.mentionsinput.hasEnteredText())) {\n                return\n            };\n            this.setState({\n                isCommenting: false\n            });\n        },\n        _onPaste: function(event) {\n            var da = new i(ba, this._getPhotoUploadData());\n            this._cancelCurrentSubscriptions();\n            this._subscriptions = [da.subscribe(\"upload_start\", this._prepareForAttachedPhotoPreview),da.subscribe(\"upload_error\", this._onRemoveAttachedPhotoPreviewClicked),da.subscribe(\"upload_success\", function(ea, fa) {\n                this._onPhotoUploadComplete(fa);\n            }.bind(this)),];\n            da.handlePaste(event);\n        },\n        _cancelCurrentSubscriptions: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(function(da) {\n                    da.unsubscribe();\n                });\n            };\n        },\n        componentWillUnmount: function() {\n            this._cancelCurrentSubscriptions();\n        },\n        focus: function() {\n            if ((this.refs && this.refs.mentionsinput)) {\n                this.refs.mentionsinput.focus();\n            };\n        },\n        render: function() {\n            var da = (!this.props.contextArgs.collapseaddcomment || this.state.isCommenting), ea = null;\n            if (this.props.isEditing) {\n                ea = n.DOM.span({\n                    className: z\n                }, \"Press Esc to cancel.\");\n            }\n             else if (this.props.showSendOnEnterTip) {\n                ea = n.DOM.span({\n                    className: z\n                }, \"Press Enter to post.\");\n            }\n             else if (this.props.subtitle) {\n                ea = n.DOM.span({\n                    className: z\n                }, this.props.subtitle);\n            }\n            \n        ;\n            var fa = null, ga = this.state.attachedPhoto, ha = null;\n            if (this.props.allowPhotoAttachments) {\n                ha = this._onPaste;\n                var ia = \"Choose a file to upload\", ja = n.DOM.input({\n                    ref: \"PhotoInput\",\n                    accept: \"image/*\",\n                    className: \"-cx-PRIVATE-uiFileInput__input\",\n                    name: \"file[]\",\n                    type: \"file\",\n                    multiple: false,\n                    title: ia\n                }), ka = (ga ? \"UFICommentPhotoAttachedIcon\" : \"UFICommentPhotoIcon\"), la = \"UFIPhotoAttachLinkWrapper -cx-PRIVATE-uiFileInput__container\";\n                fa = n.DOM.div({\n                    ref: \"PhotoInputContainer\",\n                    className: la,\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"aria-label\": \"Attach a Photo\"\n                }, n.DOM.i({\n                    ref: \"PhotoInputControl\",\n                    className: ka\n                }), ja);\n            }\n        ;\n            var ma = p.getTrackingInfo(p.types.ADD_COMMENT_BOX), na = v(r.ACTOR_IMAGE, ((!da ? \"hidden_elem\" : \"\"))), oa = n.DOM.div({\n                className: \"UFIReplyActorPhotoWrapper\"\n            }, n.DOM.img({\n                className: na,\n                src: this.props.viewerActor.thumbSrc\n            })), pa = v(r.ROW, ((((((((this.props.hide ? \"noDisplay\" : \"\")) + ((\" \" + \"UFIAddComment\"))) + ((this.props.allowPhotoAttachments ? (\" \" + \"UFIAddCommentWithPhotoAttacher\") : \"\"))) + ((this.props.withoutSeparator ? (\" \" + \"UFIAddCommentWithoutSeparator\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), qa = (!!this.props.replyCommentID ? y : x), ra = (this.props.contextArgs.entstream ? this._blur : null), sa = this.props.contextArgs.viewoptionstypeobjects, ta = this.props.contextArgs.viewoptionstypeobjectsorder, ua = null, va = this.props.onCommentSubmit;\n            if (ga) {\n                ua = n.DOM.div({\n                    isStatic: true,\n                    dangerouslySetInnerHTML: (this.state.attachedPhoto.markupPreview ? this.state.attachedPhoto.markupPreview : this.state.attachedPhoto.markup)\n                });\n                ea = null;\n            }\n             else if (this.state.isLoadingPhoto) {\n                ua = m({\n                    color: \"white\",\n                    className: \"UFICommentPhotoAttachedPreviewLoadingIndicator\",\n                    size: \"medium\"\n                });\n            }\n        ;\n            var wa;\n            if ((ua != null)) {\n                wa = n.DOM.div({\n                    className: \"UFICommentPhotoAttachedPreview pas\"\n                }, ua, j({\n                    onClick: this._onRemoveAttachedPhotoPreviewClicked\n                }));\n                va = function(xa, event) {\n                    this.setState({\n                        isLoadingPhoto: false,\n                        attachedPhoto: null\n                    });\n                    xa.attachedPhoto = this.props.contextArgs.attachedphoto;\n                    this.props.onCommentSubmit(xa, event);\n                }.bind(this);\n            }\n        ;\n            return (n.DOM.li({\n                className: pa,\n                onKeyDown: this._onKeyDown,\n                \"data-ft\": ma\n            }, s({\n                className: \"UFIMentionsInputWrap\"\n            }, oa, n.DOM.div(null, o({\n                initialData: this.props.initialData,\n                placeholder: qa,\n                ref: \"mentionsinput\",\n                datasource: this.props.mentionsDataSource,\n                acceptEmptyInput: (this.props.isEditing || this.props.contextArgs.attachedphoto),\n                onEnterSubmit: va,\n                onFocus: this.setState.bind(this, {\n                    isCommenting: true\n                }, null),\n                viewOptionsTypeObjects: sa,\n                viewOptionsTypeObjectsOrder: ta,\n                onBlur: ra,\n                onTypingStateChange: this.props.onTypingStateChange,\n                onPaste: ha,\n                sht: this.props.contextArgs.sht,\n                isLoadingPhoto: this.state.isLoadingPhoto\n            }), fa, wa, ea))));\n        },\n        componentDidMount: function(da) {\n            if (h.gkResults) {\n                var ea = this.props.replyCommentID;\n                if ((this.refs && this.refs.mentionsinput)) {\n                    var fa = this.refs.mentionsinput.refs.textarea.getDOMNode();\n                    g.loadModules([\"CLoggerX\",\"UFIComments\",], function(ka, la) {\n                        var ma = la.getComment(ea), na = (ma ? ma.fbid : null);\n                        ka.trackMentionsInput(fa, na);\n                    });\n                }\n            ;\n            }\n        ;\n            if (!this.props.allowPhotoAttachments) {\n                return\n            };\n            var ga = this.refs.PhotoInputContainer.getDOMNode(), ha = this.refs.PhotoInputControl.getDOMNode(), ia = this.refs.PhotoInput.getDOMNode(), ja = k.listen(ga, \"click\", function(event) {\n                g.loadModules([\"FileInput\",\"FileInputUploader\",\"Input\",], function(ka, la, ma) {\n                    var na = new ka(ga, ha, ia), oa = new la().setURI(ba).setData(this._getPhotoUploadData());\n                    na.subscribe(\"change\", function(event) {\n                        if (na.getValue()) {\n                            this._prepareForAttachedPhotoPreview();\n                            oa.setInput(na.getInput()).send();\n                        }\n                    ;\n                    }.bind(this));\n                    oa.subscribe(\"success\", function(pa, qa) {\n                        na.clear();\n                        this._onPhotoUploadComplete(qa.response);\n                    }.bind(this));\n                }.bind(this));\n                ja.remove();\n            }.bind(this));\n        },\n        _getPhotoUploadData: function() {\n            return {\n                profile_id: this.props.viewerActor.id,\n                target_id: this.props.targetID,\n                source: aa\n            };\n        },\n        _onPhotoUploadComplete: function(da) {\n            if (!this.state.isLoadingPhoto) {\n                return\n            };\n            var ea = da.getPayload();\n            if ((ea && ea.fbid)) {\n                this.props.contextArgs.attachedphoto = ea;\n                this.setState({\n                    attachedPhoto: ea,\n                    isLoadingPhoto: false\n                });\n            }\n        ;\n        },\n        _onRemoveAttachedPhotoPreviewClicked: function(event) {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: false\n            });\n        },\n        _prepareForAttachedPhotoPreview: function() {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: true\n            });\n        }\n    });\n    e.exports = ca;\n});\n__d(\"UFIAddCommentController\", [\"Arbiter\",\"copyProperties\",\"MentionsInputUtils\",\"Parent\",\"UFIAddComment.react\",\"React\",\"ShortProfiles\",\"UFICentralUpdates\",\"UFIComments\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"MentionsInputUtils\"), j = b(\"Parent\"), k = b(\"UFIAddComment.react\"), l = b(\"React\"), m = b(\"ShortProfiles\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIFeedbackTargets\"), q = b(\"UFIInstanceState\"), r = b(\"UFIUserActions\");\n    function s(t, u, v, w) {\n        this.id = u;\n        this._ufiInstanceID = w.instanceid;\n        this._contextArgs = w;\n        this._replyCommentID = v;\n        if (t) {\n            this.root = t;\n            if (!this._contextArgs.rootid) {\n                this._contextArgs.rootid = t.id;\n            };\n            this.render();\n            n.subscribe(\"instance-updated\", function(x, y) {\n                var z = y.updates;\n                if ((this._ufiInstanceID in z)) {\n                    this.render();\n                };\n            }.bind(this));\n        }\n    ;\n        n.subscribe(\"feedback-id-changed\", function(x, y) {\n            var z = y.updates;\n            if ((this.id in z)) {\n                this.id = z[this.id];\n            };\n        }.bind(this));\n    };\n    h(s.prototype, {\n        _onCommentSubmit: function(t, event) {\n            r.addComment(this.id, t.visibleValue, t.encodedValue, {\n                source: this._contextArgs.source,\n                ufiinstanceid: this._ufiInstanceID,\n                target: event.target,\n                replyid: this._replyCommentID,\n                timelinelogdata: this._contextArgs.timelinelogdata,\n                rootid: this._contextArgs.rootid,\n                attachedphoto: this._contextArgs.attachedphoto,\n                giftoccasion: this._contextArgs.giftoccasion\n            });\n            this._contextArgs.attachedphoto = null;\n            p.getFeedbackTarget(this.id, function(u) {\n                var v = j.byTag(this.root, \"form\");\n                if (v) {\n                    g.inform(\"ufi/comment\", {\n                        form: v,\n                        isranked: u.isranked\n                    });\n                };\n            }.bind(this));\n            return false;\n        },\n        _onTypingStateChange: function(t, u) {\n        \n        },\n        renderAddComment: function(t, u, v, w, x, y, z, aa) {\n            var ba = (this._contextArgs.logtyping ? this._onTypingStateChange.bind(this) : null), ca = null, da = (q.getKeyForInstance(this._ufiInstanceID, \"isediting\") && !this._replyCommentID);\n            return (k({\n                hide: da,\n                replyCommentID: this._replyCommentID,\n                viewerActor: t,\n                targetID: u,\n                initialData: ca,\n                ref: x,\n                withoutSeparator: y,\n                onCommentSubmit: this._onCommentSubmit.bind(this),\n                mentionsDataSource: v,\n                onTypingStateChange: ba,\n                showSendOnEnterTip: w,\n                allowPhotoAttachments: z,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                subtitle: aa\n            }));\n        },\n        renderEditComment: function(t, u, v, w, x, y, z) {\n            var aa = o.getComment(v), ba = i.generateDataFromTextWithEntities(aa.body);\n            return (k({\n                viewerActor: t,\n                targetID: u,\n                initialData: ba,\n                onCommentSubmit: x,\n                onCancel: y,\n                mentionsDataSource: w,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                isEditing: true,\n                editingCommentID: v,\n                attachedPhoto: aa.photo_comment,\n                allowPhotoAttachments: z\n            }));\n        },\n        render: function() {\n            if (!this.root) {\n                throw new Error(\"render called on UFIAddCommentController with no root\")\n            };\n            p.getFeedbackTarget(this.id, function(t) {\n                if ((t.cancomment && t.actorforpost)) {\n                    m.get(t.actorforpost, function(u) {\n                        var v = this.renderAddComment(u, t.ownerid, t.mentionsdatasource, t.showsendonentertip, null, null, t.allowphotoattachments, t.subtitle);\n                        this._addComment = l.renderComponent(v, this.root);\n                    }.bind(this));\n                };\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});\n__d(\"LegacyScrollableArea.react\", [\"Scrollable\",\"Bootloader\",\"React\",\"Style\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"Scrollable\");\n    var g = b(\"Bootloader\"), h = b(\"React\"), i = b(\"Style\"), j = b(\"cx\"), k = \"uiScrollableArea native\", l = \"uiScrollableAreaWrap scrollable\", m = \"uiScrollableAreaBody\", n = \"uiScrollableAreaContent\", o = h.createClass({\n        displayName: \"ReactLegacyScrollableArea\",\n        render: function() {\n            var p = {\n                height: (this.props.height ? (this.props.height + \"px\") : \"auto\")\n            };\n            return (h.DOM.div({\n                className: k,\n                ref: \"root\",\n                style: p\n            }, h.DOM.div({\n                className: l\n            }, h.DOM.div({\n                className: m,\n                ref: \"body\"\n            }, h.DOM.div({\n                className: n\n            }, this.props.children)))));\n        },\n        getArea: function() {\n            return this._area;\n        },\n        componentDidMount: function() {\n            g.loadModules([\"ScrollableArea\",], this._loadScrollableArea);\n        },\n        _loadScrollableArea: function(p) {\n            this._area = p.fromNative(this.refs.root.getDOMNode(), {\n                fade: this.props.fade,\n                persistent: this.props.persistent,\n                shadow: ((this.props.shadow === undefined) ? true : this.props.shadow)\n            });\n            var q = this.refs.body.getDOMNode();\n            i.set(q, \"width\", (this.props.width + \"px\"));\n            (this.props.onScroll && this._area.subscribe(\"scroll\", this.props.onScroll));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIAddCommentLink.react\", [\"React\",\"UFIClassNames\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIAddCommentLink\",\n        render: function() {\n            var m = j(h.ROW, ((((((\"UFIAddCommentLink\") + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), n = \"Write a comment...\";\n            return (g.DOM.li({\n                className: m,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, g.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, n)));\n        }\n    });\n    e.exports = l;\n});\n__d(\"PubContentTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HASHTAG: \"hashtag\",\n        TOPIC: \"topic\",\n        URL: \"url\"\n    };\n    e.exports = g;\n});\n__d(\"HovercardLinkInterpolator\", [\"Bootloader\",\"CSS\",\"Event\",\"HovercardLink\",\"Link.react\",\"Parent\",\"PubContentTypes\",\"React\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"HovercardLink\"), k = b(\"Link.react\"), l = b(\"Parent\"), m = b(\"PubContentTypes\"), n = b(\"React\"), o = b(\"URI\"), p = b(\"cx\");\n    function q(r, s, t, u, v) {\n        var w = s.entities[0], x = (t || ((w.external ? \"_blank\" : null))), y, z = ((((!w.external ? \"profileLink\" : \"\")) + ((w.weakreference ? (\" \" + \"weakReference\") : \"\"))));\n        if (w.hashtag) {\n            var aa = h.hasClass(document.body, \"-cx-PUBLIC-hasLitestand__body\"), ba = function(ea) {\n                if (i.$E(ea.nativeEvent).isDefaultRequested()) {\n                    return\n                };\n                ea.preventDefault();\n                var fa = l.byTag(ea.target, \"A\");\n                if (aa) {\n                    g.loadModules([\"EntstreamPubContentOverlay\",], function(ga) {\n                        ga.pubClick(fa);\n                    });\n                }\n                 else g.loadModules([\"HashtagLayerPageController\",], function(ga) {\n                    ga.click(fa);\n                });\n            ;\n            }, ca = null;\n            if (aa) {\n                ca = {\n                    type: m.HASHTAG,\n                    id: w.id,\n                    source: \"comment\"\n                };\n            }\n             else ca = {\n                id: w.id\n            };\n        ;\n            var da = new o(w.url).setSubdomain(\"www\");\n            y = n.DOM.a({\n                className: \"-cx-PUBLIC-fbHashtagLink__link\",\n                \"data-pub\": JSON.stringify(ca),\n                href: da.toString(),\n                onClick: ba\n            }, n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__hashmark\"\n            }, r.substring(0, 1)), n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__tagname\"\n            }, r.substring(1)));\n        }\n         else if (w.weakreference) {\n            y = k({\n                className: z,\n                href: w,\n                target: x\n            }, n.DOM.i({\n                className: \"UFIWeakReferenceIcon\"\n            }), r);\n        }\n         else y = k({\n            className: z,\n            href: w,\n            target: x\n        }, r);\n        \n    ;\n        if ((!w.external && !w.hashtag)) {\n            y.props[\"data-hovercard\"] = j.constructEndpointWithGroupAndLocation(w, u, v).toString();\n        };\n        return y;\n    };\n    e.exports = q;\n});\n__d(\"LinkButton\", [\"cx\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"React\"), i = function(j) {\n        var k = ((j.name && j.value) ? (((j.name + \"[\") + encodeURIComponent(j.value)) + \"]\") : null);\n        return (h.DOM.label({\n            className: ((((\"uiLinkButton\") + ((j.subtle ? (\" \" + \"uiLinkButtonSubtle\") : \"\"))) + ((j.showSaving ? (\" \" + \"async_throbber\") : \"\"))))\n        }, h.DOM.input({\n            type: (j.inputType || \"button\"),\n            name: k,\n            value: j.label,\n            className: ((j.showSaving ? \"stat_elem\" : \"\"))\n        })));\n    };\n    e.exports = i;\n});\n__d(\"SeeMore.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"SeeMore\",\n        getInitialState: function() {\n            return {\n                isCollapsed: true\n            };\n        },\n        handleClick: function() {\n            this.setState({\n                isCollapsed: false\n            });\n        },\n        render: function() {\n            var j = this.state.isCollapsed, k = (!j ? null : g.DOM.span(null, \"...\")), l = this.props.children[0], m = (j ? null : g.DOM.span(null, this.props.children[1])), n = (!j ? null : g.DOM.a({\n                className: \"SeeMoreLink fss\",\n                onClick: this.handleClick,\n                href: \"#\",\n                role: \"button\"\n            }, \"See More\"));\n            return (g.DOM.span({\n                className: this.props.className\n            }, l, k, n, m));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TruncatedTextWithEntities.react\", [\"React\",\"TextWithEntities.react\",\"SeeMore.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TextWithEntities.react\"), i = b(\"SeeMore.react\");\n    function j(n, o) {\n        var p = (n.offset + n.length);\n        return ((o > n.offset) && (o < p));\n    };\n    function k(n, o) {\n        for (var p = 0; (p < n.length); p++) {\n            var q = n[p];\n            if (j(q, o)) {\n                return q.offset\n            };\n        };\n        return o;\n    };\n    var l = function(n, o, p) {\n        var q = [], r = [], s = k(o, p);\n        for (var t = 0; (t < o.length); t++) {\n            var u = o[t];\n            if ((u.offset < s)) {\n                q.push(u);\n            }\n             else r.push({\n                offset: (u.offset - s),\n                length: u.length,\n                entities: u.entities\n            });\n        ;\n        };\n        return {\n            first: {\n                ranges: q,\n                text: n.substr(0, s)\n            },\n            second: {\n                ranges: r,\n                text: n.substr(s)\n            }\n        };\n    }, m = g.createClass({\n        displayName: \"TruncatedTextWithEntities\",\n        render: function() {\n            var n = this.props.maxLines, o = this.props.maxLength, p = (this.props.truncationPercent || 60750), q = Math.floor((p * o)), r = (this.props.text || \"\"), s = (this.props.ranges || []), t = r.split(\"\\u000a\"), u = (t.length - 1), v = (o && (r.length > o)), w = (n && (u > n));\n            if (w) {\n                q = Math.min(t.slice(0, n).join(\"\\u000a\").length, q);\n            };\n            if ((v || w)) {\n                var x = l(r, s, q);\n                return (g.DOM.span({\n                    \"data-ft\": this.props[\"data-ft\"],\n                    dir: this.props.dir\n                }, i({\n                    className: this.props.className\n                }, h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.first.ranges,\n                    text: x.first.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }), h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.second.ranges,\n                    text: x.second.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }))));\n            }\n             else return (g.DOM.span({\n                \"data-ft\": this.props[\"data-ft\"],\n                dir: this.props.dir\n            }, h({\n                className: this.props.className,\n                interpolator: this.props.interpolator,\n                ranges: s,\n                text: r,\n                renderEmoticons: this.props.renderEmoticons,\n                renderEmoji: this.props.renderEmoji\n            })))\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFICommentAttachment.react\", [\"DOM\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"UFICommentAttachment\",\n        _attachmentFromCommentData: function(j) {\n            return (j.photo_comment || j.attachment);\n        },\n        componentDidMount: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            if (k) {\n                this.renderAttachment(k);\n            };\n        },\n        shouldComponentUpdate: function(j, k) {\n            var l = this._attachmentFromCommentData(this.props.comment), m = this._attachmentFromCommentData(j.comment);\n            if ((!l && !m)) {\n                return false\n            };\n            if (((!l || !m) || (l.markup != m.markup))) {\n                return true;\n            }\n             else return false\n        ;\n        },\n        componentDidUpdate: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            this.renderAttachment(k);\n        },\n        renderAttachment: function(j) {\n            if ((j && this.refs.contents)) {\n                g.setContent(this.refs.contents.getDOMNode(), j.markup);\n            };\n        },\n        render: function() {\n            if (this._attachmentFromCommentData(this.props.comment)) {\n                return h.DOM.div({\n                    ref: \"contents\"\n                });\n            }\n             else return h.DOM.span(null)\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIReplyLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFIReplyLink\",\n        render: function() {\n            return (g.DOM.a({\n                className: \"UFIReplyLink\",\n                href: \"#\",\n                onClick: this.props.onClick\n            }, \"Reply\"));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFISpamCount\", [\"UFISpamCountImpl\",], function(a, b, c, d, e, f) {\n    e.exports = (b(\"UFISpamCountImpl\").module || {\n        enabled: false\n    });\n});\n__d(\"UFIComment.react\", [\"function-extensions\",\"Bootloader\",\"CloseButton.react\",\"Env\",\"Focus\",\"HovercardLink\",\"HovercardLinkInterpolator\",\"LinkButton\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"Timestamp.react\",\"TrackingNodes\",\"TruncatedTextWithEntities.react\",\"UFIClassNames\",\"UFICommentAttachment.react\",\"UFIConfig\",\"UFIConstants\",\"UFIImageBlock.react\",\"UFIInstanceState\",\"UFIReplyLink.react\",\"UFISpamCount\",\"URI\",\"cx\",\"keyMirror\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CloseButton.react\"), i = b(\"Env\"), j = b(\"Focus\"), k = b(\"HovercardLink\"), l = b(\"HovercardLinkInterpolator\"), m = b(\"LinkButton\"), n = b(\"NumberFormat\"), o = b(\"ProfileBrowserLink\"), p = b(\"ProfileBrowserTypes\"), q = b(\"React\"), r = b(\"Timestamp.react\"), s = b(\"TrackingNodes\"), t = b(\"TruncatedTextWithEntities.react\"), u = b(\"UFIClassNames\"), v = b(\"UFICommentAttachment.react\"), w = b(\"UFIConfig\"), x = b(\"UFIConstants\"), y = b(\"UFIImageBlock.react\"), z = b(\"UFIInstanceState\"), aa = b(\"UFIReplyLink.react\"), ba = b(\"UFISpamCount\"), ca = b(\"URI\"), da = b(\"cx\"), ea = b(\"keyMirror\"), fa = b(\"joinClasses\"), ga = b(\"tx\"), ha = x.UFIStatus, ia = \" \\u00b7 \", ja = ea({\n        edit: true,\n        hide: true,\n        remove: true\n    }), ka = \"UFICommentBody\", la = \"UFICommentActorName\", ma = \"UFICommentNotSpamLink\", na = \"fsm fwn fcg UFICommentActions\", oa = \"UFIDeletedMessageIcon\", pa = \"UFIDeletedMessage\", qa = \"UFIFailureMessageIcon\", ra = \"UFIFailureMessage\", sa = \"UFICommentLikeButton\", ta = \"UFICommentLikeIcon\", ua = \"UFITranslateLink\", va = \"UFITranslatedText\", wa = \"uiLinkSubtle\", xa = \"stat_elem\", ya = \"pls\", za = \"fcg\", ab = 27, bb = null, cb = function(kb, lb) {\n        var mb = new ca(\"/ajax/like/tooltip.php\").setQueryData({\n            comment_fbid: kb.fbid,\n            comment_from: kb.author,\n            cache_buster: (kb.likeconfirmhash || 0)\n        });\n        if (lb) {\n            mb.addQueryData({\n                viewas: lb\n            });\n        };\n        return mb;\n    }, db = function(kb) {\n        var lb = kb.status;\n        return ((lb === ha.FAILED_ADD) || (lb === ha.FAILED_EDIT));\n    };\n    function eb(kb) {\n        return (((kb.commenterIsFOF !== undefined) && (kb.userIsMinor !== undefined)) && (kb.reportLink !== undefined));\n    };\n    var fb = q.createClass({\n        displayName: \"UFICommentLikeCount\",\n        render: function() {\n            var kb = this.props.comment, lb = n.formatIntegerWithDelimiter((kb.likecount || 0), this.props.contextArgs.numberdelimiter), mb = p.LIKES, nb = {\n                id: kb.fbid\n            }, ob = cb(this.props.comment, this.props.viewas), pb = q.DOM.i({\n                className: ta\n            }), qb = q.DOM.span(null, lb);\n            return (q.DOM.a({\n                className: sa,\n                role: \"button\",\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": ob.toString(),\n                ajaxify: o.constructDialogURI(mb, nb).toString(),\n                href: o.constructPageURI(mb, nb).toString()\n            }, pb, qb));\n        }\n    }), gb = q.createClass({\n        displayName: \"UFICommentActions\",\n        render: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.markedAsSpamHere, ob = (lb.status === ha.SPAM_DISPLAY), pb = this.props.showReplyLink, qb = this.props.hideAsSpamForPageAdmin, rb, sb, tb, ub, vb, wb, xb = (!lb.islocal && (lb.status !== ha.LIVE_DELETED));\n            if (xb) {\n                if ((ob && !nb)) {\n                    if (kb.viewerCanMarkNotSpam) {\n                        rb = q.DOM.a({\n                            onClick: kb.onMarkAsNotSpam,\n                            className: ma,\n                            href: \"#\",\n                            role: \"button\"\n                        }, \"Unhide\");\n                    };\n                    if ((((qb && mb.isthreaded) && mb.cancomment) && pb)) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    };\n                }\n                 else {\n                    if (mb.viewercanlike) {\n                        var yb = s.getTrackingInfo((lb.hasviewerliked ? s.types.UNLIKE_LINK : s.types.LIKE_LINK)), zb = (lb.hasviewerliked ? \"Unlike this comment\" : \"Like this comment\");\n                        sb = q.DOM.a({\n                            className: \"UFILikeLink\",\n                            href: \"#\",\n                            role: \"button\",\n                            onClick: kb.onCommentLikeToggle,\n                            \"data-ft\": yb,\n                            title: zb\n                        }, (lb.hasviewerliked ? \"Unlike\" : \"Like\"));\n                    }\n                ;\n                    if (((mb.isthreaded && mb.cancomment) && pb)) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    };\n                    if ((lb.likecount > 0)) {\n                        tb = fb({\n                            comment: lb,\n                            viewas: this.props.viewas,\n                            contextArgs: this.props.contextArgs\n                        });\n                    };\n                    if ((lb.spamcount && ba.enabled)) {\n                        ub = ba({\n                            count: lb.spamcount\n                        });\n                    };\n                }\n            ;\n                if (((lb.attachment && (lb.attachment.type == \"share\")) && lb.canremove)) {\n                    wb = q.DOM.a({\n                        onClick: kb.onPreviewRemove,\n                        href: \"#\",\n                        role: \"button\"\n                    }, \"Remove Preview\");\n                };\n            }\n        ;\n            var ac = hb({\n                comment: lb,\n                onRetrySubmit: kb.onRetrySubmit,\n                showPermalink: kb.showPermalink\n            }), bc;\n            if (kb.contextArgs.entstream) {\n                bc = [ac,sb,tb,vb,ub,rb,wb,];\n            }\n             else if (mb.isthreaded) {\n                bc = [sb,vb,rb,wb,tb,ub,ac,];\n            }\n             else bc = [ac,sb,tb,ub,vb,rb,wb,];\n            \n        ;\n            if ((lb.status === ha.LIVE_DELETED)) {\n                var cc = q.DOM.span({\n                    className: pa\n                }, q.DOM.i({\n                    className: oa,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Comment deleted\"\n                }));\n                bc.push(cc);\n            }\n        ;\n            var dc = [];\n            for (var ec = 0; (ec < bc.length); ec++) {\n                if (bc[ec]) {\n                    dc.push(ia);\n                    dc.push(bc[ec]);\n                }\n            ;\n            };\n            dc.shift();\n            return (q.DOM.div({\n                className: na\n            }, dc));\n        }\n    }), hb = q.createClass({\n        displayName: \"UFICommentMetadata\",\n        render: function() {\n            var kb = this.props.comment, lb = this.props.onRetrySubmit, mb, nb;\n            if (db(kb)) {\n                mb = [q.DOM.span({\n                    className: ra\n                }, q.DOM.i({\n                    className: qa\n                }), \"Unable to post comment.\"),((kb.allowRetry && lb) ? [\" \",q.DOM.a({\n                    onClick: lb,\n                    href: \"#\",\n                    role: \"button\"\n                }, \"Try Again\"),] : null),];\n            }\n             else {\n                var ob = (this.props.showPermalink ? kb.permalink : null), pb = s.getTrackingInfo(s.types.SOURCE), qb = q.DOM.a({\n                    className: wa,\n                    href: ob,\n                    \"data-ft\": pb\n                }, r({\n                    time: kb.timestamp.time,\n                    text: kb.timestamp.text,\n                    verbose: kb.timestamp.verbose\n                })), rb;\n                switch (kb.source) {\n                  case x.UFISourceType.MOBILE:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/\").setSubdomain(\"www\").toString()\n                    }, \"mobile\");\n                    break;\n                  case x.UFISourceType.SMS:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/?v=texts\").setSubdomain(\"www\").toString()\n                    }, \"text message\");\n                    break;\n                  case x.UFISourceType.EMAIL:\n                    rb = m({\n                        subtle: true,\n                        label: \"email\",\n                        inputType: \"submit\",\n                        name: \"email_explain\",\n                        value: true,\n                        className: xa\n                    });\n                    break;\n                };\n                nb = qb;\n                if (rb) {\n                    nb = q.DOM.span({\n                        className: \"UFITimestampViaSource\"\n                    }, ga._(\"{time} via {source}\", {\n                        time: qb,\n                        source: rb\n                    }));\n                };\n            }\n        ;\n            var sb = null;\n            if (kb.originalTimestamp) {\n                var tb = new ca(\"/ajax/edits/browser/comment\").addQueryData({\n                    comment_token: kb.id\n                }).toString();\n                sb = [ia,q.DOM.a({\n                    ref: \"EditLink\",\n                    href: \"#\",\n                    role: \"button\",\n                    rel: \"dialog\",\n                    className: \"uiLinkSubtle\",\n                    ajaxify: tb,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Show edit history\",\n                    title: \"Show edit history\"\n                }, \"Edited\"),];\n            }\n        ;\n            return (q.DOM.span(null, nb, mb, sb));\n        },\n        componentWillUpdate: function(kb) {\n            var lb = this.props.comment, mb = kb.comment;\n            if ((!lb.editnux && !!mb.editnux)) {\n                g.loadModules([\"LegacyContextualDialog\",], function(nb) {\n                    var ob = new nb();\n                    ob.init(mb.editnux).setContext(this.refs.EditLink.getDOMNode()).setWidth(300).setPosition(\"below\").show();\n                }.bind(this));\n            };\n        }\n    }), ib = q.createClass({\n        displayName: \"UFISocialContext\",\n        render: function() {\n            var kb = this.props.topMutualFriend, lb = this.props.otherMutualCount, mb = this.props.commentAuthor, nb = k.constructEndpoint(kb).toString(), ob = q.DOM.a({\n                href: kb.uri,\n                \"data-hovercard\": nb\n            }, kb.name), pb = (mb.name.length + kb.name.length), qb;\n            if ((lb === 0)) {\n                qb = ga._(\"Friends with {name}\", {\n                    name: ob\n                });\n            }\n             else if ((pb < ab)) {\n                var rb;\n                if ((lb == 1)) {\n                    rb = \"1 other\";\n                }\n                 else rb = ga._(\"{count} others\", {\n                    count: lb\n                });\n            ;\n                qb = ga._(\"Friends with {name} and {others}\", {\n                    name: ob,\n                    others: this.getOthersLink(rb, mb, kb)\n                });\n            }\n             else {\n                var sb = ga._(\"{count} mutual friends\", {\n                    count: (lb + 1)\n                });\n                qb = this.getOthersLink(sb, mb);\n            }\n            \n        ;\n            return (q.DOM.span({\n                className: \"UFICommentSocialContext\"\n            }, ia, qb));\n        },\n        getOthersLink: function(kb, lb, mb) {\n            var nb = p.MUTUAL_FRIENDS, ob = {\n                uid: lb.id\n            }, pb = new ca(\"/ajax/mutual_friends/tooltip.php\").setQueryData({\n                friend_id: lb.id\n            });\n            if (mb) {\n                pb.addQueryData({\n                    exclude_id: mb.id\n                });\n            };\n            var qb = o.constructDialogURI(nb, ob).toString();\n            return (q.DOM.a({\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": pb.toString(),\n                ajaxify: qb,\n                href: o.constructPageURI(nb, ob).toString()\n            }, kb));\n        }\n    }), jb = q.createClass({\n        displayName: \"UFIComment\",\n        getInitialState: function() {\n            return {\n                isHighlighting: this.props.comment.highlightcomment,\n                wasHighlighted: this.props.comment.highlightcomment,\n                markedAsSpamHere: false,\n                oneClickRemovedHere: false,\n                isInlinePageDeleted: false,\n                isInlineBanned: false\n            };\n        },\n        _onHideAsSpam: function(event) {\n            this.props.onHideAsSpam(event);\n            this.setState({\n                markedAsSpamHere: true\n            });\n        },\n        _onMarkAsNotSpam: function(event) {\n            this.props.onMarkAsNotSpam(event);\n            this.setState({\n                markedAsSpamHere: false\n            });\n        },\n        _onDeleteSpam: function(event) {\n            this.props.onOneClickRemove(event);\n            this.setState({\n                isInlinePageDeleted: true\n            });\n        },\n        _onUndoDeleteSpam: function(event) {\n            this.props.onUndoOneClickRemove(event);\n            this.setState({\n                isInlinePageDeleted: false\n            });\n        },\n        _onInlineBan: function(event) {\n            this.props.onInlineBan(event);\n            this.setState({\n                isInlineBanned: true\n            });\n        },\n        _onUndoInlineBan: function(event) {\n            this.props.onUndoInlineBan(event);\n            this.setState({\n                isInlineBanned: false\n            });\n        },\n        _onOneClickRemove: function(event) {\n            this.props.onOneClickRemove(event);\n            this.setState({\n                oneClickRemovedHere: true\n            });\n        },\n        _onUndoOneClickRemove: function(event) {\n            this.props.onUndoOneClickRemove(event);\n            this.setState({\n                oneClickRemovedHere: false\n            });\n        },\n        _onAction: function(event, kb) {\n            if ((kb === ja.remove)) {\n                this.props.onRemove(event);\n            }\n             else if ((kb === ja.edit)) {\n                this.props.onEdit(event);\n            }\n             else if ((kb === ja.hide)) {\n                this._onHideAsSpam(event);\n            }\n            \n        ;\n        },\n        _createRemoveReportMenu: function(event) {\n            if (this._removeReportMenu) {\n                return\n            };\n            var kb = [{\n                label: \"Delete Comment...\",\n                value: ja.remove\n            },{\n                label: \"Hide Comment\",\n                value: ja.hide\n            },];\n            if (event.persist) {\n                event.persist();\n            }\n             else event = event.constructor.persistentCloneOf(event);\n        ;\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._removeReportMenu = lb.createAndShowPopoverMenu(event.target, kb, this._onAction.bind(this, event));\n            }.bind(this));\n        },\n        _createEditDeleteMenu: function(event) {\n            if (event.persist) {\n                event.persist();\n            }\n             else event = event.constructor.persistentCloneOf(event);\n        ;\n            if (this._editDeleteMenu) {\n                return\n            };\n            var kb = [{\n                label: \"Edit...\",\n                value: ja.edit\n            },{\n                label: \"Delete...\",\n                value: ja.remove\n            },];\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._editDeleteMenu = lb.createAndShowPopoverMenu(event.target, kb, this._onAction.bind(this, event));\n            }.bind(this));\n        },\n        _renderCloseButton: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = null, nb = null, ob = false;\n            if ((kb.canremove && !this.props.hideAsSpamForPageAdmin)) {\n                if (this.props.viewerIsAuthor) {\n                    if (kb.canedit) {\n                        nb = \"Edit or Delete\";\n                        mb = this._createEditDeleteMenu;\n                        ob = true;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this.props.onRemove;\n                    }\n                ;\n                }\n                 else if (lb.canremoveall) {\n                    if (this.props.showRemoveReportMenu) {\n                        nb = \"Remove or Report\";\n                        mb = this._createRemoveReportMenu;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this._onOneClickRemove;\n                    }\n                \n                }\n            ;\n            }\n             else if (kb.canreport) {\n                nb = \"Hide\";\n                mb = this._onHideAsSpam;\n            }\n            \n        ;\n            var pb = ((((\"UFICommentCloseButton\") + ((ob ? (\" \" + \"UFIEditButton\") : \"\"))) + (((mb === null) ? (\" \" + \"hdn\") : \"\"))));\n            return (h({\n                onClick: mb,\n                tooltip: nb,\n                className: pb\n            }));\n        },\n        componentDidMount: function(kb) {\n            var lb = this.props.comment.ufiinstanceid;\n            if (this.state.isHighlighting) {\n                g.loadModules([\"UFIScrollHighlight\",], function(nb) {\n                    nb.actOn.curry(kb).defer();\n                });\n                this.setState({\n                    isHighlighting: false\n                });\n            }\n        ;\n            var mb = z.getKeyForInstance(lb, \"autofocus\");\n            if (mb) {\n                j.setWithoutOutline(this.refs.AuthorName.getDOMNode());\n                z.updateState(lb, \"autofocus\", false);\n            }\n        ;\n        },\n        shouldComponentUpdate: function(kb) {\n            var lb = this.props;\n            return ((((((((((((kb.comment !== lb.comment) || (kb.showReplyLink !== lb.showReplyLink)) || (kb.showReplies !== lb.showReplies)) || (kb.isFirst !== lb.isFirst)) || (kb.isLast !== lb.isLast)) || (kb.isFirstCommentComponent !== lb.isFirstCommentComponent)) || (kb.isLastCommentComponent !== lb.isLastCommentComponent)) || (kb.isFirstComponent !== lb.isFirstComponent)) || (kb.isLastComponent !== lb.isLastComponent)) || (kb.isFeaturedComment !== lb.isFeaturedComment)) || (kb.hasPartialBorder !== lb.hasPartialBorder)));\n        },\n        render: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = (kb.status === ha.DELETED), nb = (kb.status === ha.LIVE_DELETED), ob = (kb.status === ha.SPAM_DISPLAY), pb = (kb.status === ha.PENDING_UNDO_DELETE), qb = this.state.markedAsSpamHere, rb = this.state.oneClickRemovedHere, sb = this.state.isInlinePageDeleted, tb = this.props.hideAsSpamForPageAdmin, ub = this.state.isInlineBanned, vb = eb(kb), wb = (!kb.status && ((kb.isunseen || kb.islocal)));\n            if ((!kb.status && lb.lastseentime)) {\n                var xb = (kb.originalTimestamp || kb.timestamp.time);\n                wb = (wb || (xb > lb.lastseentime));\n            }\n        ;\n            var yb = this.props.contextArgs.markedcomments;\n            if ((yb && yb[kb.legacyid])) {\n                wb = true;\n            };\n            if (vb) {\n                if (bb) {\n                    var zb, ac = null, bc = null, cc = null;\n                    if (tb) {\n                        bc = (ub ? this._onUndoInlineBan : this._onInlineBan);\n                        if (sb) {\n                            ac = this._onUndoDeleteSpam;\n                            var dc = q.DOM.a({\n                                href: \"#\",\n                                onClick: ac\n                            }, \"Undo\");\n                            zb = ga._(\"You've deleted this comment so no one can see it. {undo}.\", {\n                                undo: dc\n                            });\n                        }\n                         else if (qb) {\n                            zb = \"Now this is only visible to the person who wrote it and their friends.\";\n                            cc = this._onDeleteSpam;\n                            ac = this._onMarkAsNotSpam;\n                        }\n                        \n                    ;\n                    }\n                     else if (qb) {\n                        zb = \"This comment has been hidden.\";\n                        cc = this._onDeleteSpam;\n                        ac = this._onMarkAsNotSpam;\n                    }\n                     else if (rb) {\n                        zb = \"This comment has been removed.\";\n                        ac = this._onUndoOneClickRemove;\n                    }\n                    \n                    \n                ;\n                    if (zb) {\n                        return (q.DOM.li({\n                            className: fa(u.ROW, \"UFIHide\")\n                        }, bb({\n                            notice: zb,\n                            comment: this.props.comment,\n                            authorProfiles: this.props.authorProfiles,\n                            onUndo: ac,\n                            onBanAction: bc,\n                            onDeleteAction: cc,\n                            isInlineBanned: ub,\n                            hideAsSpamForPageAdmin: tb\n                        })))\n                    };\n                }\n                 else g.loadModules([\"UFICommentRemovalControls.react\",], function(hc) {\n                    bb = hc;\n                    setTimeout(function() {\n                        this.forceUpdate();\n                    }.bind(this));\n                }.bind(this));\n            \n            };\n            var ec = (!mb || rb), fc = fa(u.ROW, (((((((((((((((\"UFIComment\") + ((db(kb) ? (\" \" + \"UFICommentFailed\") : \"\"))) + (((((mb || nb) || ob) || pb) ? (\" \" + \"UFITranslucentComment\") : \"\"))) + ((this.state.isHighlighting ? (\" \" + \"highlightComment\") : \"\"))) + ((!ec ? (\" \" + \"noDisplay\") : \"\"))) + ((ec ? (\" \" + \"display\") : \"\"))) + (((this.props.isFirst && !this.props.isReply) ? (\" \" + \"UFIFirstComment\") : \"\"))) + (((this.props.isLast && !this.props.isReply) ? (\" \" + \"UFILastComment\") : \"\"))) + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))) + ((this.props.isFeatured ? (\" \" + \"UFIFeaturedComment\") : \"\"))) + (((this.props.hasPartialBorder && !this.props.contextArgs.entstream) ? (\" \" + \"UFIPartialBorder\") : \"\"))))), gc = this.renderComment();\n            if (wb) {\n                if (this.props.contextArgs.snowliftredesign) {\n                    gc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenindicator\"\n                    }), gc);\n                }\n                 else if ((this.props.contextArgs.entstream && !this.props.isReply)) {\n                    gc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenindicator\"\n                    }), gc);\n                }\n                 else fc = fa(fc, u.UNSEEN_ITEM);\n                \n            \n            };\n            return (q.DOM.li({\n                className: fc,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, gc));\n        },\n        renderComment: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.authorProfiles[lb.author], ob = (lb.status === ha.SPAM_DISPLAY), pb = (lb.status === ha.LIVE_DELETED), qb = !((ob || pb)), rb = (mb.canremoveall || lb.hiddenbyviewer), sb = null, tb = null;\n            if (((!kb.isLocallyComposed && !this.state.wasHighlighted) && !lb.fromfetch)) {\n                tb = x.commentTruncationLength;\n                sb = x.commentTruncationMaxLines;\n            }\n        ;\n            var ub = s.getTrackingInfo(s.types.SMALL_ACTOR_PHOTO), vb = s.getTrackingInfo(s.types.USER_NAME), wb = s.getTrackingInfo(s.types.USER_MESSAGE), xb = null, yb = null;\n            if ((lb.istranslatable && ((lb.translatedtext === undefined)))) {\n                xb = q.DOM.a({\n                    href: \"#\",\n                    role: \"button\",\n                    title: \"Translate this comment\",\n                    className: ua,\n                    onClick: kb.onCommentTranslate\n                }, \"See Translation\");\n            };\n            if (lb.translatedtext) {\n                var zb = new ca(\"http://bing.com/translator\").addQueryData({\n                    text: lb.body.text\n                });\n                yb = q.DOM.span({\n                    className: va\n                }, lb.translatedtext, q.DOM.span({\n                    className: ya\n                }, \" (\", q.DOM.a({\n                    href: zb.toString(),\n                    className: za\n                }, \"Translated by Bing\"), \") \"));\n            }\n        ;\n            var ac;\n            if ((i.rtl && (lb.body.dir === \"ltr\"))) {\n                ac = \"rtl\";\n            }\n             else if ((!i.rtl && (lb.body.dir === \"rtl\"))) {\n                ac = \"ltr\";\n            }\n        ;\n            var bc = k.constructEndpointWithLocation(nb, \"ufi\").toString(), cc = q.DOM.a({\n                ref: \"AuthorName\",\n                className: la,\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": vb,\n                dir: ac\n            }, nb.name), dc = function(ic, jc) {\n                return l(ic, jc, \"_blank\", mb.grouporeventid, \"ufi\");\n            }, ec = t({\n                className: ka,\n                interpolator: dc,\n                ranges: lb.body.ranges,\n                text: lb.body.text,\n                truncationPercent: x.commentTruncationPercent,\n                maxLength: tb,\n                maxLines: sb,\n                renderEmoticons: w.renderEmoticons,\n                renderEmoji: w.renderEmoji,\n                \"data-ft\": wb,\n                dir: lb.body.dir\n            }), fc;\n            if (lb.socialcontext) {\n                var gc = lb.socialcontext, hc = ib({\n                    topMutualFriend: kb.authorProfiles[gc.topmutualid],\n                    otherMutualCount: gc.othermutualcount,\n                    commentAuthor: nb\n                });\n                fc = [cc,hc,q.DOM.div(null, ec),];\n            }\n             else fc = [cc,\" \",ec,];\n        ;\n            return (y({\n                spacing: \"medium\"\n            }, q.DOM.a({\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": ub\n            }, q.DOM.img({\n                src: nb.thumbSrc,\n                className: u.ACTOR_IMAGE,\n                alt: \"\"\n            })), q.DOM.div(null, q.DOM.div({\n                className: \"UFICommentContent\"\n            }, fc, xb, yb, v({\n                comment: kb.comment\n            })), gb({\n                comment: lb,\n                feedback: mb,\n                onBlingBoxClick: kb.onBlingBoxClick,\n                onCommentLikeToggle: kb.onCommentLikeToggle,\n                onCommentReply: kb.onCommentReply,\n                onPreviewRemove: kb.onPreviewRemove,\n                onRetrySubmit: kb.onRetrySubmit,\n                onMarkAsNotSpam: this._onMarkAsNotSpam,\n                viewerCanMarkNotSpam: rb,\n                viewas: kb.contextArgs.viewas,\n                showPermalink: kb.showPermalink,\n                showReplyLink: kb.showReplyLink,\n                showReplies: kb.showReplies,\n                contextArgs: kb.contextArgs,\n                markedAsSpamHere: this.state.markedAsSpamHere,\n                hideAsSpamForPageAdmin: kb.hideAsSpamForPageAdmin\n            })), (qb ? this._renderCloseButton() : null)));\n        }\n    });\n    e.exports = jb;\n});\n__d(\"UFIContainer.react\", [\"React\",\"TrackingNodes\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"UFIContainer\",\n        render: function() {\n            var k = null;\n            if (this.props.hasNub) {\n                k = g.DOM.li({\n                    className: \"UFIArrow\"\n                }, g.DOM.i(null));\n            };\n            var l = (((((((((!this.props.isReplyList ? \"UFIList\" : \"\")) + ((this.props.isReplyList ? (\" \" + \"UFIReplyList\") : \"\"))) + ((this.props.isParentLiveDeleted ? (\" \" + \"UFITranslucentReplyList\") : \"\"))) + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))));\n            return (g.DOM.ul({\n                className: l,\n                \"data-ft\": h.getTrackingInfo(h.types.UFI)\n            }, k, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"GiftOpportunityLogger\", [\"AsyncRequest\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Event\"), i = {\n        init: function(k, l, m) {\n            var n = false;\n            h.listen(k, \"click\", function(o) {\n                if (n) {\n                    return true\n                };\n                n = true;\n                i.send(l, m);\n            });\n        },\n        send: function(k, l) {\n            if (j[k.opportunity_id]) {\n                return\n            };\n            j[k.opportunity_id] = true;\n            return new g().setURI(\"/ajax/gifts/log/opportunity\").setData({\n                data: k,\n                entry_point: l\n            }).send();\n        }\n    }, j = {\n    };\n    e.exports = i;\n});\n__d(\"InlineBlock.react\", [\"ReactPropTypes\",\"React\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactPropTypes\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = {\n        baseline: null,\n        bottom: \"-cx-PRIVATE-uiInlineBlock__bottom\",\n        middle: \"-cx-PRIVATE-uiInlineBlock__middle\",\n        top: \"-cx-PRIVATE-uiInlineBlock__top\"\n    }, l = h.createClass({\n        displayName: \"InlineBlock\",\n        propTypes: {\n            alignv: g.oneOf([\"baseline\",\"bottom\",\"middle\",\"top\",]),\n            height: g.number\n        },\n        getDefaultProps: function() {\n            return {\n                alignv: \"baseline\"\n            };\n        },\n        render: function() {\n            var m = k[this.props.alignv], n = h.DOM.div({\n                className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m)\n            }, this.props.children);\n            if ((this.props.height != null)) {\n                var o = h.DOM.div({\n                    className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m),\n                    style: {\n                        height: (this.props.height + \"px\")\n                    }\n                });\n                n = h.DOM.div({\n                    className: \"-cx-PRIVATE-uiInlineBlock__root\",\n                    height: null\n                }, o, n);\n            }\n        ;\n            return this.transferPropsTo(n);\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIGiftSentence.react\", [\"AsyncRequest\",\"CloseButton.react\",\"GiftOpportunityLogger\",\"ImageBlock.react\",\"InlineBlock.react\",\"LeftRight.react\",\"Link.react\",\"React\",\"Image.react\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"DOM\",\"ix\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CloseButton.react\"), i = b(\"GiftOpportunityLogger\"), j = b(\"ImageBlock.react\"), k = b(\"InlineBlock.react\"), l = b(\"LeftRight.react\"), m = b(\"Link.react\"), n = b(\"React\"), o = b(\"Image.react\"), p = b(\"UFIClassNames\"), q = b(\"UFIImageBlock.react\"), r = b(\"URI\"), s = b(\"DOM\"), t = b(\"ix\"), u = b(\"tx\"), v = n.createClass({\n        displayName: \"UFIGiftSentence\",\n        _entry_point: \"detected_gift_worthy_story_inline\",\n        render: function() {\n            var w = this.props.recipient, x = this.props.giftdata, y = (x ? x.giftproductid : null), z = this._getURI(y).toString();\n            this._log();\n            return (n.DOM.li({\n                className: p.ROW,\n                ref: \"UFIGiftSentence\"\n            }, l({\n                direction: \"right\"\n            }, (x ? this._renderGiftSuggestion(z, w, x) : this._renderGiftLink(z, w)), h({\n                size: \"small\",\n                onClick: function() {\n                    var aa = this.refs.UFIGiftSentence.getDOMNode();\n                    s.remove(aa);\n                    this._requestClose();\n                }.bind(this)\n            }))));\n        },\n        _renderGiftSuggestion: function(w, x, y) {\n            return (q(null, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            }), n.DOM.div(null, n.DOM.span({\n                className: \"fwb\"\n            }, u._(\"Surprise {name} with a gift\", {\n                name: x.firstName\n            })), j({\n                spacing: \"medium\",\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, o({\n                className: \"UFIGiftProductImg\",\n                src: y.giftproductimgsrc,\n                alt: \"product image\"\n            })), k({\n                alignv: \"middle\",\n                height: 79\n            }, n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, y.giftproductname)), n.DOM.p({\n                className: \"mvs fcg\"\n            }, y.giftproductpricerange), n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, \"Give This Gift\"), \" \\u00b7 \", m({\n                rel: \"async-post\",\n                ajaxify: this._getURI().toString(),\n                href: {\n                    url: \"#\"\n                }\n            }, \"See All Gifts\")))))));\n        },\n        _renderGiftLink: function(w, x) {\n            return (q(null, m({\n                className: \"UFIGiftIcon\",\n                tabIndex: \"-1\",\n                href: {\n                    url: \"#\"\n                },\n                rel: \"async-post\",\n                ajaxify: w\n            }, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            })), m({\n                rel: \"async-post\",\n                href: {\n                    url: \"#\"\n                },\n                ajaxify: w\n            }, u._(\"Surprise {name} with a gift\", {\n                name: x.firstName\n            }))));\n        },\n        _log: function() {\n            var w = this.props.giftdata, x = {\n                opportunity_id: this.props.contextArgs.ftentidentifier,\n                sender_id: this.props.sender.id,\n                recipient_id: this.props.recipient.id,\n                link_description: \"UFIGiftSentence\",\n                product_id: (w ? w.giftproductid : null),\n                custom: {\n                    gift_occasion: this.props.contextArgs.giftoccasion,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                }\n            };\n            i.send([x,], this._entry_point);\n        },\n        _getURI: function(w) {\n            return r(\"/ajax/gifts/send\").addQueryData({\n                gift_occasion: this.props.contextArgs.giftoccasion,\n                recipient_id: this.props.recipient.id,\n                entry_point: this._entry_point,\n                product_id: w\n            });\n        },\n        _requestClose: function() {\n            var w = r(\"/ajax/gifts/moments/close/\");\n            new g().setMethod(\"POST\").setReadOnly(false).setURI(w).setData({\n                action: \"hide\",\n                data: JSON.stringify({\n                    type: \"detected_moment\",\n                    friend_id: this.props.recipient.id,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                })\n            }).send();\n        }\n    });\n    e.exports = v;\n});\n__d(\"UFILikeSentenceText.react\", [\"HovercardLinkInterpolator\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"TextWithEntities.react\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"HovercardLinkInterpolator\"), h = b(\"ProfileBrowserLink\"), i = b(\"ProfileBrowserTypes\"), j = b(\"React\"), k = b(\"TextWithEntities.react\"), l = b(\"URI\");\n    function m(p, q, r, s) {\n        if ((s.count != null)) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            };\n            return (j.DOM.a({\n                href: h.constructPageURI(t, u).toString(),\n                target: \"_blank\"\n            }, r));\n        }\n         else return g(r, s, \"_blank\", null, \"ufi\")\n    ;\n    };\n    function n(p, q, r, s) {\n        if ((s.count != null)) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            }, v = [];\n            for (var w = 0; (w < q.length); w++) {\n                if (!q[w].count) {\n                    v.push(q[w].entities[0].id);\n                };\n            };\n            var x = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                comment_fbid: p.targetfbid,\n                comment_from: p.actorforpost,\n                seen_user_fbids: (v.length ? v : true)\n            });\n            return (j.DOM.a({\n                rel: \"dialog\",\n                ajaxify: h.constructDialogURI(t, u).toString(),\n                href: h.constructPageURI(t, u).toString(),\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": x.toString()\n            }, r));\n        }\n         else return g(r, s, null, null, \"ufi\")\n    ;\n    };\n    var o = j.createClass({\n        displayName: \"UFILikeSentenceText\",\n        render: function() {\n            var p = this.props.feedback, q = this.props.likeSentenceData, r;\n            if (this.props.contextArgs.embedded) {\n                r = m;\n            }\n             else r = n;\n        ;\n            r = r.bind(null, p, q.ranges);\n            return (k({\n                interpolator: r,\n                ranges: q.ranges,\n                aggregatedRanges: q.aggregatedranges,\n                text: q.text\n            }));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFILikeSentence.react\", [\"Bootloader\",\"LeftRight.react\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"UFILikeSentenceText.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"LeftRight.react\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"UFIClassNames\"), m = b(\"UFIImageBlock.react\"), n = b(\"UFILikeSentenceText.react\"), o = b(\"URI\"), p = b(\"cx\"), q = b(\"joinClasses\"), r = b(\"tx\"), s = k.createClass({\n        displayName: \"UFILikeSentence\",\n        getInitialState: function() {\n            return {\n                selectorModule: null,\n                bootloadedSelectorModule: false\n            };\n        },\n        componentWillMount: function() {\n            this._bootloadSelectorModule(this.props);\n        },\n        componentWillReceiveProps: function(t) {\n            this._bootloadSelectorModule(t);\n        },\n        _bootloadSelectorModule: function(t) {\n            if ((t.showOrderingModeSelector && !this.state.bootloadedSelectorModule)) {\n                var u = function(v) {\n                    this.setState({\n                        selectorModule: v\n                    });\n                }.bind(this);\n                if (t.contextArgs.entstream) {\n                    g.loadModules([\"UFIEntStreamOrderingModeSelector.react\",], u);\n                }\n                 else g.loadModules([\"UFIOrderingModeSelector.react\",], u);\n            ;\n                this.setState({\n                    bootloadedSelectorModule: true\n                });\n            }\n        ;\n        },\n        render: function() {\n            var t = this.props.feedback, u = t.likesentences.current, v = this.props.contextArgs.entstream, w = q(l.ROW, (t.likesentences.isunseen ? l.UNSEEN_ITEM : \"\"), ((((\"UFILikeSentence\") + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), x = null, y = null;\n            if (u.text) {\n                y = k.DOM.div({\n                    className: \"UFILikeSentenceText\"\n                }, n({\n                    contextArgs: this.props.contextArgs,\n                    feedback: t,\n                    likeSentenceData: u\n                }));\n            };\n            if ((y && !v)) {\n                x = k.DOM.i({\n                    className: \"UFILikeIcon\"\n                });\n                if ((t.viewercanlike && !t.hasviewerliked)) {\n                    x = k.DOM.a({\n                        className: \"UFILikeThumb\",\n                        href: \"#\",\n                        tabIndex: \"-1\",\n                        title: \"Like this\",\n                        onClick: this.props.onTargetLikeToggle\n                    }, x);\n                };\n            }\n        ;\n            var z = y, aa = null;\n            if (((t.seencount > 0) && !v)) {\n                var ba = j.GROUP_MESSAGE_VIEWERS, ca = {\n                    id: t.targetfbid\n                }, da = i.constructDialogURI(ba, ca), ea = i.constructPageURI(ba, ca), fa = new o(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: t.entidentifier,\n                    displayed_count: t.seencount\n                }), ga;\n                if (t.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((t.seencount == 1) ? \"Seen by 1\" : r._(\"Seen by {count}\", {\n                    count: t.seencount\n                }));\n            ;\n                aa = k.DOM.a({\n                    rel: \"dialog\",\n                    ajaxify: da.toString(),\n                    href: ea.toString(),\n                    tabindex: \"-1\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"left\",\n                    \"data-tooltip-uri\": fa.toString(),\n                    className: (((\"UFISeenCount\") + ((!!u.text ? (\" \" + \"UFISeenCountRight\") : \"\"))))\n                }, k.DOM.span({\n                    className: \"UFISeenCountIcon\"\n                }), ga);\n            }\n             else if ((this.props.showOrderingModeSelector && this.state.selectorModule)) {\n                var ha = this.state.selectorModule;\n                aa = ha({\n                    currentOrderingMode: this.props.orderingMode,\n                    entstream: v,\n                    orderingmodes: t.orderingmodes,\n                    onOrderChanged: this.props.onOrderingModeChange\n                });\n                if (!z) {\n                    z = k.DOM.div(null);\n                };\n            }\n            \n        ;\n            var ia = null;\n            if ((x && y)) {\n                ia = m(null, x, y, aa);\n            }\n             else if (z) {\n                ia = h(null, z, aa);\n            }\n             else ia = aa;\n            \n        ;\n            return (k.DOM.li({\n                className: w\n            }, ia));\n        }\n    });\n    e.exports = s;\n});\n__d(\"UFIPager.react\", [\"LeftRight.react\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"UFIPager\",\n        onPagerClick: function(n) {\n            ((!this.props.isLoading && this.props.onPagerClick) && this.props.onPagerClick());\n            n.nativeEvent.prevent();\n        },\n        render: function() {\n            var n = this.onPagerClick, o = ((this.props.isLoading ? \"ufiPagerLoading\" : \"\")), p = l(i.ROW, (this.props.isUnseen ? i.UNSEEN_ITEM : \"\"), ((((((\"UFIPagerRow\") + ((this.props.isFirstCommentComponent ? (\" \" + \"UFIFirstCommentComponent\") : \"\"))) + ((this.props.isLastCommentComponent ? (\" \" + \"UFILastCommentComponent\") : \"\"))) + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), q = h.DOM.a({\n                className: \"UFIPagerLink\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }, h.DOM.span({\n                className: o\n            }, this.props.pagerLabel)), r = (((\"fcg\") + ((\" \" + \"UFIPagerCount\")))), s = h.DOM.span({\n                className: r\n            }, this.props.countSentence), t;\n            if (this.props.contextArgs.entstream) {\n                t = (g({\n                    direction: g.DIRECTION.right\n                }, q, s));\n            }\n             else t = (j(null, h.DOM.a({\n                className: \"UFIPagerIcon\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }), q, s));\n        ;\n            return (h.DOM.li({\n                className: p,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, t));\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFIReplySocialSentence.react\", [\"LiveTimer\",\"React\",\"Timestamp.react\",\"UFIClassNames\",\"UFIConstants\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = b(\"Timestamp.react\"), j = b(\"UFIClassNames\"), k = b(\"UFIConstants\"), l = b(\"UFIImageBlock.react\"), m = b(\"cx\"), n = b(\"joinClasses\"), o = b(\"tx\"), p = \" \\u00b7 \", q = 43200, r = h.createClass({\n        displayName: \"UFIReplySocialSentence\",\n        render: function() {\n            var s = ((this.props.isLoading ? \"UFIReplySocialSentenceLoading\" : \"\")), t = n(j.ROW, ((((\"UFIReplySocialSentenceRow\") + ((this.props.isFirstComponent ? (\" \" + \"UFIFirstComponent\") : \"\"))) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\"))))), u, v;\n            if (this.props.isExpanded) {\n                u = ((this.props.replies > 1) ? o._(\"Hide {count} Replies\", {\n                    count: this.props.replies\n                }) : \"Hide 1 Reply\");\n            }\n             else {\n                u = ((this.props.replies > 1) ? o._(\"{count} Replies\", {\n                    count: this.props.replies\n                }) : \"1 Reply\");\n                if (this.props.timestamp) {\n                    var w = ((g.getApproximateServerTime() / 1000) - this.props.timestamp.time);\n                    if (((w < q) || (this.props.orderingMode == k.UFICommentOrderingMode.RECENT_ACTIVITY))) {\n                        v = h.DOM.span({\n                            className: \"fcg\"\n                        }, p, i({\n                            time: this.props.timestamp.time,\n                            text: this.props.timestamp.text,\n                            verbose: this.props.timestamp.verbose\n                        }));\n                    };\n                }\n            ;\n            }\n        ;\n            var x = Object.keys(this.props.authors), y = (x.length && !this.props.isExpanded), z, aa;\n            if (y) {\n                var ba = this.props.authors[x[0]];\n                z = h.DOM.img({\n                    alt: \"\",\n                    src: ba.thumbSrc,\n                    className: j.ACTOR_IMAGE\n                });\n                aa = [o._(\"{author} replied\", {\n                    author: ba.name\n                }),p,u,];\n            }\n             else {\n                z = h.DOM.i({\n                    className: ((((!this.props.isExpanded ? \"UFIPagerIcon\" : \"\")) + ((this.props.isExpanded ? (\" \" + \"UFICollapseIcon\") : \"\"))))\n                });\n                aa = u;\n            }\n        ;\n            return (h.DOM.li({\n                className: t,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, h.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, l(null, h.DOM.div({\n                className: ((y ? \"UFIReplyActorPhotoWrapper\" : \"\"))\n            }, z), h.DOM.span({\n                className: s\n            }, h.DOM.span({\n                className: \"UFIReplySocialSentenceLinkText\"\n            }, aa), v)))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"UFIShareRow.react\", [\"NumberFormat\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"joinClasses\"), n = b(\"tx\"), o = h.createClass({\n        displayName: \"UFIShareRow\",\n        render: function() {\n            var p = new k(\"/ajax/shares/view\").setQueryData({\n                target_fbid: this.props.targetID\n            }), q = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                id: this.props.targetID\n            }), r;\n            if ((this.props.shareCount > 1)) {\n                var s = g.formatIntegerWithDelimiter(this.props.shareCount, (this.props.contextArgs.numberdelimiter || \",\"));\n                r = n._(\"{count} shares\", {\n                    count: s\n                });\n            }\n             else r = \"1 share\";\n        ;\n            var t = m(i.ROW, ((((this.props.isFirstComponent ? \"UFIFirstComponent\" : \"\")) + ((this.props.isLastComponent ? (\" \" + \"UFILastComponent\") : \"\")))));\n            return (h.DOM.li({\n                className: t\n            }, j(null, h.DOM.a({\n                className: \"UFIShareIcon\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }), h.DOM.a({\n                className: \"UFIShareLink\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }, r))));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFISpamPlaceholder.react\", [\"React\",\"UFIClassNames\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"tx\"), k = g.createClass({\n        displayName: \"UFISpamPlaceholder\",\n        render: function() {\n            var l = (((\"UFISpamCommentWrapper\") + ((this.props.isLoading ? (\" \" + \"UFISpamCommentLoading\") : \"\"))));\n            return (g.DOM.li({\n                className: h.ROW\n            }, g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                className: \"UFISpamCommentLink\",\n                onClick: this.props.onClick\n            }, g.DOM.span({\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"aria-label\": j._(\"{count} hidden\", {\n                    count: this.props.numHidden\n                }),\n                className: l\n            }, g.DOM.i({\n                className: \"placeholderIcon\"\n            })))));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFI.react\", [\"NumberFormat\",\"React\",\"LegacyScrollableArea.react\",\"TrackingNodes\",\"UFIAddCommentController\",\"UFIAddCommentLink.react\",\"UFIComment.react\",\"UFIConstants\",\"UFIContainer.react\",\"UFIGiftSentence.react\",\"UFIInstanceState\",\"UFILikeSentence.react\",\"UFIPager.react\",\"UFIReplySocialSentence.react\",\"UFIShareRow.react\",\"UFISpamPlaceholder.react\",\"copyProperties\",\"isEmpty\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"LegacyScrollableArea.react\"), j = b(\"TrackingNodes\"), k = b(\"UFIAddCommentController\"), l = b(\"UFIAddCommentLink.react\"), m = b(\"UFIComment.react\"), n = b(\"UFIConstants\"), o = b(\"UFIContainer.react\"), p = b(\"UFIGiftSentence.react\"), q = b(\"UFIInstanceState\"), r = b(\"UFILikeSentence.react\"), s = b(\"UFIPager.react\"), t = b(\"UFIReplySocialSentence.react\"), u = b(\"UFIShareRow.react\"), v = b(\"UFISpamPlaceholder.react\"), w = b(\"copyProperties\"), x = b(\"isEmpty\"), y = b(\"tx\"), z = h.createClass({\n        displayName: \"UFI\",\n        getInitialState: function() {\n            return {\n                requestRanges: w({\n                }, this.props.availableRanges),\n                instanceShowRepliesMap: {\n                },\n                instanceShowReplySocialSentenceMap: {\n                },\n                loadingSpamIDs: {\n                },\n                isActiveLoading: false,\n                hasPagedToplevel: false\n            };\n        },\n        componentWillReceiveProps: function(aa) {\n            if (this.state.isActiveLoading) {\n                var ba = this.props.availableRanges[this.props.id], ca = aa.availableRanges[this.props.id];\n                if (((ba.offset != ca.offset) || (ba.length != ca.length))) {\n                    var da = (((ca.offset < ba.offset)) ? 0 : ba.length);\n                    if ((da < aa.availableComments.length)) {\n                        var ea = aa.availableComments[da].ufiinstanceid;\n                        q.updateState(ea, \"autofocus\", true);\n                    }\n                ;\n                }\n            ;\n                this.setState({\n                    isActiveLoading: false\n                });\n            }\n        ;\n            if ((aa.orderingMode != this.props.orderingMode)) {\n                this.setState({\n                    requestRanges: w({\n                    }, aa.availableRanges)\n                });\n            };\n        },\n        render: function() {\n            var aa = this.props, ba = aa.feedback, ca = aa.contextArgs, da = (aa.source != n.UFIFeedbackSourceType.ADS), ea = (ba.orderingmodes && (aa.commentCounts[aa.id] >= n.minCommentsForOrderingModeSelector)), fa = ((((!x(ba.likesentences.current) || (((ba.seencount > 0) && !ca.entstream))) || ea)) && da), ga = null;\n            if (fa) {\n                ga = r({\n                    contextArgs: ca,\n                    feedback: ba,\n                    onTargetLikeToggle: aa.onTargetLikeToggle,\n                    onOrderingModeChange: aa.onOrderingModeChange,\n                    orderingMode: aa.orderingMode,\n                    showOrderingModeSelector: ea\n                });\n            };\n            var ha = null;\n            if (((aa.feedback.hasviewerliked && this._shouldShowGiftSentence()) && !ca.embedded)) {\n                ha = p({\n                    contextArgs: ca,\n                    recipient: aa.giftRecipient,\n                    sender: aa.authorProfiles[ba.actorforpost],\n                    giftdata: aa.feedback.giftdata\n                });\n            };\n            var ia = ((aa.availableComments && aa.availableComments.length) && da), ja = null;\n            if (ia) {\n                ja = this.renderCommentMap(aa.availableComments, aa.availableRanges[aa.id].offset);\n            };\n            var ka = null, la = ba.cancomment, ma = (((la && ca.showaddcomment) && ba.actorforpost) && !ca.embedded);\n            if (ma) {\n                var na = new k(null, aa.id, null, ca), oa = aa.authorProfiles[ba.actorforpost];\n                ka = na.renderAddComment(oa, ba.ownerid, ba.mentionsdatasource, ba.showsendonentertip, \"toplevelcomposer\", null, ba.allowphotoattachments, ba.subtitle);\n            }\n        ;\n            var pa = null, qa = ((ca.showshares && ba.sharecount) && da);\n            if (((qa && !ca.entstream) && !ca.embedded)) {\n                pa = u({\n                    targetID: ba.targetfbid,\n                    shareCount: ba.sharecount,\n                    contextArgs: ca\n                });\n            };\n            var ra = (((fa || qa) || ia) || la), sa = this.renderPagers();\n            this.applyToUFIComponents([sa.topPager,], ja, [sa.bottomPager,], {\n                isFirstCommentComponent: true\n            }, {\n                isLastCommentComponent: true\n            });\n            var ta = (ba.commentboxhoisted ? ka : null), ua = (ba.commentboxhoisted ? null : ka), va = null;\n            if ((((ma && ba.hasaddcommentlink) && this.state.hasPagedToplevel) && !ca.embedded)) {\n                va = l({\n                    onClick: this.onComment\n                });\n            };\n            this.applyToUFIComponents([ga,pa,ta,sa.topPager,], ja, [sa.bottomPager,ua,va,], {\n                isFirstComponent: true\n            }, {\n                isLastComponent: true\n            });\n            var wa = [sa.topPager,ja,sa.bottomPager,];\n            if (ca.embedded) {\n                wa = null;\n            }\n             else if ((ca.scrollcomments && ca.scrollwidth)) {\n                wa = h.DOM.li(null, i({\n                    width: ca.scrollwidth\n                }, h.DOM.ul(null, wa)));\n            }\n        ;\n            return (o({\n                hasNub: (ca.shownub && ra)\n            }, ga, ha, pa, ta, wa, ua, va));\n        },\n        applyToUFIComponents: function(aa, ba, ca, da, ea) {\n            var fa = Object.keys((ba || {\n            })).map(function(ha) {\n                return ba[ha];\n            }), ga = [].concat(aa, fa, ca);\n            this._applyToFirstComponent(ga, da);\n            ga.reverse();\n            this._applyToFirstComponent(ga, ea);\n        },\n        _applyToFirstComponent: function(aa, ba) {\n            for (var ca = 0; (ca < ((aa || [])).length); ca++) {\n                if (aa[ca]) {\n                    w(aa[ca].props, ba);\n                    return;\n                }\n            ;\n            };\n        },\n        renderCommentMap: function(aa, ba) {\n            var ca = this.props, da = {\n            }, ea = aa.length;\n            if (!ea) {\n                return da\n            };\n            var fa = aa[0].parentcommentid, ga = [], ha = function() {\n                if ((ga.length > 0)) {\n                    var qa = function(ra, sa) {\n                        this.state.loadingSpamIDs[ra[0]] = true;\n                        this.forceUpdate();\n                        ca.onSpamFetch(ra, sa);\n                    }.bind(this, ga, fa);\n                    da[(\"spam\" + ga[0])] = v({\n                        onClick: qa,\n                        numHidden: ga.length,\n                        isLoading: !!this.state.loadingSpamIDs[ga[0]]\n                    });\n                    ga = [];\n                }\n            ;\n            }.bind(this), ia = ca.instanceid, ja = q.getKeyForInstance(ia, \"editcommentid\"), ka = !!aa[0].parentcommentid, la = false;\n            for (var ma = 0; (ma < ea); ma++) {\n                if ((aa[ma].status == n.UFIStatus.SPAM)) {\n                    ga.push(aa[ma].id);\n                }\n                 else {\n                    ha();\n                    var na = Math.max(((ca.loggingOffset - ma) - ba), 0), oa = aa[ma], pa;\n                    if ((oa.id == ja)) {\n                        pa = this.renderEditCommentBox(oa);\n                    }\n                     else {\n                        pa = this.renderComment(oa, na);\n                        pa.props.isFirst = (ma === 0);\n                        pa.props.isLast = (ma === (ea - 1));\n                        if (!ka) {\n                            pa.props.showReplyLink = true;\n                        };\n                    }\n                ;\n                    da[(\"comment\" + oa.id)] = pa;\n                    if (((((ca.feedback.actorforpost === oa.author) && !la) && !ca.feedback.hasviewerliked) && this._shouldShowGiftSentence())) {\n                        da[(\"gift\" + oa.id)] = p({\n                            contextArgs: ca.contextArgs,\n                            recipient: ca.giftRecipient,\n                            sender: ca.authorProfiles[ca.feedback.actorforpost],\n                            giftdata: ca.feedback.giftdata\n                        });\n                        la = true;\n                    }\n                ;\n                    if ((oa.status !== n.UFIStatus.DELETED)) {\n                        da[(\"replies\" + oa.id)] = this.renderReplyContainer(oa);\n                    };\n                }\n            ;\n            };\n            ha();\n            return da;\n        },\n        _shouldShowGiftSentence: function() {\n            var aa = this.props;\n            return (aa.contextArgs.giftoccasion && !aa.contextArgs.entstream);\n        },\n        renderReplyContainer: function(aa) {\n            var ba = this.props, ca = {\n            };\n            for (var da = 0; (da < ((aa.replyauthors || [])).length); da++) {\n                var ea = ba.authorProfiles[aa.replyauthors[da]];\n                if (ea) {\n                    ca[ea.id] = ea;\n                };\n            };\n            var fa = ((ba.repliesMap && ba.repliesMap[aa.id]) && this._shouldShowCommentReplies(aa.id)), ga, ha = Math.max((aa.replycount - aa.spamreplycount), 0);\n            if ((ha && this._shouldShowReplySocialSentence(aa.id))) {\n                var ia = (this._shouldShowCommentReplies(aa.id) && ((this.isLoadingPrev(aa.id) || this.isLoadingNext(aa.id))));\n                ga = t({\n                    authors: ca,\n                    replies: ha,\n                    timestamp: aa.recentreplytimestamp,\n                    onClick: this.onToggleReplies.bind(this, aa),\n                    isLoading: ia,\n                    isExpanded: fa,\n                    orderingMode: this.props.orderingMode\n                });\n            }\n        ;\n            var ja, ka, la, ma;\n            if (fa) {\n                var na = this.renderPagers(aa.id);\n                ja = na.topPager;\n                la = na.bottomPager;\n                ka = this.renderCommentMap(ba.repliesMap[aa.id], ba.availableRanges[aa.id].offset);\n                var oa = Object.keys(ka);\n                for (var pa = 0; (pa < oa.length); pa++) {\n                    var qa = ka[oa[pa]];\n                    if (qa) {\n                        qa.props.hasPartialBorder = (pa !== 0);\n                    };\n                };\n                if (ba.feedback.cancomment) {\n                    var ra = false, sa = Object.keys(ka);\n                    for (var da = (sa.length - 1); (da >= 0); da--) {\n                        var ta = sa[da];\n                        if ((ta && ka[ta])) {\n                            ra = ka[ta].props.isAuthorReply;\n                            break;\n                        }\n                    ;\n                    };\n                    ma = this.renderReplyComposer(aa, !ra);\n                }\n            ;\n            }\n        ;\n            var ua;\n            if (((((ga || ja) || ka) || la) || ma)) {\n                this.applyToUFIComponents([ga,ja,], ka, [la,ma,], {\n                    isFirstComponent: true\n                }, {\n                    isLastComponent: true\n                });\n                var va = (aa.status === n.UFIStatus.LIVE_DELETED);\n                ua = o({\n                    isParentLiveDeleted: va,\n                    isReplyList: true\n                }, ga, ja, ka, la, ma);\n            }\n        ;\n            return ua;\n        },\n        renderReplyComposer: function(aa, ba) {\n            var ca = this.props;\n            return (new k(null, ca.id, aa.id, ca.contextArgs)).renderAddComment(ca.authorProfiles[ca.feedback.actorforpost], ca.feedback.ownerid, ca.feedback.mentionsdatasource, false, (\"replycomposer-\" + aa.id), ba, ca.feedback.allowphotoattachments);\n        },\n        renderEditCommentBox: function(aa) {\n            var ba = new k(null, this.props.id, null, {\n            }), ca = ba.renderEditComment(this.props.authorProfiles[this.props.feedback.actorforpost], this.props.feedback.ownerid, aa.id, this.props.feedback.mentionsdatasource, this.props.onEditAttempt.bind(null, aa), this.props.onCancelEdit, this.props.feedback.allowphotoattachments);\n            return ca;\n        },\n        _shouldShowCommentReplies: function(aa) {\n            if ((aa in this.state.instanceShowRepliesMap)) {\n                return this.state.instanceShowRepliesMap[aa];\n            }\n             else if ((aa in this.props.showRepliesMap)) {\n                return this.props.showRepliesMap[aa]\n            }\n        ;\n            return false;\n        },\n        _shouldShowReplySocialSentence: function(aa) {\n            if ((aa in this.state.instanceShowReplySocialSentenceMap)) {\n                return this.state.instanceShowReplySocialSentenceMap[aa];\n            }\n             else if ((aa in this.props.showReplySocialSentenceMap)) {\n                return this.props.showReplySocialSentenceMap[aa]\n            }\n        ;\n            return false;\n        },\n        renderComment: function(aa, ba) {\n            var ca = this.props, da = ca.feedback, ea = (da.actorforpost === aa.author), fa = q.getKeyForInstance(this.props.instanceid, \"locallycomposed\"), ga = (aa.islocal || (fa && fa[aa.id])), ha = (da.showremovemenu || ((da.viewerid === aa.author))), ia = ((da.canremoveall && da.isownerpage) && !ea), ja = (ca.source != n.UFIFeedbackSourceType.INTERN), ka = j.getTrackingInfo(j.types.COMMENT, ba), la = !!aa.parentcommentid, ma = this._shouldShowCommentReplies(aa.id), na = !!aa.isfeatured;\n            return (m({\n                comment: aa,\n                authorProfiles: this.props.authorProfiles,\n                viewerIsAuthor: ea,\n                feedback: da,\n                \"data-ft\": ka,\n                contextArgs: this.props.contextArgs,\n                hideAsSpamForPageAdmin: ia,\n                isLocallyComposed: ga,\n                isReply: la,\n                isFeatured: na,\n                showPermalink: ja,\n                showRemoveReportMenu: ha,\n                showReplies: ma,\n                onCommentLikeToggle: ca.onCommentLikeToggle.bind(null, aa),\n                onCommentReply: this.onCommentReply.bind(this, aa),\n                onCommentTranslate: ca.onCommentTranslate.bind(null, aa),\n                onEdit: ca.onCommentEdit.bind(null, aa),\n                onHideAsSpam: ca.onCommentHideAsSpam.bind(null, aa),\n                onInlineBan: ca.onCommentInlineBan.bind(null, aa),\n                onMarkAsNotSpam: ca.onCommentMarkAsNotSpam.bind(null, aa),\n                onOneClickRemove: ca.onCommentOneClickRemove.bind(null, aa),\n                onPreviewRemove: ca.onPreviewRemove.bind(null, aa),\n                onRemove: ca.onCommentRemove.bind(null, aa),\n                onRetrySubmit: ca.onRetrySubmit.bind(null, aa),\n                onUndoInlineBan: ca.onCommentUndoInlineBan.bind(null, aa),\n                onUndoOneClickRemove: ca.onCommentUndoOneClickRemove.bind(null, aa)\n            }));\n        },\n        _updateRepliesState: function(aa, ba, ca) {\n            var da = this.state.instanceShowRepliesMap;\n            da[aa] = ba;\n            var ea = this.state.instanceShowReplySocialSentenceMap;\n            ea[aa] = ca;\n            this.setState({\n                instanceShowRepliesMap: da,\n                instanceShowReplySocialSentenceMap: ea\n            });\n        },\n        onToggleReplies: function(aa) {\n            var ba = !this._shouldShowCommentReplies(aa.id), ca = (this._shouldShowReplySocialSentence(aa.id) && !((ba && (aa.replycount <= this.props.replySocialSentenceMaxReplies))));\n            this._updateRepliesState(aa.id, ba, ca);\n            var da = this.props.availableRanges[aa.id].length;\n            if ((aa.id in this.state.requestRanges)) {\n                da = this.state.requestRanges[aa.id].length;\n            };\n            da -= this.props.deletedCounts[aa.id];\n            if ((ba && (da === 0))) {\n                var ea = this.props.commentCounts[aa.id], fa = Math.min(ea, this.props.pageSize);\n                this.onPage(aa.id, {\n                    offset: (ea - fa),\n                    length: fa\n                });\n            }\n        ;\n        },\n        onPage: function(aa, ba) {\n            var ca = this.state.requestRanges;\n            ca[aa] = ba;\n            var da = (this.state.hasPagedToplevel || (aa === this.props.id));\n            this.setState({\n                requestRanges: ca,\n                isActiveLoading: true,\n                hasPagedToplevel: da\n            });\n            this.props.onChangeRange(aa, ba);\n        },\n        isLoadingPrev: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            };\n            var ca = this.state.requestRanges[aa].offset, da = ba.availableRanges[aa].offset;\n            return (ca < da);\n        },\n        isLoadingNext: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            };\n            var ca = this.state.requestRanges[aa].offset, da = this.state.requestRanges[aa].length, ea = ba.availableRanges[aa].offset, fa = ba.availableRanges[aa].length;\n            return ((ca + da) > (ea + fa));\n        },\n        renderPagers: function(aa) {\n            var ba = this.props;\n            aa = (aa || ba.id);\n            var ca = ba.availableRanges[aa].offset, da = ba.availableRanges[aa].length, ea = ba.deletedCounts[aa], fa = ba.commentCounts[aa], ga = (fa - ea), ha = (da - ea), ia = (ba.contextArgs.numberdelimiter || \",\"), ja = (aa !== ba.id), ka = {\n                topPager: null,\n                bottomPager: null\n            };\n            if ((ba.source == n.UFIFeedbackSourceType.ADS)) {\n                return ka\n            };\n            var la = this.isLoadingPrev(aa), ma = this.isLoadingNext(aa);\n            if ((da == fa)) {\n                return ka\n            };\n            var na = (((ca + da)) == fa);\n            if (((((fa < ba.pageSize) && na)) || (ha === 0))) {\n                var oa = Math.min(fa, ba.pageSize), pa = this.onPage.bind(this, aa, {\n                    offset: (fa - oa),\n                    length: oa\n                }), qa, ra;\n                if ((ha === 0)) {\n                    if ((ga == 1)) {\n                        qa = (ja ? \"View 1 reply\" : \"View 1 comment\");\n                    }\n                     else {\n                        ra = g.formatIntegerWithDelimiter(ga, ia);\n                        qa = (ja ? y._(\"View all {count} replies\", {\n                            count: ra\n                        }) : y._(\"View all {count} comments\", {\n                            count: ra\n                        }));\n                    }\n                ;\n                }\n                 else if (((ga - ha) == 1)) {\n                    qa = (ja ? \"View 1 more reply\" : \"View 1 more comment\");\n                }\n                 else {\n                    ra = g.formatIntegerWithDelimiter((ga - ha), ia);\n                    qa = (ja ? y._(\"View {count} more replies\", {\n                        count: ra\n                    }) : y._(\"View {count} more comments\", {\n                        count: ra\n                    }));\n                }\n                \n            ;\n                var sa = j.getTrackingInfo(j.types.VIEW_ALL_COMMENTS), ta = s({\n                    contextArgs: ba.contextArgs,\n                    isUnseen: ba.feedback.hasunseencollapsed,\n                    isLoading: la,\n                    pagerLabel: qa,\n                    onPagerClick: pa,\n                    \"data-ft\": sa\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.bottomPager = ta;\n                }\n                 else ka.topPager = ta;\n            ;\n                return ka;\n            }\n        ;\n            if ((ca > 0)) {\n                var ua = Math.max((ca - ba.pageSize), 0), oa = ((ca + da) - ua), va = this.onPage.bind(this, aa, {\n                    offset: ua,\n                    length: oa\n                }), wa = g.formatIntegerWithDelimiter(ha, ia), xa = g.formatIntegerWithDelimiter(ga, ia), ya = y._(\"{countshown} of {totalcount}\", {\n                    countshown: wa,\n                    totalcount: xa\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: \"View more comments\",\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n                 else {\n                    var za = (ja ? \"View previous replies\" : \"View previous comments\");\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: za,\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n            ;\n            }\n        ;\n            if (((ca + da) < fa)) {\n                var ab = Math.min((da + ba.pageSize), (fa - ca)), bb = this.onPage.bind(this, aa, {\n                    offset: ca,\n                    length: ab\n                });\n                if ((ba.feedback.isranked && !ja)) {\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: \"View previous comments\",\n                        onPagerClick: bb\n                    });\n                }\n                 else {\n                    var cb = (ja ? \"View more replies\" : \"View more comments\");\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: cb,\n                        onPagerClick: bb\n                    });\n                }\n            ;\n            }\n        ;\n            return ka;\n        },\n        onCommentReply: function(aa) {\n            var ba = (aa.parentcommentid || aa.id);\n            if (!this._shouldShowCommentReplies(ba)) {\n                this.onToggleReplies(aa);\n            };\n            if ((this.refs && this.refs[(\"replycomposer-\" + ba)])) {\n                this.refs[(\"replycomposer-\" + ba)].focus();\n            };\n        },\n        onComment: function() {\n            if ((this.refs && this.refs.toplevelcomposer)) {\n                this.refs.toplevelcomposer.focus();\n            };\n        }\n    });\n    e.exports = z;\n});\n__d(\"onEnclosingPageletDestroy\", [\"Arbiter\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMQuery\");\n    function i(j, k) {\n        var l = g.subscribe(\"pagelet/destroy\", function(m, n) {\n            if (h.contains(n.root, j)) {\n                l.unsubscribe();\n                k();\n            }\n        ;\n        });\n        return l;\n    };\n    e.exports = i;\n});\n__d(\"UFIController\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"ImmutableObject\",\"LayerRemoveOnHide\",\"LiveTimer\",\"Parent\",\"React\",\"ReactMount\",\"ShortProfiles\",\"UFI.react\",\"UFIActionLinkController\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",\"URI\",\"copyProperties\",\"isEmpty\",\"onEnclosingPageletDestroy\",\"tx\",\"UFICommentTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"ImmutableObject\"), l = b(\"LayerRemoveOnHide\"), m = b(\"LiveTimer\"), n = b(\"Parent\"), o = b(\"React\"), p = b(\"ReactMount\"), q = b(\"ShortProfiles\"), r = b(\"UFI.react\"), s = b(\"UFIActionLinkController\"), t = b(\"UFICentralUpdates\"), u = b(\"UFIComments\"), v = b(\"UFIConstants\"), w = b(\"UFIFeedbackTargets\"), x = b(\"UFIInstanceState\"), y = b(\"UFIUserActions\"), z = b(\"URI\"), aa = b(\"copyProperties\"), ba = b(\"isEmpty\"), ca = b(\"onEnclosingPageletDestroy\"), da = b(\"tx\"), ea = b(\"UFICommentTemplates\"), fa = function(ia, ja, ka, la) {\n        var ma = ((ia.offset + ia.length) === ja);\n        return {\n            offset: ia.offset,\n            length: (((ma && ga(la))) ? (ka - ia.offset) : ia.length)\n        };\n    }, ga = function(ia) {\n        return ((ia == v.UFIPayloadSourceType.USER_ACTION) || (ia == v.UFIPayloadSourceType.LIVE_SEND));\n    };\n    function ha(ia, ja, ka) {\n        this.root = ia;\n        this.id = ja.ftentidentifier;\n        this.source = ja.source;\n        this._ufiInstanceID = ja.instanceid;\n        this._contextArgs = ja;\n        this._contextArgs.rootid = this.root.id;\n        this._verifiedCommentsExpanded = false;\n        var la = ka.feedbacktargets[0];\n        this.actionLink = new s(ia, this._contextArgs, la);\n        this.orderingMode = la.defaultcommentorderingmode;\n        var ma = ka.commentlists.comments[this.id][this.orderingMode];\n        this.replyRanges = {\n        };\n        this.repliesMap = {\n        };\n        this.showRepliesMap = {\n        };\n        this.showReplySocialSentenceMap = {\n        };\n        this.commentcounts = {\n        };\n        this.commentcounts[this.id] = u.getCommentCount(this.id);\n        var na = {\n        }, oa = (la.orderingmodes || [{\n            value: this.orderingMode\n        },]);\n        oa.forEach(function(sa) {\n            na[sa.value] = aa({\n            }, ma.range);\n        });\n        this.ranges = na;\n        if (ka.commentlists.replies) {\n            for (var pa = 0; (pa < ma.values.length); pa++) {\n                var qa = ma.values[pa], ra = ka.commentlists.replies[qa];\n                if (ra) {\n                    this.commentcounts[qa] = u.getCommentCount(qa);\n                    this.replyRanges[qa] = aa({\n                    }, ra.range);\n                }\n            ;\n            }\n        };\n        this._loggingOffset = null;\n        this._ufi = null;\n        this.ufiCentralUpdatesSubscriptions = [t.subscribe(\"feedback-updated\", function(sa, ta) {\n            var ua = ta.updates, va = ta.payloadSource;\n            if (((va != v.UFIPayloadSourceType.COLLAPSED_UFI) && (this.id in ua))) {\n                this.fetchAndUpdate(this.render.bind(this), va);\n            };\n        }.bind(this)),t.subscribe(\"feedback-id-changed\", function(sa, ta) {\n            var ua = ta.updates;\n            if ((this.id in ua)) {\n                this.id = ua[this.id];\n            };\n        }.bind(this)),t.subscribe(\"instance-updated\", function(sa, ta) {\n            var ua = ta.updates;\n            if ((this._ufiInstanceID in ua)) {\n                var va = ua[this._ufiInstanceID];\n                if (va.editcommentid) {\n                    this.render(ta.payloadSource);\n                };\n            }\n        ;\n        }.bind(this)),t.subscribe(\"update-comment-lists\", function(sa, ta) {\n            if ((ta.commentlists && ta.commentlists.replies)) {\n                var ua = ta.commentlists.replies;\n                for (var va in ua) {\n                    if (((((this.id != va) && ua[va]) && (ua[va].ftentidentifier == this.id)) && !this.replyRanges[va])) {\n                        this.replyRanges[va] = ua[va].range;\n                    };\n                };\n            }\n        ;\n        }.bind(this)),];\n        this.clearPageletSubscription = ca(this.root, this._onEnclosingPageletDestroy.bind(this));\n        this.clearPageSubscription = g.subscribe(\"ufi/page_cleared\", this._onDestroy.bind(this));\n        t.handleUpdate(v.UFIPayloadSourceType.INITIAL_SERVER, ka);\n        if (this._contextArgs.viewas) {\n            this.viewasUFICleanSubscription = g.subscribe(\"pre_page_transition\", function(sa, ta) {\n                if ((this._contextArgs.viewas !== z(ta.to).getQueryData(\"viewas\"))) {\n                    u.resetFeedbackTarget(this.id);\n                };\n            }.bind(this));\n        };\n        h.loadModules([\"ScrollAwareDOM\",], function(sa) {\n            p.scrollMonitor = sa.monitor;\n        });\n    };\n    aa(ha.prototype, {\n        _getParentForm: function() {\n            if (!this._form) {\n                this._form = n.byTag(this.root, \"form\");\n            };\n            return this._form;\n        },\n        _onTargetLikeToggle: function(event) {\n            var ia = !this.feedback.hasviewerliked;\n            y.changeLike(this.id, ia, {\n                source: this.source,\n                target: event.target,\n                rootid: this._contextArgs.rootid\n            });\n            event.preventDefault();\n        },\n        _onCommentLikeToggle: function(ia, event) {\n            var ja = !ia.hasviewerliked;\n            y.changeCommentLike(ia.id, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentEdit: function(ia) {\n            x.updateState(this._ufiInstanceID, \"isediting\", true);\n            x.updateState(this._ufiInstanceID, \"editcommentid\", ia.id);\n        },\n        _onEditAttempt: function(ia, ja, event) {\n            if ((!ja.visibleValue && !ja.attachedPhoto)) {\n                this._onCommentRemove(ia, event);\n            }\n             else y.editComment(ia.id, ja.visibleValue, ja.encodedValue, {\n                source: this._contextArgs.source,\n                target: event.target,\n                attachedPhoto: ja.attachedPhoto\n            });\n        ;\n            x.updateStateField(this._ufiInstanceID, \"locallycomposed\", ia.id, true);\n            this._onEditReset();\n        },\n        _onEditReset: function() {\n            x.updateState(this._ufiInstanceID, \"isediting\", false);\n            x.updateState(this._ufiInstanceID, \"editcommentid\", null);\n        },\n        _onCommentRemove: function(ia, event) {\n            var ja = ea[\":fb:ufi:hide-dialog-template\"].build();\n            j.setContent(ja.getNode(\"body\"), \"Are you sure you want to delete this comment?\");\n            j.setContent(ja.getNode(\"title\"), \"Delete Comment\");\n            h.loadModules([\"DialogX\",], function(ka) {\n                var la = new ka({\n                    modal: true,\n                    width: 465,\n                    addedBehaviors: [l,]\n                }, ja.getRoot());\n                la.subscribe(\"confirm\", function() {\n                    y.removeComment(ia.id, {\n                        source: this.source,\n                        oneclick: false,\n                        target: event.target,\n                        timelinelogdata: this._contextArgs.timelinelogdata\n                    });\n                    la.hide();\n                }.bind(this));\n                la.show();\n            }.bind(this));\n        },\n        _onCommentOneClickRemove: function(ia, event) {\n            y.removeComment(ia.id, {\n                source: this.source,\n                oneclick: true,\n                target: event.target,\n                timelinelogdata: this._contextArgs.timelinelogdata\n            });\n        },\n        _onCommentUndoOneClickRemove: function(ia, event) {\n            var ja = ((this.feedback.canremoveall && this.feedback.isownerpage) && (this.feedback.actorforpost !== this.authorProfiles[ia.author]));\n            y.undoRemoveComment(ia.id, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentHideAsSpam: function(ia, event) {\n            y.setHideAsSpam(ia.id, true, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentMarkAsNotSpam: function(ia, event) {\n            y.setHideAsSpam(ia.id, false, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentTranslate: function(ia, event) {\n            y.translateComment(ia, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentInlineBanChange: function(ia, ja, event) {\n            y.banUser(ia, this.feedback.ownerid, ja, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _onCommentInlineBan: function(ia, event) {\n            this._onCommentInlineBanChange(ia, true, event);\n        },\n        _onCommentUndoInlineBan: function(ia, event) {\n            this._onCommentInlineBanChange(ia, false, event);\n        },\n        _fetchSpamComments: function(ia, ja) {\n            y.fetchSpamComments(this.id, ia, ja, this._contextArgs.viewas);\n        },\n        _removePreview: function(ia, event) {\n            y.removePreview(ia, {\n                source: this.source,\n                target: event.target\n            });\n        },\n        _retrySubmit: function(ia) {\n            h.loadModules([\"UFIRetryActions\",], function(ja) {\n                ja.retrySubmit(ia, {\n                    source: this.source\n                });\n            }.bind(this));\n        },\n        _ensureCommentsExpanded: function() {\n            if (this._verifiedCommentsExpanded) {\n                return\n            };\n            var ia = n.byTag(this.root, \"form\");\n            if (ia) {\n                i.removeClass(ia, \"collapsed_comments\");\n                this._verifiedCommentsExpanded = true;\n            }\n        ;\n        },\n        render: function(ia) {\n            var ja = (this.comments.length || !ba(this.feedback.likesentences.current));\n            if ((ja && ga(ia))) {\n                this._ensureCommentsExpanded();\n            };\n            if ((this._loggingOffset === null)) {\n                this._loggingOffset = ((this.ranges[this.orderingMode].offset + this.comments.length) - 1);\n            };\n            var ka = (this.feedback.replysocialsentencemaxreplies || -1), la = {\n            };\n            la[this.id] = u.getDeletedCount(this.id);\n            this.comments.forEach(function(oa) {\n                la[oa.id] = u.getDeletedCount(oa.id);\n            });\n            var ma = aa({\n            }, this.replyRanges);\n            ma[this.id] = this.ranges[this.orderingMode];\n            ma = new k(ma);\n            var na = r({\n                feedback: this.feedback,\n                id: this.id,\n                onTargetLikeToggle: this._onTargetLikeToggle.bind(this),\n                onCommentLikeToggle: this._onCommentLikeToggle.bind(this),\n                onCommentRemove: this._onCommentRemove.bind(this),\n                onCommentHideAsSpam: this._onCommentHideAsSpam.bind(this),\n                onCommentMarkAsNotSpam: this._onCommentMarkAsNotSpam.bind(this),\n                onCommentEdit: this._onCommentEdit.bind(this),\n                onCommentOneClickRemove: this._onCommentOneClickRemove.bind(this),\n                onCommentUndoOneClickRemove: this._onCommentUndoOneClickRemove.bind(this),\n                onCommentTranslate: this._onCommentTranslate.bind(this),\n                onCommentInlineBan: this._onCommentInlineBan.bind(this),\n                onCommentUndoInlineBan: this._onCommentUndoInlineBan.bind(this),\n                onEditAttempt: this._onEditAttempt.bind(this),\n                onCancelEdit: this._onEditReset.bind(this),\n                onChangeRange: this._changeRange.bind(this),\n                onSpamFetch: this._fetchSpamComments.bind(this),\n                onPreviewRemove: this._removePreview.bind(this),\n                onRetrySubmit: this._retrySubmit.bind(this),\n                onOrderingModeChange: this._onOrderingModeChange.bind(this),\n                contextArgs: this._contextArgs,\n                repliesMap: this.repliesMap,\n                showRepliesMap: this.showRepliesMap,\n                showReplySocialSentenceMap: this.showReplySocialSentenceMap,\n                commentCounts: this.commentcounts,\n                deletedCounts: la,\n                availableComments: this.comments,\n                source: this.source,\n                availableRanges: ma,\n                pageSize: v.defaultPageSize,\n                authorProfiles: this.authorProfiles,\n                instanceid: this._ufiInstanceID,\n                loggingOffset: this._loggingOffset,\n                replySocialSentenceMaxReplies: ka,\n                giftRecipient: this._giftRecipient,\n                orderingMode: this.orderingMode\n            });\n            this._ufi = o.renderComponent(na, this.root);\n            m.updateTimeStamps();\n            if (this._getParentForm()) {\n                g.inform(\"ufi/changed\", {\n                    form: this._getParentForm()\n                });\n            };\n            if (((ia != v.UFIPayloadSourceType.INITIAL_SERVER) && (ia != v.UFIPayloadSourceType.COLLAPSED_UFI))) {\n                g.inform(\"reflow\");\n            };\n        },\n        fetchAndUpdate: function(ia, ja) {\n            w.getFeedbackTarget(this.id, function(ka) {\n                var la = u.getCommentCount(this.id), ma = fa(this.ranges[this.orderingMode], this.commentcounts[this.id], la, ja);\n                u.getCommentsInRange(this.id, ma, this.orderingMode, this._contextArgs.viewas, function(na) {\n                    var oa = [], pa = {\n                    }, qa = {\n                    };\n                    if (ka.actorforpost) {\n                        oa.push(ka.actorforpost);\n                    };\n                    for (var ra = 0; (ra < na.length); ra++) {\n                        if (na[ra].author) {\n                            oa.push(na[ra].author);\n                        };\n                        if (na[ra].socialcontext) {\n                            oa.push(na[ra].socialcontext.topmutualid);\n                        };\n                        if ((na[ra].replyauthors && na[ra].replyauthors.length)) {\n                            for (var sa = 0; (sa < na[ra].replyauthors.length); sa++) {\n                                oa.push(na[ra].replyauthors[sa]);;\n                            }\n                        };\n                        if (ka.isthreaded) {\n                            var ta = na[ra].id, ua = u.getCommentCount(ta), va;\n                            if (this.replyRanges[ta]) {\n                                va = fa(this.replyRanges[ta], this.commentcounts[ta], ua, ja);\n                            }\n                             else va = {\n                                offset: 0,\n                                length: Math.min(ua, 2)\n                            };\n                        ;\n                            pa[ta] = va;\n                            qa[ta] = ua;\n                        }\n                    ;\n                    };\n                    u.getRepliesInRanges(this.id, pa, function(wa) {\n                        for (var xa = 0; (xa < na.length); xa++) {\n                            var ya = na[xa].id, za = (wa[ya] || []);\n                            for (var ab = 0; (ab < za.length); ab++) {\n                                if (za[ab].author) {\n                                    oa.push(za[ab].author);\n                                };\n                                if (za[ab].socialcontext) {\n                                    oa.push(za[ab].socialcontext.topmutualid);\n                                };\n                            };\n                        };\n                        if (this._contextArgs.giftoccasion) {\n                            oa.push(ka.actorid);\n                        };\n                        q.getMulti(oa, function(bb) {\n                            if (this._contextArgs.giftoccasion) {\n                                this._giftRecipient = bb[ka.actorid];\n                            };\n                            this.authorProfiles = bb;\n                            this.feedback = ka;\n                            this.commentcounts[this.id] = la;\n                            this.comments = na;\n                            this.ranges[this.orderingMode] = ma;\n                            for (var cb = 0; (cb < na.length); cb++) {\n                                var db = na[cb].id, eb = pa[db];\n                                this.repliesMap[db] = wa[db];\n                                this.replyRanges[db] = eb;\n                                this.commentcounts[db] = qa[db];\n                                this.showRepliesMap[db] = (eb && (eb.length > 0));\n                                if (((this.showReplySocialSentenceMap[db] === undefined) && (qa[db] > 0))) {\n                                    this.showReplySocialSentenceMap[db] = !this.showRepliesMap[db];\n                                };\n                            };\n                            ia(ja);\n                            if ((ja == v.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)) {\n                                g.inform(\"CommentUFI.Pager\");\n                            };\n                        }.bind(this));\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n        },\n        _changeRange: function(ia, ja) {\n            if ((ia == this.id)) {\n                this.ranges[this.orderingMode] = ja;\n            }\n             else this.replyRanges[ia] = ja;\n        ;\n            this.fetchAndUpdate(this.render.bind(this), v.UFIPayloadSourceType.USER_ACTION);\n        },\n        _onEnclosingPageletDestroy: function() {\n            o.unmountAndReleaseReactRootNode(this.root);\n            this.ufiCentralUpdatesSubscriptions.forEach(t.unsubscribe.bind(t));\n            g.unsubscribe(this.clearPageSubscription);\n            (this.viewasUFICleanSubscription && g.unsubscribe(this.viewasUFICleanSubscription));\n        },\n        _onDestroy: function() {\n            this._onEnclosingPageletDestroy();\n            g.unsubscribe(this.clearPageletSubscription);\n        },\n        _onOrderingModeChange: function(ia) {\n            this.orderingMode = ia;\n            this.fetchAndUpdate(this.render.bind(this), v.UFIPayloadSourceType.USER_ACTION);\n        }\n    });\n    e.exports = ha;\n});\n__d(\"EntstreamCollapsedUFIActions\", [\"PopupWindow\",\"React\",\"TrackingNodes\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"PopupWindow\"), h = b(\"React\"), i = b(\"TrackingNodes\"), j = b(\"URI\"), k = b(\"cx\"), l = b(\"tx\"), m = h.createClass({\n        displayName: \"EntstreamCollapsedUFIActions\",\n        getLikeButton: function() {\n            return this.refs.likeButton.getDOMNode();\n        },\n        getLikeIcon: function() {\n            return this.refs.likeIcon.getDOMNode();\n        },\n        render: function() {\n            var n;\n            if ((this.props.shareHref !== null)) {\n                var o = i.getTrackingInfo(i.types.SHARE_LINK), p = j(this.props.shareHref), q = [h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__shareicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\"\n                }),\"Share\",];\n                if ((p.getPath().indexOf(\"/ajax\") === 0)) {\n                    n = h.DOM.a({\n                        ajaxify: this.props.shareHref,\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: \"#\",\n                        rel: \"dialog\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n                 else {\n                    var r = function() {\n                        g.open(this.props.shareHref, 480, 600);\n                        return false;\n                    }.bind(this);\n                    n = h.DOM.a({\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: this.props.shareHref,\n                        onClick: r,\n                        target: \"_blank\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n            ;\n            }\n        ;\n            var s;\n            if (this.props.canComment) {\n                var t = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commenticon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\", u = [h.DOM.i({\n                    className: t\n                }),\"Comment\",], v = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commentlink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\", w = i.getTrackingInfo(i.types.COMMENT_LINK);\n                if (this.props.storyHref) {\n                    s = h.DOM.a({\n                        className: v,\n                        \"data-ft\": w,\n                        href: this.props.storyHref,\n                        target: \"_blank\",\n                        title: \"Write a comment...\"\n                    }, u);\n                }\n                 else s = h.DOM.a({\n                    className: v,\n                    \"data-ft\": w,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick,\n                    title: \"Write a comment...\"\n                }, u);\n            ;\n            }\n        ;\n            var x;\n            if (this.props.canLike) {\n                var y = (((((this.props.hasViewerLiked ? \"-cx-PUBLIC-fbEntstreamFeedback__liked\" : \"\")) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likelink\"))) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__action\")))), z = i.getTrackingInfo((this.props.hasViewerLiked ? i.types.UNLIKE_LINK : i.types.LIKE_LINK)), aa = (this.props.hasViewerLiked ? \"Unlike this\" : \"Like this\");\n                x = h.DOM.a({\n                    className: y,\n                    \"data-ft\": z,\n                    href: \"#\",\n                    onClick: this.props.onLike,\n                    onMouseDown: this.props.onLikeMouseDown,\n                    ref: \"likeButton\",\n                    title: aa\n                }, h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likeicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\",\n                    ref: \"likeIcon\"\n                }), \"Like\", h.DOM.div({\n                    className: \"-cx-PRIVATE-fbEntstreamCollapsedUFI__likecover\"\n                }));\n            }\n        ;\n            return (h.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__icons\"\n            }, x, s, n));\n        }\n    });\n    e.exports = m;\n});\n__d(\"EntstreamCollapsedUFISentence\", [\"Bootloader\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"NumberFormat\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"URI\"), m = b(\"cx\"), n = b(\"tx\"), o = k.createClass({\n        displayName: \"EntstreamCollapsedUFISentence\",\n        _showShareDialog: function(event) {\n            event = event.nativeEvent;\n            if (event.isDefaultRequested()) {\n                return\n            };\n            g.loadModules([\"EntstreamShareOverlay\",], function(p) {\n                p.display(this.props.feedback.targetfbid, this._getShareString());\n            }.bind(this));\n            event.prevent();\n        },\n        _getShareString: function() {\n            var p = this.props.feedback.sharecount, q = (this.props.numberDelimiter || \",\");\n            if ((p === 1)) {\n                return \"1 Share\";\n            }\n             else if ((p > 1)) {\n                var r = h.formatIntegerWithDelimiter(p, q);\n                return n._(\"{count} Shares\", {\n                    count: r\n                });\n            }\n            \n        ;\n        },\n        render: function() {\n            var p = this.props.feedback, q = p.likecount, r = this.props.commentCount, s = p.sharecount, t = p.seencount, u = this.props.hasAttachedUFIExpanded, v = (this.props.numberDelimiter || \",\");\n            if (u) {\n                q = 0;\n                r = 0;\n            }\n        ;\n            if ((((!q && !r) && !s) && !t)) {\n                return k.DOM.span(null)\n            };\n            var w;\n            if ((q === 1)) {\n                w = \"1 Like\";\n            }\n             else if ((q > 1)) {\n                var x = h.formatIntegerWithDelimiter(q, v);\n                w = n._(\"{count} Likes\", {\n                    count: x\n                });\n            }\n            \n        ;\n            var y;\n            if ((r === 1)) {\n                y = \"1 Comment\";\n            }\n             else if ((r > 1)) {\n                var z = h.formatIntegerWithDelimiter(r, v);\n                y = n._(\"{count} Comments\", {\n                    count: z\n                });\n            }\n            \n        ;\n            var aa = this._getShareString(), ba, ca, da;\n            if (w) {\n                ca = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                    comment_fbid: p.targetfbid,\n                    comment_from: p.actorforpost,\n                    seen_user_fbids: true\n                });\n                var ea = (((y || aa) ? \"prm\" : \"\"));\n                ba = j.LIKES;\n                da = {\n                    id: p.targetfbid\n                };\n                var fa = i.constructDialogURI(ba, da).toString();\n                if (this.props.storyHref) {\n                    w = null;\n                }\n                 else w = k.DOM.a({\n                    ajaxify: fa,\n                    className: ea,\n                    href: i.constructPageURI(ba, da).toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    rel: \"dialog\"\n                }, w);\n            ;\n            }\n        ;\n            var ga;\n            if ((t > 0)) {\n                ba = j.GROUP_MESSAGE_VIEWERS;\n                da = {\n                    id: p.targetfbid\n                };\n                var ha = i.constructDialogURI(ba, da), ia = i.constructPageURI(ba, da);\n                ca = new l(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: p.entidentifier,\n                    displayed_count: t\n                });\n                var ja = h.formatIntegerWithDelimiter(t, v);\n                if (p.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((ja == 1) ? \"Seen by 1\" : n._(\"Seen by {count}\", {\n                    count: ja\n                }));\n            ;\n                ga = k.DOM.a({\n                    ajaxify: ha.toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    href: ia.toString(),\n                    rel: \"dialog\",\n                    tabindex: \"-1\"\n                }, ga);\n            }\n        ;\n            if (y) {\n                var ka = ((aa ? \"prm\" : \"\"));\n                if (this.props.storyHref) {\n                    y = k.DOM.a({\n                        className: ka,\n                        href: this.props.storyHref,\n                        target: \"_blank\"\n                    }, y);\n                }\n                 else y = k.DOM.a({\n                    className: ka,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick\n                }, y);\n            ;\n            }\n        ;\n            if (aa) {\n                var la = new l(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: p.targetfbid\n                });\n                if (this.props.storyHref) {\n                    aa = k.DOM.a({\n                        href: la.toString(),\n                        target: \"_blank\"\n                    }, aa);\n                }\n                 else aa = k.DOM.a({\n                    href: la.toString(),\n                    onClick: this._showShareDialog,\n                    rel: \"ignore\"\n                }, aa);\n            ;\n            }\n        ;\n            return (k.DOM.span({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentencerow\"\n            }, w, y, aa, ga));\n        }\n    });\n    e.exports = o;\n});\n__d(\"EntstreamCollapsedUFI\", [\"Event\",\"Animation\",\"BrowserSupport\",\"CSS\",\"DOM\",\"Ease\",\"EntstreamCollapsedUFIActions\",\"EntstreamCollapsedUFISentence\",\"React\",\"TrackingNodes\",\"Vector\",\"cx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Ease\"), m = b(\"EntstreamCollapsedUFIActions\"), n = b(\"EntstreamCollapsedUFISentence\"), o = b(\"React\"), p = b(\"TrackingNodes\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"queryThenMutateDOM\"), t = 16, u = o.createClass({\n        displayName: \"EntstreamCollapsedUFI\",\n        _animate: function(v, w, x, y) {\n            if (!i.hasCSSTransforms()) {\n                return\n            };\n            var z = this.refs.icons.getLikeIcon();\n            (this._animation && this._animation.stop());\n            this._animation = new h(z).from(\"scaleX\", v).from(\"scaleY\", v).to(\"scaleX\", w).to(\"scaleY\", w).duration(x);\n            (y && this._animation.ease(y));\n            this._animation.go();\n        },\n        bounceLike: function() {\n            this._animate(1.35, 1, 750, l.bounceOut);\n        },\n        shrinkLike: function() {\n            this._animate(1, 124362, 150);\n            this._mouseUpListener = g.listen(document.body, \"mouseup\", this._onMouseUp);\n        },\n        _onMouseUp: function(event) {\n            this._mouseUpListener.remove();\n            if (!k.contains(this.refs.icons.getLikeButton(), event.getTarget())) {\n                this._animate(124583, 1, 150);\n            };\n        },\n        render: function() {\n            var v = this.props.feedback, w = p.getTrackingInfo(p.types.BLINGBOX);\n            return (o.DOM.div({\n                className: \"clearfix\"\n            }, m({\n                canLike: v.viewercanlike,\n                canComment: v.cancomment,\n                hasViewerLiked: v.hasviewerliked,\n                onCommentClick: this.props.onCommentClick,\n                onLike: this.props.onLike,\n                onLikeMouseDown: this.props.onLikeMouseDown,\n                ref: \"icons\",\n                shareHref: this.props.shareHref,\n                storyHref: this.props.storyHref\n            }), o.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentence\",\n                \"data-ft\": w,\n                ref: \"sentence\"\n            }, n({\n                commentCount: this.props.commentCount,\n                feedback: v,\n                hasAttachedUFIExpanded: this.props.hasAttachedUFIExpanded,\n                numberDelimiter: this.props.numberDelimiter,\n                onCommentClick: this.props.onCommentClick,\n                storyHref: this.props.storyHref\n            }))));\n        },\n        componentDidMount: function(v) {\n            var w = this.refs.icons.getDOMNode(), x = this.refs.sentence.getDOMNode(), y, z, aa;\n            s(function() {\n                y = q.getElementDimensions(v).x;\n                z = q.getElementDimensions(w).x;\n                aa = q.getElementDimensions(x).x;\n            }, function() {\n                if (((z + aa) > (y + t))) {\n                    j.addClass(v, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__tworow\");\n                };\n            });\n        }\n    });\n    e.exports = u;\n});\n__d(\"EntstreamCollapsedUFIController\", [\"Bootloader\",\"CommentPrelude\",\"CSS\",\"DOM\",\"EntstreamCollapsedUFI\",\"React\",\"ReactMount\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIUserActions\",\"copyProperties\",\"cx\",\"onEnclosingPageletDestroy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"EntstreamCollapsedUFI\"), l = b(\"React\"), m = b(\"ReactMount\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIConstants\"), q = b(\"UFIFeedbackTargets\"), r = b(\"UFIUserActions\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"onEnclosingPageletDestroy\"), v = p.UFIPayloadSourceType;\n    function w(x, y, z) {\n        this._root = x;\n        this._id = z.ftentidentifier;\n        this._contextArgs = z;\n        this._ufiVisible = z.hasattachedufiexpanded;\n        this._updateSubscription = n.subscribe(\"feedback-updated\", function(aa, ba) {\n            if (((ba.payloadSource != v.INITIAL_SERVER) && (this._id in ba.updates))) {\n                this.render();\n            };\n        }.bind(this));\n        n.handleUpdate(p.UFIPayloadSourceType.COLLAPSED_UFI, y);\n        g.loadModules([\"ScrollAwareDOM\",], function(aa) {\n            m.scrollMonitor = aa.monitor;\n        });\n        u(this._root, this.destroy.bind(this));\n    };\n    s(w.prototype, {\n        _onLike: function(event) {\n            this._feedbackSubscription = q.getFeedbackTarget(this._id, function(x) {\n                r.changeLike(this._id, !x.hasviewerliked, {\n                    source: this._contextArgs.source,\n                    target: event.target,\n                    rootid: j.getID(this._root)\n                });\n            }.bind(this));\n            this._ufi.bounceLike();\n            event.preventDefault();\n        },\n        _onLikeMouseDown: function(event) {\n            this._ufi.shrinkLike();\n            event.preventDefault();\n        },\n        _onCommentClick: function(event) {\n            if (!this._ufiVisible) {\n                this._ufiVisible = true;\n                i.addClass(this._root, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__hasattachedufiexpanded\");\n            }\n        ;\n            h.click(this._root);\n            event.preventDefault();\n        },\n        render: function() {\n            this._feedbackSubscription = q.getFeedbackTarget(this._id, function(x) {\n                var y = k({\n                    commentCount: o.getCommentCount(this._id),\n                    feedback: x,\n                    hasAttachedUFIExpanded: this._contextArgs.hasattachedufiexpanded,\n                    numberDelimiter: this._contextArgs.numberdelimiter,\n                    onCommentClick: this._onCommentClick.bind(this),\n                    onLike: this._onLike.bind(this),\n                    onLikeMouseDown: this._onLikeMouseDown.bind(this),\n                    shareHref: this._contextArgs.sharehref,\n                    storyHref: this._contextArgs.storyhref\n                });\n                l.renderComponent(y, this._root);\n                this._ufi = (this._ufi || y);\n            }.bind(this));\n        },\n        destroy: function() {\n            if (this._feedbackSubscription) {\n                q.unsubscribe(this._feedbackSubscription);\n                this._feedbackSubscription = null;\n            }\n        ;\n            this._updateSubscription.unsubscribe();\n            this._updateSubscription = null;\n            l.unmountAndReleaseReactRootNode(this._root);\n            this._root = null;\n            this._id = null;\n            this._contextArgs = null;\n            this._ufiVisible = null;\n        }\n    });\n    e.exports = w;\n});");
// 1167
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s324d77872a45b0b23507e46a3cd090261cebcabc");
// 1168
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"ociRJ\",]);\n}\n;\n;\n__d(\"CLoggerX\", [\"Banzai\",\"DOM\",\"debounce\",\"JSBNG__Event\",\"ge\",\"Parent\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"DOM\"), i = b(\"debounce\"), j = b(\"JSBNG__Event\"), k = b(\"ge\"), l = b(\"Parent\"), m = ((((10 * 60)) * 1000)), n = b(\"Keys\").RETURN, o = {\n    }, p = function(s) {\n        var t = ((s.target || s.srcElement)).id, u = ((s.target || s.srcElement)).value.trim().length, v = q.getTracker(t);\n        if (!v) {\n            return;\n        }\n    ;\n    ;\n        if (((((u > 5)) && !v.submitted))) {\n            g.post(\"censorlogger\", {\n                cl_impid: v.impid,\n                clearcounter: v.clearcounter,\n                instrument: v.type,\n                elementid: t,\n                parent_fbid: ((((v.parent_fbid == \"unknown\")) ? null : v.parent_fbid)),\n                version: \"x\"\n            }, g.VITAL);\n            q.setSubmitted(t, true);\n        }\n         else if (((((((u === 0)) && v.submitted)) && ((s.which != n))))) {\n            o[t] = r(t);\n            o[t]();\n        }\n         else if (((((u > 0)) && v.submitted))) {\n            if (o[t]) {\n                o[t].reset();\n            }\n        ;\n        }\n        \n        \n    ;\n    ;\n    }, q = {\n        init: function() {\n            this.trackedElements = ((this.trackedElements || {\n            }));\n            this.feedbackForms = ((this.feedbackForms || {\n            }));\n        },\n        setImpressionID: function(s) {\n            this.init();\n            this.impressionID = s;\n            this.clean();\n        },\n        setComposerTargetData: function(s) {\n            this.cTargetID = ((s.targetID || \"unknown\"));\n            this.cTargetFBType = ((s.targetType || \"unknown\"));\n        },\n        clean: function() {\n            {\n                var fin94keys = ((window.top.JSBNG_Replay.forInKeys)((this.trackedElements))), fin94i = (0);\n                var s;\n                for (; (fin94i < fin94keys.length); (fin94i++)) {\n                    ((s) = (fin94keys[fin94i]));\n                    {\n                        if (o[s]) {\n                            o[s].reset();\n                            delete o[s];\n                        }\n                    ;\n                    ;\n                        delete this.trackedElements[s];\n                    };\n                };\n            };\n        ;\n        },\n        trackComposer: function(s, t, u) {\n            this.setComposerTargetData(u);\n            this.startTracking(s, \"composer\", this.cTargetID, this.cTargetFBType, t);\n        },\n        trackFeedbackForm: function(s, t, u) {\n            this.init();\n            this.impressionID = ((this.impressionID || u));\n            var v, w, x;\n            v = h.getID(s);\n            w = ((t ? ((t.targetID || \"unknown\")) : \"unknown\"));\n            x = ((t ? ((t.targetType || \"unknown\")) : \"unknown\"));\n            this.feedbackForms[v] = {\n                parent_fbid: w,\n                parent_type: x\n            };\n        },\n        trackMentionsInput: function(s, t) {\n            this.init();\n            var u, v, w;\n            if (!s) {\n                return;\n            }\n        ;\n        ;\n            u = l.byTag(s, \"form\");\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            v = h.getID(u);\n            w = this.feedbackForms[v];\n            if (!w) {\n                return;\n            }\n        ;\n        ;\n            var x = ((t || w.parent_fbid)), y = ((t ? 416 : w.parent_type));\n            this.startTracking(s, \"comment\", x, y, u);\n        },\n        startTracking: function(s, t, u, v, w) {\n            this.init();\n            var x = h.getID(s);\n            if (this.getTracker(x)) {\n                return;\n            }\n        ;\n        ;\n            var y = h.getID(w);\n            j.listen(s, \"keyup\", p.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: t,\n                impid: this.impressionID,\n                parent_fbid: u,\n                parent_type: v,\n                parentElID: y\n            };\n            this.addJoinTableInfoToForm(w, x);\n        },\n        getTracker: function(s) {\n            return ((this.trackedElements ? this.trackedElements[s] : null));\n        },\n        setSubmitted: function(s, t) {\n            if (this.trackedElements[s]) {\n                this.trackedElements[s].submitted = t;\n            }\n        ;\n        ;\n        },\n        incrementClearCounter: function(s) {\n            var t = this.getTracker(s);\n            if (!t) {\n                return;\n            }\n        ;\n        ;\n            t.clearcounter++;\n            t.submitted = false;\n            var u = h.scry(k(t.parentElID), \"input[name=\\\"clp\\\"]\")[0];\n            if (u) {\n                u.value = this.getJSONRepForTrackerID(s);\n            }\n        ;\n        ;\n            this.trackedElements[s] = t;\n        },\n        addJoinTableInfoToForm: function(s, t) {\n            var u = this.getTracker(t);\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            var v = h.scry(s, \"input[name=\\\"clp\\\"]\")[0];\n            if (!v) {\n                h.prependContent(s, h.create(\"input\", {\n                    type: \"hidden\",\n                    JSBNG__name: \"clp\",\n                    value: this.getJSONRepForTrackerID(t)\n                }));\n            }\n        ;\n        ;\n        },\n        getCLParamsForTarget: function(s, t) {\n            if (!s) {\n                return \"\";\n            }\n        ;\n        ;\n            var u = h.getID(s);\n            return this.getJSONRepForTrackerID(u, t);\n        },\n        getJSONRepForTrackerID: function(s, t) {\n            var u = this.getTracker(s);\n            if (!u) {\n                return \"\";\n            }\n        ;\n        ;\n            return JSON.stringify({\n                cl_impid: u.impid,\n                clearcounter: u.clearcounter,\n                elementid: s,\n                version: \"x\",\n                parent_fbid: ((t || u.parent_fbid))\n            });\n        }\n    }, r = function(s) {\n        return i(function() {\n            q.incrementClearCounter(s);\n        }, m, q);\n    };\n    e.exports = q;\n});\n__d(\"ClickTTIIdentifiers\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            TIMELINE_SEE_LIKERS: \"timeline:seelikes\"\n        },\n        getUserActionID: function(h) {\n            return ((((\"{\\\"ua_id\\\":\\\"\" + h)) + \"\\\"}\"));\n        }\n    };\n    e.exports = g;\n});\n__d(\"TrackingNodes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        types: {\n            USER_NAME: 2,\n            LIKE_LINK: 5,\n            UNLIKE_LINK: 6,\n            ATTACHMENT: 15,\n            SHARE_LINK: 17,\n            USER_MESSAGE: 18,\n            SOURCE: 21,\n            BLINGBOX: 22,\n            VIEW_ALL_COMMENTS: 24,\n            COMMENT: 25,\n            COMMENT_LINK: 26,\n            SMALL_ACTOR_PHOTO: 27,\n            XBUTTON: 29,\n            HIDE_LINK: 30,\n            REPORT_SPAM_LINK: 31,\n            HIDE_ALL_LINK: 32,\n            ADD_COMMENT_BOX: 34,\n            UFI: 36,\n            DROPDOWN_BUTTON: 55,\n            UNHIDE_LINK: 71,\n            RELATED_SHARE: 73\n        },\n        BASE_CODE_START: 58,\n        BASE_CODE_END: 126,\n        BASE_CODE_SIZE: 69,\n        PREFIX_CODE_START: 42,\n        PREFIX_CODE_END: 47,\n        PREFIX_CODE_SIZE: 6,\n        encodeTrackingInfo: function(h, i) {\n            var j = ((((h - 1)) % g.BASE_CODE_SIZE)), k = parseInt(((((h - 1)) / g.BASE_CODE_SIZE)), 10);\n            if (((((h < 1)) || ((k > g.PREFIX_CODE_SIZE))))) {\n                throw Error(((\"Invalid tracking node: \" + h)));\n            }\n        ;\n        ;\n            var l = \"\";\n            if (((k > 0))) {\n                l += String.fromCharCode(((((k - 1)) + g.PREFIX_CODE_START)));\n            }\n        ;\n        ;\n            l += String.fromCharCode(((j + g.BASE_CODE_START)));\n            if (((((typeof i != \"undefined\")) && ((i > 0))))) {\n                l += String.fromCharCode(((((48 + Math.min(i, 10))) - 1)));\n            }\n        ;\n        ;\n            return l;\n        },\n        decodeTN: function(h) {\n            if (((h.length === 0))) {\n                return [0,];\n            }\n        ;\n        ;\n            var i = h.charCodeAt(0), j = 1, k, l;\n            if (((((i >= g.PREFIX_CODE_START)) && ((i <= g.PREFIX_CODE_END))))) {\n                if (((h.length == 1))) {\n                    return [0,];\n                }\n            ;\n            ;\n                l = ((((i - g.PREFIX_CODE_START)) + 1));\n                k = h.charCodeAt(1);\n                j = 2;\n            }\n             else {\n                l = 0;\n                k = i;\n            }\n        ;\n        ;\n            if (((((k < g.BASE_CODE_START)) || ((k > g.BASE_CODE_END))))) {\n                return [0,];\n            }\n        ;\n        ;\n            var m = ((((((l * g.BASE_CODE_SIZE)) + ((k - g.BASE_CODE_START)))) + 1));\n            if (((((h.length > j)) && ((((h.charAt(j) >= \"0\")) && ((h.charAt(j) <= \"9\"))))))) {\n                return [((j + 1)),[m,((parseInt(h.charAt(j), 10) + 1)),],];\n            }\n        ;\n        ;\n            return [j,[m,],];\n        },\n        parseTrackingNodeString: function(h) {\n            var i = [];\n            while (((h.length > 0))) {\n                var j = g.decodeTN(h);\n                if (((j.length == 1))) {\n                    return [];\n                }\n            ;\n            ;\n                i.push(j[1]);\n                h = h.substring(j[0]);\n            };\n        ;\n            return i;\n        },\n        getTrackingInfo: function(h, i) {\n            return ((((\"{\\\"tn\\\":\\\"\" + g.encodeTrackingInfo(h, i))) + \"\\\"}\"));\n        }\n    };\n    e.exports = g;\n});\n__d(\"NumberFormat\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = /(\\d{3})(?=\\d)/g, i = 10000, j = function(l) {\n        return ((\"\" + l)).split(\"\").reverse().join(\"\");\n    }, k = {\n        formatIntegerWithDelimiter: function(l, m) {\n            if (((((((g.locale == \"nb_NO\")) || ((g.locale == \"nn_NO\")))) && ((Math.abs(l) < i))))) {\n                return l.toString();\n            }\n        ;\n        ;\n            var n = j(l);\n            return j(n.replace(h, ((\"$1\" + m))));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UFIBlingItem.react\", [\"React\",\"NumberFormat\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"NumberFormat\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = g.createClass({\n        displayName: \"UFIBlingItem\",\n        render: function() {\n            var l = j(this.props.className, this.props.iconClassName, \"UFIBlingBoxSprite\"), m = h.formatIntegerWithDelimiter(this.props.count, ((this.props.contextArgs.numberdelimiter || \",\")));\n            return (g.DOM.span(null, g.DOM.i({\n                className: l\n            }), g.DOM.span({\n                className: \"UFIBlingBoxText\"\n            }, m)));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFIConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COMMENT_LIKE: \"fa-type:comment-like\",\n        COMMENT_SET_SPAM: \"fa-type:mark-spam\",\n        DELETE_COMMENT: \"fa-type:delete-comment\",\n        LIVE_DELETE_COMMENT: \"fa-type:live-delete-comment\",\n        LIKE_ACTION: \"fa-type:like\",\n        REMOVE_PREVIEW: \"fa-type:remove-preview\",\n        CONFIRM_COMMENT_REMOVAL: \"fa-type:confirm-remove\",\n        TRANSLATE_COMMENT: \"fa-type:translate-comment\",\n        SUBSCRIBE_ACTION: \"fa-type:subscribe\",\n        GIFT_SUGGESTION: \"fa-type:gift-suggestion\",\n        UNDO_DELETE_COMMENT: \"fa-type:undo-delete-comment\"\n    }, h = {\n        DELETED: \"status:deleted\",\n        SPAM: \"status:spam\",\n        SPAM_DISPLAY: \"status:spam-display\",\n        LIVE_DELETED: \"status:live-deleted\",\n        FAILED_ADD: \"status:failed-add\",\n        FAILED_EDIT: \"status:failed-edit\",\n        PENDING_EDIT: \"status:pending-edit\",\n        PENDING_UNDO_DELETE: \"status:pending-undo-delete\"\n    }, i = {\n        MOBILE: 1,\n        SMS: 3,\n        EMAIL: 4\n    }, j = {\n        PROFILE: 0,\n        NEWS_FEED: 1,\n        OBJECT: 2,\n        MOBILE: 3,\n        EMAIL: 4,\n        PROFILE_APROVAL: 10,\n        TICKER: 12,\n        NONE: 13,\n        INTERN: 14,\n        ADS: 15,\n        PHOTOS_SNOWLIFT: 17\n    }, k = {\n        UNKNOWN: 0,\n        INITIAL_SERVER: 1,\n        LIVE_SEND: 2,\n        USER_ACTION: 3,\n        COLLAPSED_UFI: 4,\n        ENDPOINT_LIKE: 10,\n        ENDPOINT_COMMENT_LIKE: 11,\n        ENDPOINT_ADD_COMMENT: 12,\n        ENDPOINT_EDIT_COMMENT: 13,\n        ENDPOINT_DELETE_COMMENT: 14,\n        ENDPOINT_UNDO_DELETE_COMMENT: 15,\n        ENDPOINT_COMMENT_SPAM: 16,\n        ENDPOINT_REMOVE_PREVIEW: 17,\n        ENDPOINT_ID_COMMENT_FETCH: 18,\n        ENDPOINT_COMMENT_FETCH: 19,\n        ENDPOINT_TRANSLATE_COMMENT: 20,\n        ENDPOINT_BAN: 21,\n        ENDPOINT_SUBSCRIBE: 22\n    }, l = {\n        CHRONOLOGICAL: \"chronological\",\n        RANKED_THREADED: \"ranked_threaded\",\n        TOPLEVEL: \"toplevel\",\n        RECENT_ACTIVITY: \"recent_activity\"\n    }, m = 50, n = 7114, o = 420, p = 5, q = 80, r = 2;\n    e.exports = {\n        UFIActionType: g,\n        UFIStatus: h,\n        UFISourceType: i,\n        UFIFeedbackSourceType: j,\n        UFIPayloadSourceType: k,\n        UFICommentOrderingMode: l,\n        defaultPageSize: m,\n        commentTruncationLength: o,\n        commentTruncationPercent: n,\n        commentTruncationMaxLines: p,\n        attachmentTruncationLength: q,\n        minCommentsForOrderingModeSelector: r\n    };\n});\n__d(\"UFIBlingBox.react\", [\"React\",\"UFIBlingItem.react\",\"UFIConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIBlingItem.react\"), i = b(\"UFIConstants\"), j = b(\"cx\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIBlingBox\",\n        render: function() {\n            var m = [], n = \"\";\n            if (this.props.likes) {\n                m.push(h({\n                    count: this.props.likes,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxLikeIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.likes == 1)) ? \"1 like\" : k._(\"{count} likes\", {\n                    count: this.props.likes\n                })));\n                n += \" \";\n            }\n        ;\n        ;\n            if (this.props.comments) {\n                m.push(h({\n                    count: this.props.comments,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxCommentIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.comments == 1)) ? \"1 comment\" : k._(\"{count} comments\", {\n                    count: this.props.comments\n                })));\n                n += \" \";\n            }\n        ;\n        ;\n            if (this.props.reshares) {\n                m.push(h({\n                    count: this.props.reshares,\n                    className: ((((m.length > 0)) ? \"mls\" : \"\")),\n                    iconClassName: \"UFIBlingBoxReshareIcon\",\n                    contextArgs: this.props.contextArgs\n                }));\n                n += ((((this.props.reshares == 1)) ? \"1 share\" : k._(\"{count} shares\", {\n                    count: this.props.reshares\n                })));\n            }\n        ;\n        ;\n            var o = g.DOM.a({\n                className: \"UFIBlingBox uiBlingBox feedbackBling\",\n                href: this.props.permalink,\n                \"data-ft\": this.props[\"data-ft\"],\n                \"aria-label\": n\n            }, m);\n            if (((this.props.comments < i.defaultPageSize))) {\n                o.props.onClick = this.props.onClick;\n                o.props.rel = \"ignore\";\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFICentralUpdates\", [\"Arbiter\",\"ChannelConstants\",\"LiveTimer\",\"ShortProfiles\",\"UFIConstants\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveTimer\"), j = b(\"ShortProfiles\"), k = b(\"UFIConstants\"), l = b(\"copyProperties\"), m = b(\"tx\"), n = 0, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [];\n    g.subscribe(h.getArbiterType(\"live-data\"), function(x, y) {\n        if (((y && y.obj))) {\n            var z = y.obj, aa = ((z.comments || []));\n            aa.forEach(function(ba) {\n                ba.timestamp.text = \"a few seconds ago\";\n            });\n            w.handleUpdate(k.UFIPayloadSourceType.LIVE_SEND, z);\n        }\n    ;\n    ;\n    });\n    function t() {\n        if (!n) {\n            var x = q, y = o, z = p, aa = r;\n            q = {\n            };\n            o = {\n            };\n            p = {\n            };\n            r = {\n            };\n            if (Object.keys(x).length) {\n                v(\"feedback-id-changed\", x);\n            }\n        ;\n        ;\n            if (Object.keys(y).length) {\n                v(\"feedback-updated\", y);\n            }\n        ;\n        ;\n            if (Object.keys(z).length) {\n                v(\"comments-updated\", z);\n            }\n        ;\n        ;\n            if (Object.keys(aa).length) {\n                v(\"instance-updated\", aa);\n            }\n        ;\n        ;\n            s.pop();\n        }\n    ;\n    ;\n    };\n;\n    function u() {\n        if (s.length) {\n            return s[((s.length - 1))];\n        }\n         else return k.UFIPayloadSourceType.UNKNOWN\n    ;\n    };\n;\n    function v(JSBNG__event, x) {\n        w.inform(JSBNG__event, {\n            updates: x,\n            payloadSource: u()\n        });\n    };\n;\n    var w = l(new g(), {\n        handleUpdate: function(x, y) {\n            if (Object.keys(y).length) {\n                this.synchronizeInforms(function() {\n                    s.push(x);\n                    var z = l({\n                        payloadsource: u()\n                    }, y);\n                    this.inform(\"update-feedback\", z);\n                    this.inform(\"update-comment-lists\", z);\n                    this.inform(\"update-comments\", z);\n                    this.inform(\"update-actions\", z);\n                    ((y.profiles || [])).forEach(function(aa) {\n                        j.set(aa.id, aa);\n                    });\n                    if (y.servertime) {\n                        i.restart(y.servertime);\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        didUpdateFeedback: function(x) {\n            o[x] = true;\n            t();\n        },\n        didUpdateComment: function(x) {\n            p[x] = true;\n            t();\n        },\n        didUpdateFeedbackID: function(x, y) {\n            q[x] = y;\n            t();\n        },\n        didUpdateInstanceState: function(x, y) {\n            if (!r[x]) {\n                r[x] = {\n                };\n            }\n        ;\n        ;\n            r[x][y] = true;\n            t();\n        },\n        synchronizeInforms: function(x) {\n            n++;\n            try {\n                x();\n            } catch (y) {\n                throw y;\n            } finally {\n                n--;\n                t();\n            };\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"ClientIDs\", [\"randomInt\",], function(a, b, c, d, e, f) {\n    var g = b(\"randomInt\"), h = {\n    }, i = {\n        getNewClientID: function() {\n            var j = JSBNG__Date.now(), k = ((((j + \":\")) + ((g(0, 4294967295) + 1))));\n            h[k] = true;\n            return k;\n        },\n        isExistingClientID: function(j) {\n            return !!h[j];\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImmutableObject\", [\"keyMirror\",\"merge\",\"mergeInto\",\"mergeHelpers\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"keyMirror\"), h = b(\"merge\"), i = b(\"mergeInto\"), j = b(\"mergeHelpers\"), k = b(\"throwIf\"), l = j.checkMergeObjectArgs, m = j.isTerminal, n, o;\n    n = g({\n        INVALID_MAP_SET_ARG: null\n    });\n    o = function(q) {\n        i(this, q);\n    };\n    o.set = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        var s = new o(q);\n        i(s, r);\n        return s;\n    };\n    o.setField = function(q, r, s) {\n        var t = {\n        };\n        t[r] = s;\n        return o.set(q, t);\n    };\n    o.setDeep = function(q, r) {\n        k(!((q instanceof o)), n.INVALID_MAP_SET_ARG);\n        return p(q, r);\n    };\n    function p(q, r) {\n        l(q, r);\n        var s = {\n        }, t = Object.keys(q);\n        for (var u = 0; ((u < t.length)); u++) {\n            var v = t[u];\n            if (!r.hasOwnProperty(v)) {\n                s[v] = q[v];\n            }\n             else if (((m(q[v]) || m(r[v])))) {\n                s[v] = r[v];\n            }\n             else s[v] = p(q[v], r[v]);\n            \n        ;\n        ;\n        };\n    ;\n        var w = Object.keys(r);\n        for (u = 0; ((u < w.length)); u++) {\n            var x = w[u];\n            if (q.hasOwnProperty(x)) {\n                continue;\n            }\n        ;\n        ;\n            s[x] = r[x];\n        };\n    ;\n        return ((((((q instanceof o)) || ((r instanceof o)))) ? new o(s) : s));\n    };\n;\n    e.exports = o;\n});\n__d(\"UFIFeedbackTargets\", [\"ClientIDs\",\"KeyedCallbackManager\",\"UFICentralUpdates\",\"UFIConstants\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"KeyedCallbackManager\"), i = b(\"UFICentralUpdates\"), j = b(\"UFIConstants\"), k = b(\"copyProperties\"), l = new h();\n    function m(v) {\n        var w = {\n        };\n        v.forEach(function(x) {\n            var y = k({\n            }, x);\n            delete y.commentlist;\n            delete y.commentcount;\n            w[x.entidentifier] = y;\n            i.didUpdateFeedback(x.entidentifier);\n        });\n        l.addResourcesAndExecute(w);\n    };\n;\n    function n(v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            switch (x.actiontype) {\n              case j.UFIActionType.LIKE_ACTION:\n                p(x);\n                break;\n              case j.UFIActionType.SUBSCRIBE_ACTION:\n                q(x);\n                break;\n              case j.UFIActionType.GIFT_SUGGESTION:\n                r(x);\n                break;\n            };\n        ;\n        };\n    ;\n    };\n;\n    function o(v) {\n        for (var w = 0; ((w < v.length)); w++) {\n            var x = v[w];\n            if (x.orig_ftentidentifier) {\n                t(x.orig_ftentidentifier, x.ftentidentifier);\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewerliked = !!v.hasviewerliked;\n            if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewerliked != w.hasviewerliked))))) {\n                return;\n            }\n        ;\n        ;\n            w.likecount = ((v.likecount || 0));\n            w.likesentences = v.likesentences;\n            if (((v.actorid == w.actorforpost))) {\n                w.hasviewerliked = v.hasviewerliked;\n            }\n             else if (((v.hasviewerliked != w.hasviewerliked))) {\n                w.likesentences = {\n                    current: v.likesentences.alternate,\n                    alternate: v.likesentences.current\n                };\n                if (w.hasviewerliked) {\n                    w.likecount++;\n                }\n                 else w.likecount--;\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (((v.actorid != w.actorforpost))) {\n                w.likesentences.isunseen = true;\n            }\n        ;\n        ;\n            m([w,]);\n        }\n    ;\n    ;\n    };\n;\n    function q(v) {\n        var w = s(v);\n        if (w) {\n            v.hasviewersubscribed = !!v.hasviewersubscribed;\n            if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewersubscribed != w.hasviewersubscribed))))) {\n                return;\n            }\n        ;\n        ;\n            if (((v.actorid == w.actorforpost))) {\n                w.hasviewersubscribed = v.hasviewersubscribed;\n            }\n        ;\n        ;\n            m([w,]);\n        }\n    ;\n    ;\n    };\n;\n    function r(v) {\n        var w = s(v);\n        if (!w) {\n            return;\n        }\n    ;\n    ;\n        if (((((v.clientid && g.isExistingClientID(v.clientid))) && ((v.hasviewerliked != w.hasviewerliked))))) {\n            return;\n        }\n    ;\n    ;\n        w.giftdata = v.giftdata;\n        m([w,]);\n    };\n;\n    function s(v) {\n        if (v.orig_entidentifier) {\n            t(v.orig_entidentifier, v.entidentifier);\n        }\n    ;\n    ;\n        return l.getResource(v.entidentifier);\n    };\n;\n    function t(v, w) {\n        var x = l.getResource(v);\n        if (x) {\n            l.setResource(v, null);\n            x.entidentifier = w;\n            l.setResource(w, x);\n            i.didUpdateFeedbackID(v, w);\n        }\n    ;\n    ;\n    };\n;\n    var u = {\n        getFeedbackTarget: function(v, w) {\n            var x = l.executeOrEnqueue(v, w), y = l.getUnavailableResources(x);\n            y.length;\n            return x;\n        },\n        unsubscribe: function(v) {\n            l.unsubscribe(v);\n        }\n    };\n    i.subscribe(\"update-feedback\", function(v, w) {\n        var x = w.feedbacktargets;\n        if (((x && x.length))) {\n            m(x);\n        }\n    ;\n    ;\n    });\n    i.subscribe(\"update-actions\", function(v, w) {\n        if (((w.actions && w.actions.length))) {\n            n(w.actions);\n        }\n    ;\n    ;\n    });\n    i.subscribe(\"update-comments\", function(v, w) {\n        if (((w.comments && w.comments.length))) {\n            o(w.comments);\n        }\n    ;\n    ;\n    });\n    e.exports = u;\n});\n__d(\"UFIInstanceState\", [\"UFICentralUpdates\",], function(a, b, c, d, e, f) {\n    var g = b(\"UFICentralUpdates\"), h = {\n    };\n    function i(k) {\n        if (!h[k]) {\n            h[k] = {\n            };\n        }\n    ;\n    ;\n    };\n;\n    var j = {\n        getKeyForInstance: function(k, l) {\n            i(k);\n            return h[k][l];\n        },\n        updateState: function(k, l, m) {\n            i(k);\n            h[k][l] = m;\n            g.didUpdateInstanceState(k, l);\n        },\n        updateStateField: function(k, l, m, n) {\n            var o = ((this.getKeyForInstance(k, l) || {\n            }));\n            o[m] = n;\n            this.updateState(k, l, o);\n        }\n    };\n    e.exports = j;\n});\n__d(\"UFIComments\", [\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"UFICentralUpdates\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"URI\",\"keyMirror\",\"merge\",\"randomInt\",\"throwIf\",], function(a, b, c, d, e, f) {\n    var g = b(\"ClientIDs\"), h = b(\"ImmutableObject\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = b(\"UFICentralUpdates\"), m = b(\"UFIConstants\"), n = b(\"UFIFeedbackTargets\"), o = b(\"UFIInstanceState\"), p = b(\"URI\"), q = b(\"keyMirror\"), r = b(\"merge\"), s = b(\"randomInt\"), t = b(\"throwIf\"), u = q({\n        INVALID_COMMENT_TYPE: null\n    }), v = i.create(\"UFIComments\"), w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = \"unavailable_comment_key\";\n    function da(ab) {\n        return ((((ab in ba)) ? ba[ab] : ab));\n    };\n;\n    function ea(ab, bb) {\n        if (!x[ab]) {\n            x[ab] = {\n            };\n        }\n    ;\n    ;\n        if (!x[ab][bb]) {\n            x[ab][bb] = new j();\n        }\n    ;\n    ;\n        return x[ab][bb];\n    };\n;\n    function fa(ab) {\n        var bb = [];\n        if (x[ab]) {\n            {\n                var fin95keys = ((window.top.JSBNG_Replay.forInKeys)((x[ab]))), fin95i = (0);\n                var cb;\n                for (; (fin95i < fin95keys.length); (fin95i++)) {\n                    ((cb) = (fin95keys[fin95i]));\n                    {\n                        bb.push(x[ab][cb]);\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        return bb;\n    };\n;\n    function ga(ab) {\n        if (!y[ab]) {\n            y[ab] = new j();\n        }\n    ;\n    ;\n        return y[ab];\n    };\n;\n    function ha(ab) {\n        var bb = fa(ab);\n        bb.forEach(function(cb) {\n            cb.reset();\n        });\n    };\n;\n    function ia(ab, bb) {\n        ab.forEach(function(cb) {\n            var db = cb.ftentidentifier, eb = ((cb.parentcommentid || db));\n            n.getFeedbackTarget(db, function(fb) {\n                var gb = m.UFIPayloadSourceType, hb = cb.clientid, ib = false, jb = r({\n                }, cb);\n                if (hb) {\n                    delete jb.clientid;\n                    ib = g.isExistingClientID(hb);\n                    if (((ib && ba[hb]))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (((((((bb === gb.LIVE_SEND)) && cb.parentcommentid)) && ((z[eb] === undefined))))) {\n                    return;\n                }\n            ;\n            ;\n                if (((((((((bb === gb.LIVE_SEND)) || ((bb === gb.USER_ACTION)))) || ((bb === gb.ENDPOINT_ADD_COMMENT)))) || ((bb === gb.ENDPOINT_EDIT_COMMENT))))) {\n                    jb.isunseen = true;\n                }\n            ;\n            ;\n                if (((((bb === gb.ENDPOINT_COMMENT_FETCH)) || ((bb === gb.ENDPOINT_ID_COMMENT_FETCH))))) {\n                    jb.fromfetch = true;\n                }\n            ;\n            ;\n                if (ib) {\n                    if (w[hb].ufiinstanceid) {\n                        o.updateStateField(w[hb].ufiinstanceid, \"locallycomposed\", cb.id, true);\n                    }\n                ;\n                ;\n                    jb.ufiinstanceid = w[hb].ufiinstanceid;\n                    ba[hb] = cb.id;\n                    w[cb.id] = w[hb];\n                    delete w[hb];\n                    l.didUpdateComment(hb);\n                }\n            ;\n            ;\n                var kb, lb;\n                if (cb.parentcommentid) {\n                    lb = [ga(eb),];\n                }\n                 else lb = fa(eb);\n            ;\n            ;\n                var mb = false;\n                lb.forEach(function(qb) {\n                    var rb = qb.getAllResources(), sb = {\n                    };\n                    {\n                        var fin96keys = ((window.top.JSBNG_Replay.forInKeys)((rb))), fin96i = (0);\n                        var tb;\n                        for (; (fin96i < fin96keys.length); (fin96i++)) {\n                            ((tb) = (fin96keys[fin96i]));\n                            {\n                                var ub = rb[tb];\n                                sb[ub] = tb;\n                            };\n                        };\n                    };\n                ;\n                    if (ib) {\n                        if (((hb in sb))) {\n                            sb[cb.id] = sb[hb];\n                            var vb = sb[hb];\n                            qb.setResource(vb, cb.id);\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    if (sb[cb.id]) {\n                        mb = true;\n                    }\n                     else {\n                        var wb = ((z[eb] || 0));\n                        sb[cb.id] = wb;\n                        qb.setResource(wb, cb.id);\n                    }\n                ;\n                ;\n                    kb = sb[cb.id];\n                });\n                if (!mb) {\n                    var nb = ((z[eb] || 0));\n                    z[eb] = ((nb + 1));\n                    qa(eb);\n                }\n            ;\n            ;\n                if (((cb.JSBNG__status === m.UFIStatus.FAILED_ADD))) {\n                    aa[eb] = ((aa[eb] + 1));\n                }\n            ;\n            ;\n                var ob = z[eb];\n                jb.replycount = ((((z[cb.id] || 0)) - ((aa[cb.id] || 0))));\n                var pb = ja(kb, ob);\n                if (((cb.parentcommentid && w[cb.parentcommentid]))) {\n                    jb.permalink = p(fb.permalink).addQueryData({\n                        comment_id: w[cb.parentcommentid].legacyid,\n                        reply_comment_id: cb.legacyid,\n                        total_comments: ob\n                    }).toString();\n                }\n                 else jb.permalink = p(fb.permalink).addQueryData({\n                    comment_id: cb.legacyid,\n                    offset: pb,\n                    total_comments: ob\n                }).toString();\n            ;\n            ;\n                za.setComment(cb.id, new h(jb));\n                l.didUpdateComment(cb.id);\n                l.didUpdateFeedback(db);\n            });\n        });\n    };\n;\n    function ja(ab, bb) {\n        return ((Math.floor(((((((bb - ab)) - 1)) / m.defaultPageSize))) * m.defaultPageSize));\n    };\n;\n    function ka(ab) {\n        for (var bb = 0; ((bb < ab.length)); bb++) {\n            var cb = ab[bb];\n            switch (cb.actiontype) {\n              case m.UFIActionType.COMMENT_LIKE:\n                na(cb);\n                break;\n              case m.UFIActionType.DELETE_COMMENT:\n                ra(cb);\n                break;\n              case m.UFIActionType.LIVE_DELETE_COMMENT:\n                sa(cb);\n                break;\n              case m.UFIActionType.UNDO_DELETE_COMMENT:\n                ta(cb);\n                break;\n              case m.UFIActionType.REMOVE_PREVIEW:\n                ua(cb);\n                break;\n              case m.UFIActionType.COMMENT_SET_SPAM:\n                va(cb);\n                break;\n              case m.UFIActionType.CONFIRM_COMMENT_REMOVAL:\n                wa(cb);\n                break;\n              case m.UFIActionType.TRANSLATE_COMMENT:\n                oa(cb);\n                break;\n            };\n        ;\n        };\n    ;\n    };\n;\n    function la(ab, bb, cb) {\n        var db = bb.range, eb = bb.values;\n        if (!db) {\n            v.error(\"nullrange\", {\n                target: ab,\n                commentList: bb\n            });\n            return;\n        }\n    ;\n    ;\n        var fb = {\n        };\n        for (var gb = 0; ((gb < db.length)); gb++) {\n            fb[((db.offset + gb))] = ((eb[gb] || ca));\n        ;\n        };\n    ;\n        var hb, ib;\n        if (cb) {\n            hb = ea(ab, cb);\n            ib = ab;\n        }\n         else {\n            hb = ga(ab);\n            ib = bb.ftentidentifier;\n            if (((bb.count !== undefined))) {\n                z[ab] = bb.count;\n                aa[ab] = 0;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        hb.addResourcesAndExecute(fb);\n        l.didUpdateFeedback(ib);\n    };\n;\n    function ma(ab) {\n        ab.forEach(function(bb) {\n            z[bb.entidentifier] = bb.commentcount;\n            aa[bb.entidentifier] = 0;\n            l.didUpdateFeedback(bb.entidentifier);\n        });\n    };\n;\n    function na(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (bb) {\n            var cb = {\n            }, db = ((ab.clientid && g.isExistingClientID(ab.clientid)));\n            if (!db) {\n                cb.hasviewerliked = ab.viewerliked;\n                cb.likecount = ab.likecount;\n            }\n        ;\n        ;\n            cb.likeconfirmhash = s(0, 1024);\n            ya(ab.commentid, cb);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ab) {\n        var bb = ab.commentid, cb = za.getComment(ab.commentid);\n        if (cb) {\n            ya(bb, {\n                translatedtext: ab.translatedtext\n            });\n        }\n    ;\n    ;\n    };\n;\n    function pa(ab) {\n        var bb = {\n            reportLink: ab.reportLink,\n            commenterIsFOF: ab.commenterIsFOF,\n            userIsMinor: ab.userIsMinor\n        };\n        if (ab.undoData) {\n            bb.undoData = ab.undoData;\n        }\n    ;\n    ;\n        return bb;\n    };\n;\n    function qa(ab, bb) {\n        if (ab) {\n            if (((bb !== undefined))) {\n                var cb = ((((aa[ab] || 0)) + ((bb ? 1 : -1))));\n                aa[ab] = Math.max(cb, 0);\n            }\n        ;\n        ;\n            var db = za.getComment(ab);\n            if (db) {\n                var eb = {\n                    replycount: za.getDisplayedCommentCount(ab)\n                };\n                ya(ab, eb);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ra(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb.JSBNG__status !== m.UFIStatus.DELETED))) {\n            var cb = ((bb.parentcommentid || bb.ftentidentifier));\n            if (((bb.JSBNG__status === m.UFIStatus.FAILED_ADD))) {\n                qa(cb);\n            }\n             else qa(cb, true);\n        ;\n        ;\n        }\n    ;\n    ;\n        xa(bb, m.UFIStatus.DELETED);\n    };\n;\n    function sa(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb && ((bb.JSBNG__status !== m.UFIStatus.DELETED))))) {\n            xa(bb, m.UFIStatus.LIVE_DELETED);\n        }\n    ;\n    ;\n    };\n;\n    function ta(ab) {\n        var bb = za.getComment(ab.commentid);\n        if (((bb.JSBNG__status === m.UFIStatus.DELETED))) {\n            var cb = ((bb.parentcommentid || bb.ftentidentifier));\n            qa(cb, false);\n        }\n    ;\n    ;\n        xa(bb, m.UFIStatus.PENDING_UNDO_DELETE);\n    };\n;\n    function ua(ab) {\n        ya(ab.commentid, {\n            attachment: null\n        });\n    };\n;\n    function va(ab) {\n        var bb = za.getComment(ab.commentid), cb = ((ab.shouldHideAsSpam ? m.UFIStatus.SPAM_DISPLAY : null));\n        xa(bb, cb);\n    };\n;\n    function wa(ab) {\n        ya(ab.commentid, pa(ab));\n    };\n;\n    function xa(ab, bb) {\n        ya(ab.id, {\n            priorstatus: ab.JSBNG__status,\n            JSBNG__status: bb\n        });\n    };\n;\n    function ya(ab, bb) {\n        var cb = ((za.getComment(ab) || new h({\n        })));\n        za.setComment(ab, h.set(cb, bb));\n        l.didUpdateComment(cb.id);\n        l.didUpdateFeedback(cb.ftentidentifier);\n    };\n;\n    var za = {\n        getComments: function(ab) {\n            var bb = {\n            };\n            for (var cb = 0; ((cb < ab.length)); cb++) {\n                bb[ab[cb]] = za.getComment(ab[cb]);\n            ;\n            };\n        ;\n            return bb;\n        },\n        getComment: function(ab) {\n            return w[da(ab)];\n        },\n        setComment: function(ab, bb) {\n            w[da(ab)] = bb;\n        },\n        resetFeedbackTarget: function(ab) {\n            var bb = fa(ab), cb = {\n            };\n            bb.forEach(function(eb) {\n                var fb = eb.getAllResources();\n                {\n                    var fin97keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin97i = (0);\n                    var gb;\n                    for (; (fin97i < fin97keys.length); (fin97i++)) {\n                        ((gb) = (fin97keys[fin97i]));\n                        {\n                            var hb = fb[gb];\n                            cb[hb] = 1;\n                        };\n                    };\n                };\n            ;\n            });\n            {\n                var fin98keys = ((window.top.JSBNG_Replay.forInKeys)((cb))), fin98i = (0);\n                var db;\n                for (; (fin98i < fin98keys.length); (fin98i++)) {\n                    ((db) = (fin98keys[fin98i]));\n                    {\n                        delete w[da(db)];\n                    ;\n                    };\n                };\n            };\n        ;\n            ha(ab);\n        },\n        getCommentsInRange: function(ab, bb, cb, db, eb) {\n            var fb = ea(ab, cb);\n            n.getFeedbackTarget(ab, function(gb) {\n                var hb = [];\n                for (var ib = 0; ((ib < bb.length)); ib++) {\n                    hb.push(((bb.offset + ib)));\n                ;\n                };\n            ;\n                var jb = function(pb) {\n                    var qb = [], rb = bb.offset, sb = ((((bb.offset + bb.length)) - 1));\n                    for (var tb = 0; ((tb < bb.length)); tb++) {\n                        var ub = ((gb.isranked ? ((sb - tb)) : ((rb + tb))));\n                        if (((pb[ub] != ca))) {\n                            var vb = this.getComment(pb[ub]);\n                            if (vb) {\n                                qb.push(vb);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    eb(qb);\n                }, kb = fb.getUnavailableResourcesFromRequest(hb);\n                if (kb.length) {\n                    var lb = Math.min.apply(Math, kb), mb = Math.max.apply(Math, kb), nb = lb, ob = ((((mb - lb)) + 1));\n                    k.trySend(\"/ajax/ufi/comment_fetch.php\", {\n                        ft_ent_identifier: gb.entidentifier,\n                        viewas: db,\n                        source: null,\n                        offset: nb,\n                        length: ob,\n                        orderingmode: cb\n                    });\n                }\n                 else fb.deferredExecuteOrEnqueue(hb).addCallback(jb, this);\n            ;\n            ;\n            }.bind(this));\n        },\n        getRepliesInRanges: function(ab, bb, cb) {\n            var db = {\n            }, eb = {\n            }, fb = {\n            }, gb = false;\n            n.getFeedbackTarget(ab, function(hb) {\n                {\n                    var fin99keys = ((window.top.JSBNG_Replay.forInKeys)((bb))), fin99i = (0);\n                    var ib;\n                    for (; (fin99i < fin99keys.length); (fin99i++)) {\n                        ((ib) = (fin99keys[fin99i]));\n                        {\n                            var jb = ga(ib), kb = bb[ib], lb = [];\n                            for (var mb = 0; ((mb < kb.length)); mb++) {\n                                lb.push(((kb.offset + mb)));\n                            ;\n                            };\n                        ;\n                            db[ib] = jb.executeOrEnqueue(lb, function(wb) {\n                                var xb = [];\n                                for (var yb = 0; ((yb < kb.length)); yb++) {\n                                    var zb = ((kb.offset + yb));\n                                    if (((wb[zb] != ca))) {\n                                        var ac = this.getComment(wb[zb]);\n                                        if (ac) {\n                                            xb.push(ac);\n                                        }\n                                    ;\n                                    ;\n                                    }\n                                ;\n                                ;\n                                };\n                            ;\n                                eb[ib] = xb;\n                            }.bind(this));\n                            fb[ib] = jb.getUnavailableResources(db[ib]);\n                            if (fb[ib].length) {\n                                gb = true;\n                                jb.unsubscribe(db[ib]);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (!gb) {\n                    cb(eb);\n                }\n                 else {\n                    var nb = [], ob = [], pb = [];\n                    {\n                        var fin100keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin100i = (0);\n                        var qb;\n                        for (; (fin100i < fin100keys.length); (fin100i++)) {\n                            ((qb) = (fin100keys[fin100i]));\n                            {\n                                var rb = fb[qb];\n                                if (rb.length) {\n                                    var sb = Math.min.apply(Math, rb), tb = Math.max.apply(Math, rb), ub = sb, vb = ((((tb - sb)) + 1));\n                                    nb.push(qb);\n                                    ob.push(ub);\n                                    pb.push(vb);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    k.trySend(\"/ajax/ufi/reply_fetch.php\", {\n                        ft_ent_identifier: hb.entidentifier,\n                        parent_comment_ids: nb,\n                        source: null,\n                        offsets: ob,\n                        lengths: pb\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return db;\n        },\n        getCommentCount: function(ab) {\n            return ((z[ab] || 0));\n        },\n        getDeletedCount: function(ab) {\n            return ((aa[ab] || 0));\n        },\n        getDisplayedCommentCount: function(ab) {\n            return ((((z[ab] || 0)) - ((aa[ab] || 0))));\n        },\n        _dump: function() {\n            var ab = {\n                _comments: w,\n                _commentLists: x,\n                _replyLists: y,\n                _commentCounts: z,\n                _deletedCounts: aa,\n                _localIDMap: ba\n            };\n            return JSON.stringify(ab);\n        }\n    };\n    k.registerEndpoints({\n        \"/ajax/ufi/comment_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/reply_fetch.php\": {\n            mode: k.IMMEDIATE,\n            handler: l.handleUpdate.bind(l, m.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH)\n        }\n    });\n    l.subscribe(\"update-comments\", function(ab, bb) {\n        if (((bb.comments && bb.comments.length))) {\n            ia(bb.comments, bb.payloadsource);\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-actions\", function(ab, bb) {\n        if (((bb.actions && bb.actions.length))) {\n            ka(bb.actions);\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-comment-lists\", function(ab, bb) {\n        var cb = bb.commentlists;\n        if (((cb && Object.keys(cb).length))) {\n            if (cb.comments) {\n                {\n                    var fin101keys = ((window.top.JSBNG_Replay.forInKeys)((cb.comments))), fin101i = (0);\n                    var db;\n                    for (; (fin101i < fin101keys.length); (fin101i++)) {\n                        ((db) = (fin101keys[fin101i]));\n                        {\n                            {\n                                var fin102keys = ((window.top.JSBNG_Replay.forInKeys)((cb.comments[db]))), fin102i = (0);\n                                var eb;\n                                for (; (fin102i < fin102keys.length); (fin102i++)) {\n                                    ((eb) = (fin102keys[fin102i]));\n                                    {\n                                        la(db, cb.comments[db][eb], eb);\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            if (cb.replies) {\n                {\n                    var fin103keys = ((window.top.JSBNG_Replay.forInKeys)((cb.replies))), fin103i = (0);\n                    var fb;\n                    for (; (fin103i < fin103keys.length); (fin103i++)) {\n                        ((fb) = (fin103keys[fin103i]));\n                        {\n                            la(fb, cb.replies[fb]);\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-feedback\", function(ab, bb) {\n        var cb = bb.feedbacktargets;\n        if (((cb && cb.length))) {\n            ma(cb);\n        }\n    ;\n    ;\n    });\n    e.exports = za;\n});\n__d(\"UFILikeLink.react\", [\"React\",\"TrackingNodes\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"tx\"), j = g.createClass({\n        displayName: \"UFILikeLink\",\n        render: function() {\n            var k = ((this.props.likeAction ? \"Like\" : \"Unlike\")), l = h.getTrackingInfo(((this.props.likeAction ? h.types.LIKE_LINK : h.types.UNLIKE_LINK))), m = ((this.props.likeAction ? \"Like this\" : \"Unlike this\"));\n            return (g.DOM.a({\n                className: \"UFILikeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: m,\n                onClick: this.props.onClick,\n                \"data-ft\": l\n            }, k));\n        }\n    });\n    e.exports = j;\n});\n__d(\"UFISubscribeLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFISubscribeLink\",\n        render: function() {\n            var j = ((this.props.subscribeAction ? \"Follow Post\" : \"Unfollow Post\")), k = ((this.props.subscribeAction ? \"Get notified when someone comments\" : \"Stop getting notified when someone comments\"));\n            return (g.DOM.a({\n                className: \"UFISubscribeLink\",\n                href: \"#\",\n                role: \"button\",\n                \"aria-live\": \"polite\",\n                title: k,\n                onClick: this.props.onClick\n            }, j));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFITimelineBlingBox.react\", [\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIBlingItem.react\",\"URI\",\"cx\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"ProfileBrowserLink\"), h = b(\"ProfileBrowserTypes\"), i = b(\"React\"), j = b(\"UFIBlingItem.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"fbt\"), n = i.createClass({\n        displayName: \"UFITimelineBlingBox\",\n        render: function() {\n            var o = [];\n            if (((this.props.likes && this.props.enableShowLikes))) {\n                var p = this._getProfileBrowserURI(), q = \"See who likes this\", r = i.DOM.a({\n                    ajaxify: p.dialog,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-gt\": this.props[\"data-gt\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    \"data-tooltip-uri\": this._getLikeToolTipURI(),\n                    href: p.page,\n                    rel: \"dialog\",\n                    role: \"button\",\n                    title: q\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.likes,\n                    iconClassName: \"UFIBlingBoxTimelineLikeIcon\"\n                }));\n                o.push(r);\n            }\n        ;\n        ;\n            if (((this.props.comments && this.props.enableShowComments))) {\n                var s = \"Show comments\", t = i.DOM.a({\n                    \"aria-label\": s,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: \"#\",\n                    onClick: this.props.commentOnClick\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.comments,\n                    iconClassName: \"UFIBlingBoxTimelineCommentIcon\"\n                }));\n                o.push(t);\n            }\n        ;\n        ;\n            if (this.props.reshares) {\n                var u = \"Show shares\", v = this._getShareViewURI(), w = i.DOM.a({\n                    ajaxify: v.dialog,\n                    \"aria-label\": u,\n                    className: this._getItemClassName(o),\n                    \"data-ft\": this.props[\"data-ft\"],\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"right\",\n                    href: v.page,\n                    rel: \"async\"\n                }, j({\n                    contextArgs: this.props.contextArgs,\n                    count: this.props.reshares,\n                    iconClassName: \"UFIBlingBoxTimelineReshareIcon\"\n                }));\n                o.push(w);\n            }\n        ;\n        ;\n            return (i.DOM.span(null, o));\n        },\n        _getItemClassName: function(o) {\n            return ((((((o.length > 0)) ? \"mls\" : \"\")) + ((\" \" + \"UFIBlingBoxTimelineItem\"))));\n        },\n        _getLikeToolTipURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/timeline/likestooltip.php\").setQueryData({\n                    obj_fbid: this.props.feedbackFBID\n                });\n                return o.toString();\n            }\n             else return null\n        ;\n        },\n        _getProfileBrowserURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = h.LIKES, p = {\n                    id: this.props.feedbackFBID\n                }, q = g.constructDialogURI(o, p), r = g.constructPageURI(o, p), s = {\n                    dialog: q.toString(),\n                    page: r.toString()\n                };\n                return s;\n            }\n        ;\n        ;\n        },\n        _getShareViewURI: function() {\n            if (this.props.feedbackFBID) {\n                var o = new k(\"/ajax/shares/view\").setQueryData({\n                    target_fbid: this.props.feedbackFBID\n                }), p = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: this.props.feedbackFBID\n                }), q = {\n                    dialog: o.toString(),\n                    page: p.toString()\n                };\n                return q;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"UFIUserActions\", [\"AsyncResponse\",\"CLoggerX\",\"ClientIDs\",\"ImmutableObject\",\"JSLogger\",\"Nectar\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"MercuryServerDispatcher\",\"collectDataAttributes\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncResponse\"), h = b(\"CLoggerX\"), i = b(\"ClientIDs\"), j = b(\"ImmutableObject\"), k = b(\"JSLogger\"), l = b(\"Nectar\"), m = b(\"UFICentralUpdates\"), n = b(\"UFIComments\"), o = b(\"UFIConstants\"), p = b(\"UFIFeedbackTargets\"), q = b(\"MercuryServerDispatcher\"), r = b(\"collectDataAttributes\"), s = b(\"copyProperties\"), t = b(\"tx\"), u = k.create(\"UFIUserActions\"), v = {\n        BAN: \"ban\",\n        UNDO_BAN: \"undo_ban\"\n    }, w = {\n        changeCommentLike: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (((na.hasviewerliked != la))) {\n                var oa = x(ma.target), pa = ((la ? 1 : -1)), qa = {\n                    commentid: ka,\n                    actiontype: o.UFIActionType.COMMENT_LIKE,\n                    viewerliked: la,\n                    likecount: ((na.likecount + pa))\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [qa,]\n                });\n                q.trySend(\"/ajax/ufi/comment_like.php\", s({\n                    comment_id: ka,\n                    legacy_id: na.legacyid,\n                    like_action: la,\n                    ft_ent_identifier: na.ftentidentifier,\n                    source: ma.source,\n                    client_id: i.getNewClientID()\n                }, oa));\n            }\n        ;\n        ;\n        },\n        addComment: function(ka, la, ma, na) {\n            p.getFeedbackTarget(ka, function(oa) {\n                var pa = x(na.target), qa = i.getNewClientID();\n                if (!oa.actorforpost) {\n                    return;\n                }\n            ;\n            ;\n                var ra = {\n                    ftentidentifier: ka,\n                    body: {\n                        text: la\n                    },\n                    author: oa.actorforpost,\n                    id: qa,\n                    islocal: true,\n                    ufiinstanceid: na.ufiinstanceid,\n                    likecount: 0,\n                    hasviewerliked: false,\n                    parentcommentid: na.replyid,\n                    photo_comment: na.attachedphoto,\n                    timestamp: {\n                        time: JSBNG__Date.now(),\n                        text: \"a few seconds ago\"\n                    }\n                }, sa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: oa.actorforpost,\n                    hasviewersubscribed: true,\n                    entidentifier: ka\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    comments: [ra,],\n                    actions: [sa,]\n                });\n                var ta = null;\n                if (na.replyid) {\n                    ta = (n.getComment(na.replyid)).fbid;\n                }\n            ;\n            ;\n                var ua = h.getCLParamsForTarget(na.target, ta);\n                q.trySend(\"/ajax/ufi/add_comment.php\", s({\n                    ft_ent_identifier: oa.entidentifier,\n                    comment_text: ma,\n                    source: na.source,\n                    client_id: qa,\n                    reply_fbid: ta,\n                    parent_comment_id: na.replyid,\n                    timeline_log_data: na.timelinelogdata,\n                    rootid: na.rootid,\n                    clp: ua,\n                    attached_photo_fbid: ((na.attachedphoto ? na.attachedphoto.fbid : 0)),\n                    giftoccasion: na.giftoccasion\n                }, pa));\n            });\n        },\n        editComment: function(ka, la, ma, na) {\n            var oa = x(na.target), pa = n.getComment(ka);\n            pa = j.set(pa, {\n                JSBNG__status: o.UFIStatus.PENDING_EDIT,\n                body: {\n                    text: la\n                },\n                timestamp: {\n                    time: JSBNG__Date.now(),\n                    text: \"a few seconds ago\"\n                },\n                originalTimestamp: pa.timestamp.time,\n                editnux: null,\n                attachment: null\n            });\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                comments: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/edit_comment.php\", s({\n                ft_ent_identifier: pa.ftentidentifier,\n                comment_text: ma,\n                source: na.source,\n                comment_id: pa.id,\n                parent_comment_id: pa.parentcommentid,\n                attached_photo_fbid: ((na.attachedPhoto ? na.attachedPhoto.fbid : 0))\n            }, oa));\n        },\n        translateComment: function(ka, la) {\n            q.trySend(\"/ajax/ufi/translate_comment.php\", {\n                ft_ent_identifier: ka.ftentidentifier,\n                comment_ids: [ka.id,],\n                source: la.source\n            });\n        },\n        setHideAsSpam: function(ka, la, ma) {\n            var na = x(ma.target), oa = n.getComment(ka), pa = {\n                commentid: ka,\n                actiontype: o.UFIActionType.COMMENT_SET_SPAM,\n                shouldHideAsSpam: la\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            q.trySend(\"/ajax/ufi/comment_spam.php\", s({\n                comment_id: ka,\n                spam_action: la,\n                ft_ent_identifier: oa.ftentidentifier,\n                source: ma.source\n            }, na));\n        },\n        removeComment: function(ka, la) {\n            var ma = x(la.target), na = n.getComment(ka), oa = {\n                actiontype: o.UFIActionType.DELETE_COMMENT,\n                commentid: ka,\n                oneclick: la.oneclick\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [oa,]\n            });\n            q.trySend(\"/ajax/ufi/delete_comment.php\", s({\n                comment_id: na.id,\n                comment_legacyid: na.legacyid,\n                ft_ent_identifier: na.ftentidentifier,\n                one_click: la.oneclick,\n                source: la.source,\n                client_id: i.getNewClientID(),\n                timeline_log_data: la.timelinelogdata\n            }, ma));\n        },\n        undoRemoveComment: function(ka, la, ma) {\n            var na = n.getComment(ka);\n            if (!na.undoData) {\n                u.error(\"noundodata\", {\n                    comment: ka\n                });\n                return;\n            }\n        ;\n        ;\n            var oa = x(ma.target), pa = {\n                actiontype: o.UFIActionType.UNDO_DELETE_COMMENT,\n                commentid: ka\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n            var qa = na.undoData;\n            qa.page_admin = la;\n            var ra = s(oa, qa);\n            q.trySend(\"/ajax/ufi/undo_delete_comment.php\", ra);\n        },\n        banUser: function(ka, la, ma, na) {\n            var oa = ((ma ? v.BAN : v.UNDO_BAN));\n            q.trySend(\"/ajax/ufi/ban_user.php\", {\n                page_id: la,\n                commenter_id: ka.author,\n                action: oa,\n                comment_id: ka.id,\n                client_side: true\n            });\n        },\n        changeLike: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if (((na.hasviewerliked !== la))) {\n                    var pa = ((la ? 1 : -1)), qa = {\n                        actiontype: o.UFIActionType.LIKE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewerliked: la,\n                        likecount: ((na.likecount + pa)),\n                        entidentifier: ka,\n                        likesentences: {\n                            current: na.likesentences.alternate,\n                            alternate: na.likesentences.current\n                        }\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [qa,]\n                    });\n                    q.trySend(\"/ajax/ufi/like.php\", s({\n                        like_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        giftoccasion: ma.giftoccasion\n                    }, oa));\n                }\n            ;\n            ;\n            });\n        },\n        changeSubscribe: function(ka, la, ma) {\n            p.getFeedbackTarget(ka, function(na) {\n                var oa = x(ma.target);\n                if (((na.hasviewersubscribed !== la))) {\n                    var pa = {\n                        actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                        actorid: na.actorforpost,\n                        hasviewersubscribed: la,\n                        entidentifier: ka\n                    };\n                    m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                        actions: [pa,]\n                    });\n                    q.trySend(\"/ajax/ufi/subscribe.php\", s({\n                        subscribe_action: la,\n                        ft_ent_identifier: ka,\n                        source: ma.source,\n                        client_id: i.getNewClientID(),\n                        rootid: ma.rootid,\n                        comment_expand_mode: ma.commentexpandmode\n                    }, oa));\n                }\n            ;\n            ;\n            });\n        },\n        fetchSpamComments: function(ka, la, ma, na) {\n            q.trySend(\"/ajax/ufi/id_comment_fetch.php\", {\n                ft_ent_identifier: ka,\n                viewas: na,\n                comment_ids: la,\n                parent_comment_id: ma,\n                source: null\n            });\n        },\n        removePreview: function(ka, la) {\n            var ma = x(la.target), na = {\n                commentid: ka.id,\n                actiontype: o.UFIActionType.REMOVE_PREVIEW\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [na,]\n            });\n            q.trySend(\"/ajax/ufi/remove_preview.php\", s({\n                comment_id: ka.id,\n                ft_ent_identifier: ka.ftentidentifier,\n                source: la.source\n            }, ma));\n        }\n    };\n    function x(ka) {\n        if (!ka) {\n            return {\n                ft: {\n                }\n            };\n        }\n    ;\n    ;\n        var la = {\n            ft: r(ka, [\"ft\",]).ft\n        };\n        l.addModuleData(la, ka);\n        return la;\n    };\n;\n    function y(ka) {\n        var la = ka.request.data;\n        g.defaultErrorHandler(ka);\n        var ma = ((la.client_id || la.comment_id)), na = n.getComment(ma), oa = ((((na.JSBNG__status === o.UFIStatus.PENDING_EDIT)) ? o.UFIStatus.FAILED_EDIT : o.UFIStatus.FAILED_ADD));\n        na = j.setDeep(na, {\n            JSBNG__status: oa,\n            allowRetry: z(ka),\n            body: {\n                mentionstext: la.comment_text\n            }\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n;\n    function z(ka) {\n        var la = ka.getError();\n        if (((la === 1404102))) {\n            return false;\n        }\n    ;\n    ;\n        if (ka.silentError) {\n            return true;\n        }\n    ;\n    ;\n        if (((((la === 1357012)) || ((la === 1357006))))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function aa(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        na = j.set(na, {\n            JSBNG__status: ((na.priorstatus || null)),\n            priorstatus: undefined\n        });\n        m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n            comments: [na,]\n        });\n    };\n;\n    function ba(ka) {\n        var la = ka.request.data, ma = la.comment_id, na = n.getComment(ma);\n        if (((la.like_action === na.hasviewerliked))) {\n            var oa = ((na.hasviewerliked ? -1 : 1)), pa = {\n                commentid: ma,\n                actiontype: o.UFIActionType.COMMENT_LIKE,\n                viewerliked: !na.hasviewerliked,\n                likecount: ((na.likecount + oa))\n            };\n            m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                actions: [pa,]\n            });\n        }\n    ;\n    ;\n        g.defaultErrorHandler(ka);\n    };\n;\n    function ca(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if (((na.hasviewerliked === la.like_action))) {\n                var oa = ((na.hasviewerliked ? -1 : 1)), pa = {\n                    actiontype: o.UFIActionType.LIKE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewerliked: !na.hasviewerliked,\n                    likecount: ((na.likecount + oa)),\n                    entidentifier: ma,\n                    likesentences: {\n                        current: na.likesentences.alternate,\n                        alternate: na.likesentences.current\n                    }\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [pa,]\n                });\n            }\n        ;\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n;\n    function da(ka) {\n        var la = ka.request.data, ma = la.ft_ent_identifier;\n        p.getFeedbackTarget(ma, function(na) {\n            if (((na.hasviewersubscribed === la.subscribe_action))) {\n                var oa = {\n                    actiontype: o.UFIActionType.SUBSCRIBE_ACTION,\n                    actorid: na.actorforpost,\n                    hasviewersubscribed: !na.hasviewersubscribed,\n                    entidentifier: ma\n                };\n                m.handleUpdate(o.UFIPayloadSourceType.USER_ACTION, {\n                    actions: [oa,]\n                });\n            }\n        ;\n        ;\n        });\n        g.defaultErrorHandler(ka);\n    };\n;\n    var ea = function(ka) {\n        return m.handleUpdate.bind(m, ka);\n    }, fa = o.UFIPayloadSourceType;\n    q.registerEndpoints({\n        \"/ajax/ufi/comment_like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_COMMENT_LIKE),\n            error_handler: ba,\n            batch_if: ga,\n            batch_function: ja\n        },\n        \"/ajax/ufi/comment_spam.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_COMMENT_SPAM),\n            error_handler: aa\n        },\n        \"/ajax/ufi/add_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ADD_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/undo_delete_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_UNDO_DELETE_COMMENT),\n            error_handler: aa\n        },\n        \"/ajax/ufi/ban_user.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_BAN)\n        },\n        \"/ajax/ufi/edit_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_EDIT_COMMENT),\n            error_handler: y\n        },\n        \"/ajax/ufi/like.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_LIKE),\n            error_handler: ca,\n            batch_if: ha,\n            batch_function: ja\n        },\n        \"/ajax/ufi/subscribe.php\": {\n            mode: q.BATCH_CONDITIONAL,\n            handler: ea(fa.ENDPOINT_SUBSCRIBE),\n            error_handler: da,\n            batch_if: ia,\n            batch_function: ja\n        },\n        \"/ajax/ufi/id_comment_fetch.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_ID_COMMENT_FETCH)\n        },\n        \"/ajax/ufi/remove_preview.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_REMOVE_PREVIEW)\n        },\n        \"/ajax/ufi/translate_comment.php\": {\n            mode: q.IMMEDIATE,\n            handler: ea(fa.ENDPOINT_TRANSLATE_COMMENT)\n        }\n    });\n    function ga(ka, la) {\n        return ((((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier)))) && ((ka.comment_id == la.comment_id))));\n    };\n;\n    function ha(ka, la) {\n        return ((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier))));\n    };\n;\n    function ia(ka, la) {\n        return ((ka && ((ka.ft_ent_identifier == la.ft_ent_identifier))));\n    };\n;\n    function ja(ka, la) {\n        return la;\n    };\n;\n    e.exports = w;\n});\n__d(\"UFIActionLinkController\", [\"Arbiter\",\"ClickTTIIdentifiers\",\"JSBNG__CSS\",\"DOMQuery\",\"Parent\",\"React\",\"TrackingNodes\",\"UFIBlingBox.react\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFILikeLink.react\",\"UFISubscribeLink.react\",\"UFITimelineBlingBox.react\",\"UFIUserActions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickTTIIdentifiers\"), i = b(\"JSBNG__CSS\"), j = b(\"DOMQuery\"), k = b(\"Parent\"), l = b(\"React\"), m = b(\"TrackingNodes\"), n = b(\"UFIBlingBox.react\"), o = b(\"UFICentralUpdates\"), p = b(\"UFIComments\"), q = b(\"UFIConstants\"), r = b(\"UFIFeedbackTargets\"), s = b(\"UFILikeLink.react\"), t = b(\"UFISubscribeLink.react\"), u = b(\"UFITimelineBlingBox.react\"), v = b(\"UFIUserActions\"), w = b(\"copyProperties\");\n    function x(z, aa, ba) {\n        if (this._root) {\n            throw new Error(((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\")));\n        }\n    ;\n    ;\n        var ca = j.scry(z, aa)[0];\n        if (ca) {\n            var da = JSBNG__document.createElement(\"span\");\n            ca.parentNode.replaceChild(da, ca);\n            da.appendChild(ca);\n            if (((typeof ba === \"function\"))) {\n                ba(da);\n            }\n        ;\n        ;\n        }\n         else var ea = g.subscribe(\"PhotoSnowlift.DATA_CHANGE\", function() {\n            g.unsubscribe(ea);\n            x(z, aa, ba);\n        }, g.SUBSCRIBE_NEW)\n    ;\n    };\n;\n    var y = function(z, aa, ba) {\n        this._id = aa.ftentidentifier;\n        this._ftFBID = ba.targetfbid;\n        this._source = aa.source;\n        this._contextArgs = aa;\n        this._ufiRoot = z;\n        if (this._isSourceProfile(this._contextArgs.source)) {\n            this._attemptInitializeTimelineBling();\n        }\n         else this._attemptInitializeBling();\n    ;\n    ;\n        if (ba.viewercanlike) {\n            this._attemptInitializeLike();\n        }\n    ;\n    ;\n        if (ba.viewercansubscribetopost) {\n            this._attemptInitializeSubscribe();\n        }\n    ;\n    ;\n        o.subscribe(\"feedback-updated\", function(ca, da) {\n            var ea = da.updates;\n            if (((this._id in ea))) {\n                this.render();\n            }\n        ;\n        ;\n        }.bind(this));\n        o.subscribe(\"feedback-id-changed\", function(ca, da) {\n            var ea = da.updates;\n            if (((this._id in ea))) {\n                this._id = ea[this._id];\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n    w(y.prototype, {\n        _attemptInitializeBling: function() {\n            x(this._ufiRoot, \"^form .uiBlingBox\", function(z) {\n                this._blingRoot = z;\n                if (this._dataReady) {\n                    this._renderBling();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _attemptInitializeTimelineBling: function() {\n            if (this._root) {\n                throw new Error(((\"UFIActionLinkController attempted to initialize when a root was\" + \" already present\")));\n            }\n        ;\n        ;\n            var z = j.scry(this._ufiRoot, \"^form .fbTimelineFeedbackActions span\")[0];\n            if (z) {\n                i.addClass(z, \"UFIBlingBoxTimeline\");\n                var aa = j.scry(z, \".fbTimelineFeedbackLikes\")[0];\n                this._enableShowLikes = ((aa ? true : false));\n                var ba = j.scry(z, \".fbTimelineFeedbackComments\")[0];\n                this._enableShowComments = ((ba ? true : false));\n            }\n        ;\n        ;\n            this._blingTimelineRoot = z;\n            if (this._dataReady) {\n                this._renderTimelineBling();\n            }\n        ;\n        ;\n        },\n        _attemptInitializeLike: function() {\n            x(this._ufiRoot, \"^form .like_link\", function(z) {\n                this._likeRoot = z;\n                if (this._dataReady) {\n                    this._renderLike();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _attemptInitializeSubscribe: function() {\n            x(this._ufiRoot, \"^form .unsub_link\", function(z) {\n                this._subscribeRoot = z;\n                if (this._dataReady) {\n                    this._renderSubscribe();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        render: function() {\n            this._dataReady = true;\n            if (this._isSourceProfile(this._contextArgs.source)) {\n                this._renderTimelineBling();\n            }\n             else this._renderBling();\n        ;\n        ;\n            this._renderLike();\n            this._renderSubscribe();\n        },\n        _renderBling: function() {\n            if (this._blingRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = function(JSBNG__event) {\n                        var da = k.byTag(JSBNG__event.target, \"form\");\n                        i.toggleClass(da, \"collapsed_comments\");\n                        i.toggleClass(da, \"hidden_add_comment\");\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ba = m.getTrackingInfo(m.types.BLINGBOX), ca = n({\n                        likes: z.likecount,\n                        comments: p.getDisplayedCommentCount(this._id),\n                        reshares: z.sharecount,\n                        permalink: z.permalink,\n                        contextArgs: this._contextArgs,\n                        onClick: aa,\n                        \"data-ft\": ba\n                    });\n                    this._blingBox = l.renderComponent(ca, this._blingRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderTimelineBling: function() {\n            if (this._blingTimelineRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = m.getTrackingInfo(m.types.BLINGBOX), ba = h.getUserActionID(h.types.TIMELINE_SEE_LIKERS), ca = function(JSBNG__event) {\n                        var ea = k.byTag(JSBNG__event.target, \"form\");\n                        i.removeClass(ea, \"collapsed_comments\");\n                        var fa = j.scry(ea, \"a.UFIPagerLink\");\n                        if (fa.length) {\n                            fa[0].click();\n                        }\n                    ;\n                    ;\n                        JSBNG__event.preventDefault();\n                    }.bind(this), da = u({\n                        comments: p.getDisplayedCommentCount(this._id),\n                        commentOnClick: ca,\n                        contextArgs: this._contextArgs,\n                        \"data-ft\": aa,\n                        \"data-gt\": ba,\n                        enableShowComments: this._enableShowComments,\n                        enableShowLikes: this._enableShowLikes,\n                        feedbackFBID: this._ftFBID,\n                        likes: z.likecount,\n                        reshares: z.sharecount\n                    });\n                    l.renderComponent(da, this._blingTimelineRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderLike: function() {\n            if (this._likeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewerliked, ba = function(JSBNG__event) {\n                        v.changeLike(this._id, aa, {\n                            source: this._source,\n                            target: JSBNG__event.target,\n                            rootid: this._contextArgs.rootid,\n                            giftoccasion: this._contextArgs.giftoccasion\n                        });\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ca = s({\n                        onClick: ba,\n                        likeAction: aa\n                    });\n                    this._likeLink = l.renderComponent(ca, this._likeRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _renderSubscribe: function() {\n            if (this._subscribeRoot) {\n                r.getFeedbackTarget(this._id, function(z) {\n                    var aa = !z.hasviewersubscribed, ba = function(JSBNG__event) {\n                        v.changeSubscribe(this._id, aa, {\n                            source: this._source,\n                            target: JSBNG__event.target,\n                            rootid: this._contextArgs.rootid,\n                            commentexpandmode: z.commentexpandmode\n                        });\n                        JSBNG__event.preventDefault();\n                    }.bind(this), ca = t({\n                        onClick: ba,\n                        subscribeAction: aa\n                    });\n                    this._subscribeLink = l.renderComponent(ca, this._subscribeRoot);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _isSourceProfile: function(z) {\n            return ((z === q.UFIFeedbackSourceType.PROFILE));\n        }\n    });\n    e.exports = y;\n});\n__d(\"MentionsInputUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        generateDataFromTextWithEntities: function(h) {\n            var i = h.text, j = [];\n            ((h.ranges || [])).forEach(function(l) {\n                var m = l.entities[0];\n                if (!m.JSBNG__external) {\n                    j.push({\n                        uid: m.id,\n                        text: i.substr(l.offset, l.length),\n                        offset: l.offset,\n                        length: l.length,\n                        weakreference: !!m.weakreference\n                    });\n                }\n            ;\n            ;\n            });\n            var k = {\n                value: i,\n                mentions: j\n            };\n            return k;\n        }\n    };\n    e.exports = g;\n});\n__d(\"ClipboardPhotoUploader\", [\"ArbiterMixin\",\"AsyncRequest\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.uploadURIString = k;\n        this.data = l;\n    };\n;\n    i(j.prototype, g, {\n        handlePaste: function(JSBNG__event) {\n            if (!JSBNG__event.JSBNG__clipboardData) {\n                return;\n            }\n        ;\n        ;\n            var k = JSBNG__event.JSBNG__clipboardData.items;\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            for (var l = 0; ((l < k.length)); ++l) {\n                var m = k[l];\n                if (((((m.kind === \"file\")) && ((m.type.indexOf(\"image/\") !== -1))))) {\n                    var n = new JSBNG__FormData();\n                    n.append(\"pasted_file\", m.getAsFile());\n                    var o = new h();\n                    o.setURI(this.uploadURIString).setData(this.data).setRawData(n).setHandler(function(p) {\n                        this.inform(\"upload_success\", p);\n                    }.bind(this)).setErrorHandler(function(p) {\n                        this.inform(\"upload_error\", p);\n                    }.bind(this));\n                    this.inform(\"upload_start\");\n                    o.send();\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LegacyMentionsInput.react\", [\"PlaceholderListener\",\"Bootloader\",\"JSBNG__Event\",\"Keys\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"PlaceholderListener\");\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__Event\"), i = b(\"Keys\"), j = b(\"React\"), k = b(\"cx\"), l = j.createClass({\n        displayName: \"ReactLegacyMentionsInput\",\n        componentDidMount: function(m) {\n            ((this.props.initialData && this._initializeTextarea(m)));\n        },\n        hasEnteredText: function() {\n            return !!((this._mentionsInput && this._mentionsInput.getValue().trim()));\n        },\n        _handleKeydown: function(JSBNG__event) {\n            var m = JSBNG__event.nativeEvent, n = this.props.onEnterSubmit, o = ((((h.getKeyCode(m) == i.RETURN)) && !h.$E(m).getModifiers().any)), p = ((this._mentionsInput && this._mentionsInput.getTypeahead().getView().JSBNG__getSelection()));\n            if (((((n && o)) && !p))) {\n                if (this.props.isLoadingPhoto) {\n                    return false;\n                }\n            ;\n            ;\n                var q = JSBNG__event.target, r = ((q.value && q.value.trim()));\n                if (((r || this.props.acceptEmptyInput))) {\n                    var s = {\n                        visibleValue: r,\n                        encodedValue: r,\n                        attachedPhoto: null\n                    };\n                    if (this._mentionsInput) {\n                        s.encodedValue = this._mentionsInput.getRawValue().trim();\n                        this._mentionsInput.reset();\n                    }\n                ;\n                ;\n                    n(s, JSBNG__event);\n                }\n            ;\n            ;\n                JSBNG__event.preventDefault();\n            }\n        ;\n        ;\n        },\n        _handleFocus: function() {\n            ((this.props.onFocus && this.props.onFocus()));\n            this._initializeTextarea(this.refs.root.getDOMNode());\n        },\n        _handleBlur: function() {\n            ((this.props.onBlur && this.props.onBlur()));\n        },\n        _initializeTextarea: function(m) {\n            if (((this._mentionsInput || this._bootloadingMentions))) {\n                return;\n            }\n        ;\n        ;\n            this._bootloadingMentions = true;\n            g.loadModules([\"CompactTypeaheadRenderer\",\"ContextualTypeaheadView\",\"InputSelection\",\"MentionsInput\",\"TextAreaControl\",\"Typeahead\",\"TypeaheadAreaCore\",\"TypeaheadBestName\",\"TypeaheadHoistFriends\",\"TypeaheadMetrics\",\"TypingDetector\",], function(n, o, p, q, r, s, t, u, v, w, x) {\n                var y = this.refs.textarea.getDOMNode();\n                new r(y);\n                if (this.props.onTypingStateChange) {\n                    var z = new x(y);\n                    z.init();\n                    z.subscribe(\"change\", this.props.onTypingStateChange);\n                }\n            ;\n            ;\n                var aa = {\n                    autoSelect: true,\n                    renderer: n,\n                    causalElement: y\n                };\n                if (this.props.viewOptionsTypeObjects) {\n                    aa.typeObjects = this.props.viewOptionsTypeObjects;\n                }\n            ;\n            ;\n                if (this.props.viewOptionsTypeObjectsOrder) {\n                    aa.typeObjectsOrder = this.props.viewOptionsTypeObjectsOrder;\n                }\n            ;\n            ;\n                var ba = new s(this.props.datasource, {\n                    ctor: o,\n                    options: aa\n                }, {\n                    ctor: t\n                }, this.refs.typeahead.getDOMNode()), ca = [u,v,], da = new w({\n                    extraData: {\n                        event_name: \"mentions\"\n                    }\n                });\n                s.initNow(ba, ca, da);\n                this._mentionsInput = new q(m, ba, y, {\n                    hashtags: this.props.sht\n                });\n                this._mentionsInput.init({\n                    max: 6\n                }, this.props.initialData);\n                if (this.props.initialData) {\n                    p.set(y, y.value.length);\n                }\n            ;\n            ;\n                if (this.props.onPaste) {\n                    h.listen(y, \"paste\", this.props.onPaste);\n                }\n            ;\n            ;\n                this._bootloadingMentions = false;\n            }.bind(this));\n        },\n        JSBNG__focus: function() {\n            try {\n                this.refs.textarea.getDOMNode().JSBNG__focus();\n            } catch (m) {\n            \n            };\n        ;\n        },\n        render: function() {\n            var m = (((((((((((\"textInput\") + ((\" \" + \"mentionsTextarea\")))) + ((\" \" + \"uiTextareaAutogrow\")))) + ((\" \" + \"uiTextareaNoResize\")))) + ((\" \" + \"UFIAddCommentInput\")))) + ((\" \" + \"DOMControl_placeholder\"))));\n            return (j.DOM.div({\n                ref: \"root\",\n                className: \"uiMentionsInput textBoxContainer ReactLegacyMentionsInput\"\n            }, j.DOM.div({\n                className: \"highlighter\"\n            }, j.DOM.div(null, j.DOM.span({\n                className: \"highlighterContent hidden_elem\"\n            }))), j.DOM.div({\n                ref: \"typeahead\",\n                className: \"uiTypeahead mentionsTypeahead\"\n            }, j.DOM.div({\n                className: \"wrap\"\n            }, j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"hiddenInput\"\n            }), j.DOM.div({\n                className: \"innerWrap\"\n            }, j.DOM.textarea({\n                ref: \"textarea\",\n                JSBNG__name: \"add_comment_text\",\n                className: m,\n                title: this.props.placeholder,\n                placeholder: this.props.placeholder,\n                onFocus: this._handleFocus,\n                onBlur: this._handleBlur,\n                onKeyDown: this._handleKeydown,\n                defaultValue: this.props.placeholder\n            })))), j.DOM.input({\n                type: \"hidden\",\n                autocomplete: \"off\",\n                className: \"mentionsHidden\",\n                defaultValue: \"\"\n            })));\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIAddComment.react\", [\"Bootloader\",\"CLogConfig\",\"ClipboardPhotoUploader\",\"CloseButton.react\",\"JSBNG__Event\",\"Keys\",\"LoadingIndicator.react\",\"React\",\"LegacyMentionsInput.react\",\"TrackingNodes\",\"Run\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"fbt\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CLogConfig\"), i = b(\"ClipboardPhotoUploader\"), j = b(\"CloseButton.react\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"LoadingIndicator.react\"), n = b(\"React\"), o = b(\"LegacyMentionsInput.react\"), p = b(\"TrackingNodes\"), q = b(\"Run\"), r = b(\"UFIClassNames\"), s = b(\"UFIImageBlock.react\"), t = b(\"cx\"), u = b(\"fbt\"), v = b(\"joinClasses\"), w = b(\"tx\"), x = \"Write a comment...\", y = \"Write a reply...\", z = \"fcg fss UFICommentTip\", aa = 19, ba = \"/ajax/ufi/upload/\", ca = n.createClass({\n        displayName: \"UFIAddComment\",\n        getInitialState: function() {\n            if (this.props.attachedPhoto) {\n                this.props.contextArgs.attachedphoto = this.props.attachedPhoto;\n            }\n        ;\n        ;\n            return {\n                attachedPhoto: ((this.props.attachedPhoto ? this.props.attachedPhoto : null)),\n                isCommenting: false,\n                isLoadingPhoto: false,\n                isOnBeforeUnloadListenerAdded: false\n            };\n        },\n        _onKeyDown: function(JSBNG__event) {\n            if (((this.props.isEditing && ((k.getKeyCode(JSBNG__event.nativeEvent) === l.ESC))))) {\n                this.props.onCancel();\n            }\n        ;\n        ;\n            if (((this.isMounted() && !this.state.isOnBeforeUnloadListenerAdded))) {\n                q.onBeforeUnload(this._handleUnsavedChanges);\n                this.setState({\n                    isOnBeforeUnloadListenerAdded: true\n                });\n            }\n        ;\n        ;\n        },\n        _handleUnsavedChanges: function() {\n            var da = a.PageTransitions;\n            if (da) {\n                var ea = da.getNextURI(), fa = da.getMostRecentURI();\n                if (((ea.getQueryData().hasOwnProperty(\"theater\") || fa.getQueryData().hasOwnProperty(\"theater\")))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((this.refs && this.refs.mentionsinput)) && this.refs.mentionsinput.hasEnteredText()))) {\n                return \"You haven't finished your comment yet. Do you want to leave without finishing?\";\n            }\n        ;\n        ;\n        },\n        _blur: function() {\n            if (((this.refs.mentionsinput && this.refs.mentionsinput.hasEnteredText()))) {\n                return;\n            }\n        ;\n        ;\n            this.setState({\n                isCommenting: false\n            });\n        },\n        _onPaste: function(JSBNG__event) {\n            var da = new i(ba, this._getPhotoUploadData());\n            this._cancelCurrentSubscriptions();\n            this._subscriptions = [da.subscribe(\"upload_start\", this._prepareForAttachedPhotoPreview),da.subscribe(\"upload_error\", this._onRemoveAttachedPhotoPreviewClicked),da.subscribe(\"upload_success\", function(ea, fa) {\n                this._onPhotoUploadComplete(fa);\n            }.bind(this)),];\n            da.handlePaste(JSBNG__event);\n        },\n        _cancelCurrentSubscriptions: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(function(da) {\n                    da.unsubscribe();\n                });\n            }\n        ;\n        ;\n        },\n        componentWillUnmount: function() {\n            this._cancelCurrentSubscriptions();\n        },\n        JSBNG__focus: function() {\n            if (((this.refs && this.refs.mentionsinput))) {\n                this.refs.mentionsinput.JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var da = ((!this.props.contextArgs.collapseaddcomment || this.state.isCommenting)), ea = null;\n            if (this.props.isEditing) {\n                ea = n.DOM.span({\n                    className: z\n                }, \"Press Esc to cancel.\");\n            }\n             else if (this.props.showSendOnEnterTip) {\n                ea = n.DOM.span({\n                    className: z\n                }, \"Press Enter to post.\");\n            }\n             else if (this.props.subtitle) {\n                ea = n.DOM.span({\n                    className: z\n                }, this.props.subtitle);\n            }\n            \n            \n        ;\n        ;\n            var fa = null, ga = this.state.attachedPhoto, ha = null;\n            if (this.props.allowPhotoAttachments) {\n                ha = this._onPaste;\n                var ia = \"Choose a file to upload\", ja = n.DOM.input({\n                    ref: \"PhotoInput\",\n                    accept: \"image/*\",\n                    className: \"-cx-PRIVATE-uiFileInput__input\",\n                    JSBNG__name: \"file[]\",\n                    type: \"file\",\n                    multiple: false,\n                    title: ia\n                }), ka = ((ga ? \"UFICommentPhotoAttachedIcon\" : \"UFICommentPhotoIcon\")), la = \"UFIPhotoAttachLinkWrapper -cx-PRIVATE-uiFileInput__container\";\n                fa = n.DOM.div({\n                    ref: \"PhotoInputContainer\",\n                    className: la,\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"aria-label\": \"Attach a Photo\"\n                }, n.DOM.i({\n                    ref: \"PhotoInputControl\",\n                    className: ka\n                }), ja);\n            }\n        ;\n        ;\n            var ma = p.getTrackingInfo(p.types.ADD_COMMENT_BOX), na = v(r.ACTOR_IMAGE, ((!da ? \"hidden_elem\" : \"\"))), oa = n.DOM.div({\n                className: \"UFIReplyActorPhotoWrapper\"\n            }, n.DOM.img({\n                className: na,\n                src: this.props.viewerActor.thumbSrc\n            })), pa = v(r.ROW, ((((((((((((this.props.hide ? \"noDisplay\" : \"\")) + ((\" \" + \"UFIAddComment\")))) + ((this.props.allowPhotoAttachments ? ((\" \" + \"UFIAddCommentWithPhotoAttacher\")) : \"\")))) + ((this.props.withoutSeparator ? ((\" \" + \"UFIAddCommentWithoutSeparator\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), qa = ((!!this.props.replyCommentID ? y : x)), ra = ((this.props.contextArgs.entstream ? this._blur : null)), sa = this.props.contextArgs.viewoptionstypeobjects, ta = this.props.contextArgs.viewoptionstypeobjectsorder, ua = null, va = this.props.onCommentSubmit;\n            if (ga) {\n                ua = n.DOM.div({\n                    isStatic: true,\n                    dangerouslySetInnerHTML: ((this.state.attachedPhoto.markupPreview ? this.state.attachedPhoto.markupPreview : this.state.attachedPhoto.markup))\n                });\n                ea = null;\n            }\n             else if (this.state.isLoadingPhoto) {\n                ua = m({\n                    color: \"white\",\n                    className: \"UFICommentPhotoAttachedPreviewLoadingIndicator\",\n                    size: \"medium\"\n                });\n            }\n            \n        ;\n        ;\n            var wa;\n            if (((ua != null))) {\n                wa = n.DOM.div({\n                    className: \"UFICommentPhotoAttachedPreview pas\"\n                }, ua, j({\n                    onClick: this._onRemoveAttachedPhotoPreviewClicked\n                }));\n                va = function(xa, JSBNG__event) {\n                    this.setState({\n                        isLoadingPhoto: false,\n                        attachedPhoto: null\n                    });\n                    xa.attachedPhoto = this.props.contextArgs.attachedphoto;\n                    this.props.onCommentSubmit(xa, JSBNG__event);\n                }.bind(this);\n            }\n        ;\n        ;\n            return (n.DOM.li({\n                className: pa,\n                onKeyDown: this._onKeyDown,\n                \"data-ft\": ma\n            }, s({\n                className: \"UFIMentionsInputWrap\"\n            }, oa, n.DOM.div(null, o({\n                initialData: this.props.initialData,\n                placeholder: qa,\n                ref: \"mentionsinput\",\n                datasource: this.props.mentionsDataSource,\n                acceptEmptyInput: ((this.props.isEditing || this.props.contextArgs.attachedphoto)),\n                onEnterSubmit: va,\n                onFocus: this.setState.bind(this, {\n                    isCommenting: true\n                }, null),\n                viewOptionsTypeObjects: sa,\n                viewOptionsTypeObjectsOrder: ta,\n                onBlur: ra,\n                onTypingStateChange: this.props.onTypingStateChange,\n                onPaste: ha,\n                sht: this.props.contextArgs.sht,\n                isLoadingPhoto: this.state.isLoadingPhoto\n            }), fa, wa, ea))));\n        },\n        componentDidMount: function(da) {\n            if (h.gkResults) {\n                var ea = this.props.replyCommentID;\n                if (((this.refs && this.refs.mentionsinput))) {\n                    var fa = this.refs.mentionsinput.refs.textarea.getDOMNode();\n                    g.loadModules([\"CLoggerX\",\"UFIComments\",], function(ka, la) {\n                        var ma = la.getComment(ea), na = ((ma ? ma.fbid : null));\n                        ka.trackMentionsInput(fa, na);\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!this.props.allowPhotoAttachments) {\n                return;\n            }\n        ;\n        ;\n            var ga = this.refs.PhotoInputContainer.getDOMNode(), ha = this.refs.PhotoInputControl.getDOMNode(), ia = this.refs.PhotoInput.getDOMNode(), ja = k.listen(ga, \"click\", function(JSBNG__event) {\n                g.loadModules([\"FileInput\",\"FileInputUploader\",\"Input\",], function(ka, la, ma) {\n                    var na = new ka(ga, ha, ia), oa = new la().setURI(ba).setData(this._getPhotoUploadData());\n                    na.subscribe(\"change\", function(JSBNG__event) {\n                        if (na.getValue()) {\n                            this._prepareForAttachedPhotoPreview();\n                            oa.setInput(na.getInput()).send();\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                    oa.subscribe(\"success\", function(pa, qa) {\n                        na.clear();\n                        this._onPhotoUploadComplete(qa.response);\n                    }.bind(this));\n                }.bind(this));\n                ja.remove();\n            }.bind(this));\n        },\n        _getPhotoUploadData: function() {\n            return {\n                profile_id: this.props.viewerActor.id,\n                target_id: this.props.targetID,\n                source: aa\n            };\n        },\n        _onPhotoUploadComplete: function(da) {\n            if (!this.state.isLoadingPhoto) {\n                return;\n            }\n        ;\n        ;\n            var ea = da.getPayload();\n            if (((ea && ea.fbid))) {\n                this.props.contextArgs.attachedphoto = ea;\n                this.setState({\n                    attachedPhoto: ea,\n                    isLoadingPhoto: false\n                });\n            }\n        ;\n        ;\n        },\n        _onRemoveAttachedPhotoPreviewClicked: function(JSBNG__event) {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: false\n            });\n        },\n        _prepareForAttachedPhotoPreview: function() {\n            this.props.contextArgs.attachedphoto = null;\n            this.setState({\n                attachedPhoto: null,\n                isLoadingPhoto: true\n            });\n        }\n    });\n    e.exports = ca;\n});\n__d(\"UFIAddCommentController\", [\"Arbiter\",\"copyProperties\",\"MentionsInputUtils\",\"Parent\",\"UFIAddComment.react\",\"React\",\"ShortProfiles\",\"UFICentralUpdates\",\"UFIComments\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"MentionsInputUtils\"), j = b(\"Parent\"), k = b(\"UFIAddComment.react\"), l = b(\"React\"), m = b(\"ShortProfiles\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIFeedbackTargets\"), q = b(\"UFIInstanceState\"), r = b(\"UFIUserActions\");\n    function s(t, u, v, w) {\n        this.id = u;\n        this._ufiInstanceID = w.instanceid;\n        this._contextArgs = w;\n        this._replyCommentID = v;\n        if (t) {\n            this.root = t;\n            if (!this._contextArgs.rootid) {\n                this._contextArgs.rootid = t.id;\n            }\n        ;\n        ;\n            this.render();\n            n.subscribe(\"instance-updated\", function(x, y) {\n                var z = y.updates;\n                if (((this._ufiInstanceID in z))) {\n                    this.render();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        n.subscribe(\"feedback-id-changed\", function(x, y) {\n            var z = y.updates;\n            if (((this.id in z))) {\n                this.id = z[this.id];\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    h(s.prototype, {\n        _onCommentSubmit: function(t, JSBNG__event) {\n            r.addComment(this.id, t.visibleValue, t.encodedValue, {\n                source: this._contextArgs.source,\n                ufiinstanceid: this._ufiInstanceID,\n                target: JSBNG__event.target,\n                replyid: this._replyCommentID,\n                timelinelogdata: this._contextArgs.timelinelogdata,\n                rootid: this._contextArgs.rootid,\n                attachedphoto: this._contextArgs.attachedphoto,\n                giftoccasion: this._contextArgs.giftoccasion\n            });\n            this._contextArgs.attachedphoto = null;\n            p.getFeedbackTarget(this.id, function(u) {\n                var v = j.byTag(this.root, \"form\");\n                if (v) {\n                    g.inform(\"ufi/comment\", {\n                        form: v,\n                        isranked: u.isranked\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return false;\n        },\n        _onTypingStateChange: function(t, u) {\n        \n        },\n        renderAddComment: function(t, u, v, w, x, y, z, aa) {\n            var ba = ((this._contextArgs.logtyping ? this._onTypingStateChange.bind(this) : null)), ca = null, da = ((q.getKeyForInstance(this._ufiInstanceID, \"isediting\") && !this._replyCommentID));\n            return (k({\n                hide: da,\n                replyCommentID: this._replyCommentID,\n                viewerActor: t,\n                targetID: u,\n                initialData: ca,\n                ref: x,\n                withoutSeparator: y,\n                onCommentSubmit: this._onCommentSubmit.bind(this),\n                mentionsDataSource: v,\n                onTypingStateChange: ba,\n                showSendOnEnterTip: w,\n                allowPhotoAttachments: z,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                subtitle: aa\n            }));\n        },\n        renderEditComment: function(t, u, v, w, x, y, z) {\n            var aa = o.getComment(v), ba = i.generateDataFromTextWithEntities(aa.body);\n            return (k({\n                viewerActor: t,\n                targetID: u,\n                initialData: ba,\n                onCommentSubmit: x,\n                onCancel: y,\n                mentionsDataSource: w,\n                source: this._contextArgs.source,\n                contextArgs: this._contextArgs,\n                isEditing: true,\n                editingCommentID: v,\n                attachedPhoto: aa.photo_comment,\n                allowPhotoAttachments: z\n            }));\n        },\n        render: function() {\n            if (!this.root) {\n                throw new Error(\"render called on UFIAddCommentController with no root\");\n            }\n        ;\n        ;\n            p.getFeedbackTarget(this.id, function(t) {\n                if (((t.cancomment && t.actorforpost))) {\n                    m.get(t.actorforpost, function(u) {\n                        var v = this.renderAddComment(u, t.ownerid, t.mentionsdatasource, t.showsendonentertip, null, null, t.allowphotoattachments, t.subtitle);\n                        this._addComment = l.renderComponent(v, this.root);\n                    }.bind(this));\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = s;\n});\n__d(\"LegacyScrollableArea.react\", [\"Scrollable\",\"Bootloader\",\"React\",\"Style\",\"cx\",], function(a, b, c, d, e, f) {\n    b(\"Scrollable\");\n    var g = b(\"Bootloader\"), h = b(\"React\"), i = b(\"Style\"), j = b(\"cx\"), k = \"uiScrollableArea native\", l = \"uiScrollableAreaWrap scrollable\", m = \"uiScrollableAreaBody\", n = \"uiScrollableAreaContent\", o = h.createClass({\n        displayName: \"ReactLegacyScrollableArea\",\n        render: function() {\n            var p = {\n                height: ((this.props.height ? ((this.props.height + \"px\")) : \"auto\"))\n            };\n            return (h.DOM.div({\n                className: k,\n                ref: \"root\",\n                style: p\n            }, h.DOM.div({\n                className: l\n            }, h.DOM.div({\n                className: m,\n                ref: \"body\"\n            }, h.DOM.div({\n                className: n\n            }, this.props.children)))));\n        },\n        getArea: function() {\n            return this._area;\n        },\n        componentDidMount: function() {\n            g.loadModules([\"ScrollableArea\",], this._loadScrollableArea);\n        },\n        _loadScrollableArea: function(p) {\n            this._area = p.fromNative(this.refs.root.getDOMNode(), {\n                fade: this.props.fade,\n                persistent: this.props.persistent,\n                shadow: ((((this.props.shadow === undefined)) ? true : this.props.shadow))\n            });\n            var q = this.refs.body.getDOMNode();\n            i.set(q, \"width\", ((this.props.width + \"px\")));\n            ((this.props.onScroll && this._area.subscribe(\"JSBNG__scroll\", this.props.onScroll)));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFIAddCommentLink.react\", [\"React\",\"UFIClassNames\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = b(\"tx\"), l = g.createClass({\n        displayName: \"UFIAddCommentLink\",\n        render: function() {\n            var m = j(h.ROW, (((((((((\"UFIAddCommentLink\") + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), n = \"Write a comment...\";\n            return (g.DOM.li({\n                className: m,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, g.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, n)));\n        }\n    });\n    e.exports = l;\n});\n__d(\"PubContentTypes\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HASHTAG: \"hashtag\",\n        TOPIC: \"topic\",\n        JSBNG__URL: \"url\"\n    };\n    e.exports = g;\n});\n__d(\"HovercardLinkInterpolator\", [\"Bootloader\",\"JSBNG__CSS\",\"JSBNG__Event\",\"HovercardLink\",\"Link.react\",\"Parent\",\"PubContentTypes\",\"React\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__CSS\"), i = b(\"JSBNG__Event\"), j = b(\"HovercardLink\"), k = b(\"Link.react\"), l = b(\"Parent\"), m = b(\"PubContentTypes\"), n = b(\"React\"), o = b(\"URI\"), p = b(\"cx\");\n    function q(r, s, t, u, v) {\n        var w = s.entities[0], x = ((t || ((w.JSBNG__external ? \"_blank\" : null)))), y, z = ((((!w.JSBNG__external ? \"profileLink\" : \"\")) + ((w.weakreference ? ((\" \" + \"weakReference\")) : \"\"))));\n        if (w.hashtag) {\n            var aa = h.hasClass(JSBNG__document.body, \"-cx-PUBLIC-hasLitestand__body\"), ba = function(ea) {\n                if (i.$E(ea.nativeEvent).isDefaultRequested()) {\n                    return;\n                }\n            ;\n            ;\n                ea.preventDefault();\n                var fa = l.byTag(ea.target, \"A\");\n                if (aa) {\n                    g.loadModules([\"EntstreamPubContentOverlay\",], function(ga) {\n                        ga.pubClick(fa);\n                    });\n                }\n                 else g.loadModules([\"HashtagLayerPageController\",], function(ga) {\n                    ga.click(fa);\n                });\n            ;\n            ;\n            }, ca = null;\n            if (aa) {\n                ca = {\n                    type: m.HASHTAG,\n                    id: w.id,\n                    source: \"comment\"\n                };\n            }\n             else ca = {\n                id: w.id\n            };\n        ;\n        ;\n            var da = new o(w.url).setSubdomain(\"www\");\n            y = n.DOM.a({\n                className: \"-cx-PUBLIC-fbHashtagLink__link\",\n                \"data-pub\": JSON.stringify(ca),\n                href: da.toString(),\n                onClick: ba\n            }, n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__hashmark\"\n            }, r.substring(0, 1)), n.DOM.span({\n                className: \"-cx-PUBLIC-fbHashtagLink__tagname\"\n            }, r.substring(1)));\n        }\n         else if (w.weakreference) {\n            y = k({\n                className: z,\n                href: w,\n                target: x\n            }, n.DOM.i({\n                className: \"UFIWeakReferenceIcon\"\n            }), r);\n        }\n         else y = k({\n            className: z,\n            href: w,\n            target: x\n        }, r);\n        \n    ;\n    ;\n        if (((!w.JSBNG__external && !w.hashtag))) {\n            y.props[\"data-hovercard\"] = j.constructEndpointWithGroupAndLocation(w, u, v).toString();\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    e.exports = q;\n});\n__d(\"LinkButton\", [\"cx\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"React\"), i = function(j) {\n        var k = ((((j.JSBNG__name && j.value)) ? ((((((j.JSBNG__name + \"[\")) + encodeURIComponent(j.value))) + \"]\")) : null));\n        return (h.DOM.label({\n            className: (((((\"uiLinkButton\") + ((j.subtle ? ((\" \" + \"uiLinkButtonSubtle\")) : \"\")))) + ((j.showSaving ? ((\" \" + \"async_throbber\")) : \"\"))))\n        }, h.DOM.input({\n            type: ((j.inputType || \"button\")),\n            JSBNG__name: k,\n            value: j.label,\n            className: ((j.showSaving ? \"stat_elem\" : \"\"))\n        })));\n    };\n    e.exports = i;\n});\n__d(\"SeeMore.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"SeeMore\",\n        getInitialState: function() {\n            return {\n                isCollapsed: true\n            };\n        },\n        handleClick: function() {\n            this.setState({\n                isCollapsed: false\n            });\n        },\n        render: function() {\n            var j = this.state.isCollapsed, k = ((!j ? null : g.DOM.span(null, \"...\"))), l = this.props.children[0], m = ((j ? null : g.DOM.span(null, this.props.children[1]))), n = ((!j ? null : g.DOM.a({\n                className: \"SeeMoreLink fss\",\n                onClick: this.handleClick,\n                href: \"#\",\n                role: \"button\"\n            }, \"See More\")));\n            return (g.DOM.span({\n                className: this.props.className\n            }, l, k, n, m));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TruncatedTextWithEntities.react\", [\"React\",\"TextWithEntities.react\",\"SeeMore.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TextWithEntities.react\"), i = b(\"SeeMore.react\");\n    function j(n, o) {\n        var p = ((n.offset + n.length));\n        return ((((o > n.offset)) && ((o < p))));\n    };\n;\n    function k(n, o) {\n        for (var p = 0; ((p < n.length)); p++) {\n            var q = n[p];\n            if (j(q, o)) {\n                return q.offset;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    var l = function(n, o, p) {\n        var q = [], r = [], s = k(o, p);\n        for (var t = 0; ((t < o.length)); t++) {\n            var u = o[t];\n            if (((u.offset < s))) {\n                q.push(u);\n            }\n             else r.push({\n                offset: ((u.offset - s)),\n                length: u.length,\n                entities: u.entities\n            });\n        ;\n        ;\n        };\n    ;\n        return {\n            first: {\n                ranges: q,\n                text: n.substr(0, s)\n            },\n            second: {\n                ranges: r,\n                text: n.substr(s)\n            }\n        };\n    }, m = g.createClass({\n        displayName: \"TruncatedTextWithEntities\",\n        render: function() {\n            var n = this.props.maxLines, o = this.props.maxLength, p = ((this.props.truncationPercent || 60750)), q = Math.floor(((p * o))), r = ((this.props.text || \"\")), s = ((this.props.ranges || [])), t = r.split(\"\\u000a\"), u = ((t.length - 1)), v = ((o && ((r.length > o)))), w = ((n && ((u > n))));\n            if (w) {\n                q = Math.min(t.slice(0, n).join(\"\\u000a\").length, q);\n            }\n        ;\n        ;\n            if (((v || w))) {\n                var x = l(r, s, q);\n                return (g.DOM.span({\n                    \"data-ft\": this.props[\"data-ft\"],\n                    dir: this.props.dir\n                }, i({\n                    className: this.props.className\n                }, h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.first.ranges,\n                    text: x.first.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }), h({\n                    interpolator: this.props.interpolator,\n                    ranges: x.second.ranges,\n                    text: x.second.text,\n                    renderEmoticons: this.props.renderEmoticons,\n                    renderEmoji: this.props.renderEmoji\n                }))));\n            }\n             else return (g.DOM.span({\n                \"data-ft\": this.props[\"data-ft\"],\n                dir: this.props.dir\n            }, h({\n                className: this.props.className,\n                interpolator: this.props.interpolator,\n                ranges: s,\n                text: r,\n                renderEmoticons: this.props.renderEmoticons,\n                renderEmoji: this.props.renderEmoji\n            })))\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFICommentAttachment.react\", [\"DOM\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"React\"), i = h.createClass({\n        displayName: \"UFICommentAttachment\",\n        _attachmentFromCommentData: function(j) {\n            return ((j.photo_comment || j.attachment));\n        },\n        componentDidMount: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            if (k) {\n                this.renderAttachment(k);\n            }\n        ;\n        ;\n        },\n        shouldComponentUpdate: function(j, k) {\n            var l = this._attachmentFromCommentData(this.props.comment), m = this._attachmentFromCommentData(j.comment);\n            if (((!l && !m))) {\n                return false;\n            }\n        ;\n        ;\n            if (((((!l || !m)) || ((l.markup != m.markup))))) {\n                return true;\n            }\n             else return false\n        ;\n        },\n        componentDidUpdate: function(j) {\n            var k = this._attachmentFromCommentData(this.props.comment);\n            this.renderAttachment(k);\n        },\n        renderAttachment: function(j) {\n            if (((j && this.refs.contents))) {\n                g.setContent(this.refs.contents.getDOMNode(), j.markup);\n            }\n        ;\n        ;\n        },\n        render: function() {\n            if (this._attachmentFromCommentData(this.props.comment)) {\n                return h.DOM.div({\n                    ref: \"contents\"\n                });\n            }\n             else return h.DOM.span(null)\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFIReplyLink.react\", [\"React\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"tx\"), i = g.createClass({\n        displayName: \"UFIReplyLink\",\n        render: function() {\n            return (g.DOM.a({\n                className: \"UFIReplyLink\",\n                href: \"#\",\n                onClick: this.props.onClick\n            }, \"Reply\"));\n        }\n    });\n    e.exports = i;\n});\n__d(\"UFISpamCount\", [\"UFISpamCountImpl\",], function(a, b, c, d, e, f) {\n    e.exports = ((b(\"UFISpamCountImpl\").module || {\n        enabled: false\n    }));\n});\n__d(\"UFIComment.react\", [\"function-extensions\",\"Bootloader\",\"CloseButton.react\",\"Env\",\"Focus\",\"HovercardLink\",\"HovercardLinkInterpolator\",\"LinkButton\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"Timestamp.react\",\"TrackingNodes\",\"TruncatedTextWithEntities.react\",\"UFIClassNames\",\"UFICommentAttachment.react\",\"UFIConfig\",\"UFIConstants\",\"UFIImageBlock.react\",\"UFIInstanceState\",\"UFIReplyLink.react\",\"UFISpamCount\",\"URI\",\"cx\",\"keyMirror\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Bootloader\"), h = b(\"CloseButton.react\"), i = b(\"Env\"), j = b(\"Focus\"), k = b(\"HovercardLink\"), l = b(\"HovercardLinkInterpolator\"), m = b(\"LinkButton\"), n = b(\"NumberFormat\"), o = b(\"ProfileBrowserLink\"), p = b(\"ProfileBrowserTypes\"), q = b(\"React\"), r = b(\"Timestamp.react\"), s = b(\"TrackingNodes\"), t = b(\"TruncatedTextWithEntities.react\"), u = b(\"UFIClassNames\"), v = b(\"UFICommentAttachment.react\"), w = b(\"UFIConfig\"), x = b(\"UFIConstants\"), y = b(\"UFIImageBlock.react\"), z = b(\"UFIInstanceState\"), aa = b(\"UFIReplyLink.react\"), ba = b(\"UFISpamCount\"), ca = b(\"URI\"), da = b(\"cx\"), ea = b(\"keyMirror\"), fa = b(\"joinClasses\"), ga = b(\"tx\"), ha = x.UFIStatus, ia = \" \\u00b7 \", ja = ea({\n        edit: true,\n        hide: true,\n        remove: true\n    }), ka = \"UFICommentBody\", la = \"UFICommentActorName\", ma = \"UFICommentNotSpamLink\", na = \"fsm fwn fcg UFICommentActions\", oa = \"UFIDeletedMessageIcon\", pa = \"UFIDeletedMessage\", qa = \"UFIFailureMessageIcon\", ra = \"UFIFailureMessage\", sa = \"UFICommentLikeButton\", ta = \"UFICommentLikeIcon\", ua = \"UFITranslateLink\", va = \"UFITranslatedText\", wa = \"uiLinkSubtle\", xa = \"stat_elem\", ya = \"pls\", za = \"fcg\", ab = 27, bb = null, cb = function(kb, lb) {\n        var mb = new ca(\"/ajax/like/tooltip.php\").setQueryData({\n            comment_fbid: kb.fbid,\n            comment_from: kb.author,\n            cache_buster: ((kb.likeconfirmhash || 0))\n        });\n        if (lb) {\n            mb.addQueryData({\n                viewas: lb\n            });\n        }\n    ;\n    ;\n        return mb;\n    }, db = function(kb) {\n        var lb = kb.JSBNG__status;\n        return ((((lb === ha.FAILED_ADD)) || ((lb === ha.FAILED_EDIT))));\n    };\n    function eb(kb) {\n        return ((((((kb.commenterIsFOF !== undefined)) && ((kb.userIsMinor !== undefined)))) && ((kb.reportLink !== undefined))));\n    };\n;\n    var fb = q.createClass({\n        displayName: \"UFICommentLikeCount\",\n        render: function() {\n            var kb = this.props.comment, lb = n.formatIntegerWithDelimiter(((kb.likecount || 0)), this.props.contextArgs.numberdelimiter), mb = p.LIKES, nb = {\n                id: kb.fbid\n            }, ob = cb(this.props.comment, this.props.viewas), pb = q.DOM.i({\n                className: ta\n            }), qb = q.DOM.span(null, lb);\n            return (q.DOM.a({\n                className: sa,\n                role: \"button\",\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": ob.toString(),\n                ajaxify: o.constructDialogURI(mb, nb).toString(),\n                href: o.constructPageURI(mb, nb).toString()\n            }, pb, qb));\n        }\n    }), gb = q.createClass({\n        displayName: \"UFICommentActions\",\n        render: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.markedAsSpamHere, ob = ((lb.JSBNG__status === ha.SPAM_DISPLAY)), pb = this.props.showReplyLink, qb = this.props.hideAsSpamForPageAdmin, rb, sb, tb, ub, vb, wb, xb = ((!lb.islocal && ((lb.JSBNG__status !== ha.LIVE_DELETED))));\n            if (xb) {\n                if (((ob && !nb))) {\n                    if (kb.viewerCanMarkNotSpam) {\n                        rb = q.DOM.a({\n                            onClick: kb.onMarkAsNotSpam,\n                            className: ma,\n                            href: \"#\",\n                            role: \"button\"\n                        }, \"Unhide\");\n                    }\n                ;\n                ;\n                    if (((((((qb && mb.isthreaded)) && mb.cancomment)) && pb))) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    }\n                ;\n                ;\n                }\n                 else {\n                    if (mb.viewercanlike) {\n                        var yb = s.getTrackingInfo(((lb.hasviewerliked ? s.types.UNLIKE_LINK : s.types.LIKE_LINK))), zb = ((lb.hasviewerliked ? \"Unlike this comment\" : \"Like this comment\"));\n                        sb = q.DOM.a({\n                            className: \"UFILikeLink\",\n                            href: \"#\",\n                            role: \"button\",\n                            onClick: kb.onCommentLikeToggle,\n                            \"data-ft\": yb,\n                            title: zb\n                        }, ((lb.hasviewerliked ? \"Unlike\" : \"Like\")));\n                    }\n                ;\n                ;\n                    if (((((mb.isthreaded && mb.cancomment)) && pb))) {\n                        vb = aa({\n                            comment: lb,\n                            onClick: kb.onCommentReply,\n                            contextArgs: kb.contextArgs\n                        });\n                    }\n                ;\n                ;\n                    if (((lb.likecount > 0))) {\n                        tb = fb({\n                            comment: lb,\n                            viewas: this.props.viewas,\n                            contextArgs: this.props.contextArgs\n                        });\n                    }\n                ;\n                ;\n                    if (((lb.spamcount && ba.enabled))) {\n                        ub = ba({\n                            count: lb.spamcount\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (((((lb.attachment && ((lb.attachment.type == \"share\")))) && lb.canremove))) {\n                    wb = q.DOM.a({\n                        onClick: kb.onPreviewRemove,\n                        href: \"#\",\n                        role: \"button\"\n                    }, \"Remove Preview\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ac = hb({\n                comment: lb,\n                onRetrySubmit: kb.onRetrySubmit,\n                showPermalink: kb.showPermalink\n            }), bc;\n            if (kb.contextArgs.entstream) {\n                bc = [ac,sb,tb,vb,ub,rb,wb,];\n            }\n             else if (mb.isthreaded) {\n                bc = [sb,vb,rb,wb,tb,ub,ac,];\n            }\n             else bc = [ac,sb,tb,ub,vb,rb,wb,];\n            \n        ;\n        ;\n            if (((lb.JSBNG__status === ha.LIVE_DELETED))) {\n                var cc = q.DOM.span({\n                    className: pa\n                }, q.DOM.i({\n                    className: oa,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Comment deleted\"\n                }));\n                bc.push(cc);\n            }\n        ;\n        ;\n            var dc = [];\n            for (var ec = 0; ((ec < bc.length)); ec++) {\n                if (bc[ec]) {\n                    dc.push(ia);\n                    dc.push(bc[ec]);\n                }\n            ;\n            ;\n            };\n        ;\n            dc.shift();\n            return (q.DOM.div({\n                className: na\n            }, dc));\n        }\n    }), hb = q.createClass({\n        displayName: \"UFICommentMetadata\",\n        render: function() {\n            var kb = this.props.comment, lb = this.props.onRetrySubmit, mb, nb;\n            if (db(kb)) {\n                mb = [q.DOM.span({\n                    className: ra\n                }, q.DOM.i({\n                    className: qa\n                }), \"Unable to post comment.\"),((((kb.allowRetry && lb)) ? [\" \",q.DOM.a({\n                    onClick: lb,\n                    href: \"#\",\n                    role: \"button\"\n                }, \"Try Again\"),] : null)),];\n            }\n             else {\n                var ob = ((this.props.showPermalink ? kb.permalink : null)), pb = s.getTrackingInfo(s.types.SOURCE), qb = q.DOM.a({\n                    className: wa,\n                    href: ob,\n                    \"data-ft\": pb\n                }, r({\n                    time: kb.timestamp.time,\n                    text: kb.timestamp.text,\n                    verbose: kb.timestamp.verbose\n                })), rb;\n                switch (kb.source) {\n                  case x.UFISourceType.MOBILE:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/\").setSubdomain(\"www\").toString()\n                    }, \"mobile\");\n                    break;\n                  case x.UFISourceType.SMS:\n                    rb = q.DOM.a({\n                        className: wa,\n                        href: new ca(\"/mobile/?v=texts\").setSubdomain(\"www\").toString()\n                    }, \"text message\");\n                    break;\n                  case x.UFISourceType.EMAIL:\n                    rb = m({\n                        subtle: true,\n                        label: \"email\",\n                        inputType: \"submit\",\n                        JSBNG__name: \"email_explain\",\n                        value: true,\n                        className: xa\n                    });\n                    break;\n                };\n            ;\n                nb = qb;\n                if (rb) {\n                    nb = q.DOM.span({\n                        className: \"UFITimestampViaSource\"\n                    }, ga._(\"{time} via {source}\", {\n                        time: qb,\n                        source: rb\n                    }));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var sb = null;\n            if (kb.originalTimestamp) {\n                var tb = new ca(\"/ajax/edits/browser/comment\").addQueryData({\n                    comment_token: kb.id\n                }).toString();\n                sb = [ia,q.DOM.a({\n                    ref: \"EditLink\",\n                    href: \"#\",\n                    role: \"button\",\n                    rel: \"dialog\",\n                    className: \"uiLinkSubtle\",\n                    ajaxify: tb,\n                    \"data-hover\": \"tooltip\",\n                    \"aria-label\": \"Show edit history\",\n                    title: \"Show edit history\"\n                }, \"Edited\"),];\n            }\n        ;\n        ;\n            return (q.DOM.span(null, nb, mb, sb));\n        },\n        componentWillUpdate: function(kb) {\n            var lb = this.props.comment, mb = kb.comment;\n            if (((!lb.editnux && !!mb.editnux))) {\n                g.loadModules([\"LegacyContextualDialog\",], function(nb) {\n                    var ob = new nb();\n                    ob.init(mb.editnux).setContext(this.refs.EditLink.getDOMNode()).setWidth(300).setPosition(\"below\").show();\n                }.bind(this));\n            }\n        ;\n        ;\n        }\n    }), ib = q.createClass({\n        displayName: \"UFISocialContext\",\n        render: function() {\n            var kb = this.props.topMutualFriend, lb = this.props.otherMutualCount, mb = this.props.commentAuthor, nb = k.constructEndpoint(kb).toString(), ob = q.DOM.a({\n                href: kb.uri,\n                \"data-hovercard\": nb\n            }, kb.JSBNG__name), pb = ((mb.JSBNG__name.length + kb.JSBNG__name.length)), qb;\n            if (((lb === 0))) {\n                qb = ga._(\"Friends with {name}\", {\n                    JSBNG__name: ob\n                });\n            }\n             else if (((pb < ab))) {\n                var rb;\n                if (((lb == 1))) {\n                    rb = \"1 other\";\n                }\n                 else rb = ga._(\"{count} others\", {\n                    count: lb\n                });\n            ;\n            ;\n                qb = ga._(\"Friends with {name} and {others}\", {\n                    JSBNG__name: ob,\n                    others: this.getOthersLink(rb, mb, kb)\n                });\n            }\n             else {\n                var sb = ga._(\"{count} mutual friends\", {\n                    count: ((lb + 1))\n                });\n                qb = this.getOthersLink(sb, mb);\n            }\n            \n        ;\n        ;\n            return (q.DOM.span({\n                className: \"UFICommentSocialContext\"\n            }, ia, qb));\n        },\n        getOthersLink: function(kb, lb, mb) {\n            var nb = p.MUTUAL_FRIENDS, ob = {\n                uid: lb.id\n            }, pb = new ca(\"/ajax/mutual_friends/tooltip.php\").setQueryData({\n                friend_id: lb.id\n            });\n            if (mb) {\n                pb.addQueryData({\n                    exclude_id: mb.id\n                });\n            }\n        ;\n        ;\n            var qb = o.constructDialogURI(nb, ob).toString();\n            return (q.DOM.a({\n                rel: \"dialog\",\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": pb.toString(),\n                ajaxify: qb,\n                href: o.constructPageURI(nb, ob).toString()\n            }, kb));\n        }\n    }), jb = q.createClass({\n        displayName: \"UFIComment\",\n        getInitialState: function() {\n            return {\n                isHighlighting: this.props.comment.highlightcomment,\n                wasHighlighted: this.props.comment.highlightcomment,\n                markedAsSpamHere: false,\n                oneClickRemovedHere: false,\n                isInlinePageDeleted: false,\n                isInlineBanned: false\n            };\n        },\n        _onHideAsSpam: function(JSBNG__event) {\n            this.props.onHideAsSpam(JSBNG__event);\n            this.setState({\n                markedAsSpamHere: true\n            });\n        },\n        _onMarkAsNotSpam: function(JSBNG__event) {\n            this.props.onMarkAsNotSpam(JSBNG__event);\n            this.setState({\n                markedAsSpamHere: false\n            });\n        },\n        _onDeleteSpam: function(JSBNG__event) {\n            this.props.onOneClickRemove(JSBNG__event);\n            this.setState({\n                isInlinePageDeleted: true\n            });\n        },\n        _onUndoDeleteSpam: function(JSBNG__event) {\n            this.props.onUndoOneClickRemove(JSBNG__event);\n            this.setState({\n                isInlinePageDeleted: false\n            });\n        },\n        _onInlineBan: function(JSBNG__event) {\n            this.props.onInlineBan(JSBNG__event);\n            this.setState({\n                isInlineBanned: true\n            });\n        },\n        _onUndoInlineBan: function(JSBNG__event) {\n            this.props.onUndoInlineBan(JSBNG__event);\n            this.setState({\n                isInlineBanned: false\n            });\n        },\n        _onOneClickRemove: function(JSBNG__event) {\n            this.props.onOneClickRemove(JSBNG__event);\n            this.setState({\n                oneClickRemovedHere: true\n            });\n        },\n        _onUndoOneClickRemove: function(JSBNG__event) {\n            this.props.onUndoOneClickRemove(JSBNG__event);\n            this.setState({\n                oneClickRemovedHere: false\n            });\n        },\n        _onAction: function(JSBNG__event, kb) {\n            if (((kb === ja.remove))) {\n                this.props.onRemove(JSBNG__event);\n            }\n             else if (((kb === ja.edit))) {\n                this.props.onEdit(JSBNG__event);\n            }\n             else if (((kb === ja.hide))) {\n                this._onHideAsSpam(JSBNG__event);\n            }\n            \n            \n        ;\n        ;\n        },\n        _createRemoveReportMenu: function(JSBNG__event) {\n            if (this._removeReportMenu) {\n                return;\n            }\n        ;\n        ;\n            var kb = [{\n                label: \"Delete Comment...\",\n                value: ja.remove\n            },{\n                label: \"Hide Comment\",\n                value: ja.hide\n            },];\n            if (JSBNG__event.persist) {\n                JSBNG__event.persist();\n            }\n             else JSBNG__event = JSBNG__event.constructor.persistentCloneOf(JSBNG__event);\n        ;\n        ;\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._removeReportMenu = lb.createAndShowPopoverMenu(JSBNG__event.target, kb, this._onAction.bind(this, JSBNG__event));\n            }.bind(this));\n        },\n        _createEditDeleteMenu: function(JSBNG__event) {\n            if (JSBNG__event.persist) {\n                JSBNG__event.persist();\n            }\n             else JSBNG__event = JSBNG__event.constructor.persistentCloneOf(JSBNG__event);\n        ;\n        ;\n            if (this._editDeleteMenu) {\n                return;\n            }\n        ;\n        ;\n            var kb = [{\n                label: \"Edit...\",\n                value: ja.edit\n            },{\n                label: \"Delete...\",\n                value: ja.remove\n            },];\n            g.loadModules([\"LegacyMenuUtils\",], function(lb) {\n                this._editDeleteMenu = lb.createAndShowPopoverMenu(JSBNG__event.target, kb, this._onAction.bind(this, JSBNG__event));\n            }.bind(this));\n        },\n        _renderCloseButton: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = null, nb = null, ob = false;\n            if (((kb.canremove && !this.props.hideAsSpamForPageAdmin))) {\n                if (this.props.viewerIsAuthor) {\n                    if (kb.canedit) {\n                        nb = \"Edit or Delete\";\n                        mb = this._createEditDeleteMenu;\n                        ob = true;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this.props.onRemove;\n                    }\n                ;\n                ;\n                }\n                 else if (lb.canremoveall) {\n                    if (this.props.showRemoveReportMenu) {\n                        nb = \"Remove or Report\";\n                        mb = this._createRemoveReportMenu;\n                    }\n                     else {\n                        nb = \"Remove\";\n                        mb = this._onOneClickRemove;\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n             else if (kb.canreport) {\n                nb = \"Hide\";\n                mb = this._onHideAsSpam;\n            }\n            \n        ;\n        ;\n            var pb = (((((\"UFICommentCloseButton\") + ((ob ? ((\" \" + \"UFIEditButton\")) : \"\")))) + ((((mb === null)) ? ((\" \" + \"hdn\")) : \"\"))));\n            return (h({\n                onClick: mb,\n                tooltip: nb,\n                className: pb\n            }));\n        },\n        componentDidMount: function(kb) {\n            var lb = this.props.comment.ufiinstanceid;\n            if (this.state.isHighlighting) {\n                g.loadModules([\"UFIScrollHighlight\",], function(nb) {\n                    nb.actOn.curry(kb).defer();\n                });\n                this.setState({\n                    isHighlighting: false\n                });\n            }\n        ;\n        ;\n            var mb = z.getKeyForInstance(lb, \"autofocus\");\n            if (mb) {\n                j.setWithoutOutline(this.refs.AuthorName.getDOMNode());\n                z.updateState(lb, \"autofocus\", false);\n            }\n        ;\n        ;\n        },\n        shouldComponentUpdate: function(kb) {\n            var lb = this.props;\n            return ((((((((((((((((((((((kb.comment !== lb.comment)) || ((kb.showReplyLink !== lb.showReplyLink)))) || ((kb.showReplies !== lb.showReplies)))) || ((kb.isFirst !== lb.isFirst)))) || ((kb.isLast !== lb.isLast)))) || ((kb.isFirstCommentComponent !== lb.isFirstCommentComponent)))) || ((kb.isLastCommentComponent !== lb.isLastCommentComponent)))) || ((kb.isFirstComponent !== lb.isFirstComponent)))) || ((kb.isLastComponent !== lb.isLastComponent)))) || ((kb.isFeaturedComment !== lb.isFeaturedComment)))) || ((kb.hasPartialBorder !== lb.hasPartialBorder))));\n        },\n        render: function() {\n            var kb = this.props.comment, lb = this.props.feedback, mb = ((kb.JSBNG__status === ha.DELETED)), nb = ((kb.JSBNG__status === ha.LIVE_DELETED)), ob = ((kb.JSBNG__status === ha.SPAM_DISPLAY)), pb = ((kb.JSBNG__status === ha.PENDING_UNDO_DELETE)), qb = this.state.markedAsSpamHere, rb = this.state.oneClickRemovedHere, sb = this.state.isInlinePageDeleted, tb = this.props.hideAsSpamForPageAdmin, ub = this.state.isInlineBanned, vb = eb(kb), wb = ((!kb.JSBNG__status && ((kb.isunseen || kb.islocal))));\n            if (((!kb.JSBNG__status && lb.lastseentime))) {\n                var xb = ((kb.originalTimestamp || kb.timestamp.time));\n                wb = ((wb || ((xb > lb.lastseentime))));\n            }\n        ;\n        ;\n            var yb = this.props.contextArgs.markedcomments;\n            if (((yb && yb[kb.legacyid]))) {\n                wb = true;\n            }\n        ;\n        ;\n            if (vb) {\n                if (bb) {\n                    var zb, ac = null, bc = null, cc = null;\n                    if (tb) {\n                        bc = ((ub ? this._onUndoInlineBan : this._onInlineBan));\n                        if (sb) {\n                            ac = this._onUndoDeleteSpam;\n                            var dc = q.DOM.a({\n                                href: \"#\",\n                                onClick: ac\n                            }, \"Undo\");\n                            zb = ga._(\"You've deleted this comment so no one can see it. {undo}.\", {\n                                undo: dc\n                            });\n                        }\n                         else if (qb) {\n                            zb = \"Now this is only visible to the person who wrote it and their friends.\";\n                            cc = this._onDeleteSpam;\n                            ac = this._onMarkAsNotSpam;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                     else if (qb) {\n                        zb = \"This comment has been hidden.\";\n                        cc = this._onDeleteSpam;\n                        ac = this._onMarkAsNotSpam;\n                    }\n                     else if (rb) {\n                        zb = \"This comment has been removed.\";\n                        ac = this._onUndoOneClickRemove;\n                    }\n                    \n                    \n                ;\n                ;\n                    if (zb) {\n                        return (q.DOM.li({\n                            className: fa(u.ROW, \"UFIHide\")\n                        }, bb({\n                            notice: zb,\n                            comment: this.props.comment,\n                            authorProfiles: this.props.authorProfiles,\n                            onUndo: ac,\n                            onBanAction: bc,\n                            onDeleteAction: cc,\n                            isInlineBanned: ub,\n                            hideAsSpamForPageAdmin: tb\n                        })));\n                    }\n                ;\n                ;\n                }\n                 else g.loadModules([\"UFICommentRemovalControls.react\",], function(hc) {\n                    bb = hc;\n                    JSBNG__setTimeout(function() {\n                        this.forceUpdate();\n                    }.bind(this));\n                }.bind(this));\n            ;\n            }\n        ;\n        ;\n            var ec = ((!mb || rb)), fc = fa(u.ROW, (((((((((((((((((((((((((((\"UFIComment\") + ((db(kb) ? ((\" \" + \"UFICommentFailed\")) : \"\")))) + ((((((((mb || nb)) || ob)) || pb)) ? ((\" \" + \"UFITranslucentComment\")) : \"\")))) + ((this.state.isHighlighting ? ((\" \" + \"highlightComment\")) : \"\")))) + ((!ec ? ((\" \" + \"noDisplay\")) : \"\")))) + ((ec ? ((\" \" + \"display\")) : \"\")))) + ((((this.props.isFirst && !this.props.isReply)) ? ((\" \" + \"UFIFirstComment\")) : \"\")))) + ((((this.props.isLast && !this.props.isReply)) ? ((\" \" + \"UFILastComment\")) : \"\")))) + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\")))) + ((this.props.isFeatured ? ((\" \" + \"UFIFeaturedComment\")) : \"\")))) + ((((this.props.hasPartialBorder && !this.props.contextArgs.entstream)) ? ((\" \" + \"UFIPartialBorder\")) : \"\"))))), gc = this.renderComment();\n            if (wb) {\n                if (this.props.contextArgs.snowliftredesign) {\n                    gc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbPhotoSnowliftRedesign__unseenindicator\"\n                    }), gc);\n                }\n                 else if (((this.props.contextArgs.entstream && !this.props.isReply))) {\n                    gc = q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenwrapper\"\n                    }, q.DOM.div({\n                        className: \"-cx-PRIVATE-fbEntstreamUFI__unseenindicator\"\n                    }), gc);\n                }\n                 else fc = fa(fc, u.UNSEEN_ITEM);\n                \n            ;\n            }\n        ;\n        ;\n            return (q.DOM.li({\n                className: fc,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, gc));\n        },\n        renderComment: function() {\n            var kb = this.props, lb = kb.comment, mb = kb.feedback, nb = kb.authorProfiles[lb.author], ob = ((lb.JSBNG__status === ha.SPAM_DISPLAY)), pb = ((lb.JSBNG__status === ha.LIVE_DELETED)), qb = !((ob || pb)), rb = ((mb.canremoveall || lb.hiddenbyviewer)), sb = null, tb = null;\n            if (((((!kb.isLocallyComposed && !this.state.wasHighlighted)) && !lb.fromfetch))) {\n                tb = x.commentTruncationLength;\n                sb = x.commentTruncationMaxLines;\n            }\n        ;\n        ;\n            var ub = s.getTrackingInfo(s.types.SMALL_ACTOR_PHOTO), vb = s.getTrackingInfo(s.types.USER_NAME), wb = s.getTrackingInfo(s.types.USER_MESSAGE), xb = null, yb = null;\n            if (((lb.istranslatable && ((lb.translatedtext === undefined))))) {\n                xb = q.DOM.a({\n                    href: \"#\",\n                    role: \"button\",\n                    title: \"Translate this comment\",\n                    className: ua,\n                    onClick: kb.onCommentTranslate\n                }, \"See Translation\");\n            }\n        ;\n        ;\n            if (lb.translatedtext) {\n                var zb = new ca(\"http://bing.com/translator\").addQueryData({\n                    text: lb.body.text\n                });\n                yb = q.DOM.span({\n                    className: va\n                }, lb.translatedtext, q.DOM.span({\n                    className: ya\n                }, \" (\", q.DOM.a({\n                    href: zb.toString(),\n                    className: za\n                }, \"Translated by Bing\"), \") \"));\n            }\n        ;\n        ;\n            var ac;\n            if (((i.rtl && ((lb.body.dir === \"ltr\"))))) {\n                ac = \"rtl\";\n            }\n             else if (((!i.rtl && ((lb.body.dir === \"rtl\"))))) {\n                ac = \"ltr\";\n            }\n            \n        ;\n        ;\n            var bc = k.constructEndpointWithLocation(nb, \"ufi\").toString(), cc = q.DOM.a({\n                ref: \"AuthorName\",\n                className: la,\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": vb,\n                dir: ac\n            }, nb.JSBNG__name), dc = function(ic, jc) {\n                return l(ic, jc, \"_blank\", mb.grouporeventid, \"ufi\");\n            }, ec = t({\n                className: ka,\n                interpolator: dc,\n                ranges: lb.body.ranges,\n                text: lb.body.text,\n                truncationPercent: x.commentTruncationPercent,\n                maxLength: tb,\n                maxLines: sb,\n                renderEmoticons: w.renderEmoticons,\n                renderEmoji: w.renderEmoji,\n                \"data-ft\": wb,\n                dir: lb.body.dir\n            }), fc;\n            if (lb.socialcontext) {\n                var gc = lb.socialcontext, hc = ib({\n                    topMutualFriend: kb.authorProfiles[gc.topmutualid],\n                    otherMutualCount: gc.othermutualcount,\n                    commentAuthor: nb\n                });\n                fc = [cc,hc,q.DOM.div(null, ec),];\n            }\n             else fc = [cc,\" \",ec,];\n        ;\n        ;\n            return (y({\n                spacing: \"medium\"\n            }, q.DOM.a({\n                href: nb.uri,\n                \"data-hovercard\": bc,\n                \"data-ft\": ub\n            }, q.DOM.img({\n                src: nb.thumbSrc,\n                className: u.ACTOR_IMAGE,\n                alt: \"\"\n            })), q.DOM.div(null, q.DOM.div({\n                className: \"UFICommentContent\"\n            }, fc, xb, yb, v({\n                comment: kb.comment\n            })), gb({\n                comment: lb,\n                feedback: mb,\n                onBlingBoxClick: kb.onBlingBoxClick,\n                onCommentLikeToggle: kb.onCommentLikeToggle,\n                onCommentReply: kb.onCommentReply,\n                onPreviewRemove: kb.onPreviewRemove,\n                onRetrySubmit: kb.onRetrySubmit,\n                onMarkAsNotSpam: this._onMarkAsNotSpam,\n                viewerCanMarkNotSpam: rb,\n                viewas: kb.contextArgs.viewas,\n                showPermalink: kb.showPermalink,\n                showReplyLink: kb.showReplyLink,\n                showReplies: kb.showReplies,\n                contextArgs: kb.contextArgs,\n                markedAsSpamHere: this.state.markedAsSpamHere,\n                hideAsSpamForPageAdmin: kb.hideAsSpamForPageAdmin\n            })), ((qb ? this._renderCloseButton() : null))));\n        }\n    });\n    e.exports = jb;\n});\n__d(\"UFIContainer.react\", [\"React\",\"TrackingNodes\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"TrackingNodes\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"UFIContainer\",\n        render: function() {\n            var k = null;\n            if (this.props.hasNub) {\n                k = g.DOM.li({\n                    className: \"UFIArrow\"\n                }, g.DOM.i(null));\n            }\n        ;\n        ;\n            var l = ((((((((((((((!this.props.isReplyList ? \"UFIList\" : \"\")) + ((this.props.isReplyList ? ((\" \" + \"UFIReplyList\")) : \"\")))) + ((this.props.isParentLiveDeleted ? ((\" \" + \"UFITranslucentReplyList\")) : \"\")))) + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))));\n            return (g.DOM.ul({\n                className: l,\n                \"data-ft\": h.getTrackingInfo(h.types.UFI)\n            }, k, this.props.children));\n        }\n    });\n    e.exports = j;\n});\n__d(\"GiftOpportunityLogger\", [\"AsyncRequest\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__Event\"), i = {\n        init: function(k, l, m) {\n            var n = false;\n            h.listen(k, \"click\", function(o) {\n                if (n) {\n                    return true;\n                }\n            ;\n            ;\n                n = true;\n                i.send(l, m);\n            });\n        },\n        send: function(k, l) {\n            if (j[k.opportunity_id]) {\n                return;\n            }\n        ;\n        ;\n            j[k.opportunity_id] = true;\n            return new g().setURI(\"/ajax/gifts/log/opportunity\").setData({\n                data: k,\n                entry_point: l\n            }).send();\n        }\n    }, j = {\n    };\n    e.exports = i;\n});\n__d(\"InlineBlock.react\", [\"ReactPropTypes\",\"React\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactPropTypes\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"joinClasses\"), k = {\n        baseline: null,\n        bottom: \"-cx-PRIVATE-uiInlineBlock__bottom\",\n        middle: \"-cx-PRIVATE-uiInlineBlock__middle\",\n        JSBNG__top: \"-cx-PRIVATE-uiInlineBlock__top\"\n    }, l = h.createClass({\n        displayName: \"InlineBlock\",\n        propTypes: {\n            alignv: g.oneOf([\"baseline\",\"bottom\",\"middle\",\"JSBNG__top\",]),\n            height: g.number\n        },\n        getDefaultProps: function() {\n            return {\n                alignv: \"baseline\"\n            };\n        },\n        render: function() {\n            var m = k[this.props.alignv], n = h.DOM.div({\n                className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m)\n            }, this.props.children);\n            if (((this.props.height != null))) {\n                var o = h.DOM.div({\n                    className: j(\"-cx-PRIVATE-uiInlineBlock__root\", m),\n                    style: {\n                        height: ((this.props.height + \"px\"))\n                    }\n                });\n                n = h.DOM.div({\n                    className: \"-cx-PRIVATE-uiInlineBlock__root\",\n                    height: null\n                }, o, n);\n            }\n        ;\n        ;\n            return this.transferPropsTo(n);\n        }\n    });\n    e.exports = l;\n});\n__d(\"UFIGiftSentence.react\", [\"AsyncRequest\",\"CloseButton.react\",\"GiftOpportunityLogger\",\"ImageBlock.react\",\"InlineBlock.react\",\"LeftRight.react\",\"Link.react\",\"React\",\"JSBNG__Image.react\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"DOM\",\"ix\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CloseButton.react\"), i = b(\"GiftOpportunityLogger\"), j = b(\"ImageBlock.react\"), k = b(\"InlineBlock.react\"), l = b(\"LeftRight.react\"), m = b(\"Link.react\"), n = b(\"React\"), o = b(\"JSBNG__Image.react\"), p = b(\"UFIClassNames\"), q = b(\"UFIImageBlock.react\"), r = b(\"URI\"), s = b(\"DOM\"), t = b(\"ix\"), u = b(\"tx\"), v = n.createClass({\n        displayName: \"UFIGiftSentence\",\n        _entry_point: \"detected_gift_worthy_story_inline\",\n        render: function() {\n            var w = this.props.recipient, x = this.props.giftdata, y = ((x ? x.giftproductid : null)), z = this._getURI(y).toString();\n            this._log();\n            return (n.DOM.li({\n                className: p.ROW,\n                ref: \"UFIGiftSentence\"\n            }, l({\n                direction: \"right\"\n            }, ((x ? this._renderGiftSuggestion(z, w, x) : this._renderGiftLink(z, w))), h({\n                size: \"small\",\n                onClick: function() {\n                    var aa = this.refs.UFIGiftSentence.getDOMNode();\n                    s.remove(aa);\n                    this._requestClose();\n                }.bind(this)\n            }))));\n        },\n        _renderGiftSuggestion: function(w, x, y) {\n            return (q(null, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            }), n.DOM.div(null, n.DOM.span({\n                className: \"fwb\"\n            }, u._(\"Surprise {name} with a gift\", {\n                JSBNG__name: x.firstName\n            })), j({\n                spacing: \"medium\",\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, o({\n                className: \"UFIGiftProductImg\",\n                src: y.giftproductimgsrc,\n                alt: \"product image\"\n            })), k({\n                alignv: \"middle\",\n                height: 79\n            }, n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                className: \"fwb\",\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, y.giftproductname)), n.DOM.p({\n                className: \"mvs fcg\"\n            }, y.giftproductpricerange), n.DOM.p({\n                className: \"mvs\"\n            }, m({\n                rel: \"async-post\",\n                ajaxify: w,\n                href: {\n                    url: \"#\"\n                }\n            }, \"Give This Gift\"), \" \\u00b7 \", m({\n                rel: \"async-post\",\n                ajaxify: this._getURI().toString(),\n                href: {\n                    url: \"#\"\n                }\n            }, \"See All Gifts\")))))));\n        },\n        _renderGiftLink: function(w, x) {\n            return (q(null, m({\n                className: \"UFIGiftIcon\",\n                tabIndex: \"-1\",\n                href: {\n                    url: \"#\"\n                },\n                rel: \"async-post\",\n                ajaxify: w\n            }, o({\n                src: t(\"/images/group_gifts/icons/gift_icon_red-13px.png\"),\n                alt: \"invite\"\n            })), m({\n                rel: \"async-post\",\n                href: {\n                    url: \"#\"\n                },\n                ajaxify: w\n            }, u._(\"Surprise {name} with a gift\", {\n                JSBNG__name: x.firstName\n            }))));\n        },\n        _log: function() {\n            var w = this.props.giftdata, x = {\n                opportunity_id: this.props.contextArgs.ftentidentifier,\n                sender_id: this.props.sender.id,\n                recipient_id: this.props.recipient.id,\n                link_description: \"UFIGiftSentence\",\n                product_id: ((w ? w.giftproductid : null)),\n                custom: {\n                    gift_occasion: this.props.contextArgs.giftoccasion,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                }\n            };\n            i.send([x,], this._entry_point);\n        },\n        _getURI: function(w) {\n            return r(\"/ajax/gifts/send\").addQueryData({\n                gift_occasion: this.props.contextArgs.giftoccasion,\n                recipient_id: this.props.recipient.id,\n                entry_point: this._entry_point,\n                product_id: w\n            });\n        },\n        _requestClose: function() {\n            var w = r(\"/ajax/gifts/moments/close/\");\n            new g().setMethod(\"POST\").setReadOnly(false).setURI(w).setData({\n                action: \"hide\",\n                data: JSON.stringify({\n                    type: \"detected_moment\",\n                    friend_id: this.props.recipient.id,\n                    ftentidentifier: this.props.contextArgs.ftentidentifier\n                })\n            }).send();\n        }\n    });\n    e.exports = v;\n});\n__d(\"UFILikeSentenceText.react\", [\"HovercardLinkInterpolator\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"TextWithEntities.react\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"HovercardLinkInterpolator\"), h = b(\"ProfileBrowserLink\"), i = b(\"ProfileBrowserTypes\"), j = b(\"React\"), k = b(\"TextWithEntities.react\"), l = b(\"URI\");\n    function m(p, q, r, s) {\n        if (((s.count != null))) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            };\n            return (j.DOM.a({\n                href: h.constructPageURI(t, u).toString(),\n                target: \"_blank\"\n            }, r));\n        }\n         else return g(r, s, \"_blank\", null, \"ufi\")\n    ;\n    };\n;\n    function n(p, q, r, s) {\n        if (((s.count != null))) {\n            var t = i.LIKES, u = {\n                id: p.targetfbid\n            }, v = [];\n            for (var w = 0; ((w < q.length)); w++) {\n                if (!q[w].count) {\n                    v.push(q[w].entities[0].id);\n                }\n            ;\n            ;\n            };\n        ;\n            var x = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                comment_fbid: p.targetfbid,\n                comment_from: p.actorforpost,\n                seen_user_fbids: ((v.length ? v : true))\n            });\n            return (j.DOM.a({\n                rel: \"dialog\",\n                ajaxify: h.constructDialogURI(t, u).toString(),\n                href: h.constructPageURI(t, u).toString(),\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"data-tooltip-uri\": x.toString()\n            }, r));\n        }\n         else return g(r, s, null, null, \"ufi\")\n    ;\n    };\n;\n    var o = j.createClass({\n        displayName: \"UFILikeSentenceText\",\n        render: function() {\n            var p = this.props.feedback, q = this.props.likeSentenceData, r;\n            if (this.props.contextArgs.embedded) {\n                r = m;\n            }\n             else r = n;\n        ;\n        ;\n            r = r.bind(null, p, q.ranges);\n            return (k({\n                interpolator: r,\n                ranges: q.ranges,\n                aggregatedRanges: q.aggregatedranges,\n                text: q.text\n            }));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFILikeSentence.react\", [\"Bootloader\",\"LeftRight.react\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"UFILikeSentenceText.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"LeftRight.react\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"UFIClassNames\"), m = b(\"UFIImageBlock.react\"), n = b(\"UFILikeSentenceText.react\"), o = b(\"URI\"), p = b(\"cx\"), q = b(\"joinClasses\"), r = b(\"tx\"), s = k.createClass({\n        displayName: \"UFILikeSentence\",\n        getInitialState: function() {\n            return {\n                selectorModule: null,\n                bootloadedSelectorModule: false\n            };\n        },\n        componentWillMount: function() {\n            this._bootloadSelectorModule(this.props);\n        },\n        componentWillReceiveProps: function(t) {\n            this._bootloadSelectorModule(t);\n        },\n        _bootloadSelectorModule: function(t) {\n            if (((t.showOrderingModeSelector && !this.state.bootloadedSelectorModule))) {\n                var u = function(v) {\n                    this.setState({\n                        selectorModule: v\n                    });\n                }.bind(this);\n                if (t.contextArgs.entstream) {\n                    g.loadModules([\"UFIEntStreamOrderingModeSelector.react\",], u);\n                }\n                 else g.loadModules([\"UFIOrderingModeSelector.react\",], u);\n            ;\n            ;\n                this.setState({\n                    bootloadedSelectorModule: true\n                });\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var t = this.props.feedback, u = t.likesentences.current, v = this.props.contextArgs.entstream, w = q(l.ROW, ((t.likesentences.isunseen ? l.UNSEEN_ITEM : \"\")), (((((\"UFILikeSentence\") + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), x = null, y = null;\n            if (u.text) {\n                y = k.DOM.div({\n                    className: \"UFILikeSentenceText\"\n                }, n({\n                    contextArgs: this.props.contextArgs,\n                    feedback: t,\n                    likeSentenceData: u\n                }));\n            }\n        ;\n        ;\n            if (((y && !v))) {\n                x = k.DOM.i({\n                    className: \"UFILikeIcon\"\n                });\n                if (((t.viewercanlike && !t.hasviewerliked))) {\n                    x = k.DOM.a({\n                        className: \"UFILikeThumb\",\n                        href: \"#\",\n                        tabIndex: \"-1\",\n                        title: \"Like this\",\n                        onClick: this.props.onTargetLikeToggle\n                    }, x);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var z = y, aa = null;\n            if (((((t.seencount > 0)) && !v))) {\n                var ba = j.GROUP_MESSAGE_VIEWERS, ca = {\n                    id: t.targetfbid\n                }, da = i.constructDialogURI(ba, ca), ea = i.constructPageURI(ba, ca), fa = new o(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: t.entidentifier,\n                    displayed_count: t.seencount\n                }), ga;\n                if (t.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((((t.seencount == 1)) ? \"Seen by 1\" : r._(\"Seen by {count}\", {\n                    count: t.seencount\n                })));\n            ;\n            ;\n                aa = k.DOM.a({\n                    rel: \"dialog\",\n                    ajaxify: da.toString(),\n                    href: ea.toString(),\n                    tabindex: \"-1\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"left\",\n                    \"data-tooltip-uri\": fa.toString(),\n                    className: (((\"UFISeenCount\") + ((!!u.text ? ((\" \" + \"UFISeenCountRight\")) : \"\"))))\n                }, k.DOM.span({\n                    className: \"UFISeenCountIcon\"\n                }), ga);\n            }\n             else if (((this.props.showOrderingModeSelector && this.state.selectorModule))) {\n                var ha = this.state.selectorModule;\n                aa = ha({\n                    currentOrderingMode: this.props.orderingMode,\n                    entstream: v,\n                    orderingmodes: t.orderingmodes,\n                    onOrderChanged: this.props.onOrderingModeChange\n                });\n                if (!z) {\n                    z = k.DOM.div(null);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ia = null;\n            if (((x && y))) {\n                ia = m(null, x, y, aa);\n            }\n             else if (z) {\n                ia = h(null, z, aa);\n            }\n             else ia = aa;\n            \n        ;\n        ;\n            return (k.DOM.li({\n                className: w\n            }, ia));\n        }\n    });\n    e.exports = s;\n});\n__d(\"UFIPager.react\", [\"LeftRight.react\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"LeftRight.react\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"cx\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"UFIPager\",\n        onPagerClick: function(n) {\n            ((((!this.props.isLoading && this.props.onPagerClick)) && this.props.onPagerClick()));\n            n.nativeEvent.prevent();\n        },\n        render: function() {\n            var n = this.onPagerClick, o = ((this.props.isLoading ? \"ufiPagerLoading\" : \"\")), p = l(i.ROW, ((this.props.isUnseen ? i.UNSEEN_ITEM : \"\")), (((((((((\"UFIPagerRow\") + ((this.props.isFirstCommentComponent ? ((\" \" + \"UFIFirstCommentComponent\")) : \"\")))) + ((this.props.isLastCommentComponent ? ((\" \" + \"UFILastCommentComponent\")) : \"\")))) + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), q = h.DOM.a({\n                className: \"UFIPagerLink\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }, h.DOM.span({\n                className: o\n            }, this.props.pagerLabel)), r = (((\"fcg\") + ((\" \" + \"UFIPagerCount\")))), s = h.DOM.span({\n                className: r\n            }, this.props.countSentence), t;\n            if (this.props.contextArgs.entstream) {\n                t = (g({\n                    direction: g.DIRECTION.right\n                }, q, s));\n            }\n             else t = (j(null, h.DOM.a({\n                className: \"UFIPagerIcon\",\n                onClick: n,\n                href: \"#\",\n                role: \"button\"\n            }), q, s));\n        ;\n        ;\n            return (h.DOM.li({\n                className: p,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, t));\n        }\n    });\n    e.exports = m;\n});\n__d(\"UFIReplySocialSentence.react\", [\"LiveTimer\",\"React\",\"Timestamp.react\",\"UFIClassNames\",\"UFIConstants\",\"UFIImageBlock.react\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"LiveTimer\"), h = b(\"React\"), i = b(\"Timestamp.react\"), j = b(\"UFIClassNames\"), k = b(\"UFIConstants\"), l = b(\"UFIImageBlock.react\"), m = b(\"cx\"), n = b(\"joinClasses\"), o = b(\"tx\"), p = \" \\u00b7 \", q = 43200, r = h.createClass({\n        displayName: \"UFIReplySocialSentence\",\n        render: function() {\n            var s = ((this.props.isLoading ? \"UFIReplySocialSentenceLoading\" : \"\")), t = n(j.ROW, (((((\"UFIReplySocialSentenceRow\") + ((this.props.isFirstComponent ? ((\" \" + \"UFIFirstComponent\")) : \"\")))) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\"))))), u, v;\n            if (this.props.isExpanded) {\n                u = ((((this.props.replies > 1)) ? o._(\"Hide {count} Replies\", {\n                    count: this.props.replies\n                }) : \"Hide 1 Reply\"));\n            }\n             else {\n                u = ((((this.props.replies > 1)) ? o._(\"{count} Replies\", {\n                    count: this.props.replies\n                }) : \"1 Reply\"));\n                if (this.props.timestamp) {\n                    var w = ((((g.getApproximateServerTime() / 1000)) - this.props.timestamp.time));\n                    if (((((w < q)) || ((this.props.orderingMode == k.UFICommentOrderingMode.RECENT_ACTIVITY))))) {\n                        v = h.DOM.span({\n                            className: \"fcg\"\n                        }, p, i({\n                            time: this.props.timestamp.time,\n                            text: this.props.timestamp.text,\n                            verbose: this.props.timestamp.verbose\n                        }));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var x = Object.keys(this.props.authors), y = ((x.length && !this.props.isExpanded)), z, aa;\n            if (y) {\n                var ba = this.props.authors[x[0]];\n                z = h.DOM.img({\n                    alt: \"\",\n                    src: ba.thumbSrc,\n                    className: j.ACTOR_IMAGE\n                });\n                aa = [o._(\"{author} replied\", {\n                    author: ba.JSBNG__name\n                }),p,u,];\n            }\n             else {\n                z = h.DOM.i({\n                    className: ((((!this.props.isExpanded ? \"UFIPagerIcon\" : \"\")) + ((this.props.isExpanded ? ((\" \" + \"UFICollapseIcon\")) : \"\"))))\n                });\n                aa = u;\n            }\n        ;\n        ;\n            return (h.DOM.li({\n                className: t,\n                \"data-ft\": this.props[\"data-ft\"]\n            }, h.DOM.a({\n                className: \"UFICommentLink\",\n                onClick: this.props.onClick,\n                href: \"#\",\n                role: \"button\"\n            }, l(null, h.DOM.div({\n                className: ((y ? \"UFIReplyActorPhotoWrapper\" : \"\"))\n            }, z), h.DOM.span({\n                className: s\n            }, h.DOM.span({\n                className: \"UFIReplySocialSentenceLinkText\"\n            }, aa), v)))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"UFIShareRow.react\", [\"NumberFormat\",\"React\",\"UFIClassNames\",\"UFIImageBlock.react\",\"URI\",\"cx\",\"joinClasses\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"UFIClassNames\"), j = b(\"UFIImageBlock.react\"), k = b(\"URI\"), l = b(\"cx\"), m = b(\"joinClasses\"), n = b(\"tx\"), o = h.createClass({\n        displayName: \"UFIShareRow\",\n        render: function() {\n            var p = new k(\"/ajax/shares/view\").setQueryData({\n                target_fbid: this.props.targetID\n            }), q = new k(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                id: this.props.targetID\n            }), r;\n            if (((this.props.shareCount > 1))) {\n                var s = g.formatIntegerWithDelimiter(this.props.shareCount, ((this.props.contextArgs.numberdelimiter || \",\")));\n                r = n._(\"{count} shares\", {\n                    count: s\n                });\n            }\n             else r = \"1 share\";\n        ;\n        ;\n            var t = m(i.ROW, ((((this.props.isFirstComponent ? \"UFIFirstComponent\" : \"\")) + ((this.props.isLastComponent ? ((\" \" + \"UFILastComponent\")) : \"\")))));\n            return (h.DOM.li({\n                className: t\n            }, j(null, h.DOM.a({\n                className: \"UFIShareIcon\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }), h.DOM.a({\n                className: \"UFIShareLink\",\n                rel: \"dialog\",\n                ajaxify: p.toString(),\n                href: q.toString()\n            }, r))));\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFISpamPlaceholder.react\", [\"React\",\"UFIClassNames\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"UFIClassNames\"), i = b(\"cx\"), j = b(\"tx\"), k = g.createClass({\n        displayName: \"UFISpamPlaceholder\",\n        render: function() {\n            var l = (((\"UFISpamCommentWrapper\") + ((this.props.isLoading ? ((\" \" + \"UFISpamCommentLoading\")) : \"\"))));\n            return (g.DOM.li({\n                className: h.ROW\n            }, g.DOM.a({\n                href: \"#\",\n                role: \"button\",\n                className: \"UFISpamCommentLink\",\n                onClick: this.props.onClick\n            }, g.DOM.span({\n                \"data-hover\": \"tooltip\",\n                \"data-tooltip-alignh\": \"center\",\n                \"aria-label\": j._(\"{count} hidden\", {\n                    count: this.props.numHidden\n                }),\n                className: l\n            }, g.DOM.i({\n                className: \"placeholderIcon\"\n            })))));\n        }\n    });\n    e.exports = k;\n});\n__d(\"UFI.react\", [\"NumberFormat\",\"React\",\"LegacyScrollableArea.react\",\"TrackingNodes\",\"UFIAddCommentController\",\"UFIAddCommentLink.react\",\"UFIComment.react\",\"UFIConstants\",\"UFIContainer.react\",\"UFIGiftSentence.react\",\"UFIInstanceState\",\"UFILikeSentence.react\",\"UFIPager.react\",\"UFIReplySocialSentence.react\",\"UFIShareRow.react\",\"UFISpamPlaceholder.react\",\"copyProperties\",\"isEmpty\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"NumberFormat\"), h = b(\"React\"), i = b(\"LegacyScrollableArea.react\"), j = b(\"TrackingNodes\"), k = b(\"UFIAddCommentController\"), l = b(\"UFIAddCommentLink.react\"), m = b(\"UFIComment.react\"), n = b(\"UFIConstants\"), o = b(\"UFIContainer.react\"), p = b(\"UFIGiftSentence.react\"), q = b(\"UFIInstanceState\"), r = b(\"UFILikeSentence.react\"), s = b(\"UFIPager.react\"), t = b(\"UFIReplySocialSentence.react\"), u = b(\"UFIShareRow.react\"), v = b(\"UFISpamPlaceholder.react\"), w = b(\"copyProperties\"), x = b(\"isEmpty\"), y = b(\"tx\"), z = h.createClass({\n        displayName: \"UFI\",\n        getInitialState: function() {\n            return {\n                requestRanges: w({\n                }, this.props.availableRanges),\n                instanceShowRepliesMap: {\n                },\n                instanceShowReplySocialSentenceMap: {\n                },\n                loadingSpamIDs: {\n                },\n                isActiveLoading: false,\n                hasPagedToplevel: false\n            };\n        },\n        componentWillReceiveProps: function(aa) {\n            if (this.state.isActiveLoading) {\n                var ba = this.props.availableRanges[this.props.id], ca = aa.availableRanges[this.props.id];\n                if (((((ba.offset != ca.offset)) || ((ba.length != ca.length))))) {\n                    var da = ((((ca.offset < ba.offset)) ? 0 : ba.length));\n                    if (((da < aa.availableComments.length))) {\n                        var ea = aa.availableComments[da].ufiinstanceid;\n                        q.updateState(ea, \"autofocus\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.setState({\n                    isActiveLoading: false\n                });\n            }\n        ;\n        ;\n            if (((aa.orderingMode != this.props.orderingMode))) {\n                this.setState({\n                    requestRanges: w({\n                    }, aa.availableRanges)\n                });\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var aa = this.props, ba = aa.feedback, ca = aa.contextArgs, da = ((aa.source != n.UFIFeedbackSourceType.ADS)), ea = ((ba.orderingmodes && ((aa.commentCounts[aa.id] >= n.minCommentsForOrderingModeSelector)))), fa = ((((((!x(ba.likesentences.current) || ((((ba.seencount > 0)) && !ca.entstream)))) || ea)) && da)), ga = null;\n            if (fa) {\n                ga = r({\n                    contextArgs: ca,\n                    feedback: ba,\n                    onTargetLikeToggle: aa.onTargetLikeToggle,\n                    onOrderingModeChange: aa.onOrderingModeChange,\n                    orderingMode: aa.orderingMode,\n                    showOrderingModeSelector: ea\n                });\n            }\n        ;\n        ;\n            var ha = null;\n            if (((((aa.feedback.hasviewerliked && this._shouldShowGiftSentence())) && !ca.embedded))) {\n                ha = p({\n                    contextArgs: ca,\n                    recipient: aa.giftRecipient,\n                    sender: aa.authorProfiles[ba.actorforpost],\n                    giftdata: aa.feedback.giftdata\n                });\n            }\n        ;\n        ;\n            var ia = ((((aa.availableComments && aa.availableComments.length)) && da)), ja = null;\n            if (ia) {\n                ja = this.renderCommentMap(aa.availableComments, aa.availableRanges[aa.id].offset);\n            }\n        ;\n        ;\n            var ka = null, la = ba.cancomment, ma = ((((((la && ca.showaddcomment)) && ba.actorforpost)) && !ca.embedded));\n            if (ma) {\n                var na = new k(null, aa.id, null, ca), oa = aa.authorProfiles[ba.actorforpost];\n                ka = na.renderAddComment(oa, ba.ownerid, ba.mentionsdatasource, ba.showsendonentertip, \"toplevelcomposer\", null, ba.allowphotoattachments, ba.subtitle);\n            }\n        ;\n        ;\n            var pa = null, qa = ((((ca.showshares && ba.sharecount)) && da));\n            if (((((qa && !ca.entstream)) && !ca.embedded))) {\n                pa = u({\n                    targetID: ba.targetfbid,\n                    shareCount: ba.sharecount,\n                    contextArgs: ca\n                });\n            }\n        ;\n        ;\n            var ra = ((((((fa || qa)) || ia)) || la)), sa = this.renderPagers();\n            this.applyToUFIComponents([sa.topPager,], ja, [sa.bottomPager,], {\n                isFirstCommentComponent: true\n            }, {\n                isLastCommentComponent: true\n            });\n            var ta = ((ba.commentboxhoisted ? ka : null)), ua = ((ba.commentboxhoisted ? null : ka)), va = null;\n            if (((((((ma && ba.hasaddcommentlink)) && this.state.hasPagedToplevel)) && !ca.embedded))) {\n                va = l({\n                    onClick: this.onComment\n                });\n            }\n        ;\n        ;\n            this.applyToUFIComponents([ga,pa,ta,sa.topPager,], ja, [sa.bottomPager,ua,va,], {\n                isFirstComponent: true\n            }, {\n                isLastComponent: true\n            });\n            var wa = [sa.topPager,ja,sa.bottomPager,];\n            if (ca.embedded) {\n                wa = null;\n            }\n             else if (((ca.scrollcomments && ca.scrollwidth))) {\n                wa = h.DOM.li(null, i({\n                    width: ca.scrollwidth\n                }, h.DOM.ul(null, wa)));\n            }\n            \n        ;\n        ;\n            return (o({\n                hasNub: ((ca.shownub && ra))\n            }, ga, ha, pa, ta, wa, ua, va));\n        },\n        applyToUFIComponents: function(aa, ba, ca, da, ea) {\n            var fa = Object.keys(((ba || {\n            }))).map(function(ha) {\n                return ba[ha];\n            }), ga = [].concat(aa, fa, ca);\n            this._applyToFirstComponent(ga, da);\n            ga.reverse();\n            this._applyToFirstComponent(ga, ea);\n        },\n        _applyToFirstComponent: function(aa, ba) {\n            for (var ca = 0; ((ca < ((aa || [])).length)); ca++) {\n                if (aa[ca]) {\n                    w(aa[ca].props, ba);\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        renderCommentMap: function(aa, ba) {\n            var ca = this.props, da = {\n            }, ea = aa.length;\n            if (!ea) {\n                return da;\n            }\n        ;\n        ;\n            var fa = aa[0].parentcommentid, ga = [], ha = function() {\n                if (((ga.length > 0))) {\n                    var qa = function(ra, sa) {\n                        this.state.loadingSpamIDs[ra[0]] = true;\n                        this.forceUpdate();\n                        ca.onSpamFetch(ra, sa);\n                    }.bind(this, ga, fa);\n                    da[((\"spam\" + ga[0]))] = v({\n                        onClick: qa,\n                        numHidden: ga.length,\n                        isLoading: !!this.state.loadingSpamIDs[ga[0]]\n                    });\n                    ga = [];\n                }\n            ;\n            ;\n            }.bind(this), ia = ca.instanceid, ja = q.getKeyForInstance(ia, \"editcommentid\"), ka = !!aa[0].parentcommentid, la = false;\n            for (var ma = 0; ((ma < ea)); ma++) {\n                if (((aa[ma].JSBNG__status == n.UFIStatus.SPAM))) {\n                    ga.push(aa[ma].id);\n                }\n                 else {\n                    ha();\n                    var na = Math.max(((((ca.loggingOffset - ma)) - ba)), 0), oa = aa[ma], pa;\n                    if (((oa.id == ja))) {\n                        pa = this.renderEditCommentBox(oa);\n                    }\n                     else {\n                        pa = this.renderComment(oa, na);\n                        pa.props.isFirst = ((ma === 0));\n                        pa.props.isLast = ((ma === ((ea - 1))));\n                        if (!ka) {\n                            pa.props.showReplyLink = true;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    da[((\"comment\" + oa.id))] = pa;\n                    if (((((((((ca.feedback.actorforpost === oa.author)) && !la)) && !ca.feedback.hasviewerliked)) && this._shouldShowGiftSentence()))) {\n                        da[((\"gift\" + oa.id))] = p({\n                            contextArgs: ca.contextArgs,\n                            recipient: ca.giftRecipient,\n                            sender: ca.authorProfiles[ca.feedback.actorforpost],\n                            giftdata: ca.feedback.giftdata\n                        });\n                        la = true;\n                    }\n                ;\n                ;\n                    if (((oa.JSBNG__status !== n.UFIStatus.DELETED))) {\n                        da[((\"replies\" + oa.id))] = this.renderReplyContainer(oa);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            ha();\n            return da;\n        },\n        _shouldShowGiftSentence: function() {\n            var aa = this.props;\n            return ((aa.contextArgs.giftoccasion && !aa.contextArgs.entstream));\n        },\n        renderReplyContainer: function(aa) {\n            var ba = this.props, ca = {\n            };\n            for (var da = 0; ((da < ((aa.replyauthors || [])).length)); da++) {\n                var ea = ba.authorProfiles[aa.replyauthors[da]];\n                if (ea) {\n                    ca[ea.id] = ea;\n                }\n            ;\n            ;\n            };\n        ;\n            var fa = ((((ba.repliesMap && ba.repliesMap[aa.id])) && this._shouldShowCommentReplies(aa.id))), ga, ha = Math.max(((aa.replycount - aa.spamreplycount)), 0);\n            if (((ha && this._shouldShowReplySocialSentence(aa.id)))) {\n                var ia = ((this._shouldShowCommentReplies(aa.id) && ((this.isLoadingPrev(aa.id) || this.isLoadingNext(aa.id)))));\n                ga = t({\n                    authors: ca,\n                    replies: ha,\n                    timestamp: aa.recentreplytimestamp,\n                    onClick: this.onToggleReplies.bind(this, aa),\n                    isLoading: ia,\n                    isExpanded: fa,\n                    orderingMode: this.props.orderingMode\n                });\n            }\n        ;\n        ;\n            var ja, ka, la, ma;\n            if (fa) {\n                var na = this.renderPagers(aa.id);\n                ja = na.topPager;\n                la = na.bottomPager;\n                ka = this.renderCommentMap(ba.repliesMap[aa.id], ba.availableRanges[aa.id].offset);\n                var oa = Object.keys(ka);\n                for (var pa = 0; ((pa < oa.length)); pa++) {\n                    var qa = ka[oa[pa]];\n                    if (qa) {\n                        qa.props.hasPartialBorder = ((pa !== 0));\n                    }\n                ;\n                ;\n                };\n            ;\n                if (ba.feedback.cancomment) {\n                    var ra = false, sa = Object.keys(ka);\n                    for (var da = ((sa.length - 1)); ((da >= 0)); da--) {\n                        var ta = sa[da];\n                        if (((ta && ka[ta]))) {\n                            ra = ka[ta].props.isAuthorReply;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    ma = this.renderReplyComposer(aa, !ra);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var ua;\n            if (((((((((ga || ja)) || ka)) || la)) || ma))) {\n                this.applyToUFIComponents([ga,ja,], ka, [la,ma,], {\n                    isFirstComponent: true\n                }, {\n                    isLastComponent: true\n                });\n                var va = ((aa.JSBNG__status === n.UFIStatus.LIVE_DELETED));\n                ua = o({\n                    isParentLiveDeleted: va,\n                    isReplyList: true\n                }, ga, ja, ka, la, ma);\n            }\n        ;\n        ;\n            return ua;\n        },\n        renderReplyComposer: function(aa, ba) {\n            var ca = this.props;\n            return (new k(null, ca.id, aa.id, ca.contextArgs)).renderAddComment(ca.authorProfiles[ca.feedback.actorforpost], ca.feedback.ownerid, ca.feedback.mentionsdatasource, false, ((\"replycomposer-\" + aa.id)), ba, ca.feedback.allowphotoattachments);\n        },\n        renderEditCommentBox: function(aa) {\n            var ba = new k(null, this.props.id, null, {\n            }), ca = ba.renderEditComment(this.props.authorProfiles[this.props.feedback.actorforpost], this.props.feedback.ownerid, aa.id, this.props.feedback.mentionsdatasource, this.props.onEditAttempt.bind(null, aa), this.props.onCancelEdit, this.props.feedback.allowphotoattachments);\n            return ca;\n        },\n        _shouldShowCommentReplies: function(aa) {\n            if (((aa in this.state.instanceShowRepliesMap))) {\n                return this.state.instanceShowRepliesMap[aa];\n            }\n             else if (((aa in this.props.showRepliesMap))) {\n                return this.props.showRepliesMap[aa];\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        _shouldShowReplySocialSentence: function(aa) {\n            if (((aa in this.state.instanceShowReplySocialSentenceMap))) {\n                return this.state.instanceShowReplySocialSentenceMap[aa];\n            }\n             else if (((aa in this.props.showReplySocialSentenceMap))) {\n                return this.props.showReplySocialSentenceMap[aa];\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        renderComment: function(aa, ba) {\n            var ca = this.props, da = ca.feedback, ea = ((da.actorforpost === aa.author)), fa = q.getKeyForInstance(this.props.instanceid, \"locallycomposed\"), ga = ((aa.islocal || ((fa && fa[aa.id])))), ha = ((da.showremovemenu || ((da.viewerid === aa.author)))), ia = ((((da.canremoveall && da.isownerpage)) && !ea)), ja = ((ca.source != n.UFIFeedbackSourceType.INTERN)), ka = j.getTrackingInfo(j.types.COMMENT, ba), la = !!aa.parentcommentid, ma = this._shouldShowCommentReplies(aa.id), na = !!aa.isfeatured;\n            return (m({\n                comment: aa,\n                authorProfiles: this.props.authorProfiles,\n                viewerIsAuthor: ea,\n                feedback: da,\n                \"data-ft\": ka,\n                contextArgs: this.props.contextArgs,\n                hideAsSpamForPageAdmin: ia,\n                isLocallyComposed: ga,\n                isReply: la,\n                isFeatured: na,\n                showPermalink: ja,\n                showRemoveReportMenu: ha,\n                showReplies: ma,\n                onCommentLikeToggle: ca.onCommentLikeToggle.bind(null, aa),\n                onCommentReply: this.onCommentReply.bind(this, aa),\n                onCommentTranslate: ca.onCommentTranslate.bind(null, aa),\n                onEdit: ca.onCommentEdit.bind(null, aa),\n                onHideAsSpam: ca.onCommentHideAsSpam.bind(null, aa),\n                onInlineBan: ca.onCommentInlineBan.bind(null, aa),\n                onMarkAsNotSpam: ca.onCommentMarkAsNotSpam.bind(null, aa),\n                onOneClickRemove: ca.onCommentOneClickRemove.bind(null, aa),\n                onPreviewRemove: ca.onPreviewRemove.bind(null, aa),\n                onRemove: ca.onCommentRemove.bind(null, aa),\n                onRetrySubmit: ca.onRetrySubmit.bind(null, aa),\n                onUndoInlineBan: ca.onCommentUndoInlineBan.bind(null, aa),\n                onUndoOneClickRemove: ca.onCommentUndoOneClickRemove.bind(null, aa)\n            }));\n        },\n        _updateRepliesState: function(aa, ba, ca) {\n            var da = this.state.instanceShowRepliesMap;\n            da[aa] = ba;\n            var ea = this.state.instanceShowReplySocialSentenceMap;\n            ea[aa] = ca;\n            this.setState({\n                instanceShowRepliesMap: da,\n                instanceShowReplySocialSentenceMap: ea\n            });\n        },\n        onToggleReplies: function(aa) {\n            var ba = !this._shouldShowCommentReplies(aa.id), ca = ((this._shouldShowReplySocialSentence(aa.id) && !((ba && ((aa.replycount <= this.props.replySocialSentenceMaxReplies))))));\n            this._updateRepliesState(aa.id, ba, ca);\n            var da = this.props.availableRanges[aa.id].length;\n            if (((aa.id in this.state.requestRanges))) {\n                da = this.state.requestRanges[aa.id].length;\n            }\n        ;\n        ;\n            da -= this.props.deletedCounts[aa.id];\n            if (((ba && ((da === 0))))) {\n                var ea = this.props.commentCounts[aa.id], fa = Math.min(ea, this.props.pageSize);\n                this.onPage(aa.id, {\n                    offset: ((ea - fa)),\n                    length: fa\n                });\n            }\n        ;\n        ;\n        },\n        onPage: function(aa, ba) {\n            var ca = this.state.requestRanges;\n            ca[aa] = ba;\n            var da = ((this.state.hasPagedToplevel || ((aa === this.props.id))));\n            this.setState({\n                requestRanges: ca,\n                isActiveLoading: true,\n                hasPagedToplevel: da\n            });\n            this.props.onChangeRange(aa, ba);\n        },\n        isLoadingPrev: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            }\n        ;\n        ;\n            var ca = this.state.requestRanges[aa].offset, da = ba.availableRanges[aa].offset;\n            return ((ca < da));\n        },\n        isLoadingNext: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            if (!this.state.requestRanges[aa]) {\n                this.state.requestRanges[aa] = ba.availableRanges[aa];\n            }\n        ;\n        ;\n            var ca = this.state.requestRanges[aa].offset, da = this.state.requestRanges[aa].length, ea = ba.availableRanges[aa].offset, fa = ba.availableRanges[aa].length;\n            return ((((ca + da)) > ((ea + fa))));\n        },\n        renderPagers: function(aa) {\n            var ba = this.props;\n            aa = ((aa || ba.id));\n            var ca = ba.availableRanges[aa].offset, da = ba.availableRanges[aa].length, ea = ba.deletedCounts[aa], fa = ba.commentCounts[aa], ga = ((fa - ea)), ha = ((da - ea)), ia = ((ba.contextArgs.numberdelimiter || \",\")), ja = ((aa !== ba.id)), ka = {\n                topPager: null,\n                bottomPager: null\n            };\n            if (((ba.source == n.UFIFeedbackSourceType.ADS))) {\n                return ka;\n            }\n        ;\n        ;\n            var la = this.isLoadingPrev(aa), ma = this.isLoadingNext(aa);\n            if (((da == fa))) {\n                return ka;\n            }\n        ;\n        ;\n            var na = ((((ca + da)) == fa));\n            if (((((((fa < ba.pageSize)) && na)) || ((ha === 0))))) {\n                var oa = Math.min(fa, ba.pageSize), pa = this.onPage.bind(this, aa, {\n                    offset: ((fa - oa)),\n                    length: oa\n                }), qa, ra;\n                if (((ha === 0))) {\n                    if (((ga == 1))) {\n                        qa = ((ja ? \"View 1 reply\" : \"View 1 comment\"));\n                    }\n                     else {\n                        ra = g.formatIntegerWithDelimiter(ga, ia);\n                        qa = ((ja ? y._(\"View all {count} replies\", {\n                            count: ra\n                        }) : y._(\"View all {count} comments\", {\n                            count: ra\n                        })));\n                    }\n                ;\n                ;\n                }\n                 else if (((((ga - ha)) == 1))) {\n                    qa = ((ja ? \"View 1 more reply\" : \"View 1 more comment\"));\n                }\n                 else {\n                    ra = g.formatIntegerWithDelimiter(((ga - ha)), ia);\n                    qa = ((ja ? y._(\"View {count} more replies\", {\n                        count: ra\n                    }) : y._(\"View {count} more comments\", {\n                        count: ra\n                    })));\n                }\n                \n            ;\n            ;\n                var sa = j.getTrackingInfo(j.types.VIEW_ALL_COMMENTS), ta = s({\n                    contextArgs: ba.contextArgs,\n                    isUnseen: ba.feedback.hasunseencollapsed,\n                    isLoading: la,\n                    pagerLabel: qa,\n                    onPagerClick: pa,\n                    \"data-ft\": sa\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.bottomPager = ta;\n                }\n                 else ka.topPager = ta;\n            ;\n            ;\n                return ka;\n            }\n        ;\n        ;\n            if (((ca > 0))) {\n                var ua = Math.max(((ca - ba.pageSize)), 0), oa = ((((ca + da)) - ua)), va = this.onPage.bind(this, aa, {\n                    offset: ua,\n                    length: oa\n                }), wa = g.formatIntegerWithDelimiter(ha, ia), xa = g.formatIntegerWithDelimiter(ga, ia), ya = y._(\"{countshown} of {totalcount}\", {\n                    countshown: wa,\n                    totalcount: xa\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: \"View more comments\",\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n                 else {\n                    var za = ((ja ? \"View previous replies\" : \"View previous comments\"));\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: la,\n                        pagerLabel: za,\n                        onPagerClick: va,\n                        countSentence: ya\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((ca + da)) < fa))) {\n                var ab = Math.min(((da + ba.pageSize)), ((fa - ca))), bb = this.onPage.bind(this, aa, {\n                    offset: ca,\n                    length: ab\n                });\n                if (((ba.feedback.isranked && !ja))) {\n                    ka.topPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: \"View previous comments\",\n                        onPagerClick: bb\n                    });\n                }\n                 else {\n                    var cb = ((ja ? \"View more replies\" : \"View more comments\"));\n                    ka.bottomPager = s({\n                        contextArgs: ba.contextArgs,\n                        isLoading: ma,\n                        pagerLabel: cb,\n                        onPagerClick: bb\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ka;\n        },\n        onCommentReply: function(aa) {\n            var ba = ((aa.parentcommentid || aa.id));\n            if (!this._shouldShowCommentReplies(ba)) {\n                this.onToggleReplies(aa);\n            }\n        ;\n        ;\n            if (((this.refs && this.refs[((\"replycomposer-\" + ba))]))) {\n                this.refs[((\"replycomposer-\" + ba))].JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        onComment: function() {\n            if (((this.refs && this.refs.toplevelcomposer))) {\n                this.refs.toplevelcomposer.JSBNG__focus();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = z;\n});\n__d(\"onEnclosingPageletDestroy\", [\"Arbiter\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMQuery\");\n    function i(j, k) {\n        var l = g.subscribe(\"pagelet/destroy\", function(m, n) {\n            if (h.contains(n.root, j)) {\n                l.unsubscribe();\n                k();\n            }\n        ;\n        ;\n        });\n        return l;\n    };\n;\n    e.exports = i;\n});\n__d(\"UFIController\", [\"Arbiter\",\"Bootloader\",\"JSBNG__CSS\",\"DOM\",\"ImmutableObject\",\"LayerRemoveOnHide\",\"LiveTimer\",\"Parent\",\"React\",\"ReactMount\",\"ShortProfiles\",\"UFI.react\",\"UFIActionLinkController\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIInstanceState\",\"UFIUserActions\",\"URI\",\"copyProperties\",\"isEmpty\",\"onEnclosingPageletDestroy\",\"tx\",\"UFICommentTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"ImmutableObject\"), l = b(\"LayerRemoveOnHide\"), m = b(\"LiveTimer\"), n = b(\"Parent\"), o = b(\"React\"), p = b(\"ReactMount\"), q = b(\"ShortProfiles\"), r = b(\"UFI.react\"), s = b(\"UFIActionLinkController\"), t = b(\"UFICentralUpdates\"), u = b(\"UFIComments\"), v = b(\"UFIConstants\"), w = b(\"UFIFeedbackTargets\"), x = b(\"UFIInstanceState\"), y = b(\"UFIUserActions\"), z = b(\"URI\"), aa = b(\"copyProperties\"), ba = b(\"isEmpty\"), ca = b(\"onEnclosingPageletDestroy\"), da = b(\"tx\"), ea = b(\"UFICommentTemplates\"), fa = function(ia, ja, ka, la) {\n        var ma = ((((ia.offset + ia.length)) === ja));\n        return {\n            offset: ia.offset,\n            length: ((((ma && ga(la))) ? ((ka - ia.offset)) : ia.length))\n        };\n    }, ga = function(ia) {\n        return ((((ia == v.UFIPayloadSourceType.USER_ACTION)) || ((ia == v.UFIPayloadSourceType.LIVE_SEND))));\n    };\n    function ha(ia, ja, ka) {\n        this.root = ia;\n        this.id = ja.ftentidentifier;\n        this.source = ja.source;\n        this._ufiInstanceID = ja.instanceid;\n        this._contextArgs = ja;\n        this._contextArgs.rootid = this.root.id;\n        this._verifiedCommentsExpanded = false;\n        var la = ka.feedbacktargets[0];\n        this.actionLink = new s(ia, this._contextArgs, la);\n        this.orderingMode = la.defaultcommentorderingmode;\n        var ma = ka.commentlists.comments[this.id][this.orderingMode];\n        this.replyRanges = {\n        };\n        this.repliesMap = {\n        };\n        this.showRepliesMap = {\n        };\n        this.showReplySocialSentenceMap = {\n        };\n        this.commentcounts = {\n        };\n        this.commentcounts[this.id] = u.getCommentCount(this.id);\n        var na = {\n        }, oa = ((la.orderingmodes || [{\n            value: this.orderingMode\n        },]));\n        oa.forEach(function(sa) {\n            na[sa.value] = aa({\n            }, ma.range);\n        });\n        this.ranges = na;\n        if (ka.commentlists.replies) {\n            for (var pa = 0; ((pa < ma.values.length)); pa++) {\n                var qa = ma.values[pa], ra = ka.commentlists.replies[qa];\n                if (ra) {\n                    this.commentcounts[qa] = u.getCommentCount(qa);\n                    this.replyRanges[qa] = aa({\n                    }, ra.range);\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        this._loggingOffset = null;\n        this._ufi = null;\n        this.ufiCentralUpdatesSubscriptions = [t.subscribe(\"feedback-updated\", function(sa, ta) {\n            var ua = ta.updates, va = ta.payloadSource;\n            if (((((va != v.UFIPayloadSourceType.COLLAPSED_UFI)) && ((this.id in ua))))) {\n                this.fetchAndUpdate(this.render.bind(this), va);\n            }\n        ;\n        ;\n        }.bind(this)),t.subscribe(\"feedback-id-changed\", function(sa, ta) {\n            var ua = ta.updates;\n            if (((this.id in ua))) {\n                this.id = ua[this.id];\n            }\n        ;\n        ;\n        }.bind(this)),t.subscribe(\"instance-updated\", function(sa, ta) {\n            var ua = ta.updates;\n            if (((this._ufiInstanceID in ua))) {\n                var va = ua[this._ufiInstanceID];\n                if (va.editcommentid) {\n                    this.render(ta.payloadSource);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),t.subscribe(\"update-comment-lists\", function(sa, ta) {\n            if (((ta.commentlists && ta.commentlists.replies))) {\n                var ua = ta.commentlists.replies;\n                {\n                    var fin104keys = ((window.top.JSBNG_Replay.forInKeys)((ua))), fin104i = (0);\n                    var va;\n                    for (; (fin104i < fin104keys.length); (fin104i++)) {\n                        ((va) = (fin104keys[fin104i]));\n                        {\n                            if (((((((((this.id != va)) && ua[va])) && ((ua[va].ftentidentifier == this.id)))) && !this.replyRanges[va]))) {\n                                this.replyRanges[va] = ua[va].range;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),];\n        this.clearPageletSubscription = ca(this.root, this._onEnclosingPageletDestroy.bind(this));\n        this.clearPageSubscription = g.subscribe(\"ufi/page_cleared\", this._onDestroy.bind(this));\n        t.handleUpdate(v.UFIPayloadSourceType.INITIAL_SERVER, ka);\n        if (this._contextArgs.viewas) {\n            this.viewasUFICleanSubscription = g.subscribe(\"pre_page_transition\", function(sa, ta) {\n                if (((this._contextArgs.viewas !== z(ta.to).getQueryData(\"viewas\")))) {\n                    u.resetFeedbackTarget(this.id);\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        h.loadModules([\"ScrollAwareDOM\",], function(sa) {\n            p.scrollMonitor = sa.monitor;\n        });\n    };\n;\n    aa(ha.prototype, {\n        _getParentForm: function() {\n            if (!this._form) {\n                this._form = n.byTag(this.root, \"form\");\n            }\n        ;\n        ;\n            return this._form;\n        },\n        _onTargetLikeToggle: function(JSBNG__event) {\n            var ia = !this.feedback.hasviewerliked;\n            y.changeLike(this.id, ia, {\n                source: this.source,\n                target: JSBNG__event.target,\n                rootid: this._contextArgs.rootid\n            });\n            JSBNG__event.preventDefault();\n        },\n        _onCommentLikeToggle: function(ia, JSBNG__event) {\n            var ja = !ia.hasviewerliked;\n            y.changeCommentLike(ia.id, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentEdit: function(ia) {\n            x.updateState(this._ufiInstanceID, \"isediting\", true);\n            x.updateState(this._ufiInstanceID, \"editcommentid\", ia.id);\n        },\n        _onEditAttempt: function(ia, ja, JSBNG__event) {\n            if (((!ja.visibleValue && !ja.attachedPhoto))) {\n                this._onCommentRemove(ia, JSBNG__event);\n            }\n             else y.editComment(ia.id, ja.visibleValue, ja.encodedValue, {\n                source: this._contextArgs.source,\n                target: JSBNG__event.target,\n                attachedPhoto: ja.attachedPhoto\n            });\n        ;\n        ;\n            x.updateStateField(this._ufiInstanceID, \"locallycomposed\", ia.id, true);\n            this._onEditReset();\n        },\n        _onEditReset: function() {\n            x.updateState(this._ufiInstanceID, \"isediting\", false);\n            x.updateState(this._ufiInstanceID, \"editcommentid\", null);\n        },\n        _onCommentRemove: function(ia, JSBNG__event) {\n            var ja = ea[\":fb:ufi:hide-dialog-template\"].build();\n            j.setContent(ja.getNode(\"body\"), \"Are you sure you want to delete this comment?\");\n            j.setContent(ja.getNode(\"title\"), \"Delete Comment\");\n            h.loadModules([\"DialogX\",], function(ka) {\n                var la = new ka({\n                    modal: true,\n                    width: 465,\n                    addedBehaviors: [l,]\n                }, ja.getRoot());\n                la.subscribe(\"JSBNG__confirm\", function() {\n                    y.removeComment(ia.id, {\n                        source: this.source,\n                        oneclick: false,\n                        target: JSBNG__event.target,\n                        timelinelogdata: this._contextArgs.timelinelogdata\n                    });\n                    la.hide();\n                }.bind(this));\n                la.show();\n            }.bind(this));\n        },\n        _onCommentOneClickRemove: function(ia, JSBNG__event) {\n            y.removeComment(ia.id, {\n                source: this.source,\n                oneclick: true,\n                target: JSBNG__event.target,\n                timelinelogdata: this._contextArgs.timelinelogdata\n            });\n        },\n        _onCommentUndoOneClickRemove: function(ia, JSBNG__event) {\n            var ja = ((((this.feedback.canremoveall && this.feedback.isownerpage)) && ((this.feedback.actorforpost !== this.authorProfiles[ia.author]))));\n            y.undoRemoveComment(ia.id, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentHideAsSpam: function(ia, JSBNG__event) {\n            y.setHideAsSpam(ia.id, true, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentMarkAsNotSpam: function(ia, JSBNG__event) {\n            y.setHideAsSpam(ia.id, false, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentTranslate: function(ia, JSBNG__event) {\n            y.translateComment(ia, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentInlineBanChange: function(ia, ja, JSBNG__event) {\n            y.banUser(ia, this.feedback.ownerid, ja, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _onCommentInlineBan: function(ia, JSBNG__event) {\n            this._onCommentInlineBanChange(ia, true, JSBNG__event);\n        },\n        _onCommentUndoInlineBan: function(ia, JSBNG__event) {\n            this._onCommentInlineBanChange(ia, false, JSBNG__event);\n        },\n        _fetchSpamComments: function(ia, ja) {\n            y.fetchSpamComments(this.id, ia, ja, this._contextArgs.viewas);\n        },\n        _removePreview: function(ia, JSBNG__event) {\n            y.removePreview(ia, {\n                source: this.source,\n                target: JSBNG__event.target\n            });\n        },\n        _retrySubmit: function(ia) {\n            h.loadModules([\"UFIRetryActions\",], function(ja) {\n                ja.retrySubmit(ia, {\n                    source: this.source\n                });\n            }.bind(this));\n        },\n        _ensureCommentsExpanded: function() {\n            if (this._verifiedCommentsExpanded) {\n                return;\n            }\n        ;\n        ;\n            var ia = n.byTag(this.root, \"form\");\n            if (ia) {\n                i.removeClass(ia, \"collapsed_comments\");\n                this._verifiedCommentsExpanded = true;\n            }\n        ;\n        ;\n        },\n        render: function(ia) {\n            var ja = ((this.comments.length || !ba(this.feedback.likesentences.current)));\n            if (((ja && ga(ia)))) {\n                this._ensureCommentsExpanded();\n            }\n        ;\n        ;\n            if (((this._loggingOffset === null))) {\n                this._loggingOffset = ((((this.ranges[this.orderingMode].offset + this.comments.length)) - 1));\n            }\n        ;\n        ;\n            var ka = ((this.feedback.replysocialsentencemaxreplies || -1)), la = {\n            };\n            la[this.id] = u.getDeletedCount(this.id);\n            this.comments.forEach(function(oa) {\n                la[oa.id] = u.getDeletedCount(oa.id);\n            });\n            var ma = aa({\n            }, this.replyRanges);\n            ma[this.id] = this.ranges[this.orderingMode];\n            ma = new k(ma);\n            var na = r({\n                feedback: this.feedback,\n                id: this.id,\n                onTargetLikeToggle: this._onTargetLikeToggle.bind(this),\n                onCommentLikeToggle: this._onCommentLikeToggle.bind(this),\n                onCommentRemove: this._onCommentRemove.bind(this),\n                onCommentHideAsSpam: this._onCommentHideAsSpam.bind(this),\n                onCommentMarkAsNotSpam: this._onCommentMarkAsNotSpam.bind(this),\n                onCommentEdit: this._onCommentEdit.bind(this),\n                onCommentOneClickRemove: this._onCommentOneClickRemove.bind(this),\n                onCommentUndoOneClickRemove: this._onCommentUndoOneClickRemove.bind(this),\n                onCommentTranslate: this._onCommentTranslate.bind(this),\n                onCommentInlineBan: this._onCommentInlineBan.bind(this),\n                onCommentUndoInlineBan: this._onCommentUndoInlineBan.bind(this),\n                onEditAttempt: this._onEditAttempt.bind(this),\n                onCancelEdit: this._onEditReset.bind(this),\n                onChangeRange: this._changeRange.bind(this),\n                onSpamFetch: this._fetchSpamComments.bind(this),\n                onPreviewRemove: this._removePreview.bind(this),\n                onRetrySubmit: this._retrySubmit.bind(this),\n                onOrderingModeChange: this._onOrderingModeChange.bind(this),\n                contextArgs: this._contextArgs,\n                repliesMap: this.repliesMap,\n                showRepliesMap: this.showRepliesMap,\n                showReplySocialSentenceMap: this.showReplySocialSentenceMap,\n                commentCounts: this.commentcounts,\n                deletedCounts: la,\n                availableComments: this.comments,\n                source: this.source,\n                availableRanges: ma,\n                pageSize: v.defaultPageSize,\n                authorProfiles: this.authorProfiles,\n                instanceid: this._ufiInstanceID,\n                loggingOffset: this._loggingOffset,\n                replySocialSentenceMaxReplies: ka,\n                giftRecipient: this._giftRecipient,\n                orderingMode: this.orderingMode\n            });\n            this._ufi = o.renderComponent(na, this.root);\n            m.updateTimeStamps();\n            if (this._getParentForm()) {\n                g.inform(\"ufi/changed\", {\n                    form: this._getParentForm()\n                });\n            }\n        ;\n        ;\n            if (((((ia != v.UFIPayloadSourceType.INITIAL_SERVER)) && ((ia != v.UFIPayloadSourceType.COLLAPSED_UFI))))) {\n                g.inform(\"reflow\");\n            }\n        ;\n        ;\n        },\n        fetchAndUpdate: function(ia, ja) {\n            w.getFeedbackTarget(this.id, function(ka) {\n                var la = u.getCommentCount(this.id), ma = fa(this.ranges[this.orderingMode], this.commentcounts[this.id], la, ja);\n                u.getCommentsInRange(this.id, ma, this.orderingMode, this._contextArgs.viewas, function(na) {\n                    var oa = [], pa = {\n                    }, qa = {\n                    };\n                    if (ka.actorforpost) {\n                        oa.push(ka.actorforpost);\n                    }\n                ;\n                ;\n                    for (var ra = 0; ((ra < na.length)); ra++) {\n                        if (na[ra].author) {\n                            oa.push(na[ra].author);\n                        }\n                    ;\n                    ;\n                        if (na[ra].socialcontext) {\n                            oa.push(na[ra].socialcontext.topmutualid);\n                        }\n                    ;\n                    ;\n                        if (((na[ra].replyauthors && na[ra].replyauthors.length))) {\n                            for (var sa = 0; ((sa < na[ra].replyauthors.length)); sa++) {\n                                oa.push(na[ra].replyauthors[sa]);\n                            ;\n                            };\n                        }\n                    ;\n                    ;\n                        if (ka.isthreaded) {\n                            var ta = na[ra].id, ua = u.getCommentCount(ta), va;\n                            if (this.replyRanges[ta]) {\n                                va = fa(this.replyRanges[ta], this.commentcounts[ta], ua, ja);\n                            }\n                             else va = {\n                                offset: 0,\n                                length: Math.min(ua, 2)\n                            };\n                        ;\n                        ;\n                            pa[ta] = va;\n                            qa[ta] = ua;\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                    u.getRepliesInRanges(this.id, pa, function(wa) {\n                        for (var xa = 0; ((xa < na.length)); xa++) {\n                            var ya = na[xa].id, za = ((wa[ya] || []));\n                            for (var ab = 0; ((ab < za.length)); ab++) {\n                                if (za[ab].author) {\n                                    oa.push(za[ab].author);\n                                }\n                            ;\n                            ;\n                                if (za[ab].socialcontext) {\n                                    oa.push(za[ab].socialcontext.topmutualid);\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                        };\n                    ;\n                        if (this._contextArgs.giftoccasion) {\n                            oa.push(ka.actorid);\n                        }\n                    ;\n                    ;\n                        q.getMulti(oa, function(bb) {\n                            if (this._contextArgs.giftoccasion) {\n                                this._giftRecipient = bb[ka.actorid];\n                            }\n                        ;\n                        ;\n                            this.authorProfiles = bb;\n                            this.feedback = ka;\n                            this.commentcounts[this.id] = la;\n                            this.comments = na;\n                            this.ranges[this.orderingMode] = ma;\n                            for (var cb = 0; ((cb < na.length)); cb++) {\n                                var db = na[cb].id, eb = pa[db];\n                                this.repliesMap[db] = wa[db];\n                                this.replyRanges[db] = eb;\n                                this.commentcounts[db] = qa[db];\n                                this.showRepliesMap[db] = ((eb && ((eb.length > 0))));\n                                if (((((this.showReplySocialSentenceMap[db] === undefined)) && ((qa[db] > 0))))) {\n                                    this.showReplySocialSentenceMap[db] = !this.showRepliesMap[db];\n                                }\n                            ;\n                            ;\n                            };\n                        ;\n                            ia(ja);\n                            if (((ja == v.UFIPayloadSourceType.ENDPOINT_COMMENT_FETCH))) {\n                                g.inform(\"CommentUFI.Pager\");\n                            }\n                        ;\n                        ;\n                        }.bind(this));\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n        },\n        _changeRange: function(ia, ja) {\n            if (((ia == this.id))) {\n                this.ranges[this.orderingMode] = ja;\n            }\n             else this.replyRanges[ia] = ja;\n        ;\n        ;\n            this.fetchAndUpdate(this.render.bind(this), v.UFIPayloadSourceType.USER_ACTION);\n        },\n        _onEnclosingPageletDestroy: function() {\n            o.unmountAndReleaseReactRootNode(this.root);\n            this.ufiCentralUpdatesSubscriptions.forEach(t.unsubscribe.bind(t));\n            g.unsubscribe(this.clearPageSubscription);\n            ((this.viewasUFICleanSubscription && g.unsubscribe(this.viewasUFICleanSubscription)));\n        },\n        _onDestroy: function() {\n            this._onEnclosingPageletDestroy();\n            g.unsubscribe(this.clearPageletSubscription);\n        },\n        _onOrderingModeChange: function(ia) {\n            this.orderingMode = ia;\n            this.fetchAndUpdate(this.render.bind(this), v.UFIPayloadSourceType.USER_ACTION);\n        }\n    });\n    e.exports = ha;\n});\n__d(\"EntstreamCollapsedUFIActions\", [\"PopupWindow\",\"React\",\"TrackingNodes\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"PopupWindow\"), h = b(\"React\"), i = b(\"TrackingNodes\"), j = b(\"URI\"), k = b(\"cx\"), l = b(\"tx\"), m = h.createClass({\n        displayName: \"EntstreamCollapsedUFIActions\",\n        getLikeButton: function() {\n            return this.refs.likeButton.getDOMNode();\n        },\n        getLikeIcon: function() {\n            return this.refs.likeIcon.getDOMNode();\n        },\n        render: function() {\n            var n;\n            if (((this.props.shareHref !== null))) {\n                var o = i.getTrackingInfo(i.types.SHARE_LINK), p = j(this.props.shareHref), q = [h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__shareicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\"\n                }),\"Share\",];\n                if (((p.getPath().indexOf(\"/ajax\") === 0))) {\n                    n = h.DOM.a({\n                        ajaxify: this.props.shareHref,\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: \"#\",\n                        rel: \"dialog\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n                 else {\n                    var r = function() {\n                        g.open(this.props.shareHref, 480, 600);\n                        return false;\n                    }.bind(this);\n                    n = h.DOM.a({\n                        className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sharelink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\",\n                        \"data-ft\": o,\n                        href: this.props.shareHref,\n                        onClick: r,\n                        target: \"_blank\",\n                        title: \"Share this item\"\n                    }, q);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s;\n            if (this.props.canComment) {\n                var t = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commenticon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\", u = [h.DOM.i({\n                    className: t\n                }),\"JSBNG__Comment\",], v = \"-cx-PUBLIC-fbEntstreamCollapsedUFI__commentlink -cx-PUBLIC-fbEntstreamCollapsedUFI__action\", w = i.getTrackingInfo(i.types.COMMENT_LINK);\n                if (this.props.storyHref) {\n                    s = h.DOM.a({\n                        className: v,\n                        \"data-ft\": w,\n                        href: this.props.storyHref,\n                        target: \"_blank\",\n                        title: \"Write a comment...\"\n                    }, u);\n                }\n                 else s = h.DOM.a({\n                    className: v,\n                    \"data-ft\": w,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick,\n                    title: \"Write a comment...\"\n                }, u);\n            ;\n            ;\n            }\n        ;\n        ;\n            var x;\n            if (this.props.canLike) {\n                var y = ((((((this.props.hasViewerLiked ? \"-cx-PUBLIC-fbEntstreamFeedback__liked\" : \"\")) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likelink\")))) + ((\" \" + \"-cx-PUBLIC-fbEntstreamCollapsedUFI__action\")))), z = i.getTrackingInfo(((this.props.hasViewerLiked ? i.types.UNLIKE_LINK : i.types.LIKE_LINK))), aa = ((this.props.hasViewerLiked ? \"Unlike this\" : \"Like this\"));\n                x = h.DOM.a({\n                    className: y,\n                    \"data-ft\": z,\n                    href: \"#\",\n                    onClick: this.props.onLike,\n                    onMouseDown: this.props.onLikeMouseDown,\n                    ref: \"likeButton\",\n                    title: aa\n                }, h.DOM.i({\n                    className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__likeicon -cx-PRIVATE-fbEntstreamCollapsedUFI__icon\",\n                    ref: \"likeIcon\"\n                }), \"Like\", h.DOM.div({\n                    className: \"-cx-PRIVATE-fbEntstreamCollapsedUFI__likecover\"\n                }));\n            }\n        ;\n        ;\n            return (h.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__icons\"\n            }, x, s, n));\n        }\n    });\n    e.exports = m;\n});\n__d(\"EntstreamCollapsedUFISentence\", [\"Bootloader\",\"NumberFormat\",\"ProfileBrowserLink\",\"ProfileBrowserTypes\",\"React\",\"URI\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"NumberFormat\"), i = b(\"ProfileBrowserLink\"), j = b(\"ProfileBrowserTypes\"), k = b(\"React\"), l = b(\"URI\"), m = b(\"cx\"), n = b(\"tx\"), o = k.createClass({\n        displayName: \"EntstreamCollapsedUFISentence\",\n        _showShareDialog: function(JSBNG__event) {\n            JSBNG__event = JSBNG__event.nativeEvent;\n            if (JSBNG__event.isDefaultRequested()) {\n                return;\n            }\n        ;\n        ;\n            g.loadModules([\"EntstreamShareOverlay\",], function(p) {\n                p.display(this.props.feedback.targetfbid, this._getShareString());\n            }.bind(this));\n            JSBNG__event.prevent();\n        },\n        _getShareString: function() {\n            var p = this.props.feedback.sharecount, q = ((this.props.numberDelimiter || \",\"));\n            if (((p === 1))) {\n                return \"1 Share\";\n            }\n             else if (((p > 1))) {\n                var r = h.formatIntegerWithDelimiter(p, q);\n                return n._(\"{count} Shares\", {\n                    count: r\n                });\n            }\n            \n        ;\n        ;\n        },\n        render: function() {\n            var p = this.props.feedback, q = p.likecount, r = this.props.commentCount, s = p.sharecount, t = p.seencount, u = this.props.hasAttachedUFIExpanded, v = ((this.props.numberDelimiter || \",\"));\n            if (u) {\n                q = 0;\n                r = 0;\n            }\n        ;\n        ;\n            if (((((((!q && !r)) && !s)) && !t))) {\n                return k.DOM.span(null);\n            }\n        ;\n        ;\n            var w;\n            if (((q === 1))) {\n                w = \"1 Like\";\n            }\n             else if (((q > 1))) {\n                var x = h.formatIntegerWithDelimiter(q, v);\n                w = n._(\"{count} Likes\", {\n                    count: x\n                });\n            }\n            \n        ;\n        ;\n            var y;\n            if (((r === 1))) {\n                y = \"1 Comment\";\n            }\n             else if (((r > 1))) {\n                var z = h.formatIntegerWithDelimiter(r, v);\n                y = n._(\"{count} Comments\", {\n                    count: z\n                });\n            }\n            \n        ;\n        ;\n            var aa = this._getShareString(), ba, ca, da;\n            if (w) {\n                ca = new l(\"/ajax/like/tooltip.php\").setQueryData({\n                    comment_fbid: p.targetfbid,\n                    comment_from: p.actorforpost,\n                    seen_user_fbids: true\n                });\n                var ea = ((((y || aa)) ? \"prm\" : \"\"));\n                ba = j.LIKES;\n                da = {\n                    id: p.targetfbid\n                };\n                var fa = i.constructDialogURI(ba, da).toString();\n                if (this.props.storyHref) {\n                    w = null;\n                }\n                 else w = k.DOM.a({\n                    ajaxify: fa,\n                    className: ea,\n                    href: i.constructPageURI(ba, da).toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    rel: \"dialog\"\n                }, w);\n            ;\n            ;\n            }\n        ;\n        ;\n            var ga;\n            if (((t > 0))) {\n                ba = j.GROUP_MESSAGE_VIEWERS;\n                da = {\n                    id: p.targetfbid\n                };\n                var ha = i.constructDialogURI(ba, da), ia = i.constructPageURI(ba, da);\n                ca = new l(\"/ajax/ufi/seen_tooltip.php\").setQueryData({\n                    ft_ent_identifier: p.entidentifier,\n                    displayed_count: t\n                });\n                var ja = h.formatIntegerWithDelimiter(t, v);\n                if (p.seenbyall) {\n                    ga = \"Seen by everyone\";\n                }\n                 else ga = ((((ja == 1)) ? \"Seen by 1\" : n._(\"Seen by {count}\", {\n                    count: ja\n                })));\n            ;\n            ;\n                ga = k.DOM.a({\n                    ajaxify: ha.toString(),\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-uri\": ca.toString(),\n                    href: ia.toString(),\n                    rel: \"dialog\",\n                    tabindex: \"-1\"\n                }, ga);\n            }\n        ;\n        ;\n            if (y) {\n                var ka = ((aa ? \"prm\" : \"\"));\n                if (this.props.storyHref) {\n                    y = k.DOM.a({\n                        className: ka,\n                        href: this.props.storyHref,\n                        target: \"_blank\"\n                    }, y);\n                }\n                 else y = k.DOM.a({\n                    className: ka,\n                    href: \"#\",\n                    onClick: this.props.onCommentClick\n                }, y);\n            ;\n            ;\n            }\n        ;\n        ;\n            if (aa) {\n                var la = new l(\"/shares/view\").setSubdomain(\"www\").setQueryData({\n                    id: p.targetfbid\n                });\n                if (this.props.storyHref) {\n                    aa = k.DOM.a({\n                        href: la.toString(),\n                        target: \"_blank\"\n                    }, aa);\n                }\n                 else aa = k.DOM.a({\n                    href: la.toString(),\n                    onClick: this._showShareDialog,\n                    rel: \"ignore\"\n                }, aa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return (k.DOM.span({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentencerow\"\n            }, w, y, aa, ga));\n        }\n    });\n    e.exports = o;\n});\n__d(\"EntstreamCollapsedUFI\", [\"JSBNG__Event\",\"Animation\",\"BrowserSupport\",\"JSBNG__CSS\",\"DOM\",\"Ease\",\"EntstreamCollapsedUFIActions\",\"EntstreamCollapsedUFISentence\",\"React\",\"TrackingNodes\",\"Vector\",\"cx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"BrowserSupport\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Ease\"), m = b(\"EntstreamCollapsedUFIActions\"), n = b(\"EntstreamCollapsedUFISentence\"), o = b(\"React\"), p = b(\"TrackingNodes\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"queryThenMutateDOM\"), t = 16, u = o.createClass({\n        displayName: \"EntstreamCollapsedUFI\",\n        _animate: function(v, w, x, y) {\n            if (!i.hasCSSTransforms()) {\n                return;\n            }\n        ;\n        ;\n            var z = this.refs.icons.getLikeIcon();\n            ((this._animation && this._animation.JSBNG__stop()));\n            this._animation = new h(z).from(\"scaleX\", v).from(\"scaleY\", v).to(\"scaleX\", w).to(\"scaleY\", w).duration(x);\n            ((y && this._animation.ease(y)));\n            this._animation.go();\n        },\n        bounceLike: function() {\n            this._animate(1.35, 1, 750, l.bounceOut);\n        },\n        shrinkLike: function() {\n            this._animate(1, 124362, 150);\n            this._mouseUpListener = g.listen(JSBNG__document.body, \"mouseup\", this._onMouseUp);\n        },\n        _onMouseUp: function(JSBNG__event) {\n            this._mouseUpListener.remove();\n            if (!k.contains(this.refs.icons.getLikeButton(), JSBNG__event.getTarget())) {\n                this._animate(124583, 1, 150);\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var v = this.props.feedback, w = p.getTrackingInfo(p.types.BLINGBOX);\n            return (o.DOM.div({\n                className: \"clearfix\"\n            }, m({\n                canLike: v.viewercanlike,\n                canComment: v.cancomment,\n                hasViewerLiked: v.hasviewerliked,\n                onCommentClick: this.props.onCommentClick,\n                onLike: this.props.onLike,\n                onLikeMouseDown: this.props.onLikeMouseDown,\n                ref: \"icons\",\n                shareHref: this.props.shareHref,\n                storyHref: this.props.storyHref\n            }), o.DOM.div({\n                className: \"-cx-PUBLIC-fbEntstreamCollapsedUFI__sentence\",\n                \"data-ft\": w,\n                ref: \"sentence\"\n            }, n({\n                commentCount: this.props.commentCount,\n                feedback: v,\n                hasAttachedUFIExpanded: this.props.hasAttachedUFIExpanded,\n                numberDelimiter: this.props.numberDelimiter,\n                onCommentClick: this.props.onCommentClick,\n                storyHref: this.props.storyHref\n            }))));\n        },\n        componentDidMount: function(v) {\n            var w = this.refs.icons.getDOMNode(), x = this.refs.sentence.getDOMNode(), y, z, aa;\n            s(function() {\n                y = q.getElementDimensions(v).x;\n                z = q.getElementDimensions(w).x;\n                aa = q.getElementDimensions(x).x;\n            }, function() {\n                if (((((z + aa)) > ((y + t))))) {\n                    j.addClass(v, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__tworow\");\n                }\n            ;\n            ;\n            });\n        }\n    });\n    e.exports = u;\n});\n__d(\"EntstreamCollapsedUFIController\", [\"Bootloader\",\"CommentPrelude\",\"JSBNG__CSS\",\"DOM\",\"EntstreamCollapsedUFI\",\"React\",\"ReactMount\",\"UFICentralUpdates\",\"UFIComments\",\"UFIConstants\",\"UFIFeedbackTargets\",\"UFIUserActions\",\"copyProperties\",\"cx\",\"onEnclosingPageletDestroy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"CommentPrelude\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"EntstreamCollapsedUFI\"), l = b(\"React\"), m = b(\"ReactMount\"), n = b(\"UFICentralUpdates\"), o = b(\"UFIComments\"), p = b(\"UFIConstants\"), q = b(\"UFIFeedbackTargets\"), r = b(\"UFIUserActions\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"onEnclosingPageletDestroy\"), v = p.UFIPayloadSourceType;\n    function w(x, y, z) {\n        this._root = x;\n        this._id = z.ftentidentifier;\n        this._contextArgs = z;\n        this._ufiVisible = z.hasattachedufiexpanded;\n        this._updateSubscription = n.subscribe(\"feedback-updated\", function(aa, ba) {\n            if (((((ba.payloadSource != v.INITIAL_SERVER)) && ((this._id in ba.updates))))) {\n                this.render();\n            }\n        ;\n        ;\n        }.bind(this));\n        n.handleUpdate(p.UFIPayloadSourceType.COLLAPSED_UFI, y);\n        g.loadModules([\"ScrollAwareDOM\",], function(aa) {\n            m.scrollMonitor = aa.monitor;\n        });\n        u(this._root, this.destroy.bind(this));\n    };\n;\n    s(w.prototype, {\n        _onLike: function(JSBNG__event) {\n            this._feedbackSubscription = q.getFeedbackTarget(this._id, function(x) {\n                r.changeLike(this._id, !x.hasviewerliked, {\n                    source: this._contextArgs.source,\n                    target: JSBNG__event.target,\n                    rootid: j.getID(this._root)\n                });\n            }.bind(this));\n            this._ufi.bounceLike();\n            JSBNG__event.preventDefault();\n        },\n        _onLikeMouseDown: function(JSBNG__event) {\n            this._ufi.shrinkLike();\n            JSBNG__event.preventDefault();\n        },\n        _onCommentClick: function(JSBNG__event) {\n            if (!this._ufiVisible) {\n                this._ufiVisible = true;\n                i.addClass(this._root, \"-cx-PRIVATE-fbEntstreamCollapsedUFI__hasattachedufiexpanded\");\n            }\n        ;\n        ;\n            h.click(this._root);\n            JSBNG__event.preventDefault();\n        },\n        render: function() {\n            this._feedbackSubscription = q.getFeedbackTarget(this._id, function(x) {\n                var y = k({\n                    commentCount: o.getCommentCount(this._id),\n                    feedback: x,\n                    hasAttachedUFIExpanded: this._contextArgs.hasattachedufiexpanded,\n                    numberDelimiter: this._contextArgs.numberdelimiter,\n                    onCommentClick: this._onCommentClick.bind(this),\n                    onLike: this._onLike.bind(this),\n                    onLikeMouseDown: this._onLikeMouseDown.bind(this),\n                    shareHref: this._contextArgs.sharehref,\n                    storyHref: this._contextArgs.storyhref\n                });\n                l.renderComponent(y, this._root);\n                this._ufi = ((this._ufi || y));\n            }.bind(this));\n        },\n        destroy: function() {\n            if (this._feedbackSubscription) {\n                q.unsubscribe(this._feedbackSubscription);\n                this._feedbackSubscription = null;\n            }\n        ;\n        ;\n            this._updateSubscription.unsubscribe();\n            this._updateSubscription = null;\n            l.unmountAndReleaseReactRootNode(this._root);\n            this._root = null;\n            this._id = null;\n            this._contextArgs = null;\n            this._ufiVisible = null;\n        }\n    });\n    e.exports = w;\n});");
// 1171
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o14,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/OZ92iwfpUMS.js",o15);
// undefined
o14 = null;
// undefined
o15 = null;
// 1176
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"function ef13d6b06d5d5881acc3d896ce5229c2eda3f450c(event) {\n    (window.Toggler && Toggler.hide());\n};");
// 1177
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sb7929521b863cb1d6adc61f8970b2818f8cd1d64");
// 1178
geval("function ef13d6b06d5d5881acc3d896ce5229c2eda3f450c(JSBNG__event) {\n    ((window.Toggler && Toggler.hide()));\n};\n;");
// 1179
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"function e6047474d5d84fdef3954b8f8f3cd7189cb72d81a(event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};");
// 1180
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s341b234373c96266bbeae61786719fd8671e6027");
// 1181
geval("function e6047474d5d84fdef3954b8f8f3cd7189cb72d81a(JSBNG__event) {\n    return run_with(this, [\"min-notifications-jewel\",], function() {\n        MinNotifications.bootstrap(this);\n    });\n};\n;");
// 1182
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"function e632ff9b29729b37089a62e62aa4eebb9164aa7ed(event) {\n    return ((window.Event && Event.__inlineSubmit) && Event.__inlineSubmit(this, event));\n};");
// 1183
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"se5136da5382da0322bf91fa47e57658b382d6307");
// 1184
geval("function e632ff9b29729b37089a62e62aa4eebb9164aa7ed(JSBNG__event) {\n    return ((((window.JSBNG__Event && JSBNG__Event.__inlineSubmit)) && JSBNG__Event.__inlineSubmit(this, JSBNG__event)));\n};\n;");
// 1185
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"function e5a5de7f8876a74f1d5f942be7ae73d0f9c682902(event) {\n    Bootloader.loadModules([\"FacebarTypeaheadNavigation\",\"FacebarTypeaheadDecorateEntities\",\"FacebarTypeaheadDisambiguateResults\",\"FacebarTypeaheadSeeMoreSerp\",\"FacebarTypeaheadSizeAdjuster\",\"FacebarTypeaheadShortcut\",\"FacebarTypeaheadWebSearch\",\"FacebarTypeaheadTrigger\",\"FacebarTypeaheadQuickSelect\",\"FacebarTypeaheadMagGo\",\"FacebarTypeaheadSelectAll\",\"FacebarTypeaheadRecorderBasic\",\"FacebarTypeaheadHashtagResult\",\"FacebarTypeaheadTour\",\"FacebarTypeaheadNarrowDrawer\",\"FacebarTypeaheadCore\",\"FacebarTypeaheadView\",\"FacebarDataSource\",\"FacebarTypeaheadRenderer\",\"FacebarTypeahead\",], emptyFunction);\n};");
// 1186
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sbc8ec2777fe0f9c38e94f05125680e4a5e641264");
// 1187
geval("function e5a5de7f8876a74f1d5f942be7ae73d0f9c682902(JSBNG__event) {\n    Bootloader.loadModules([\"FacebarTypeaheadNavigation\",\"FacebarTypeaheadDecorateEntities\",\"FacebarTypeaheadDisambiguateResults\",\"FacebarTypeaheadSeeMoreSerp\",\"FacebarTypeaheadSizeAdjuster\",\"FacebarTypeaheadShortcut\",\"FacebarTypeaheadWebSearch\",\"FacebarTypeaheadTrigger\",\"FacebarTypeaheadQuickSelect\",\"FacebarTypeaheadMagGo\",\"FacebarTypeaheadSelectAll\",\"FacebarTypeaheadRecorderBasic\",\"FacebarTypeaheadHashtagResult\",\"FacebarTypeaheadTour\",\"FacebarTypeaheadNarrowDrawer\",\"FacebarTypeaheadCore\",\"FacebarTypeaheadView\",\"FacebarDataSource\",\"FacebarTypeaheadRenderer\",\"FacebarTypeahead\",], emptyFunction);\n};\n;");
// 1188
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"function efaae450cea8a7ef59ca232c2699380b98a6cf7d8(event) {\n    Bootloader.loadModules([\"FacebarTypeaheadNavigation\",\"FacebarTypeaheadDecorateEntities\",\"FacebarTypeaheadDisambiguateResults\",\"FacebarTypeaheadSeeMoreSerp\",\"FacebarTypeaheadSizeAdjuster\",\"FacebarTypeaheadShortcut\",\"FacebarTypeaheadWebSearch\",\"FacebarTypeaheadTrigger\",\"FacebarTypeaheadQuickSelect\",\"FacebarTypeaheadMagGo\",\"FacebarTypeaheadSelectAll\",\"FacebarTypeaheadRecorderBasic\",\"FacebarTypeaheadHashtagResult\",\"FacebarTypeaheadTour\",\"FacebarTypeaheadNarrowDrawer\",\"FacebarTypeaheadCore\",\"FacebarTypeaheadView\",\"FacebarDataSource\",\"FacebarTypeaheadRenderer\",\"FacebarTypeahead\",], emptyFunction);\n};");
// 1189
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sdd446cf6a28e44334ee53ef7d5df1f2487fce6f5");
// 1190
geval("function efaae450cea8a7ef59ca232c2699380b98a6cf7d8(JSBNG__event) {\n    Bootloader.loadModules([\"FacebarTypeaheadNavigation\",\"FacebarTypeaheadDecorateEntities\",\"FacebarTypeaheadDisambiguateResults\",\"FacebarTypeaheadSeeMoreSerp\",\"FacebarTypeaheadSizeAdjuster\",\"FacebarTypeaheadShortcut\",\"FacebarTypeaheadWebSearch\",\"FacebarTypeaheadTrigger\",\"FacebarTypeaheadQuickSelect\",\"FacebarTypeaheadMagGo\",\"FacebarTypeaheadSelectAll\",\"FacebarTypeaheadRecorderBasic\",\"FacebarTypeaheadHashtagResult\",\"FacebarTypeaheadTour\",\"FacebarTypeaheadNarrowDrawer\",\"FacebarTypeaheadCore\",\"FacebarTypeaheadView\",\"FacebarDataSource\",\"FacebarTypeaheadRenderer\",\"FacebarTypeahead\",], emptyFunction);\n};\n;");
// 1191
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"function si_cj(m) {\n    setTimeout(function() {\n        new Image().src = ((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=1008\" + \"&m=\") + m);\n    }, 5000);\n};\nif (((top != self) && !false)) {\n    try {\n        if ((parent != top)) {\n            throw 1;\n        }\n    ;\n        var si_cj_d = [\"apps.facebook.com\",\"/pages/\",\"apps.beta.facebook.com\",];\n        var href = top.location.href.toLowerCase();\n        for (var i = 0; (i < si_cj_d.length); i++) {\n            if ((href.indexOf(si_cj_d[i]) >= 0)) {\n                throw 1;\n            }\n        ;\n        };\n        si_cj(\"3 \");\n    } catch (e) {\n        si_cj(\"1 \\u0009\");\n        window.document.write(\"\\u003Cstyle\\u003Ebody * {display:none !important;}\\u003C/style\\u003E\\u003Ca href=\\\"#\\\" onclick=\\\"top.location.href=window.location.href\\\" style=\\\"display:block !important;padding:10px\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_aac1e3\\\" style=\\\"display:block !important\\\"\\u003E\\u003C/i\\u003EGo to Facebook.com\\u003C/a\\u003E\");\n    };\n}\n;");
// 1192
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s8d73e631a9d738203636e3b3a0ccc2fd29755145");
// 1193
geval("function si_cj(m) {\n    JSBNG__setTimeout(function() {\n        new JSBNG__Image().src = ((((\"http://jsbngssl.error.facebook.com/common/scribe_endpoint.php?c=si_clickjacking&t=1008\" + \"&m=\")) + m));\n    }, 5000);\n};\n;\nif (((((JSBNG__top != JSBNG__self)) && !false))) {\n    try {\n        if (((parent != JSBNG__top))) {\n            throw 1;\n        }\n    ;\n    ;\n        var si_cj_d = [\"apps.facebook.com\",\"/pages/\",\"apps.beta.facebook.com\",];\n        var href = JSBNG__top.JSBNG__location.href.toLowerCase();\n        for (var i = 0; ((i < si_cj_d.length)); i++) {\n            if (((href.indexOf(si_cj_d[i]) >= 0))) {\n                throw 1;\n            }\n        ;\n        ;\n        };\n    ;\n        si_cj(\"3 \");\n    } catch (e) {\n        si_cj(\"1 \\u0009\");\n        window.JSBNG__document.write(\"\\u003Cstyle\\u003Ebody * {display:none !important;}\\u003C/style\\u003E\\u003Ca href=\\\"#\\\" onclick=\\\"top.JSBNG__location.href=window.JSBNG__location.href\\\" style=\\\"display:block !important;padding:10px\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_aac1e3\\\" style=\\\"display:block !important\\\"\\u003E\\u003C/i\\u003EGo to Facebook.com\\u003C/a\\u003E\");\n    };\n;\n}\n;\n;");
// 1194
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"Bootloader.setResourceMap({\n    \"UmFO+\": {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/9mw4nQDxDC9.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/mziGa9Rv8rV.css\"\n    },\n    j1x0z: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/4oH7eQzJjdc.css\"\n    },\n    tKv6W: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/1DOzCljCl3K.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    tAd6o: {\n        type: \"css\",\n        nonblocking: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/bzWQh7BY86J.css\"\n    },\n    za92D: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yL/r/OO7ppcHlCNm.css\"\n    },\n    veUjj: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/IqonxdwHUtT.css\"\n    },\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/w-0_vzOt03Y.css\"\n    },\n    c6lUE: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/i2fjJiK4liE.css\"\n    }\n});\nBootloader.setResourceMap({\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    NMNM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/-vSG_5pzFFr.js\"\n    },\n    AVmr9: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/n7J6-ECl4cu.js\"\n    },\n    OH3xD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/MAGRPTCpjAg.js\"\n    },\n    TXKLp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/601-E9kc9jy.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    js0se: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/BIPIZ5kbghZ.js\"\n    },\n    \"+P3v8\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/KWNdF_J3cUf.js\"\n    },\n    \"4/uwC\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y8/r/9g0s6xsMYpS.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"/rNYe\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/lbu10yj4WR0.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    \"I+n09\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yT/r/yNh6K2TPYo5.js\"\n    },\n    mBpeN: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yx/r/TabxUMg74t0.js\"\n    },\n    XH2Cu: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/clqWNoT9Gz_.js\"\n    },\n    iIySo: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/1K9gOk4Dh47.js\"\n    },\n    WLpRY: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/gen4xnT_5g3.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/2XMmSn6wuDr.js\"\n    },\n    \"/MWWQ\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/cV-1QIoVTI-.js\"\n    },\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    },\n    BjpNB: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/npgrFgy_XMu.js\"\n    },\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    zBhY6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/jXjHtkFmkD1.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    an9R5: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/MmluDUavnV2.js\"\n    },\n    G3fzU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/QRKzqNeXwzk.js\"\n    },\n    \"OSd/n\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/gZ1fwdeYASl.js\"\n    },\n    f7Tpb: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y5/r/eV_B8SPw3se.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    \"m+DMw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/OZXLGeTATPh.js\"\n    },\n    e0RyX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/pKyqR8GP59i.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/Rm-mi-BO--u.js\"\n    },\n    gyG67: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/ul7Pqk1hCQb.js\"\n    },\n    \"97Zhe\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/wz04JJfiB2n.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/sHx45baQNJv.js\"\n    },\n    WD1Wm: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/Mt8gx_sQz92.js\"\n    },\n    ociRJ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/OZ92iwfpUMS.js\"\n    },\n    nxD7O: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/8VWsK8lNjX5.js\"\n    }\n});\nBootloader.enableBootload({\n    PhotoTagger: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"nxD7O\",\"iIySo\",\"/MWWQ\",\"gyG67\",],\n        \"module\": true\n    },\n    AsyncDOM: {\n        resources: [\"OH3xD\",\"WLpRY\",],\n        \"module\": true\n    },\n    HighContrastMode: {\n        resources: [\"OH3xD\",\"NMNM4\",],\n        \"module\": true\n    },\n    TagTokenizer: {\n        resources: [\"OH3xD\",\"veUjj\",\"4/uwC\",\"iIySo\",\"UmFO+\",\"/MWWQ\",],\n        \"module\": true\n    },\n    VideoRotate: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"XH2Cu\",\"H42Jh\",],\n        \"module\": true\n    },\n    ErrorSignal: {\n        resources: [\"OH3xD\",\"cNca2\",],\n        \"module\": true\n    },\n    PhotoSnowlift: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"XH2Cu\",\"veUjj\",\"gyG67\",\"/MWWQ\",\"e0RyX\",],\n        \"module\": true\n    },\n    FacebarTypeaheadHashtagResult: {\n        resources: [\"+P3v8\",\"OSd/n\",\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    Event: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    DOM: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    FacebarTypeaheadNavigation: {\n        resources: [\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    Dialog: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",],\n        \"module\": true\n    },\n    PhotosButtonTooltips: {\n        resources: [\"OH3xD\",\"/MWWQ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"veUjj\",\"Rs18G\",],\n        \"module\": true\n    },\n    FacebarTypeaheadRenderer: {\n        resources: [\"OH3xD\",\"OSd/n\",\"G3fzU\",\"XH2Cu\",\"veUjj\",\"/MWWQ\",\"BjpNB\",\"c6lUE\",\"+P3v8\",],\n        \"module\": true\n    },\n    SnowliftPicCropper: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"gyG67\",\"m+DMw\",\"/MWWQ\",\"za92D\",\"wxq+C\",],\n        \"module\": true\n    },\n    Live: {\n        resources: [\"OH3xD\",\"WLpRY\",\"XH2Cu\",],\n        \"module\": true\n    },\n    FacebarTypeaheadCore: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"I+n09\",\"UmFO+\",\"c6lUE\",\"G3fzU\",\"mBpeN\",\"BjpNB\",],\n        \"module\": true\n    },\n    FacebarTypeaheadDecorateEntities: {\n        resources: [\"AVmr9\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadSeeMoreSerp: {\n        resources: [\"OH3xD\",\"G3fzU\",\"XH2Cu\",\"c6lUE\",],\n        \"module\": true\n    },\n    Tooltip: {\n        resources: [\"OH3xD\",\"/MWWQ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"veUjj\",],\n        \"module\": true\n    },\n    \"legacy:detect-broken-proxy-cache\": {\n        resources: [\"OH3xD\",\"NMNM4\",]\n    },\n    PhotoInlineEditor: {\n        resources: [\"OH3xD\",\"gyG67\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"/MWWQ\",\"iIySo\",\"AtxWD\",],\n        \"module\": true\n    },\n    LiveTimer: {\n        resources: [\"OH3xD\",\"XH2Cu\",],\n        \"module\": true\n    },\n    FacebarTypeaheadShortcut: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"G3fzU\",],\n        \"module\": true\n    },\n    Form: {\n        resources: [\"OH3xD\",\"f7Tpb\",],\n        \"module\": true\n    },\n    AdsHidePoll: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"an9R5\",],\n        \"module\": true\n    },\n    FacebarTypeaheadWebSearch: {\n        resources: [\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    Toggler: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"/MWWQ\",],\n        \"module\": true\n    },\n    PhotoTagApproval: {\n        resources: [\"OH3xD\",\"gyG67\",\"iIySo\",],\n        \"module\": true\n    },\n    FacebarTypeaheadTour: {\n        resources: [\"OH3xD\",\"BjpNB\",\"G3fzU\",\"f7Tpb\",\"XH2Cu\",\"UmFO+\",\"AVmr9\",\"js0se\",\"c6lUE\",\"veUjj\",\"+P3v8\",\"OSd/n\",\"/MWWQ\",],\n        \"module\": true\n    },\n    DesktopNotifications: {\n        resources: [\"C3MER\",],\n        \"module\": true\n    },\n    AsyncResponse: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    FbdDialogProvider: {\n        resources: [\"/rNYe\",\"OH3xD\",\"bwsMw\",],\n        \"module\": true\n    },\n    trackReferrer: {\n        resources: [],\n        \"module\": true\n    },\n    FacebarTypeaheadDisambiguateResults: {\n        resources: [\"OH3xD\",\"BjpNB\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"OSd/n\",\"G3fzU\",\"XH2Cu\",\"veUjj\",\"/MWWQ\",\"c6lUE\",],\n        \"module\": true\n    },\n    AsyncDialog: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"XH2Cu\",],\n        \"module\": true\n    },\n    FacebarTypeaheadMagGo: {\n        resources: [\"OH3xD\",\"/MWWQ\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadSizeAdjuster: {\n        resources: [\"BjpNB\",\"OH3xD\",\"f7Tpb\",\"G3fzU\",],\n        \"module\": true\n    },\n    ChatTabModel: {\n        resources: [\"OH3xD\",\"OSd/n\",\"XH2Cu\",\"AVmr9\",\"TXKLp\",\"zBhY6\",\"WD1Wm\",\"/MWWQ\",\"f7Tpb\",],\n        \"module\": true\n    },\n    SpotlightShareViewer: {\n        resources: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"X/Fq6\",\"zyFOp\",],\n        \"module\": true\n    },\n    Input: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    ConfirmationDialog: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"oE4Do\",],\n        \"module\": true\n    },\n    IframeShim: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"/MWWQ\",\"MqSmz\",],\n        \"module\": true\n    },\n    FacebarTypeaheadSelectAll: {\n        resources: [\"f7Tpb\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadNarrowDrawer: {\n        resources: [\"c6lUE\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarDataSource: {\n        resources: [\"OH3xD\",\"G3fzU\",\"+P3v8\",\"XH2Cu\",\"OSd/n\",\"f7Tpb\",\"AVmr9\",],\n        \"module\": true\n    },\n    FacebarTypeaheadRecorderBasic: {\n        resources: [\"OH3xD\",\"js0se\",\"XH2Cu\",\"f7Tpb\",\"+P3v8\",\"G3fzU\",],\n        \"module\": true\n    },\n    DimensionTracking: {\n        resources: [\"OH3xD\",\"NMNM4\",],\n        \"module\": true\n    },\n    PrivacyLiteNUXController: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"+P3v8\",\"c6lUE\",\"OSd/n\",\"UmFO+\",\"XH2Cu\",\"/MWWQ\",\"veUjj\",\"97Zhe\",],\n        \"module\": true\n    },\n    \"legacy:min-notifications-jewel\": {\n        resources: [\"OH3xD\",\"AVmr9\",\"tIw4R\",\"hofTc\",]\n    },\n    AsyncRequest: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    React: {\n        resources: [\"XH2Cu\",\"OH3xD\",],\n        \"module\": true\n    },\n    PhotoTags: {\n        resources: [\"OH3xD\",\"gyG67\",\"UmFO+\",\"iIySo\",],\n        \"module\": true\n    },\n    \"fb-photos-snowlift-fullscreen-css\": {\n        resources: [\"VDymv\",]\n    },\n    PrivacyLiteFlyout: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"XH2Cu\",\"UmFO+\",\"AVmr9\",\"/MWWQ\",\"veUjj\",\"c6lUE\",\"+P3v8\",],\n        \"module\": true\n    },\n    FacebarTypeaheadQuickSelect: {\n        resources: [\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadTrigger: {\n        resources: [\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeahead: {\n        resources: [\"f7Tpb\",\"OH3xD\",\"veUjj\",\"/MWWQ\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadView: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"/MWWQ\",\"UmFO+\",\"AVmr9\",\"XH2Cu\",\"veUjj\",\"c6lUE\",\"G3fzU\",],\n        \"module\": true\n    }\n});");
// 1195
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s1bc33aa1abf983846cc7802d52c3640f2c7d2888");
// 1196
geval("Bootloader.setResourceMap({\n    \"UmFO+\": {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/9mw4nQDxDC9.css\"\n    },\n    \"X/Fq6\": {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/mziGa9Rv8rV.css\"\n    },\n    j1x0z: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/4oH7eQzJjdc.css\"\n    },\n    tKv6W: {\n        type: \"css\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/1DOzCljCl3K.css\"\n    },\n    ynBUm: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/OWwnO_yMqhK.css\"\n    },\n    tAd6o: {\n        type: \"css\",\n        nonblocking: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/bzWQh7BY86J.css\"\n    },\n    za92D: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yL/r/OO7ppcHlCNm.css\"\n    },\n    veUjj: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/IqonxdwHUtT.css\"\n    },\n    VDymv: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/w-0_vzOt03Y.css\"\n    },\n    c6lUE: {\n        type: \"css\",\n        permanent: 1,\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y1/r/i2fjJiK4liE.css\"\n    }\n});\nBootloader.setResourceMap({\n    C3MER: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/hnJRUTuHHeP.js\"\n    },\n    NMNM4: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/-vSG_5pzFFr.js\"\n    },\n    AVmr9: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/n7J6-ECl4cu.js\"\n    },\n    OH3xD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/MAGRPTCpjAg.js\"\n    },\n    TXKLp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/601-E9kc9jy.js\"\n    },\n    MqSmz: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yH/r/ghlEJgSKAee.js\"\n    },\n    AtxWD: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yU/r/RXieOTwv9ZN.js\"\n    },\n    js0se: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/BIPIZ5kbghZ.js\"\n    },\n    \"+P3v8\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/KWNdF_J3cUf.js\"\n    },\n    \"4/uwC\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y8/r/9g0s6xsMYpS.js\"\n    },\n    C6rJk: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js\"\n    },\n    \"/rNYe\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/lbu10yj4WR0.js\"\n    },\n    bwsMw: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/hwOyT9fmfZV.js\"\n    },\n    \"I+n09\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yT/r/yNh6K2TPYo5.js\"\n    },\n    mBpeN: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yx/r/TabxUMg74t0.js\"\n    },\n    XH2Cu: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/clqWNoT9Gz_.js\"\n    },\n    iIySo: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/1K9gOk4Dh47.js\"\n    },\n    WLpRY: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/gen4xnT_5g3.js\"\n    },\n    hofTc: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/EKA5EzGo0o5.js\"\n    },\n    Rs18G: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/2XMmSn6wuDr.js\"\n    },\n    \"/MWWQ\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/cV-1QIoVTI-.js\"\n    },\n    cNca2: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/OHUUx9tXXmr.js\"\n    },\n    BjpNB: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/npgrFgy_XMu.js\"\n    },\n    oE4Do: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/MDwOqV08JHh.js\"\n    },\n    tIw4R: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/ztXltT1LKGv.js\"\n    },\n    zBhY6: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/jXjHtkFmkD1.js\"\n    },\n    \"wxq+C\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/HXOT2PHhPzY.js\"\n    },\n    an9R5: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/MmluDUavnV2.js\"\n    },\n    G3fzU: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/QRKzqNeXwzk.js\"\n    },\n    \"OSd/n\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/gZ1fwdeYASl.js\"\n    },\n    f7Tpb: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y5/r/eV_B8SPw3se.js\"\n    },\n    \"4vv8/\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js\"\n    },\n    \"m+DMw\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/OZXLGeTATPh.js\"\n    },\n    e0RyX: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/pKyqR8GP59i.js\"\n    },\n    H42Jh: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/Rm-mi-BO--u.js\"\n    },\n    gyG67: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/ul7Pqk1hCQb.js\"\n    },\n    \"97Zhe\": {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/wz04JJfiB2n.js\"\n    },\n    zyFOp: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/sHx45baQNJv.js\"\n    },\n    WD1Wm: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/Mt8gx_sQz92.js\"\n    },\n    ociRJ: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/OZ92iwfpUMS.js\"\n    },\n    nxD7O: {\n        type: \"js\",\n        crossOrigin: 1,\n        src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/8VWsK8lNjX5.js\"\n    }\n});\nBootloader.enableBootload({\n    PhotoTagger: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"nxD7O\",\"iIySo\",\"/MWWQ\",\"gyG67\",],\n        \"module\": true\n    },\n    AsyncDOM: {\n        resources: [\"OH3xD\",\"WLpRY\",],\n        \"module\": true\n    },\n    HighContrastMode: {\n        resources: [\"OH3xD\",\"NMNM4\",],\n        \"module\": true\n    },\n    TagTokenizer: {\n        resources: [\"OH3xD\",\"veUjj\",\"4/uwC\",\"iIySo\",\"UmFO+\",\"/MWWQ\",],\n        \"module\": true\n    },\n    VideoRotate: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"XH2Cu\",\"H42Jh\",],\n        \"module\": true\n    },\n    ErrorSignal: {\n        resources: [\"OH3xD\",\"cNca2\",],\n        \"module\": true\n    },\n    PhotoSnowlift: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"XH2Cu\",\"veUjj\",\"gyG67\",\"/MWWQ\",\"e0RyX\",],\n        \"module\": true\n    },\n    FacebarTypeaheadHashtagResult: {\n        resources: [\"+P3v8\",\"OSd/n\",\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    JSBNG__Event: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    DOM: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    FacebarTypeaheadNavigation: {\n        resources: [\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    Dialog: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",],\n        \"module\": true\n    },\n    PhotosButtonTooltips: {\n        resources: [\"OH3xD\",\"/MWWQ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"veUjj\",\"Rs18G\",],\n        \"module\": true\n    },\n    FacebarTypeaheadRenderer: {\n        resources: [\"OH3xD\",\"OSd/n\",\"G3fzU\",\"XH2Cu\",\"veUjj\",\"/MWWQ\",\"BjpNB\",\"c6lUE\",\"+P3v8\",],\n        \"module\": true\n    },\n    SnowliftPicCropper: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"gyG67\",\"m+DMw\",\"/MWWQ\",\"za92D\",\"wxq+C\",],\n        \"module\": true\n    },\n    Live: {\n        resources: [\"OH3xD\",\"WLpRY\",\"XH2Cu\",],\n        \"module\": true\n    },\n    FacebarTypeaheadCore: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"I+n09\",\"UmFO+\",\"c6lUE\",\"G3fzU\",\"mBpeN\",\"BjpNB\",],\n        \"module\": true\n    },\n    FacebarTypeaheadDecorateEntities: {\n        resources: [\"AVmr9\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadSeeMoreSerp: {\n        resources: [\"OH3xD\",\"G3fzU\",\"XH2Cu\",\"c6lUE\",],\n        \"module\": true\n    },\n    Tooltip: {\n        resources: [\"OH3xD\",\"/MWWQ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"veUjj\",],\n        \"module\": true\n    },\n    \"legacy:detect-broken-proxy-cache\": {\n        resources: [\"OH3xD\",\"NMNM4\",]\n    },\n    PhotoInlineEditor: {\n        resources: [\"OH3xD\",\"gyG67\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"/MWWQ\",\"iIySo\",\"AtxWD\",],\n        \"module\": true\n    },\n    LiveTimer: {\n        resources: [\"OH3xD\",\"XH2Cu\",],\n        \"module\": true\n    },\n    FacebarTypeaheadShortcut: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"G3fzU\",],\n        \"module\": true\n    },\n    Form: {\n        resources: [\"OH3xD\",\"f7Tpb\",],\n        \"module\": true\n    },\n    AdsHidePoll: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"an9R5\",],\n        \"module\": true\n    },\n    FacebarTypeaheadWebSearch: {\n        resources: [\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    Toggler: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"/MWWQ\",],\n        \"module\": true\n    },\n    PhotoTagApproval: {\n        resources: [\"OH3xD\",\"gyG67\",\"iIySo\",],\n        \"module\": true\n    },\n    FacebarTypeaheadTour: {\n        resources: [\"OH3xD\",\"BjpNB\",\"G3fzU\",\"f7Tpb\",\"XH2Cu\",\"UmFO+\",\"AVmr9\",\"js0se\",\"c6lUE\",\"veUjj\",\"+P3v8\",\"OSd/n\",\"/MWWQ\",],\n        \"module\": true\n    },\n    DesktopNotifications: {\n        resources: [\"C3MER\",],\n        \"module\": true\n    },\n    AsyncResponse: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    FbdDialogProvider: {\n        resources: [\"/rNYe\",\"OH3xD\",\"bwsMw\",],\n        \"module\": true\n    },\n    trackReferrer: {\n        resources: [],\n        \"module\": true\n    },\n    FacebarTypeaheadDisambiguateResults: {\n        resources: [\"OH3xD\",\"BjpNB\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"OSd/n\",\"G3fzU\",\"XH2Cu\",\"veUjj\",\"/MWWQ\",\"c6lUE\",],\n        \"module\": true\n    },\n    AsyncDialog: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"XH2Cu\",],\n        \"module\": true\n    },\n    FacebarTypeaheadMagGo: {\n        resources: [\"OH3xD\",\"/MWWQ\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadSizeAdjuster: {\n        resources: [\"BjpNB\",\"OH3xD\",\"f7Tpb\",\"G3fzU\",],\n        \"module\": true\n    },\n    ChatTabModel: {\n        resources: [\"OH3xD\",\"OSd/n\",\"XH2Cu\",\"AVmr9\",\"TXKLp\",\"zBhY6\",\"WD1Wm\",\"/MWWQ\",\"f7Tpb\",],\n        \"module\": true\n    },\n    SpotlightShareViewer: {\n        resources: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"X/Fq6\",\"zyFOp\",],\n        \"module\": true\n    },\n    Input: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    ConfirmationDialog: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"oE4Do\",],\n        \"module\": true\n    },\n    IframeShim: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"/MWWQ\",\"MqSmz\",],\n        \"module\": true\n    },\n    FacebarTypeaheadSelectAll: {\n        resources: [\"f7Tpb\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadNarrowDrawer: {\n        resources: [\"c6lUE\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarDataSource: {\n        resources: [\"OH3xD\",\"G3fzU\",\"+P3v8\",\"XH2Cu\",\"OSd/n\",\"f7Tpb\",\"AVmr9\",],\n        \"module\": true\n    },\n    FacebarTypeaheadRecorderBasic: {\n        resources: [\"OH3xD\",\"js0se\",\"XH2Cu\",\"f7Tpb\",\"+P3v8\",\"G3fzU\",],\n        \"module\": true\n    },\n    DimensionTracking: {\n        resources: [\"OH3xD\",\"NMNM4\",],\n        \"module\": true\n    },\n    PrivacyLiteNUXController: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"+P3v8\",\"c6lUE\",\"OSd/n\",\"UmFO+\",\"XH2Cu\",\"/MWWQ\",\"veUjj\",\"97Zhe\",],\n        \"module\": true\n    },\n    \"legacy:min-notifications-jewel\": {\n        resources: [\"OH3xD\",\"AVmr9\",\"tIw4R\",\"hofTc\",]\n    },\n    AsyncRequest: {\n        resources: [\"OH3xD\",],\n        \"module\": true\n    },\n    React: {\n        resources: [\"XH2Cu\",\"OH3xD\",],\n        \"module\": true\n    },\n    PhotoTags: {\n        resources: [\"OH3xD\",\"gyG67\",\"UmFO+\",\"iIySo\",],\n        \"module\": true\n    },\n    \"fb-photos-snowlift-fullscreen-css\": {\n        resources: [\"VDymv\",]\n    },\n    PrivacyLiteFlyout: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"XH2Cu\",\"UmFO+\",\"AVmr9\",\"/MWWQ\",\"veUjj\",\"c6lUE\",\"+P3v8\",],\n        \"module\": true\n    },\n    FacebarTypeaheadQuickSelect: {\n        resources: [\"OH3xD\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadTrigger: {\n        resources: [\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeahead: {\n        resources: [\"f7Tpb\",\"OH3xD\",\"veUjj\",\"/MWWQ\",\"G3fzU\",],\n        \"module\": true\n    },\n    FacebarTypeaheadView: {\n        resources: [\"OH3xD\",\"f7Tpb\",\"/MWWQ\",\"UmFO+\",\"AVmr9\",\"XH2Cu\",\"veUjj\",\"c6lUE\",\"G3fzU\",],\n        \"module\": true\n    }\n});");
// 1197
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"require(\"InitialJSLoader\").loadOnDOMContentReady([\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"AVmr9\",\"I+n09\",\"4vv8/\",\"zBhY6\",\"f7Tpb\",\"OSd/n\",\"+P3v8\",\"js0se\",\"BjpNB\",\"/MWWQ\",\"G3fzU\",\"mBpeN\",\"C6rJk\",\"97Zhe\",\"tAd6o\",]);");
// 1198
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s83f5312660290032aa582123dcc37aca65055db7");
// 1199
geval("require(\"InitialJSLoader\").loadOnDOMContentReady([\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"AVmr9\",\"I+n09\",\"4vv8/\",\"zBhY6\",\"f7Tpb\",\"OSd/n\",\"+P3v8\",\"js0se\",\"BjpNB\",\"/MWWQ\",\"G3fzU\",\"mBpeN\",\"C6rJk\",\"97Zhe\",\"tAd6o\",]);");
// 1201
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"Bootloader.configurePage([\"veUjj\",\"UmFO+\",\"c6lUE\",\"za92D\",\"j1x0z\",\"tKv6W\",\"ynBUm\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j1z1iqLKJPdtUqBToi0: function() {\n        return new RequestsJewel();\n    }\n}));\nrequire(\"InitialJSLoader\").handleServerJS({\n    require: [[\"Intl\",\"setPhonologicalRules\",[],[{\n        meta: {\n            \"/_B/\": \"([.,!?\\\\s]|^)\",\n            \"/_E/\": \"([.,!?\\\\s]|$)\"\n        },\n        patterns: {\n            \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n            \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n        }\n    },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n        currentState: true,\n        spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/profile_book.php\",\"98f03730\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1066,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n        \"ua:n\": {\n            test: {\n                ua_id: {\n                    test: true\n                }\n            }\n        },\n        \"ua:i\": {\n            snowlift: {\n                action: {\n                    open: true,\n                    close: true\n                }\n            },\n            canvas: {\n                action: {\n                    mouseover: true,\n                    mouseout: true\n                }\n            }\n        }\n    },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1374851147,],],[\"MessagingReliabilityLogger\",],[\"FacebarNavigation\",\"setPageQuery\",[],[{\n        structure: [{\n            text: \"Gregor Richards\",\n            type: \"ent:user\",\n            uid: 1055580469\n        },],\n        semantic: null\n    },],],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_0\",],[{\n        __m: \"m_0_0\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"LitestandChromeHomeCount\",\"init\",[],[0,],],[\"AccessibleMenu\",\"init\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_2\",],[\"m_0_4\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_6\",],[{\n        __m: \"m_0_6\"\n    },],],[\"Scrollable\",],[\"m_0_8\",],[\"BrowseNUXBootstrap\",\"registerTypeaheadUnit\",[\"m_0_9\",],[{\n        __m: \"m_0_9\"\n    },],],[\"FacebarNavigation\",\"registerInput\",[\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },],],[\"BrowseNUXBootstrap\",\"registerFacebar\",[\"m_0_b\",\"m_0_c\",],[{\n        input: {\n            __m: \"m_0_b\"\n        },\n        typeahead: {\n            __m: \"m_0_c\"\n        },\n        FacebarTypeaheadSponsoredResults: null\n    },],],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_c\",],[\"PlaceholderListener\",],[\"m_0_b\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"m_0_9\",],[\"m_0_k\",],[\"m_0_n\",],[\"m_0_p\",],[\"m_0_q\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_q\",],[{\n        dialog: {\n            __m: \"m_0_q\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_s\",\"m_0_t\",],[{\n        __m: \"m_0_s\"\n    },{\n        __m: \"m_0_t\"\n    },],],[\"Primer\",],[\"m_0_z\",],[\"enforceMaxLength\",],],\n    instances: [[\"m_0_4\",[\"JewelX\",\"m_0_5\",],[{\n        __m: \"m_0_5\"\n    },{\n        name: \"requests\"\n    },],2,],[\"m_0_k\",[\"ScrollableArea\",\"m_0_j\",],[{\n        __m: \"m_0_j\"\n    },{\n        shadow: false\n    },],1,],[\"m_0_q\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_r\",],[{\n        width: 300,\n        context: null,\n        contextID: null,\n        contextSelector: null,\n        position: \"left\",\n        alignment: \"left\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },]\n    },{\n        __m: \"m_0_r\"\n    },],3,],[\"m_0_12\",[\"XHPTemplate\",\"m_0_18\",],[{\n        __m: \"m_0_18\"\n    },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n        __m: \"m_0_16\"\n    },],2,],[\"m_0_8\",[\"ScrollableArea\",\"m_0_7\",],[{\n        __m: \"m_0_7\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_p\",[\"ScrollableArea\",\"m_0_o\",],[{\n        __m: \"m_0_o\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n        __m: \"m_0_17\"\n    },],2,],[\"m_0_13\",[\"XHPTemplate\",\"m_0_19\",],[{\n        __m: \"m_0_19\"\n    },],2,],[\"m_0_9\",[\"FacebarTypeaheadViewMegaphone\",\"m_0_g\",\"m_0_h\",\"m_0_i\",],[{\n        __m: \"m_0_g\"\n    },{\n        __m: \"m_0_h\"\n    },{\n        __m: \"m_0_i\"\n    },],3,],[\"m_0_f\",[\"FacebarDataSource\",],[{\n        minQueryLength: 2,\n        allowWebSuggOnTop: false,\n        maxWebSuggToCountFetchMore: 2,\n        maxResults: 8,\n        indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n        titleFields: [\"text\",\"alias\",\"tokens\",],\n        queryData: {\n            context: \"facebar\",\n            grammar_version: \"9ab0d482a92fc9cfa37e6c174e4543ea4a022340\",\n            viewer: 100006118350059,\n            rsp: \"search\"\n        },\n        queryEndpoint: \"/ajax/typeahead/search/facebar/query/\",\n        bootstrapData: {\n            context: \"facebar\",\n            viewer: 100006118350059,\n            token: \"v7\"\n        },\n        bootstrapEndpoint: \"/ajax/typeahead/search/facebar/bootstrap/\",\n        token: \"1374777501-7\",\n        genTime: 1374851147,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true,\n        grammarOptions: {\n            grammar_version: \"9ab0d482a92fc9cfa37e6c174e4543ea4a022340\"\n        },\n        grammarVersion: \"9ab0d482a92fc9cfa37e6c174e4543ea4a022340\",\n        allowGrammar: true,\n        mixGrammarAndEntity: false,\n        oldSeeMore: false,\n        webSearchLockedInMode: true\n    },],2,],[\"m_0_c\",[\"FacebarTypeahead\",\"m_0_f\",\"FacebarTypeaheadView\",\"m_0_a\",\"FacebarTypeaheadRenderer\",\"FacebarTypeaheadCore\",\"m_0_e\",\"FacebarTypeaheadNavigation\",\"FacebarTypeaheadDecorateEntities\",\"FacebarTypeaheadDisambiguateResults\",\"FacebarTypeaheadSeeMoreSerp\",\"FacebarTypeaheadSizeAdjuster\",\"FacebarTypeaheadShortcut\",\"FacebarTypeaheadWebSearch\",\"FacebarTypeaheadTrigger\",\"FacebarTypeaheadQuickSelect\",\"FacebarTypeaheadMagGo\",\"FacebarTypeaheadSelectAll\",\"FacebarTypeaheadRecorderBasic\",\"FacebarTypeaheadHashtagResult\",\"FacebarTypeaheadTour\",\"FacebarTypeaheadNarrowDrawer\",],[{\n        __m: \"m_0_f\"\n    },{\n        node_id: \"u_0_1\",\n        ctor: {\n            __m: \"FacebarTypeaheadView\"\n        },\n        options: {\n            causalElement: {\n                __m: \"m_0_a\"\n            },\n            minWidth: 0,\n            alignment: \"left\",\n            renderer: {\n                __m: \"FacebarTypeaheadRenderer\"\n            },\n            maxResults: 8,\n            webSearchForm: \"FBKBFA\",\n            showBadges: 1,\n            autoSelect: true,\n            seeMoreSerpEndpoint: \"/search/more/\"\n        }\n    },{\n        ctor: {\n            __m: \"FacebarTypeaheadCore\"\n        },\n        options: {\n            scubaInfo: {\n                sample_rate: 1,\n                site: \"prod\"\n            }\n        }\n    },{\n        __m: \"m_0_e\"\n    },[{\n        __m: \"FacebarTypeaheadNavigation\"\n    },{\n        __m: \"FacebarTypeaheadDecorateEntities\"\n    },{\n        __m: \"FacebarTypeaheadDisambiguateResults\"\n    },{\n        __m: \"FacebarTypeaheadSeeMoreSerp\"\n    },{\n        __m: \"FacebarTypeaheadSizeAdjuster\"\n    },{\n        __m: \"FacebarTypeaheadShortcut\"\n    },{\n        __m: \"FacebarTypeaheadWebSearch\"\n    },{\n        __m: \"FacebarTypeaheadTrigger\"\n    },{\n        __m: \"FacebarTypeaheadQuickSelect\"\n    },{\n        __m: \"FacebarTypeaheadMagGo\"\n    },{\n        __m: \"FacebarTypeaheadSelectAll\"\n    },{\n        __m: \"FacebarTypeaheadRecorderBasic\"\n    },{\n        __m: \"FacebarTypeaheadHashtagResult\"\n    },{\n        __m: \"FacebarTypeaheadTour\"\n    },{\n        __m: \"FacebarTypeaheadNarrowDrawer\"\n    },],null,],3,],[\"m_0_14\",[\"XHPTemplate\",\"m_0_1a\",],[{\n        __m: \"m_0_1a\"\n    },],2,],[\"m_0_15\",[\"XHPTemplate\",\"m_0_1b\",],[{\n        __m: \"m_0_1b\"\n    },],2,],[\"m_0_n\",[\"JewelX\",\"m_0_m\",],[{\n        __m: \"m_0_m\"\n    },{\n        name: \"notifications\"\n    },],1,],[\"m_0_z\",[\"PrivacyLiteFlyoutHelp\",\"m_0_u\",\"m_0_v\",\"m_0_w\",\"m_0_x\",\"m_0_y\",],[{\n        __m: \"m_0_u\"\n    },{\n        __m: \"m_0_v\"\n    },{\n        __m: \"m_0_w\"\n    },{\n        __m: \"m_0_x\"\n    },{\n        __m: \"m_0_y\"\n    },],1,],[\"m_0_2\",[\"JewelX\",\"m_0_3\",],[{\n        __m: \"m_0_3\"\n    },{\n        name: \"mercurymessages\"\n    },],2,],[\"m_0_b\",[\"StructuredInput\",\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },],3,],],\n    define: [[\"MercuryThreadlistIconTemplates\",[\"m_0_10\",\"m_0_11\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_10\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_11\"\n        }\n    },42,],[\"HashtagSearchResultConfig\",[],{\n        boost_result: 1,\n        hashtag_cost: 7529,\n        image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],[\"FacebarTypeNamedXTokenOptions\",[],{\n        additionalResultsToFetch: 0,\n        enabled: false,\n        showFacepile: false,\n        inlineSubtext: false\n    },139,],[\"MercuryJewelTemplates\",[\"m_0_12\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_12\"\n        }\n    },39,],[\"QuicklingConfig\",[],{\n        version: \"888463;0;1;0\",\n        inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n        sessionLength: 30\n    },60,],[\"PresencePrivacyInitialData\",[],{\n        visibility: 1,\n        privacyData: {\n        },\n        onlinePolicy: 1\n    },58,],[\"ResultsBucketizerConfig\",[],{\n        rules: {\n            main: [{\n                propertyName: \"isSeeMore\",\n                propertyValue: \"true\",\n                position: 2,\n                hidden: true\n            },{\n                propertyName: \"objectType\",\n                propertyValue: \"websuggestion\",\n                position: 1,\n                hidden: false\n            },{\n                propertyName: \"resultSetType\",\n                propertyValue: \"unimplemented\",\n                position: 0,\n                hidden: false\n            },{\n                propertyName: \"objectType\",\n                propertyValue: \"grammar\",\n                position: 0,\n                hidden: false\n            },{\n                bucketName: \"entities\",\n                subBucketRules: \"typeBuckets\",\n                position: 0,\n                hidden: false\n            },],\n            typeBuckets: [{\n                propertyName: \"renderType\",\n                position: 0,\n                hidden: false\n            },{\n                position: 0,\n                hidden: false\n            },]\n        }\n    },164,],[\"MercuryServerRequestsConfig\",[],{\n        sendMessageTimeout: 45000\n    },107,],[\"MercuryThreadlistConstants\",[],{\n        SEARCH_TAB: \"searchtab\",\n        JEWEL_MORE_COUNT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n        WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n        RECENT_MESSAGES_LIMIT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n        WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n        WEBMESSENGER_MORE_COUNT: 20,\n        JEWEL_THREAD_COUNT: 5,\n        RECENT_THREAD_OFFSET: 0,\n        MAX_CHARS_BEFORE_BREAK: 280,\n        MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n        GROUPING_THRESHOLD: 300000,\n        MAX_UNSEEN_COUNT: 99,\n        MAX_UNREAD_COUNT: 99,\n        WEBMESSENGER_THREAD_COUNT: 20\n    },96,],[\"MessagingConfig\",[],{\n        SEND_BATCH_LIMIT: 5,\n        IDLE_CUTOFF: 30000,\n        SEND_CONNECTION_RETRIES: 2\n    },97,],[\"MercuryParticipantsConstants\",[],{\n        EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n        BIG_IMAGE_SIZE: 50,\n        IMAGE_SIZE: 32,\n        UNKNOWN_GENDER: 0\n    },109,],[\"MercuryConfig\",[],{\n        WebMessengerSharedPhotosGK: 0,\n        \"24h_times\": false,\n        idle_poll_interval: 300000,\n        activity_limit: 60000,\n        WebMessengerThreadSearchGK: 1,\n        ChatSaveDraftsGK: 0,\n        VideoCallingNoJavaGK: 0,\n        BigThumbsUpStickerWWWGK: 0,\n        MessagesJewelToggleReadGK: 1,\n        SocialContextGK: 0,\n        ChatMultiTypGK: 0,\n        ChatMultiTypSendGK: 1,\n        NewVCGK: 0,\n        local_storage_crypto: null,\n        MessagesDisableForwardingGK: 1,\n        MessagesJewelOpenInChat: 0,\n        filtering_active: true,\n        idle_limit: 1800000,\n        \"roger.seen_delay\": 15000\n    },35,],[\"MessagingReliabilityLoggerInitialData\",[],{\n        enabled: false,\n        app: \"mercury\"\n    },44,],[\"DateFormatConfig\",[],{\n        weekStart: 6,\n        ordinalSuffixes: {\n            1: \"st\",\n            2: \"nd\",\n            3: \"rd\",\n            4: \"th\",\n            5: \"th\",\n            6: \"th\",\n            7: \"th\",\n            8: \"th\",\n            9: \"th\",\n            10: \"th\",\n            11: \"th\",\n            12: \"th\",\n            13: \"th\",\n            14: \"th\",\n            15: \"th\",\n            16: \"th\",\n            17: \"th\",\n            18: \"th\",\n            19: \"th\",\n            20: \"th\",\n            21: \"st\",\n            22: \"nd\",\n            23: \"rd\",\n            24: \"th\",\n            25: \"th\",\n            26: \"th\",\n            27: \"th\",\n            28: \"th\",\n            29: \"th\",\n            30: \"th\",\n            31: \"st\"\n        },\n        numericDateSeparator: \"/\",\n        numericDateOrder: [\"m\",\"d\",\"y\",],\n        shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n        formats: []\n    },165,],[\"MercuryStatusTemplates\",[\"m_0_13\",\"m_0_14\",\"m_0_15\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_13\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_14\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_15\"\n        }\n    },41,],[\"LitestandSidebarBookmarkConfig\",[],{\n        badge_nf: 0,\n        nf_count_query_interval_ms: 300000\n    },88,],[\"TimeSpentConfig\",[],{\n        delay: 200000,\n        initial_timeout: 8,\n        initial_delay: 1000\n    },142,],],\n    elements: [[\"m_0_g\",\"u_0_4\",2,],[\"m_0_3\",\"fbMessagesJewel\",2,],[\"m_0_i\",\"u_0_6\",2,],[\"m_0_a\",\"u_0_3\",6,],[\"m_0_x\",\"u_0_d\",2,],[\"m_0_0\",\"u_0_h\",2,],[\"m_0_d\",\"logout_form\",2,],[\"m_0_w\",\"u_0_e\",2,],[\"m_0_7\",\"MercuryJewelThreadList\",2,],[\"m_0_u\",\"u_0_f\",2,],[\"m_0_5\",\"fbRequestsJewel\",2,],[\"m_0_t\",\"u_0_a\",2,],[\"m_0_v\",\"u_0_c\",2,],[\"m_0_l\",\"logout_form\",2,],[\"m_0_6\",\"u_0_0\",2,],[\"m_0_h\",\"u_0_5\",2,],[\"m_0_y\",\"u_0_b\",2,],[\"m_0_e\",\"u_0_2\",2,],[\"m_0_j\",\"u_0_7\",2,],[\"m_0_o\",\"u_0_8\",2,],[\"m_0_s\",\"u_0_9\",2,],[\"m_0_1\",\"u_0_g\",2,],[\"m_0_m\",\"fbNotificationsJewel\",2,],],\n    markup: [[\"m_0_18\",{\n        __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__albumframe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 4:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n    },2,],[\"m_0_19\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__retrytext\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_1b\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Ci class=\\\"img sp_b8k8sa sx_00f51f\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__errortext\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_r\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide -cx-PRIVATE-fbPrivacyLiteMegaphone__dialogclose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__introtext\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_16\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_4ie5gn sx_d23bdd\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_17\",{\n        __html: \"\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n    },2,],[\"m_0_1a\",{\n        __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n    },2,],]\n});\nonloadRegister_DEPRECATED(function() {\n    requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n        new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_2\"), {\n            message_counts: [{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: 0,\n                folder: \"inbox\"\n            },{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: null,\n                folder: \"other\"\n            },],\n            payload_source: \"server_initial_data\"\n        });\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j1z1iqLKJPdtUqBToi0\").init(require(\"m_0_4\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1374851147000,\n        latestNotif: null,\n        latestReadNotif: null,\n        updatePeriod: 480000,\n        cacheVersion: 2,\n        allowDesktopNotifications: false,\n        notifReceivedType: \"notification\",\n        wrapperID: \"fbNotificationsJewel\",\n        contentID: \"fbNotificationsList\",\n        shouldLogImpressions: 0,\n        useInfiniteScroll: 1,\n        persistUnreadColor: true,\n        unseenVsUnread: 0\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    Arbiter.inform(\"jewel/count-initial\", {\n        jewel: \"notifications\",\n        count: 0\n    }, Arbiter.BEHAVIOR_STATE);\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n        detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n    });\n});");
// 1202
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s42d7f2932f3fe1bbfc27130fd80240240a77a7e2");
// 1203
geval("Bootloader.configurePage([\"veUjj\",\"UmFO+\",\"c6lUE\",\"za92D\",\"j1x0z\",\"tKv6W\",\"ynBUm\",]);\nBootloader.done([\"jDr+c\",]);\nJSCC.init(({\n    j1z1iqLKJPdtUqBToi0: function() {\n        return new RequestsJewel();\n    }\n}));\nrequire(\"InitialJSLoader\").handleServerJS({\n    require: [[\"JSBNG__Intl\",\"setPhonologicalRules\",[],[{\n        meta: {\n            \"/_B/\": \"([.,!?\\\\s]|^)\",\n            \"/_E/\": \"([.,!?\\\\s]|$)\"\n        },\n        patterns: {\n            \"/\\u0001(.*)('|&#039;)s\\u0001(?:'|&#039;)s(.*)/\": \"\\u0001$1$2s\\u0001$3\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/e\": \"mb_strtolower(\\\"\\u0001$1\\u0001\\\")\",\n            \"/\\\\^\\\\x01([^\\\\x01])(?=[^\\\\x01]*\\\\x01)/e\": \"mb_strtoupper(\\\"\\u0001$1\\\")\",\n            \"/_\\u0001([^\\u0001]*)\\u0001/\": \"javascript\"\n        }\n    },],],[\"PostLoadJS\",\"loadAndRequire\",[],[\"DimensionTracking\",],],[\"PostLoadJS\",\"loadAndCall\",[],[\"HighContrastMode\",\"init\",[{\n        currentState: true,\n        spacerImage: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\"\n    },],],],[\"ScriptPath\",\"set\",[],[\"/profile_book.php\",\"98f03730\",],],[\"ClickRefLogger\",],[\"userAction\",\"setUATypeConfig\",[],[{\n        \"ua:n\": false,\n        \"ua:i\": false,\n        \"ua:d\": false,\n        \"ua:e\": false\n    },],],[\"ScriptPathState\",\"setUserURISampleRate\",[],[1066,],],[\"userAction\",\"setCustomSampleConfig\",[],[{\n        \"ua:n\": {\n            test: {\n                ua_id: {\n                    test: true\n                }\n            }\n        },\n        \"ua:i\": {\n            snowlift: {\n                action: {\n                    open: true,\n                    close: true\n                }\n            },\n            canvas: {\n                action: {\n                    mouseover: true,\n                    mouseout: true\n                }\n            }\n        }\n    },],],[\"UserActionHistory\",],[\"ScriptPath\",\"startLogging\",[],[],],[\"TimeSpentBitArrayLogger\",\"init\",[],[],],[\"PixelRatio\",\"startDetecting\",[],[1,],],[\"LiveTimer\",\"restart\",[],[1374851147,],],[\"MessagingReliabilityLogger\",],[\"FacebarNavigation\",\"setPageQuery\",[],[{\n        structure: [{\n            text: \"Gregor Richards\",\n            type: \"ent:user\",\n            uid: 1055580469\n        },],\n        semantic: null\n    },],],[\"SidebarPrelude\",\"addSidebarMode\",[],[1225,],],[\"Quickling\",],[\"TinyViewport\",],[\"WebStorageMonster\",\"schedule\",[],[false,],],[\"AsyncRequestNectarLogging\",],[\"ViewasChromeBar\",\"initChromeBar\",[\"m_0_0\",],[{\n        __m: \"m_0_0\"\n    },],],[\"PagesVoiceBar\",\"initVoiceBar\",[],[],],[\"LitestandChromeHomeCount\",\"init\",[],[0,],],[\"AccessibleMenu\",\"init\",[\"m_0_1\",],[{\n        __m: \"m_0_1\"\n    },],],[\"MercuryJewel\",],[\"TitanLeftNav\",\"initialize\",[],[],],[\"m_0_2\",],[\"m_0_4\",],[\"ChatOpenTab\",\"listenOpenEmptyTab\",[\"m_0_6\",],[{\n        __m: \"m_0_6\"\n    },],],[\"Scrollable\",],[\"m_0_8\",],[\"BrowseNUXBootstrap\",\"registerTypeaheadUnit\",[\"m_0_9\",],[{\n        __m: \"m_0_9\"\n    },],],[\"FacebarNavigation\",\"registerInput\",[\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },],],[\"BrowseNUXBootstrap\",\"registerFacebar\",[\"m_0_b\",\"m_0_c\",],[{\n        input: {\n            __m: \"m_0_b\"\n        },\n        typeahead: {\n            __m: \"m_0_c\"\n        },\n        FacebarTypeaheadSponsoredResults: null\n    },],],[\"WebStorageMonster\",\"registerLogoutForm\",[\"m_0_d\",],[{\n        __m: \"m_0_d\"\n    },[\"^Banzai$\",\"^\\\\:userchooser\\\\:osessusers$\",\"^[0-9]+:powereditor:\",\"^[0-9]+:page_insights:\",\"^_SocialFoxExternal_machineid$\",\"^_SocialFoxExternal_LoggedInBefore$\",\"^_socialfox_worker_enabled$\",],],],[\"m_0_c\",],[\"PlaceholderListener\",],[\"m_0_b\",],[\"PlaceholderOnsubmitFormListener\",],[\"FlipDirectionOnKeypress\",],[\"m_0_9\",],[\"m_0_k\",],[\"m_0_n\",],[\"m_0_p\",],[\"m_0_q\",],[\"PrivacyLiteNUXController\",\"init\",[\"m_0_q\",],[{\n        dialog: {\n            __m: \"m_0_q\"\n        },\n        sectionID: \"who_can_see\",\n        subsectionID: \"plite_activity_log\",\n        showOnExpand: true\n    },],],[\"PrivacyLiteFlyout\",\"registerFlyoutToggler\",[\"m_0_s\",\"m_0_t\",],[{\n        __m: \"m_0_s\"\n    },{\n        __m: \"m_0_t\"\n    },],],[\"Primer\",],[\"m_0_z\",],[\"enforceMaxLength\",],],\n    instances: [[\"m_0_4\",[\"JewelX\",\"m_0_5\",],[{\n        __m: \"m_0_5\"\n    },{\n        JSBNG__name: \"requests\"\n    },],2,],[\"m_0_k\",[\"ScrollableArea\",\"m_0_j\",],[{\n        __m: \"m_0_j\"\n    },{\n        shadow: false\n    },],1,],[\"m_0_q\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_r\",],[{\n        width: 300,\n        context: null,\n        contextID: null,\n        contextSelector: null,\n        position: \"left\",\n        alignment: \"left\",\n        offsetX: 0,\n        offsetY: 0,\n        arrowBehavior: {\n            __m: \"ContextualDialogArrow\"\n        },\n        theme: {\n            __m: \"ContextualDialogDefaultTheme\"\n        },\n        addedBehaviors: [{\n            __m: \"LayerRemoveOnHide\"\n        },{\n            __m: \"LayerHideOnTransition\"\n        },{\n            __m: \"LayerFadeOnShow\"\n        },]\n    },{\n        __m: \"m_0_r\"\n    },],3,],[\"m_0_12\",[\"XHPTemplate\",\"m_0_18\",],[{\n        __m: \"m_0_18\"\n    },],2,],[\"m_0_10\",[\"XHPTemplate\",\"m_0_16\",],[{\n        __m: \"m_0_16\"\n    },],2,],[\"m_0_8\",[\"ScrollableArea\",\"m_0_7\",],[{\n        __m: \"m_0_7\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_p\",[\"ScrollableArea\",\"m_0_o\",],[{\n        __m: \"m_0_o\"\n    },{\n        persistent: true\n    },],1,],[\"m_0_11\",[\"XHPTemplate\",\"m_0_17\",],[{\n        __m: \"m_0_17\"\n    },],2,],[\"m_0_13\",[\"XHPTemplate\",\"m_0_19\",],[{\n        __m: \"m_0_19\"\n    },],2,],[\"m_0_9\",[\"FacebarTypeaheadViewMegaphone\",\"m_0_g\",\"m_0_h\",\"m_0_i\",],[{\n        __m: \"m_0_g\"\n    },{\n        __m: \"m_0_h\"\n    },{\n        __m: \"m_0_i\"\n    },],3,],[\"m_0_f\",[\"FacebarDataSource\",],[{\n        minQueryLength: 2,\n        allowWebSuggOnTop: false,\n        maxWebSuggToCountFetchMore: 2,\n        maxResults: 8,\n        indexedFields: [\"text\",\"tokens\",\"alias\",\"non_title_tokens\",],\n        titleFields: [\"text\",\"alias\",\"tokens\",],\n        queryData: {\n            context: \"facebar\",\n            grammar_version: \"9ab0d482a92fc9cfa37e6c174e4543ea4a022340\",\n            viewer: 100006118350059,\n            rsp: \"search\"\n        },\n        queryEndpoint: \"/ajax/typeahead/search/facebar/query/\",\n        bootstrapData: {\n            context: \"facebar\",\n            viewer: 100006118350059,\n            token: \"v7\"\n        },\n        bootstrapEndpoint: \"/ajax/typeahead/search/facebar/bootstrap/\",\n        token: \"1374777501-7\",\n        genTime: 1374851147,\n        enabledQueryCache: true,\n        queryExactMatch: false,\n        enabledHashtag: true,\n        grammarOptions: {\n            grammar_version: \"9ab0d482a92fc9cfa37e6c174e4543ea4a022340\"\n        },\n        grammarVersion: \"9ab0d482a92fc9cfa37e6c174e4543ea4a022340\",\n        allowGrammar: true,\n        mixGrammarAndEntity: false,\n        oldSeeMore: false,\n        webSearchLockedInMode: true\n    },],2,],[\"m_0_c\",[\"FacebarTypeahead\",\"m_0_f\",\"FacebarTypeaheadView\",\"m_0_a\",\"FacebarTypeaheadRenderer\",\"FacebarTypeaheadCore\",\"m_0_e\",\"FacebarTypeaheadNavigation\",\"FacebarTypeaheadDecorateEntities\",\"FacebarTypeaheadDisambiguateResults\",\"FacebarTypeaheadSeeMoreSerp\",\"FacebarTypeaheadSizeAdjuster\",\"FacebarTypeaheadShortcut\",\"FacebarTypeaheadWebSearch\",\"FacebarTypeaheadTrigger\",\"FacebarTypeaheadQuickSelect\",\"FacebarTypeaheadMagGo\",\"FacebarTypeaheadSelectAll\",\"FacebarTypeaheadRecorderBasic\",\"FacebarTypeaheadHashtagResult\",\"FacebarTypeaheadTour\",\"FacebarTypeaheadNarrowDrawer\",],[{\n        __m: \"m_0_f\"\n    },{\n        node_id: \"u_0_1\",\n        ctor: {\n            __m: \"FacebarTypeaheadView\"\n        },\n        options: {\n            causalElement: {\n                __m: \"m_0_a\"\n            },\n            minWidth: 0,\n            alignment: \"left\",\n            renderer: {\n                __m: \"FacebarTypeaheadRenderer\"\n            },\n            maxResults: 8,\n            webSearchForm: \"FBKBFA\",\n            showBadges: 1,\n            autoSelect: true,\n            seeMoreSerpEndpoint: \"/search/more/\"\n        }\n    },{\n        ctor: {\n            __m: \"FacebarTypeaheadCore\"\n        },\n        options: {\n            scubaInfo: {\n                sample_rate: 1,\n                site: \"prod\"\n            }\n        }\n    },{\n        __m: \"m_0_e\"\n    },[{\n        __m: \"FacebarTypeaheadNavigation\"\n    },{\n        __m: \"FacebarTypeaheadDecorateEntities\"\n    },{\n        __m: \"FacebarTypeaheadDisambiguateResults\"\n    },{\n        __m: \"FacebarTypeaheadSeeMoreSerp\"\n    },{\n        __m: \"FacebarTypeaheadSizeAdjuster\"\n    },{\n        __m: \"FacebarTypeaheadShortcut\"\n    },{\n        __m: \"FacebarTypeaheadWebSearch\"\n    },{\n        __m: \"FacebarTypeaheadTrigger\"\n    },{\n        __m: \"FacebarTypeaheadQuickSelect\"\n    },{\n        __m: \"FacebarTypeaheadMagGo\"\n    },{\n        __m: \"FacebarTypeaheadSelectAll\"\n    },{\n        __m: \"FacebarTypeaheadRecorderBasic\"\n    },{\n        __m: \"FacebarTypeaheadHashtagResult\"\n    },{\n        __m: \"FacebarTypeaheadTour\"\n    },{\n        __m: \"FacebarTypeaheadNarrowDrawer\"\n    },],null,],3,],[\"m_0_14\",[\"XHPTemplate\",\"m_0_1a\",],[{\n        __m: \"m_0_1a\"\n    },],2,],[\"m_0_15\",[\"XHPTemplate\",\"m_0_1b\",],[{\n        __m: \"m_0_1b\"\n    },],2,],[\"m_0_n\",[\"JewelX\",\"m_0_m\",],[{\n        __m: \"m_0_m\"\n    },{\n        JSBNG__name: \"notifications\"\n    },],1,],[\"m_0_z\",[\"PrivacyLiteFlyoutHelp\",\"m_0_u\",\"m_0_v\",\"m_0_w\",\"m_0_x\",\"m_0_y\",],[{\n        __m: \"m_0_u\"\n    },{\n        __m: \"m_0_v\"\n    },{\n        __m: \"m_0_w\"\n    },{\n        __m: \"m_0_x\"\n    },{\n        __m: \"m_0_y\"\n    },],1,],[\"m_0_2\",[\"JewelX\",\"m_0_3\",],[{\n        __m: \"m_0_3\"\n    },{\n        JSBNG__name: \"mercurymessages\"\n    },],2,],[\"m_0_b\",[\"StructuredInput\",\"m_0_a\",],[{\n        __m: \"m_0_a\"\n    },],3,],],\n    define: [[\"MercuryThreadlistIconTemplates\",[\"m_0_10\",\"m_0_11\",],{\n        \":fb:mercury:attachment-indicator\": {\n            __m: \"m_0_10\"\n        },\n        \":fb:mercury:attachment-icon-text\": {\n            __m: \"m_0_11\"\n        }\n    },42,],[\"HashtagSearchResultConfig\",[],{\n        boost_result: 1,\n        hashtag_cost: 7529,\n        image_url: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yF/r/irmqzCEvUpb.png\"\n    },146,],[\"FacebarTypeNamedXTokenOptions\",[],{\n        additionalResultsToFetch: 0,\n        enabled: false,\n        showFacepile: false,\n        inlineSubtext: false\n    },139,],[\"MercuryJewelTemplates\",[\"m_0_12\",],{\n        \":fb:mercury:jewel:threadlist-row\": {\n            __m: \"m_0_12\"\n        }\n    },39,],[\"QuicklingConfig\",[],{\n        version: \"888463;0;1;0\",\n        inactivePageRegex: \"^/(fr/u\\\\.php|ads/|advertising|ac\\\\.php|ae\\\\.php|ajax/emu/(end|f|h)\\\\.php|badges/|comments\\\\.php|connect/uiserver\\\\.php|editalbum\\\\.php.+add=1|ext/|feeds/|help([/?]|$)|identity_switch\\\\.php|intern/|login\\\\.php|logout\\\\.php|sitetour/homepage_tour\\\\.php|sorry\\\\.php|syndication\\\\.php|webmessenger|/plugins/subscribe|\\\\.pdf$|brandpermissions|gameday|pxlcld)\",\n        sessionLength: 30\n    },60,],[\"PresencePrivacyInitialData\",[],{\n        visibility: 1,\n        privacyData: {\n        },\n        onlinePolicy: 1\n    },58,],[\"ResultsBucketizerConfig\",[],{\n        rules: {\n            main: [{\n                propertyName: \"isSeeMore\",\n                propertyValue: \"true\",\n                position: 2,\n                hidden: true\n            },{\n                propertyName: \"objectType\",\n                propertyValue: \"websuggestion\",\n                position: 1,\n                hidden: false\n            },{\n                propertyName: \"resultSetType\",\n                propertyValue: \"unimplemented\",\n                position: 0,\n                hidden: false\n            },{\n                propertyName: \"objectType\",\n                propertyValue: \"grammar\",\n                position: 0,\n                hidden: false\n            },{\n                bucketName: \"entities\",\n                subBucketRules: \"typeBuckets\",\n                position: 0,\n                hidden: false\n            },],\n            typeBuckets: [{\n                propertyName: \"renderType\",\n                position: 0,\n                hidden: false\n            },{\n                position: 0,\n                hidden: false\n            },]\n        }\n    },164,],[\"MercuryServerRequestsConfig\",[],{\n        sendMessageTimeout: 45000\n    },107,],[\"MercuryThreadlistConstants\",[],{\n        SEARCH_TAB: \"searchtab\",\n        JEWEL_MORE_COUNT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_COUNT: 5,\n        WEBMESSENGER_SEARCH_SNIPPET_MORE: 5,\n        RECENT_MESSAGES_LIMIT: 10,\n        WEBMESSENGER_SEARCH_SNIPPET_LIMIT: 5,\n        WEBMESSENGER_MORE_MESSAGES_COUNT: 20,\n        WEBMESSENGER_MORE_COUNT: 20,\n        JEWEL_THREAD_COUNT: 5,\n        RECENT_THREAD_OFFSET: 0,\n        MAX_CHARS_BEFORE_BREAK: 280,\n        MESSAGE_TIMESTAMP_THRESHOLD: 1209600000,\n        GROUPING_THRESHOLD: 300000,\n        MAX_UNSEEN_COUNT: 99,\n        MAX_UNREAD_COUNT: 99,\n        WEBMESSENGER_THREAD_COUNT: 20\n    },96,],[\"MessagingConfig\",[],{\n        SEND_BATCH_LIMIT: 5,\n        IDLE_CUTOFF: 30000,\n        SEND_CONNECTION_RETRIES: 2\n    },97,],[\"MercuryParticipantsConstants\",[],{\n        EMAIL_IMAGE: \"/images/messaging/threadlist/envelope.png\",\n        BIG_IMAGE_SIZE: 50,\n        IMAGE_SIZE: 32,\n        UNKNOWN_GENDER: 0\n    },109,],[\"MercuryConfig\",[],{\n        WebMessengerSharedPhotosGK: 0,\n        \"24h_times\": false,\n        idle_poll_interval: 300000,\n        activity_limit: 60000,\n        WebMessengerThreadSearchGK: 1,\n        ChatSaveDraftsGK: 0,\n        VideoCallingNoJavaGK: 0,\n        BigThumbsUpStickerWWWGK: 0,\n        MessagesJewelToggleReadGK: 1,\n        SocialContextGK: 0,\n        ChatMultiTypGK: 0,\n        ChatMultiTypSendGK: 1,\n        NewVCGK: 0,\n        local_storage_crypto: null,\n        MessagesDisableForwardingGK: 1,\n        MessagesJewelOpenInChat: 0,\n        filtering_active: true,\n        idle_limit: 1800000,\n        \"roger.seen_delay\": 15000\n    },35,],[\"MessagingReliabilityLoggerInitialData\",[],{\n        enabled: false,\n        app: \"mercury\"\n    },44,],[\"DateFormatConfig\",[],{\n        weekStart: 6,\n        ordinalSuffixes: {\n            1: \"st\",\n            2: \"nd\",\n            3: \"rd\",\n            4: \"th\",\n            5: \"th\",\n            6: \"th\",\n            7: \"th\",\n            8: \"th\",\n            9: \"th\",\n            10: \"th\",\n            11: \"th\",\n            12: \"th\",\n            13: \"th\",\n            14: \"th\",\n            15: \"th\",\n            16: \"th\",\n            17: \"th\",\n            18: \"th\",\n            19: \"th\",\n            20: \"th\",\n            21: \"st\",\n            22: \"nd\",\n            23: \"rd\",\n            24: \"th\",\n            25: \"th\",\n            26: \"th\",\n            27: \"th\",\n            28: \"th\",\n            29: \"th\",\n            30: \"th\",\n            31: \"st\"\n        },\n        numericDateSeparator: \"/\",\n        numericDateOrder: [\"m\",\"d\",\"y\",],\n        shortDayNames: [\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",\"Sun\",],\n        formats: []\n    },165,],[\"MercuryStatusTemplates\",[\"m_0_13\",\"m_0_14\",\"m_0_15\",],{\n        \":fb:mercury:resend-indicator\": {\n            __m: \"m_0_13\"\n        },\n        \":fb:mercury:filtered-message\": {\n            __m: \"m_0_14\"\n        },\n        \":fb:mercury:error-indicator\": {\n            __m: \"m_0_15\"\n        }\n    },41,],[\"LitestandSidebarBookmarkConfig\",[],{\n        badge_nf: 0,\n        nf_count_query_interval_ms: 300000\n    },88,],[\"TimeSpentConfig\",[],{\n        delay: 200000,\n        initial_timeout: 8,\n        initial_delay: 1000\n    },142,],],\n    elements: [[\"m_0_g\",\"u_0_4\",2,],[\"m_0_3\",\"fbMessagesJewel\",2,],[\"m_0_i\",\"u_0_6\",2,],[\"m_0_a\",\"u_0_3\",6,],[\"m_0_x\",\"u_0_d\",2,],[\"m_0_0\",\"u_0_h\",2,],[\"m_0_d\",\"logout_form\",2,],[\"m_0_w\",\"u_0_e\",2,],[\"m_0_7\",\"MercuryJewelThreadList\",2,],[\"m_0_u\",\"u_0_f\",2,],[\"m_0_5\",\"fbRequestsJewel\",2,],[\"m_0_t\",\"u_0_a\",2,],[\"m_0_v\",\"u_0_c\",2,],[\"m_0_l\",\"logout_form\",2,],[\"m_0_6\",\"u_0_0\",2,],[\"m_0_h\",\"u_0_5\",2,],[\"m_0_y\",\"u_0_b\",2,],[\"m_0_e\",\"u_0_2\",2,],[\"m_0_j\",\"u_0_7\",2,],[\"m_0_o\",\"u_0_8\",2,],[\"m_0_s\",\"u_0_9\",2,],[\"m_0_1\",\"u_0_g\",2,],[\"m_0_m\",\"fbNotificationsJewel\",2,],],\n    markup: [[\"m_0_18\",{\n        __html: \"\\u003Cli\\u003E\\u003Ca class=\\\"messagesContent\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage -cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"snippetThumbnail rfloat\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-single\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"hidden_elem\\\" data-jsid=\\\"snippet-thumbnail-multiple\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__albumframe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-jewelInlineThumbnail__thumbnail\\\"\\u003E\\u003Ci style=\\\"background-image: url(/images/blank.gif);\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"content fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"author\\\"\\u003E\\u003Cstrong data-jsid=\\\"name\\\"\\u003E\\u003C/strong\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"snippet preview fsm fwn fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"snippet\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"time\\\"\\u003E\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 4:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n    },2,],[\"m_0_19\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yv/r/O7ihJIPh_G0.gif\\\" alt=\\\"\\\" width=\\\"15\\\" height=\\\"15\\\" /\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__retrytext\\\"\\u003ESending...\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_1b\",{\n        __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__status\\\"\\u003E\\u003Ci class=\\\"img sp_b8k8sa sx_00f51f\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryStatus__errortext\\\"\\u003EFailed to send\\u003C/span\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_r\",{\n        __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide -cx-PRIVATE-fbPrivacyLiteMegaphone__dialogclose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" alt=\\\"Close\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/K4K8h0mqOQN.png\\\" width=\\\"11\\\" height=\\\"13\\\" /\\u003E\\u003C/a\\u003E\\u003Cspan class=\\\"fsl\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbPrivacyLiteMegaphone__introtext\\\"\\u003ETry your new Privacy Shortcuts.\\u003C/span\\u003E Visit your Activity Log to review photos you&#039;re tagged in and things you&#039;ve hidden from your timeline.\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n    },2,],[\"m_0_16\",{\n        __html: \"\\u003Ci class=\\\"mrs MercuryThreadlistIcon img sp_4ie5gn sx_d23bdd\\\"\\u003E\\u003C/i\\u003E\"\n    },2,],[\"m_0_17\",{\n        __html: \"\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\"\n    },2,],[\"m_0_1a\",{\n        __html: \"\\u003Cdiv class=\\\"mas pam uiBoxYellow\\\"\\u003E\\u003Cstrong\\u003EThis message is no longer available\\u003C/strong\\u003E because it was identified as abusive or marked as spam.\\u003C/div\\u003E\"\n    },2,],]\n});\nonloadRegister_DEPRECATED(function() {\n    requireLazy([\"MercuryJewel\",], function(MercuryJewel) {\n        new MercuryJewel($(\"fbMessagesFlyout\"), $(\"fbMessagesJewel\"), require(\"m_0_2\"), {\n            message_counts: [{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: 0,\n                folder: \"inbox\"\n            },{\n                unread_count: 0,\n                unseen_count: 0,\n                seen_timestamp: 0,\n                last_action_id: null,\n                folder: \"other\"\n            },],\n            payload_source: \"server_initial_data\"\n        });\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceRequests = JSCC.get(\"j1z1iqLKJPdtUqBToi0\").init(require(\"m_0_4\"), \"[fb]requests\", false);\n});\nonloadRegister_DEPRECATED(function() {\n    window.presenceNotifications = new Notifications({\n        updateTime: 1374851147000,\n        latestNotif: null,\n        latestReadNotif: null,\n        updatePeriod: 480000,\n        cacheVersion: 2,\n        allowDesktopNotifications: false,\n        notifReceivedType: \"notification\",\n        wrapperID: \"fbNotificationsJewel\",\n        contentID: \"fbNotificationsList\",\n        shouldLogImpressions: 0,\n        useInfiniteScroll: 1,\n        persistUnreadColor: true,\n        unseenVsUnread: 0\n    });\n});\nonloadRegister_DEPRECATED(function() {\n    Arbiter.inform(\"jewel/count-initial\", {\n        jewel: \"notifications\",\n        count: 0\n    }, Arbiter.BEHAVIOR_STATE);\n});\nonafterloadRegister_DEPRECATED(function() {\n    Bootloader.loadComponents([\"legacy:detect-broken-proxy-cache\",], function() {\n        detect_broken_proxy_cache(\"100006118350059\", \"c_user\");\n    });\n});");
// 1477
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1478
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"se151abf45cd37f530e5c8a27b753d912bd1be56a");
// 1479
geval("var bigPipe = new (require(\"BigPipe\"))({\n    lid: 0,\n    forceFinish: true\n});");
// 1485
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"veUjj\",\"UmFO+\",\"c6lUE\",\"za92D\",\"j1x0z\",\"tKv6W\",\"ynBUm\",\"tAd6o\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"AVmr9\",\"I+n09\",\"4vv8/\",\"zBhY6\",\"f7Tpb\",\"OSd/n\",\"+P3v8\",\"js0se\",\"BjpNB\",\"/MWWQ\",\"G3fzU\",\"mBpeN\",\"C6rJk\",\"97Zhe\",],\n    displayJS: [\"OH3xD\",]\n});");
// 1486
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s107f6e97b022732c8fb4267064b1fd772daa5be8");
// 1487
geval("bigPipe.onPageletArrive({\n    id: \"first_response\",\n    phase: 0,\n    jsmods: {\n    },\n    is_last: true,\n    css: [\"veUjj\",\"UmFO+\",\"c6lUE\",\"za92D\",\"j1x0z\",\"tKv6W\",\"ynBUm\",\"tAd6o\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"AVmr9\",\"I+n09\",\"4vv8/\",\"zBhY6\",\"f7Tpb\",\"OSd/n\",\"+P3v8\",\"js0se\",\"BjpNB\",\"/MWWQ\",\"G3fzU\",\"mBpeN\",\"C6rJk\",\"97Zhe\",],\n    displayJS: [\"OH3xD\",]\n});");
// 1543
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_main_column: {\n            container_id: \"u_0_i\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineController\",\"init\",[],[\"1055580469\",\"timeline\",{\n            has_fixed_ads: false,\n            one_column_minimal: true\n        },],],]\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",],\n    id: \"pagelet_timeline_main_column\",\n    phase: 1\n});");
// 1544
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sf1857b96b66ad91a42a50549933b0195d72e3a05");
// 1545
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_main_column: {\n            container_id: \"u_0_i\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineController\",\"init\",[],[\"1055580469\",\"timeline\",{\n            has_fixed_ads: false,\n            one_column_minimal: true\n        },],],]\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",],\n    id: \"pagelet_timeline_main_column\",\n    phase: 1\n});");
// 1590
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_timeline_main_column\",],\n    content: {\n        pagelet_main_column_personal: {\n            container_id: \"u_0_p\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_1c\",],[{\n            __m: \"m_0_1c\"\n        },\"recent\",{\n            profile_id: 1055580469,\n            start: 0,\n            end: 1375340399,\n            query_type: 39,\n            section_pagelet_id: \"pagelet_timeline_recent\",\n            load_immediately: true\n        },true,null,0,-1,],],[\"TimelineCoverCollapse\",\"collapse\",[\"m_0_1d\",],[{\n            __m: \"m_0_1d\"\n        },160,],],[\"m_0_1e\",],[\"m_0_1g\",],[\"m_0_1h\",],[\"m_0_1j\",],[\"m_0_1k\",],[\"m_0_1n\",],[\"PhotoSnowlift\",\"initWithSpotlight\",[\"m_0_1n\",],[{\n            __m: \"m_0_1n\"\n        },{\n            refresh_fast: true,\n            refresh_rate: 20000,\n            hw_rendering: false,\n            pivot_hover: false,\n            pivot_end_metric: false,\n            pagers_on_keyboard_nav: false,\n            og_videos: false,\n            snowlift_profile_pic_cropper: false,\n            product_collections_visible: false,\n            snowlift_hover_shows_all_tags_and_faces: true,\n            resize_comments_for_ads: false,\n            snowlift_redesign: false,\n            min_ads: 2\n        },],],[\"PhotoSnowlift\",\"touch\",[\"m_0_1m\",],[{\n            __m: \"m_0_1m\"\n        },],],],\n        instances: [[\"m_0_1j\",[\"PopoverAsyncMenu\",\"m_0_1k\",\"m_0_1i\",\"m_0_1h\",\"PopoverMenuShowOnHover\",],[{\n            __m: \"m_0_1k\"\n        },{\n            __m: \"m_0_1i\"\n        },{\n            __m: \"m_0_1h\"\n        },\"/ajax/timeline/collections/nav_light_dropdown_menu/?profileid=1055580469&offset=3\",[{\n            __m: \"PopoverMenuShowOnHover\"\n        },],],1,],[\"m_0_1e\",[\"TimelineCover\",\"m_0_1d\",],[{\n            __m: \"m_0_1d\"\n        },{\n            cover_height: 315,\n            cover_width: 851\n        },],1,],[\"m_0_1g\",[\"TimelineNavLight\",\"m_0_1f\",],[{\n            __m: \"m_0_1f\"\n        },],1,],[\"m_0_1n\",[\"Spotlight\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"m_0_1o\",],[{\n            addedBehaviors: [{\n                __m: \"LayerHideOnBlur\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },],\n            attributes: {\n                id: \"photos_snowlift\",\n                tabindex: \"0\",\n                role: \"region\",\n                \"aria-label\": \"Facebook Photo Theater\",\n                \"aria-busy\": \"true\"\n            },\n            classNames: [\"fbPhotoSnowlift\",\"fbxPhoto\",]\n        },{\n            __m: \"m_0_1o\"\n        },],3,],[\"m_0_1h\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_1k\",[\"Popover\",\"m_0_1l\",\"m_0_1i\",],[{\n            __m: \"m_0_1l\"\n        },{\n            __m: \"m_0_1i\"\n        },[],{\n            alignh: \"left\"\n        },],3,],],\n        elements: [[\"m_0_1c\",\"pagelet_timeline_recent\",2,],[\"m_0_1d\",\"u_0_j\",4,],[\"m_0_1i\",\"u_0_m\",4,],[\"m_0_1p\",\"u_0_o\",2,\"m_0_1o\",],[\"m_0_1f\",\"u_0_k\",2,],[\"m_0_1l\",\"u_0_l\",2,],],\n        markup: [[\"m_0_1m\",{\n            __html: \"\\u003Cdiv\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1o\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-uiSpotlight__content\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftContainer uiContextualLayerParent\\\" data-ft=\\\"&#123;&quot;type&quot;:44&#125;\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftPopup\\\"\\u003E\\u003Cdiv class=\\\"stageWrapper lfloat\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftFullScreen fullScreenSwitch\\\" id=\\\"fullScreenSwitch\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Enter Fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenSwitch\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenClose\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stage\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosCornerWantButton\\\" id=\\\"fbPhotoSnowliftWantButton\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"spotlight spotlight\\\" src=\\\"/images/spacer.gif\\\" /\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxes tagContainer\\\" id=\\\"fbPhotoSnowliftTagBoxes\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotoTagApproval\\\" id=\\\"fbPhotoSnowliftTagApproval\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbPhotoCVInfo__wrapper\\\" id=\\\"fbPhotoSnowliftComputerVisionInfo\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"videoStage\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stageActions\\\" id=\\\"snowliftStageActions\\\"\\u003E\\u003Cdiv class=\\\"clearfix snowliftOverlay snowliftOverlayBar rightButtons\\\"\\u003E\\u003Cdiv class=\\\"overlayBarButtons rfloat\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle fbPhotosPhotoActions\\\" id=\\\"fbPhotoSnowliftActions\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoButtons\\\" id=\\\"fbPhotoSnowliftButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mediaTitleInfo\\\"\\u003E\\u003Cdiv class=\\\"mediaTitleBoxFlex\\\"\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftMediaTitle\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"mlm hidden_elem\\\" id=\\\"fbPhotoSnowliftPositionAndCount\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mediaTitleInfoSpacer\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxBase newTagBox hidden_elem\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"borderTagBox\\\"\\u003E\\u003Cdiv class=\\\"innerTagBox\\\"\\u003E\\u003Cdiv class=\\\"ieContentFix\\\"\\u003E\\u00a0\\u00a0\\u00a0\\u00a0\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"tag\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"tagPointer\\\"\\u003E\\u003Ci class=\\\"tagArrow img sp_3yt8ar sx_077cc0\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"tagName\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"snowliftPager prev\\\" title=\\\"Previous\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Ca class=\\\"snowliftPager next\\\" title=\\\"Next\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"photoError stageError\\\" id=\\\"fbPhotoSnowliftError\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rhc photoUfiContainer\\\"\\u003E\\u003Cdiv class=\\\"rhcHeader\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftControls\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to close\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater fullscreenCommentClose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftInlineEditor\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cform rel=\\\"async\\\" class=\\\"fbPhotosSnowliftFeedbackForm rhcBody commentable_item autoexpand_mode\\\" method=\\\"post\\\" action=\\\"/ajax/ufi/modify.php\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_o\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"charset_test\\\" value=\\\"&euro;,&acute;,\\u20ac,\\u00b4,\\u6c34,\\u0414,\\u0404\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cdiv class=\\\"uiScrollableArea rhcScroller native\\\" style=\\\"width:285px;\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaWrap scrollable\\\" aria-label=\\\"Scrollable region\\\" tabindex=\\\"0\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaBody\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaContent\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSpecificAudience\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftAuthorInfo\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\" id=\\\"fbPhotoSnowliftAuthorPic\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fbPhotoContributorName\\\" id=\\\"fbPhotoSnowliftAuthorName\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mrs fsm fwn fcg\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSubscribe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftTimestamp\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mls\\\" id=\\\"fbPhotoSnowliftAudienceSelector\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosOnProfile\\\" id=\\\"fbPhotoSnowliftOnProfile\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftViewOnApp\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftUseApp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cspan class=\\\"fbPhotosPhotoCaption\\\" tabindex=\\\"0\\\" aria-live=\\\"polite\\\" data-ft=\\\"&#123;&quot;type&quot;:45&#125;\\\" id=\\\"fbPhotoSnowliftCaption\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"fbPhotoTagList\\\" id=\\\"fbPhotoSnowliftTagList\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"fbPhotoPagesTagList\\\" id=\\\"fbPhotoSnowliftPagesTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pts fbPhotoLegacyTagList\\\" id=\\\"fbPhotoSnowliftLegacyTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoOwnerButtons stat_elem\\\" id=\\\"fbPhotoSnowliftOwnerButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftFeedback\\\" id=\\\"fbPhotoSnowliftFeedback\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowboxFeedbackInput\\\" id=\\\"fbPhotoSnowliftFeedbackInput\\\"\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftProductMetadata\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-snowliftAds__root rhcFooter\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"pagelet_photo_viewer_init\\\" class=\\\"hidden_elem\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",\"veUjj\",],\n    bootloadable: {\n        PhotoCropper: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"gyG67\",\"m+DMw\",\"/MWWQ\",\"za92D\",\"iIySo\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        xfhln: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/qrynZd4S1j9.js\"\n        },\n        OYzUx: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/bD9K1YDrR29.js\"\n        },\n        \"4kgAq\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/UTKDDtdCpTB.js\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",\"4kgAq\",\"OYzUx\",\"XH2Cu\",\"gyG67\",\"e0RyX\",],\n    displayJS: [\"OH3xD\",],\n    id: \"pagelet_main_column_personal\",\n    phase: 1\n});");
// 1591
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s5a3b5f935338c9f617a3d79fcb404ee9e841ac66");
// 1592
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_timeline_main_column\",],\n    JSBNG__content: {\n        pagelet_main_column_personal: {\n            container_id: \"u_0_p\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_1c\",],[{\n            __m: \"m_0_1c\"\n        },\"recent\",{\n            profile_id: 1055580469,\n            start: 0,\n            end: 1375340399,\n            query_type: 39,\n            section_pagelet_id: \"pagelet_timeline_recent\",\n            load_immediately: true\n        },true,null,0,-1,],],[\"TimelineCoverCollapse\",\"collapse\",[\"m_0_1d\",],[{\n            __m: \"m_0_1d\"\n        },160,],],[\"m_0_1e\",],[\"m_0_1g\",],[\"m_0_1h\",],[\"m_0_1j\",],[\"m_0_1k\",],[\"m_0_1n\",],[\"PhotoSnowlift\",\"initWithSpotlight\",[\"m_0_1n\",],[{\n            __m: \"m_0_1n\"\n        },{\n            refresh_fast: true,\n            refresh_rate: 20000,\n            hw_rendering: false,\n            pivot_hover: false,\n            pivot_end_metric: false,\n            pagers_on_keyboard_nav: false,\n            og_videos: false,\n            snowlift_profile_pic_cropper: false,\n            product_collections_visible: false,\n            snowlift_hover_shows_all_tags_and_faces: true,\n            resize_comments_for_ads: false,\n            snowlift_redesign: false,\n            min_ads: 2\n        },],],[\"PhotoSnowlift\",\"touch\",[\"m_0_1m\",],[{\n            __m: \"m_0_1m\"\n        },],],],\n        instances: [[\"m_0_1j\",[\"PopoverAsyncMenu\",\"m_0_1k\",\"m_0_1i\",\"m_0_1h\",\"PopoverMenuShowOnHover\",],[{\n            __m: \"m_0_1k\"\n        },{\n            __m: \"m_0_1i\"\n        },{\n            __m: \"m_0_1h\"\n        },\"/ajax/timeline/collections/nav_light_dropdown_menu/?profileid=1055580469&offset=3\",[{\n            __m: \"PopoverMenuShowOnHover\"\n        },],],1,],[\"m_0_1e\",[\"TimelineCover\",\"m_0_1d\",],[{\n            __m: \"m_0_1d\"\n        },{\n            cover_height: 315,\n            cover_width: 851\n        },],1,],[\"m_0_1g\",[\"TimelineNavLight\",\"m_0_1f\",],[{\n            __m: \"m_0_1f\"\n        },],1,],[\"m_0_1n\",[\"Spotlight\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"m_0_1o\",],[{\n            addedBehaviors: [{\n                __m: \"LayerHideOnBlur\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },],\n            attributes: {\n                id: \"photos_snowlift\",\n                tabindex: \"0\",\n                role: \"region\",\n                \"aria-label\": \"Facebook Photo Theater\",\n                \"aria-busy\": \"true\"\n            },\n            classNames: [\"fbPhotoSnowlift\",\"fbxPhoto\",]\n        },{\n            __m: \"m_0_1o\"\n        },],3,],[\"m_0_1h\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_1k\",[\"Popover\",\"m_0_1l\",\"m_0_1i\",],[{\n            __m: \"m_0_1l\"\n        },{\n            __m: \"m_0_1i\"\n        },[],{\n            alignh: \"left\"\n        },],3,],],\n        elements: [[\"m_0_1c\",\"pagelet_timeline_recent\",2,],[\"m_0_1d\",\"u_0_j\",4,],[\"m_0_1i\",\"u_0_m\",4,],[\"m_0_1p\",\"u_0_o\",2,\"m_0_1o\",],[\"m_0_1f\",\"u_0_k\",2,],[\"m_0_1l\",\"u_0_l\",2,],],\n        markup: [[\"m_0_1m\",{\n            __html: \"\\u003Cdiv\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1o\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-uiSpotlight__content\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftContainer uiContextualLayerParent\\\" data-ft=\\\"&#123;&quot;type&quot;:44&#125;\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftPopup\\\"\\u003E\\u003Cdiv class=\\\"stageWrapper lfloat\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftFullScreen fullScreenSwitch\\\" id=\\\"fullScreenSwitch\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Enter Fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenSwitch\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" href=\\\"#\\\" id=\\\"fbPhotoSnowliftFullScreenClose\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stage\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosCornerWantButton\\\" id=\\\"fbPhotoSnowliftWantButton\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"spotlight spotlight\\\" src=\\\"/images/spacer.gif\\\" /\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxes tagContainer\\\" id=\\\"fbPhotoSnowliftTagBoxes\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotoTagApproval\\\" id=\\\"fbPhotoSnowliftTagApproval\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbPhotoCVInfo__wrapper\\\" id=\\\"fbPhotoSnowliftComputerVisionInfo\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"videoStage\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"stageActions\\\" id=\\\"snowliftStageActions\\\"\\u003E\\u003Cdiv class=\\\"clearfix snowliftOverlay snowliftOverlayBar rightButtons\\\"\\u003E\\u003Cdiv class=\\\"overlayBarButtons rfloat\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiInlineBlock__middle fbPhotosPhotoActions\\\" id=\\\"fbPhotoSnowliftActions\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoButtons\\\" id=\\\"fbPhotoSnowliftButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mediaTitleInfo\\\"\\u003E\\u003Cdiv class=\\\"mediaTitleBoxFlex\\\"\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftMediaTitle\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"mlm hidden_elem\\\" id=\\\"fbPhotoSnowliftPositionAndCount\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mediaTitleInfoSpacer\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoTagboxBase newTagBox hidden_elem\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"borderTagBox\\\"\\u003E\\u003Cdiv class=\\\"innerTagBox\\\"\\u003E\\u003Cdiv class=\\\"ieContentFix\\\"\\u003E\\u00a0\\u00a0\\u00a0\\u00a0\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"tag\\\" style=\\\"\\\"\\u003E\\u003Cdiv class=\\\"tagPointer\\\"\\u003E\\u003Ci class=\\\"tagArrow img sp_3yt8ar sx_077cc0\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"tagName\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"snowliftPager prev\\\" title=\\\"Previous\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Ca class=\\\"snowliftPager next\\\" title=\\\"Next\\\"\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"photoError stageError\\\" id=\\\"fbPhotoSnowliftError\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rhc photoUfiContainer\\\"\\u003E\\u003Cdiv class=\\\"rhcHeader\\\"\\u003E\\u003Cdiv class=\\\"fbPhotoSnowliftControls\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to close\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Press Esc to exit fullscreen\\\" data-tooltip-position=\\\"below\\\" data-tooltip-alignh=\\\"right\\\" class=\\\"closeTheater fullscreenCommentClose\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"fbPhotoSnowliftInlineEditor\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cform rel=\\\"async\\\" class=\\\"fbPhotosSnowliftFeedbackForm rhcBody commentable_item autoexpand_mode\\\" method=\\\"post\\\" action=\\\"/ajax/ufi/modify.php\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_o\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"charset_test\\\" value=\\\"&euro;,&acute;,\\u20ac,\\u00b4,\\u6c34,\\u0414,\\u0404\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cdiv class=\\\"uiScrollableArea rhcScroller native\\\" style=\\\"width:285px;\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaWrap scrollable\\\" aria-label=\\\"Scrollable region\\\" tabindex=\\\"0\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaBody\\\"\\u003E\\u003Cdiv class=\\\"uiScrollableAreaContent\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSpecificAudience\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"clearfix fbPhotoSnowliftAuthorInfo\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\" id=\\\"fbPhotoSnowliftAuthorPic\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"fbPhotoContributorName\\\" id=\\\"fbPhotoSnowliftAuthorName\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"mrs fsm fwn fcg\\\"\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftSubscribe\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftTimestamp\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"mls\\\" id=\\\"fbPhotoSnowliftAudienceSelector\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003E\\u003Cdiv class=\\\"fbPhotosOnProfile\\\" id=\\\"fbPhotoSnowliftOnProfile\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftViewOnApp\\\"\\u003E\\u003C/span\\u003E\\u003Cspan id=\\\"fbPhotoSnowliftUseApp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv\\u003E\\u003Cspan class=\\\"fbPhotosPhotoCaption\\\" tabindex=\\\"0\\\" aria-live=\\\"polite\\\" data-ft=\\\"&#123;&quot;type&quot;:45&#125;\\\" id=\\\"fbPhotoSnowliftCaption\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"fbPhotoTagList\\\" id=\\\"fbPhotoSnowliftTagList\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"fbPhotoPagesTagList\\\" id=\\\"fbPhotoSnowliftPagesTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pts fbPhotoLegacyTagList\\\" id=\\\"fbPhotoSnowliftLegacyTagList\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosPhotoOwnerButtons stat_elem\\\" id=\\\"fbPhotoSnowliftOwnerButtons\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftFeedback\\\" id=\\\"fbPhotoSnowliftFeedback\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbPhotosSnowboxFeedbackInput\\\" id=\\\"fbPhotoSnowliftFeedbackInput\\\"\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"fbPhotosSnowliftProductMetadata\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-snowliftAds__root rhcFooter\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv id=\\\"pagelet_photo_viewer_init\\\" class=\\\"hidden_elem\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",\"veUjj\",],\n    bootloadable: {\n        PhotoCropper: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"gyG67\",\"m+DMw\",\"/MWWQ\",\"za92D\",\"iIySo\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        xfhln: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/qrynZd4S1j9.js\"\n        },\n        OYzUx: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/bD9K1YDrR29.js\"\n        },\n        \"4kgAq\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/UTKDDtdCpTB.js\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",\"4kgAq\",\"OYzUx\",\"XH2Cu\",\"gyG67\",\"e0RyX\",],\n    displayJS: [\"OH3xD\",],\n    id: \"pagelet_main_column_personal\",\n    phase: 1\n});");
// 1691
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    content: {\n        pagelet_escape_hatch: {\n            container_id: \"u_0_t\"\n        }\n    },\n    jsmods: {\n        require: [[\"AddFriendButton\",\"init\",[\"m_0_1q\",],[{\n            __m: \"m_0_1q\"\n        },1055580469,false,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",null,null,null,false,],],[\"m_0_1r\",],[\"FriendListFlyoutController\",\"init\",[\"m_0_1r\",],[{\n            __m: \"m_0_1r\"\n        },50,],],[\"AddFriendButton\",\"init\",[\"m_0_1t\",],[{\n            __m: \"m_0_1t\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1r\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1s\",],[{\n            width: 192,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1s\"\n        },],3,],],\n        elements: [[\"m_0_1t\",\"u_0_q\",2,],[\"m_0_1q\",\"u_0_s\",2,],],\n        markup: [[\"m_0_1s\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"FriendListFlyoutLoading\\\"\\u003E\\u003Cimg class=\\\"mvl center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",\"veUjj\",],\n    bootloadable: {\n    },\n    resource_map: {\n        cstCX: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/W9EdqwZ5ZfH.js\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"cstCX\",],\n    id: \"pagelet_escape_hatch\",\n    phase: 1\n});");
// 1692
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s6a2a298da1b988661b8ec89b154649ff4ef0e491");
// 1693
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    JSBNG__content: {\n        pagelet_escape_hatch: {\n            container_id: \"u_0_t\"\n        }\n    },\n    jsmods: {\n        require: [[\"AddFriendButton\",\"init\",[\"m_0_1q\",],[{\n            __m: \"m_0_1q\"\n        },1055580469,false,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",null,null,null,false,],],[\"m_0_1r\",],[\"FriendListFlyoutController\",\"init\",[\"m_0_1r\",],[{\n            __m: \"m_0_1r\"\n        },50,],],[\"AddFriendButton\",\"init\",[\"m_0_1t\",],[{\n            __m: \"m_0_1t\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_1r\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1s\",],[{\n            width: 192,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1s\"\n        },],3,],],\n        elements: [[\"m_0_1t\",\"u_0_q\",2,],[\"m_0_1q\",\"u_0_s\",2,],],\n        markup: [[\"m_0_1s\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv class=\\\"FriendListFlyoutLoading\\\"\\u003E\\u003Cimg class=\\\"mvl center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",\"veUjj\",],\n    bootloadable: {\n    },\n    resource_map: {\n        cstCX: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/W9EdqwZ5ZfH.js\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"cstCX\",],\n    id: \"pagelet_escape_hatch\",\n    phase: 1\n});");
// 1745
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    content: {\n        pagelet_above_header_timeline: \"\"\n    },\n    jsmods: {\n        require: [[\"m_0_1u\",],[\"m_0_1w\",],[\"TimelineCurationNUXController\",\"init\",[\"m_0_1u\",\"m_0_1w\",],[{\n            next_step: \"add_button\",\n            dialogs: {\n                add_button: {\n                    __m: \"m_0_1u\"\n                },\n                privacy: {\n                    __m: \"m_0_1w\"\n                }\n            }\n        },],],],\n        instances: [[\"m_0_1u\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_1v\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"above\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },]\n        },{\n            __m: \"m_0_1v\"\n        },],3,],[\"m_0_1w\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1x\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"right\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1x\"\n        },],3,],],\n        define: [[\"NumberFormatConfig\",[],{\n            decimalSeparator: \".\",\n            numberDelimiter: \",\"\n        },54,],[\"TimelineDynamicSectionConfig\",[\"m_0_1y\",\"m_0_1z\",\"m_0_20\",],{\n            smallThrobber: {\n                __m: \"m_0_1y\"\n            },\n            pager: {\n                __m: \"m_0_1z\"\n            },\n            throbber: {\n                __m: \"m_0_20\"\n            },\n            skmapping: {\n                friends_recent: \"friends\",\n                friends_all: \"friends\",\n                friends_mutual: \"friends\",\n                photos_of: \"photos\",\n                photos_all: \"photos\",\n                photos_albums: \"photos\",\n                likes_recent: \"likes\",\n                info_all: \"info\",\n                music_my_music: \"music\",\n                music_favs: \"music\",\n                music_playlists: \"music\",\n                places_all: \"map\",\n                books_read: \"books\",\n                books_favorite: \"books\",\n                books_want: \"books\",\n                places_recent: null,\n                fitness_overview: \"fitness\",\n                fitness_daily_activity: null,\n                fitness_sports_i_play: null,\n                friends_featured: null,\n                places_want: null,\n                info_basic: \"info\",\n                info_contact: null,\n                fitness_running: \"fitness\",\n                fitness_cycling: \"fitness\",\n                friends_followers: \"friends\",\n                friends_following: \"friends\",\n                music_radio: \"music\",\n                info_history: \"info\",\n                games_play: \"games\",\n                products_want: null,\n                photos_archive: \"photos\",\n                notes_my_notes: \"notes\",\n                notes_drafts: \"notes\",\n                notes_about_me: \"notes\",\n                likes_sports_teams: \"likes\",\n                likes_activities: \"likes\",\n                likes_interests: \"likes\",\n                likes_other: \"likes\",\n                video_movies_watch: \"movies\",\n                video_tv_show_watch: \"tv\",\n                music_saved: \"music\",\n                video_movies_want: \"movies\",\n                video_tv_show_want: \"tv\",\n                video_movies_favorite: \"movies\",\n                video_tv_show_favorite: \"tv\",\n                friends_high_school: \"friends\",\n                friends_college: \"friends\",\n                friends_work: \"friends\",\n                friends_suggested: \"friends\",\n                apps_like: \"games\",\n                upcoming_events: \"events\",\n                past_events: \"events\",\n                likes_people: \"likes\",\n                likes_sports: \"likes\",\n                likes_athletes: \"likes\",\n                fitness_report: null,\n                groups_member: \"groups\",\n                music_all_time: \"music\",\n                music_heavy_rotation: \"music\",\n                photos_album: \"photos\",\n                photos_untagged: \"photos\",\n                music_mutual: \"music\",\n                likes_foods: \"likes\",\n                likes_restaurants: \"likes\",\n                restaurants_visited: \"restaurants\",\n                restaurants_want: \"restaurants\",\n                likes_websites: \"likes\",\n                likes_clothing: \"likes\",\n                followers: \"friends\",\n                following: \"friends\",\n                media_set: \"photos\",\n                photos_stream: \"photos\",\n                photos_synced: \"photos\"\n            }\n        },68,],[\"AppSectionCurationState\",[],{\n            showItems: \"show_items\",\n            showApps: \"show_apps\",\n            hide: \"hide\"\n        },145,],[\"AdsCurrencyConfig\",[],{\n            currencies: {\n                ARS: [\"{symbol} {amount}\",\"$\",100,],\n                AUD: [\"{symbol}{amount}\",\"$\",100,],\n                BOB: [\"{symbol} {amount}\",\"$b\",100,],\n                BRL: [\"{symbol} {amount}\",\"R$\",100,],\n                GBP: [\"{symbol}{amount}\",\"\\u00a3\",100,],\n                CAD: [\"{symbol}{amount}\",\"$\",100,],\n                CLP: [\"{symbol} {amount}\",\"$\",1,],\n                CNY: [\"{amount} {symbol}\",\"\\uffe5\",100,],\n                COP: [\"{symbol} {amount}\",\"$\",1,],\n                CRC: [\"{symbol}{amount}\",\"\\u20a1\",1,],\n                CZK: [\"{amount} {symbol}\",\"K\\u010d\",100,],\n                DKK: [\"{symbol} {amount}\",\"DKK\",100,],\n                EUR: [\"{symbol} {amount}\",\"\\u20ac\",100,],\n                GTQ: [\"{symbol}{amount}\",\"Q\",100,],\n                HNL: [\"{symbol} {amount}\",\"L.\",100,],\n                HKD: [\"{symbol}{amount}\",\"$\",100,],\n                HUF: [\"{amount} {symbol}\",\"Ft\",1,],\n                ISK: [\"{amount} {symbol}\",\"kr.\",1,],\n                INR: [\"{symbol} {amount}\",\"\\u0930\\u0941\",100,],\n                IDR: [\"{symbol} {amount}\",\"Rp\",1,],\n                ILS: [\"{symbol} {amount}\",\"\\u20aa\",100,],\n                JPY: [\"{symbol}{amount}\",\"\\u00a5\",1,],\n                KRW: [\"{symbol}{amount}\",\"\\u20a9\",1,],\n                MOP: [\"{symbol}{amount}\",\"MOP\",100,],\n                MYR: [\"{symbol}{amount}\",\"R\",100,],\n                MXN: [\"{symbol}{amount}\",\"$\",100,],\n                NZD: [\"{amount}{symbol}\",\"$\",100,],\n                NIO: [\"{symbol} {amount}\",\"C$\",100,],\n                NOK: [\"{symbol} {amount}\",\"NOK\",100,],\n                PYG: [\"{symbol} {amount}\",\"Gs\",1,],\n                PEN: [\"{symbol} {amount}\",\"S/.\",100,],\n                PHP: [\"{symbol}{amount}\",\"Php\",100,],\n                PLN: [\"{amount} {symbol}\",\"z\\u0142\",100,],\n                QAR: [\"{amount} {symbol}\",\"\\u0631.\\u0642.\",100,],\n                RON: [\"{amount} {symbol}\",\"lei\",100,],\n                RUB: [\"{amount}{symbol}\",\"RUB\",100,],\n                SAR: [\"{amount} {symbol}\",\"\\u0631.\\u0633.\",100,],\n                SGD: [\"{symbol}{amount}\",\"$\",100,],\n                ZAR: [\"{symbol} {amount}\",\"R\",100,],\n                SEK: [\"{amount} {symbol}\",\"kr\",100,],\n                CHF: [\"{symbol} {amount}\",\"CHF\",100,],\n                TWD: [\"{symbol}{amount}\",\"NT$\",1,],\n                THB: [\"{symbol}{amount}\",\"\\u0e3f\",100,],\n                TRY: [\"{amount} {symbol}\",\"TL\",100,],\n                AED: [\"{amount} {symbol}\",\"\\u062f.\\u0625.\",100,],\n                USD: [\"{symbol}{amount}\",\"$\",100,],\n                UYU: [\"{symbol} {amount}\",\"$U\",100,],\n                VEF: [\"{symbol} {amount}\",\"Bs\",100,],\n                VND: [\"{amount} {symbol}\",\"\\u20ab\",1,]\n            }\n        },168,],],\n        markup: [[\"m_0_1y\",{\n            __html: \"\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\"\n        },2,],[\"m_0_20\",{\n            __html: \"\\u003Cimg class=\\\"-cx-PRIVATE-fbTimelineMedley__throbber img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/jKEcVPZFk-2.gif\\\" alt=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" /\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"close\\\"\\u003E\\u003C/a\\u003EUse the [+] button or search tool to add a story about movies, books or something else you enjoy.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"next\\\"\\u003ENext\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1z\",{\n            __html: \"\\u003Ca class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__root\\\" href=\\\"#\\\" data-referrer=\\\"timeline_collections_overview_see_all\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__text fwb\\\"\\u003ESee All\\u003C/span\\u003E\\u003Cimg class=\\\"uiLoadingIndicatorAsync img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_1x\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"done\\\"\\u003E\\u003C/a\\u003EUse the audience selector to choose who can see what you add [+].\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"done\\\"\\u003EDone\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"/MWWQ\",\"nxD7O\",\"4kgAq\",\"XH2Cu\",],\n    id: \"pagelet_above_header_timeline\",\n    phase: 1\n});");
// 1746
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s65e5cb4a6bc44b128757c40efe7cb937f631c660");
// 1747
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    JSBNG__content: {\n        pagelet_above_header_timeline: \"\"\n    },\n    jsmods: {\n        require: [[\"m_0_1u\",],[\"m_0_1w\",],[\"TimelineCurationNUXController\",\"init\",[\"m_0_1u\",\"m_0_1w\",],[{\n            next_step: \"add_button\",\n            dialogs: {\n                add_button: {\n                    __m: \"m_0_1u\"\n                },\n                privacy: {\n                    __m: \"m_0_1w\"\n                }\n            }\n        },],],],\n        instances: [[\"m_0_1u\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"m_0_1v\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"above\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },]\n        },{\n            __m: \"m_0_1v\"\n        },],3,],[\"m_0_1w\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_1x\",],[{\n            width: 300,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"right\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_1x\"\n        },],3,],],\n        define: [[\"NumberFormatConfig\",[],{\n            decimalSeparator: \".\",\n            numberDelimiter: \",\"\n        },54,],[\"TimelineDynamicSectionConfig\",[\"m_0_1y\",\"m_0_1z\",\"m_0_20\",],{\n            smallThrobber: {\n                __m: \"m_0_1y\"\n            },\n            pager: {\n                __m: \"m_0_1z\"\n            },\n            throbber: {\n                __m: \"m_0_20\"\n            },\n            skmapping: {\n                friends_recent: \"friends\",\n                friends_all: \"friends\",\n                friends_mutual: \"friends\",\n                photos_of: \"photos\",\n                photos_all: \"photos\",\n                photos_albums: \"photos\",\n                likes_recent: \"likes\",\n                info_all: \"info\",\n                music_my_music: \"music\",\n                music_favs: \"music\",\n                music_playlists: \"music\",\n                places_all: \"map\",\n                books_read: \"books\",\n                books_favorite: \"books\",\n                books_want: \"books\",\n                places_recent: null,\n                fitness_overview: \"fitness\",\n                fitness_daily_activity: null,\n                fitness_sports_i_play: null,\n                friends_featured: null,\n                places_want: null,\n                info_basic: \"info\",\n                info_contact: null,\n                fitness_running: \"fitness\",\n                fitness_cycling: \"fitness\",\n                friends_followers: \"friends\",\n                friends_following: \"friends\",\n                music_radio: \"music\",\n                info_history: \"info\",\n                games_play: \"games\",\n                products_want: null,\n                photos_archive: \"photos\",\n                notes_my_notes: \"notes\",\n                notes_drafts: \"notes\",\n                notes_about_me: \"notes\",\n                likes_sports_teams: \"likes\",\n                likes_activities: \"likes\",\n                likes_interests: \"likes\",\n                likes_other: \"likes\",\n                video_movies_watch: \"movies\",\n                video_tv_show_watch: \"tv\",\n                music_saved: \"music\",\n                video_movies_want: \"movies\",\n                video_tv_show_want: \"tv\",\n                video_movies_favorite: \"movies\",\n                video_tv_show_favorite: \"tv\",\n                friends_high_school: \"friends\",\n                friends_college: \"friends\",\n                friends_work: \"friends\",\n                friends_suggested: \"friends\",\n                apps_like: \"games\",\n                upcoming_events: \"events\",\n                past_events: \"events\",\n                likes_people: \"likes\",\n                likes_sports: \"likes\",\n                likes_athletes: \"likes\",\n                fitness_report: null,\n                groups_member: \"groups\",\n                music_all_time: \"music\",\n                music_heavy_rotation: \"music\",\n                photos_album: \"photos\",\n                photos_untagged: \"photos\",\n                music_mutual: \"music\",\n                likes_foods: \"likes\",\n                likes_restaurants: \"likes\",\n                restaurants_visited: \"restaurants\",\n                restaurants_want: \"restaurants\",\n                likes_websites: \"likes\",\n                likes_clothing: \"likes\",\n                followers: \"friends\",\n                following: \"friends\",\n                media_set: \"photos\",\n                photos_stream: \"photos\",\n                photos_synced: \"photos\"\n            }\n        },68,],[\"AppSectionCurationState\",[],{\n            showItems: \"show_items\",\n            showApps: \"show_apps\",\n            hide: \"hide\"\n        },145,],[\"AdsCurrencyConfig\",[],{\n            currencies: {\n                ARS: [\"{symbol} {amount}\",\"$\",100,],\n                AUD: [\"{symbol}{amount}\",\"$\",100,],\n                BOB: [\"{symbol} {amount}\",\"$b\",100,],\n                BRL: [\"{symbol} {amount}\",\"R$\",100,],\n                GBP: [\"{symbol}{amount}\",\"\\u00a3\",100,],\n                CAD: [\"{symbol}{amount}\",\"$\",100,],\n                CLP: [\"{symbol} {amount}\",\"$\",1,],\n                CNY: [\"{amount} {symbol}\",\"\\uffe5\",100,],\n                COP: [\"{symbol} {amount}\",\"$\",1,],\n                CRC: [\"{symbol}{amount}\",\"\\u20a1\",1,],\n                CZK: [\"{amount} {symbol}\",\"K\\u010d\",100,],\n                DKK: [\"{symbol} {amount}\",\"DKK\",100,],\n                EUR: [\"{symbol} {amount}\",\"\\u20ac\",100,],\n                GTQ: [\"{symbol}{amount}\",\"Q\",100,],\n                HNL: [\"{symbol} {amount}\",\"L.\",100,],\n                HKD: [\"{symbol}{amount}\",\"$\",100,],\n                HUF: [\"{amount} {symbol}\",\"Ft\",1,],\n                ISK: [\"{amount} {symbol}\",\"kr.\",1,],\n                INR: [\"{symbol} {amount}\",\"\\u0930\\u0941\",100,],\n                IDR: [\"{symbol} {amount}\",\"Rp\",1,],\n                ILS: [\"{symbol} {amount}\",\"\\u20aa\",100,],\n                JPY: [\"{symbol}{amount}\",\"\\u00a5\",1,],\n                KRW: [\"{symbol}{amount}\",\"\\u20a9\",1,],\n                MOP: [\"{symbol}{amount}\",\"MOP\",100,],\n                MYR: [\"{symbol}{amount}\",\"R\",100,],\n                MXN: [\"{symbol}{amount}\",\"$\",100,],\n                NZD: [\"{amount}{symbol}\",\"$\",100,],\n                NIO: [\"{symbol} {amount}\",\"C$\",100,],\n                NOK: [\"{symbol} {amount}\",\"NOK\",100,],\n                PYG: [\"{symbol} {amount}\",\"Gs\",1,],\n                PEN: [\"{symbol} {amount}\",\"S/.\",100,],\n                PHP: [\"{symbol}{amount}\",\"Php\",100,],\n                PLN: [\"{amount} {symbol}\",\"z\\u0142\",100,],\n                QAR: [\"{amount} {symbol}\",\"\\u0631.\\u0642.\",100,],\n                RON: [\"{amount} {symbol}\",\"lei\",100,],\n                RUB: [\"{amount}{symbol}\",\"RUB\",100,],\n                SAR: [\"{amount} {symbol}\",\"\\u0631.\\u0633.\",100,],\n                SGD: [\"{symbol}{amount}\",\"$\",100,],\n                ZAR: [\"{symbol} {amount}\",\"R\",100,],\n                SEK: [\"{amount} {symbol}\",\"kr\",100,],\n                CHF: [\"{symbol} {amount}\",\"CHF\",100,],\n                TWD: [\"{symbol}{amount}\",\"NT$\",1,],\n                THB: [\"{symbol}{amount}\",\"\\u0e3f\",100,],\n                TRY: [\"{amount} {symbol}\",\"TL\",100,],\n                AED: [\"{amount} {symbol}\",\"\\u062f.\\u0625.\",100,],\n                USD: [\"{symbol}{amount}\",\"$\",100,],\n                UYU: [\"{symbol} {amount}\",\"$U\",100,],\n                VEF: [\"{symbol} {amount}\",\"Bs\",100,],\n                VND: [\"{amount} {symbol}\",\"\\u20ab\",1,]\n            }\n        },168,],],\n        markup: [[\"m_0_1y\",{\n            __html: \"\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\"\n        },2,],[\"m_0_20\",{\n            __html: \"\\u003Cimg class=\\\"-cx-PRIVATE-fbTimelineMedley__throbber img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y9/r/jKEcVPZFk-2.gif\\\" alt=\\\"\\\" width=\\\"32\\\" height=\\\"32\\\" /\\u003E\"\n        },2,],[\"m_0_1v\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"close\\\"\\u003E\\u003C/a\\u003EUse the [+] button or search tool to add a story about movies, books or something else you enjoy.\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"next\\\"\\u003ENext\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_1z\",{\n            __html: \"\\u003Ca class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__root\\\" href=\\\"#\\\" data-referrer=\\\"timeline_collections_overview_see_all\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbTimelineMedleyPager__text fwb\\\"\\u003ESee All\\u003C/span\\u003E\\u003Cimg class=\\\"uiLoadingIndicatorAsync img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_1x\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-abstractContextualDialog__defaultpadding\\\"\\u003E\\u003Cdiv\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Close\\\" class=\\\"layerButton rfloat uiCloseButton uiCloseButtonSmall\\\" href=\\\"#\\\" role=\\\"button\\\" data-action=\\\"done\\\"\\u003E\\u003C/a\\u003EUse the audience selector to choose who can see what you add [+].\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter -cx-PUBLIC-abstractContextualDialog__footer uiBoxGray topborder\\\"\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerButton uiOverlayButton selected -cx-PRIVATE-uiButton__confirm\\\" role=\\\"button\\\" href=\\\"#\\\" data-action=\\\"done\\\"\\u003EDone\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"/MWWQ\",\"nxD7O\",\"4kgAq\",\"XH2Cu\",],\n    id: \"pagelet_above_header_timeline\",\n    phase: 1\n});");
// 1791
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    is_last: true,\n    content: {\n        pagelet_timeline_profile_actions: {\n            container_id: \"u_0_18\"\n        }\n    },\n    jsmods: {\n        require: [[\"m_0_21\",],[\"m_0_22\",],[\"ButtonGroupMonitor\",],[\"SelectorDeprecated\",],[\"m_0_26\",],[\"SubscribeButton\",\"init\",[\"m_0_29\",\"m_0_28\",\"m_0_2a\",],[{\n            __m: \"m_0_29\"\n        },{\n            __m: \"m_0_28\"\n        },{\n            __m: \"m_0_2a\"\n        },\"1055580469\",0,false,],],[\"m_0_29\",],[\"m_0_2a\",],[\"m_0_2f\",],[\"m_0_2e\",],[\"AddFriendButton\",\"init\",[\"m_0_2i\",],[{\n            __m: \"m_0_2i\"\n        },1055580469,\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?sk=wall\",\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_21\",[\"ButtonGroup\",\"m_0_23\",],[{\n            __m: \"m_0_23\"\n        },],1,],[\"m_0_22\",[\"ButtonGroup\",\"m_0_24\",],[{\n            __m: \"m_0_24\"\n        },],1,],[\"m_0_29\",[\"SwapButtonDEPRECATED\",\"m_0_28\",\"m_0_2b\",],[{\n            __m: \"m_0_28\"\n        },{\n            __m: \"m_0_2b\"\n        },false,],3,],[\"m_0_26\",[\"AsyncMenu\",\"m_0_27\",],[\"/ajax/lists/interests_submenu.php?profile_id=1055580469&list_location=gear_menu\",{\n            __m: \"m_0_27\"\n        },],2,],[\"m_0_2a\",[\"HoverButton\",\"m_0_2c\",\"m_0_2e\",\"m_0_2d\",],[{\n            __m: \"m_0_2c\"\n        },{\n            __m: \"m_0_2e\"\n        },{\n            __m: \"m_0_2d\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_2f\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_2g\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_2g\"\n        },],3,],[\"m_0_2e\",[\"HoverFlyout\",\"m_0_2f\",\"m_0_2h\",],[{\n            __m: \"m_0_2f\"\n        },{\n            __m: \"m_0_2h\"\n        },150,150,],3,],],\n        elements: [[\"m_0_2b\",\"u_0_13\",2,],[\"m_0_2i\",\"u_0_16\",2,],[\"m_0_2d\",\"u_0_14\",2,\"m_0_2g\",],[\"m_0_2c\",\"u_0_13\",2,],[\"m_0_24\",\"u_0_v\",2,],[\"m_0_2h\",\"u_0_13\",2,],[\"m_0_27\",\"u_0_11\",2,],[\"m_0_25\",\"u_0_w\",2,],[\"m_0_23\",\"u_0_u\",2,],[\"m_0_28\",\"u_0_12\",4,],],\n        markup: [[\"m_0_2g\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_14\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",],\n    bootloadable: {\n    },\n    resource_map: {\n        dShSX: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/JdjE3mVpxG6.js\"\n        }\n    },\n    js: [\"OH3xD\",\"/MWWQ\",\"AVmr9\",\"f7Tpb\",\"nxD7O\",\"4kgAq\",\"dShSX\",\"OYzUx\",\"cstCX\",],\n    jscc_map: \"({\\\"jo0ho56azciA4s4HSJ0\\\":function(){return new SubMenu()}})\",\n    onload: [\"JSCC.get(\\\"jo0ho56azciA4s4HSJ0\\\").init($(\\\"u_0_x\\\"), $(\\\"u_0_y\\\"), $(\\\"u_0_z\\\"), $(\\\"u_0_10\\\"));\",\"JSCC.get(\\\"jo0ho56azciA4s4HSJ0\\\").initAsyncChildMenu(require(\\\"m_0_26\\\"));\",],\n    id: \"pagelet_timeline_profile_actions\",\n    phase: 1\n});");
// 1792
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s78d34a342a9c2347cf56ff34ec7f40ed3a8bdb78");
// 1793
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_main_column_personal\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_timeline_profile_actions: {\n            container_id: \"u_0_18\"\n        }\n    },\n    jsmods: {\n        require: [[\"m_0_21\",],[\"m_0_22\",],[\"ButtonGroupMonitor\",],[\"SelectorDeprecated\",],[\"m_0_26\",],[\"SubscribeButton\",\"init\",[\"m_0_29\",\"m_0_28\",\"m_0_2a\",],[{\n            __m: \"m_0_29\"\n        },{\n            __m: \"m_0_28\"\n        },{\n            __m: \"m_0_2a\"\n        },\"1055580469\",0,false,],],[\"m_0_29\",],[\"m_0_2a\",],[\"m_0_2f\",],[\"m_0_2e\",],[\"AddFriendButton\",\"init\",[\"m_0_2i\",],[{\n            __m: \"m_0_2i\"\n        },1055580469,\"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby?sk=wall\",\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],],\n        instances: [[\"m_0_21\",[\"ButtonGroup\",\"m_0_23\",],[{\n            __m: \"m_0_23\"\n        },],1,],[\"m_0_22\",[\"ButtonGroup\",\"m_0_24\",],[{\n            __m: \"m_0_24\"\n        },],1,],[\"m_0_29\",[\"SwapButtonDEPRECATED\",\"m_0_28\",\"m_0_2b\",],[{\n            __m: \"m_0_28\"\n        },{\n            __m: \"m_0_2b\"\n        },false,],3,],[\"m_0_26\",[\"AsyncMenu\",\"m_0_27\",],[\"/ajax/lists/interests_submenu.php?profile_id=1055580469&list_location=gear_menu\",{\n            __m: \"m_0_27\"\n        },],2,],[\"m_0_2a\",[\"HoverButton\",\"m_0_2c\",\"m_0_2e\",\"m_0_2d\",],[{\n            __m: \"m_0_2c\"\n        },{\n            __m: \"m_0_2e\"\n        },{\n            __m: \"m_0_2d\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_2f\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_2g\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_2g\"\n        },],3,],[\"m_0_2e\",[\"HoverFlyout\",\"m_0_2f\",\"m_0_2h\",],[{\n            __m: \"m_0_2f\"\n        },{\n            __m: \"m_0_2h\"\n        },150,150,],3,],],\n        elements: [[\"m_0_2b\",\"u_0_13\",2,],[\"m_0_2i\",\"u_0_16\",2,],[\"m_0_2d\",\"u_0_14\",2,\"m_0_2g\",],[\"m_0_2c\",\"u_0_13\",2,],[\"m_0_24\",\"u_0_v\",2,],[\"m_0_2h\",\"u_0_13\",2,],[\"m_0_27\",\"u_0_11\",2,],[\"m_0_25\",\"u_0_w\",2,],[\"m_0_23\",\"u_0_u\",2,],[\"m_0_28\",\"u_0_12\",4,],],\n        markup: [[\"m_0_2g\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_14\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",],\n    bootloadable: {\n    },\n    resource_map: {\n        dShSX: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/JdjE3mVpxG6.js\"\n        }\n    },\n    js: [\"OH3xD\",\"/MWWQ\",\"AVmr9\",\"f7Tpb\",\"nxD7O\",\"4kgAq\",\"dShSX\",\"OYzUx\",\"cstCX\",],\n    jscc_map: \"({\\\"jo0ho56azciA4s4HSJ0\\\":function(){return new SubMenu()}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jo0ho56azciA4s4HSJ0\\\").init($(\\\"u_0_x\\\"), $(\\\"u_0_y\\\"), $(\\\"u_0_z\\\"), $(\\\"u_0_10\\\"));\",\"JSCC.get(\\\"jo0ho56azciA4s4HSJ0\\\").initAsyncChildMenu(require(\\\"m_0_26\\\"));\",],\n    id: \"pagelet_timeline_profile_actions\",\n    phase: 1\n});");
// 1887
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_recent: {\n            container_id: \"u_0_1b\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"removeSection\",[],[\"month_1969_12\",],],[\"TimelineLogging\",\"init\",[],[1055580469,],],[\"TimelineContentLoader\",\"enableScrollLoadOnClick\",[],[\"u_0_1a_scroll_trigger\",\"recent\",250,],],[\"TimelineController\",],[\"Arbiter\",\"inform\",[],[\"TimelineConstants/sectionLoaded\",{\n            key: \"recent\"\n        },],],[\"TimelineStickyRightColumn\",\"init\",[],[],],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",\"veUjj\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",\"XH2Cu\",\"gyG67\",\"e0RyX\",],\n    id: \"pagelet_timeline_recent\",\n    phase: 2\n});");
// 1888
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sd8f699c4f754512173acbd65c7f27fe4c934c6a1");
// 1889
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_recent: {\n            container_id: \"u_0_1b\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"removeSection\",[],[\"month_1969_12\",],],[\"TimelineLogging\",\"init\",[],[1055580469,],],[\"TimelineContentLoader\",\"enableScrollLoadOnClick\",[],[\"u_0_1a_scroll_trigger\",\"recent\",250,],],[\"TimelineController\",],[\"Arbiter\",\"inform\",[],[\"TimelineConstants/sectionLoaded\",{\n            key: \"recent\"\n        },],],[\"TimelineStickyRightColumn\",\"init\",[],[],],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",\"veUjj\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",\"XH2Cu\",\"gyG67\",\"e0RyX\",],\n    id: \"pagelet_timeline_recent\",\n    phase: 2\n});");
// 1938
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_19_left\",\n    display_dependency: [\"pagelet_timeline_recent\",],\n    content: {\n        pagelet_timeline_composer: \"\"\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_timeline_composer\",\n    phase: 2\n});");
// 1939
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sedd38a224adc2a34a06d3ad5629cd6d487167cfa");
// 1940
geval("bigPipe.onPageletArrive({\n    append: \"u_0_19_left\",\n    display_dependency: [\"pagelet_timeline_recent\",],\n    JSBNG__content: {\n        pagelet_timeline_composer: \"\"\n    },\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"pagelet_timeline_composer\",\n    phase: 2\n});");
// 1970
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_19_left\",\n    display_dependency: [\"pagelet_timeline_recent\",\"pagelet_timeline_composer\",],\n    is_last: true,\n    content: {\n        pagelet_timeline_recent_segment_0_0_left: {\n            container_id: \"u_0_20\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_19\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],[\"m_0_2j\",],[\"m_0_2l\",],[\"m_0_2m\",],[\"m_0_2o\",],[\"m_0_2q\",],[\"m_0_2r\",],[\"m_0_2t\",],[\"m_0_2v\",],[\"m_0_2w\",],[\"m_0_2y\",],[\"m_0_30\",],[\"m_0_31\",],[\"Hovercard\",],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1o\",\"10200343222477260\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_33\",],[{\n            __m: \"m_0_33\"\n        },{\n            targetID: \"10200343222477260\"\n        },\"b1113c18\",],],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1p\",\"10200350995551582\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_34\",],[{\n            __m: \"m_0_34\"\n        },{\n            targetID: \"10200350995551582\"\n        },\"b1113c18\",],],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1q\",\"10200407437602598\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_35\",],[{\n            __m: \"m_0_35\"\n        },{\n            targetID: \"10200407437602598\"\n        },\"b1113c18\",],],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1r\",\"10200453104264236\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_36\",],[{\n            __m: \"m_0_36\"\n        },{\n            targetID: \"10200453104264236\"\n        },\"b1113c18\",],],[\"m_0_3c\",],[\"Tooltip\",],[\"m_0_3f\",],[\"m_0_3i\",],[\"m_0_3l\",],],\n        instances: [[\"m_0_3j\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_2j\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_3f\",[\"UFIController\",\"m_0_3e\",\"m_0_3g\",],[{\n            __m: \"m_0_3e\"\n        },{\n            ftentidentifier: \"10200350995551582\",\n            instanceid: \"u_0_1u\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQAlgopmGq0ZHy3R2kG5GCpd5xIfDZrje41Cn5hx-UlsHHRAwheTYxSzlwYwMpREMCS1JzMspOsjwHMvtkLT5mevdKJ5cVCAvAuX27rrKowEqOkMfTMLZUPN1rAxw6MGGS4mPIFncGunb2x4Zvciyb1ByglygI1yMRvuoa0v4NOWz9oh4WDi2m6Yy88oHchGKfGyFif0A5kPret2iWpsleSHzYdahUXoAaZMKVWrob8i3juFAvTKWa-tKVBuqqiY5_tJc35Sx0baaluOD2TWxJk6gE6A0q-OqdD3ula2NuhAZsxRB372jbu-OT-yYpSXLZvKCLeWcqezaITd_2k9ZLyRDI2-ZyHmhsluREWOeZsnozHStiTfaGOkH_uKR5zOCvqJMygffpWg7KXJ8QMncKZt\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200350995551582\",\n                entidentifier: \"10200350995551582\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200350995551582\",\n                commentcount: 5,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Jan Vitek likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Jan Vitek like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3g\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200350995551582_4954379\",\n                fbid: \"10200357365790834\",\n                legacyid: \"4954379\",\n                body: {\n                    text: \"You should have snatched it out of his hands, and played it/\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1710926078\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373168110,\n                    text: \"July 6 at 8:35pm\",\n                    verbose: \"Saturday, July 6, 2013 at 8:35pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955913\",\n                fbid: \"10200359402281745\",\n                legacyid: \"4955913\",\n                body: {\n                    text: \"I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214256,\n                    text: \"July 7 at 9:24am\",\n                    verbose: \"Sunday, July 7, 2013 at 9:24am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955915\",\n                fbid: \"10200359408281895\",\n                legacyid: \"4955915\",\n                body: {\n                    text: \"But in English-speaking countries it's just fine.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"10715287\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214355,\n                    text: \"July 7 at 9:25am\",\n                    verbose: \"Sunday, July 7, 2013 at 9:25am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955918\",\n                fbid: \"10200359410801958\",\n                legacyid: \"4955918\",\n                body: {\n                    text: \"Naturally.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214375,\n                    text: \"July 7 at 9:26am\",\n                    verbose: \"Sunday, July 7, 2013 at 9:26am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1710926078\",\n                name: \"Kathy Wertheimer Richards\",\n                firstName: \"Kathy\",\n                vanity: \"kathy.w.richards\",\n                thumbSrc: \"http://jsbngssl.profile-a-iad.xx.fbcdn.net/hprofile-prn2/s32x32/276006_1710926078_512651488_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/kathy.w.richards\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"10715287\",\n                name: \"Michael A Goss\",\n                firstName: \"Michael\",\n                vanity: \"michael.a.goss\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/186115_10715287_1845932200_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/michael.a.goss\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200350995551582: {\n                        chronological: {\n                            range: {\n                                offset: 1,\n                                length: 4\n                            },\n                            values: [\"10200350995551582_4954379\",\"10200350995551582_4955913\",\"10200350995551582_4955915\",\"10200350995551582_4955918\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200350995551582_4954379\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955913\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955915\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955918\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_3c\",[\"UFIController\",\"m_0_3b\",\"m_0_3d\",],[{\n            __m: \"m_0_3b\"\n        },{\n            ftentidentifier: \"10200453104264236\",\n            instanceid: \"u_0_1s\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQBNptZHHmcHSBHH338FbJIldzhdcVkA422y6Sejlj24O_ESfCpT1dhcH8BotHbB73c3HUp4765d0qfNUgarP7Vf2rTTbV5euFgCJSt9-8B4i86TjWur6gJ3K29twN6V9lo7fU3rQepgiuZt5KILXg7MqgN_w213GHwJL6FGgcWbUZlVBhXGuoklz4varOFzrDvH_-rITQWylbk82zJBzOEix9PGZ6QnysZWTe0NbHgtmvvEgOVVTF_JPYYKjGJasYG-JYrNmL-tbERXVcwbZ5iFNz9l0M26pG6TZqE6wNK0_l10ScDeVnFbXwhuV6wk73AHZ58nAtgqevhrI3rGzBuPUx02KACTcf1ScQRa2UwIeybAIzG6SY3-kSka4I-DhWD1-EPGDFc5Ff7eeuTE6lPB\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200453104264236\",\n                entidentifier: \"10200453104264236\",\n                permalink: \"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&set=a.1138433375108.2021456.1055580469&type=1\",\n                commentcount: 8,\n                likecount: 0,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                    },\n                    alternate: {\n                        text: \"You like this.\",\n                        ranges: [],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3d\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: true,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200453104264236_3195897\",\n                fbid: \"10200453144105232\",\n                legacyid: \"3195897\",\n                body: {\n                    text: \"When you add a hat it removes the long hair \\u003E_\\u003C\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374637972,\n                    text: \"Tuesday at 8:52pm\",\n                    verbose: \"Tuesday, July 23, 2013 at 8:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200453104264236_3195898\",\n                fbid: \"10200453146945303\",\n                legacyid: \"3195898\",\n                body: {\n                    text: \"so.. the hair is a hat?  steam's not down with hats on hats?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"8300496\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374638034,\n                    text: \"Tuesday at 8:53pm\",\n                    verbose: \"Tuesday, July 23, 2013 at 8:53pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200453104264236_3195907\",\n                fbid: \"10200453153145458\",\n                legacyid: \"3195907\",\n                body: {\n                    text: \"(This is Saints Row the Third, so can't really blame Steam)\\u000a\\u000aNo, hats are a separate customization option, but it wouldn't let you combine long hair with the hat. It's like he stuffed all the hair into his hat.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374638180,\n                    text: \"Tuesday at 8:56pm\",\n                    verbose: \"Tuesday, July 23, 2013 at 8:56pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200453104264236_3198160\",\n                fbid: \"10200459439942624\",\n                legacyid: \"3198160\",\n                body: {\n                    text: \"You finally tried Saints Row the Third? :)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374733044,\n                    text: \"Wednesday at 11:17pm\",\n                    verbose: \"Wednesday, July 24, 2013 at 11:17pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"100006118350059\",\n                name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"8300496\",\n                name: \"Philip Ritchey\",\n                firstName: \"Philip\",\n                vanity: \"philipritchey\",\n                thumbSrc: \"http://jsbngssl.profile-a-iad.xx.fbcdn.net/hprofile-prn1/s32x32/41769_8300496_5612_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/philipritchey\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1633181753\",\n                name: \"Robert Nesius\",\n                firstName: \"Robert\",\n                vanity: \"rnesius\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/573766_1633181753_1114062672_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/rnesius\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200453104264236: {\n                        chronological: {\n                            range: {\n                                offset: 4,\n                                length: 4\n                            },\n                            values: [\"10200453104264236_3195897\",\"10200453104264236_3195898\",\"10200453104264236_3195907\",\"10200453104264236_3198160\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200453104264236_3195897\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    },\n                    \"10200453104264236_3195898\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    },\n                    \"10200453104264236_3195907\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    },\n                    \"10200453104264236_3198160\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_3i\",[\"UFIController\",\"m_0_3h\",\"m_0_3j\",],[{\n            __m: \"m_0_3h\"\n        },{\n            ftentidentifier: \"10200407437602598\",\n            instanceid: \"u_0_1w\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQDQFbb-noUffn08-wYWq3sqYkrBn6PemZTva6mbp5t66h4yjEavOAYdkUoacT9VWRl0uDEW7vDbks_tWcJUANE75miHVSFsRLzVp0z6QRS8A-6U-bxgPk4MluQZyAw547yznIXQx6K5k79h3Q5XWXZCoLRpUsMobuUIt5V7QrU3wrLvqhL5bMnzwHbz3QzSYT6d5SwYbBLB-UDRNhNwiVw-SMynyyl0eYXm5Sh70OjHuBFTR0b0dpGqqRbsfSmcbiDTCwszsk-U82fECniRaqHQxpG7Kl5ystDd2c73YJ7j85bFpA6-N8fT1jM32e0sJM7oSj21k3xAu4cp7omIf5ObzedtL5uoB9-D2VKTHaFWRhDg-CzF1cwJDRSRPvlhZ5sWyw1hjgpeB2bGwZymew_x\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200407437602598\",\n                entidentifier: \"10200407437602598\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200407437602598\",\n                commentcount: 13,\n                likecount: 4,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"4 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 4\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 4 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 4\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3j\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200407437602598_4992459\",\n                fbid: \"10200412564730773\",\n                legacyid: \"4992459\",\n                body: {\n                    text: \"You are the antithesis of what my husband has been writing his dissertation about.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"42000540\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: 1,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374039953,\n                    text: \"July 16 at 10:45pm\",\n                    verbose: \"Tuesday, July 16, 2013 at 10:45pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200407437602598_4992465\",\n                fbid: \"10200412568530868\",\n                legacyid: \"4992465\",\n                body: {\n                    text: \"Harry: I'm turning 27, not 4\\u00bd...\\u000a\\u000aChrissi: Oh?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374040107,\n                    text: \"July 16 at 10:48pm\",\n                    verbose: \"Tuesday, July 16, 2013 at 10:48pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200407437602598_4992473\",\n                fbid: \"10200412578931128\",\n                legacyid: \"4992473\",\n                body: {\n                    text: \"irony vs satire/sarcasm, pragmatism, william james type stuff\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"42000540\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: 1,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374040490,\n                    text: \"July 16 at 10:54pm\",\n                    verbose: \"Tuesday, July 16, 2013 at 10:54pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200407437602598_4996311\",\n                fbid: \"10200417729139880\",\n                legacyid: \"4996311\",\n                body: {\n                    text: \":)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1729068700\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: 1,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374119198,\n                    text: \"July 17 at 8:46pm\",\n                    verbose: \"Wednesday, July 17, 2013 at 8:46pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"42000540\",\n                name: \"Chrissi Keith\",\n                firstName: \"Chrissi\",\n                vanity: \"taskmasterkeith\",\n                thumbSrc: \"http://jsbngssl.profile-b-iad.xx.fbcdn.net/hprofile-ash4/s32x32/276211_42000540_1185711920_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/taskmasterkeith\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1729068700\",\n                name: \"Donna Rubens Renhard\",\n                firstName: \"Donna\",\n                vanity: \"donna.rubensrenhard\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/187733_1729068700_888004086_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/donna.rubensrenhard\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200407437602598: {\n                        chronological: {\n                            range: {\n                                offset: 9,\n                                length: 4\n                            },\n                            values: [\"10200407437602598_4992459\",\"10200407437602598_4992465\",\"10200407437602598_4992473\",\"10200407437602598_4996311\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200407437602598_4992459\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    },\n                    \"10200407437602598_4992465\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    },\n                    \"10200407437602598_4992473\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    },\n                    \"10200407437602598_4996311\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_31\",[\"Popover\",\"m_0_32\",\"m_0_2z\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_32\"\n        },{\n            __m: \"m_0_2z\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_3m\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_2v\",[\"PopoverAsyncMenu\",\"m_0_2w\",\"m_0_2u\",\"m_0_2t\",],[{\n            __m: \"m_0_2w\"\n        },{\n            __m: \"m_0_2u\"\n        },{\n            __m: \"m_0_2t\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=5791137008599102559&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373991800&unit_data%5Bunit_end_time%5D=1373991800&dom_id=u_0_1i&timestamp=1373991800&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],[\"m_0_2r\",[\"Popover\",\"m_0_2s\",\"m_0_2p\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_2s\"\n        },{\n            __m: \"m_0_2p\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_3g\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_3n\",[\"XHPTemplate\",\"m_0_3o\",],[{\n            __m: \"m_0_3o\"\n        },],2,],[\"m_0_2o\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_3d\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\",\n                photo_fbid: \"10200453104264236\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_2q\",[\"PopoverAsyncMenu\",\"m_0_2r\",\"m_0_2p\",\"m_0_2o\",],[{\n            __m: \"m_0_2r\"\n        },{\n            __m: \"m_0_2p\"\n        },{\n            __m: \"m_0_2o\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=2953496614934485437&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373055341&unit_data%5Bunit_end_time%5D=1373055341&dom_id=u_0_1f&timestamp=1373055341&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],[\"m_0_2t\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_30\",[\"PopoverAsyncMenu\",\"m_0_31\",\"m_0_2z\",\"m_0_2y\",],[{\n            __m: \"m_0_31\"\n        },{\n            __m: \"m_0_2z\"\n        },{\n            __m: \"m_0_2y\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=69&unit_data%5Bhash%5D=1267290328123522761&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1374637162&unit_data%5Bunit_end_time%5D=1374637162&dom_id=u_0_1l&timestamp=1374637162&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],[\"m_0_2y\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2m\",[\"Popover\",\"m_0_2n\",\"m_0_2k\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2k\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_3l\",[\"UFIController\",\"m_0_3k\",\"m_0_3m\",],[{\n            __m: \"m_0_3k\"\n        },{\n            ftentidentifier: \"10200343222477260\",\n            instanceid: \"u_0_1y\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQAr9lR2vZdldJ-VKsQo7OWaxXGctSzumkX_OWY9tMv34KoO2FztCqmqb8QBDYnKVWW99VqdbOskntjWhjy7W_MUFXYbmHi4oEJJ321uNu0XUYOzGWm_7u7pnY0zKn9thJ5ghe3h9Y4OukyraP07GphpWlsRiSVa_A-1EMIWIdeKmf-CJmEKmfCxEsM18xb2jjadO65ng8zpr6Dn3Z4o7hjV6OmtF3SCq3PgmXDdmdeFwvX8OgXFZncq4jrAd-dd1qH-0sddZKJuEM2b9WV5eyh_PipSNsi3uC6SpYHby30MLarSM5sgjVZxzOxLhdYkWGiF5kRqMgD0DZdRN5FoDtL6gTy--Mt8pP_wYiB8kl7IExZc3NIFNruO-xiWNXHnSp7mFJ4K4onngXPGTiY4s_d4\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200343222477260\",\n                entidentifier: \"10200343222477260\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200343222477260\",\n                commentcount: 11,\n                likecount: 7,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"7 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 7\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 7 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 7\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3m\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200343222477260_4946958\",\n                fbid: \"10200346777686138\",\n                legacyid: \"4946958\",\n                body: {\n                    text: \"Does it have a sense of the surreal or are you just sharing a data point? ;)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372985540,\n                    text: \"July 4 at 5:52pm\",\n                    verbose: \"Thursday, July 4, 2013 at 5:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4947623\",\n                fbid: \"10200347758230651\",\n                legacyid: \"4947623\",\n                body: {\n                    text: \"Merely minor amusement.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373002430,\n                    text: \"July 4 at 10:33pm\",\n                    verbose: \"Thursday, July 4, 2013 at 10:33pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950566\",\n                fbid: \"10200351838652659\",\n                legacyid: \"4950566\",\n                body: {\n                    text: \"Did you wear http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                    ranges: [{\n                        offset: 13,\n                        length: 68,\n                        entities: [{\n                            url: \"http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                            shimhash: \"zAQGz2cVu\",\n                            id: \"0746af69b9da85d793efe61531abaafe\",\n                            external: true\n                        },]\n                    },],\n                    aggregatedranges: []\n                },\n                author: \"53600996\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066508,\n                    text: \"July 5 at 4:21pm\",\n                    verbose: \"Friday, July 5, 2013 at 4:21pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950571\",\n                fbid: \"10200351843052769\",\n                legacyid: \"4950571\",\n                body: {\n                    text: \"That's the most delightfully offensive piece of apparel I've seen in quite some time.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066594,\n                    text: \"July 5 at 4:23pm\",\n                    verbose: \"Friday, July 5, 2013 at 4:23pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"53600996\",\n                name: \"Harrison Metzger\",\n                firstName: \"Harrison\",\n                vanity: \"harrisonmetz\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/195694_53600996_1993816119_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/harrisonmetz\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200343222477260: {\n                        chronological: {\n                            range: {\n                                offset: 7,\n                                length: 4\n                            },\n                            values: [\"10200343222477260_4946958\",\"10200343222477260_4947623\",\"10200343222477260_4950566\",\"10200343222477260_4950571\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200343222477260_4946958\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4947623\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950566\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950571\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_2w\",[\"Popover\",\"m_0_2x\",\"m_0_2u\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_2x\"\n        },{\n            __m: \"m_0_2u\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2l\",[\"PopoverAsyncMenu\",\"m_0_2m\",\"m_0_2k\",\"m_0_2j\",],[{\n            __m: \"m_0_2m\"\n        },{\n            __m: \"m_0_2k\"\n        },{\n            __m: \"m_0_2j\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=4498726532280095426&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372923465&unit_data%5Bunit_end_time%5D=1372923465&dom_id=u_0_1c&timestamp=1372923465&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],],\n        define: [[\"CLogConfig\",[],{\n            gkResults: 1\n        },174,],[\"UFICommentTemplates\",[\"m_0_3n\",],{\n            \":fb:ufi:hide-dialog-template\": {\n                __m: \"m_0_3n\"\n            }\n        },70,],[\"UFISpamCountImpl\",[],{\n            \"module\": null\n        },72,],[\"UFIConfig\",[],{\n            renderEmoji: true,\n            renderEmoticons: 1\n        },71,],],\n        elements: [[\"m_0_34\",\"u_0_1p\",2,],[\"m_0_3b\",\"u_0_1t\",2,],[\"m_0_2x\",\"u_0_1j\",2,],[\"m_0_36\",\"u_0_1r\",2,],[\"m_0_2s\",\"u_0_1g\",2,],[\"m_0_2k\",\"u_0_1e\",4,],[\"m_0_32\",\"u_0_1m\",2,],[\"m_0_33\",\"u_0_1o\",2,],[\"m_0_39\",\"u_0_1q\",2,],[\"m_0_3e\",\"u_0_1v\",2,],[\"m_0_35\",\"u_0_1q\",2,],[\"m_0_38\",\"u_0_1p\",2,],[\"m_0_3h\",\"u_0_1x\",2,],[\"m_0_3k\",\"u_0_1z\",2,],[\"m_0_3a\",\"u_0_1r\",2,],[\"m_0_37\",\"u_0_1o\",2,],[\"m_0_2z\",\"u_0_1n\",4,],[\"m_0_2p\",\"u_0_1h\",4,],[\"m_0_2u\",\"u_0_1k\",4,],[\"m_0_2n\",\"u_0_1d\",2,],],\n        markup: [[\"m_0_3o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"pvs phm -cx-PUBLIC-uiDialog__title\\\" data-jsid=\\\"title\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pam -cx-PRIVATE-uiDialog__body\\\" data-jsid=\\\"body\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiDialog__footer\\\"\\u003E\\u003Cdiv class=\\\"pam uiOverlayFooter uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerConfirm uiOverlayButton selected -cx-PRIVATE-uiButton__confirm -cx-PRIVATE-uiButton__large\\\" data-jsid=\\\"delete\\\" type=\\\"submit\\\"\\u003EDelete\\u003C/button\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerCancel uiOverlayButton -cx-PRIVATE-uiButton__large\\\" role=\\\"button\\\" href=\\\"#\\\"\\u003ECancel\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",\"tAd6o\",],\n    bootloadable: {\n        TypeaheadHoistFriends: {\n            resources: [\"OFYQ5\",],\n            \"module\": true\n        },\n        \"UFIEntStreamOrderingModeSelector.react\": {\n            resources: [\"OH3xD\",\"XH2Cu\",\"UmFO+\",\"ociRJ\",\"/MWWQ\",\"f7Tpb\",\"AVmr9\",\"OYzUx\",\"veUjj\",\"dShSX\",\"HgCpx\",\"0q2Dj\",\"QZ9ii\",\"aG0Oj\",\"iAvmX\",\"TXKLp\",\"kcpXP\",],\n            \"module\": true\n        },\n        InputSelection: {\n            resources: [\"OH3xD\",\"UmFO+\",\"f7Tpb\",],\n            \"module\": true\n        },\n        FileInputUploader: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"TXKLp\",\"4/uwC\",\"7w6kA\",],\n            \"module\": true\n        },\n        DialogX: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"XH2Cu\",],\n            \"module\": true\n        },\n        ContextualTypeaheadView: {\n            resources: [\"OH3xD\",\"veUjj\",\"/MWWQ\",\"UmFO+\",\"f7Tpb\",\"AVmr9\",],\n            \"module\": true\n        },\n        TypeaheadBestName: {\n            resources: [\"XH2Cu\",\"/MWWQ\",],\n            \"module\": true\n        },\n        TypeaheadMetrics: {\n            resources: [\"OH3xD\",\"OFYQ5\",],\n            \"module\": true\n        },\n        MentionsInput: {\n            resources: [\"OH3xD\",\"UmFO+\",\"f7Tpb\",\"OFYQ5\",\"XH2Cu\",\"AVmr9\",\"veUjj\",],\n            \"module\": true\n        },\n        TypingDetector: {\n            resources: [\"OH3xD\",\"OSd/n\",],\n            \"module\": true\n        },\n        TypeaheadAreaCore: {\n            resources: [\"OH3xD\",\"UmFO+\",\"f7Tpb\",\"/MWWQ\",\"OFYQ5\",],\n            \"module\": true\n        },\n        EntstreamPubContentOverlay: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"veUjj\",\"ociRJ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"SZ74q\",\"gJ7+m\",\"/MWWQ\",\"TXKLp\",\"za92D\",\"kcpXP\",\"js0se\",\"m5aEV\",],\n            \"module\": true\n        },\n        CompactTypeaheadRenderer: {\n            resources: [\"OH3xD\",\"veUjj\",\"/MWWQ\",],\n            \"module\": true\n        },\n        ScrollAwareDOM: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",],\n            \"module\": true\n        },\n        \"legacy:live-js\": {\n            resources: [\"OH3xD\",\"WLpRY\",\"XH2Cu\",]\n        },\n        collectDataAttributes: {\n            resources: [\"OH3xD\",],\n            \"module\": true\n        },\n        UFIScrollHighlight: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"5iOnb\",\"rSdpp\",],\n            \"module\": true\n        },\n        UFIComments: {\n            resources: [\"XH2Cu\",\"ociRJ\",\"OH3xD\",],\n            \"module\": true\n        },\n        UFIRetryActions: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"8ay4F\",],\n            \"module\": true\n        },\n        LegacyMenuUtils: {\n            resources: [\"OH3xD\",\"OYzUx\",\"f7Tpb\",\"/MWWQ\",\"AVmr9\",\"veUjj\",\"XH2Cu\",\"0q2Dj\",\"UmFO+\",\"BRnsj\",],\n            \"module\": true\n        },\n        HashtagLayerPageController: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"veUjj\",\"ociRJ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"SZ74q\",\"IxyKh\",\"9epYo\",\"Vczhe\",\"/MWWQ\",\"gJ7+m\",\"BBKr2\",\"MuiPI\",\"AMFDz\",\"qRGqD\",],\n            \"module\": true\n        },\n        \"legacy:ufi-tracking-js\": {\n            resources: [\"WLpRY\",]\n        },\n        CLoggerX: {\n            resources: [\"OH3xD\",\"ociRJ\",],\n            \"module\": true\n        },\n        \"UFICommentRemovalControls.react\": {\n            resources: [\"XH2Cu\",\"OH3xD\",\"veUjj\",\"OZCPo\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",],\n            \"module\": true\n        },\n        ScrollableArea: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"/MWWQ\",\"AVmr9\",\"veUjj\",],\n            \"module\": true\n        },\n        HashtagParser: {\n            resources: [\"OSd/n\",\"+P3v8\",],\n            \"module\": true\n        },\n        TextAreaControl: {\n            resources: [\"OH3xD\",\"4/uwC\",\"veUjj\",],\n            \"module\": true\n        },\n        LegacyContextualDialog: {\n            resources: [\"OH3xD\",\"/MWWQ\",\"bmJBG\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"veUjj\",],\n            \"module\": true\n        },\n        Typeahead: {\n            resources: [\"f7Tpb\",\"OH3xD\",\"veUjj\",\"/MWWQ\",],\n            \"module\": true\n        },\n        Hovercard: {\n            resources: [\"OH3xD\",\"UmFO+\",\"/MWWQ\",\"AVmr9\",\"f7Tpb\",],\n            \"module\": true\n        },\n        FileInput: {\n            resources: [\"OH3xD\",\"AVmr9\",\"UmFO+\",\"veUjj\",],\n            \"module\": true\n        },\n        \"UFIOrderingModeSelector.react\": {\n            resources: [\"OH3xD\",\"XH2Cu\",\"UmFO+\",\"ociRJ\",\"OYzUx\",\"f7Tpb\",\"/MWWQ\",\"AVmr9\",\"veUjj\",\"dShSX\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        kcpXP: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/F1V9PnKbxuN.js\"\n        },\n        SZ74q: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/2TiFHJIlpz4.css\"\n        },\n        ywV7J: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/wyUJpAs1Jud.js\"\n        },\n        \"7w6kA\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/P5ro3SB0fYh.js\"\n        },\n        rSdpp: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yc/r/2PkTFjdVPzc.js\"\n        },\n        BRnsj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/Zl5MQqq69ii.js\"\n        },\n        qRGqD: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/0zNvPsl4_Iy.js\"\n        },\n        \"0q2Dj\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/6AN8Ic-0Y1P.js\"\n        },\n        IxyKh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/7f-bDgHTzcK.js\"\n        },\n        BBKr2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/2RUWo8vhW3Y.js\"\n        },\n        HgCpx: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/b9CwnSvNFr4.css\"\n        },\n        Vczhe: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yx/r/PNcm9agI5Po.js\"\n        },\n        \"8ay4F\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/VrfxLTcinh0.js\"\n        },\n        m5aEV: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/yfRGukr04iK.css\"\n        },\n        OZCPo: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/wHB0tbxOz8q.js\"\n        },\n        aG0Oj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/56drIuXqn1s.js\"\n        },\n        MuiPI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/7aLu6r05bf7.js\"\n        },\n        \"9epYo\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/cgIp7Mxhz_d.css\"\n        },\n        bmJBG: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yK/r/RErt59oF4EQ.js\"\n        },\n        QZ9ii: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/BdtVXmiio69.css\"\n        },\n        OFYQ5: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/EKMXXey106d.js\"\n        },\n        iAvmX: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/-UKFu9u490q.css\"\n        },\n        \"gJ7+m\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/YaDMduhjA8v.js\"\n        },\n        \"5iOnb\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/MjMy0el_azO.js\"\n        },\n        AMFDz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/l0jEiYB1BY4.js\"\n        }\n    },\n    ixData: {\n        \"/images/group_gifts/icons/gift_icon_red-13px.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_b82a0c\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"nxD7O\",\"xfhln\",\"XH2Cu\",\"gyG67\",\"/MWWQ\",\"e0RyX\",\"OYzUx\",\"ywV7J\",\"ociRJ\",],\n    displayJS: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",],\n    onafterload: [\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:ufi-tracking-js\\\"], function(){ ufi_add_all_link_data(); });\",],\n    id: \"pagelet_timeline_recent_segment_0_0_left\",\n    phase: 2,\n    tti_phase: 2\n});");
// 1971
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s1cb959dc28fffd55354a9c777050c7daa28cd8e9");
// 1972
geval("bigPipe.onPageletArrive({\n    append: \"u_0_19_left\",\n    display_dependency: [\"pagelet_timeline_recent\",\"pagelet_timeline_composer\",],\n    is_last: true,\n    JSBNG__content: {\n        pagelet_timeline_recent_segment_0_0_left: {\n            container_id: \"u_0_20\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_19\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],[\"m_0_2j\",],[\"m_0_2l\",],[\"m_0_2m\",],[\"m_0_2o\",],[\"m_0_2q\",],[\"m_0_2r\",],[\"m_0_2t\",],[\"m_0_2v\",],[\"m_0_2w\",],[\"m_0_2y\",],[\"m_0_30\",],[\"m_0_31\",],[\"Hovercard\",],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1o\",\"10200343222477260\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_33\",],[{\n            __m: \"m_0_33\"\n        },{\n            targetID: \"10200343222477260\"\n        },\"b1113c18\",],],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1p\",\"10200350995551582\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_34\",],[{\n            __m: \"m_0_34\"\n        },{\n            targetID: \"10200350995551582\"\n        },\"b1113c18\",],],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1q\",\"10200407437602598\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_35\",],[{\n            __m: \"m_0_35\"\n        },{\n            targetID: \"10200407437602598\"\n        },\"b1113c18\",],],[\"CensorLogger\",\"registerForm\",[],[\"u_0_1r\",\"10200453104264236\",],],[\"CLoggerX\",\"trackFeedbackForm\",[\"m_0_36\",],[{\n            __m: \"m_0_36\"\n        },{\n            targetID: \"10200453104264236\"\n        },\"b1113c18\",],],[\"m_0_3c\",],[\"Tooltip\",],[\"m_0_3f\",],[\"m_0_3i\",],[\"m_0_3l\",],],\n        instances: [[\"m_0_3j\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_2j\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_3f\",[\"UFIController\",\"m_0_3e\",\"m_0_3g\",],[{\n            __m: \"m_0_3e\"\n        },{\n            ftentidentifier: \"10200350995551582\",\n            instanceid: \"u_0_1u\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQAlgopmGq0ZHy3R2kG5GCpd5xIfDZrje41Cn5hx-UlsHHRAwheTYxSzlwYwMpREMCS1JzMspOsjwHMvtkLT5mevdKJ5cVCAvAuX27rrKowEqOkMfTMLZUPN1rAxw6MGGS4mPIFncGunb2x4Zvciyb1ByglygI1yMRvuoa0v4NOWz9oh4WDi2m6Yy88oHchGKfGyFif0A5kPret2iWpsleSHzYdahUXoAaZMKVWrob8i3juFAvTKWa-tKVBuqqiY5_tJc35Sx0baaluOD2TWxJk6gE6A0q-OqdD3ula2NuhAZsxRB372jbu-OT-yYpSXLZvKCLeWcqezaITd_2k9ZLyRDI2-ZyHmhsluREWOeZsnozHStiTfaGOkH_uKR5zOCvqJMygffpWg7KXJ8QMncKZt\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200350995551582\",\n                entidentifier: \"10200350995551582\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200350995551582\",\n                commentcount: 5,\n                likecount: 1,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"Jan Vitek likes this.\",\n                        ranges: [{\n                            offset: 0,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    },\n                    alternate: {\n                        text: \"You and Jan Vitek like this.\",\n                        ranges: [{\n                            offset: 8,\n                            length: 9,\n                            entities: [{\n                                url: \"http://jsbngssl.www.facebook.com/jvitekjr\",\n                                id: 719575350\n                            },]\n                        },],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3g\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200350995551582_4954379\",\n                fbid: \"10200357365790834\",\n                legacyid: \"4954379\",\n                body: {\n                    text: \"You should have snatched it out of his hands, and played it/\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1710926078\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373168110,\n                    text: \"July 6 at 8:35pm\",\n                    verbose: \"Saturday, July 6, 2013 at 8:35pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955913\",\n                fbid: \"10200359402281745\",\n                legacyid: \"4955913\",\n                body: {\n                    text: \"I've found that stealing musical instruments in non-English-speaking countries hasn't brought me great luck in the past.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214256,\n                    text: \"July 7 at 9:24am\",\n                    verbose: \"Sunday, July 7, 2013 at 9:24am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955915\",\n                fbid: \"10200359408281895\",\n                legacyid: \"4955915\",\n                body: {\n                    text: \"But in English-speaking countries it's just fine.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"10715287\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214355,\n                    text: \"July 7 at 9:25am\",\n                    verbose: \"Sunday, July 7, 2013 at 9:25am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200350995551582_4955918\",\n                fbid: \"10200359410801958\",\n                legacyid: \"4955918\",\n                body: {\n                    text: \"Naturally.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200350995551582\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373214375,\n                    text: \"July 7 at 9:26am\",\n                    verbose: \"Sunday, July 7, 2013 at 9:26am\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"1710926078\",\n                JSBNG__name: \"Kathy Wertheimer Richards\",\n                firstName: \"Kathy\",\n                vanity: \"kathy.w.richards\",\n                thumbSrc: \"http://jsbngssl.profile-a-iad.xx.fbcdn.net/hprofile-prn2/s32x32/276006_1710926078_512651488_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/kathy.w.richards\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                JSBNG__name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"10715287\",\n                JSBNG__name: \"Michael A Goss\",\n                firstName: \"Michael\",\n                vanity: \"michael.a.goss\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/186115_10715287_1845932200_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/michael.a.goss\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200350995551582: {\n                        chronological: {\n                            range: {\n                                offset: 1,\n                                length: 4\n                            },\n                            values: [\"10200350995551582_4954379\",\"10200350995551582_4955913\",\"10200350995551582_4955915\",\"10200350995551582_4955918\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200350995551582_4954379\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955913\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955915\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    },\n                    \"10200350995551582_4955918\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200350995551582\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_3c\",[\"UFIController\",\"m_0_3b\",\"m_0_3d\",],[{\n            __m: \"m_0_3b\"\n        },{\n            ftentidentifier: \"10200453104264236\",\n            instanceid: \"u_0_1s\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQBNptZHHmcHSBHH338FbJIldzhdcVkA422y6Sejlj24O_ESfCpT1dhcH8BotHbB73c3HUp4765d0qfNUgarP7Vf2rTTbV5euFgCJSt9-8B4i86TjWur6gJ3K29twN6V9lo7fU3rQepgiuZt5KILXg7MqgN_w213GHwJL6FGgcWbUZlVBhXGuoklz4varOFzrDvH_-rITQWylbk82zJBzOEix9PGZ6QnysZWTe0NbHgtmvvEgOVVTF_JPYYKjGJasYG-JYrNmL-tbERXVcwbZ5iFNz9l0M26pG6TZqE6wNK0_l10ScDeVnFbXwhuV6wk73AHZ58nAtgqevhrI3rGzBuPUx02KACTcf1ScQRa2UwIeybAIzG6SY3-kSka4I-DhWD1-EPGDFc5Ff7eeuTE6lPB\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200453104264236\",\n                entidentifier: \"10200453104264236\",\n                permalink: \"http://jsbngssl.www.facebook.com/photo.php?fbid=10200453104264236&set=a.1138433375108.2021456.1055580469&type=1\",\n                commentcount: 8,\n                likecount: 0,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                    },\n                    alternate: {\n                        text: \"You like this.\",\n                        ranges: [],\n                        aggregatedranges: []\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3d\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: true,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200453104264236_3195897\",\n                fbid: \"10200453144105232\",\n                legacyid: \"3195897\",\n                body: {\n                    text: \"When you add a hat it removes the long hair \\u003E_\\u003C\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374637972,\n                    text: \"Tuesday at 8:52pm\",\n                    verbose: \"Tuesday, July 23, 2013 at 8:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200453104264236_3195898\",\n                fbid: \"10200453146945303\",\n                legacyid: \"3195898\",\n                body: {\n                    text: \"so.. the hair is a hat?  steam's not down with hats on hats?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"8300496\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374638034,\n                    text: \"Tuesday at 8:53pm\",\n                    verbose: \"Tuesday, July 23, 2013 at 8:53pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200453104264236_3195907\",\n                fbid: \"10200453153145458\",\n                legacyid: \"3195907\",\n                body: {\n                    text: \"(This is Saints Row the Third, so can't really blame Steam)\\u000a\\u000aNo, hats are a separate customization option, but it wouldn't let you combine long hair with the hat. It's like he stuffed all the hair into his hat.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374638180,\n                    text: \"Tuesday at 8:56pm\",\n                    verbose: \"Tuesday, July 23, 2013 at 8:56pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200453104264236_3198160\",\n                fbid: \"10200459439942624\",\n                legacyid: \"3198160\",\n                body: {\n                    text: \"You finally tried Saints Row the Third? :)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200453104264236\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374733044,\n                    text: \"Wednesday at 11:17pm\",\n                    verbose: \"Wednesday, July 24, 2013 at 11:17pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"100006118350059\",\n                JSBNG__name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                JSBNG__name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"8300496\",\n                JSBNG__name: \"Philip Ritchey\",\n                firstName: \"Philip\",\n                vanity: \"philipritchey\",\n                thumbSrc: \"http://jsbngssl.profile-a-iad.xx.fbcdn.net/hprofile-prn1/s32x32/41769_8300496_5612_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/philipritchey\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1633181753\",\n                JSBNG__name: \"Robert Nesius\",\n                firstName: \"Robert\",\n                vanity: \"rnesius\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/s32x32/573766_1633181753_1114062672_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/rnesius\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200453104264236: {\n                        chronological: {\n                            range: {\n                                offset: 4,\n                                length: 4\n                            },\n                            values: [\"10200453104264236_3195897\",\"10200453104264236_3195898\",\"10200453104264236_3195907\",\"10200453104264236_3198160\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200453104264236_3195897\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    },\n                    \"10200453104264236_3195898\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    },\n                    \"10200453104264236_3195907\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    },\n                    \"10200453104264236_3198160\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200453104264236\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_3i\",[\"UFIController\",\"m_0_3h\",\"m_0_3j\",],[{\n            __m: \"m_0_3h\"\n        },{\n            ftentidentifier: \"10200407437602598\",\n            instanceid: \"u_0_1w\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQDQFbb-noUffn08-wYWq3sqYkrBn6PemZTva6mbp5t66h4yjEavOAYdkUoacT9VWRl0uDEW7vDbks_tWcJUANE75miHVSFsRLzVp0z6QRS8A-6U-bxgPk4MluQZyAw547yznIXQx6K5k79h3Q5XWXZCoLRpUsMobuUIt5V7QrU3wrLvqhL5bMnzwHbz3QzSYT6d5SwYbBLB-UDRNhNwiVw-SMynyyl0eYXm5Sh70OjHuBFTR0b0dpGqqRbsfSmcbiDTCwszsk-U82fECniRaqHQxpG7Kl5ystDd2c73YJ7j85bFpA6-N8fT1jM32e0sJM7oSj21k3xAu4cp7omIf5ObzedtL5uoB9-D2VKTHaFWRhDg-CzF1cwJDRSRPvlhZ5sWyw1hjgpeB2bGwZymew_x\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200407437602598\",\n                entidentifier: \"10200407437602598\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200407437602598\",\n                commentcount: 13,\n                likecount: 4,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"4 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 4\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 4 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 4\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3j\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200407437602598_4992459\",\n                fbid: \"10200412564730773\",\n                legacyid: \"4992459\",\n                body: {\n                    text: \"You are the antithesis of what my husband has been writing his dissertation about.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"42000540\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: 1,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374039953,\n                    text: \"July 16 at 10:45pm\",\n                    verbose: \"Tuesday, July 16, 2013 at 10:45pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200407437602598_4992465\",\n                fbid: \"10200412568530868\",\n                legacyid: \"4992465\",\n                body: {\n                    text: \"Harry: I'm turning 27, not 4\\u00bd...\\u000a\\u000aChrissi: Oh?\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374040107,\n                    text: \"July 16 at 10:48pm\",\n                    verbose: \"Tuesday, July 16, 2013 at 10:48pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200407437602598_4992473\",\n                fbid: \"10200412578931128\",\n                legacyid: \"4992473\",\n                body: {\n                    text: \"irony vs satire/sarcasm, pragmatism, william james type stuff\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"42000540\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: 1,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374040490,\n                    text: \"July 16 at 10:54pm\",\n                    verbose: \"Tuesday, July 16, 2013 at 10:54pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200407437602598_4996311\",\n                fbid: \"10200417729139880\",\n                legacyid: \"4996311\",\n                body: {\n                    text: \":)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1729068700\",\n                ftentidentifier: \"10200407437602598\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: 1,\n                istranslatable: false,\n                timestamp: {\n                    time: 1374119198,\n                    text: \"July 17 at 8:46pm\",\n                    verbose: \"Wednesday, July 17, 2013 at 8:46pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"42000540\",\n                JSBNG__name: \"Chrissi Keith\",\n                firstName: \"Chrissi\",\n                vanity: \"taskmasterkeith\",\n                thumbSrc: \"http://jsbngssl.profile-b-iad.xx.fbcdn.net/hprofile-ash4/s32x32/276211_42000540_1185711920_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/taskmasterkeith\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1055580469\",\n                JSBNG__name: \"Gregor Richards\",\n                firstName: \"Gregor\",\n                vanity: \"LawlabeeTheWallaby\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/276274_1055580469_962040234_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/LawlabeeTheWallaby\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },{\n                id: \"1729068700\",\n                JSBNG__name: \"Donna Rubens Renhard\",\n                firstName: \"Donna\",\n                vanity: \"donna.rubensrenhard\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/187733_1729068700_888004086_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/donna.rubensrenhard\",\n                gender: 1,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200407437602598: {\n                        chronological: {\n                            range: {\n                                offset: 9,\n                                length: 4\n                            },\n                            values: [\"10200407437602598_4992459\",\"10200407437602598_4992465\",\"10200407437602598_4992473\",\"10200407437602598_4996311\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200407437602598_4992459\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    },\n                    \"10200407437602598_4992465\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    },\n                    \"10200407437602598_4992473\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    },\n                    \"10200407437602598_4996311\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200407437602598\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_31\",[\"Popover\",\"m_0_32\",\"m_0_2z\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_32\"\n        },{\n            __m: \"m_0_2z\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_3m\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_2v\",[\"PopoverAsyncMenu\",\"m_0_2w\",\"m_0_2u\",\"m_0_2t\",],[{\n            __m: \"m_0_2w\"\n        },{\n            __m: \"m_0_2u\"\n        },{\n            __m: \"m_0_2t\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=5791137008599102559&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373991800&unit_data%5Bunit_end_time%5D=1373991800&dom_id=u_0_1i&timestamp=1373991800&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],[\"m_0_2r\",[\"Popover\",\"m_0_2s\",\"m_0_2p\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_2s\"\n        },{\n            __m: \"m_0_2p\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_3g\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_3n\",[\"XHPTemplate\",\"m_0_3o\",],[{\n            __m: \"m_0_3o\"\n        },],2,],[\"m_0_2o\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_3d\",[\"MultiBootstrapDataSource\",],[{\n            maxResults: 3,\n            queryData: {\n                context: \"topics_limited_autosuggest\",\n                viewer: 100006118350059,\n                filter: [\"page\",\"user\",],\n                rsp: \"mentions\",\n                photo_fbid: \"10200453104264236\"\n            },\n            queryEndpoint: \"/ajax/typeahead/search.php\",\n            bootstrapData: {\n                rsp: \"mentions\"\n            },\n            bootstrapEndpoints: [{\n                endpoint: \"/ajax/typeahead/first_degree.php\",\n                data: {\n                    context: \"mentions\",\n                    viewer: 100006118350059,\n                    token: \"1374777501-7\",\n                    filter: [\"page\",\"group\",\"app\",\"JSBNG__event\",\"user\",],\n                    options: [\"friends_only\",\"nm\",]\n                }\n            },]\n        },],2,],[\"m_0_2q\",[\"PopoverAsyncMenu\",\"m_0_2r\",\"m_0_2p\",\"m_0_2o\",],[{\n            __m: \"m_0_2r\"\n        },{\n            __m: \"m_0_2p\"\n        },{\n            __m: \"m_0_2o\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=2953496614934485437&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1373055341&unit_data%5Bunit_end_time%5D=1373055341&dom_id=u_0_1f&timestamp=1373055341&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],[\"m_0_2t\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_30\",[\"PopoverAsyncMenu\",\"m_0_31\",\"m_0_2z\",\"m_0_2y\",],[{\n            __m: \"m_0_31\"\n        },{\n            __m: \"m_0_2z\"\n        },{\n            __m: \"m_0_2y\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=69&unit_data%5Bhash%5D=1267290328123522761&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1374637162&unit_data%5Bunit_end_time%5D=1374637162&dom_id=u_0_1l&timestamp=1374637162&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],[\"m_0_2y\",[\"PopoverLoadingMenu\",\"MenuTheme\",],[{\n            theme: {\n                __m: \"MenuTheme\"\n            }\n        },],3,],[\"m_0_2m\",[\"Popover\",\"m_0_2n\",\"m_0_2k\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_2n\"\n        },{\n            __m: \"m_0_2k\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_3l\",[\"UFIController\",\"m_0_3k\",\"m_0_3m\",],[{\n            __m: \"m_0_3k\"\n        },{\n            ftentidentifier: \"10200343222477260\",\n            instanceid: \"u_0_1y\",\n            source: 0,\n            showaddcomment: true,\n            collapseaddcomment: false,\n            markedcomments: [],\n            scrollcomments: false,\n            scrollwidth: null,\n            showshares: false,\n            shownub: false,\n            numberdelimiter: \",\",\n            showtyping: 0,\n            logtyping: 0,\n            entstream: false,\n            embedded: false,\n            viewoptionstypeobjects: null,\n            viewoptionstypeobjectsorder: null,\n            giftoccasion: null,\n            sht: 1,\n            snowliftredesign: false,\n            timelinelogdata: \"AQAr9lR2vZdldJ-VKsQo7OWaxXGctSzumkX_OWY9tMv34KoO2FztCqmqb8QBDYnKVWW99VqdbOskntjWhjy7W_MUFXYbmHi4oEJJ321uNu0XUYOzGWm_7u7pnY0zKn9thJ5ghe3h9Y4OukyraP07GphpWlsRiSVa_A-1EMIWIdeKmf-CJmEKmfCxEsM18xb2jjadO65ng8zpr6Dn3Z4o7hjV6OmtF3SCq3PgmXDdmdeFwvX8OgXFZncq4jrAd-dd1qH-0sddZKJuEM2b9WV5eyh_PipSNsi3uC6SpYHby30MLarSM5sgjVZxzOxLhdYkWGiF5kRqMgD0DZdRN5FoDtL6gTy--Mt8pP_wYiB8kl7IExZc3NIFNruO-xiWNXHnSp7mFJ4K4onngXPGTiY4s_d4\"\n        },{\n            feedbacktargets: [{\n                targetfbid: \"10200343222477260\",\n                entidentifier: \"10200343222477260\",\n                permalink: \"/LawlabeeTheWallaby/posts/10200343222477260\",\n                commentcount: 11,\n                likecount: 7,\n                viewercanlike: true,\n                hasviewerliked: false,\n                cancomment: false,\n                showremovemenu: false,\n                actorforpost: \"100006118350059\",\n                viewerid: \"100006118350059\",\n                likesentences: {\n                    current: {\n                        text: \"7 people like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 0,\n                            length: 8,\n                            count: 7\n                        },]\n                    },\n                    alternate: {\n                        text: \"You and 7 others like this.\",\n                        ranges: [],\n                        aggregatedranges: [{\n                            offset: 8,\n                            length: 8,\n                            count: 7\n                        },]\n                    }\n                },\n                sharecount: 0,\n                ownerid: \"1055580469\",\n                lastseentime: null,\n                canremoveall: false,\n                seencount: 0,\n                seenbyall: false,\n                hasunseencollapsed: false,\n                mentionsdatasource: {\n                    __m: \"m_0_3m\"\n                },\n                isranked: false,\n                isthreaded: false,\n                isownerpage: false,\n                actorid: \"1055580469\",\n                grouporeventid: null,\n                allowphotoattachments: true,\n                replysocialsentencemaxreplies: 10,\n                showfeaturedreplies: false,\n                viewercansubscribetopost: false,\n                hasviewersubscribed: false,\n                commentboxhoisted: false,\n                hasaddcommentlink: false,\n                defaultcommentorderingmode: \"chronological\",\n                showsendonentertip: true\n            },],\n            comments: [{\n                id: \"10200343222477260_4946958\",\n                fbid: \"10200346777686138\",\n                legacyid: \"4946958\",\n                body: {\n                    text: \"Does it have a sense of the surreal or are you just sharing a data point? ;)\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1633181753\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1372985540,\n                    text: \"July 4 at 5:52pm\",\n                    verbose: \"Thursday, July 4, 2013 at 5:52pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4947623\",\n                fbid: \"10200347758230651\",\n                legacyid: \"4947623\",\n                body: {\n                    text: \"Merely minor amusement.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373002430,\n                    text: \"July 4 at 10:33pm\",\n                    verbose: \"Thursday, July 4, 2013 at 10:33pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950566\",\n                fbid: \"10200351838652659\",\n                legacyid: \"4950566\",\n                body: {\n                    text: \"Did you wear http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                    ranges: [{\n                        offset: 13,\n                        length: 68,\n                        entities: [{\n                            url: \"http://img2.etsystatic.com/005/0/8125869/il_570xN.471485474_swpa.jpg\",\n                            shimhash: \"zAQGz2cVu\",\n                            id: \"0746af69b9da85d793efe61531abaafe\",\n                            JSBNG__external: true\n                        },]\n                    },],\n                    aggregatedranges: []\n                },\n                author: \"53600996\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066508,\n                    text: \"July 5 at 4:21pm\",\n                    verbose: \"Friday, July 5, 2013 at 4:21pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },{\n                id: \"10200343222477260_4950571\",\n                fbid: \"10200351843052769\",\n                legacyid: \"4950571\",\n                body: {\n                    text: \"That's the most delightfully offensive piece of apparel I've seen in quite some time.\",\n                    ranges: [],\n                    aggregatedranges: []\n                },\n                author: \"1055580469\",\n                ftentidentifier: \"10200343222477260\",\n                likecount: 0,\n                hasviewerliked: false,\n                canremove: false,\n                canreport: true,\n                canedit: false,\n                source: null,\n                istranslatable: false,\n                timestamp: {\n                    time: 1373066594,\n                    text: \"July 5 at 4:23pm\",\n                    verbose: \"Friday, July 5, 2013 at 4:23pm\"\n                },\n                spamreplycount: 0,\n                replyauthors: []\n            },],\n            profiles: [{\n                id: \"53600996\",\n                JSBNG__name: \"Harrison Metzger\",\n                firstName: \"Harrison\",\n                vanity: \"harrisonmetz\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/s32x32/195694_53600996_1993816119_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/harrisonmetz\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null\n            },],\n            actions: [],\n            commentlists: {\n                comments: {\n                    10200343222477260: {\n                        chronological: {\n                            range: {\n                                offset: 7,\n                                length: 4\n                            },\n                            values: [\"10200343222477260_4946958\",\"10200343222477260_4947623\",\"10200343222477260_4950566\",\"10200343222477260_4950571\",]\n                        }\n                    }\n                },\n                replies: {\n                    \"10200343222477260_4946958\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4947623\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950566\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    },\n                    \"10200343222477260_4950571\": {\n                        range: {\n                            offset: 0,\n                            length: 0\n                        },\n                        values: [],\n                        count: 0,\n                        ftentidentifier: \"10200343222477260\"\n                    }\n                }\n            },\n            servertime: 1374851147\n        },],1,],[\"m_0_2w\",[\"Popover\",\"m_0_2x\",\"m_0_2u\",\"ContextualLayerAsyncRelative\",\"ContextualLayerAutoFlip\",],[{\n            __m: \"m_0_2x\"\n        },{\n            __m: \"m_0_2u\"\n        },[{\n            __m: \"ContextualLayerAsyncRelative\"\n        },{\n            __m: \"ContextualLayerAutoFlip\"\n        },],{\n            alignh: \"right\"\n        },],3,],[\"m_0_2l\",[\"PopoverAsyncMenu\",\"m_0_2m\",\"m_0_2k\",\"m_0_2j\",],[{\n            __m: \"m_0_2m\"\n        },{\n            __m: \"m_0_2k\"\n        },{\n            __m: \"m_0_2j\"\n        },\"/ajax/timeline/curation_menu_new.php?unit_data%5Bunit_type%5D=2&unit_data%5Bhash%5D=4498726532280095426&unit_data%5Bwindow_size%5D=3&unit_data%5Bwindow_start_time%5D=0&unit_data%5Bwindow_end_time%5D=1375340399&unit_data%5Bunit_start_time%5D=1372923465&unit_data%5Bunit_end_time%5D=1372923465&dom_id=u_0_1c&timestamp=1372923465&impression_id=b1113c18&is_start=1&friendship_page_id=0&is_pinned_page_post=0&profile_id=1055580469&start=0&end=1375340399&query_type=39&show_star=1&star_req=1\",[],],1,],],\n        define: [[\"CLogConfig\",[],{\n            gkResults: 1\n        },174,],[\"UFICommentTemplates\",[\"m_0_3n\",],{\n            \":fb:ufi:hide-dialog-template\": {\n                __m: \"m_0_3n\"\n            }\n        },70,],[\"UFISpamCountImpl\",[],{\n            \"module\": null\n        },72,],[\"UFIConfig\",[],{\n            renderEmoji: true,\n            renderEmoticons: 1\n        },71,],],\n        elements: [[\"m_0_34\",\"u_0_1p\",2,],[\"m_0_3b\",\"u_0_1t\",2,],[\"m_0_2x\",\"u_0_1j\",2,],[\"m_0_36\",\"u_0_1r\",2,],[\"m_0_2s\",\"u_0_1g\",2,],[\"m_0_2k\",\"u_0_1e\",4,],[\"m_0_32\",\"u_0_1m\",2,],[\"m_0_33\",\"u_0_1o\",2,],[\"m_0_39\",\"u_0_1q\",2,],[\"m_0_3e\",\"u_0_1v\",2,],[\"m_0_35\",\"u_0_1q\",2,],[\"m_0_38\",\"u_0_1p\",2,],[\"m_0_3h\",\"u_0_1x\",2,],[\"m_0_3k\",\"u_0_1z\",2,],[\"m_0_3a\",\"u_0_1r\",2,],[\"m_0_37\",\"u_0_1o\",2,],[\"m_0_2z\",\"u_0_1n\",4,],[\"m_0_2p\",\"u_0_1h\",4,],[\"m_0_2u\",\"u_0_1k\",4,],[\"m_0_2n\",\"u_0_1d\",2,],],\n        markup: [[\"m_0_3o\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"pvs phm -cx-PUBLIC-uiDialog__title\\\" data-jsid=\\\"title\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pam -cx-PRIVATE-uiDialog__body\\\" data-jsid=\\\"body\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiDialog__footer\\\"\\u003E\\u003Cdiv class=\\\"pam uiOverlayFooter uiBoxGray topborder\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerConfirm uiOverlayButton selected -cx-PRIVATE-uiButton__confirm -cx-PRIVATE-uiButton__large\\\" data-jsid=\\\"delete\\\" type=\\\"submit\\\"\\u003EDelete\\u003C/button\\u003E\\u003Ca class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root layerCancel uiOverlayButton -cx-PRIVATE-uiButton__large\\\" role=\\\"button\\\" href=\\\"#\\\"\\u003ECancel\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",\"tAd6o\",],\n    bootloadable: {\n        TypeaheadHoistFriends: {\n            resources: [\"OFYQ5\",],\n            \"module\": true\n        },\n        \"UFIEntStreamOrderingModeSelector.react\": {\n            resources: [\"OH3xD\",\"XH2Cu\",\"UmFO+\",\"ociRJ\",\"/MWWQ\",\"f7Tpb\",\"AVmr9\",\"OYzUx\",\"veUjj\",\"dShSX\",\"HgCpx\",\"0q2Dj\",\"QZ9ii\",\"aG0Oj\",\"iAvmX\",\"TXKLp\",\"kcpXP\",],\n            \"module\": true\n        },\n        InputSelection: {\n            resources: [\"OH3xD\",\"UmFO+\",\"f7Tpb\",],\n            \"module\": true\n        },\n        FileInputUploader: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"TXKLp\",\"4/uwC\",\"7w6kA\",],\n            \"module\": true\n        },\n        DialogX: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"XH2Cu\",],\n            \"module\": true\n        },\n        ContextualTypeaheadView: {\n            resources: [\"OH3xD\",\"veUjj\",\"/MWWQ\",\"UmFO+\",\"f7Tpb\",\"AVmr9\",],\n            \"module\": true\n        },\n        TypeaheadBestName: {\n            resources: [\"XH2Cu\",\"/MWWQ\",],\n            \"module\": true\n        },\n        TypeaheadMetrics: {\n            resources: [\"OH3xD\",\"OFYQ5\",],\n            \"module\": true\n        },\n        MentionsInput: {\n            resources: [\"OH3xD\",\"UmFO+\",\"f7Tpb\",\"OFYQ5\",\"XH2Cu\",\"AVmr9\",\"veUjj\",],\n            \"module\": true\n        },\n        TypingDetector: {\n            resources: [\"OH3xD\",\"OSd/n\",],\n            \"module\": true\n        },\n        TypeaheadAreaCore: {\n            resources: [\"OH3xD\",\"UmFO+\",\"f7Tpb\",\"/MWWQ\",\"OFYQ5\",],\n            \"module\": true\n        },\n        EntstreamPubContentOverlay: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"veUjj\",\"ociRJ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"SZ74q\",\"gJ7+m\",\"/MWWQ\",\"TXKLp\",\"za92D\",\"kcpXP\",\"js0se\",\"m5aEV\",],\n            \"module\": true\n        },\n        CompactTypeaheadRenderer: {\n            resources: [\"OH3xD\",\"veUjj\",\"/MWWQ\",],\n            \"module\": true\n        },\n        ScrollAwareDOM: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",],\n            \"module\": true\n        },\n        \"legacy:live-js\": {\n            resources: [\"OH3xD\",\"WLpRY\",\"XH2Cu\",]\n        },\n        collectDataAttributes: {\n            resources: [\"OH3xD\",],\n            \"module\": true\n        },\n        UFIScrollHighlight: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"5iOnb\",\"rSdpp\",],\n            \"module\": true\n        },\n        UFIComments: {\n            resources: [\"XH2Cu\",\"ociRJ\",\"OH3xD\",],\n            \"module\": true\n        },\n        UFIRetryActions: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"8ay4F\",],\n            \"module\": true\n        },\n        LegacyMenuUtils: {\n            resources: [\"OH3xD\",\"OYzUx\",\"f7Tpb\",\"/MWWQ\",\"AVmr9\",\"veUjj\",\"XH2Cu\",\"0q2Dj\",\"UmFO+\",\"BRnsj\",],\n            \"module\": true\n        },\n        HashtagLayerPageController: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"veUjj\",\"ociRJ\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"SZ74q\",\"IxyKh\",\"9epYo\",\"Vczhe\",\"/MWWQ\",\"gJ7+m\",\"BBKr2\",\"MuiPI\",\"AMFDz\",\"qRGqD\",],\n            \"module\": true\n        },\n        \"legacy:ufi-tracking-js\": {\n            resources: [\"WLpRY\",]\n        },\n        CLoggerX: {\n            resources: [\"OH3xD\",\"ociRJ\",],\n            \"module\": true\n        },\n        \"UFICommentRemovalControls.react\": {\n            resources: [\"XH2Cu\",\"OH3xD\",\"veUjj\",\"OZCPo\",],\n            \"module\": true\n        },\n        DOMScroll: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",],\n            \"module\": true\n        },\n        ScrollableArea: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"/MWWQ\",\"AVmr9\",\"veUjj\",],\n            \"module\": true\n        },\n        HashtagParser: {\n            resources: [\"OSd/n\",\"+P3v8\",],\n            \"module\": true\n        },\n        TextAreaControl: {\n            resources: [\"OH3xD\",\"4/uwC\",\"veUjj\",],\n            \"module\": true\n        },\n        LegacyContextualDialog: {\n            resources: [\"OH3xD\",\"/MWWQ\",\"bmJBG\",\"f7Tpb\",\"AVmr9\",\"UmFO+\",\"veUjj\",],\n            \"module\": true\n        },\n        Typeahead: {\n            resources: [\"f7Tpb\",\"OH3xD\",\"veUjj\",\"/MWWQ\",],\n            \"module\": true\n        },\n        Hovercard: {\n            resources: [\"OH3xD\",\"UmFO+\",\"/MWWQ\",\"AVmr9\",\"f7Tpb\",],\n            \"module\": true\n        },\n        FileInput: {\n            resources: [\"OH3xD\",\"AVmr9\",\"UmFO+\",\"veUjj\",],\n            \"module\": true\n        },\n        \"UFIOrderingModeSelector.react\": {\n            resources: [\"OH3xD\",\"XH2Cu\",\"UmFO+\",\"ociRJ\",\"OYzUx\",\"f7Tpb\",\"/MWWQ\",\"AVmr9\",\"veUjj\",\"dShSX\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        kcpXP: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/F1V9PnKbxuN.js\"\n        },\n        SZ74q: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/2TiFHJIlpz4.css\"\n        },\n        ywV7J: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/wyUJpAs1Jud.js\"\n        },\n        \"7w6kA\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/P5ro3SB0fYh.js\"\n        },\n        rSdpp: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yc/r/2PkTFjdVPzc.js\"\n        },\n        BRnsj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/Zl5MQqq69ii.js\"\n        },\n        qRGqD: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/0zNvPsl4_Iy.js\"\n        },\n        \"0q2Dj\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ye/r/6AN8Ic-0Y1P.js\"\n        },\n        IxyKh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/7f-bDgHTzcK.js\"\n        },\n        BBKr2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/2RUWo8vhW3Y.js\"\n        },\n        HgCpx: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/b9CwnSvNFr4.css\"\n        },\n        Vczhe: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yx/r/PNcm9agI5Po.js\"\n        },\n        \"8ay4F\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/VrfxLTcinh0.js\"\n        },\n        m5aEV: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/yfRGukr04iK.css\"\n        },\n        OZCPo: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/wHB0tbxOz8q.js\"\n        },\n        aG0Oj: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yD/r/56drIuXqn1s.js\"\n        },\n        MuiPI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yh/r/7aLu6r05bf7.js\"\n        },\n        \"9epYo\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/cgIp7Mxhz_d.css\"\n        },\n        bmJBG: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yK/r/RErt59oF4EQ.js\"\n        },\n        QZ9ii: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/BdtVXmiio69.css\"\n        },\n        OFYQ5: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y-/r/EKMXXey106d.js\"\n        },\n        iAvmX: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yj/r/-UKFu9u490q.css\"\n        },\n        \"gJ7+m\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/YaDMduhjA8v.js\"\n        },\n        \"5iOnb\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/MjMy0el_azO.js\"\n        },\n        AMFDz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/l0jEiYB1BY4.js\"\n        }\n    },\n    ixData: {\n        \"/images/group_gifts/icons/gift_icon_red-13px.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_b82a0c\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"nxD7O\",\"xfhln\",\"XH2Cu\",\"gyG67\",\"/MWWQ\",\"e0RyX\",\"OYzUx\",\"ywV7J\",\"ociRJ\",],\n    displayJS: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",],\n    onafterload: [\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:live-js\\\"], function(){ Live.startup() });\",\"Bootloader.loadComponents([\\\"legacy:ufi-tracking-js\\\"], function(){ ufi_add_all_link_data(); });\",],\n    id: \"pagelet_timeline_recent_segment_0_0_left\",\n    phase: 2,\n    tti_phase: 2\n});");
// 5043
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_175[0], o23,o37);
// undefined
o23 = null;
// undefined
o37 = null;
// 5047
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"/MWWQ\",]);\n}\n;\n__d(\"EgoAdsObjectSet\", [\"copyProperties\",\"csx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"csx\"), i = b(\"DOM\");\n    function j() {\n        this._allEgoUnits = [];\n        this._egoUnits = [];\n    };\n    g(j.prototype, {\n        init: function(l) {\n            this._allEgoUnits = l;\n            this._egoUnits = [];\n            this._allEgoUnits.forEach(function(m) {\n                var n = k(m);\n                if ((!n || !n.holdout)) {\n                    this._egoUnits.push(m);\n                };\n            }, this);\n        },\n        getCount: function() {\n            return this._egoUnits.length;\n        },\n        forEach: function(l, m) {\n            this._egoUnits.forEach(l, m);\n        },\n        getUnit: function(l) {\n            return this._egoUnits[l];\n        },\n        getHoldoutAdIDsForSpace: function(l, m) {\n            if ((!l || !m)) {\n                return []\n            };\n            var n = [];\n            for (var o = 0; ((l > 0) && (o < this._allEgoUnits.length)); o++) {\n                var p = this._allEgoUnits[o], q = m(p), r = k(p);\n                if ((((l >= q) && r) && r.holdout)) {\n                    n.push(r.adid);\n                };\n                l -= q;\n            };\n            return n;\n        },\n        getHoldoutAdIDsForNumAds: function(l) {\n            l = Math.min(l, this._allEgoUnits.length);\n            var m = [];\n            for (var n = 0; (n < l); n++) {\n                var o = this._allEgoUnits[n], p = k(o);\n                if ((p && p.holdout)) {\n                    m.push(p.adid);\n                };\n            };\n            return m;\n        }\n    });\n    function k(l) {\n        var m = i.scry(l, \"div.-cx-PUBLIC-fbAdUnit__root\")[0], n = (m && m.getAttribute(\"data-ad\"));\n        return ((n && JSON.parse(n)) || undefined);\n    };\n    e.exports = j;\n});\n__d(\"Rect\", [\"Vector\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k, l, m, n, o) {\n        if ((arguments.length === 1)) {\n            if ((k instanceof j)) {\n                return k\n            };\n            if ((k instanceof g)) {\n                return new j(k.y, k.x, k.y, k.x, k.domain)\n            };\n            return j.getElementBounds(h(k));\n        }\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: (o || \"pure\")\n        });\n    };\n    i(j.prototype, {\n        w: function() {\n            return (this.r - this.l);\n        },\n        h: function() {\n            return (this.b - this.t);\n        },\n        toString: function() {\n            return ((((((((\"((\" + this.l) + \", \") + this.t) + \"), (\") + this.r) + \", \") + this.b) + \"))\");\n        },\n        contains: function(k) {\n            k = new j(k).convertTo(this.domain);\n            var l = this;\n            return (((((l.l <= k.l) && (l.r >= k.r)) && (l.t <= k.t)) && (l.b >= k.b)));\n        },\n        add: function(k, l) {\n            if ((arguments.length == 1)) {\n                if ((k.domain != \"pure\")) {\n                    k = k.convertTo(this.domain);\n                };\n                return this.add(k.x, k.y);\n            }\n        ;\n            var m = parseFloat(k), n = parseFloat(l);\n            return new j((this.t + n), (this.r + m), (this.b + n), (this.l + m), this.domain);\n        },\n        sub: function(k, l) {\n            if ((arguments.length == 1)) {\n                return this.add(k.mul(-1));\n            }\n             else return this.add(-k, -l)\n        ;\n        },\n        rotateAroundOrigin: function(k) {\n            var l = this.getCenter().rotate(((k * Math.PI) / 2)), m, n;\n            if ((k % 2)) {\n                m = this.h();\n                n = this.w();\n            }\n             else {\n                m = this.w();\n                n = this.h();\n            }\n        ;\n            var o = (l.y - (n / 2)), p = (l.x - (m / 2)), q = (o + n), r = (p + m);\n            return new j(o, r, q, p, this.domain);\n        },\n        boundWithin: function(k) {\n            var l = 0, m = 0;\n            if ((this.l < k.l)) {\n                l = (k.l - this.l);\n            }\n             else if ((this.r > k.r)) {\n                l = (k.r - this.r);\n            }\n        ;\n            if ((this.t < k.t)) {\n                m = (k.t - this.t);\n            }\n             else if ((this.b > k.b)) {\n                m = (k.b - this.b);\n            }\n        ;\n            return this.add(l, m);\n        },\n        getCenter: function() {\n            return new g((this.l + (this.w() / 2)), (this.t + (this.h() / 2)), this.domain);\n        },\n        getPositionVector: function() {\n            return new g(this.l, this.t, this.domain);\n        },\n        getDimensionVector: function() {\n            return new g(this.w(), this.h(), \"pure\");\n        },\n        convertTo: function(k) {\n            if ((this.domain == k)) {\n                return this\n            };\n            if ((k == \"pure\")) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\")\n            };\n            if ((this.domain == \"pure\")) {\n                return new j(0, 0, 0, 0)\n            };\n            var l = new g(this.l, this.t, this.domain).convertTo(k);\n            return new j(l.y, (l.x + this.w()), (l.y + this.h()), l.x, k);\n        }\n    });\n    i(j, {\n        deserialize: function(k) {\n            var l = k.split(\":\");\n            return new j(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]), parseFloat(l[0]));\n        },\n        newFromVectors: function(k, l) {\n            return new j(k.y, (k.x + l.x), (k.y + l.y), k.x, k.domain);\n        },\n        getElementBounds: function(k) {\n            return j.newFromVectors(g.getElementPosition(k), g.getElementDimensions(k));\n        },\n        getViewportBounds: function() {\n            return j.newFromVectors(g.getScrollPosition(), g.getViewportDimensions());\n        },\n        minimumBoundingBox: function(k) {\n            var l = new j(Math.min(), Math.max(), Math.max(), Math.min()), m;\n            for (var n = 0; (n < k.length); n++) {\n                m = k[n];\n                l.t = Math.min(l.t, m.t);\n                l.r = Math.max(l.r, m.r);\n                l.b = Math.max(l.b, m.b);\n                l.l = Math.min(l.l, m.l);\n            };\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"legacy:ChatTypeaheadBehavior\", [\"ChatTypeaheadBehavior\",], function(a, b, c, d) {\n    var e = b(\"ChatTypeaheadBehavior\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.chatTypeahead = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:dom-html\", [\"HTML\",], function(a, b, c, d) {\n    a.HTML = b(\"HTML\");\n}, 3);\n__d(\"legacy:dom\", [\"DOM\",], function(a, b, c, d) {\n    a.DOM = b(\"DOM\");\n}, 3);\n__d(\"TypeaheadFacepile\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\");\n    function h() {\n    \n    };\n    h.render = function(i) {\n        var j = [g.create(\"span\", {\n            className: \"splitpic leftpic\"\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[0]\n        }),]),g.create(\"span\", {\n            className: (\"splitpic\" + ((i[2] ? \" toppic\" : \"\")))\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[1]\n        }),]),];\n        if (i[2]) {\n            j.push(g.create(\"span\", {\n                className: \"splitpic bottompic\"\n            }, [g.create(\"img\", {\n                alt: \"\",\n                src: i[2]\n            }),]));\n        };\n        return g.create(\"span\", {\n            className: \"splitpics clearfix\"\n        }, j);\n    };\n    e.exports = h;\n});\n__d(\"NavigationMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        NAVIGATION_BEGIN: \"NavigationMessage/navigationBegin\",\n        NAVIGATION_SELECT: \"NavigationMessage/navigationSelect\",\n        NAVIGATION_FIRST_RESPONSE: \"NavigationMessage/navigationFirstResponse\",\n        NAVIGATION_COMPLETED: \"NavigationMessage/navigationCompleted\",\n        NAVIGATION_FAILED: \"NavigationMessage/navigationFailed\",\n        NAVIGATION_COUNT_UPDATE: \"NavigationMessage/navigationCount\",\n        NAVIGATION_FAVORITE_UPDATE: \"NavigationMessage/navigationFavoriteUpdate\",\n        NAVIGATION_ITEM_REMOVED: \"NavigationMessage/navigationItemRemoved\",\n        NAVIGATION_ITEM_HIDDEN: \"NavigationMessage/navigationItemHidden\",\n        INTERNAL_LOADING_BEGIN: \"NavigationMessage/internalLoadingBegin\",\n        INTERNAL_LOADING_COMPLETED: \"NavigationMessage/internalLoadingCompleted\"\n    };\n    e.exports = g;\n});\n__d(\"SimpleDrag\", [\"Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"UserAgent\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this.minDragDistance = 0;\n        g.listen(n, \"mousedown\", this._start.bind(this));\n    };\n    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", event)) {\n                o = false;\n            };\n            if (this.minDragDistance) {\n                p = j.getEventPosition(event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", event);\n                if ((q === true)) {\n                    o = false;\n                }\n                 else if ((q === false)) {\n                    n = false;\n                    return;\n                }\n                \n            ;\n            }\n        ;\n            var r = ((i.ie() < 9) ? document.documentElement : window), s = g.listen(r, {\n                selectstart: (o ? g.prevent : l),\n                mousemove: function(event) {\n                    if (!n) {\n                        var t = j.getEventPosition(event);\n                        if ((p.distanceTo(t) < this.minDragDistance)) {\n                            return\n                        };\n                        n = true;\n                        if ((this.inform(\"start\", event) === false)) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    }\n                ;\n                    this.inform(\"update\", event);\n                }.bind(this),\n                mouseup: function(event) {\n                    for (var t in s) {\n                        s[t].remove();;\n                    };\n                    if (n) {\n                        this.inform(\"end\", event);\n                    }\n                     else this.inform(\"click\", event);\n                ;\n                }.bind(this)\n            });\n            (o && event.prevent());\n        }\n    });\n    e.exports = m;\n});\n__d(\"ARIA\", [\"DOM\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"emptyFunction\"), i = b(\"ge\"), j, k, l = function() {\n        j = i(\"ariaAssertiveAlert\");\n        if (!j) {\n            j = g.create(\"div\", {\n                id: \"ariaAssertiveAlert\",\n                className: \"accessible_elem\",\n                \"aria-live\": \"assertive\"\n            });\n            g.appendContent(document.body, j);\n        }\n    ;\n        k = i(\"ariaPoliteAlert\");\n        if (!k) {\n            k = j.cloneNode(false);\n            k.setAttribute(\"id\", \"ariaPoliteAlert\");\n            k.setAttribute(\"aria-live\", \"polite\");\n            g.appendContent(document.body, k);\n        }\n    ;\n        l = h;\n    };\n    function m(o, p) {\n        l();\n        var q = (p ? j : k);\n        g.setContent(q, o);\n    };\n    var n = {\n        owns: function(o, p) {\n            o.setAttribute(\"aria-owns\", g.getID(p));\n        },\n        setPopup: function(o, p) {\n            var q = g.getID(p);\n            o.setAttribute(\"aria-owns\", q);\n            o.setAttribute(\"aria-haspopup\", \"true\");\n            if ((o.tabIndex == -1)) {\n                o.tabIndex = 0;\n            };\n        },\n        announce: function(o) {\n            m(o, true);\n        },\n        notify: function(o) {\n            m(o);\n        }\n    };\n    e.exports = n;\n});\n__d(\"AudienceSelectorTags\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        hasTags: function(i) {\n            return g.hasOwnProperty(i);\n        },\n        setHasTags: function(i) {\n            if (i) {\n                g[i] = true;\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"Badge\", [\"CSS\",\"DOM\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"cx\"), j = function(k, l) {\n        var m;\n        switch (k) {\n          case \"xsmall\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__xsmall\";\n            break;\n          case \"small\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__small\";\n            break;\n          case \"medium\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__medium\";\n            break;\n          case \"large\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__large\";\n            break;\n          case \"xlarge\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__xlarge\";\n            break;\n        };\n        if (m) {\n            var n = h.create(\"span\", {\n                className: m\n            });\n            if ((l === \"verified\")) {\n                g.addClass(n, \"-cx-PRIVATE-verifiedBadge__root\");\n            }\n             else return null\n        ;\n            return n;\n        }\n    ;\n        return null;\n    };\n    e.exports = j;\n});\n__d(\"BasicTypeaheadRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(j, k) {\n        var l = [];\n        if (j.icon) {\n            l.push(h.create(\"img\", {\n                alt: \"\",\n                src: j.icon\n            }));\n        };\n        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\", \"verified\"));\n            };\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\n        };\n        var n = h.create(\"li\", {\n            className: (j.type || \"\")\n        }, l);\n        if (j.text) {\n            n.setAttribute(\"aria-label\", j.text);\n        };\n        return n;\n    };\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"BasicTypeaheadRenderer\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"$\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\");\n    function p(q, r) {\n        this.element = this.content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\n    };\n    n(p.prototype, h, {\n        events: [\"highlight\",\"render\",\"reset\",\"select\",\"beforeRender\",\"next\",\"prev\",],\n        renderer: i,\n        autoSelect: false,\n        ignoreMouseover: false,\n        init: function() {\n            this.init = o;\n            this.initializeEvents();\n            this.reset();\n        },\n        initializeEvents: function() {\n            g.listen(this.element, {\n                mouseup: this.mouseup.bind(this),\n                mouseover: this.mouseover.bind(this)\n            });\n        },\n        setTypeahead: function(q) {\n            this.typeahead = q;\n        },\n        setAccessibilityControlElement: function(q) {\n            this.accessibilityElement = q;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        mouseup: function(event) {\n            if ((event.button != 2)) {\n                this.select(true);\n                event.kill();\n            }\n        ;\n        },\n        mouseover: function(event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(event));\n            };\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            };\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(event) {\n            return this.items.indexOf(l.byTag(event.getTarget(), \"li\"));\n        },\n        getSelection: function() {\n            var q = (this.results[this.index] || null);\n            return (this.visible ? q : null);\n        },\n        isEmpty: function() {\n            return !this.results.length;\n        },\n        isVisible: function() {\n            return !!this.visible;\n        },\n        show: function() {\n            j.show(this.element);\n            if ((this.results && this.results.length)) {\n                if (((this.autoSelect && this.accessibilityElement) && this.selected)) {\n                    this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                }\n            };\n            (this.accessibilityElement && this.accessibilityElement.setAttribute(\"aria-expanded\", \"true\"));\n            this.visible = true;\n            return this;\n        },\n        hide: function() {\n            j.hide(this.element);\n            if (this.accessibilityElement) {\n                this.accessibilityElement.setAttribute(\"aria-expanded\", \"false\");\n                this.accessibilityElement.removeAttribute(\"aria-activedescendant\");\n            }\n        ;\n            this.visible = false;\n            return this;\n        },\n        render: function(q, r) {\n            this.value = q;\n            if (!r.length) {\n                (this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\"));\n                this.reset(true);\n                return;\n            }\n        ;\n            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\n            };\n            var s = {\n                results: r,\n                value: q\n            };\n            this.inform(\"beforeRender\", s);\n            r = s.results;\n            var t = this.getDefaultIndex(r);\n            if (((this.index > 0) && (this.index !== this.getDefaultIndex(this.results)))) {\n                var u = this.results[this.index];\n                for (var v = 0, w = r.length; (v < w); ++v) {\n                    if ((u.uid == r[v].uid)) {\n                        t = v;\n                        break;\n                    }\n                ;\n                };\n            }\n        ;\n            this.results = r;\n            k.setContent(this.content, this.buildResults(r));\n            this.items = this.getItems();\n            this.highlight(t, false);\n            this.inform(\"render\", r);\n        },\n        getItems: function() {\n            return k.scry(this.content, \"li\");\n        },\n        buildResults: function(q) {\n            var r, s = null;\n            if ((typeof this.renderer == \"function\")) {\n                r = this.renderer;\n                s = (this.renderer.className || \"\");\n            }\n             else {\n                r = a.TypeaheadRenderers[this.renderer];\n                s = this.renderer;\n            }\n        ;\n            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\n                };\n                var y = (w.node || r(w, x));\n                y.setAttribute(\"role\", \"option\");\n                return y;\n            }), v = k.create(\"ul\", {\n                className: s,\n                id: (\"typeahead_list_\" + ((this.typeahead ? k.getID(this.typeahead) : k.getID(this.element))))\n            }, u);\n            v.setAttribute(\"role\", \"listbox\");\n            return v;\n        },\n        getDefaultIndex: function() {\n            var q = ((this.autoSelect && !this.disableAutoSelect));\n            return (((this.index < 0) && !q) ? -1 : 0);\n        },\n        next: function() {\n            this.highlight((this.index + 1));\n            this.inform(\"next\", this.selected);\n        },\n        prev: function() {\n            this.highlight((this.index - 1));\n            this.inform(\"prev\", this.selected);\n        },\n        getItemText: function(q) {\n            var r = \"\";\n            if (q) {\n                r = q.getAttribute(\"aria-label\");\n                if (!r) {\n                    r = k.getText(q);\n                    q.setAttribute(\"aria-label\", r);\n                }\n            ;\n            }\n        ;\n            return r;\n        },\n        setIsViewingSelectedItems: function(q) {\n            this.viewingSelected = q;\n            return this;\n        },\n        getIsViewingSelectedItems: function() {\n            return !!this.viewingSelected;\n        },\n        highlight: function(q, r) {\n            var s = true;\n            if (this.selected) {\n                j.removeClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n            if ((q > (this.items.length - 1))) {\n                q = -1;\n            }\n             else if ((q < -1)) {\n                q = (this.items.length - 1);\n            }\n        ;\n            if (((q >= 0) && (q < this.items.length))) {\n                if ((this.selected && (this.getItemText(this.items[q]) === this.getItemText(this.selected)))) {\n                    s = false;\n                };\n                this.selected = this.items[q];\n                j.addClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"true\");\n                if (this.accessibilityElement) {\n                    (function() {\n                        this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                    }).bind(this).defer();\n                };\n            }\n             else (this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\"));\n        ;\n            this.index = q;\n            this.disableAutoSelect = ((q == -1));\n            var t = ((q !== -1)), u = this.getItemText(this.selected);\n            if (((((q !== -1) && this.isVisible()) && u) && this.autoSelect)) {\n                if (this.justShown) {\n                    this.justRendered = false;\n                    this.justShown = false;\n                    t = false;\n                }\n                 else if ((s && this.justRendered)) {\n                    this.justRendered = false;\n                    t = false;\n                }\n                \n            \n            };\n            if ((r !== false)) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\n                });\n            };\n        },\n        select: function(q) {\n            var r = this.index, s = this.results[r], t = this.element.getAttribute(\"id\");\n            if (s) {\n                this.inform(\"select\", {\n                    index: r,\n                    clicked: !!q,\n                    selected: s,\n                    id: t,\n                    query: this.value\n                });\n                this.inform(\"afterSelect\");\n            }\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"BucketedTypeaheadView\", [\"Class\",\"DOM\",\"tx\",\"TypeaheadView\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"tx\"), j = b(\"TypeaheadView\"), k = b(\"copyProperties\");\n    function l(m, n) {\n        this.parent.construct(this, m, n);\n    };\n    g.extend(l, j);\n    k(l.prototype, {\n        render: function(m, n, o) {\n            n = this.buildBuckets(m, n);\n            return this.parent.render(m, n, o);\n        },\n        highlight: function(m, n) {\n            if (((m == -1) && (this.index !== 0))) {\n                m = this.index;\n            };\n            while ((((m >= 0) && (m < this.items.length)) && !this.isHighlightable(this.results[m]))) {\n                m = (m + 1);;\n            };\n            this.parent.highlight(m, n);\n        },\n        buildBuckets: function(m, n) {\n            if (((!this.typeObjects || !n) || !n.length)) {\n                return n\n            };\n            var o = [], p = {\n            };\n            for (var q = 0; (q < n.length); ++q) {\n                var r = n[q], s = (r.render_type || r.type);\n                if (!p.hasOwnProperty(s)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                }\n            ;\n                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = (o[r.groupIndex].length - 1);\n                o[r.groupIndex].push(r);\n            };\n            for (s in this.typeObjects) {\n                if ((!p.hasOwnProperty(s) && this.typeObjects[s].show_always)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                    r = this.buildNoResultsEntry();\n                    r.classNames = r.type;\n                    r.groupIndex = p[s];\n                    r.indexInGroup = (o[r.groupIndex].length - 1);\n                    o[r.groupIndex].push(r);\n                }\n            ;\n            };\n            var t = [];\n            if (this.typeObjectsOrder) {\n                for (var u = 0; (u < this.typeObjectsOrder.length); ++u) {\n                    var v = this.typeObjectsOrder[u];\n                    if (p.hasOwnProperty(v)) {\n                        t = t.concat(o[p[v]]);\n                    };\n                };\n            }\n             else for (var w = 0; (w < o.length); ++w) {\n                t = t.concat(o[w]);;\n            }\n        ;\n            return t;\n        },\n        buildNoResultsEntry: function() {\n            return {\n                uid: \"disabled_result\",\n                type: \"disabled_result\",\n                text: \"No Results\"\n            };\n        },\n        buildBucketHeader: function(m) {\n            var n = this.typeObjects[m];\n            if ((n === undefined)) {\n                throw new Error(((m + \" is undefined in \") + JSON.stringify(this.typeObjects)))\n            };\n            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\n            }\n        ;\n            return this.typeObjects[m];\n        },\n        buildResults: function(m) {\n            var n = this.parent.buildResults(m);\n            if (this.typeObjects) {\n                return h.create(\"div\", {\n                    className: \"bucketed\"\n                }, [n,]);\n            }\n             else return n\n        ;\n        },\n        isHighlightable: function(m) {\n            return ((m.type != \"header\") && (m.type != \"disabled_result\"));\n        },\n        select: function(m) {\n            var n = this.results[this.index];\n            if ((n && this.isHighlightable(n))) {\n                this.parent.select(m);\n            };\n        },\n        normalizeIndex: function(m) {\n            var n = this.results.length;\n            if ((n === 0)) {\n                return -1;\n            }\n             else if ((m < -1)) {\n                return ((((m % n)) + n) + 1);\n            }\n             else if ((m >= n)) {\n                return (((m % n)) - 1);\n            }\n             else return m\n            \n            \n        ;\n        },\n        getDefaultIndex: function(m) {\n            var n = ((this.autoSelect && !this.disableAutoSelect));\n            if (((this.index < 0) && !n)) {\n                return -1\n            };\n            if ((m.length === 0)) {\n                return -1\n            };\n            var o = 0;\n            while ((!this.isHighlightable(m) && (o < m.length))) {\n                o++;;\n            };\n            return o;\n        },\n        prev: function() {\n            var m = this.results[this.normalizeIndex((this.index - 1))];\n            while ((m && !this.isHighlightable(m))) {\n                this.index = this.normalizeIndex((this.index - 1));\n                m = this.results[this.normalizeIndex((this.index - 1))];\n            };\n            return this.parent.prev();\n        },\n        next: function() {\n            var m = this.results[this.normalizeIndex((this.index + 1))];\n            while ((m && !this.isHighlightable(m))) {\n                this.index = this.normalizeIndex((this.index + 1));\n                m = this.results[this.normalizeIndex((this.index + 1))];\n            };\n            return this.parent.next();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerHideOnTransition\", [\"function-extensions\",\"PageTransitions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PageTransitions\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _enabled: false,\n        _subscribed: false,\n        enable: function() {\n            this._enabled = true;\n            if (!this._subscribed) {\n                this._subscribe.bind(this).defer();\n                this._subscribed = true;\n            }\n        ;\n        },\n        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                };\n                this._subscribed = false;\n            }.bind(this));\n        }\n    });\n    e.exports = i;\n});\n__d(\"SVGChecker\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        isSVG: function(g) {\n            return (!!g.ownerSVGElement || (g.tagName.toLowerCase() === \"svg\"));\n        },\n        isDisplayed: function(g) {\n            try {\n                var i = g.getBBox();\n                if ((i && (((i.height === 0) || (i.width === 0))))) {\n                    return false\n                };\n            } catch (h) {\n                return false;\n            };\n            return true;\n        }\n    };\n});\n__d(\"ContextualLayer\", [\"Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"Class\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Layer\"), p = b(\"LayerHideOnTransition\"), q = b(\"Locale\"), r = b(\"Parent\"), s = b(\"Rect\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"SVGChecker\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"getOverlayZIndex\"), aa = b(\"removeFromArray\"), ba = b(\"throttle\");\n    function ca(ja) {\n        return ((ja.getPosition() === \"left\") || ((ja.isVertical() && (ja.getAlignment() === \"right\"))));\n    };\n    function da(ja) {\n        var ka = ja.parentNode;\n        if (ka) {\n            var la = t.get(ka, \"position\");\n            if ((la === \"static\")) {\n                if ((ka === document.body)) {\n                    ka = document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = document.documentElement;\n    ;\n        return ka;\n    };\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\n    };\n    var fa = [];\n    h.subscribe(\"reflow\", function() {\n        fa.forEach(function(ja) {\n            if ((ja.updatePosition() === false)) {\n                ja.hide();\n            };\n        });\n    });\n    j.extend(ea, o);\n    x(ea.prototype, {\n        _contentWrapper: null,\n        _content: null,\n        _contextNode: null,\n        _contextBounds: null,\n        _contextSelector: null,\n        _parentLayer: null,\n        _parentSubscription: null,\n        _orientation: null,\n        _orientationClass: null,\n        _shouldSetARIAProperties: true,\n        _configure: function(ja, ka) {\n            this.parent._configure(ja, ka);\n            if (ja.context) {\n                this.setContext(ja.context);\n            }\n             else if (ja.contextID) {\n                this._setContextID(ja.contextID);\n            }\n             else if (ja.contextSelector) {\n                this._setContextSelector(ja.contextSelector);\n            }\n            \n        ;\n            this.setPosition(ja.position);\n            this.setAlignment(ja.alignment);\n            this.setOffsetX(ja.offsetX);\n            this.setOffsetY(ja.offsetY);\n            this._content = ka;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([p,]);\n        },\n        _buildWrapper: function(ja, ka) {\n            this._contentWrapper = n.create(\"div\", {\n                className: \"uiContextualLayer\"\n            }, ka);\n            return n.create(\"div\", {\n                className: \"uiContextualLayerPositioner\"\n            }, this._contentWrapper);\n        },\n        getInsertParent: function() {\n            var ja = this._insertParent;\n            if (!ja) {\n                var ka = this.getContext();\n                if (ka) {\n                    ja = r.byClass(ka, \"uiContextualLayerParent\");\n                };\n            }\n        ;\n            return (ja || this.parent.getInsertParent());\n        },\n        setContent: function(ja) {\n            this._content = ja;\n            n.setContent(this._contentWrapper, this._content);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setContext: function(ja) {\n            return this.setContextWithBounds(ja, null);\n        },\n        setContextWithBounds: function(ja, ka) {\n            this._contextNode = ja;\n            this._contextBounds = (ka || null);\n            this._contextSelector = this._contextScrollParent = null;\n            if (this._shown) {\n                k.register(this.getRoot(), this._contextNode);\n                this.updatePosition();\n            }\n        ;\n            this._setParentSubscription();\n            this.setARIAProperties();\n            return this;\n        },\n        shouldSetARIAProperties: function(ja) {\n            this._shouldSetARIAProperties = ja;\n            return this;\n        },\n        setARIAProperties: function() {\n            if (this._shouldSetARIAProperties) {\n                i.setPopup(this.getCausalElement(), this.getRoot());\n            };\n            return this;\n        },\n        _setContextID: function(ja) {\n            this._contextSelector = (\"#\" + ja);\n            this._contextNode = null;\n        },\n        _setContextSelector: function(ja) {\n            this._contextSelector = ja;\n            this._contextNode = null;\n        },\n        getCausalElement: function() {\n            return (this.parent.getCausalElement() || this.getContext());\n        },\n        _setParentSubscription: function() {\n            var ja = this.getContext(), ka = null;\n            while ((ja !== null)) {\n                ka = m.get(ja, \"layer\");\n                if (ka) {\n                    break;\n                };\n                ja = ja.parentNode;\n            };\n            if ((ka === this._parentLayer)) {\n                return\n            };\n            if ((this._parentLayer && this._parentSubscription)) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            };\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                (this._shown && this.updatePosition());\n            };\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\n            };\n            return this._orientation;\n        },\n        getContentRoot: function() {\n            return this._contentWrapper;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            if (!this._contextNode) {\n                this._contextNode = n.find(document, this._contextSelector);\n            };\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja)\n            };\n            var ka = this.getContext();\n            return s.newFromVectors(u.getElementPosition(ka, ja), u.getElementDimensions(ka));\n        },\n        getContextScrollParent: function() {\n            if (!this._contextScrollParent) {\n                this._contextScrollParent = t.getScrollParent(this.getContext());\n            };\n            return this._contextScrollParent;\n        },\n        setInsertParent: function(ja) {\n            this._insertScrollParent = null;\n            return this.parent.setInsertParent(ja);\n        },\n        getInsertScrollParent: function() {\n            if (!this._insertScrollParent) {\n                this._insertScrollParent = t.getScrollParent(this.getInsertParent());\n            };\n            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this\n            };\n            this.parent.show();\n            if (this._shown) {\n                k.register(this.getRoot(), this.getContext());\n                fa.push(this);\n                this._resizeListener = (this._resizeListener || g.listen(window, \"resize\", ba(this.updatePosition.bind(this))));\n            }\n        ;\n            return this;\n        },\n        finishHide: function() {\n            aa(fa, this);\n            (this._resizeListener && this._resizeListener.remove());\n            this._resizeListener = null;\n            return this.parent.finishHide();\n        },\n        isFixed: function() {\n            return ((t.isFixed(this.getContext()) && !t.isFixed(this.getInsertParent())));\n        },\n        updatePosition: function() {\n            var ja = this.getContext();\n            if (!ja) {\n                return false\n            };\n            var ka = this.isFixed();\n            if ((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja))))))) {\n                return false\n            };\n            var la = this.getRoot();\n            t.set(la, \"width\", (u.getViewportDimensions().x + \"px\"));\n            var ma = this._getOrientation();\n            this.inform(\"adjust\", ma.reset());\n            if (!ma.isValid()) {\n                return false\n            };\n            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = (ka ? \"viewport\" : \"document\"), qa = (ka ? document.documentElement : da(la));\n            if ((qa === document.documentElement)) {\n                na = new u(0, 0);\n                oa = document.documentElement.clientWidth;\n            }\n             else if (!la.offsetParent) {\n                return false;\n            }\n             else {\n                na = u.getElementPosition(qa, pa);\n                oa = qa.offsetWidth;\n                if ((qa !== document.body)) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\n                };\n            }\n            \n        ;\n            var ra = this.getContextBounds(pa), sa = (ra.l - na.x), ta = (ra.t - na.y), ua = ra.h(), va = ra.w(), wa = q.isRTL();\n            if ((ma.getPosition() === \"below\")) {\n                ta += ua;\n            };\n            if (((((ma.getPosition() === \"right\") || ((ma.isVertical() && (ma.getAlignment() === \"right\"))))) != wa)) {\n                sa += va;\n            };\n            var xa = ma.getOffsetX();\n            if ((ma.isVertical() && (ma.getAlignment() === \"center\"))) {\n                xa += (((va - this.getContentRoot().offsetWidth)) / 2);\n            };\n            if (wa) {\n                xa *= -1;\n            };\n            var ya = \"left\", za = Math.floor((sa + xa));\n            if ((ca(ma) !== wa)) {\n                ya = \"right\";\n                za = (oa - za);\n            }\n        ;\n            t.set(la, ya, (za + \"px\"));\n            t.set(la, ((ya === \"left\") ? \"right\" : \"left\"), \"\");\n            var ab = this.getInsertScrollParent(), bb;\n            if ((ab !== window)) {\n                bb = ab.clientWidth;\n            }\n             else bb = document.documentElement.clientWidth;\n        ;\n            var cb = u.getElementPosition(la).x;\n            if ((ya === \"left\")) {\n                if (((bb - cb) > 0)) {\n                    t.set(la, \"width\", (((bb - cb)) + \"px\"));\n                }\n                 else t.set(la, \"width\", \"\");\n            ;\n            }\n             else t.set(la, \"width\", ((cb + la.offsetWidth) + \"px\"));\n        ;\n            t.set(la, \"top\", (((ta + ma.getOffsetY())) + \"px\"));\n            var db = z(ja, this.getInsertParent());\n            t.set(la, \"z-index\", ((db > 200) ? db : \"\"));\n            this.inform(\"reposition\", ma);\n            return true;\n        },\n        _updateWrapperPosition: function(ja) {\n            var ka = (ja.getPosition() === \"above\");\n            t.set(this._contentWrapper, \"bottom\", (ka ? \"0\" : null));\n            var la = (q.isRTL() ? \"left\" : \"right\"), ma = ca(ja);\n            t.set(this._contentWrapper, la, (ma ? \"0\" : null));\n        },\n        _updateWrapperClass: function(ja) {\n            var ka = ja.getClassName();\n            if ((ka === this._orientationClass)) {\n                return\n            };\n            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\n            };\n            this._orientationClass = ka;\n            l.addClass(this._contentWrapper, ka);\n        },\n        simulateOrientation: function(ja, ka) {\n            var la = ja.getClassName();\n            if ((la === this._orientationClass)) {\n                return ka();\n            }\n             else {\n                if (this._orientationClass) {\n                    l.removeClass(this._contentWrapper, this._orientationClass);\n                };\n                l.addClass(this._contentWrapper, la);\n                var ma = ka();\n                l.removeClass(this._contentWrapper, la);\n                if (this._orientationClass) {\n                    l.addClass(this._contentWrapper, this._orientationClass);\n                };\n                return ma;\n            }\n        ;\n        },\n        destroy: function() {\n            this.parent.destroy();\n            this._contentWrapper = null;\n            this._content = null;\n            return this;\n        }\n    });\n    var ga = y.thatReturnsArgument, ha = y.thatReturnsArgument;\n    function ia() {\n        this._default = {\n            _position: \"above\",\n            _alignment: \"left\",\n            _offsetX: 0,\n            _offsetY: 0,\n            _valid: true\n        };\n        this.reset();\n    };\n    ia.OPPOSITE = {\n        above: \"below\",\n        below: \"above\",\n        left: \"right\",\n        right: \"left\"\n    };\n    x(ia.prototype, {\n        setPosition: function(ja) {\n            this._position = ga(ja);\n            return this;\n        },\n        setAlignment: function(ja) {\n            this._alignment = ha(ja);\n            return this;\n        },\n        getOppositePosition: function() {\n            return ia.OPPOSITE[this.getPosition()];\n        },\n        invalidate: function() {\n            this._valid = false;\n            return this;\n        },\n        getPosition: function() {\n            return (this._position || \"above\");\n        },\n        getAlignment: function() {\n            return (this._alignment || \"left\");\n        },\n        getOffsetX: function() {\n            var ja = (this._offsetX || 0);\n            if (!this.isVertical()) {\n                if ((this._default._position !== this._position)) {\n                    ja *= -1;\n                };\n            }\n             else if ((this._default._alignment !== this._alignment)) {\n                ja *= -1;\n            }\n        ;\n            return ja;\n        },\n        getOffsetY: function() {\n            var ja = (this._offsetY || 0);\n            if ((this.isVertical() && (this._default._position !== this._position))) {\n                ja *= -1;\n            };\n            return ja;\n        },\n        getClassName: function() {\n            var ja = this.getAlignment(), ka = this.getPosition();\n            if ((ka === \"below\")) {\n                if ((ja === \"left\")) {\n                    return \"uiContextualLayerBelowLeft\";\n                }\n                 else if ((ja === \"right\")) {\n                    return \"uiContextualLayerBelowRight\";\n                }\n                 else return \"uiContextualLayerBelowCenter\"\n                \n            ;\n            }\n             else if ((ka === \"above\")) {\n                if ((ja === \"left\")) {\n                    return \"uiContextualLayerAboveLeft\";\n                }\n                 else if ((ja === \"right\")) {\n                    return \"uiContextualLayerAboveRight\";\n                }\n                 else return \"uiContextualLayerAboveCenter\"\n                \n            ;\n            }\n             else if ((ka === \"left\")) {\n                return \"uiContextualLayerLeft\";\n            }\n             else return \"uiContextualLayerRight\"\n            \n            \n        ;\n        },\n        isValid: function() {\n            return this._valid;\n        },\n        isVertical: function() {\n            return ((this.getPosition() === \"above\") || (this.getPosition() === \"below\"));\n        },\n        reset: function(ja, ka) {\n            x(this, this._default);\n            return this;\n        },\n        setDefaultPosition: function(ja) {\n            var ka = this._default._position;\n            this._default._position = ga(ja);\n            return (ka !== ja);\n        },\n        setDefaultAlignment: function(ja) {\n            var ka = this._default._alignment;\n            this._default._alignment = ha(ja);\n            return (ka !== ja);\n        },\n        setDefaultOffsetX: function(ja) {\n            var ka = this._default._offsetX;\n            this._default._offsetX = ja;\n            return (ka !== ja);\n        },\n        setDefaultOffsetY: function(ja) {\n            var ka = this._default._offsetY;\n            this._default._offsetY = ja;\n            return (ka !== ja);\n        }\n    });\n    e.exports = ea;\n});\n__d(\"ContextualLayerDimensions\", [\"DOM\",\"Locale\",\"Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"Rect\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"getOverlayZIndex\"), n = {\n        getViewportRect: function(o) {\n            var p = l(\"globalContainer\"), q = o.getContext(), r = (((p && g.contains(p, q))) || (m(q) < 300)), s = i.getViewportBounds();\n            if (r) {\n                s.t += k.getTop();\n                if (h.isRTL()) {\n                    s.r -= k.getLeft();\n                    s.l += k.getRight();\n                }\n                 else {\n                    s.r -= k.getRight();\n                    s.l += k.getLeft();\n                }\n            ;\n            }\n        ;\n            return s;\n        },\n        getLayerRect: function(o, p) {\n            var q = o.getContextBounds(\"viewport\"), r = o.simulateOrientation(p, function() {\n                return j.getElementDimensions(o.getContent());\n            }), s = (q.t + p.getOffsetY());\n            if ((p.getPosition() === \"above\")) {\n                s -= r.y;\n            }\n             else if ((p.getPosition() === \"below\")) {\n                s += (q.b - q.t);\n            }\n        ;\n            var t = (q.l + p.getOffsetX()), u = (q.r - q.l);\n            if (p.isVertical()) {\n                var v = p.getAlignment();\n                if ((v === \"center\")) {\n                    t += (((u - r.x)) / 2);\n                }\n                 else if ((((v === \"right\")) !== h.isRTL())) {\n                    t += (u - r.x);\n                }\n            ;\n            }\n             else if ((((p.getPosition() === \"right\")) !== h.isRTL())) {\n                t += u;\n            }\n             else t -= r.x;\n            \n        ;\n            return new i(s, (t + r.x), (s + r.y), t, \"viewport\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"ContextualLayerAutoFlip\", [\"ContextualLayerDimensions\",\"DOM\",\"Vector\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualLayerDimensions\"), h = b(\"DOM\"), i = b(\"Vector\"), j = b(\"arrayContains\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"adjust\", this._adjustOrientation.bind(this));\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            };\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            };\n        },\n        _adjustOrientation: function(m, n) {\n            var o = this._getValidPositions(n);\n            if (!o.length) {\n                n.invalidate();\n                return;\n            }\n        ;\n            var p = g.getViewportRect(this._layer), q = this._getValidAlignments(n), r, s, t;\n            for (r = 0; (r < q.length); r++) {\n                n.setAlignment(q[r]);\n                for (s = 0; (s < o.length); s++) {\n                    n.setPosition(o[s]);\n                    t = g.getLayerRect(this._layer, n);\n                    if (p.contains(t)) {\n                        return\n                    };\n                };\n            };\n            n.setPosition((j(o, \"below\") ? \"below\" : o[0]));\n            for (r = 0; (r < q.length); r++) {\n                n.setAlignment(q[r]);\n                t = g.getLayerRect(this._layer, n);\n                if (((t.l >= p.l) && (t.r <= p.r))) {\n                    return\n                };\n            };\n            n.setAlignment(q[0]);\n        },\n        _getValidPositions: function(m) {\n            var n = [m.getPosition(),m.getOppositePosition(),], o = this._layer.getContextScrollParent();\n            if (((o === window) || (o === h.getDocumentScrollElement()))) {\n                return n\n            };\n            var p = this._layer.getContext(), q = i.getElementPosition(o, \"viewport\").y, r = i.getElementPosition(p, \"viewport\").y;\n            if (m.isVertical()) {\n                return n.filter(function(t) {\n                    if ((t === \"above\")) {\n                        return (r >= q);\n                    }\n                     else {\n                        var u = (q + o.offsetHeight), v = (r + p.offsetHeight);\n                        return (v <= u);\n                    }\n                ;\n                });\n            }\n             else {\n                var s = (q + o.offsetHeight);\n                if (((r >= q) && ((r + p.offsetHeight) <= s))) {\n                    return n;\n                }\n                 else return []\n            ;\n            }\n        ;\n        },\n        _getValidAlignments: function(m) {\n            var n = [\"left\",\"right\",\"center\",], o = m.getAlignment(), p = n.indexOf(o);\n            if ((p > 0)) {\n                n.splice(p, 1);\n                n.unshift(o);\n            }\n        ;\n            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualLayerHideOnScroll\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"contextchange\", this._handleContextChange.bind(this)),this._layer.subscribe(\"show\", this.attach.bind(this)),this._layer.subscribe(\"hide\", this.detach.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return\n            };\n            var j = this._layer.getContextScrollParent();\n            if ((j === window)) {\n                return\n            };\n            this._listener = g.listen(j, \"scroll\", this._layer.hide.bind(this._layer));\n        },\n        detach: function() {\n            (this._listener && this._listener.remove());\n            this._listener = null;\n        },\n        _handleContextChange: function() {\n            this.detach();\n            if (this._layer.isShown()) {\n                this.attach();\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"ContextualTypeaheadView\", [\"BucketedTypeaheadView\",\"CSS\",\"Class\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"ContextualLayerHideOnScroll\",\"DOM\",\"DOMDimensions\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"CSS\"), i = b(\"Class\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerAutoFlip\"), l = b(\"ContextualLayerHideOnScroll\"), m = b(\"DOM\"), n = b(\"DOMDimensions\"), o = b(\"Style\"), p = b(\"copyProperties\");\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n    };\n    i.extend(q, g);\n    p(q.prototype, {\n        init: function() {\n            this.initializeLayer();\n            this.parent.init();\n        },\n        initializeLayer: function() {\n            this.context = this.getContext();\n            this.wrapper = m.create(\"div\");\n            m.appendContent(this.wrapper, this.element);\n            h.addClass(this.element, \"uiContextualTypeaheadView\");\n            this.layer = new j({\n                context: this.context,\n                position: \"below\",\n                alignment: this.alignment,\n                causalElement: this.causalElement,\n                permanent: true\n            }, this.wrapper);\n            this.layer.enableBehavior(l);\n            if ((o.isFixed(this.context) || this.autoflip)) {\n                this.layer.enableBehavior(k);\n            };\n            this.subscribe(\"render\", this.renderLayer.bind(this));\n        },\n        show: function() {\n            if (this.minWidth) {\n                o.set(this.wrapper, \"min-width\", (this.minWidth + \"px\"));\n            }\n             else if (this.width) {\n                o.set(this.wrapper, \"width\", (this.width + \"px\"));\n            }\n             else o.set(this.wrapper, \"width\", (n.getElementDimensions(this.context).width + \"px\"));\n            \n        ;\n            var r = this.parent.show();\n            this.layer.show();\n            return r;\n        },\n        hide: function() {\n            this.layer.hide();\n            return this.parent.hide();\n        },\n        renderLayer: function() {\n            if (!this.isVisible()) {\n                return\n            };\n            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\n        ;\n        },\n        clearText: function() {\n            this.layer.getCausalElement().value = \"\";\n        },\n        getContext: function() {\n            return this.element.parentNode;\n        }\n    });\n    e.exports = q;\n});\n__d(\"DialogHideOnSuccess\", [\"copyProperties\",\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"CSS\"), i = b(\"cx\");\n    function j(k) {\n        this._layer = k;\n    };\n    g(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, event) {\n            if (h.hasClass(event.getTarget(), \"-cx-PRIVATE-uiDialog__form\")) {\n                this._layer.hide();\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"DoublyLinkedListMap\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h() {\n        this._head = null;\n        this._tail = null;\n        this._nodes = {\n        };\n        this._nodeCount = 0;\n    };\n    g(h.prototype, {\n        get: function(i) {\n            return (this._nodes[i] ? this._nodes[i].data : null);\n        },\n        getIndex: function(i) {\n            for (var j = this._head, k = 0; j; j = j.next, k++) {\n                if ((j.key === i)) {\n                    return k\n                };\n            };\n            return null;\n        },\n        _insert: function(i, j, k, l) {\n            ((k && !this._nodes[k]) && (k = null));\n            var m = (((k && this._nodes[k])) || ((l ? this._head : this._tail))), n = {\n                data: j,\n                key: i,\n                next: null,\n                prev: null\n            };\n            if (m) {\n                this.remove(i);\n                if (l) {\n                    n.prev = m.prev;\n                    (m.prev && (m.prev.next = n));\n                    m.prev = n;\n                    n.next = m;\n                }\n                 else {\n                    n.next = m.next;\n                    (m.next && (m.next.prev = n));\n                    m.next = n;\n                    n.prev = m;\n                }\n            ;\n            }\n        ;\n            ((n.prev === null) && (this._head = n));\n            ((n.next === null) && (this._tail = n));\n            this._nodes[i] = n;\n            this._nodeCount++;\n            return this;\n        },\n        insertBefore: function(i, j, k) {\n            return this._insert(i, j, k, true);\n        },\n        insertAfter: function(i, j, k) {\n            return this._insert(i, j, k, false);\n        },\n        prepend: function(i, j) {\n            return this.insertBefore(i, j, (this._head && this._head.key));\n        },\n        append: function(i, j) {\n            return this.insertAfter(i, j, (this._tail && this._tail.key));\n        },\n        remove: function(i) {\n            var j = this._nodes[i];\n            if (j) {\n                var k = j.next, l = j.prev;\n                (k && (k.prev = l));\n                (l && (l.next = k));\n                ((this._head === j) && (this._head = k));\n                ((this._tail === j) && (this._tail = l));\n                delete this._nodes[i];\n                this._nodeCount--;\n            }\n        ;\n            return this;\n        },\n        find: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                if (i(j.data)) {\n                    return j.key\n                };\n            };\n            return null;\n        },\n        reduce: function(i, j) {\n            for (var k = this._head; k; k = k.next) {\n                j = i(k.data, j);;\n            };\n            return j;\n        },\n        exists: function(i) {\n            return !!this._nodes[i];\n        },\n        isEmpty: function() {\n            return !this._head;\n        },\n        reset: function() {\n            this._head = null;\n            this._tail = null;\n            this._nodes = {\n            };\n            this._nodeCount = 0;\n        },\n        map: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                i(j.data);;\n            };\n        },\n        getCount: function() {\n            return this._nodeCount;\n        },\n        getHead: function() {\n            return (this._head && this._head.data);\n        },\n        getTail: function() {\n            return (this._tail && this._tail.data);\n        },\n        getNext: function(i) {\n            var j = this._nodes[i];\n            if ((j && j.next)) {\n                return j.next.data\n            };\n            return null;\n        },\n        getPrev: function(i) {\n            var j = this._nodes[i];\n            if ((j && j.prev)) {\n                return j.prev.data\n            };\n            return null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"MenuDeprecated\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"Parent\"), o = b(\"Style\"), p = b(\"UserAgent\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\"), s = \"menu:mouseover\", t = null;\n    function u(ea) {\n        if (i.hasClass(ea, \"uiMenuContainer\")) {\n            return ea\n        };\n        return n.byClass(ea, \"uiMenu\");\n    };\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n    function w(ea) {\n        if (document.activeElement) {\n            var fa = v(document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n        return -1;\n    };\n    function x(ea) {\n        return k.find(ea, \"a.itemAnchor\");\n    };\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n    function z(ea) {\n        return (!i.hasClass(ea, \"disabled\") && (o.get(ea, \"display\") !== \"none\"));\n    };\n    function aa(event) {\n        var ea = document.activeElement;\n        if (((!ea || !n.byClass(ea, \"uiMenu\")) || !k.isInputNode(ea))) {\n            var fa = v(event.getTarget());\n            (fa && da.focusItem(fa));\n        }\n    ;\n    };\n    function ba(ea) {\n        (p.firefox() && x(ea).blur());\n        da.inform(\"select\", {\n            menu: u(ea),\n            item: ea\n        });\n    };\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(event) {\n            var fa = v(event.getTarget());\n            if ((fa && z(fa))) {\n                ba(fa);\n                var ga = x(fa), ha = ga.href, ia = ga.getAttribute(\"rel\");\n                return (((ia && (ia !== \"ignore\"))) || ((ha && (ha.charAt((ha.length - 1)) !== \"#\"))));\n            }\n        ;\n        };\n        ea.keydown = function(event) {\n            var fa = event.getTarget();\n            if (event.getModifiers().any) {\n                return\n            };\n            if ((!t || k.isInputNode(fa))) {\n                return\n            };\n            var ga = g.getKeyCode(event), ha;\n            switch (ga) {\n              case m.UP:\n            \n              case m.DOWN:\n                var ia = da.getEnabledItems(t);\n                ha = w(ia);\n                da.focusItem(ia[(ha + (((ga === m.UP) ? -1 : 1)))]);\n                return false;\n              case m.SPACE:\n                var ja = v(fa);\n                if (ja) {\n                    ba(ja);\n                    event.prevent();\n                }\n            ;\n                break;\n              default:\n                var ka = String.fromCharCode(ga).toLowerCase(), la = da.getEnabledItems(t);\n                ha = w(la);\n                var ma = ha, na = la.length;\n                while ((((~ha && ((ma = (++ma % na)) !== ha))) || ((!~ha && (++ma < na))))) {\n                    var oa = da.getItemLabel(la[ma]);\n                    if ((oa && (oa.charAt(0).toLowerCase() === ka))) {\n                        da.focusItem(la[ma]);\n                        return false;\n                    }\n                ;\n                };\n            };\n        };\n        g.listen(document.body, ea);\n    }, da = q(new h(), {\n        focusItem: function(ea) {\n            if ((ea && z(ea))) {\n                this._removeSelected(u(ea));\n                i.addClass(ea, \"selected\");\n                x(ea).focus();\n            }\n        ;\n        },\n        getEnabledItems: function(ea) {\n            return da.getItems(ea).filter(z);\n        },\n        getCheckedItems: function(ea) {\n            return da.getItems(ea).filter(y);\n        },\n        getItems: function(ea) {\n            return k.scry(ea, \"li.uiMenuItem\");\n        },\n        getItemLabel: function(ea) {\n            return (ea.getAttribute(\"data-label\", 2) || \"\");\n        },\n        isItemChecked: function(ea) {\n            return i.hasClass(ea, \"checked\");\n        },\n        autoregister: function(ea, fa, ga) {\n            ea.subscribe(\"show\", function() {\n                da.register(fa, ga);\n            });\n            ea.subscribe(\"hide\", function() {\n                da.unregister(fa);\n            });\n        },\n        register: function(ea, fa) {\n            ea = u(ea);\n            ca();\n            if (!j.get(ea, s)) {\n                j.set(ea, s, g.listen(ea, \"mouseover\", aa));\n            };\n            if ((fa !== false)) {\n                t = ea;\n            };\n        },\n        setItemEnabled: function(ea, fa) {\n            if ((!fa && !k.scry(ea, \"span.disabledAnchor\")[0])) {\n                k.appendContent(ea, k.create(\"span\", {\n                    className: (k.find(ea, \"a\").className + \" disabledAnchor\")\n                }, l(x(ea).innerHTML)));\n            };\n            i.conditionClass(ea, \"disabled\", !fa);\n        },\n        toggleItem: function(ea) {\n            var fa = !da.isItemChecked(ea);\n            da.setItemChecked(ea, fa);\n        },\n        setItemChecked: function(ea, fa) {\n            i.conditionClass(ea, \"checked\", fa);\n            x(ea).setAttribute(\"aria-checked\", fa);\n        },\n        unregister: function(ea) {\n            ea = u(ea);\n            var fa = j.remove(ea, s);\n            (fa && fa.remove());\n            t = null;\n            this._removeSelected(ea);\n        },\n        _removeSelected: function(ea) {\n            da.getItems(ea).filter(function(fa) {\n                return i.hasClass(fa, \"selected\");\n            }).forEach(function(fa) {\n                i.removeClass(fa, \"selected\");\n            });\n        }\n    });\n    e.exports = da;\n});\n__d(\"coalesce\", [], function(a, b, c, d, e, f) {\n    function g() {\n        for (var h = 0; (h < arguments.length); ++h) {\n            if ((arguments[h] != null)) {\n                return arguments[h]\n            };\n        };\n        return null;\n    };\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"Event\",\"Parent\",\"Run\",\"Vector\",\"ViewportBounds\",\"coalesce\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"Parent\"), k = b(\"Run\"), l = b(\"Vector\"), m = b(\"ViewportBounds\"), n = b(\"coalesce\"), o = b(\"copyProperties\"), p = b(\"queryThenMutateDOM\"), q = [], r, s = 0, t = [], u, v, w, x, y;\n    function z() {\n        q.forEach(function(fa) {\n            fa.remove();\n        });\n        if (v) {\n            v.remove();\n            u.remove();\n            r.unsubscribe();\n            v = u = r = null;\n        }\n    ;\n        s = 0;\n        q.length = 0;\n    };\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\n        }\n    ;\n        t.length = 0;\n        w = l.getScrollPosition().y;\n        x = l.getViewportDimensions().y;\n        y = m.getTop();\n        for (var fa = 0; (fa < q.length); ++fa) {\n            var ga = q[fa];\n            if (isNaN(ga.elementHeight)) {\n                t.push(fa);\n            };\n            ga.elementHeight = l.getElementDimensions(ga.element).y;\n            ga.elementPos = l.getElementPosition(ga.element);\n            ga.hidden = j.byClass(ga.element, \"hidden_elem\");\n            if (ga.scrollArea) {\n                ga.scrollAreaHeight = l.getElementDimensions(ga.scrollArea).y;\n                ga.scrollAreaY = l.getElementPosition(ga.scrollArea).y;\n            }\n        ;\n        };\n        s = fa;\n    };\n    function ba() {\n        for (var fa = (Math.min(q.length, s) - 1); (fa >= 0); --fa) {\n            var ga = q[fa];\n            if (((!ga.elementPos || ga.removed) || ga.hidden)) {\n                q.splice(fa, 1);\n                continue;\n            }\n        ;\n            var ha = ((w + x) + ga.buffer), ia = false;\n            if ((ha > ga.elementPos.y)) {\n                var ja = (!ga.strict || ((((w + y) - ga.buffer) < ((ga.elementPos.y + ga.elementHeight)))));\n                ia = ja;\n                if ((ia && ga.scrollArea)) {\n                    var ka = ((ga.scrollAreaY + ga.scrollAreaHeight) + ga.buffer);\n                    ia = (((ga.elementPos.y > (ga.scrollAreaY - ga.buffer))) && ((ga.elementPos.y < ka)));\n                }\n            ;\n            }\n        ;\n            if ((ga.inverse ? !ia : ia)) {\n                ga.remove();\n                ga.handler((t.indexOf(fa) !== -1));\n            }\n        ;\n        };\n    };\n    function ca() {\n        da();\n        if (q.length) {\n            return\n        };\n        v = i.listen(window, \"scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\n    };\n    function ea(fa, ga, ha, ia, ja, ka) {\n        this.element = fa;\n        this.handler = ga;\n        this.strict = ha;\n        this.buffer = n(ia, 300);\n        this.inverse = n(ja, false);\n        this.scrollArea = (ka || null);\n        if (this.scrollArea) {\n            this.scrollAreaListener = i.listen(h.find(ka, \".uiScrollableAreaWrap\"), \"scroll\", this.checkBuffer);\n        };\n        if ((q.length === 0)) {\n            k.onLeave(z);\n        };\n        ca();\n        q.push(this);\n    };\n    o(ea, {\n        checkBuffer: da\n    });\n    o(ea.prototype, {\n        remove: function() {\n            this.removed = true;\n            if (this.scrollAreaListener) {\n                this.scrollAreaListener.remove();\n            };\n        },\n        reset: function() {\n            this.elementHeight = null;\n            this.removed = false;\n            ((q.indexOf(this) === -1) && q.push(this));\n            ca();\n        },\n        setBuffer: function(fa) {\n            this.buffer = fa;\n            da();\n        },\n        checkBuffer: function() {\n            da();\n        }\n    });\n    e.exports = ea;\n});\n__d(\"PrivacyConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FRIENDS_PLUS_GAMER_FRIENDS: 128,\n        FRIENDS_MINUS_ACQUAINTANCES: 127,\n        FACEBOOK_EMPLOYEES: 112,\n        CUSTOM: 111,\n        EVERYONE: 80,\n        NETWORKS_FRIENDS_OF_FRIENDS: 60,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SELF: 10,\n        NOBODY: 0\n    }, h = {\n        EVERYONE: 80,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SOME_FRIENDS: 30,\n        SELF: 10,\n        NO_FRIENDS: 0\n    }, i = {\n        NONE: 0,\n        TAGGEES: 1,\n        FRIENDS_OF_TAGGEES: 2\n    }, j = {\n        BaseValue: g,\n        FriendsValue: h,\n        TagExpansion: i\n    };\n    e.exports = j;\n});\n__d(\"Toggler\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualThing\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"TabbableElements\",\"arrayContains\",\"cx\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"ge\",\"getContextualParent\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualThing\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"Dialog\"), n = b(\"DOM\"), o = b(\"DOMQuery\"), p = b(\"Focus\"), q = b(\"Parent\"), r = b(\"TabbableElements\"), s = b(\"arrayContains\"), t = b(\"cx\"), u = b(\"copyProperties\"), v = b(\"createArrayFrom\"), w = b(\"emptyFunction\"), x = b(\"ge\"), y = b(\"getContextualParent\"), z = b(\"getObjectValues\"), aa = [], ba;\n    function ca() {\n        ca = w;\n        g.listen(document.documentElement, \"click\", function(event) {\n            var ga = event.getTarget();\n            aa.forEach(function(ha) {\n                ha.clickedTarget = ga;\n                ((((((ha.active && !ha.sticky) && !j.containsIncludingLayers(ha.getActive(), ga)) && !ha.inTargetFlyout(ga)) && ha.inActiveDialog()) && !ha.isIgnoredByModalLayer(ga)) && ha.hide());\n            });\n        }, g.Priority.URGENT);\n    };\n    var da = function() {\n        this.active = null;\n        this.togglers = {\n        };\n        this.setSticky(false);\n        aa.push(this);\n        this.subscribe([\"show\",\"hide\",], da.inform.bind(da));\n        return ca();\n    };\n    u(da.prototype, i, {\n        show: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if ((ga !== ia)) {\n                (ia && ha.hide());\n                ha.active = ga;\n                k.addClass(ga, \"openToggler\");\n                var ja = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n                if (((ja.length > 0) && ja[0].getAttribute(\"data-target\"))) {\n                    k.removeClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                };\n                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = (r.find(ka)[0] || ka);\n                    if ((la.tabIndex == -1)) {\n                        la.tabIndex = 0;\n                    };\n                    p.setWithoutOutline(la);\n                }\n            ;\n                n.appendContent(ga, ha.getToggler(\"next\"));\n                n.prependContent(ga, ha.getToggler(\"prev\"));\n                ha.inform(\"show\", ha);\n            }\n        ;\n        },\n        hide: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if ((ia && ((!ga || (ga === ia))))) {\n                k.removeClass(ia, \"openToggler\");\n                var ja = n.scry(ia, \"a[rel=\\\"toggle\\\"]\");\n                if (((ja.length > 0) && ja[0].getAttribute(\"data-target\"))) {\n                    k.addClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                };\n                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\n            }\n        ;\n        },\n        toggle: function(ga) {\n            var ha = ea(this, ga);\n            if ((ha.active === ga)) {\n                ha.hide();\n            }\n             else ha.show(ga);\n        ;\n        },\n        getActive: function() {\n            return ea(this).active;\n        },\n        isShown: function() {\n            return (ea(this).active && k.hasClass(ea(this).active, \"openToggler\"));\n        },\n        inTargetFlyout: function(ga) {\n            var ha = fa(this.getActive());\n            return (ha && j.containsIncludingLayers(ha, ga));\n        },\n        inActiveDialog: function() {\n            var ga = m.getCurrent();\n            return (!ga || n.contains(ga.getRoot(), this.getActive()));\n        },\n        isIgnoredByModalLayer: function(ga) {\n            return (q.byClass(ga, \"-cx-PRIVATE-ModalLayer__root\") && !q.byClass(this.getActive(), \"-cx-PRIVATE-ModalLayer__root\"));\n        },\n        getToggler: function(ga) {\n            var ha = ea(this);\n            if (!ha.togglers[ga]) {\n                ha.togglers[ga] = n.create(\"button\", {\n                    className: \"hideToggler\",\n                    onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        (ia && ia.focus());\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\n            }\n        ;\n            return this.togglers[ga];\n        },\n        setSticky: function(ga) {\n            var ha = ea(this);\n            ga = (ga !== false);\n            if ((ga !== ha.sticky)) {\n                ha.sticky = ga;\n                if (ga) {\n                    (ha._pt && ha._pt.unsubscribe());\n                }\n                 else ha._pt = h.subscribe(\"pre_page_transition\", ha.hide.bind(ha, null));\n            ;\n            }\n        ;\n            return ha;\n        }\n    });\n    u(da, da.prototype);\n    u(da, {\n        bootstrap: function(ga) {\n            var ha = ga.parentNode;\n            da.getInstance(ha).toggle(ha);\n        },\n        createInstance: function(ga) {\n            var ha = new da().setSticky(true);\n            l.set(ga, \"toggler\", ha);\n            return ha;\n        },\n        destroyInstance: function(ga) {\n            l.remove(ga, \"toggler\");\n        },\n        getInstance: function(ga) {\n            while (ga) {\n                var ha = l.get(ga, \"toggler\");\n                if (ha) {\n                    return ha\n                };\n                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga)\n                };\n                ga = y(ga);\n            };\n            return (ba = (ba || new da()));\n        },\n        listen: function(ga, ha, ia) {\n            return da.subscribe(v(ga), function(ja, ka) {\n                if ((ka.getActive() === ha)) {\n                    return ia(ja, ka)\n                };\n            });\n        },\n        subscribe: (function(ga) {\n            return function(ha, ia) {\n                ha = v(ha);\n                if (s(ha, \"show\")) {\n                    aa.forEach(function(ja) {\n                        if (ja.getActive()) {\n                            ia.curry(\"show\", ja).defer();\n                        };\n                    });\n                };\n                return ga(ha, ia);\n            };\n        })(da.subscribe.bind(da))\n    });\n    function ea(ga, ha) {\n        if ((ga instanceof da)) {\n            return ga\n        };\n        return da.getInstance(ha);\n    };\n    function fa(ga) {\n        var ha = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n        if (((ha.length > 0) && ha[0].getAttribute(\"data-target\"))) {\n            return x(ha[0].getAttribute(\"data-target\"))\n        };\n    };\n    e.exports = da;\n});\n__d(\"Tooltip\", [\"Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"ContextualLayer\"), j = b(\"ContextualLayerAutoFlip\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Style\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"cx\"), s = b(\"tx\"), t = null, u = null, v = null, w = [], x;\n    function y() {\n        if (!u) {\n            v = m.create(\"div\", {\n                className: \"tooltipContent\"\n            });\n            var fa = m.create(\"i\", {\n                className: \"arrow\"\n            }), ga = m.create(\"div\", {\n                className: \"uiTooltipX\"\n            }, [v,fa,]);\n            u = new i({\n            }, ga);\n            u.shouldSetARIAProperties(false);\n            u.enableBehavior(j);\n        }\n    ;\n    };\n    function z(fa) {\n        return p({\n            content: fa.getAttribute(\"aria-label\"),\n            position: (fa.getAttribute(\"data-tooltip-position\") || \"above\"),\n            alignH: (fa.getAttribute(\"data-tooltip-alignh\") || \"left\")\n        }, l.get(fa, \"tooltip\"));\n    };\n    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            content: (ga.content || ha.content),\n            position: (ga.position || ha.position),\n            alignH: (ga.alignH || ha.alignH),\n            suspend: (ga.suspend || ha.suspend)\n        });\n        fa.setAttribute(\"data-hover\", \"tooltip\");\n    };\n    function ba(fa, ga) {\n        ea.set(fa, \"Loading...\");\n        new h(ga).setHandler(function(ha) {\n            ea.set(fa, ha.getPayload());\n        }).setErrorHandler(q).send();\n    };\n    var ca = /(\\r\\n|[\\r\\n])/;\n    function da(fa) {\n        return fa.split(ca).map(function(ga) {\n            return (ca.test(ga) ? m.create(\"br\") : ga);\n        });\n    };\n    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return\n            };\n            if (((fa !== t) && !fa.getAttribute(\"data-tooltip-suspend\"))) {\n                var ha = fa.getAttribute(\"data-tooltip-uri\");\n                if (ha) {\n                    fa.removeAttribute(\"data-tooltip-uri\");\n                    ba(fa, ha);\n                }\n            ;\n                ea.show(fa);\n            }\n        ;\n        },\n        remove: function(fa) {\n            l.remove(fa, \"tooltip\");\n            fa.removeAttribute(\"data-hover\");\n            fa.removeAttribute(\"data-tooltip-position\");\n            fa.removeAttribute(\"data-tooltip-alignh\");\n            ((fa === t) && ea.hide());\n        },\n        suspend: function(fa) {\n            fa.setAttribute(\"data-tooltip-suspend\", true);\n            ((fa === t) && ea.hide());\n        },\n        unsuspend: function(fa) {\n            fa.removeAttribute(\"data-tooltip-suspend\");\n        },\n        hide: function() {\n            if (t) {\n                u.hide();\n                t = null;\n                while (w.length) {\n                    w.pop().remove();;\n                };\n            }\n        ;\n        },\n        set: function(fa, ga, ha, ia) {\n            if ((ha || ia)) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\n                });\n            };\n            if ((ga instanceof o)) {\n                if ((fa === t)) {\n                    ba(fa, ga);\n                }\n                 else fa.setAttribute(\"data-tooltip-uri\", ga);\n            ;\n            }\n             else {\n                if ((typeof ga !== \"string\")) {\n                    ga = m.create(\"div\", {\n                    }, ga);\n                    fa.setAttribute(\"aria-label\", m.getText(ga));\n                }\n                 else fa.setAttribute(\"aria-label\", ga);\n            ;\n                aa(fa, {\n                    content: ga\n                });\n                ((fa === t) && ea.show(fa));\n            }\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.content) {\n                return\n            };\n            var ha = 0, ia = 0;\n            if (((ga.position === \"left\") || (ga.position === \"right\"))) {\n                x = (x || k.hasClass(document.body, \"-cx-PUBLIC-hasLitestand__body\"));\n                var ja = (x ? 28 : 20);\n                ia = (((fa.offsetHeight - ja)) / 2);\n            }\n             else if ((ga.alignH !== \"center\")) {\n                var ka = fa.offsetWidth;\n                if ((ka < 18)) {\n                    ha = ((((ka - 18)) / 2) * (((ga.alignH === \"right\") ? -1 : 1)));\n                };\n            }\n            \n        ;\n            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if ((typeof ga.content === \"string\")) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.content)), ma = m.create(\"div\", {\n                    className: \"tooltipText\"\n                }, la);\n                m.setContent(v, ma);\n                u.show();\n                var na;\n                if (ma.getClientRects) {\n                    var oa = ma.getClientRects()[0];\n                    if (oa) {\n                        na = Math.round((oa.right - oa.left));\n                    };\n                }\n            ;\n                if (!na) {\n                    na = ma.offsetWidth;\n                };\n                if ((na < la.offsetWidth)) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.content);\n                u.show();\n            }\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                };\n            };\n            w.push(g.listen(document.documentElement, \"mouseover\", pa), g.listen(document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if ((qa !== window)) {\n                w.push(g.listen(qa, \"scroll\", ea.hide));\n            };\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"Event\",\"Arbiter\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"HTML\",\"Keys\",\"KeyStatus\",\"MenuDeprecated\",\"Parent\",\"Style\",\"Toggler\",\"Tooltip\",\"Vector\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Button\"), j = b(\"ContextualLayer\"), k = b(\"CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Focus\"), o = b(\"HTML\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"MenuDeprecated\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"Toggler\"), v = b(\"Tooltip\"), w = b(\"Vector\"), x = b(\"arrayContains\"), y = b(\"copyProperties\"), z = b(\"emptyFunction\"), aa, ba, ca = [], da;\n    function ea(pa) {\n        return s.byClass(pa, \"uiSelector\");\n    };\n    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\n    };\n    function ga() {\n        if (!ba) {\n            ba = new j({\n                position: \"below\"\n            }, m.create(\"div\"));\n            k.addClass(ba.getRoot(), \"uiSelectorContextualLayer\");\n        }\n    ;\n        return ba;\n    };\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n    function ia(pa) {\n        return m.find(pa, \"div.uiSelectorMenuWrapper\");\n    };\n    function ja() {\n        ja = z;\n        r.subscribe(\"select\", function(pa, qa) {\n            if (((!aa || !qa) || (qa.menu !== oa.getSelectorMenu(aa)))) {\n                return\n            };\n            var ra = ka(aa), sa = la(qa.item);\n            if (sa) {\n                var ta = aa, ua = oa.isOptionSelected(qa.item), va = oa.inform(\"select\", {\n                    selector: ta,\n                    option: qa.item,\n                    clone: da\n                });\n                if ((va === false)) {\n                    return\n                };\n                if ((ra || !ua)) {\n                    oa.setSelected(ta, oa.getOptionValue(qa.item), !ua);\n                    oa.inform(\"toggle\", {\n                        selector: ta,\n                        option: qa.item\n                    });\n                    oa.inform(\"change\", {\n                        selector: ta\n                    });\n                    h.inform(\"Form/change\", {\n                        node: ta\n                    });\n                    if (ma(ta)) {\n                        l.set(ta, \"dirty\", true);\n                    };\n                }\n            ;\n            }\n        ;\n            if ((!ra || !sa)) {\n                (aa && oa.toggle(aa));\n            };\n        });\n    };\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(event) {\n                var qa = event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return\n                };\n                switch (g.getKeyCode(event)) {\n                  case p.DOWN:\n                \n                  case p.SPACE:\n                \n                  case p.UP:\n                    if (fa(qa)) {\n                        var ra = ea(qa);\n                        oa.toggle(ra);\n                        return false;\n                    }\n                ;\n                    break;\n                  case p.ESC:\n                    if (aa) {\n                        var sa = oa.getSelectorButton(aa);\n                        oa.toggle(aa);\n                        (sa && n.set(sa));\n                        return false;\n                    }\n                ;\n                    break;\n                };\n            },\n            mouseover: function(event) {\n                var qa = s.byAttribute(event.getTarget(), \"ajaxify\");\n                if ((qa && k.hasClass(qa, \"uiSelectorButton\"))) {\n                    oa.loadMenu(ea(qa));\n                };\n            }\n        };\n        g.listen(document.body, pa);\n    };\n    u.subscribe([\"show\",\"hide\",], function(pa, qa) {\n        var ra = ea(qa.getActive());\n        if (ra) {\n            na();\n            ja();\n            var sa = oa.getSelectorButton(ra), ta = oa.getSelectorMenu(ra), ua = (pa === \"show\");\n            sa.setAttribute(\"aria-expanded\", (ua ? \"true\" : \"false\"));\n            if (ua) {\n                aa = ra;\n                if (k.hasClass(sa, \"uiButtonDisabled\")) {\n                    oa.setEnabled(ra, false);\n                    return false;\n                }\n            ;\n                ta = (ta || oa.loadMenu(ra));\n                var va = t.getScrollParent(ra), wa = ((va !== window) && (va !== m.getDocumentScrollElement()));\n                if ((wa || k.hasClass(ra, \"uiSelectorUseLayer\"))) {\n                    if (wa) {\n                        ca.push(g.listen(va, \"scroll\", function() {\n                            qa.hide();\n                        }));\n                    };\n                    da = m.create(\"div\", {\n                        className: ra.className\n                    });\n                    k.addClass(da, \"invisible_elem\");\n                    w.getElementDimensions(ra).setElementDimensions(da);\n                    m.replace(ra, da);\n                    var xa = k.hasClass(ra, \"uiSelectorRight\"), ya = k.hasClass(ra, \"uiSelectorBottomUp\");\n                    ga().setContext(da).setContent(ra).setPosition((ya ? \"above\" : \"below\")).setAlignment((xa ? \"right\" : \"left\")).show();\n                }\n            ;\n                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    };\n                    r.focusItem(za[0]);\n                }\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();;\n                    };\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\n                }\n            ;\n                (ta && r.unregister(ta));\n                if ((ma(ra) && l.get(ra, \"dirty\"))) {\n                    var ab = m.scry(ra, \"input.submitButton\")[0];\n                    (ab && ab.click());\n                    l.remove(ra, \"dirty\");\n                }\n            ;\n            }\n        ;\n            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform((ua ? \"open\" : \"close\"), {\n                selector: ra,\n                clone: da\n            });\n        }\n    ;\n    });\n    var oa = y(new h(), {\n        attachMenu: function(pa, qa, ra) {\n            pa = ea(pa);\n            if (pa) {\n                (aa && r.unregister(oa.getSelectorMenu(aa)));\n                m.setContent(ia(pa), qa);\n                (aa && r.register(oa.getSelectorMenu(pa)));\n                (da && ga().updatePosition());\n                if (ra) {\n                    var sa = pa.getAttribute(\"data-name\");\n                    (sa && ra.setAttribute(\"name\", sa));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\n                    };\n                    var ta = ha(pa);\n                    if (ta) {\n                        m.replace(ta, ra);\n                    }\n                     else m.insertAfter(pa.firstChild, ra);\n                ;\n                }\n            ;\n                return true;\n            }\n        ;\n        },\n        getOption: function(pa, qa) {\n            var ra = oa.getOptions(pa), sa = ra.length;\n            while (sa--) {\n                if ((qa === oa.getOptionValue(ra[sa]))) {\n                    return ra[sa]\n                };\n            };\n            return null;\n        },\n        getOptions: function(pa) {\n            var qa = r.getItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getEnabledOptions: function(pa) {\n            var qa = r.getEnabledItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getSelectedOptions: function(pa) {\n            return r.getCheckedItems(oa.getSelectorMenu(pa));\n        },\n        getOptionText: function(pa) {\n            return r.getItemLabel(pa);\n        },\n        getOptionValue: function(pa) {\n            var qa = ea(pa), ra = ha(qa), sa = oa.getOptions(qa).indexOf(pa);\n            return ((sa >= 0) ? ra.options[(sa + 1)].value : \"\");\n        },\n        getSelectorButton: function(pa) {\n            return m.find(pa, \"a.uiSelectorButton\");\n        },\n        getSelectorMenu: function(pa) {\n            return m.scry(pa, \"div.uiSelectorMenu\")[0];\n        },\n        getValue: function(pa) {\n            var qa = ha(pa);\n            if (!qa) {\n                return null\n            };\n            if (!ka(pa)) {\n                return qa.value\n            };\n            var ra = [], sa = qa.options;\n            for (var ta = 1, ua = sa.length; (ta < ua); ta++) {\n                if (sa[ta].selected) {\n                    ra.push(sa[ta].value);\n                };\n            };\n            return ra;\n        },\n        isOptionSelected: function(pa) {\n            return r.isItemChecked(pa);\n        },\n        listen: function(pa, qa, ra) {\n            return this.subscribe(qa, function(sa, ta) {\n                if ((ta.selector === pa)) {\n                    return ra(ta, sa)\n                };\n            });\n        },\n        loadMenu: function(pa) {\n            var qa = oa.getSelectorMenu(pa);\n            if (!qa) {\n                var ra = oa.getSelectorButton(pa), sa = ra.getAttribute(\"ajaxify\");\n                if (sa) {\n                    d([\"AsyncRequest\",], function(ua) {\n                        ua.bootstrap(sa, ra);\n                    });\n                    var ta = o(((((((\"\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\" + \"\\u003Cdiv class=\\\"uiMenu uiSelectorMenu loading\\\"\\u003E\") + \"\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\") + \"\\u003Cli\\u003E\\u003Cspan\\u003E\\u003C/span\\u003E\\u003C/li\\u003E\") + \"\\u003C/ul\\u003E\") + \"\\u003C/div\\u003E\") + \"\\u003C/div\\u003E\"));\n                    m.appendContent(ra.parentNode, ta);\n                    qa = oa.getSelectorMenu(pa);\n                    ra.removeAttribute(\"onmouseover\");\n                }\n            ;\n            }\n        ;\n            return qa;\n        },\n        setButtonLabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = parseInt(ra.getAttribute(\"data-length\"), 10);\n            qa = ((qa || ra.getAttribute(\"data-label\")) || \"\");\n            i.setLabel(ra, qa);\n            if ((typeof qa === \"string\")) {\n                k.conditionClass(ra, \"uiSelectorBigButtonLabel\", (qa.length > sa));\n                if ((sa && (qa.length > sa))) {\n                    ra.setAttribute(\"title\", qa);\n                }\n                 else ra.removeAttribute(\"title\");\n            ;\n            }\n        ;\n        },\n        setButtonTooltip: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            (sa && v.set(sa, ((qa || ra.getAttribute(\"data-tooltip\")) || \"\")));\n        },\n        updateButtonARIALabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            if (sa) {\n                var ta = ra.getAttribute(\"data-ariaprefix\");\n                if (ta) {\n                    ra.setAttribute(\"aria-label\", ((ta + \": \") + qa));\n                };\n            }\n        ;\n        },\n        setEnabled: function(pa, qa) {\n            if (((!qa && aa) && (ea(pa) === aa))) {\n                oa.toggle(pa);\n            };\n            i.setEnabled(oa.getSelectorButton(pa), qa);\n        },\n        setOptionEnabled: function(pa, qa) {\n            r.setItemEnabled(pa, qa);\n        },\n        setSelected: function(pa, qa, ra) {\n            ra = (ra !== false);\n            var sa = oa.getOption(pa, qa);\n            if (!sa) {\n                return\n            };\n            var ta = oa.isOptionSelected(sa);\n            if ((ra !== ta)) {\n                if ((!ka(pa) && !ta)) {\n                    var ua = oa.getSelectedOptions(pa)[0];\n                    (ua && r.toggleItem(ua));\n                }\n            ;\n                r.toggleItem(sa);\n            }\n        ;\n            oa.updateSelector(pa);\n        },\n        toggle: function(pa) {\n            u.toggle(m.scry(ea(pa), \"div.wrap\")[0]);\n        },\n        updateSelector: function(pa) {\n            var qa = oa.getOptions(pa), ra = oa.getSelectedOptions(pa), sa = ha(pa).options, ta = [], ua = [];\n            for (var va = 0, wa = qa.length; (va < wa); va++) {\n                var xa = x(ra, qa[va]);\n                sa[(va + 1)].selected = xa;\n                if (xa) {\n                    var ya = oa.getOptionText(qa[va]);\n                    ta.push(ya);\n                    ua.push((qa[va].getAttribute(\"data-tooltip\") || ya));\n                }\n            ;\n            };\n            sa[0].selected = !ra.length;\n            var za = k.hasClass(pa, \"uiSelectorDynamicLabel\"), ab = k.hasClass(pa, \"uiSelectorDynamicTooltip\");\n            if ((za || ab)) {\n                var bb = \"\";\n                if (ka(pa)) {\n                    var cb = oa.getSelectorButton(pa);\n                    bb = (cb.getAttribute(\"data-delimiter\") || \", \");\n                }\n            ;\n                ta = ta.join(bb);\n                ua = ua.join(bb);\n                if (za) {\n                    oa.setButtonLabel(pa, ta);\n                    oa.updateButtonARIALabel(pa, ta);\n                }\n            ;\n                (ab && oa.setButtonTooltip(pa, ua));\n            }\n        ;\n        }\n    });\n    e.exports = oa;\n});\n__d(\"SubscriptionsHandler\", [\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"copyProperties\"), i = g.create(\"subscriptions_handler\");\n    function j(k) {\n        this._name = (k || \"unnamed\");\n        this._subscriptions = [];\n    };\n    h(j.prototype, {\n        addSubscriptions: function() {\n            if (this._subscriptions) {\n                Array.prototype.push.apply(this._subscriptions, arguments);\n            }\n             else {\n                i.warn((this._name + \".subscribe_while_released\"));\n                for (var k = 0, l = arguments.length; (k < l); k++) {\n                    this._unsubscribe(arguments[k]);;\n                };\n            }\n        ;\n        },\n        engage: function() {\n            this._subscriptions = (this._subscriptions || []);\n        },\n        release: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(this._unsubscribe.bind(this));\n            };\n            this._subscriptions = null;\n        },\n        _unsubscribe: function(k) {\n            if (k.remove) {\n                k.remove();\n            }\n             else if (k.reset) {\n                k.reset();\n            }\n             else if (k.unsubscribe) {\n                k.unsubscribe();\n            }\n             else i.error((this._name + \".invalid\"), k);\n            \n            \n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"Typeahead\", [\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"DataStore\",\"Event\",\"Parent\",\"Run\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"BehaviorsMixin\"), i = b(\"DOM\"), j = b(\"DataStore\"), k = b(\"Event\"), l = b(\"Parent\"), m = b(\"Run\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\"), p = b(\"ge\");\n    function q(r, s, t, u) {\n        this.args = {\n            data: r,\n            view: s,\n            core: t\n        };\n        j.set(u, \"Typeahead\", this);\n        this.element = u;\n    };\n    q.getInstance = function(r) {\n        var s = l.byClass(r, \"uiTypeahead\");\n        return (s ? j.get(s, \"Typeahead\") : null);\n    };\n    n(q.prototype, g, h, {\n        init: function(r) {\n            this.init = o;\n            this.getCore();\n            this.getView().setAccessibilityControlElement(this.getCore().getElement());\n            this.proxyEvents();\n            this.initBehaviors((r || []));\n            this.inform(\"init\", this);\n            this.data.bootstrap();\n            this.core.focus();\n        },\n        getData: function() {\n            if (!this.data) {\n                var r = this.args.data;\n                this.data = r;\n                this.data.init();\n            }\n        ;\n            return this.data;\n        },\n        getView: function() {\n            if (!this.view) {\n                var r = this.args.view, s = (r.node || p(r.node_id));\n                if (!s) {\n                    s = i.create(\"div\", {\n                        className: \"uiTypeaheadView\"\n                    });\n                    i.appendContent(this.element, s);\n                }\n            ;\n                if ((typeof r.ctor === \"string\")) {\n                    this.view = new window[r.ctor](s, (r.options || {\n                    }));\n                }\n                 else this.view = new r.ctor(s, (r.options || {\n                }));\n            ;\n                this.view.init();\n                this.view.setTypeahead(this.element);\n            }\n        ;\n            return this.view;\n        },\n        getCore: function() {\n            if (!this.core) {\n                var r = this.args.core;\n                if ((typeof r.ctor === \"string\")) {\n                    this.core = new window[r.ctor]((r.options || {\n                    }));\n                }\n                 else this.core = new r.ctor((r.options || {\n                }));\n            ;\n                this.core.init(this.getData(), this.getView(), this.getElement());\n            }\n        ;\n            return this.core;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        swapData: function(r) {\n            var s = this.core;\n            this.data = this.args.data = r;\n            r.init();\n            if (s) {\n                s.data = r;\n                s.initData();\n                s.reset();\n            }\n        ;\n            r.bootstrap();\n            return r;\n        },\n        proxyEvents: function() {\n            [this.data,this.view,this.core,].forEach(function(r) {\n                r.subscribe(r.events, this.inform.bind(this));\n            }, this);\n        },\n        initBehaviors: function(r) {\n            r.forEach(function(s) {\n                if ((typeof s === \"string\")) {\n                    if ((a.TypeaheadBehaviors && a.TypeaheadBehaviors[s])) {\n                        a.TypeaheadBehaviors[s](this);\n                    }\n                     else m.onLoad(function() {\n                        if (a.TypeaheadBehaviors) {\n                            ((a.TypeaheadBehaviors[s] || o))(this);\n                        };\n                    }.bind(this));\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\n        };\n        r.init(s);\n    };\n    q.init = function(r, s, t, u) {\n        if (!i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            r = (i.scry(r, \"input\")[0] || i.scry(r, \"textarea\")[0]);\n        };\n        var v = false;\n        try {\n            v = (document.activeElement === r);\n        } catch (w) {\n        \n        };\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"StickyPlaceholderInput\", [\"Event\",\"CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Input\"), k = b(\"Parent\"), l = b(\"emptyFunction\");\n    function m(q) {\n        return k.byClass(q, \"uiStickyPlaceholderInput\");\n    };\n    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n    function o(q) {\n        q = (q || window.event);\n        var r = (q.target || q.srcElement);\n        if (i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            var s = m(r);\n            if (s) {\n                (function() {\n                    h.conditionClass(s, \"uiStickyPlaceholderEmptyInput\", !r.value.length);\n                }).defer();\n            };\n        }\n    ;\n    };\n    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(document.documentElement, {\n                keydown: o,\n                paste: o,\n                focusout: o\n            });\n        },\n        registerInput: function(q) {\n            p.init();\n            var r = (q.getAttribute(\"placeholder\") || \"\");\n            if (r.length) {\n                if ((document.activeElement === q)) {\n                    var s = g.listen(q, \"blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\n            \n            };\n        },\n        manipulateInput: function(q, r) {\n            var s = i.create(\"div\", {\n                className: \"placeholder\",\n                \"aria-hidden\": \"true\"\n            }, r), t = i.create(\"div\", {\n                className: \"uiStickyPlaceholderInput\"\n            }, s);\n            if (i.isNodeOfType(q, \"textarea\")) {\n                h.addClass(t, \"uiStickyPlaceholderTextarea\");\n            };\n            g.listen(s, \"click\", function() {\n                q.focus();\n            });\n            if ((q.value === r)) {\n                q.value = \"\";\n            };\n            h.removeClass(q, \"DOMControl_placeholder\");\n            q.setAttribute(\"placeholder\", \"\");\n            i.replace(q, t);\n            i.appendContent(t, q);\n            h.conditionClass(t, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n        },\n        setPlaceholderText: function(q, r) {\n            var s = m(q);\n            if (!s) {\n                j.setPlaceholder(q, r);\n            }\n             else {\n                var t = n(s);\n                (t && i.setContent(t, r));\n            }\n        ;\n        },\n        getPlaceholderText: function(q) {\n            var r = m(q), s = n(r);\n            return (s && i.getText(s));\n        },\n        update: function(q) {\n            var r = m(q);\n            if (r) {\n                h.conditionClass(r, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n            };\n        },\n        getVisibleText: function(q) {\n            var r = m(q);\n            if (h.hasClass(r, \"uiStickyPlaceholderEmptyInput\")) {\n                var s = n(r);\n                return (s && i.getText(s));\n            }\n             else return q.value\n        ;\n        }\n    };\n    e.exports = p;\n});\n__d(\"TypeaheadCore\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"Focus\",\"Input\",\"InputSelection\",\"Keys\",\"StickyPlaceholderInput\",\"UserAgent\",\"bind\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"Input\"), n = b(\"InputSelection\"), o = b(\"Keys\"), p = b(\"StickyPlaceholderInput\"), q = b(\"UserAgent\"), r = b(\"bind\"), s = b(\"copyProperties\"), t = b(\"emptyFunction\");\n    function u(v) {\n        s(this, v);\n    };\n    s(u.prototype, i, {\n        events: [\"blur\",\"focus\",\"click\",\"unselect\",\"loading\",],\n        keepFocused: true,\n        resetOnSelect: false,\n        resetOnKeyup: true,\n        setValueOnSelect: false,\n        queryTimeout: 250,\n        preventFocusChangeOnTab: false,\n        init: function(v, w, x) {\n            this.init = t;\n            this.data = v;\n            this.view = w;\n            this.root = x;\n            this.initInput();\n            this.inputWrap = k.find(x, \"div.wrap\");\n            this.hiddenInput = k.find(x, \"input.hiddenInput\");\n            this.value = \"\";\n            this.nextQuery = null;\n            this.selectedText = null;\n            if ((this.setValueOnSelect && j.hasClass(this.inputWrap, \"selected\"))) {\n                this.selectedText = this.getValue();\n            };\n            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\n            };\n        },\n        initView: function() {\n            this.view.subscribe(\"highlight\", l.set.curry(this.element));\n            this.view.subscribe(\"select\", function(v, w) {\n                this.select(w.selected);\n            }.bind(this));\n            this.view.subscribe(\"afterSelect\", function() {\n                this.afterSelect();\n            }.bind(this));\n        },\n        initData: function() {\n            this.data.subscribe(\"respond\", function(v, w) {\n                if ((w.forceDisplay || ((w.value == this.getValue()) && !this.element.disabled))) {\n                    this.view.render(w.value, w.results, w.isAsync);\n                };\n            }.bind(this));\n            this.data.subscribe(\"activity\", function(v, w) {\n                this.fetching = w.activity;\n                if (!this.fetching) {\n                    (this.nextQuery && this.performQuery());\n                };\n                if ((this.loading != this.fetching)) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\n                    });\n                }\n            ;\n            }.bind(this));\n        },\n        initEvents: function() {\n            g.listen(this.view.getElement(), {\n                mouseup: this.viewMouseup.bind(this),\n                mousedown: this.viewMousedown.bind(this)\n            });\n            var v = {\n                blur: r(this, \"blur\"),\n                focus: r(this, \"focus\"),\n                click: r(this, \"click\"),\n                keyup: r(this, \"keyup\"),\n                keydown: r(this, \"keydown\")\n            };\n            if (q.firefox()) {\n                v.text = v.keyup;\n            };\n            if ((q.firefox() < 4)) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"focus\", this.view.show.bind(this.view));\n        },\n        viewMousedown: function() {\n            this.selecting = true;\n        },\n        viewMouseup: function() {\n            this.selecting = false;\n        },\n        blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n            this.inform(\"blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if ((v.start == v.end)) {\n                this.element.select();\n            };\n            this.inform(\"click\");\n        },\n        focus: function() {\n            this.checkValue();\n            this.inform(\"focus\");\n        },\n        keyup: function() {\n            if ((this.resetOnKeyup && !this.getValue())) {\n                this.view.reset();\n            };\n            this.checkValue();\n        },\n        keydown: function(event) {\n            if ((!this.view.isVisible() || this.view.isEmpty())) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n            switch (g.getKeyCode(event)) {\n              case o.TAB:\n                this.handleTab(event);\n                return;\n              case o.UP:\n                this.view.prev();\n                break;\n              case o.DOWN:\n                this.view.next();\n                break;\n              case o.ESC:\n                this.view.reset();\n                break;\n              default:\n                this.checkValue.bind(this).defer();\n                return;\n            };\n            event.kill();\n        },\n        keypress: function(event) {\n            if ((this.view.getSelection() && (g.getKeyCode(event) == o.RETURN))) {\n                this.view.select();\n                event.kill();\n            }\n        ;\n        },\n        handleTab: function(event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.getSelection()) {\n                    event.kill();\n                }\n                 else event.prevent();\n            \n            };\n            this.view.select();\n        },\n        select: function(v) {\n            if ((v && this.setValueOnSelect)) {\n                this.setValue(v.text);\n                this.setHiddenValue(v.uid);\n                this.selectedText = v.text;\n                j.addClass(this.inputWrap, \"selected\");\n            }\n        ;\n        },\n        afterSelect: function() {\n            (this.keepFocused ? l.set(this.element) : this.element.blur());\n            (this.resetOnSelect ? this.reset() : this.view.reset());\n        },\n        unselect: function() {\n            if (this.setValueOnSelect) {\n                this.selectedText = null;\n                j.removeClass(this.inputWrap, \"selected\");\n            }\n        ;\n            this.setHiddenValue();\n            this.inform(\"unselect\", this);\n        },\n        setEnabled: function(v) {\n            var w = (v === false);\n            this.element.disabled = w;\n            j.conditionClass(this.root, \"uiTypeaheadDisabled\", w);\n        },\n        reset: function() {\n            this.unselect();\n            this.setValue();\n            (!this.keepFocused && m.reset(this.element));\n            this.view.reset();\n            this.inform(\"reset\");\n        },\n        getElement: function() {\n            return this.element;\n        },\n        setExclusions: function(v) {\n            this._exclusions = v;\n        },\n        getExclusions: function() {\n            return this._exclusions;\n        },\n        setValue: function(v) {\n            this.value = this.nextQuery = (v || \"\");\n            m.setValue(this.element, this.value);\n            p.update(this.element);\n        },\n        setHiddenValue: function(v) {\n            this.hiddenInput.value = (((v || (v === 0))) ? v : \"\");\n            h.inform(\"Form/change\", {\n                node: this.hiddenInput\n            });\n        },\n        getValue: function() {\n            return m.getValue(this.element);\n        },\n        getHiddenValue: function() {\n            return (this.hiddenInput.value || \"\");\n        },\n        checkValue: function() {\n            var v = this.getValue();\n            if ((v == this.value)) {\n                return\n            };\n            if ((this.selectedText && (this.selectedText != v))) {\n                this.unselect();\n            };\n            var w = Date.now(), x = (w - this.time);\n            this.time = w;\n            this.value = this.nextQuery = v;\n            this.performQuery(x);\n        },\n        performQuery: function(v) {\n            if (this.selectedText) {\n                return\n            };\n            v = (v || 0);\n            if ((this.fetching && (v < this.queryTimeout))) {\n                this.data.query(this.nextQuery, true, this._exclusions, v);\n            }\n             else {\n                this.data.query(this.nextQuery, false, this._exclusions, v);\n                this.nextQuery = null;\n            }\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"reportData\", [\"EagleEye\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"EagleEye\"), h = b(\"userAction\");\n    function i(j, k) {\n        k = (k || {\n        });\n        var l = {\n            ft: ((k.ft || {\n            })),\n            gt: ((k.gt || {\n            }))\n        }, m = \"-\", n = a.ArbiterMonitor, o = ((!!n) ? n.getActFields() : []), p = ((!n) ? \"r\" : \"a\"), q = [Date.now(),h.getCurrentUECount(),m,j,m,m,p,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\n    };\n    e.exports = i;\n});\n__d(\"TimelineSection\", [\"Arbiter\",\"DOMScroll\",\"DoublyLinkedListMap\",\"Run\",\"TidyArbiterMixin\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMScroll\"), i = b(\"DoublyLinkedListMap\"), j = b(\"Run\"), k = b(\"TidyArbiterMixin\"), l = b(\"copyProperties\"), m = b(\"ge\"), n = null;\n    function o() {\n        n = null;\n    };\n    function p(q, r, s) {\n        this.id = q;\n        this.label = s;\n        this.nodeID = r;\n        this._parentSection = null;\n        this.childSections = new i();\n        this._isLoaded = false;\n        p.inform.bind(p, (\"sectionInitialized/\" + q), {\n            section: this\n        }, g.BEHAVIOR_STATE).defer();\n    };\n    l(p, k, {\n        callWithSection: function(q, r) {\n            this.subscribe((\"sectionInitialized/\" + q), function(s, t) {\n                r(t.section);\n            });\n        },\n        setActiveSectionID: function(q) {\n            (!n && j.onLeave(o));\n            n = q;\n        }\n    });\n    l(p.prototype, {\n        appendSection: function(q) {\n            this.childSections.append(q.id, q);\n            q._parentSection = this;\n        },\n        freeze: function() {\n            this.freezeChildren();\n        },\n        freezeChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                (!q.isActive() && q.freeze());\n                q = q.getNext();\n            };\n        },\n        getNext: function() {\n            return (this._parentSection && this._parentSection.childSections.getNext(this.id));\n        },\n        getPrev: function() {\n            return (this._parentSection && this._parentSection.childSections.getPrev(this.id));\n        },\n        isActive: function() {\n            var q = this;\n            while (q) {\n                if ((q.id === n)) {\n                    return true\n                };\n                q = q._parentSection;\n            };\n            return false;\n        },\n        isLoaded: function() {\n            return this._isLoaded;\n        },\n        setIsLoaded: function(q) {\n            this._isLoaded = q;\n            return this;\n        },\n        scrollTo: function() {\n            if (!m(this.nodeID)) {\n                return\n            };\n            h.scrollTo(this.getNode(), true, false, false, h.scrollTo.bind(this).curry(this.getNode(), 0));\n        },\n        thaw: function() {\n            this.thawChildren();\n        },\n        thawChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                q.thaw();\n                q = q.getNext();\n            };\n        }\n    });\n    e.exports = p;\n});\n__d(\"TypeaheadBestName\", [\"TokenizeUtil\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TokenizeUtil\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    i.prototype.enable = function() {\n        var j = this._typeahead.getView();\n        this._subscription = j.subscribe(\"beforeRender\", function(k, l) {\n            var m = l.value;\n            for (var n = 0; (n < l.results.length); ++n) {\n                var o = l.results[n];\n                if ((o.alternate_names == null)) {\n                    continue;\n                };\n                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\n                }\n            ;\n                for (var p = 0; (p < o.alternate_names.length); p++) {\n                    if (g.isQueryMatch(m, o.alternate_names[p])) {\n                        o.text = o.alternate_names[p];\n                        return;\n                    }\n                ;\n                };\n                o.text = o.default_name;\n            };\n        });\n    };\n    i.prototype.disable = function() {\n        this._typeahead.getView().unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:BestNameTypeaheadBehavior\", [\"TypeaheadBestName\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadBestName\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"UIIntentionalStreamMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        SET_AUTO_INSERT: \"UIIntentionalStream/setAutoInsert\",\n        UPDATE_STREAM: \"UIIntentionalStreamRefresh/updateStream\",\n        REFRESH_STREAM: \"UIIntentionalStreamRefresh/refreshStream\",\n        UPDATE_AUTOREFRESH_CONFIG: \"UIIntentionalStream/updateAutoRefreshConfig\",\n        UPDATE_HTML_CONTENT: \"UIIntentionalStream/updateHtmlContent\",\n        UPDATE_LAST_REFRESH_TIME: \"UIIntentionalStream/updateLastRefreshTime\",\n        INSERT_STORIES: \"UIIntentionalStream/updateLastRefreshTime\",\n        UNLOAD: \"UIIntentionalStream/unload\"\n    };\n    e.exports = g;\n});\n__d(\"AccessibleLayer\", [\"Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\n    };\n    j(l.prototype, {\n        enable: function() {\n            this._afterShowSubscription = this._layer.subscribe(\"aftershow\", this._onAfterShow.bind(this));\n        },\n        disable: function() {\n            (this._listener && this._listener.remove());\n            this._afterShowSubscription.unsubscribe();\n            this._listener = this._afterShowSubscription = null;\n        },\n        _closeListener: function(event) {\n            var m = this._layer.getCausalElement();\n            if (m) {\n                if ((m.tabIndex == -1)) {\n                    m.tabIndex = 0;\n                    i.setWithoutOutline(m);\n                }\n                 else i.set(m);\n            \n            };\n            this._layer.hide();\n        },\n        _onAfterShow: function() {\n            var m = this._layer.getContentRoot();\n            if (h.scry(m, \".layer_close_elem\")[0]) {\n                return\n            };\n            var n = h.create(\"a\", {\n                className: \"accessible_elem layer_close_elem\",\n                href: \"#\"\n            }, [\"Close popup and return\",]);\n            h.appendContent(m, n);\n            this._listener = g.listen(n, \"click\", this._closeListener.bind(this));\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerDestroyOnHide\", [\"function-extensions\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"shield\");\n    function i(j) {\n        this._layer = j;\n    };\n    g(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", h(Function.prototype.defer, this._layer.destroy.bind(this._layer)));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerFadeOnHide\", [\"Animation\",\"Layer\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Layer\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if ((j.ie() < 9)) {\n                return\n            };\n            this._subscription = this._layer.subscribe(\"starthide\", this._handleStartHide.bind(this));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        },\n        _handleStartHide: function() {\n            var m = true, n = h.subscribe(\"show\", function() {\n                n.unsubscribe();\n                m = false;\n            });\n            (function() {\n                n.unsubscribe();\n                n = null;\n                if (m) {\n                    this._animate();\n                }\n                 else this._layer.finishHide();\n            ;\n            }).bind(this).defer();\n            return false;\n        },\n        _animate: function() {\n            new g(this._layer.getRoot()).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(this._finish.bind(this)).go();\n        },\n        _finish: function() {\n            i.set(this._layer.getRoot(), \"opacity\", \"\");\n            this._layer.finishHide();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerHideOnBlur\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n    g(h.prototype, {\n        _subscriptions: null,\n        _onBlur: null,\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attach.bind(this)),this._layer.subscribe(\"hide\", this._detach.bind(this)),];\n            if (this._layer.isShown()) {\n                this._attach();\n            };\n        },\n        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this._subscriptions = null;\n        },\n        _detach: function() {\n            (this._onBlur && this._onBlur.unsubscribe());\n            this._onBlur = null;\n        },\n        _attach: function() {\n            this._onBlur = this._layer.subscribe(\"blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerHideOnEscape\", [\"Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\n    };\n    h(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"key\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, event) {\n            if ((g.getKeyCode(event) === i.ESC)) {\n                this._layer.hide();\n                return false;\n            }\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerMouseHooks\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ContextualThing\"), j = b(\"Layer\"), k = b(\"copyProperties\"), l = new h();\n    function m(n) {\n        this._layer = n;\n        this._subscriptions = [];\n        this._currentlyActive = false;\n    };\n    k(m.prototype, {\n        enable: function() {\n            this._subscriptions = [l.subscribe(\"mouseenter\", this._handleActive.bind(this)),l.subscribe(\"mouseleave\", this._handleInactive.bind(this)),this._layer.subscribe(\"hide\", function() {\n                this._currentlyActive = false;\n            }.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this._subscriptions = [];\n            this._currentlyActive = false;\n        },\n        _handleActive: function(n, o) {\n            if ((!this._currentlyActive && this._isNodeWithinStack(o))) {\n                this._layer.inform(\"mouseenter\");\n                this._currentlyActive = true;\n            }\n        ;\n        },\n        _handleInactive: function(n, o) {\n            if (this._currentlyActive) {\n                if ((!o || !this._isNodeWithinStack(o))) {\n                    this._layer.inform(\"mouseleave\");\n                    this._currentlyActive = false;\n                }\n            \n            };\n        },\n        _isNodeWithinStack: function(n) {\n            return i.containsIncludingLayers(this._layer.getContentRoot(), n);\n        }\n    });\n    j.subscribe(\"show\", function(n, o) {\n        var p = o.getContentRoot(), q = [g.listen(p, \"mouseenter\", function() {\n            l.inform(\"mouseenter\", p);\n        }),g.listen(p, \"mouseleave\", function(s) {\n            l.inform(\"mouseleave\", s.getRelatedTarget());\n        }),], r = o.subscribe(\"hide\", function() {\n            while (q.length) {\n                q.pop().remove();;\n            };\n            r.unsubscribe();\n            q = r = null;\n        });\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogArrow\", [\"JSXDOM\",\"CSS\",\"DOM\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Locale\"), k = b(\"Style\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        bottom: \"-cx-PUBLIC-abstractContextualDialog__arrowbottom\",\n        top: \"-cx-PUBLIC-abstractContextualDialog__arrowtop\",\n        right: \"-cx-PUBLIC-abstractContextualDialog__arrowright\",\n        left: \"-cx-PUBLIC-abstractContextualDialog__arrowleft\"\n    }, p = {\n        above: \"bottom\",\n        below: \"top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\n    };\n    m(q.prototype, {\n        _subscription: null,\n        _arrow: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"adjust\",\"reposition\",], this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(r, s) {\n            if ((r === \"adjust\")) {\n                this._repositionArrow(s);\n            }\n             else this._repositionRoot(s);\n        ;\n        },\n        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if ((s == \"center\")) {\n                return\n            };\n            var t = this._layer.getRoot(), u = this._layer.getContext(), v = r.isVertical(), w = this._layer.getArrowDimensions(), x = w.offset, y = w.length, z = l.getElementDimensions(u), aa = (v ? z.x : z.y);\n            if ((aa >= (y + ((x * 2))))) {\n                return\n            };\n            var ba = (((y / 2)) + x), ca = (aa / 2), da = parseInt((ba - ca), 10);\n            if (v) {\n                if ((s == \"left\")) {\n                    var ea = parseInt(k.get(t, \"left\"), 10);\n                    k.set(t, \"left\", (((ea - da)) + \"px\"));\n                }\n                 else {\n                    var fa = parseInt(k.get(t, \"right\"), 10);\n                    k.set(t, \"right\", (((fa - da)) + \"px\"));\n                }\n            ;\n            }\n             else {\n                var ga = parseInt(k.get(t, \"top\"), 10);\n                k.set(t, \"top\", (((ga - da)) + \"px\"));\n            }\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer.getContentRoot(), t = r.getPosition(), u = p[t];\n            for (var v in o) {\n                h.conditionClass(s, o[v], (u === v));;\n            };\n            if ((t == \"none\")) {\n                return\n            };\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"-cx-PUBLIC-abstractContextualDialog__arrow\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n            h.conditionClass(s, \"-cx-PRIVATE-uiContextualDialog__withfooter\", this._layer.getFooter());\n            k.set(this._arrow, \"top\", \"\");\n            k.set(this._arrow, \"left\", \"\");\n            k.set(this._arrow, \"right\", \"\");\n            k.set(this._arrow, \"margin\", \"\");\n            var w = q.getOffsetPercent(r), x = q.getOffset(r, w, this._layer), y = q.getOffsetSide(r);\n            k.set(this._arrow, y, (w + \"%\"));\n            k.set(this._arrow, (\"margin-\" + y), (x + \"px\"));\n        }\n    });\n    m(q, {\n        getOffsetPercent: function(r) {\n            var s = r.getAlignment(), t = r.getPosition();\n            if (((t == \"above\") || (t == \"below\"))) {\n                if ((s == \"center\")) {\n                    return 50;\n                }\n                 else if ((s == \"right\")) {\n                    return 100\n                }\n            \n            };\n            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return (s ? ((j.isRTL() ? \"right\" : \"left\")) : \"top\");\n        },\n        getOffset: function(r, s, t) {\n            var u = t.getArrowDimensions(), v = u.offset, w = u.length, x = r.getAlignment(), y = (((x == \"center\")) ? 0 : v);\n            y += ((w * s) / 100);\n            if ((x != \"left\")) {\n                y *= -1;\n            };\n            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ContextualLayerDimensions\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"throttle\");\n    function m(n) {\n        this._layer = n;\n        this._listeners = [];\n    };\n    k(m.prototype, {\n        _subscription: null,\n        _minimumTop: null,\n        enable: function() {\n            var n = this._layer.getArrowDimensions();\n            this._arrowOffset = n.offset;\n            var o = n.length;\n            this._arrowBuffer = (this._arrowOffset + o);\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",\"reposition\",], function(p, q) {\n                if ((p == \"reposition\")) {\n                    this._calculateMinimumTop(q);\n                }\n                 else if ((p == \"show\")) {\n                    this._attachScroll();\n                    this._adjustForScroll();\n                }\n                 else this._detachScroll();\n                \n            ;\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            };\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\n            };\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _attachScroll: function() {\n            var n = l(this._adjustForScroll.bind(this)), o = (this._layer.getContextScrollParent() || window);\n            this._listeners = [g.listen(o, \"scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            this._listeners = [];\n        },\n        _getContentHeight: function() {\n            return j.getElementDimensions(this._layer._contentWrapper).y;\n        },\n        _getContextY: function() {\n            return j.getElementPosition(this._layer.getContext()).y;\n        },\n        _calculateMinimumTop: function(n) {\n            if (n.isVertical()) {\n                return\n            };\n            this._minimumTop = (((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return\n            };\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return\n            };\n            var o = h.getViewportRect(this._layer), p = (o.b - this._minimumTop);\n            if ((p < 0)) {\n                return\n            };\n            var q = this._getContentHeight(), r = (q - ((this._arrowBuffer + this._arrowOffset))), s = Math.max(0, Math.min(r, (r - ((p - q)))));\n            i.set(this._layer.getContent(), \"top\", (-s + \"px\"));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogDefaultTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = {\n        wrapperClassName: \"-cx-PRIVATE-uiContextualDialog__root\",\n        arrowDimensions: {\n            offset: 15,\n            length: 16\n        }\n    };\n    e.exports = h;\n});\n__d(\"ContextualDialog\", [\"AccessibleLayer\",\"Class\",\"ContextualDialogArrow\",\"ContextualDialogFitInViewport\",\"ContextualLayer\",\"ContextualDialogDefaultTheme\",\"CSS\",\"DOM\",\"JSXDOM\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerHideOnTransition\",\"LayerFormHooks\",\"LayerMouseHooks\",\"Style\",\"copyProperties\",\"csx\",\"cx\",\"invariant\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"AccessibleLayer\"), h = b(\"Class\"), i = b(\"ContextualDialogArrow\"), j = b(\"ContextualDialogFitInViewport\"), k = b(\"ContextualLayer\"), l = b(\"ContextualDialogDefaultTheme\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"JSXDOM\"), p = b(\"LayerAutoFocus\"), q = b(\"LayerButtons\"), r = b(\"LayerHideOnTransition\"), s = b(\"LayerFormHooks\"), t = b(\"LayerMouseHooks\"), u = b(\"Style\"), v = b(\"copyProperties\"), w = b(\"csx\"), x = b(\"cx\"), y = b(\"invariant\"), z = b(\"removeFromArray\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n    h.extend(aa, k);\n    v(aa.prototype, {\n        _footer: null,\n        _configure: function(ba, ca) {\n            v(ba, (ba.theme || l));\n            var da = (ba.arrowBehavior || i);\n            ba.addedBehaviors = (ba.addedBehaviors || []);\n            ba.addedBehaviors.push(da);\n            this._footer = n.scry(ca, \"div.-cx-PUBLIC-abstractContextualDialog__footer\")[0];\n            this.parent._configure(ba, ca);\n        },\n        _getDefaultBehaviors: function() {\n            var ba = this.parent._getDefaultBehaviors();\n            z(ba, r);\n            return ba.concat([g,p,j,q,s,t,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            m.addClass(ca, \"-cx-PUBLIC-abstractContextualDialog__content\");\n            this._innerWrapper = o.div(null, ca);\n            var da = this.parent._buildWrapper(ba, this._innerWrapper);\n            m.addClass(da, ba.wrapperClassName);\n            if (ba.width) {\n                this.setWidth(ba.width);\n            };\n            return da;\n        },\n        getContentRoot: function() {\n            y(!!this._innerWrapper);\n            return this._innerWrapper;\n        },\n        setContent: function(ba) {\n            m.addClass(ba, \"-cx-PUBLIC-abstractContextualDialog__content\");\n            n.setContent(this.getContentRoot(), ba);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            u.set(this.getContentRoot(), \"width\", (ba + \"px\"));\n            return this;\n        },\n        getFooter: function() {\n            return this._footer;\n        },\n        getArrowDimensions: function() {\n            return this._config.arrowDimensions;\n        }\n    });\n    v(aa, {\n        setContext: function(ba, ca) {\n            ba.setContext(ca);\n        }\n    });\n    e.exports = aa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"csx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\");\n    b(\"function-extensions\");\n    var i = b(\"AccessibleLayer\"), j = b(\"Arbiter\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"ContextualDialog\"), n = b(\"ContextualThing\"), o = b(\"DOM\"), p = b(\"LayerAutoFocus\"), q = b(\"Parent\"), r = b(\"Rect\"), s = b(\"Style\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"clickRefAction\"), w = b(\"cx\"), x = b(\"csx\"), y = b(\"emptyFunction\"), z = b(\"tx\"), aa = b(\"userAction\"), ba = {\n    }, ca = {\n    }, da = null, ea = null, fa = null, ga = 150, ha = 700, ia = 1000, ja = 250, ka = null, la = null, ma = null, na = null;\n    function oa(event) {\n        var db = q.byTag(event.getTarget(), \"a\");\n        (cb.processNode(db) && event.stop());\n    };\n    function pa(db) {\n        ea = db;\n        if (!qa(db)) {\n            var eb;\n            if ((!db || !(eb = ra(db)))) {\n                (ca.moveToken && ca.moveToken.remove());\n                ca = {\n                };\n                return false;\n            }\n        ;\n            if ((ca.node != db)) {\n                (ca.moveToken && ca.moveToken.remove());\n                ca = {\n                    node: db,\n                    endpoint: eb,\n                    pos: null\n                };\n            }\n        ;\n        }\n    ;\n        return true;\n    };\n    function qa(db) {\n        return ((db && da) && (ca.node == db));\n    };\n    function ra(db) {\n        return db.getAttribute(\"data-hovercard\");\n    };\n    function sa(db) {\n        var eb = o.scry(db, \"^.-cx-PRIVATE-fbEntstreamFeedObject__root .-cx-PUBLIC-fbEntstreamEmbed__root\").length;\n        if (eb) {\n            return\n        };\n        var fb = h.listen(db, \"mouseout\", function() {\n            clearTimeout(ka);\n            clearTimeout(la);\n            fb.remove();\n            ea = null;\n            if (!cb.contains(db)) {\n                cb.hide();\n            };\n        });\n        if (!ca.moveToken) {\n            ca.moveToken = h.listen(db, \"mousemove\", function(event) {\n                ca.pos = u.getEventPosition(event);\n            });\n        };\n        clearTimeout(ka);\n        clearTimeout(la);\n        clearTimeout(na);\n        var gb = ga, hb = (da ? ja : ha);\n        if (db.getAttribute(\"data-hovercard-instant\")) {\n            gb = hb = 50;\n        };\n        ka = setTimeout(xa.curry(db), gb);\n        la = setTimeout(ta.curry(db), hb);\n    };\n    function ta(db, eb) {\n        if ((ca.node != db)) {\n            return\n        };\n        var fb = ba[ra(db)];\n        if (fb) {\n            va(fb);\n        }\n         else if (eb) {\n            va(za());\n        }\n         else {\n            var gb = (da ? ja : ha);\n            ma = setTimeout(ta.curry(db, true), (ia - gb));\n        }\n        \n    ;\n    };\n    function ua() {\n        cb.hide(true);\n        clearTimeout(la);\n    };\n    function va(db) {\n        var eb = ca.node, fb = da, gb = (fb != eb);\n        if (fa) {\n            var hb = fa.getContentRoot();\n            if (!n.containsIncludingLayers(hb, eb)) {\n                fa.hide();\n            };\n        }\n    ;\n        if (!o.contains(document.body, eb)) {\n            cb.hide(true);\n            return;\n        }\n    ;\n        da = eb;\n        fa = db;\n        db.setContextWithBounds(eb, wa(eb)).show();\n        if (gb) {\n            (function() {\n                new l(\"/ajax/hovercard/shown.php\").send();\n                v(\"himp\", da, null, \"FORCE\", {\n                    ft: {\n                        evt: 39\n                    }\n                });\n                aa(\"hovercard\", da).uai(\"show\");\n            }).defer();\n        };\n    };\n    function wa(db) {\n        var eb = ca.pos, fb = db.getClientRects();\n        if ((!eb || (fb.length === 0))) {\n            return r.getElementBounds(db)\n        };\n        var gb, hb = false;\n        for (var ib = 0; (ib < fb.length); ib++) {\n            var jb = new r(Math.round(fb[ib].top), Math.round(fb[ib].right), Math.round(fb[ib].bottom), Math.round(fb[ib].left), \"viewport\").convertTo(\"document\"), kb = jb.getPositionVector(), lb = kb.add(jb.getDimensionVector());\n            if ((!gb || (((kb.x <= gb.l) && (kb.y > gb.t))))) {\n                if (hb) {\n                    break;\n                };\n                gb = new r(kb.y, lb.x, lb.y, kb.x, \"document\");\n            }\n             else {\n                gb.t = Math.min(gb.t, kb.y);\n                gb.b = Math.max(gb.b, lb.y);\n                gb.r = lb.x;\n            }\n        ;\n            if (jb.contains(eb)) {\n                hb = true;\n            };\n        };\n        return gb;\n    };\n    function xa(db) {\n        if ((db.id && (ba[db.id] != null))) {\n            return\n        };\n        var eb = ra(db);\n        if ((ba[eb] != null)) {\n            return\n        };\n        ya(eb);\n        var fb = function() {\n            cb.dirty(eb);\n            ua();\n        };\n        new k(eb).setData({\n            endpoint: eb\n        }).setMethod(\"GET\").setReadOnly(true).setErrorHandler(fb).setTransportErrorHandler(fb).send();\n    };\n    function ya(db) {\n        ba[db] = false;\n    };\n    var za = function() {\n        var db = new m({\n            width: 275\n        }, g.div({\n            className: \"-cx-PRIVATE-hovercard__loading\"\n        }, \"Loading...\"));\n        db.disableBehavior(i).disableBehavior(p);\n        ab(db);\n        za = y.thatReturns(db);\n        return db;\n    };\n    function ab(db) {\n        var eb = [db.subscribe(\"mouseenter\", function() {\n            clearTimeout(na);\n            ea = ca.node;\n        }),db.subscribe(\"mouseleave\", function() {\n            db.hide();\n            ea = null;\n        }),db.subscribe(\"destroy\", function() {\n            while (eb.length) {\n                eb.pop().unsubscribe();;\n            };\n            eb = null;\n        }),];\n    };\n    var bb = true, cb = {\n        hide: function(db) {\n            if (!da) {\n                return\n            };\n            if (db) {\n                if (fa) {\n                    fa.hide();\n                };\n                ea = null;\n                da = null;\n                fa = null;\n            }\n             else na = setTimeout(cb.hide.curry(true), ja);\n        ;\n        },\n        setDialog: function(db, eb) {\n            eb.disableBehavior(i).disableBehavior(p);\n            ba[db] = eb;\n            ab(eb);\n            if (((ca.endpoint == db) && (ea == ca.node))) {\n                za().hide();\n                var fb = ca.node.getAttribute(\"data-hovercard-position\");\n                (fb && eb.setPosition(fb));\n                var gb = ca.node.getAttribute(\"data-hovercard-offset-x\");\n                (gb && eb.setOffsetX(parseInt(gb, 10)));\n                var hb = ca.node.getAttribute(\"data-hovercard-offset-y\");\n                (hb && eb.setOffsetY(parseInt(hb, 10)));\n                va(eb);\n            }\n        ;\n        },\n        getDialog: function(db) {\n            return ba[db];\n        },\n        contains: function(db) {\n            if (fa) {\n                return n.containsIncludingLayers(fa.getContentRoot(), db)\n            };\n            return false;\n        },\n        dirty: function(db) {\n            var eb = ba[db];\n            if (eb) {\n                eb.destroy();\n                delete ba[db];\n            }\n        ;\n        },\n        dirtyAll: function() {\n            for (var db in ba) {\n                var eb = ba[db];\n                (eb && cb.dirty(db));\n            };\n            j.inform(\"Hovercard/dirty\");\n        },\n        processNode: function(db) {\n            if ((db && pa(db))) {\n                sa(db);\n                return true;\n            }\n        ;\n            return false;\n        },\n        setDirtyAllOnPageTransition: function(db) {\n            bb = db;\n        }\n    };\n    (function() {\n        if ((t.ie() < 8)) {\n            return\n        };\n        h.listen(document.documentElement, \"mouseover\", oa);\n        h.listen(window, \"scroll\", function() {\n            if ((da && s.isFixed(da))) {\n                cb.hide(true);\n            };\n        });\n        j.subscribe(\"page_transition\", function() {\n            ua();\n            (bb && cb.dirtyAll());\n        }, j.SUBSCRIBE_NEW);\n    })();\n    e.exports = cb;\n});\n__d(\"ScrollableArea\", [\"Animation\",\"ArbiterMixin\",\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"Run\",\"SimpleDrag\",\"Style\",\"UserAgent\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"BrowserSupport\"), j = b(\"CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"Parent\"), o = b(\"Run\"), p = b(\"SimpleDrag\"), q = b(\"Style\"), r = b(\"UserAgent\"), s = b(\"Vector\"), t = b(\"copyProperties\"), u = b(\"throttle\"), v = 12;\n    function w(x, y) {\n        if (!x) {\n            return\n        };\n        y = (y || {\n        });\n        this._elem = x;\n        this._wrap = l.find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.find(this._track, \"div.uiScrollableAreaGripper\");\n        this._options = y;\n        this._throttledComputeHeights = u.withBlocking(this._computeHeights, 250, this);\n        this.throttledAdjustGripper = u.withBlocking(this.adjustGripper, 250, this);\n        this._throttledShowGripperAndShadows = u.withBlocking(this._showGripperAndShadows, 250, this);\n        this._throttledRespondMouseMove = u(this._respondMouseMove, 250, this);\n        this.adjustGripper.bind(this).defer();\n        this._listeners = [m.listen(this._wrap, \"scroll\", this._handleScroll.bind(this)),m.listen(x, \"mousemove\", this._handleMouseMove.bind(this)),m.listen(this._track, \"click\", this._handleClickOnTrack.bind(this)),];\n        if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"click\", this._handleClickOnTrack.bind(this)));\n        };\n        if ((y.fade !== false)) {\n            this._listeners.push(m.listen(x, \"mouseenter\", this._handleMouseEnter.bind(this)), m.listen(x, \"mouseleave\", this._handleMouseLeave.bind(this)), m.listen(x, \"focusin\", this.showScrollbar.bind(this, false)), m.listen(x, \"focusout\", this.hideScrollbar.bind(this)));\n        }\n         else if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"mouseleave\", j.removeClass.curry(x, \"uiScrollableAreaTrackOver\")));\n        }\n    ;\n        if ((r.webkit() || r.chrome())) {\n            this._listeners.push(m.listen(x, \"mousedown\", function() {\n                var z = m.listen(window, \"mouseup\", function() {\n                    if (x.scrollLeft) {\n                        x.scrollLeft = 0;\n                    };\n                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.addEventListener(\"DOMMouseScroll\", function(event) {\n                ((event.axis === event.HORIZONTAL_AXIS) && event.preventDefault());\n            }, false);\n        }\n    ;\n        this.initDrag();\n        k.set(this._elem, \"ScrollableArea\", this);\n        if (!y.persistent) {\n            o.onLeave(this.destroy.bind(this));\n        };\n        if ((y.shadow !== false)) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\n        };\n    };\n    t(w, {\n        renderDOM: function() {\n            var x = l.create(\"div\", {\n                className: \"uiScrollableAreaContent\"\n            }), y = l.create(\"div\", {\n                className: \"uiScrollableAreaBody\"\n            }, x), z = l.create(\"div\", {\n                className: \"uiScrollableAreaWrap\"\n            }, y), aa = l.create(\"div\", {\n                className: \"uiScrollableArea native\"\n            }, z);\n            return {\n                root: aa,\n                wrap: z,\n                body: y,\n                content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if ((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\"))) {\n                return\n            };\n            y = (y || {\n            });\n            j.removeClass(x, \"native\");\n            var z = l.create(\"div\", {\n                className: \"uiScrollableAreaTrack\"\n            }, l.create(\"div\", {\n                className: \"uiScrollableAreaGripper\"\n            }));\n            if ((y.fade !== false)) {\n                j.addClass(x, \"fade\");\n                j.addClass(z, \"invisible_elem\");\n            }\n             else j.addClass(x, \"nofade\");\n        ;\n            l.appendContent(x, z);\n            var aa = new w(x, y);\n            aa.resize();\n            return aa;\n        },\n        getInstance: function(x) {\n            var y = n.byClass(x, \"uiScrollableArea\");\n            return (y ? k.get(y, \"ScrollableArea\") : null);\n        },\n        poke: function(x) {\n            var y = w.getInstance(x);\n            (y && y.poke());\n        }\n    });\n    t(w.prototype, h, {\n        initDrag: function() {\n            var x = i.hasPointerEvents(), y = new p((x ? this._elem : this._gripper));\n            y.subscribe(\"start\", function(z, event) {\n                if (!((((event.which && (event.which === 1))) || ((event.button && (event.button === 1)))))) {\n                    return\n                };\n                var aa = s.getEventPosition(event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((aa.x < ba.left) || (aa.x > ba.right)) || (aa.y < ba.top)) || (aa.y > ba.bottom))) {\n                        return false\n                    };\n                }\n            ;\n                this.inform(\"grip_start\");\n                var ca = aa.y, da = this._gripper.offsetTop;\n                j.addClass(this._elem, \"uiScrollableAreaDragging\");\n                var ea = y.subscribe(\"update\", function(ga, event) {\n                    var ha = (s.getEventPosition(event, \"viewport\").y - ca);\n                    this._throttledComputeHeights();\n                    var ia = (this._contentHeight - this._containerHeight), ja = (da + ha), ka = (this._trackHeight - this._gripperHeight);\n                    ja = Math.max(Math.min(ja, ka), 0);\n                    var la = ((ja / ka) * ia);\n                    this._wrap.scrollTop = la;\n                }.bind(this)), fa = y.subscribe(\"end\", function() {\n                    y.unsubscribe(ea);\n                    y.unsubscribe(fa);\n                    j.removeClass(this._elem, \"uiScrollableAreaDragging\");\n                    this.inform(\"grip_end\");\n                }.bind(this));\n            }.bind(this));\n        },\n        adjustGripper: function() {\n            if (this._needsGripper()) {\n                q.set(this._gripper, \"height\", (this._gripperHeight + \"px\"));\n                this._slideGripper();\n            }\n        ;\n            this._throttledShowGripperAndShadows();\n            return this;\n        },\n        _computeHeights: function() {\n            this._containerHeight = this._elem.clientHeight;\n            this._contentHeight = this._content.offsetHeight;\n            this._trackHeight = this._track.offsetHeight;\n            this._gripperHeight = Math.max(((this._containerHeight / this._contentHeight) * this._trackHeight), v);\n        },\n        _needsGripper: function() {\n            this._throttledComputeHeights();\n            return (this._gripperHeight < this._trackHeight);\n        },\n        _slideGripper: function() {\n            var x = ((this._wrap.scrollTop / ((this._contentHeight - this._containerHeight))) * ((this._trackHeight - this._gripperHeight)));\n            q.set(this._gripper, \"top\", (x + \"px\"));\n        },\n        _showGripperAndShadows: function() {\n            j.conditionShow(this._gripper, this._needsGripper());\n            j.conditionClass(this._elem, \"contentBefore\", (this._wrap.scrollTop > 0));\n            j.conditionClass(this._elem, \"contentAfter\", !this.isScrolledToBottom());\n        },\n        destroy: function() {\n            this._listeners.forEach(function(x) {\n                x.remove();\n            });\n            this._listeners.length = 0;\n        },\n        _handleClickOnTrack: function(event) {\n            var x = s.getEventPosition(event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((x.x < y.right) && (x.x > y.left))) {\n                if ((x.y < y.top)) {\n                    this.setScrollTop((this.getScrollTop() - this._elem.clientHeight));\n                }\n                 else if ((x.y > y.bottom)) {\n                    this.setScrollTop((this.getScrollTop() + this._elem.clientHeight));\n                }\n            ;\n                event.prevent();\n            }\n        ;\n        },\n        _handleMouseMove: function(event) {\n            var x = (this._options.fade !== false);\n            if ((i.hasPointerEvents() || x)) {\n                this._mousePos = s.getEventPosition(event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return\n            };\n            var x = (this._options.fade !== false), y = this._mousePos, z = s.getElementPosition(this._track).x, aa = s.getElementDimensions(this._track).x, ba = Math.abs(((z + (aa / 2)) - y.x));\n            j.conditionClass(this._elem, \"uiScrollableAreaTrackOver\", (i.hasPointerEvents() && (ba <= 10)));\n            if (x) {\n                if ((ba < 25)) {\n                    this.showScrollbar(false);\n                }\n                 else if (!this._options.no_fade_on_hover) {\n                    this.hideScrollbar();\n                }\n            \n            };\n        },\n        _handleScroll: function(event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            };\n            this.throttledAdjustGripper();\n            if ((this._options.fade !== false)) {\n                this.showScrollbar();\n            };\n            this.inform(\"scroll\");\n        },\n        _handleMouseLeave: function() {\n            this._mouseOver = false;\n            this.hideScrollbar();\n        },\n        _handleMouseEnter: function() {\n            this._mouseOver = true;\n            this.showScrollbar();\n        },\n        hideScrollbar: function(x) {\n            if (!this._scrollbarVisible) {\n                return this\n            };\n            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n            if (x) {\n                q.set(this._track, \"opacity\", 0);\n                j.addClass.curry(this._track, \"invisible_elem\");\n            }\n             else this._hideTimeout = function() {\n                if (this._hideAnimation) {\n                    this._hideAnimation.stop();\n                    this._hideAnimation = null;\n                }\n            ;\n                this._hideAnimation = (new g(this._track)).from(\"opacity\", 1).to(\"opacity\", 0).duration(250).ondone(j.addClass.curry(this._track, \"invisible_elem\")).go();\n            }.bind(this).defer(750);\n        ;\n            return this;\n        },\n        resize: function() {\n            var x = s.getElementDimensions(this._elem).x;\n            if ((this._options.fade === false)) {\n                x -= 10;\n            };\n            x = Math.max(0, x);\n            q.set(this._body, \"width\", (x + \"px\"));\n            return this;\n        },\n        showScrollbar: function(x) {\n            this.throttledAdjustGripper();\n            if (this._scrollbarVisible) {\n                return this\n            };\n            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.stop();\n                this._hideAnimation = null;\n            }\n        ;\n            q.set(this._track, \"opacity\", 1);\n            j.removeClass(this._track, \"invisible_elem\");\n            if ((((x !== false)) && !this._options.no_fade_on_hover)) {\n                this.hideScrollbar();\n            };\n            return this;\n        },\n        isScrolledToBottom: function() {\n            return (this._wrap.scrollTop >= (this._contentHeight - this._containerHeight));\n        },\n        isScrolledToTop: function() {\n            return (this._wrap.scrollTop === 0);\n        },\n        scrollToBottom: function(x) {\n            this.setScrollTop(this._wrap.scrollHeight, x);\n        },\n        scrollToTop: function(x) {\n            this.setScrollTop(0, x);\n        },\n        scrollIntoView: function(x, y) {\n            var z = this._wrap.clientHeight, aa = x.offsetHeight, ba = this._wrap.scrollTop, ca = (ba + z), da = x.offsetTop, ea = (da + aa);\n            if (((da < ba) || (z < aa))) {\n                this.setScrollTop(da, y);\n            }\n             else if ((ea > ca)) {\n                this.setScrollTop((ba + ((ea - ca))), y);\n            }\n        ;\n        },\n        scrollElemToTop: function(x, y, z) {\n            this.setScrollTop(x.offsetTop, y, {\n                callback: z\n            });\n        },\n        poke: function() {\n            var x = this._wrap.scrollTop;\n            this._wrap.scrollTop += 1;\n            this._wrap.scrollTop -= 1;\n            this._wrap.scrollTop = x;\n            return this.showScrollbar(false);\n        },\n        getScrollTop: function() {\n            return this._wrap.scrollTop;\n        },\n        getScrollHeight: function() {\n            return this._wrap.scrollHeight;\n        },\n        setScrollTop: function(x, y, z) {\n            z = (z || {\n            });\n            if ((y !== false)) {\n                if (this._scrollTopAnimation) {\n                    this._scrollTopAnimation.stop();\n                };\n                var aa = (z.duration || 250), ba = (z.ease || g.ease.end);\n                this._scrollTopAnimation = (new g(this._wrap)).to(\"scrollTop\", x).ease(ba).duration(aa).ondone(z.callback).go();\n            }\n             else {\n                this._wrap.scrollTop = x;\n                (z.callback && z.callback());\n            }\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:Tooltip\", [\"Tooltip\",], function(a, b, c, d) {\n    a.Tooltip = b(\"Tooltip\");\n}, 3);\n__d(\"ClearableTypeahead\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().focus();\n                k.reset();\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"TypeaheadShowLoadingIndicator\", [\"CSS\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._typeahead.subscribe(\"loading\", function(j, k) {\n                g.conditionClass(this._typeahead.getElement(), \"typeaheadLoading\", k.loading);\n                g.conditionClass(this._typeahead.getView().getElement(), \"typeaheadViewLoading\", k.loading);\n            }.bind(this));\n        },\n        disable: function() {\n            this._typeahead.unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:ShowLoadingIndicatorTypeaheadBehavior\", [\"TypeaheadShowLoadingIndicator\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadShowLoadingIndicator\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    };\n    a.TypeaheadBehaviors.showLoadingIndicator = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"CompactTypeaheadRenderer\", [\"Badge\",\"DOM\",\"TypeaheadFacepile\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"TypeaheadFacepile\");\n    function j(k, l) {\n        var m = [];\n        if (k.xhp) {\n            return h.create(\"li\", {\n                className: \"raw\"\n            }, k.xhp)\n        };\n        var n = (k.photos || k.photo);\n        if (n) {\n            if ((n instanceof Array)) {\n                n = i.render(n);\n            }\n             else n = h.create(\"img\", {\n                alt: \"\",\n                src: n\n            });\n        ;\n            m.push(n);\n        }\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\", \"verified\"));\n            };\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\n        }\n    ;\n        var p = k.subtext, q = k.category;\n        if ((p || q)) {\n            var r = [];\n            (p && r.push(p));\n            ((p && q) && r.push(\" \\u00b7 \"));\n            (q && r.push(q));\n            m.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, r));\n        }\n    ;\n        var s = h.create(\"li\", {\n            className: (k.type || \"\")\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        };\n        return s;\n    };\n    j.className = \"compact\";\n    e.exports = j;\n});\n__d(\"endsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return (h.indexOf(i, (h.length - i.length)) > -1);\n    };\n    e.exports = g;\n});\n__d(\"extendArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Array.prototype.push.apply(h, i);\n        return h;\n    };\n    e.exports = g;\n});");
// 5048
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s1da4c91f736d950de61ac9962e5a050e9ae4a4ed");
// 5049
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"/MWWQ\",]);\n}\n;\n;\n__d(\"EgoAdsObjectSet\", [\"copyProperties\",\"csx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"csx\"), i = b(\"DOM\");\n    function j() {\n        this._allEgoUnits = [];\n        this._egoUnits = [];\n    };\n;\n    g(j.prototype, {\n        init: function(l) {\n            this._allEgoUnits = l;\n            this._egoUnits = [];\n            this._allEgoUnits.forEach(function(m) {\n                var n = k(m);\n                if (((!n || !n.holdout))) {\n                    this._egoUnits.push(m);\n                }\n            ;\n            ;\n            }, this);\n        },\n        getCount: function() {\n            return this._egoUnits.length;\n        },\n        forEach: function(l, m) {\n            this._egoUnits.forEach(l, m);\n        },\n        getUnit: function(l) {\n            return this._egoUnits[l];\n        },\n        getHoldoutAdIDsForSpace: function(l, m) {\n            if (((!l || !m))) {\n                return [];\n            }\n        ;\n        ;\n            var n = [];\n            for (var o = 0; ((((l > 0)) && ((o < this._allEgoUnits.length)))); o++) {\n                var p = this._allEgoUnits[o], q = m(p), r = k(p);\n                if (((((((l >= q)) && r)) && r.holdout))) {\n                    n.push(r.adid);\n                }\n            ;\n            ;\n                l -= q;\n            };\n        ;\n            return n;\n        },\n        getHoldoutAdIDsForNumAds: function(l) {\n            l = Math.min(l, this._allEgoUnits.length);\n            var m = [];\n            for (var n = 0; ((n < l)); n++) {\n                var o = this._allEgoUnits[n], p = k(o);\n                if (((p && p.holdout))) {\n                    m.push(p.adid);\n                }\n            ;\n            ;\n            };\n        ;\n            return m;\n        }\n    });\n    function k(l) {\n        var m = i.scry(l, \"div.-cx-PUBLIC-fbAdUnit__root\")[0], n = ((m && m.getAttribute(\"data-ad\")));\n        return ((((n && JSON.parse(n))) || undefined));\n    };\n;\n    e.exports = j;\n});\n__d(\"JSBNG__Rect\", [\"Vector\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = b(\"$\"), i = b(\"copyProperties\");\n    function j(k, l, m, n, o) {\n        if (((arguments.length === 1))) {\n            if (((k instanceof j))) {\n                return k;\n            }\n        ;\n        ;\n            if (((k instanceof g))) {\n                return new j(k.y, k.x, k.y, k.x, k.domain);\n            }\n        ;\n        ;\n            return j.getElementBounds(h(k));\n        }\n    ;\n    ;\n        i(this, {\n            t: k,\n            r: l,\n            b: m,\n            l: n,\n            domain: ((o || \"pure\"))\n        });\n    };\n;\n    i(j.prototype, {\n        w: function() {\n            return ((this.r - this.l));\n        },\n        h: function() {\n            return ((this.b - this.t));\n        },\n        toString: function() {\n            return ((((((((((((((((\"((\" + this.l)) + \", \")) + this.t)) + \"), (\")) + this.r)) + \", \")) + this.b)) + \"))\"));\n        },\n        contains: function(k) {\n            k = new j(k).convertTo(this.domain);\n            var l = this;\n            return ((((((((l.l <= k.l)) && ((l.r >= k.r)))) && ((l.t <= k.t)))) && ((l.b >= k.b))));\n        },\n        add: function(k, l) {\n            if (((arguments.length == 1))) {\n                if (((k.domain != \"pure\"))) {\n                    k = k.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(k.x, k.y);\n            }\n        ;\n        ;\n            var m = parseFloat(k), n = parseFloat(l);\n            return new j(((this.t + n)), ((this.r + m)), ((this.b + n)), ((this.l + m)), this.domain);\n        },\n        sub: function(k, l) {\n            if (((arguments.length == 1))) {\n                return this.add(k.mul(-1));\n            }\n             else return this.add(-k, -l)\n        ;\n        },\n        rotateAroundOrigin: function(k) {\n            var l = this.getCenter().rotate(((((k * Math.PI)) / 2))), m, n;\n            if (((k % 2))) {\n                m = this.h();\n                n = this.w();\n            }\n             else {\n                m = this.w();\n                n = this.h();\n            }\n        ;\n        ;\n            var o = ((l.y - ((n / 2)))), p = ((l.x - ((m / 2)))), q = ((o + n)), r = ((p + m));\n            return new j(o, r, q, p, this.domain);\n        },\n        boundWithin: function(k) {\n            var l = 0, m = 0;\n            if (((this.l < k.l))) {\n                l = ((k.l - this.l));\n            }\n             else if (((this.r > k.r))) {\n                l = ((k.r - this.r));\n            }\n            \n        ;\n        ;\n            if (((this.t < k.t))) {\n                m = ((k.t - this.t));\n            }\n             else if (((this.b > k.b))) {\n                m = ((k.b - this.b));\n            }\n            \n        ;\n        ;\n            return this.add(l, m);\n        },\n        getCenter: function() {\n            return new g(((this.l + ((this.w() / 2)))), ((this.t + ((this.h() / 2)))), this.domain);\n        },\n        getPositionVector: function() {\n            return new g(this.l, this.t, this.domain);\n        },\n        getDimensionVector: function() {\n            return new g(this.w(), this.h(), \"pure\");\n        },\n        convertTo: function(k) {\n            if (((this.domain == k))) {\n                return this;\n            }\n        ;\n        ;\n            if (((k == \"pure\"))) {\n                return new j(this.t, this.r, this.b, this.l, \"pure\");\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new j(0, 0, 0, 0);\n            }\n        ;\n        ;\n            var l = new g(this.l, this.t, this.domain).convertTo(k);\n            return new j(l.y, ((l.x + this.w())), ((l.y + this.h())), l.x, k);\n        }\n    });\n    i(j, {\n        deserialize: function(k) {\n            var l = k.split(\":\");\n            return new j(parseFloat(l[1]), parseFloat(l[2]), parseFloat(l[3]), parseFloat(l[0]));\n        },\n        newFromVectors: function(k, l) {\n            return new j(k.y, ((k.x + l.x)), ((k.y + l.y)), k.x, k.domain);\n        },\n        getElementBounds: function(k) {\n            return j.newFromVectors(g.getElementPosition(k), g.getElementDimensions(k));\n        },\n        getViewportBounds: function() {\n            return j.newFromVectors(g.getScrollPosition(), g.getViewportDimensions());\n        },\n        minimumBoundingBox: function(k) {\n            var l = new j(Math.min(), Math.max(), Math.max(), Math.min()), m;\n            for (var n = 0; ((n < k.length)); n++) {\n                m = k[n];\n                l.t = Math.min(l.t, m.t);\n                l.r = Math.max(l.r, m.r);\n                l.b = Math.max(l.b, m.b);\n                l.l = Math.min(l.l, m.l);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"legacy:ChatTypeaheadBehavior\", [\"ChatTypeaheadBehavior\",], function(a, b, c, d) {\n    var e = b(\"ChatTypeaheadBehavior\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.chatTypeahead = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"legacy:dom-html\", [\"HTML\",], function(a, b, c, d) {\n    a.HTML = b(\"HTML\");\n}, 3);\n__d(\"legacy:dom\", [\"DOM\",], function(a, b, c, d) {\n    a.DOM = b(\"DOM\");\n}, 3);\n__d(\"TypeaheadFacepile\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\");\n    function h() {\n    \n    };\n;\n    h.render = function(i) {\n        var j = [g.create(\"span\", {\n            className: \"splitpic leftpic\"\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[0]\n        }),]),g.create(\"span\", {\n            className: ((\"splitpic\" + ((i[2] ? \" toppic\" : \"\"))))\n        }, [g.create(\"img\", {\n            alt: \"\",\n            src: i[1]\n        }),]),];\n        if (i[2]) {\n            j.push(g.create(\"span\", {\n                className: \"splitpic bottompic\"\n            }, [g.create(\"img\", {\n                alt: \"\",\n                src: i[2]\n            }),]));\n        }\n    ;\n    ;\n        return g.create(\"span\", {\n            className: \"splitpics clearfix\"\n        }, j);\n    };\n    e.exports = h;\n});\n__d(\"NavigationMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        NAVIGATION_BEGIN: \"NavigationMessage/navigationBegin\",\n        NAVIGATION_SELECT: \"NavigationMessage/navigationSelect\",\n        NAVIGATION_FIRST_RESPONSE: \"NavigationMessage/navigationFirstResponse\",\n        NAVIGATION_COMPLETED: \"NavigationMessage/navigationCompleted\",\n        NAVIGATION_FAILED: \"NavigationMessage/navigationFailed\",\n        NAVIGATION_COUNT_UPDATE: \"NavigationMessage/navigationCount\",\n        NAVIGATION_FAVORITE_UPDATE: \"NavigationMessage/navigationFavoriteUpdate\",\n        NAVIGATION_ITEM_REMOVED: \"NavigationMessage/navigationItemRemoved\",\n        NAVIGATION_ITEM_HIDDEN: \"NavigationMessage/navigationItemHidden\",\n        INTERNAL_LOADING_BEGIN: \"NavigationMessage/internalLoadingBegin\",\n        INTERNAL_LOADING_COMPLETED: \"NavigationMessage/internalLoadingCompleted\"\n    };\n    e.exports = g;\n});\n__d(\"SimpleDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"UserAgent\",\"Vector\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"UserAgent\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this.minDragDistance = 0;\n        g.listen(n, \"mousedown\", this._start.bind(this));\n    };\n;\n    k(m.prototype, h, {\n        setMinDragDistance: function(n) {\n            this.minDragDistance = n;\n        },\n        _start: function(JSBNG__event) {\n            var n = false, o = true, p = null;\n            if (this.inform(\"mousedown\", JSBNG__event)) {\n                o = false;\n            }\n        ;\n        ;\n            if (this.minDragDistance) {\n                p = j.getEventPosition(JSBNG__event);\n            }\n             else {\n                n = true;\n                var q = this.inform(\"start\", JSBNG__event);\n                if (((q === true))) {\n                    o = false;\n                }\n                 else if (((q === false))) {\n                    n = false;\n                    return;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            var r = ((((i.ie() < 9)) ? JSBNG__document.documentElement : window)), s = g.listen(r, {\n                selectstart: ((o ? g.prevent : l)),\n                mousemove: function(JSBNG__event) {\n                    if (!n) {\n                        var t = j.getEventPosition(JSBNG__event);\n                        if (((p.distanceTo(t) < this.minDragDistance))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        n = true;\n                        if (((this.inform(\"start\", JSBNG__event) === false))) {\n                            n = false;\n                            return;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.inform(\"update\", JSBNG__event);\n                }.bind(this),\n                mouseup: function(JSBNG__event) {\n                    {\n                        var fin105keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin105i = (0);\n                        var t;\n                        for (; (fin105i < fin105keys.length); (fin105i++)) {\n                            ((t) = (fin105keys[fin105i]));\n                            {\n                                s[t].remove();\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (n) {\n                        this.inform(\"end\", JSBNG__event);\n                    }\n                     else this.inform(\"click\", JSBNG__event);\n                ;\n                ;\n                }.bind(this)\n            });\n            ((o && JSBNG__event.prevent()));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ARIA\", [\"DOM\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"emptyFunction\"), i = b(\"ge\"), j, k, l = function() {\n        j = i(\"ariaAssertiveAlert\");\n        if (!j) {\n            j = g.create(\"div\", {\n                id: \"ariaAssertiveAlert\",\n                className: \"accessible_elem\",\n                \"aria-live\": \"assertive\"\n            });\n            g.appendContent(JSBNG__document.body, j);\n        }\n    ;\n    ;\n        k = i(\"ariaPoliteAlert\");\n        if (!k) {\n            k = j.cloneNode(false);\n            k.setAttribute(\"id\", \"ariaPoliteAlert\");\n            k.setAttribute(\"aria-live\", \"polite\");\n            g.appendContent(JSBNG__document.body, k);\n        }\n    ;\n    ;\n        l = h;\n    };\n    function m(o, p) {\n        l();\n        var q = ((p ? j : k));\n        g.setContent(q, o);\n    };\n;\n    var n = {\n        owns: function(o, p) {\n            o.setAttribute(\"aria-owns\", g.getID(p));\n        },\n        setPopup: function(o, p) {\n            var q = g.getID(p);\n            o.setAttribute(\"aria-owns\", q);\n            o.setAttribute(\"aria-haspopup\", \"true\");\n            if (((o.tabIndex == -1))) {\n                o.tabIndex = 0;\n            }\n        ;\n        ;\n        },\n        announce: function(o) {\n            m(o, true);\n        },\n        notify: function(o) {\n            m(o);\n        }\n    };\n    e.exports = n;\n});\n__d(\"AudienceSelectorTags\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        hasTags: function(i) {\n            return g.hasOwnProperty(i);\n        },\n        setHasTags: function(i) {\n            if (i) {\n                g[i] = true;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"Badge\", [\"JSBNG__CSS\",\"DOM\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = b(\"cx\"), j = function(k, l) {\n        var m;\n        switch (k) {\n          case \"xsmall\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__xsmall\";\n            break;\n          case \"small\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__small\";\n            break;\n          case \"medium\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__medium\";\n            break;\n          case \"large\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__large\";\n            break;\n          case \"xlarge\":\n            m = \"-cx-PUBLIC-profileBadge__root -cx-PUBLIC-profileBadge__xlarge\";\n            break;\n        };\n    ;\n        if (m) {\n            var n = h.create(\"span\", {\n                className: m\n            });\n            if (((l === \"verified\"))) {\n                g.addClass(n, \"-cx-PRIVATE-verifiedBadge__root\");\n            }\n             else return null\n        ;\n            return n;\n        }\n    ;\n    ;\n        return null;\n    };\n    e.exports = j;\n});\n__d(\"BasicTypeaheadRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(j, k) {\n        var l = [];\n        if (j.icon) {\n            l.push(h.create(\"img\", {\n                alt: \"\",\n                src: j.icon\n            }));\n        }\n    ;\n    ;\n        if (j.text) {\n            var m = [j.text,];\n            if (j.verified) {\n                m.push(g(\"xsmall\", \"verified\"));\n            }\n        ;\n        ;\n            l.push(h.create(\"span\", {\n                className: \"text\"\n            }, m));\n        }\n    ;\n    ;\n        if (j.subtext) {\n            l.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, [j.subtext,]));\n        }\n    ;\n    ;\n        var n = h.create(\"li\", {\n            className: ((j.type || \"\"))\n        }, l);\n        if (j.text) {\n            n.setAttribute(\"aria-label\", j.text);\n        }\n    ;\n    ;\n        return n;\n    };\n;\n    i.className = \"basic\";\n    e.exports = i;\n});\n__d(\"TypeaheadView\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BasicTypeaheadRenderer\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BasicTypeaheadRenderer\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"$\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\");\n    function p(q, r) {\n        this.element = this.JSBNG__content = m(q);\n        this.showBadges = r.showBadges;\n        n(this, r);\n    };\n;\n    n(p.prototype, h, {\n        events: [\"highlight\",\"render\",\"reset\",\"select\",\"beforeRender\",\"next\",\"prev\",],\n        renderer: i,\n        autoSelect: false,\n        ignoreMouseover: false,\n        init: function() {\n            this.init = o;\n            this.initializeEvents();\n            this.reset();\n        },\n        initializeEvents: function() {\n            g.listen(this.element, {\n                mouseup: this.mouseup.bind(this),\n                mouseover: this.mouseover.bind(this)\n            });\n        },\n        setTypeahead: function(q) {\n            this.typeahead = q;\n        },\n        setAccessibilityControlElement: function(q) {\n            this.accessibilityElement = q;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        mouseup: function(JSBNG__event) {\n            if (((JSBNG__event.button != 2))) {\n                this.select(true);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        mouseover: function(JSBNG__event) {\n            if (this.ignoreMouseover) {\n                this.ignoreMouseover = false;\n                return;\n            }\n        ;\n        ;\n            if (this.visible) {\n                this.highlight(this.getIndex(JSBNG__event));\n            }\n        ;\n        ;\n        },\n        reset: function(q) {\n            if (!q) {\n                this.disableAutoSelect = false;\n            }\n        ;\n        ;\n            this.justRendered = false;\n            this.justShown = false;\n            this.index = -1;\n            this.items = [];\n            this.results = [];\n            this.value = \"\";\n            this.JSBNG__content.innerHTML = \"\";\n            this.inform(\"reset\");\n            return this;\n        },\n        getIndex: function(JSBNG__event) {\n            return this.items.indexOf(l.byTag(JSBNG__event.getTarget(), \"li\"));\n        },\n        JSBNG__getSelection: function() {\n            var q = ((this.results[this.index] || null));\n            return ((this.visible ? q : null));\n        },\n        isEmpty: function() {\n            return !this.results.length;\n        },\n        isVisible: function() {\n            return !!this.visible;\n        },\n        show: function() {\n            j.show(this.element);\n            if (((this.results && this.results.length))) {\n                if (((((this.autoSelect && this.accessibilityElement)) && this.selected))) {\n                    this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                }\n            ;\n            }\n        ;\n        ;\n            ((this.accessibilityElement && this.accessibilityElement.setAttribute(\"aria-expanded\", \"true\")));\n            this.visible = true;\n            return this;\n        },\n        hide: function() {\n            j.hide(this.element);\n            if (this.accessibilityElement) {\n                this.accessibilityElement.setAttribute(\"aria-expanded\", \"false\");\n                this.accessibilityElement.removeAttribute(\"aria-activedescendant\");\n            }\n        ;\n        ;\n            this.visible = false;\n            return this;\n        },\n        render: function(q, r) {\n            this.value = q;\n            if (!r.length) {\n                ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n                this.reset(true);\n                return;\n            }\n        ;\n        ;\n            this.justRendered = true;\n            if (!this.results.length) {\n                this.justShown = true;\n            }\n        ;\n        ;\n            var s = {\n                results: r,\n                value: q\n            };\n            this.inform(\"beforeRender\", s);\n            r = s.results;\n            var t = this.getDefaultIndex(r);\n            if (((((this.index > 0)) && ((this.index !== this.getDefaultIndex(this.results)))))) {\n                var u = this.results[this.index];\n                for (var v = 0, w = r.length; ((v < w)); ++v) {\n                    if (((u.uid == r[v].uid))) {\n                        t = v;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.results = r;\n            k.setContent(this.JSBNG__content, this.buildResults(r));\n            this.items = this.getItems();\n            this.highlight(t, false);\n            this.inform(\"render\", r);\n        },\n        getItems: function() {\n            return k.scry(this.JSBNG__content, \"li\");\n        },\n        buildResults: function(q) {\n            var r, s = null;\n            if (((typeof this.renderer == \"function\"))) {\n                r = this.renderer;\n                s = ((this.renderer.className || \"\"));\n            }\n             else {\n                r = a.TypeaheadRenderers[this.renderer];\n                s = this.renderer;\n            }\n        ;\n        ;\n            r = r.bind(this);\n            var t = this.showBadges, u = q.map(function(w, x) {\n                if (!t) {\n                    w.verified = null;\n                }\n            ;\n            ;\n                var y = ((w.node || r(w, x)));\n                y.setAttribute(\"role\", \"option\");\n                return y;\n            }), v = k.create(\"ul\", {\n                className: s,\n                id: ((\"typeahead_list_\" + ((this.typeahead ? k.getID(this.typeahead) : k.getID(this.element)))))\n            }, u);\n            v.setAttribute(\"role\", \"listbox\");\n            return v;\n        },\n        getDefaultIndex: function() {\n            var q = ((this.autoSelect && !this.disableAutoSelect));\n            return ((((((this.index < 0)) && !q)) ? -1 : 0));\n        },\n        next: function() {\n            this.highlight(((this.index + 1)));\n            this.inform(\"next\", this.selected);\n        },\n        prev: function() {\n            this.highlight(((this.index - 1)));\n            this.inform(\"prev\", this.selected);\n        },\n        getItemText: function(q) {\n            var r = \"\";\n            if (q) {\n                r = q.getAttribute(\"aria-label\");\n                if (!r) {\n                    r = k.getText(q);\n                    q.setAttribute(\"aria-label\", r);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return r;\n        },\n        setIsViewingSelectedItems: function(q) {\n            this.viewingSelected = q;\n            return this;\n        },\n        getIsViewingSelectedItems: function() {\n            return !!this.viewingSelected;\n        },\n        highlight: function(q, r) {\n            var s = true;\n            if (this.selected) {\n                j.removeClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            if (((q > ((this.items.length - 1))))) {\n                q = -1;\n            }\n             else if (((q < -1))) {\n                q = ((this.items.length - 1));\n            }\n            \n        ;\n        ;\n            if (((((q >= 0)) && ((q < this.items.length))))) {\n                if (((this.selected && ((this.getItemText(this.items[q]) === this.getItemText(this.selected)))))) {\n                    s = false;\n                }\n            ;\n            ;\n                this.selected = this.items[q];\n                j.addClass(this.selected, \"selected\");\n                this.selected.setAttribute(\"aria-selected\", \"true\");\n                if (this.accessibilityElement) {\n                    (function() {\n                        this.accessibilityElement.setAttribute(\"aria-activedescendant\", k.getID(this.selected));\n                    }).bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else ((this.accessibilityElement && this.accessibilityElement.removeAttribute(\"aria-activedescendant\")));\n        ;\n        ;\n            this.index = q;\n            this.disableAutoSelect = ((q == -1));\n            var t = ((q !== -1)), u = this.getItemText(this.selected);\n            if (((((((((q !== -1)) && this.isVisible())) && u)) && this.autoSelect))) {\n                if (this.justShown) {\n                    this.justRendered = false;\n                    this.justShown = false;\n                    t = false;\n                }\n                 else if (((s && this.justRendered))) {\n                    this.justRendered = false;\n                    t = false;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            if (((r !== false))) {\n                this.inform(\"highlight\", {\n                    index: q,\n                    selected: this.results[q],\n                    element: this.selected\n                });\n            }\n        ;\n        ;\n        },\n        select: function(q) {\n            var r = this.index, s = this.results[r], t = this.element.getAttribute(\"id\");\n            if (s) {\n                this.inform(\"select\", {\n                    index: r,\n                    clicked: !!q,\n                    selected: s,\n                    id: t,\n                    query: this.value\n                });\n                this.inform(\"afterSelect\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"BucketedTypeaheadView\", [\"Class\",\"DOM\",\"tx\",\"TypeaheadView\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"tx\"), j = b(\"TypeaheadView\"), k = b(\"copyProperties\");\n    function l(m, n) {\n        this.parent.construct(this, m, n);\n    };\n;\n    g.extend(l, j);\n    k(l.prototype, {\n        render: function(m, n, o) {\n            n = this.buildBuckets(m, n);\n            return this.parent.render(m, n, o);\n        },\n        highlight: function(m, n) {\n            if (((((m == -1)) && ((this.index !== 0))))) {\n                m = this.index;\n            }\n        ;\n        ;\n            while (((((((m >= 0)) && ((m < this.items.length)))) && !this.isHighlightable(this.results[m])))) {\n                m = ((m + 1));\n            ;\n            };\n        ;\n            this.parent.highlight(m, n);\n        },\n        buildBuckets: function(m, n) {\n            if (((((!this.typeObjects || !n)) || !n.length))) {\n                return n;\n            }\n        ;\n        ;\n            var o = [], p = {\n            };\n            for (var q = 0; ((q < n.length)); ++q) {\n                var r = n[q], s = ((r.render_type || r.type));\n                if (!p.hasOwnProperty(s)) {\n                    p[s] = o.length;\n                    o.push([this.buildBucketHeader(s),]);\n                }\n            ;\n            ;\n                r.classNames = s;\n                r.groupIndex = p[s];\n                r.indexInGroup = ((o[r.groupIndex].length - 1));\n                o[r.groupIndex].push(r);\n            };\n        ;\n            {\n                var fin106keys = ((window.top.JSBNG_Replay.forInKeys)((this.typeObjects))), fin106i = (0);\n                (0);\n                for (; (fin106i < fin106keys.length); (fin106i++)) {\n                    ((s) = (fin106keys[fin106i]));\n                    {\n                        if (((!p.hasOwnProperty(s) && this.typeObjects[s].show_always))) {\n                            p[s] = o.length;\n                            o.push([this.buildBucketHeader(s),]);\n                            r = this.buildNoResultsEntry();\n                            r.classNames = r.type;\n                            r.groupIndex = p[s];\n                            r.indexInGroup = ((o[r.groupIndex].length - 1));\n                            o[r.groupIndex].push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = [];\n            if (this.typeObjectsOrder) {\n                for (var u = 0; ((u < this.typeObjectsOrder.length)); ++u) {\n                    var v = this.typeObjectsOrder[u];\n                    if (p.hasOwnProperty(v)) {\n                        t = t.concat(o[p[v]]);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else for (var w = 0; ((w < o.length)); ++w) {\n                t = t.concat(o[w]);\n            ;\n            }\n        ;\n        ;\n            return t;\n        },\n        buildNoResultsEntry: function() {\n            return {\n                uid: \"disabled_result\",\n                type: \"disabled_result\",\n                text: \"No Results\"\n            };\n        },\n        buildBucketHeader: function(m) {\n            var n = this.typeObjects[m];\n            if (((n === undefined))) {\n                throw new Error(((((m + \" is undefined in \")) + JSON.stringify(this.typeObjects))));\n            }\n        ;\n        ;\n            if (n.markup) {\n                n.text = n.markup;\n                delete n.markup;\n            }\n        ;\n        ;\n            return this.typeObjects[m];\n        },\n        buildResults: function(m) {\n            var n = this.parent.buildResults(m);\n            if (this.typeObjects) {\n                return h.create(\"div\", {\n                    className: \"bucketed\"\n                }, [n,]);\n            }\n             else return n\n        ;\n        },\n        isHighlightable: function(m) {\n            return ((((m.type != \"header\")) && ((m.type != \"disabled_result\"))));\n        },\n        select: function(m) {\n            var n = this.results[this.index];\n            if (((n && this.isHighlightable(n)))) {\n                this.parent.select(m);\n            }\n        ;\n        ;\n        },\n        normalizeIndex: function(m) {\n            var n = this.results.length;\n            if (((n === 0))) {\n                return -1;\n            }\n             else if (((m < -1))) {\n                return ((((((m % n)) + n)) + 1));\n            }\n             else if (((m >= n))) {\n                return ((((m % n)) - 1));\n            }\n             else return m\n            \n            \n        ;\n        },\n        getDefaultIndex: function(m) {\n            var n = ((this.autoSelect && !this.disableAutoSelect));\n            if (((((this.index < 0)) && !n))) {\n                return -1;\n            }\n        ;\n        ;\n            if (((m.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var o = 0;\n            while (((!this.isHighlightable(m) && ((o < m.length))))) {\n                o++;\n            ;\n            };\n        ;\n            return o;\n        },\n        prev: function() {\n            var m = this.results[this.normalizeIndex(((this.index - 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index - 1)));\n                m = this.results[this.normalizeIndex(((this.index - 1)))];\n            };\n        ;\n            return this.parent.prev();\n        },\n        next: function() {\n            var m = this.results[this.normalizeIndex(((this.index + 1)))];\n            while (((m && !this.isHighlightable(m)))) {\n                this.index = this.normalizeIndex(((this.index + 1)));\n                m = this.results[this.normalizeIndex(((this.index + 1)))];\n            };\n        ;\n            return this.parent.next();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerHideOnTransition\", [\"function-extensions\",\"PageTransitions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PageTransitions\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _enabled: false,\n        _subscribed: false,\n        enable: function() {\n            this._enabled = true;\n            if (!this._subscribed) {\n                this._subscribe.bind(this).defer();\n                this._subscribed = true;\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._enabled = false;\n        },\n        _subscribe: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_104), function() {\n            g.registerHandler(function() {\n                if (this._enabled) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                this._subscribed = false;\n            }.bind(this));\n        }))\n    });\n    e.exports = i;\n});\n__d(\"SVGChecker\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        isSVG: function(g) {\n            return ((!!g.ownerSVGElement || ((g.tagName.toLowerCase() === \"svg\"))));\n        },\n        isDisplayed: function(g) {\n            try {\n                var i = g.getBBox();\n                if (((i && ((((i.height === 0)) || ((i.width === 0))))))) {\n                    return false;\n                }\n            ;\n            ;\n            } catch (h) {\n                return false;\n            };\n        ;\n            return true;\n        }\n    };\n});\n__d(\"ContextualLayer\", [\"JSBNG__Event\",\"Arbiter\",\"ARIA\",\"Class\",\"ContextualThing\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerHideOnTransition\",\"Locale\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"Vector\",\"SVGChecker\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",\"getOverlayZIndex\",\"removeFromArray\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ARIA\"), j = b(\"Class\"), k = b(\"ContextualThing\"), l = b(\"JSBNG__CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Layer\"), p = b(\"LayerHideOnTransition\"), q = b(\"Locale\"), r = b(\"Parent\"), s = b(\"JSBNG__Rect\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"SVGChecker\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"emptyFunction\"), z = b(\"getOverlayZIndex\"), aa = b(\"removeFromArray\"), ba = b(\"throttle\");\n    function ca(ja) {\n        return ((((ja.getPosition() === \"left\")) || ((ja.isVertical() && ((ja.getAlignment() === \"right\"))))));\n    };\n;\n    function da(ja) {\n        var ka = ja.parentNode;\n        if (ka) {\n            var la = t.get(ka, \"position\");\n            if (((la === \"static\"))) {\n                if (((ka === JSBNG__document.body))) {\n                    ka = JSBNG__document.documentElement;\n                }\n                 else ka = da(ka);\n            ;\n            ;\n            }\n             else return ka\n        ;\n        }\n         else ka = JSBNG__document.documentElement;\n    ;\n    ;\n        return ka;\n    };\n;\n    function ea(ja, ka) {\n        this.parent.construct(this, ja, ka);\n    };\n;\n    var fa = [];\n    h.subscribe(\"reflow\", function() {\n        fa.forEach(function(ja) {\n            if (((ja.updatePosition() === false))) {\n                ja.hide();\n            }\n        ;\n        ;\n        });\n    });\n    j.extend(ea, o);\n    x(ea.prototype, {\n        _contentWrapper: null,\n        _content: null,\n        _contextNode: null,\n        _contextBounds: null,\n        _contextSelector: null,\n        _parentLayer: null,\n        _parentSubscription: null,\n        _orientation: null,\n        _orientationClass: null,\n        _shouldSetARIAProperties: true,\n        _configure: function(ja, ka) {\n            this.parent._configure(ja, ka);\n            if (ja.context) {\n                this.setContext(ja.context);\n            }\n             else if (ja.contextID) {\n                this._setContextID(ja.contextID);\n            }\n             else if (ja.contextSelector) {\n                this._setContextSelector(ja.contextSelector);\n            }\n            \n            \n        ;\n        ;\n            this.setPosition(ja.position);\n            this.setAlignment(ja.alignment);\n            this.setOffsetX(ja.offsetX);\n            this.setOffsetY(ja.offsetY);\n            this._content = ka;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([p,]);\n        },\n        _buildWrapper: function(ja, ka) {\n            this._contentWrapper = n.create(\"div\", {\n                className: \"uiContextualLayer\"\n            }, ka);\n            return n.create(\"div\", {\n                className: \"uiContextualLayerPositioner\"\n            }, this._contentWrapper);\n        },\n        getInsertParent: function() {\n            var ja = this._insertParent;\n            if (!ja) {\n                var ka = this.getContext();\n                if (ka) {\n                    ja = r.byClass(ka, \"uiContextualLayerParent\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ((ja || this.parent.getInsertParent()));\n        },\n        setContent: function(ja) {\n            this._content = ja;\n            n.setContent(this._contentWrapper, this._content);\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setContext: function(ja) {\n            return this.setContextWithBounds(ja, null);\n        },\n        setContextWithBounds: function(ja, ka) {\n            this._contextNode = ja;\n            this._contextBounds = ((ka || null));\n            this._contextSelector = this._contextScrollParent = null;\n            if (this._shown) {\n                k.register(this.getRoot(), this._contextNode);\n                this.updatePosition();\n            }\n        ;\n        ;\n            this._setParentSubscription();\n            this.setARIAProperties();\n            return this;\n        },\n        shouldSetARIAProperties: function(ja) {\n            this._shouldSetARIAProperties = ja;\n            return this;\n        },\n        setARIAProperties: function() {\n            if (this._shouldSetARIAProperties) {\n                i.setPopup(this.getCausalElement(), this.getRoot());\n            }\n        ;\n        ;\n            return this;\n        },\n        _setContextID: function(ja) {\n            this._contextSelector = ((\"#\" + ja));\n            this._contextNode = null;\n        },\n        _setContextSelector: function(ja) {\n            this._contextSelector = ja;\n            this._contextNode = null;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.getContext()));\n        },\n        _setParentSubscription: function() {\n            var ja = this.getContext(), ka = null;\n            while (((ja !== null))) {\n                ka = m.get(ja, \"layer\");\n                if (ka) {\n                    break;\n                }\n            ;\n            ;\n                ja = ja.parentNode;\n            };\n        ;\n            if (((ka === this._parentLayer))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._parentLayer && this._parentSubscription))) {\n                this._parentLayer.unsubscribe(this._parentSubscription);\n                this._parentSubscription = null;\n            }\n        ;\n        ;\n            if (ka) {\n                this._parentSubscription = ka.subscribe(\"hide\", this.hide.bind(this));\n            }\n        ;\n        ;\n            this._parentLayer = ka;\n        },\n        setPosition: function(ja) {\n            if (this._getOrientation().setDefaultPosition(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setAlignment: function(ja) {\n            if (this._getOrientation().setDefaultAlignment(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetX: function(ja) {\n            if (this._getOrientation().setDefaultOffsetX(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        setOffsetY: function(ja) {\n            if (this._getOrientation().setDefaultOffsetY(ja)) {\n                ((this._shown && this.updatePosition()));\n            }\n        ;\n        ;\n            return this;\n        },\n        _getOrientation: function() {\n            if (!this._orientation) {\n                this._orientation = new ia();\n            }\n        ;\n        ;\n            return this._orientation;\n        },\n        getContentRoot: function() {\n            return this._contentWrapper;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            if (!this._contextNode) {\n                this._contextNode = n.JSBNG__find(JSBNG__document, this._contextSelector);\n            }\n        ;\n        ;\n            return this._contextNode;\n        },\n        getContextBounds: function(ja) {\n            if (this._contextBounds) {\n                return this._contextBounds.convertTo(ja);\n            }\n        ;\n        ;\n            var ka = this.getContext();\n            return s.newFromVectors(u.getElementPosition(ka, ja), u.getElementDimensions(ka));\n        },\n        getContextScrollParent: function() {\n            if (!this._contextScrollParent) {\n                this._contextScrollParent = t.getScrollParent(this.getContext());\n            }\n        ;\n        ;\n            return this._contextScrollParent;\n        },\n        setInsertParent: function(ja) {\n            this._insertScrollParent = null;\n            return this.parent.setInsertParent(ja);\n        },\n        getInsertScrollParent: function() {\n            if (!this._insertScrollParent) {\n                this._insertScrollParent = t.getScrollParent(this.getInsertParent());\n            }\n        ;\n        ;\n            return this._insertScrollParent;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            this.parent.show();\n            if (this._shown) {\n                k.register(this.getRoot(), this.getContext());\n                fa.push(this);\n                this._resizeListener = ((this._resizeListener || g.listen(window, \"resize\", ba(this.updatePosition.bind(this)))));\n            }\n        ;\n        ;\n            return this;\n        },\n        finishHide: function() {\n            aa(fa, this);\n            ((this._resizeListener && this._resizeListener.remove()));\n            this._resizeListener = null;\n            return this.parent.finishHide();\n        },\n        isFixed: function() {\n            return ((t.isFixed(this.getContext()) && !t.isFixed(this.getInsertParent())));\n        },\n        updatePosition: function() {\n            var ja = this.getContext();\n            if (!ja) {\n                return false;\n            }\n        ;\n        ;\n            var ka = this.isFixed();\n            if (((!ka && !((ja.offsetParent || ((v.isSVG(ja) && v.isDisplayed(ja)))))))) {\n                return false;\n            }\n        ;\n        ;\n            var la = this.getRoot();\n            t.set(la, \"width\", ((u.getViewportDimensions().x + \"px\")));\n            var ma = this._getOrientation();\n            this.inform(\"adjust\", ma.reset());\n            if (!ma.isValid()) {\n                return false;\n            }\n        ;\n        ;\n            this._updateWrapperPosition(ma);\n            this._updateWrapperClass(ma);\n            l.conditionClass(la, \"uiContextualLayerPositionerFixed\", ka);\n            var na, oa, pa = ((ka ? \"viewport\" : \"JSBNG__document\")), qa = ((ka ? JSBNG__document.documentElement : da(la)));\n            if (((qa === JSBNG__document.documentElement))) {\n                na = new u(0, 0);\n                oa = JSBNG__document.documentElement.clientWidth;\n            }\n             else if (!la.offsetParent) {\n                return false;\n            }\n             else {\n                na = u.getElementPosition(qa, pa);\n                oa = qa.offsetWidth;\n                if (((qa !== JSBNG__document.body))) {\n                    na = na.sub(new u(qa.scrollLeft, qa.scrollTop));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var ra = this.getContextBounds(pa), sa = ((ra.l - na.x)), ta = ((ra.t - na.y)), ua = ra.h(), va = ra.w(), wa = q.isRTL();\n            if (((ma.getPosition() === \"below\"))) {\n                ta += ua;\n            }\n        ;\n        ;\n            if (((((((ma.getPosition() === \"right\")) || ((ma.isVertical() && ((ma.getAlignment() === \"right\")))))) != wa))) {\n                sa += va;\n            }\n        ;\n        ;\n            var xa = ma.getOffsetX();\n            if (((ma.isVertical() && ((ma.getAlignment() === \"center\"))))) {\n                xa += ((((va - this.getContentRoot().offsetWidth)) / 2));\n            }\n        ;\n        ;\n            if (wa) {\n                xa *= -1;\n            }\n        ;\n        ;\n            var ya = \"left\", za = Math.floor(((sa + xa)));\n            if (((ca(ma) !== wa))) {\n                ya = \"right\";\n                za = ((oa - za));\n            }\n        ;\n        ;\n            t.set(la, ya, ((za + \"px\")));\n            t.set(la, ((((ya === \"left\")) ? \"right\" : \"left\")), \"\");\n            var ab = this.getInsertScrollParent(), bb;\n            if (((ab !== window))) {\n                bb = ab.clientWidth;\n            }\n             else bb = JSBNG__document.documentElement.clientWidth;\n        ;\n        ;\n            var cb = u.getElementPosition(la).x;\n            if (((ya === \"left\"))) {\n                if (((((bb - cb)) > 0))) {\n                    t.set(la, \"width\", ((((bb - cb)) + \"px\")));\n                }\n                 else t.set(la, \"width\", \"\");\n            ;\n            ;\n            }\n             else t.set(la, \"width\", ((((cb + la.offsetWidth)) + \"px\")));\n        ;\n        ;\n            t.set(la, \"JSBNG__top\", ((((ta + ma.getOffsetY())) + \"px\")));\n            var db = z(ja, this.getInsertParent());\n            t.set(la, \"z-index\", ((((db > 200)) ? db : \"\")));\n            this.inform(\"reposition\", ma);\n            return true;\n        },\n        _updateWrapperPosition: function(ja) {\n            var ka = ((ja.getPosition() === \"above\"));\n            t.set(this._contentWrapper, \"bottom\", ((ka ? \"0\" : null)));\n            var la = ((q.isRTL() ? \"left\" : \"right\")), ma = ca(ja);\n            t.set(this._contentWrapper, la, ((ma ? \"0\" : null)));\n        },\n        _updateWrapperClass: function(ja) {\n            var ka = ja.getClassName();\n            if (((ka === this._orientationClass))) {\n                return;\n            }\n        ;\n        ;\n            if (this._orientationClass) {\n                l.removeClass(this._contentWrapper, this._orientationClass);\n            }\n        ;\n        ;\n            this._orientationClass = ka;\n            l.addClass(this._contentWrapper, ka);\n        },\n        simulateOrientation: function(ja, ka) {\n            var la = ja.getClassName();\n            if (((la === this._orientationClass))) {\n                return ka();\n            }\n             else {\n                if (this._orientationClass) {\n                    l.removeClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                l.addClass(this._contentWrapper, la);\n                var ma = ka();\n                l.removeClass(this._contentWrapper, la);\n                if (this._orientationClass) {\n                    l.addClass(this._contentWrapper, this._orientationClass);\n                }\n            ;\n            ;\n                return ma;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.parent.destroy();\n            this._contentWrapper = null;\n            this._content = null;\n            return this;\n        }\n    });\n    var ga = y.thatReturnsArgument, ha = y.thatReturnsArgument;\n    function ia() {\n        this._default = {\n            _position: \"above\",\n            _alignment: \"left\",\n            _offsetX: 0,\n            _offsetY: 0,\n            _valid: true\n        };\n        this.reset();\n    };\n;\n    ia.OPPOSITE = {\n        above: \"below\",\n        below: \"above\",\n        left: \"right\",\n        right: \"left\"\n    };\n    x(ia.prototype, {\n        setPosition: function(ja) {\n            this._position = ga(ja);\n            return this;\n        },\n        setAlignment: function(ja) {\n            this._alignment = ha(ja);\n            return this;\n        },\n        getOppositePosition: function() {\n            return ia.OPPOSITE[this.getPosition()];\n        },\n        invalidate: function() {\n            this._valid = false;\n            return this;\n        },\n        getPosition: function() {\n            return ((this._position || \"above\"));\n        },\n        getAlignment: function() {\n            return ((this._alignment || \"left\"));\n        },\n        getOffsetX: function() {\n            var ja = ((this._offsetX || 0));\n            if (!this.isVertical()) {\n                if (((this._default._position !== this._position))) {\n                    ja *= -1;\n                }\n            ;\n            ;\n            }\n             else if (((this._default._alignment !== this._alignment))) {\n                ja *= -1;\n            }\n            \n        ;\n        ;\n            return ja;\n        },\n        getOffsetY: function() {\n            var ja = ((this._offsetY || 0));\n            if (((this.isVertical() && ((this._default._position !== this._position))))) {\n                ja *= -1;\n            }\n        ;\n        ;\n            return ja;\n        },\n        getClassName: function() {\n            var ja = this.getAlignment(), ka = this.getPosition();\n            if (((ka === \"below\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerBelowLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerBelowRight\";\n                }\n                 else return \"uiContextualLayerBelowCenter\"\n                \n            ;\n            }\n             else if (((ka === \"above\"))) {\n                if (((ja === \"left\"))) {\n                    return \"uiContextualLayerAboveLeft\";\n                }\n                 else if (((ja === \"right\"))) {\n                    return \"uiContextualLayerAboveRight\";\n                }\n                 else return \"uiContextualLayerAboveCenter\"\n                \n            ;\n            }\n             else if (((ka === \"left\"))) {\n                return \"uiContextualLayerLeft\";\n            }\n             else return \"uiContextualLayerRight\"\n            \n            \n        ;\n        },\n        isValid: function() {\n            return this._valid;\n        },\n        isVertical: function() {\n            return ((((this.getPosition() === \"above\")) || ((this.getPosition() === \"below\"))));\n        },\n        reset: function(ja, ka) {\n            x(this, this._default);\n            return this;\n        },\n        setDefaultPosition: function(ja) {\n            var ka = this._default._position;\n            this._default._position = ga(ja);\n            return ((ka !== ja));\n        },\n        setDefaultAlignment: function(ja) {\n            var ka = this._default._alignment;\n            this._default._alignment = ha(ja);\n            return ((ka !== ja));\n        },\n        setDefaultOffsetX: function(ja) {\n            var ka = this._default._offsetX;\n            this._default._offsetX = ja;\n            return ((ka !== ja));\n        },\n        setDefaultOffsetY: function(ja) {\n            var ka = this._default._offsetY;\n            this._default._offsetY = ja;\n            return ((ka !== ja));\n        }\n    });\n    e.exports = ea;\n});\n__d(\"ContextualLayerDimensions\", [\"DOM\",\"Locale\",\"JSBNG__Rect\",\"Vector\",\"ViewportBounds\",\"ge\",\"getOverlayZIndex\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Locale\"), i = b(\"JSBNG__Rect\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"getOverlayZIndex\"), n = {\n        getViewportRect: function(o) {\n            var p = l(\"globalContainer\"), q = o.getContext(), r = ((((p && g.contains(p, q))) || ((m(q) < 300)))), s = i.getViewportBounds();\n            if (r) {\n                s.t += k.getTop();\n                if (h.isRTL()) {\n                    s.r -= k.getLeft();\n                    s.l += k.getRight();\n                }\n                 else {\n                    s.r -= k.getRight();\n                    s.l += k.getLeft();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return s;\n        },\n        getLayerRect: function(o, p) {\n            var q = o.getContextBounds(\"viewport\"), r = o.simulateOrientation(p, function() {\n                return j.getElementDimensions(o.getContent());\n            }), s = ((q.t + p.getOffsetY()));\n            if (((p.getPosition() === \"above\"))) {\n                s -= r.y;\n            }\n             else if (((p.getPosition() === \"below\"))) {\n                s += ((q.b - q.t));\n            }\n            \n        ;\n        ;\n            var t = ((q.l + p.getOffsetX())), u = ((q.r - q.l));\n            if (p.isVertical()) {\n                var v = p.getAlignment();\n                if (((v === \"center\"))) {\n                    t += ((((u - r.x)) / 2));\n                }\n                 else if (((((v === \"right\")) !== h.isRTL()))) {\n                    t += ((u - r.x));\n                }\n                \n            ;\n            ;\n            }\n             else if (((((p.getPosition() === \"right\")) !== h.isRTL()))) {\n                t += u;\n            }\n             else t -= r.x;\n            \n        ;\n        ;\n            return new i(s, ((t + r.x)), ((s + r.y)), t, \"viewport\");\n        }\n    };\n    e.exports = n;\n});\n__d(\"ContextualLayerAutoFlip\", [\"ContextualLayerDimensions\",\"DOM\",\"Vector\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualLayerDimensions\"), h = b(\"DOM\"), i = b(\"Vector\"), j = b(\"arrayContains\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"adjust\", this._adjustOrientation.bind(this));\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._layer.updatePosition();\n            }\n        ;\n        ;\n        },\n        _adjustOrientation: function(m, n) {\n            var o = this._getValidPositions(n);\n            if (!o.length) {\n                n.invalidate();\n                return;\n            }\n        ;\n        ;\n            var p = g.getViewportRect(this._layer), q = this._getValidAlignments(n), r, s, t;\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                for (s = 0; ((s < o.length)); s++) {\n                    n.setPosition(o[s]);\n                    t = g.getLayerRect(this._layer, n);\n                    if (p.contains(t)) {\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            n.setPosition(((j(o, \"below\") ? \"below\" : o[0])));\n            for (r = 0; ((r < q.length)); r++) {\n                n.setAlignment(q[r]);\n                t = g.getLayerRect(this._layer, n);\n                if (((((t.l >= p.l)) && ((t.r <= p.r))))) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            n.setAlignment(q[0]);\n        },\n        _getValidPositions: function(m) {\n            var n = [m.getPosition(),m.getOppositePosition(),], o = this._layer.getContextScrollParent();\n            if (((((o === window)) || ((o === h.getDocumentScrollElement()))))) {\n                return n;\n            }\n        ;\n        ;\n            var p = this._layer.getContext(), q = i.getElementPosition(o, \"viewport\").y, r = i.getElementPosition(p, \"viewport\").y;\n            if (m.isVertical()) {\n                return n.filter(function(t) {\n                    if (((t === \"above\"))) {\n                        return ((r >= q));\n                    }\n                     else {\n                        var u = ((q + o.offsetHeight)), v = ((r + p.offsetHeight));\n                        return ((v <= u));\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                var s = ((q + o.offsetHeight));\n                if (((((r >= q)) && ((((r + p.offsetHeight)) <= s))))) {\n                    return n;\n                }\n                 else return []\n            ;\n            }\n        ;\n        ;\n        },\n        _getValidAlignments: function(m) {\n            var n = [\"left\",\"right\",\"center\",], o = m.getAlignment(), p = n.indexOf(o);\n            if (((p > 0))) {\n                n.splice(p, 1);\n                n.unshift(o);\n            }\n        ;\n        ;\n            return n;\n        }\n    });\n    e.exports = l;\n});\n__d(\"ContextualLayerHideOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"contextchange\", this._handleContextChange.bind(this)),this._layer.subscribe(\"show\", this.attach.bind(this)),this._layer.subscribe(\"hide\", this.detach.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        attach: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            if (((j === window))) {\n                return;\n            }\n        ;\n        ;\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.hide.bind(this._layer));\n        },\n        detach: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        },\n        _handleContextChange: function() {\n            this.detach();\n            if (this._layer.isShown()) {\n                this.attach();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ContextualTypeaheadView\", [\"BucketedTypeaheadView\",\"JSBNG__CSS\",\"Class\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"ContextualLayerHideOnScroll\",\"DOM\",\"DOMDimensions\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"BucketedTypeaheadView\"), h = b(\"JSBNG__CSS\"), i = b(\"Class\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerAutoFlip\"), l = b(\"ContextualLayerHideOnScroll\"), m = b(\"DOM\"), n = b(\"DOMDimensions\"), o = b(\"Style\"), p = b(\"copyProperties\");\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n    };\n;\n    i.extend(q, g);\n    p(q.prototype, {\n        init: function() {\n            this.initializeLayer();\n            this.parent.init();\n        },\n        initializeLayer: function() {\n            this.context = this.getContext();\n            this.wrapper = m.create(\"div\");\n            m.appendContent(this.wrapper, this.element);\n            h.addClass(this.element, \"uiContextualTypeaheadView\");\n            this.layer = new j({\n                context: this.context,\n                position: \"below\",\n                alignment: this.alignment,\n                causalElement: this.causalElement,\n                permanent: true\n            }, this.wrapper);\n            this.layer.enableBehavior(l);\n            if (((o.isFixed(this.context) || this.autoflip))) {\n                this.layer.enableBehavior(k);\n            }\n        ;\n        ;\n            this.subscribe(\"render\", this.renderLayer.bind(this));\n        },\n        show: function() {\n            if (this.minWidth) {\n                o.set(this.wrapper, \"min-width\", ((this.minWidth + \"px\")));\n            }\n             else if (this.width) {\n                o.set(this.wrapper, \"width\", ((this.width + \"px\")));\n            }\n             else o.set(this.wrapper, \"width\", ((n.getElementDimensions(this.context).width + \"px\")));\n            \n        ;\n        ;\n            var r = this.parent.show();\n            this.layer.show();\n            return r;\n        },\n        hide: function() {\n            this.layer.hide();\n            return this.parent.hide();\n        },\n        renderLayer: function() {\n            if (!this.isVisible()) {\n                return;\n            }\n        ;\n        ;\n            if (this.layer.isShown()) {\n                this.layer.updatePosition();\n            }\n             else this.layer.show();\n        ;\n        ;\n        },\n        clearText: function() {\n            this.layer.getCausalElement().value = \"\";\n        },\n        getContext: function() {\n            return this.element.parentNode;\n        }\n    });\n    e.exports = q;\n});\n__d(\"DialogHideOnSuccess\", [\"copyProperties\",\"JSBNG__CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"JSBNG__CSS\"), i = b(\"cx\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    g(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (h.hasClass(JSBNG__event.getTarget(), \"-cx-PRIVATE-uiDialog__form\")) {\n                this._layer.hide();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"DoublyLinkedListMap\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h() {\n        this._head = null;\n        this._tail = null;\n        this._nodes = {\n        };\n        this._nodeCount = 0;\n    };\n;\n    g(h.prototype, {\n        get: function(i) {\n            return ((this._nodes[i] ? this._nodes[i].data : null));\n        },\n        getIndex: function(i) {\n            for (var j = this._head, k = 0; j; j = j.next, k++) {\n                if (((j.key === i))) {\n                    return k;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        _insert: function(i, j, k, l) {\n            ((((k && !this._nodes[k])) && (k = null)));\n            var m = ((((k && this._nodes[k])) || ((l ? this._head : this._tail)))), n = {\n                data: j,\n                key: i,\n                next: null,\n                prev: null\n            };\n            if (m) {\n                this.remove(i);\n                if (l) {\n                    n.prev = m.prev;\n                    ((m.prev && (m.prev.next = n)));\n                    m.prev = n;\n                    n.next = m;\n                }\n                 else {\n                    n.next = m.next;\n                    ((m.next && (m.next.prev = n)));\n                    m.next = n;\n                    n.prev = m;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((((n.prev === null)) && (this._head = n)));\n            ((((n.next === null)) && (this._tail = n)));\n            this._nodes[i] = n;\n            this._nodeCount++;\n            return this;\n        },\n        insertBefore: function(i, j, k) {\n            return this._insert(i, j, k, true);\n        },\n        insertAfter: function(i, j, k) {\n            return this._insert(i, j, k, false);\n        },\n        prepend: function(i, j) {\n            return this.insertBefore(i, j, ((this._head && this._head.key)));\n        },\n        append: function(i, j) {\n            return this.insertAfter(i, j, ((this._tail && this._tail.key)));\n        },\n        remove: function(i) {\n            var j = this._nodes[i];\n            if (j) {\n                var k = j.next, l = j.prev;\n                ((k && (k.prev = l)));\n                ((l && (l.next = k)));\n                ((((this._head === j)) && (this._head = k)));\n                ((((this._tail === j)) && (this._tail = l)));\n                delete this._nodes[i];\n                this._nodeCount--;\n            }\n        ;\n        ;\n            return this;\n        },\n        JSBNG__find: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                if (i(j.data)) {\n                    return j.key;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        reduce: function(i, j) {\n            for (var k = this._head; k; k = k.next) {\n                j = i(k.data, j);\n            ;\n            };\n        ;\n            return j;\n        },\n        exists: function(i) {\n            return !!this._nodes[i];\n        },\n        isEmpty: function() {\n            return !this._head;\n        },\n        reset: function() {\n            this._head = null;\n            this._tail = null;\n            this._nodes = {\n            };\n            this._nodeCount = 0;\n        },\n        map: function(i) {\n            for (var j = this._head; j; j = j.next) {\n                i(j.data);\n            ;\n            };\n        ;\n        },\n        getCount: function() {\n            return this._nodeCount;\n        },\n        getHead: function() {\n            return ((this._head && this._head.data));\n        },\n        getTail: function() {\n            return ((this._tail && this._tail.data));\n        },\n        getNext: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.next))) {\n                return j.next.data;\n            }\n        ;\n        ;\n            return null;\n        },\n        getPrev: function(i) {\n            var j = this._nodes[i];\n            if (((j && j.prev))) {\n                return j.prev.data;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = h;\n});\n__d(\"MenuDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"HTML\",\"Keys\",\"Parent\",\"Style\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"Parent\"), o = b(\"Style\"), p = b(\"UserAgent\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\"), s = \"menu:mouseover\", t = null;\n    function u(ea) {\n        if (i.hasClass(ea, \"uiMenuContainer\")) {\n            return ea;\n        }\n    ;\n    ;\n        return n.byClass(ea, \"uiMenu\");\n    };\n;\n    function v(ea) {\n        return n.byClass(ea, \"uiMenuItem\");\n    };\n;\n    function w(ea) {\n        if (JSBNG__document.activeElement) {\n            var fa = v(JSBNG__document.activeElement);\n            return ea.indexOf(fa);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function x(ea) {\n        return k.JSBNG__find(ea, \"a.itemAnchor\");\n    };\n;\n    function y(ea) {\n        return i.hasClass(ea, \"checked\");\n    };\n;\n    function z(ea) {\n        return ((!i.hasClass(ea, \"disabled\") && ((o.get(ea, \"display\") !== \"none\"))));\n    };\n;\n    function aa(JSBNG__event) {\n        var ea = JSBNG__document.activeElement;\n        if (((((!ea || !n.byClass(ea, \"uiMenu\"))) || !k.isInputNode(ea)))) {\n            var fa = v(JSBNG__event.getTarget());\n            ((fa && da.focusItem(fa)));\n        }\n    ;\n    ;\n    };\n;\n    function ba(ea) {\n        ((p.firefox() && x(ea).JSBNG__blur()));\n        da.inform(\"select\", {\n            menu: u(ea),\n            JSBNG__item: ea\n        });\n    };\n;\n    var ca = function() {\n        ca = r;\n        var ea = {\n        };\n        ea.click = function(JSBNG__event) {\n            var fa = v(JSBNG__event.getTarget());\n            if (((fa && z(fa)))) {\n                ba(fa);\n                var ga = x(fa), ha = ga.href, ia = ga.getAttribute(\"rel\");\n                return ((((ia && ((ia !== \"ignore\")))) || ((ha && ((ha.charAt(((ha.length - 1))) !== \"#\"))))));\n            }\n        ;\n        ;\n        };\n        ea.keydown = function(JSBNG__event) {\n            var fa = JSBNG__event.getTarget();\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            if (((!t || k.isInputNode(fa)))) {\n                return;\n            }\n        ;\n        ;\n            var ga = g.getKeyCode(JSBNG__event), ha;\n            switch (ga) {\n              case m.UP:\n            \n              case m.DOWN:\n                var ia = da.getEnabledItems(t);\n                ha = w(ia);\n                da.focusItem(ia[((ha + ((((ga === m.UP)) ? -1 : 1))))]);\n                return false;\n              case m.SPACE:\n                var ja = v(fa);\n                if (ja) {\n                    ba(ja);\n                    JSBNG__event.prevent();\n                }\n            ;\n            ;\n                break;\n              default:\n                var ka = String.fromCharCode(ga).toLowerCase(), la = da.getEnabledItems(t);\n                ha = w(la);\n                var ma = ha, na = la.length;\n                while (((((~ha && (((ma = ((++ma % na))) !== ha)))) || ((!~ha && ((++ma < na))))))) {\n                    var oa = da.getItemLabel(la[ma]);\n                    if (((oa && ((oa.charAt(0).toLowerCase() === ka))))) {\n                        da.focusItem(la[ma]);\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n        };\n        g.listen(JSBNG__document.body, ea);\n    }, da = q(new h(), {\n        focusItem: function(ea) {\n            if (((ea && z(ea)))) {\n                this._removeSelected(u(ea));\n                i.addClass(ea, \"selected\");\n                x(ea).JSBNG__focus();\n            }\n        ;\n        ;\n        },\n        getEnabledItems: function(ea) {\n            return da.getItems(ea).filter(z);\n        },\n        getCheckedItems: function(ea) {\n            return da.getItems(ea).filter(y);\n        },\n        getItems: function(ea) {\n            return k.scry(ea, \"li.uiMenuItem\");\n        },\n        getItemLabel: function(ea) {\n            return ((ea.getAttribute(\"data-label\", 2) || \"\"));\n        },\n        isItemChecked: function(ea) {\n            return i.hasClass(ea, \"checked\");\n        },\n        autoregister: function(ea, fa, ga) {\n            ea.subscribe(\"show\", function() {\n                da.register(fa, ga);\n            });\n            ea.subscribe(\"hide\", function() {\n                da.unregister(fa);\n            });\n        },\n        register: function(ea, fa) {\n            ea = u(ea);\n            ca();\n            if (!j.get(ea, s)) {\n                j.set(ea, s, g.listen(ea, \"mouseover\", aa));\n            }\n        ;\n        ;\n            if (((fa !== false))) {\n                t = ea;\n            }\n        ;\n        ;\n        },\n        setItemEnabled: function(ea, fa) {\n            if (((!fa && !k.scry(ea, \"span.disabledAnchor\")[0]))) {\n                k.appendContent(ea, k.create(\"span\", {\n                    className: ((k.JSBNG__find(ea, \"a\").className + \" disabledAnchor\"))\n                }, l(x(ea).innerHTML)));\n            }\n        ;\n        ;\n            i.conditionClass(ea, \"disabled\", !fa);\n        },\n        toggleItem: function(ea) {\n            var fa = !da.isItemChecked(ea);\n            da.setItemChecked(ea, fa);\n        },\n        setItemChecked: function(ea, fa) {\n            i.conditionClass(ea, \"checked\", fa);\n            x(ea).setAttribute(\"aria-checked\", fa);\n        },\n        unregister: function(ea) {\n            ea = u(ea);\n            var fa = j.remove(ea, s);\n            ((fa && fa.remove()));\n            t = null;\n            this._removeSelected(ea);\n        },\n        _removeSelected: function(ea) {\n            da.getItems(ea).filter(function(fa) {\n                return i.hasClass(fa, \"selected\");\n            }).forEach(function(fa) {\n                i.removeClass(fa, \"selected\");\n            });\n        }\n    });\n    e.exports = da;\n});\n__d(\"coalesce\", [], function(a, b, c, d, e, f) {\n    function g() {\n        for (var h = 0; ((h < arguments.length)); ++h) {\n            if (((arguments[h] != null))) {\n                return arguments[h];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    e.exports = g;\n});\n__d(\"OnVisible\", [\"Arbiter\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"Vector\",\"ViewportBounds\",\"coalesce\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"Parent\"), k = b(\"Run\"), l = b(\"Vector\"), m = b(\"ViewportBounds\"), n = b(\"coalesce\"), o = b(\"copyProperties\"), p = b(\"queryThenMutateDOM\"), q = [], r, s = 0, t = [], u, v, w, x, y;\n    function z() {\n        q.forEach(function(fa) {\n            fa.remove();\n        });\n        if (v) {\n            v.remove();\n            u.remove();\n            r.unsubscribe();\n            v = u = r = null;\n        }\n    ;\n    ;\n        s = 0;\n        q.length = 0;\n    };\n;\n    function aa() {\n        if (!q.length) {\n            z();\n            return;\n        }\n    ;\n    ;\n        t.length = 0;\n        w = l.getScrollPosition().y;\n        x = l.getViewportDimensions().y;\n        y = m.getTop();\n        for (var fa = 0; ((fa < q.length)); ++fa) {\n            var ga = q[fa];\n            if (isNaN(ga.elementHeight)) {\n                t.push(fa);\n            }\n        ;\n        ;\n            ga.elementHeight = l.getElementDimensions(ga.element).y;\n            ga.elementPos = l.getElementPosition(ga.element);\n            ga.hidden = j.byClass(ga.element, \"hidden_elem\");\n            if (ga.scrollArea) {\n                ga.scrollAreaHeight = l.getElementDimensions(ga.scrollArea).y;\n                ga.scrollAreaY = l.getElementPosition(ga.scrollArea).y;\n            }\n        ;\n        ;\n        };\n    ;\n        s = fa;\n    };\n;\n    function ba() {\n        for (var fa = ((Math.min(q.length, s) - 1)); ((fa >= 0)); --fa) {\n            var ga = q[fa];\n            if (((((!ga.elementPos || ga.removed)) || ga.hidden))) {\n                q.splice(fa, 1);\n                continue;\n            }\n        ;\n        ;\n            var ha = ((((w + x)) + ga.buffer)), ia = false;\n            if (((ha > ga.elementPos.y))) {\n                var ja = ((!ga.strict || ((((((w + y)) - ga.buffer)) < ((ga.elementPos.y + ga.elementHeight))))));\n                ia = ja;\n                if (((ia && ga.scrollArea))) {\n                    var ka = ((((ga.scrollAreaY + ga.scrollAreaHeight)) + ga.buffer));\n                    ia = ((((ga.elementPos.y > ((ga.scrollAreaY - ga.buffer)))) && ((ga.elementPos.y < ka))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((ga.inverse ? !ia : ia))) {\n                ga.remove();\n                ga.handler(((t.indexOf(fa) !== -1)));\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ca() {\n        da();\n        if (q.length) {\n            return;\n        }\n    ;\n    ;\n        v = i.listen(window, \"JSBNG__scroll\", da);\n        u = i.listen(window, \"resize\", da);\n        r = g.subscribe(\"dom-scroll\", da);\n    };\n;\n    function da() {\n        p(aa, ba, \"OnVisible/positionCheck\");\n    };\n;\n    function ea(fa, ga, ha, ia, ja, ka) {\n        this.element = fa;\n        this.handler = ga;\n        this.strict = ha;\n        this.buffer = n(ia, 300);\n        this.inverse = n(ja, false);\n        this.scrollArea = ((ka || null));\n        if (this.scrollArea) {\n            this.scrollAreaListener = i.listen(h.JSBNG__find(ka, \".uiScrollableAreaWrap\"), \"JSBNG__scroll\", this.checkBuffer);\n        }\n    ;\n    ;\n        if (((q.length === 0))) {\n            k.onLeave(z);\n        }\n    ;\n    ;\n        ca();\n        q.push(this);\n    };\n;\n    o(ea, {\n        checkBuffer: da\n    });\n    o(ea.prototype, {\n        remove: function() {\n            this.removed = true;\n            if (this.scrollAreaListener) {\n                this.scrollAreaListener.remove();\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.elementHeight = null;\n            this.removed = false;\n            ((((q.indexOf(this) === -1)) && q.push(this)));\n            ca();\n        },\n        setBuffer: function(fa) {\n            this.buffer = fa;\n            da();\n        },\n        checkBuffer: function() {\n            da();\n        }\n    });\n    e.exports = ea;\n});\n__d(\"PrivacyConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FRIENDS_PLUS_GAMER_FRIENDS: 128,\n        FRIENDS_MINUS_ACQUAINTANCES: 127,\n        FACEBOOK_EMPLOYEES: 112,\n        CUSTOM: 111,\n        EVERYONE: 80,\n        NETWORKS_FRIENDS_OF_FRIENDS: 60,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SELF: 10,\n        NOBODY: 0\n    }, h = {\n        EVERYONE: 80,\n        NETWORKS_FRIENDS: 55,\n        FRIENDS_OF_FRIENDS: 50,\n        ALL_FRIENDS: 40,\n        SOME_FRIENDS: 30,\n        SELF: 10,\n        NO_FRIENDS: 0\n    }, i = {\n        NONE: 0,\n        TAGGEES: 1,\n        FRIENDS_OF_TAGGEES: 2\n    }, j = {\n        BaseValue: g,\n        FriendsValue: h,\n        TagExpansion: i\n    };\n    e.exports = j;\n});\n__d(\"Toggler\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualThing\",\"JSBNG__CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"Focus\",\"Parent\",\"TabbableElements\",\"arrayContains\",\"cx\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"ge\",\"getContextualParent\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualThing\"), k = b(\"JSBNG__CSS\"), l = b(\"DataStore\"), m = b(\"Dialog\"), n = b(\"DOM\"), o = b(\"DOMQuery\"), p = b(\"Focus\"), q = b(\"Parent\"), r = b(\"TabbableElements\"), s = b(\"arrayContains\"), t = b(\"cx\"), u = b(\"copyProperties\"), v = b(\"createArrayFrom\"), w = b(\"emptyFunction\"), x = b(\"ge\"), y = b(\"getContextualParent\"), z = b(\"getObjectValues\"), aa = [], ba;\n    function ca() {\n        ca = w;\n        g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n            var ga = JSBNG__event.getTarget();\n            aa.forEach(function(ha) {\n                ha.clickedTarget = ga;\n                ((((((((((((ha.active && !ha.sticky)) && !j.containsIncludingLayers(ha.getActive(), ga))) && !ha.inTargetFlyout(ga))) && ha.inActiveDialog())) && !ha.isIgnoredByModalLayer(ga))) && ha.hide()));\n            });\n        }, g.Priority.URGENT);\n    };\n;\n    var da = function() {\n        this.active = null;\n        this.togglers = {\n        };\n        this.setSticky(false);\n        aa.push(this);\n        this.subscribe([\"show\",\"hide\",], da.inform.bind(da));\n        return ca();\n    };\n    u(da.prototype, i, {\n        show: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ga !== ia))) {\n                ((ia && ha.hide()));\n                ha.active = ga;\n                k.addClass(ga, \"openToggler\");\n                var ja = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.removeClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                var ka = o.scry(ga, \".uiToggleFlyout\")[0];\n                if (ka) {\n                    var la = ((r.JSBNG__find(ka)[0] || ka));\n                    if (((la.tabIndex == -1))) {\n                        la.tabIndex = 0;\n                    }\n                ;\n                ;\n                    p.setWithoutOutline(la);\n                }\n            ;\n            ;\n                n.appendContent(ga, ha.getToggler(\"next\"));\n                n.prependContent(ga, ha.getToggler(\"prev\"));\n                ha.inform(\"show\", ha);\n            }\n        ;\n        ;\n        },\n        hide: function(ga) {\n            var ha = ea(this, ga), ia = ha.active;\n            if (((ia && ((!ga || ((ga === ia))))))) {\n                k.removeClass(ia, \"openToggler\");\n                var ja = n.scry(ia, \"a[rel=\\\"toggle\\\"]\");\n                if (((((ja.length > 0)) && ja[0].getAttribute(\"data-target\")))) {\n                    k.addClass(x(ja[0].getAttribute(\"data-target\")), \"toggleTargetClosed\");\n                }\n            ;\n            ;\n                z(ha.togglers).forEach(n.remove);\n                ha.inform(\"hide\", ha);\n                ha.active = null;\n            }\n        ;\n        ;\n        },\n        toggle: function(ga) {\n            var ha = ea(this, ga);\n            if (((ha.active === ga))) {\n                ha.hide();\n            }\n             else ha.show(ga);\n        ;\n        ;\n        },\n        getActive: function() {\n            return ea(this).active;\n        },\n        isShown: function() {\n            return ((ea(this).active && k.hasClass(ea(this).active, \"openToggler\")));\n        },\n        inTargetFlyout: function(ga) {\n            var ha = fa(this.getActive());\n            return ((ha && j.containsIncludingLayers(ha, ga)));\n        },\n        inActiveDialog: function() {\n            var ga = m.getCurrent();\n            return ((!ga || n.contains(ga.getRoot(), this.getActive())));\n        },\n        isIgnoredByModalLayer: function(ga) {\n            return ((q.byClass(ga, \"-cx-PRIVATE-ModalLayer__root\") && !q.byClass(this.getActive(), \"-cx-PRIVATE-ModalLayer__root\")));\n        },\n        getToggler: function(ga) {\n            var ha = ea(this);\n            if (!ha.togglers[ga]) {\n                ha.togglers[ga] = n.create(\"button\", {\n                    className: \"hideToggler\",\n                    JSBNG__onfocus: function() {\n                        var ia = n.scry(ha.active, \"a[rel=\\\"toggle\\\"]\")[0];\n                        ((ia && ia.JSBNG__focus()));\n                        ha.hide();\n                    }\n                });\n                ha.togglers[ga].setAttribute(\"type\", \"button\");\n            }\n        ;\n        ;\n            return this.togglers[ga];\n        },\n        setSticky: function(ga) {\n            var ha = ea(this);\n            ga = ((ga !== false));\n            if (((ga !== ha.sticky))) {\n                ha.sticky = ga;\n                if (ga) {\n                    ((ha._pt && ha._pt.unsubscribe()));\n                }\n                 else ha._pt = h.subscribe(\"pre_page_transition\", ha.hide.bind(ha, null));\n            ;\n            ;\n            }\n        ;\n        ;\n            return ha;\n        }\n    });\n    u(da, da.prototype);\n    u(da, {\n        bootstrap: function(ga) {\n            var ha = ga.parentNode;\n            da.getInstance(ha).toggle(ha);\n        },\n        createInstance: function(ga) {\n            var ha = new da().setSticky(true);\n            l.set(ga, \"toggler\", ha);\n            return ha;\n        },\n        destroyInstance: function(ga) {\n            l.remove(ga, \"toggler\");\n        },\n        getInstance: function(ga) {\n            while (ga) {\n                var ha = l.get(ga, \"toggler\");\n                if (ha) {\n                    return ha;\n                }\n            ;\n            ;\n                if (k.hasClass(ga, \"uiToggleContext\")) {\n                    return da.createInstance(ga);\n                }\n            ;\n            ;\n                ga = y(ga);\n            };\n        ;\n            return (ba = ((ba || new da())));\n        },\n        listen: function(ga, ha, ia) {\n            return da.subscribe(v(ga), function(ja, ka) {\n                if (((ka.getActive() === ha))) {\n                    return ia(ja, ka);\n                }\n            ;\n            ;\n            });\n        },\n        subscribe: (function(ga) {\n            return function(ha, ia) {\n                ha = v(ha);\n                if (s(ha, \"show\")) {\n                    aa.forEach(function(ja) {\n                        if (ja.getActive()) {\n                            ia.curry(\"show\", ja).defer();\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return ga(ha, ia);\n            };\n        })(da.subscribe.bind(da))\n    });\n    function ea(ga, ha) {\n        if (((ga instanceof da))) {\n            return ga;\n        }\n    ;\n    ;\n        return da.getInstance(ha);\n    };\n;\n    function fa(ga) {\n        var ha = n.scry(ga, \"a[rel=\\\"toggle\\\"]\");\n        if (((((ha.length > 0)) && ha[0].getAttribute(\"data-target\")))) {\n            return x(ha[0].getAttribute(\"data-target\"));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = da;\n});\n__d(\"Tooltip\", [\"JSBNG__Event\",\"AsyncRequest\",\"ContextualLayer\",\"ContextualLayerAutoFlip\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Style\",\"URI\",\"copyProperties\",\"emptyFunction\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"ContextualLayer\"), j = b(\"ContextualLayerAutoFlip\"), k = b(\"JSBNG__CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Style\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"cx\"), s = b(\"tx\"), t = null, u = null, v = null, w = [], x;\n    function y() {\n        if (!u) {\n            v = m.create(\"div\", {\n                className: \"tooltipContent\"\n            });\n            var fa = m.create(\"i\", {\n                className: \"arrow\"\n            }), ga = m.create(\"div\", {\n                className: \"uiTooltipX\"\n            }, [v,fa,]);\n            u = new i({\n            }, ga);\n            u.shouldSetARIAProperties(false);\n            u.enableBehavior(j);\n        }\n    ;\n    ;\n    };\n;\n    function z(fa) {\n        return p({\n            JSBNG__content: fa.getAttribute(\"aria-label\"),\n            position: ((fa.getAttribute(\"data-tooltip-position\") || \"above\")),\n            alignH: ((fa.getAttribute(\"data-tooltip-alignh\") || \"left\"))\n        }, l.get(fa, \"tooltip\"));\n    };\n;\n    function aa(fa, ga) {\n        var ha = z(fa);\n        l.set(fa, \"tooltip\", {\n            JSBNG__content: ((ga.JSBNG__content || ha.JSBNG__content)),\n            position: ((ga.position || ha.position)),\n            alignH: ((ga.alignH || ha.alignH)),\n            suspend: ((ga.suspend || ha.suspend))\n        });\n        fa.setAttribute(\"data-hover\", \"tooltip\");\n    };\n;\n    function ba(fa, ga) {\n        ea.set(fa, \"Loading...\");\n        new h(ga).setHandler(function(ha) {\n            ea.set(fa, ha.getPayload());\n        }).setErrorHandler(q).send();\n    };\n;\n    var ca = /(\\r\\n|[\\r\\n])/;\n    function da(fa) {\n        return fa.split(ca).map(function(ga) {\n            return ((ca.test(ga) ? m.create(\"br\") : ga));\n        });\n    };\n;\n    var ea = {\n        process: function(fa, ga) {\n            if (!m.contains(fa, ga)) {\n                return;\n            }\n        ;\n        ;\n            if (((((fa !== t)) && !fa.getAttribute(\"data-tooltip-suspend\")))) {\n                var ha = fa.getAttribute(\"data-tooltip-uri\");\n                if (ha) {\n                    fa.removeAttribute(\"data-tooltip-uri\");\n                    ba(fa, ha);\n                }\n            ;\n            ;\n                ea.show(fa);\n            }\n        ;\n        ;\n        },\n        remove: function(fa) {\n            l.remove(fa, \"tooltip\");\n            fa.removeAttribute(\"data-hover\");\n            fa.removeAttribute(\"data-tooltip-position\");\n            fa.removeAttribute(\"data-tooltip-alignh\");\n            ((((fa === t)) && ea.hide()));\n        },\n        suspend: function(fa) {\n            fa.setAttribute(\"data-tooltip-suspend\", true);\n            ((((fa === t)) && ea.hide()));\n        },\n        unsuspend: function(fa) {\n            fa.removeAttribute(\"data-tooltip-suspend\");\n        },\n        hide: function() {\n            if (t) {\n                u.hide();\n                t = null;\n                while (w.length) {\n                    w.pop().remove();\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        set: function(fa, ga, ha, ia) {\n            if (((ha || ia))) {\n                aa(fa, {\n                    position: ha,\n                    alignH: ia\n                });\n            }\n        ;\n        ;\n            if (((ga instanceof o))) {\n                if (((fa === t))) {\n                    ba(fa, ga);\n                }\n                 else fa.setAttribute(\"data-tooltip-uri\", ga);\n            ;\n            ;\n            }\n             else {\n                if (((typeof ga !== \"string\"))) {\n                    ga = m.create(\"div\", {\n                    }, ga);\n                    fa.setAttribute(\"aria-label\", m.getText(ga));\n                }\n                 else fa.setAttribute(\"aria-label\", ga);\n            ;\n            ;\n                aa(fa, {\n                    JSBNG__content: ga\n                });\n                ((((fa === t)) && ea.show(fa)));\n            }\n        ;\n        ;\n        },\n        show: function(fa) {\n            y();\n            ea.hide();\n            var ga = z(fa);\n            if (!ga.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            var ha = 0, ia = 0;\n            if (((((ga.position === \"left\")) || ((ga.position === \"right\"))))) {\n                x = ((x || k.hasClass(JSBNG__document.body, \"-cx-PUBLIC-hasLitestand__body\")));\n                var ja = ((x ? 28 : 20));\n                ia = ((((fa.offsetHeight - ja)) / 2));\n            }\n             else if (((ga.alignH !== \"center\"))) {\n                var ka = fa.offsetWidth;\n                if (((ka < 18))) {\n                    ha = ((((((ka - 18)) / 2)) * ((((ga.alignH === \"right\")) ? -1 : 1))));\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            u.setContext(fa).setOffsetX(ha).setOffsetY(ia).setPosition(ga.position).setAlignment(ga.alignH);\n            if (((typeof ga.JSBNG__content === \"string\"))) {\n                k.addClass(u.getRoot(), \"invisible_elem\");\n                var la = m.create(\"span\", {\n                }, da(ga.JSBNG__content)), ma = m.create(\"div\", {\n                    className: \"tooltipText\"\n                }, la);\n                m.setContent(v, ma);\n                u.show();\n                var na;\n                if (ma.getClientRects) {\n                    var oa = ma.getClientRects()[0];\n                    if (oa) {\n                        na = Math.round(((oa.right - oa.left)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!na) {\n                    na = ma.offsetWidth;\n                }\n            ;\n            ;\n                if (((na < la.offsetWidth))) {\n                    k.addClass(ma, \"tooltipWrap\");\n                    u.updatePosition();\n                }\n            ;\n            ;\n                k.removeClass(u.getRoot(), \"invisible_elem\");\n            }\n             else {\n                m.setContent(v, ga.JSBNG__content);\n                u.show();\n            }\n        ;\n        ;\n            var pa = function(ra) {\n                if (!m.contains(t, ra.getTarget())) {\n                    ea.hide();\n                }\n            ;\n            ;\n            };\n            w.push(g.listen(JSBNG__document.documentElement, \"mouseover\", pa), g.listen(JSBNG__document.documentElement, \"focusin\", pa));\n            var qa = n.getScrollParent(fa);\n            if (((qa !== window))) {\n                w.push(g.listen(qa, \"JSBNG__scroll\", ea.hide));\n            }\n        ;\n        ;\n            w.push(g.listen(fa, \"click\", ea.hide));\n            t = fa;\n        }\n    };\n    g.listen(window, \"JSBNG__scroll\", ea.hide);\n    e.exports = ea;\n});\n__d(\"SelectorDeprecated\", [\"JSBNG__Event\",\"Arbiter\",\"Button\",\"ContextualLayer\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Focus\",\"HTML\",\"Keys\",\"KeyStatus\",\"MenuDeprecated\",\"Parent\",\"Style\",\"Toggler\",\"Tooltip\",\"Vector\",\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Button\"), j = b(\"ContextualLayer\"), k = b(\"JSBNG__CSS\"), l = b(\"DataStore\"), m = b(\"DOM\"), n = b(\"Focus\"), o = b(\"HTML\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"MenuDeprecated\"), s = b(\"Parent\"), t = b(\"Style\"), u = b(\"Toggler\"), v = b(\"Tooltip\"), w = b(\"Vector\"), x = b(\"arrayContains\"), y = b(\"copyProperties\"), z = b(\"emptyFunction\"), aa, ba, ca = [], da;\n    function ea(pa) {\n        return s.byClass(pa, \"uiSelector\");\n    };\n;\n    function fa(pa) {\n        return s.byClass(pa, \"uiSelectorButton\");\n    };\n;\n    function ga() {\n        if (!ba) {\n            ba = new j({\n                position: \"below\"\n            }, m.create(\"div\"));\n            k.addClass(ba.getRoot(), \"uiSelectorContextualLayer\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function ha(pa) {\n        return m.scry(pa, \"select\")[0];\n    };\n;\n    function ia(pa) {\n        return m.JSBNG__find(pa, \"div.uiSelectorMenuWrapper\");\n    };\n;\n    function ja() {\n        ja = z;\n        r.subscribe(\"select\", function(pa, qa) {\n            if (((((!aa || !qa)) || ((qa.menu !== oa.getSelectorMenu(aa)))))) {\n                return;\n            }\n        ;\n        ;\n            var ra = ka(aa), sa = la(qa.JSBNG__item);\n            if (sa) {\n                var ta = aa, ua = oa.isOptionSelected(qa.JSBNG__item), va = oa.inform(\"select\", {\n                    selector: ta,\n                    option: qa.JSBNG__item,\n                    clone: da\n                });\n                if (((va === false))) {\n                    return;\n                }\n            ;\n            ;\n                if (((ra || !ua))) {\n                    oa.setSelected(ta, oa.getOptionValue(qa.JSBNG__item), !ua);\n                    oa.inform(\"toggle\", {\n                        selector: ta,\n                        option: qa.JSBNG__item\n                    });\n                    oa.inform(\"change\", {\n                        selector: ta\n                    });\n                    h.inform(\"Form/change\", {\n                        node: ta\n                    });\n                    if (ma(ta)) {\n                        l.set(ta, \"dirty\", true);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!ra || !sa))) {\n                ((aa && oa.toggle(aa)));\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ka(pa) {\n        return !!pa.getAttribute(\"data-multiple\");\n    };\n;\n    function la(pa) {\n        return k.hasClass(pa, \"uiSelectorOption\");\n    };\n;\n    function ma(pa) {\n        return !!pa.getAttribute(\"data-autosubmit\");\n    };\n;\n    var na = function() {\n        na = z;\n        var pa = {\n            keydown: function(JSBNG__event) {\n                var qa = JSBNG__event.getTarget();\n                if (m.isInputNode(qa)) {\n                    return;\n                }\n            ;\n            ;\n                switch (g.getKeyCode(JSBNG__event)) {\n                  case p.DOWN:\n                \n                  case p.SPACE:\n                \n                  case p.UP:\n                    if (fa(qa)) {\n                        var ra = ea(qa);\n                        oa.toggle(ra);\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                  case p.ESC:\n                    if (aa) {\n                        var sa = oa.getSelectorButton(aa);\n                        oa.toggle(aa);\n                        ((sa && n.set(sa)));\n                        return false;\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            },\n            mouseover: function(JSBNG__event) {\n                var qa = s.byAttribute(JSBNG__event.getTarget(), \"ajaxify\");\n                if (((qa && k.hasClass(qa, \"uiSelectorButton\")))) {\n                    oa.loadMenu(ea(qa));\n                }\n            ;\n            ;\n            }\n        };\n        g.listen(JSBNG__document.body, pa);\n    };\n    u.subscribe([\"show\",\"hide\",], function(pa, qa) {\n        var ra = ea(qa.getActive());\n        if (ra) {\n            na();\n            ja();\n            var sa = oa.getSelectorButton(ra), ta = oa.getSelectorMenu(ra), ua = ((pa === \"show\"));\n            sa.setAttribute(\"aria-expanded\", ((ua ? \"true\" : \"false\")));\n            if (ua) {\n                aa = ra;\n                if (k.hasClass(sa, \"uiButtonDisabled\")) {\n                    oa.setEnabled(ra, false);\n                    return false;\n                }\n            ;\n            ;\n                ta = ((ta || oa.loadMenu(ra)));\n                var va = t.getScrollParent(ra), wa = ((((va !== window)) && ((va !== m.getDocumentScrollElement()))));\n                if (((wa || k.hasClass(ra, \"uiSelectorUseLayer\")))) {\n                    if (wa) {\n                        ca.push(g.listen(va, \"JSBNG__scroll\", function() {\n                            qa.hide();\n                        }));\n                    }\n                ;\n                ;\n                    da = m.create(\"div\", {\n                        className: ra.className\n                    });\n                    k.addClass(da, \"invisible_elem\");\n                    w.getElementDimensions(ra).setElementDimensions(da);\n                    m.replace(ra, da);\n                    var xa = k.hasClass(ra, \"uiSelectorRight\"), ya = k.hasClass(ra, \"uiSelectorBottomUp\");\n                    ga().setContext(da).setContent(ra).setPosition(((ya ? \"above\" : \"below\"))).setAlignment(((xa ? \"right\" : \"left\"))).show();\n                }\n            ;\n            ;\n                r.register(ta);\n                if (q.isKeyDown()) {\n                    var za = r.getCheckedItems(ta);\n                    if (!za.length) {\n                        za = r.getEnabledItems(ta);\n                    }\n                ;\n                ;\n                    r.focusItem(za[0]);\n                }\n            ;\n            ;\n            }\n             else {\n                aa = null;\n                if (da) {\n                    while (ca.length) {\n                        ca.pop().remove();\n                    ;\n                    };\n                ;\n                    m.replace(da, ra);\n                    ga().hide();\n                    da = null;\n                }\n            ;\n            ;\n                ((ta && r.unregister(ta)));\n                if (((ma(ra) && l.get(ra, \"dirty\")))) {\n                    var ab = m.scry(ra, \"input.submitButton\")[0];\n                    ((ab && ab.click()));\n                    l.remove(ra, \"dirty\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            k.conditionClass(oa.getSelectorButton(ra), \"selected\", ua);\n            oa.inform(((ua ? \"open\" : \"close\")), {\n                selector: ra,\n                clone: da\n            });\n        }\n    ;\n    ;\n    });\n    var oa = y(new h(), {\n        attachMenu: function(pa, qa, ra) {\n            pa = ea(pa);\n            if (pa) {\n                ((aa && r.unregister(oa.getSelectorMenu(aa))));\n                m.setContent(ia(pa), qa);\n                ((aa && r.register(oa.getSelectorMenu(pa))));\n                ((da && ga().updatePosition()));\n                if (ra) {\n                    var sa = pa.getAttribute(\"data-name\");\n                    ((sa && ra.setAttribute(\"JSBNG__name\", sa)));\n                    if (!ka(pa)) {\n                        ra.setAttribute(\"multiple\", false);\n                    }\n                ;\n                ;\n                    var ta = ha(pa);\n                    if (ta) {\n                        m.replace(ta, ra);\n                    }\n                     else m.insertAfter(pa.firstChild, ra);\n                ;\n                ;\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n        },\n        getOption: function(pa, qa) {\n            var ra = oa.getOptions(pa), sa = ra.length;\n            while (sa--) {\n                if (((qa === oa.getOptionValue(ra[sa])))) {\n                    return ra[sa];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getOptions: function(pa) {\n            var qa = r.getItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getEnabledOptions: function(pa) {\n            var qa = r.getEnabledItems(oa.getSelectorMenu(pa));\n            return qa.filter(la);\n        },\n        getSelectedOptions: function(pa) {\n            return r.getCheckedItems(oa.getSelectorMenu(pa));\n        },\n        getOptionText: function(pa) {\n            return r.getItemLabel(pa);\n        },\n        getOptionValue: function(pa) {\n            var qa = ea(pa), ra = ha(qa), sa = oa.getOptions(qa).indexOf(pa);\n            return ((((sa >= 0)) ? ra.options[((sa + 1))].value : \"\"));\n        },\n        getSelectorButton: function(pa) {\n            return m.JSBNG__find(pa, \"a.uiSelectorButton\");\n        },\n        getSelectorMenu: function(pa) {\n            return m.scry(pa, \"div.uiSelectorMenu\")[0];\n        },\n        getValue: function(pa) {\n            var qa = ha(pa);\n            if (!qa) {\n                return null;\n            }\n        ;\n        ;\n            if (!ka(pa)) {\n                return qa.value;\n            }\n        ;\n        ;\n            var ra = [], sa = qa.options;\n            for (var ta = 1, ua = sa.length; ((ta < ua)); ta++) {\n                if (sa[ta].selected) {\n                    ra.push(sa[ta].value);\n                }\n            ;\n            ;\n            };\n        ;\n            return ra;\n        },\n        isOptionSelected: function(pa) {\n            return r.isItemChecked(pa);\n        },\n        listen: function(pa, qa, ra) {\n            return this.subscribe(qa, function(sa, ta) {\n                if (((ta.selector === pa))) {\n                    return ra(ta, sa);\n                }\n            ;\n            ;\n            });\n        },\n        loadMenu: function(pa) {\n            var qa = oa.getSelectorMenu(pa);\n            if (!qa) {\n                var ra = oa.getSelectorButton(pa), sa = ra.getAttribute(\"ajaxify\");\n                if (sa) {\n                    d([\"AsyncRequest\",], function(ua) {\n                        ua.bootstrap(sa, ra);\n                    });\n                    var ta = o(((((((((((((\"\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\" + \"\\u003Cdiv class=\\\"uiMenu uiSelectorMenu loading\\\"\\u003E\")) + \"\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\")) + \"\\u003Cli\\u003E\\u003Cspan\\u003E\\u003C/span\\u003E\\u003C/li\\u003E\")) + \"\\u003C/ul\\u003E\")) + \"\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\")));\n                    m.appendContent(ra.parentNode, ta);\n                    qa = oa.getSelectorMenu(pa);\n                    ra.removeAttribute(\"JSBNG__onmouseover\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        setButtonLabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = parseInt(ra.getAttribute(\"data-length\"), 10);\n            qa = ((((qa || ra.getAttribute(\"data-label\"))) || \"\"));\n            i.setLabel(ra, qa);\n            if (((typeof qa === \"string\"))) {\n                k.conditionClass(ra, \"uiSelectorBigButtonLabel\", ((qa.length > sa)));\n                if (((sa && ((qa.length > sa))))) {\n                    ra.setAttribute(\"title\", qa);\n                }\n                 else ra.removeAttribute(\"title\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setButtonTooltip: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            ((sa && v.set(sa, ((((qa || ra.getAttribute(\"data-tooltip\"))) || \"\")))));\n        },\n        updateButtonARIALabel: function(pa, qa) {\n            var ra = oa.getSelectorButton(pa), sa = s.byTag(ra, \"a\");\n            if (sa) {\n                var ta = ra.getAttribute(\"data-ariaprefix\");\n                if (ta) {\n                    ra.setAttribute(\"aria-label\", ((((ta + \": \")) + qa)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setEnabled: function(pa, qa) {\n            if (((((!qa && aa)) && ((ea(pa) === aa))))) {\n                oa.toggle(pa);\n            }\n        ;\n        ;\n            i.setEnabled(oa.getSelectorButton(pa), qa);\n        },\n        setOptionEnabled: function(pa, qa) {\n            r.setItemEnabled(pa, qa);\n        },\n        setSelected: function(pa, qa, ra) {\n            ra = ((ra !== false));\n            var sa = oa.getOption(pa, qa);\n            if (!sa) {\n                return;\n            }\n        ;\n        ;\n            var ta = oa.isOptionSelected(sa);\n            if (((ra !== ta))) {\n                if (((!ka(pa) && !ta))) {\n                    var ua = oa.getSelectedOptions(pa)[0];\n                    ((ua && r.toggleItem(ua)));\n                }\n            ;\n            ;\n                r.toggleItem(sa);\n            }\n        ;\n        ;\n            oa.updateSelector(pa);\n        },\n        toggle: function(pa) {\n            u.toggle(m.scry(ea(pa), \"div.wrap\")[0]);\n        },\n        updateSelector: function(pa) {\n            var qa = oa.getOptions(pa), ra = oa.getSelectedOptions(pa), sa = ha(pa).options, ta = [], ua = [];\n            for (var va = 0, wa = qa.length; ((va < wa)); va++) {\n                var xa = x(ra, qa[va]);\n                sa[((va + 1))].selected = xa;\n                if (xa) {\n                    var ya = oa.getOptionText(qa[va]);\n                    ta.push(ya);\n                    ua.push(((qa[va].getAttribute(\"data-tooltip\") || ya)));\n                }\n            ;\n            ;\n            };\n        ;\n            sa[0].selected = !ra.length;\n            var za = k.hasClass(pa, \"uiSelectorDynamicLabel\"), ab = k.hasClass(pa, \"uiSelectorDynamicTooltip\");\n            if (((za || ab))) {\n                var bb = \"\";\n                if (ka(pa)) {\n                    var cb = oa.getSelectorButton(pa);\n                    bb = ((cb.getAttribute(\"data-delimiter\") || \", \"));\n                }\n            ;\n            ;\n                ta = ta.join(bb);\n                ua = ua.join(bb);\n                if (za) {\n                    oa.setButtonLabel(pa, ta);\n                    oa.updateButtonARIALabel(pa, ta);\n                }\n            ;\n            ;\n                ((ab && oa.setButtonTooltip(pa, ua)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = oa;\n});\n__d(\"SubscriptionsHandler\", [\"JSLogger\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"copyProperties\"), i = g.create(\"subscriptions_handler\");\n    function j(k) {\n        this._name = ((k || \"unnamed\"));\n        this._subscriptions = [];\n    };\n;\n    h(j.prototype, {\n        addSubscriptions: function() {\n            if (this._subscriptions) {\n                Array.prototype.push.apply(this._subscriptions, arguments);\n            }\n             else {\n                i.warn(((this._name + \".subscribe_while_released\")));\n                for (var k = 0, l = arguments.length; ((k < l)); k++) {\n                    this._unsubscribe(arguments[k]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        engage: function() {\n            this._subscriptions = ((this._subscriptions || []));\n        },\n        release: function() {\n            if (this._subscriptions) {\n                this._subscriptions.forEach(this._unsubscribe.bind(this));\n            }\n        ;\n        ;\n            this._subscriptions = null;\n        },\n        _unsubscribe: function(k) {\n            if (k.remove) {\n                k.remove();\n            }\n             else if (k.reset) {\n                k.reset();\n            }\n             else if (k.unsubscribe) {\n                k.unsubscribe();\n            }\n             else i.error(((this._name + \".invalid\")), k);\n            \n            \n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"Typeahead\", [\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"DataStore\",\"JSBNG__Event\",\"Parent\",\"Run\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"BehaviorsMixin\"), i = b(\"DOM\"), j = b(\"DataStore\"), k = b(\"JSBNG__Event\"), l = b(\"Parent\"), m = b(\"Run\"), n = b(\"copyProperties\"), o = b(\"emptyFunction\"), p = b(\"ge\");\n    function q(r, s, t, u) {\n        this.args = {\n            data: r,\n            view: s,\n            core: t\n        };\n        j.set(u, \"Typeahead\", this);\n        this.element = u;\n    };\n;\n    q.getInstance = function(r) {\n        var s = l.byClass(r, \"uiTypeahead\");\n        return ((s ? j.get(s, \"Typeahead\") : null));\n    };\n    n(q.prototype, g, h, {\n        init: function(r) {\n            this.init = o;\n            this.getCore();\n            this.getView().setAccessibilityControlElement(this.getCore().getElement());\n            this.proxyEvents();\n            this.initBehaviors(((r || [])));\n            this.inform(\"init\", this);\n            this.data.bootstrap();\n            this.core.JSBNG__focus();\n        },\n        getData: function() {\n            if (!this.data) {\n                var r = this.args.data;\n                this.data = r;\n                this.data.init();\n            }\n        ;\n        ;\n            return this.data;\n        },\n        getView: function() {\n            if (!this.view) {\n                var r = this.args.view, s = ((r.node || p(r.node_id)));\n                if (!s) {\n                    s = i.create(\"div\", {\n                        className: \"uiTypeaheadView\"\n                    });\n                    i.appendContent(this.element, s);\n                }\n            ;\n            ;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.view = new window[r.ctor](s, ((r.options || {\n                    })));\n                }\n                 else this.view = new r.ctor(s, ((r.options || {\n                })));\n            ;\n            ;\n                this.view.init();\n                this.view.setTypeahead(this.element);\n            }\n        ;\n        ;\n            return this.view;\n        },\n        getCore: function() {\n            if (!this.core) {\n                var r = this.args.core;\n                if (((typeof r.ctor === \"string\"))) {\n                    this.core = new window[r.ctor](((r.options || {\n                    })));\n                }\n                 else this.core = new r.ctor(((r.options || {\n                })));\n            ;\n            ;\n                this.core.init(this.getData(), this.getView(), this.getElement());\n            }\n        ;\n        ;\n            return this.core;\n        },\n        getElement: function() {\n            return this.element;\n        },\n        swapData: function(r) {\n            var s = this.core;\n            this.data = this.args.data = r;\n            r.init();\n            if (s) {\n                s.data = r;\n                s.initData();\n                s.reset();\n            }\n        ;\n        ;\n            r.bootstrap();\n            return r;\n        },\n        proxyEvents: function() {\n            [this.data,this.view,this.core,].forEach(function(r) {\n                r.subscribe(r.events, this.inform.bind(this));\n            }, this);\n        },\n        initBehaviors: function(r) {\n            r.forEach(function(s) {\n                if (((typeof s === \"string\"))) {\n                    if (((a.TypeaheadBehaviors && a.TypeaheadBehaviors[s]))) {\n                        a.TypeaheadBehaviors[s](this);\n                    }\n                     else m.onLoad(function() {\n                        if (a.TypeaheadBehaviors) {\n                            ((a.TypeaheadBehaviors[s] || o))(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                ;\n                ;\n                }\n                 else this.enableBehavior(s);\n            ;\n            ;\n            }, this);\n        }\n    });\n    q.initNow = function(r, s, t) {\n        if (t) {\n            t.init(r);\n        }\n    ;\n    ;\n        r.init(s);\n    };\n    q.init = function(r, s, t, u) {\n        if (!i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            r = ((i.scry(r, \"input\")[0] || i.scry(r, \"textarea\")[0]));\n        }\n    ;\n    ;\n        var v = false;\n        try {\n            v = ((JSBNG__document.activeElement === r));\n        } catch (w) {\n        \n        };\n    ;\n        if (v) {\n            q.initNow(s, t, u);\n        }\n         else var x = k.listen(r, \"JSBNG__focus\", function() {\n            q.initNow(s, t, u);\n            x.remove();\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"StickyPlaceholderInput\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"DOM\",\"Input\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"Input\"), k = b(\"Parent\"), l = b(\"emptyFunction\");\n    function m(q) {\n        return k.byClass(q, \"uiStickyPlaceholderInput\");\n    };\n;\n    function n(q) {\n        return i.scry(q, \".placeholder\")[0];\n    };\n;\n    function o(q) {\n        q = ((q || window.JSBNG__event));\n        var r = ((q.target || q.srcElement));\n        if (i.isNodeOfType(r, [\"input\",\"textarea\",])) {\n            var s = m(r);\n            if (s) {\n                (function() {\n                    h.conditionClass(s, \"uiStickyPlaceholderEmptyInput\", !r.value.length);\n                }).defer();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var p = {\n        init: function() {\n            p.init = l;\n            g.listen(JSBNG__document.documentElement, {\n                keydown: o,\n                paste: o,\n                focusout: o\n            });\n        },\n        registerInput: function(q) {\n            p.init();\n            var r = ((q.getAttribute(\"placeholder\") || \"\"));\n            if (r.length) {\n                if (((JSBNG__document.activeElement === q))) {\n                    var s = g.listen(q, \"JSBNG__blur\", function() {\n                        p.manipulateInput(q, r);\n                        s.remove();\n                    });\n                }\n                 else p.manipulateInput(q, r);\n            ;\n            }\n        ;\n        ;\n        },\n        manipulateInput: function(q, r) {\n            var s = i.create(\"div\", {\n                className: \"placeholder\",\n                \"aria-hidden\": \"true\"\n            }, r), t = i.create(\"div\", {\n                className: \"uiStickyPlaceholderInput\"\n            }, s);\n            if (i.isNodeOfType(q, \"textarea\")) {\n                h.addClass(t, \"uiStickyPlaceholderTextarea\");\n            }\n        ;\n        ;\n            g.listen(s, \"click\", function() {\n                q.JSBNG__focus();\n            });\n            if (((q.value === r))) {\n                q.value = \"\";\n            }\n        ;\n        ;\n            h.removeClass(q, \"DOMControl_placeholder\");\n            q.setAttribute(\"placeholder\", \"\");\n            i.replace(q, t);\n            i.appendContent(t, q);\n            h.conditionClass(t, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n        },\n        setPlaceholderText: function(q, r) {\n            var s = m(q);\n            if (!s) {\n                j.setPlaceholder(q, r);\n            }\n             else {\n                var t = n(s);\n                ((t && i.setContent(t, r)));\n            }\n        ;\n        ;\n        },\n        getPlaceholderText: function(q) {\n            var r = m(q), s = n(r);\n            return ((s && i.getText(s)));\n        },\n        update: function(q) {\n            var r = m(q);\n            if (r) {\n                h.conditionClass(r, \"uiStickyPlaceholderEmptyInput\", !q.value.length);\n            }\n        ;\n        ;\n        },\n        getVisibleText: function(q) {\n            var r = m(q);\n            if (h.hasClass(r, \"uiStickyPlaceholderEmptyInput\")) {\n                var s = n(r);\n                return ((s && i.getText(s)));\n            }\n             else return q.value\n        ;\n        }\n    };\n    e.exports = p;\n});\n__d(\"TypeaheadCore\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"JSBNG__CSS\",\"DOM\",\"Focus\",\"Input\",\"InputSelection\",\"Keys\",\"StickyPlaceholderInput\",\"UserAgent\",\"bind\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"Input\"), n = b(\"InputSelection\"), o = b(\"Keys\"), p = b(\"StickyPlaceholderInput\"), q = b(\"UserAgent\"), r = b(\"bind\"), s = b(\"copyProperties\"), t = b(\"emptyFunction\");\n    function u(v) {\n        s(this, v);\n    };\n;\n    s(u.prototype, i, {\n        events: [\"JSBNG__blur\",\"JSBNG__focus\",\"click\",\"unselect\",\"loading\",],\n        keepFocused: true,\n        resetOnSelect: false,\n        resetOnKeyup: true,\n        setValueOnSelect: false,\n        queryTimeout: 250,\n        preventFocusChangeOnTab: false,\n        init: function(v, w, x) {\n            this.init = t;\n            this.data = v;\n            this.view = w;\n            this.root = x;\n            this.initInput();\n            this.inputWrap = k.JSBNG__find(x, \"div.wrap\");\n            this.hiddenInput = k.JSBNG__find(x, \"input.hiddenInput\");\n            this.value = \"\";\n            this.nextQuery = null;\n            this.selectedText = null;\n            if (((this.setValueOnSelect && j.hasClass(this.inputWrap, \"selected\")))) {\n                this.selectedText = this.getValue();\n            }\n        ;\n        ;\n            this.initView();\n            this.initData();\n            this.initEvents();\n            this.initToggle();\n            this._exclusions = [];\n        },\n        initInput: function() {\n            this.element = k.JSBNG__find(this.root, \".textInput\");\n            var v = k.scry(this.element, \"input\")[0];\n            if (v) {\n                this.element = v;\n            }\n        ;\n        ;\n        },\n        initView: function() {\n            this.view.subscribe(\"highlight\", l.set.curry(this.element));\n            this.view.subscribe(\"select\", function(v, w) {\n                this.select(w.selected);\n            }.bind(this));\n            this.view.subscribe(\"afterSelect\", function() {\n                this.afterSelect();\n            }.bind(this));\n        },\n        initData: function() {\n            this.data.subscribe(\"respond\", function(v, w) {\n                if (((w.forceDisplay || ((((w.value == this.getValue())) && !this.element.disabled))))) {\n                    this.view.render(w.value, w.results, w.isAsync);\n                }\n            ;\n            ;\n            }.bind(this));\n            this.data.subscribe(\"activity\", function(v, w) {\n                this.fetching = w.activity;\n                if (!this.fetching) {\n                    ((this.nextQuery && this.performQuery()));\n                }\n            ;\n            ;\n                if (((this.loading != this.fetching))) {\n                    this.loading = this.fetching;\n                    this.inform(\"loading\", {\n                        loading: this.loading\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        initEvents: function() {\n            g.listen(this.view.getElement(), {\n                mouseup: this.viewMouseup.bind(this),\n                mousedown: this.viewMousedown.bind(this)\n            });\n            var v = {\n                JSBNG__blur: r(this, \"JSBNG__blur\"),\n                JSBNG__focus: r(this, \"JSBNG__focus\"),\n                click: r(this, \"click\"),\n                keyup: r(this, \"keyup\"),\n                keydown: r(this, \"keydown\")\n            };\n            if (q.firefox()) {\n                v.text = v.keyup;\n            }\n        ;\n        ;\n            if (((q.firefox() < 4))) {\n                v.keypress = v.keydown;\n                delete v.keydown;\n            }\n        ;\n        ;\n            g.listen(this.element, v);\n            g.listen(this.element, \"keypress\", r(this, \"keypress\"));\n        },\n        initToggle: function() {\n            this.subscribe(\"JSBNG__blur\", this.view.hide.bind(this.view));\n            this.subscribe(\"JSBNG__focus\", this.view.show.bind(this.view));\n        },\n        viewMousedown: function() {\n            this.selecting = true;\n        },\n        viewMouseup: function() {\n            this.selecting = false;\n        },\n        JSBNG__blur: function() {\n            if (this.selecting) {\n                this.selecting = false;\n                return;\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__blur\");\n        },\n        click: function() {\n            var v = n.get(this.element);\n            if (((v.start == v.end))) {\n                this.element.select();\n            }\n        ;\n        ;\n            this.inform(\"click\");\n        },\n        JSBNG__focus: function() {\n            this.checkValue();\n            this.inform(\"JSBNG__focus\");\n        },\n        keyup: function() {\n            if (((this.resetOnKeyup && !this.getValue()))) {\n                this.view.reset();\n            }\n        ;\n        ;\n            this.checkValue();\n        },\n        keydown: function(JSBNG__event) {\n            if (((!this.view.isVisible() || this.view.isEmpty()))) {\n                this.checkValue.bind(this).defer();\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case o.TAB:\n                this.handleTab(JSBNG__event);\n                return;\n              case o.UP:\n                this.view.prev();\n                break;\n              case o.DOWN:\n                this.view.next();\n                break;\n              case o.ESC:\n                this.view.reset();\n                break;\n              default:\n                this.checkValue.bind(this).defer();\n                return;\n            };\n        ;\n            JSBNG__event.kill();\n        },\n        keypress: function(JSBNG__event) {\n            if (((this.view.JSBNG__getSelection() && ((g.getKeyCode(JSBNG__event) == o.RETURN))))) {\n                this.view.select();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        handleTab: function(JSBNG__event) {\n            if (this.preventFocusChangeOnTab) {\n                if (this.view.JSBNG__getSelection()) {\n                    JSBNG__event.kill();\n                }\n                 else JSBNG__event.prevent();\n            ;\n            }\n        ;\n        ;\n            this.view.select();\n        },\n        select: function(v) {\n            if (((v && this.setValueOnSelect))) {\n                this.setValue(v.text);\n                this.setHiddenValue(v.uid);\n                this.selectedText = v.text;\n                j.addClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n        },\n        afterSelect: function() {\n            ((this.keepFocused ? l.set(this.element) : this.element.JSBNG__blur()));\n            ((this.resetOnSelect ? this.reset() : this.view.reset()));\n        },\n        unselect: function() {\n            if (this.setValueOnSelect) {\n                this.selectedText = null;\n                j.removeClass(this.inputWrap, \"selected\");\n            }\n        ;\n        ;\n            this.setHiddenValue();\n            this.inform(\"unselect\", this);\n        },\n        setEnabled: function(v) {\n            var w = ((v === false));\n            this.element.disabled = w;\n            j.conditionClass(this.root, \"uiTypeaheadDisabled\", w);\n        },\n        reset: function() {\n            this.unselect();\n            this.setValue();\n            ((!this.keepFocused && m.reset(this.element)));\n            this.view.reset();\n            this.inform(\"reset\");\n        },\n        getElement: function() {\n            return this.element;\n        },\n        setExclusions: function(v) {\n            this._exclusions = v;\n        },\n        getExclusions: function() {\n            return this._exclusions;\n        },\n        setValue: function(v) {\n            this.value = this.nextQuery = ((v || \"\"));\n            m.setValue(this.element, this.value);\n            p.update(this.element);\n        },\n        setHiddenValue: function(v) {\n            this.hiddenInput.value = ((((v || ((v === 0)))) ? v : \"\"));\n            h.inform(\"Form/change\", {\n                node: this.hiddenInput\n            });\n        },\n        getValue: function() {\n            return m.getValue(this.element);\n        },\n        getHiddenValue: function() {\n            return ((this.hiddenInput.value || \"\"));\n        },\n        checkValue: function() {\n            var v = this.getValue();\n            if (((v == this.value))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.selectedText && ((this.selectedText != v))))) {\n                this.unselect();\n            }\n        ;\n        ;\n            var w = JSBNG__Date.now(), x = ((w - this.time));\n            this.time = w;\n            this.value = this.nextQuery = v;\n            this.performQuery(x);\n        },\n        performQuery: function(v) {\n            if (this.selectedText) {\n                return;\n            }\n        ;\n        ;\n            v = ((v || 0));\n            if (((this.fetching && ((v < this.queryTimeout))))) {\n                this.data.query(this.nextQuery, true, this._exclusions, v);\n            }\n             else {\n                this.data.query(this.nextQuery, false, this._exclusions, v);\n                this.nextQuery = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"reportData\", [\"EagleEye\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"EagleEye\"), h = b(\"userAction\");\n    function i(j, k) {\n        k = ((k || {\n        }));\n        var l = {\n            ft: ((k.ft || {\n            })),\n            gt: ((k.gt || {\n            }))\n        }, m = \"-\", n = a.ArbiterMonitor, o = (((!!n) ? n.getActFields() : [])), p = (((!n) ? \"r\" : \"a\")), q = [JSBNG__Date.now(),h.getCurrentUECount(),m,j,m,m,p,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),l,0,0,0,0,].concat(o);\n        g.log(\"act\", q);\n    };\n;\n    e.exports = i;\n});\n__d(\"TimelineSection\", [\"Arbiter\",\"DOMScroll\",\"DoublyLinkedListMap\",\"Run\",\"TidyArbiterMixin\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOMScroll\"), i = b(\"DoublyLinkedListMap\"), j = b(\"Run\"), k = b(\"TidyArbiterMixin\"), l = b(\"copyProperties\"), m = b(\"ge\"), n = null;\n    function o() {\n        n = null;\n    };\n;\n    function p(q, r, s) {\n        this.id = q;\n        this.label = s;\n        this.nodeID = r;\n        this._parentSection = null;\n        this.childSections = new i();\n        this._isLoaded = false;\n        p.inform.bind(p, ((\"sectionInitialized/\" + q)), {\n            section: this\n        }, g.BEHAVIOR_STATE).defer();\n    };\n;\n    l(p, k, {\n        callWithSection: function(q, r) {\n            this.subscribe(((\"sectionInitialized/\" + q)), function(s, t) {\n                r(t.section);\n            });\n        },\n        setActiveSectionID: function(q) {\n            ((!n && j.onLeave(o)));\n            n = q;\n        }\n    });\n    l(p.prototype, {\n        appendSection: function(q) {\n            this.childSections.append(q.id, q);\n            q._parentSection = this;\n        },\n        freeze: function() {\n            this.freezeChildren();\n        },\n        freezeChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                ((!q.isActive() && q.freeze()));\n                q = q.getNext();\n            };\n        ;\n        },\n        getNext: function() {\n            return ((this._parentSection && this._parentSection.childSections.getNext(this.id)));\n        },\n        getPrev: function() {\n            return ((this._parentSection && this._parentSection.childSections.getPrev(this.id)));\n        },\n        isActive: function() {\n            var q = this;\n            while (q) {\n                if (((q.id === n))) {\n                    return true;\n                }\n            ;\n            ;\n                q = q._parentSection;\n            };\n        ;\n            return false;\n        },\n        isLoaded: function() {\n            return this._isLoaded;\n        },\n        setIsLoaded: function(q) {\n            this._isLoaded = q;\n            return this;\n        },\n        JSBNG__scrollTo: function() {\n            if (!m(this.nodeID)) {\n                return;\n            }\n        ;\n        ;\n            h.JSBNG__scrollTo(this.getNode(), true, false, false, h.JSBNG__scrollTo.bind(this).curry(this.getNode(), 0));\n        },\n        thaw: function() {\n            this.thawChildren();\n        },\n        thawChildren: function() {\n            var q = this.childSections.getHead();\n            while (q) {\n                q.thaw();\n                q = q.getNext();\n            };\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TypeaheadBestName\", [\"TokenizeUtil\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TokenizeUtil\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    i.prototype.enable = function() {\n        var j = this._typeahead.getView();\n        this._subscription = j.subscribe(\"beforeRender\", function(k, l) {\n            var m = l.value;\n            for (var n = 0; ((n < l.results.length)); ++n) {\n                var o = l.results[n];\n                if (((o.alternate_names == null))) {\n                    continue;\n                }\n            ;\n            ;\n                if (g.isQueryMatch(m, o.default_name)) {\n                    o.text = o.default_name;\n                    return;\n                }\n            ;\n            ;\n                for (var p = 0; ((p < o.alternate_names.length)); p++) {\n                    if (g.isQueryMatch(m, o.alternate_names[p])) {\n                        o.text = o.alternate_names[p];\n                        return;\n                    }\n                ;\n                ;\n                };\n            ;\n                o.text = o.default_name;\n            };\n        ;\n        });\n    };\n    i.prototype.disable = function() {\n        this._typeahead.getView().unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    h(i.prototype, {\n        _subscription: null\n    });\n    e.exports = i;\n});\n__d(\"legacy:BestNameTypeaheadBehavior\", [\"TypeaheadBestName\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadBestName\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.buildBestAvailableNames = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"UIIntentionalStreamMessage\", [], function(a, b, c, d, e, f) {\n    var g = {\n        SET_AUTO_INSERT: \"UIIntentionalStream/setAutoInsert\",\n        UPDATE_STREAM: \"UIIntentionalStreamRefresh/updateStream\",\n        REFRESH_STREAM: \"UIIntentionalStreamRefresh/refreshStream\",\n        UPDATE_AUTOREFRESH_CONFIG: \"UIIntentionalStream/updateAutoRefreshConfig\",\n        UPDATE_HTML_CONTENT: \"UIIntentionalStream/updateHtmlContent\",\n        UPDATE_LAST_REFRESH_TIME: \"UIIntentionalStream/updateLastRefreshTime\",\n        INSERT_STORIES: \"UIIntentionalStream/updateLastRefreshTime\",\n        UNLOAD: \"UIIntentionalStream/unload\"\n    };\n    e.exports = g;\n});\n__d(\"AccessibleLayer\", [\"JSBNG__Event\",\"DOM\",\"Focus\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Focus\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    j(l.prototype, {\n        enable: function() {\n            this._afterShowSubscription = this._layer.subscribe(\"aftershow\", this._onAfterShow.bind(this));\n        },\n        disable: function() {\n            ((this._listener && this._listener.remove()));\n            this._afterShowSubscription.unsubscribe();\n            this._listener = this._afterShowSubscription = null;\n        },\n        _closeListener: function(JSBNG__event) {\n            var m = this._layer.getCausalElement();\n            if (m) {\n                if (((m.tabIndex == -1))) {\n                    m.tabIndex = 0;\n                    i.setWithoutOutline(m);\n                }\n                 else i.set(m);\n            ;\n            }\n        ;\n        ;\n            this._layer.hide();\n        },\n        _onAfterShow: function() {\n            var m = this._layer.getContentRoot();\n            if (h.scry(m, \".layer_close_elem\")[0]) {\n                return;\n            }\n        ;\n        ;\n            var n = h.create(\"a\", {\n                className: \"accessible_elem layer_close_elem\",\n                href: \"#\"\n            }, [\"Close popup and return\",]);\n            h.appendContent(m, n);\n            this._listener = g.listen(n, \"click\", this._closeListener.bind(this));\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerDestroyOnHide\", [\"function-extensions\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"shield\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    g(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", h(Function.prototype.defer, this._layer.destroy.bind(this._layer)));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerFadeOnHide\", [\"Animation\",\"Layer\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Layer\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._layer = m;\n    };\n;\n    k(l.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (((j.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe(\"starthide\", this._handleStartHide.bind(this));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        },\n        _handleStartHide: function() {\n            var m = true, n = h.subscribe(\"show\", function() {\n                n.unsubscribe();\n                m = false;\n            });\n            (function() {\n                n.unsubscribe();\n                n = null;\n                if (m) {\n                    this._animate();\n                }\n                 else this._layer.finishHide();\n            ;\n            ;\n            }).bind(this).defer();\n            return false;\n        },\n        _animate: function() {\n            new g(this._layer.getRoot()).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(this._finish.bind(this)).go();\n        },\n        _finish: function() {\n            i.set(this._layer.getRoot(), \"opacity\", \"\");\n            this._layer.finishHide();\n        }\n    });\n    e.exports = l;\n});\n__d(\"LayerHideOnBlur\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n;\n    g(h.prototype, {\n        _subscriptions: null,\n        _onBlur: null,\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attach.bind(this)),this._layer.subscribe(\"hide\", this._detach.bind(this)),];\n            if (this._layer.isShown()) {\n                this._attach();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._detach();\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = null;\n        },\n        _detach: function() {\n            ((this._onBlur && this._onBlur.unsubscribe()));\n            this._onBlur = null;\n        },\n        _attach: function() {\n            this._onBlur = this._layer.subscribe(\"JSBNG__blur\", function() {\n                this._layer.hide();\n                return false;\n            }.bind(this));\n        }\n    });\n    e.exports = h;\n});\n__d(\"LayerHideOnEscape\", [\"JSBNG__Event\",\"copyProperties\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Keys\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"key\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(k, JSBNG__event) {\n            if (((g.getKeyCode(JSBNG__event) === i.ESC))) {\n                this._layer.hide();\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerMouseHooks\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ContextualThing\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ContextualThing\"), j = b(\"Layer\"), k = b(\"copyProperties\"), l = new h();\n    function m(n) {\n        this._layer = n;\n        this._subscriptions = [];\n        this._currentlyActive = false;\n    };\n;\n    k(m.prototype, {\n        enable: function() {\n            this._subscriptions = [l.subscribe(\"mouseenter\", this._handleActive.bind(this)),l.subscribe(\"mouseleave\", this._handleInactive.bind(this)),this._layer.subscribe(\"hide\", function() {\n                this._currentlyActive = false;\n            }.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._subscriptions = [];\n            this._currentlyActive = false;\n        },\n        _handleActive: function(n, o) {\n            if (((!this._currentlyActive && this._isNodeWithinStack(o)))) {\n                this._layer.inform(\"mouseenter\");\n                this._currentlyActive = true;\n            }\n        ;\n        ;\n        },\n        _handleInactive: function(n, o) {\n            if (this._currentlyActive) {\n                if (((!o || !this._isNodeWithinStack(o)))) {\n                    this._layer.inform(\"mouseleave\");\n                    this._currentlyActive = false;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        _isNodeWithinStack: function(n) {\n            return i.containsIncludingLayers(this._layer.getContentRoot(), n);\n        }\n    });\n    j.subscribe(\"show\", function(n, o) {\n        var p = o.getContentRoot(), q = [g.listen(p, \"mouseenter\", function() {\n            l.inform(\"mouseenter\", p);\n        }),g.listen(p, \"mouseleave\", function(s) {\n            l.inform(\"mouseleave\", s.getRelatedTarget());\n        }),], r = o.subscribe(\"hide\", function() {\n            while (q.length) {\n                q.pop().remove();\n            ;\n            };\n        ;\n            r.unsubscribe();\n            q = r = null;\n        });\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogArrow\", [\"JSXDOM\",\"JSBNG__CSS\",\"DOM\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"Locale\"), k = b(\"Style\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        bottom: \"-cx-PUBLIC-abstractContextualDialog__arrowbottom\",\n        JSBNG__top: \"-cx-PUBLIC-abstractContextualDialog__arrowtop\",\n        right: \"-cx-PUBLIC-abstractContextualDialog__arrowright\",\n        left: \"-cx-PUBLIC-abstractContextualDialog__arrowleft\"\n    }, p = {\n        above: \"bottom\",\n        below: \"JSBNG__top\",\n        left: \"right\",\n        right: \"left\"\n    };\n    function q(r) {\n        this._layer = r;\n    };\n;\n    m(q.prototype, {\n        _subscription: null,\n        _arrow: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"adjust\",\"reposition\",], this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(r, s) {\n            if (((r === \"adjust\"))) {\n                this._repositionArrow(s);\n            }\n             else this._repositionRoot(s);\n        ;\n        ;\n        },\n        _repositionRoot: function(r) {\n            var s = r.getAlignment();\n            if (((s == \"center\"))) {\n                return;\n            }\n        ;\n        ;\n            var t = this._layer.getRoot(), u = this._layer.getContext(), v = r.isVertical(), w = this._layer.getArrowDimensions(), x = w.offset, y = w.length, z = l.getElementDimensions(u), aa = ((v ? z.x : z.y));\n            if (((aa >= ((y + ((x * 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var ba = ((((y / 2)) + x)), ca = ((aa / 2)), da = parseInt(((ba - ca)), 10);\n            if (v) {\n                if (((s == \"left\"))) {\n                    var ea = parseInt(k.get(t, \"left\"), 10);\n                    k.set(t, \"left\", ((((ea - da)) + \"px\")));\n                }\n                 else {\n                    var fa = parseInt(k.get(t, \"right\"), 10);\n                    k.set(t, \"right\", ((((fa - da)) + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                var ga = parseInt(k.get(t, \"JSBNG__top\"), 10);\n                k.set(t, \"JSBNG__top\", ((((ga - da)) + \"px\")));\n            }\n        ;\n        ;\n        },\n        _repositionArrow: function(r) {\n            var s = this._layer.getContentRoot(), t = r.getPosition(), u = p[t];\n            {\n                var fin107keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin107i = (0);\n                var v;\n                for (; (fin107i < fin107keys.length); (fin107i++)) {\n                    ((v) = (fin107keys[fin107i]));\n                    {\n                        h.conditionClass(s, o[v], ((u === v)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((t == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = g.i({\n                    className: \"-cx-PUBLIC-abstractContextualDialog__arrow\"\n                });\n                i.appendContent(s, this._arrow);\n            }\n        ;\n        ;\n            h.conditionClass(s, \"-cx-PRIVATE-uiContextualDialog__withfooter\", this._layer.getFooter());\n            k.set(this._arrow, \"JSBNG__top\", \"\");\n            k.set(this._arrow, \"left\", \"\");\n            k.set(this._arrow, \"right\", \"\");\n            k.set(this._arrow, \"margin\", \"\");\n            var w = q.getOffsetPercent(r), x = q.getOffset(r, w, this._layer), y = q.getOffsetSide(r);\n            k.set(this._arrow, y, ((w + \"%\")));\n            k.set(this._arrow, ((\"margin-\" + y)), ((x + \"px\")));\n        }\n    });\n    m(q, {\n        getOffsetPercent: function(r) {\n            var s = r.getAlignment(), t = r.getPosition();\n            if (((((t == \"above\")) || ((t == \"below\"))))) {\n                if (((s == \"center\"))) {\n                    return 50;\n                }\n                 else if (((s == \"right\"))) {\n                    return 100;\n                }\n                \n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        getOffsetSide: function(r) {\n            var s = r.isVertical();\n            return ((s ? ((j.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n        },\n        getOffset: function(r, s, t) {\n            var u = t.getArrowDimensions(), v = u.offset, w = u.length, x = r.getAlignment(), y = ((((x == \"center\")) ? 0 : v));\n            y += ((((w * s)) / 100));\n            if (((x != \"left\"))) {\n                y *= -1;\n            }\n        ;\n        ;\n            return y;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ContextualDialogFitInViewport\", [\"JSBNG__Event\",\"ContextualLayerDimensions\",\"Style\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ContextualLayerDimensions\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"throttle\");\n    function m(n) {\n        this._layer = n;\n        this._listeners = [];\n    };\n;\n    k(m.prototype, {\n        _subscription: null,\n        _minimumTop: null,\n        enable: function() {\n            var n = this._layer.getArrowDimensions();\n            this._arrowOffset = n.offset;\n            var o = n.length;\n            this._arrowBuffer = ((this._arrowOffset + o));\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",\"reposition\",], function(p, q) {\n                if (((p == \"reposition\"))) {\n                    this._calculateMinimumTop(q);\n                }\n                 else if (((p == \"show\"))) {\n                    this._attachScroll();\n                    this._adjustForScroll();\n                }\n                 else this._detachScroll();\n                \n            ;\n            ;\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._attachScroll();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._layer.isShown()) {\n                this._detachScroll();\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _attachScroll: function() {\n            var n = l(this._adjustForScroll.bind(this)), o = ((this._layer.getContextScrollParent() || window));\n            this._listeners = [g.listen(o, \"JSBNG__scroll\", n),g.listen(window, \"resize\", n),];\n        },\n        _detachScroll: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._listeners = [];\n        },\n        _getContentHeight: function() {\n            return j.getElementDimensions(this._layer._contentWrapper).y;\n        },\n        _getContextY: function() {\n            return j.getElementPosition(this._layer.getContext()).y;\n        },\n        _calculateMinimumTop: function(n) {\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            this._minimumTop = ((((this._getContextY() - ((this._getContentHeight() - this._arrowBuffer)))) + n.getOffsetY()));\n        },\n        _adjustForScroll: function() {\n            if (this._layer.isFixed()) {\n                return;\n            }\n        ;\n        ;\n            var n = this._layer._getOrientation();\n            if (n.isVertical()) {\n                return;\n            }\n        ;\n        ;\n            var o = h.getViewportRect(this._layer), p = ((o.b - this._minimumTop));\n            if (((p < 0))) {\n                return;\n            }\n        ;\n        ;\n            var q = this._getContentHeight(), r = ((q - ((this._arrowBuffer + this._arrowOffset)))), s = Math.max(0, Math.min(r, ((r - ((p - q))))));\n            i.set(this._layer.getContent(), \"JSBNG__top\", ((-s + \"px\")));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualDialogDefaultTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = {\n        wrapperClassName: \"-cx-PRIVATE-uiContextualDialog__root\",\n        arrowDimensions: {\n            offset: 15,\n            length: 16\n        }\n    };\n    e.exports = h;\n});\n__d(\"ContextualDialog\", [\"AccessibleLayer\",\"Class\",\"ContextualDialogArrow\",\"ContextualDialogFitInViewport\",\"ContextualLayer\",\"ContextualDialogDefaultTheme\",\"JSBNG__CSS\",\"DOM\",\"JSXDOM\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerHideOnTransition\",\"LayerFormHooks\",\"LayerMouseHooks\",\"Style\",\"copyProperties\",\"csx\",\"cx\",\"invariant\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"AccessibleLayer\"), h = b(\"Class\"), i = b(\"ContextualDialogArrow\"), j = b(\"ContextualDialogFitInViewport\"), k = b(\"ContextualLayer\"), l = b(\"ContextualDialogDefaultTheme\"), m = b(\"JSBNG__CSS\"), n = b(\"DOM\"), o = b(\"JSXDOM\"), p = b(\"LayerAutoFocus\"), q = b(\"LayerButtons\"), r = b(\"LayerHideOnTransition\"), s = b(\"LayerFormHooks\"), t = b(\"LayerMouseHooks\"), u = b(\"Style\"), v = b(\"copyProperties\"), w = b(\"csx\"), x = b(\"cx\"), y = b(\"invariant\"), z = b(\"removeFromArray\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    h.extend(aa, k);\n    v(aa.prototype, {\n        _footer: null,\n        _configure: function(ba, ca) {\n            v(ba, ((ba.theme || l)));\n            var da = ((ba.arrowBehavior || i));\n            ba.addedBehaviors = ((ba.addedBehaviors || []));\n            ba.addedBehaviors.push(da);\n            this._footer = n.scry(ca, \"div.-cx-PUBLIC-abstractContextualDialog__footer\")[0];\n            this.parent._configure(ba, ca);\n        },\n        _getDefaultBehaviors: function() {\n            var ba = this.parent._getDefaultBehaviors();\n            z(ba, r);\n            return ba.concat([g,p,j,q,s,t,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            m.addClass(ca, \"-cx-PUBLIC-abstractContextualDialog__content\");\n            this._innerWrapper = o.div(null, ca);\n            var da = this.parent._buildWrapper(ba, this._innerWrapper);\n            m.addClass(da, ba.wrapperClassName);\n            if (ba.width) {\n                this.setWidth(ba.width);\n            }\n        ;\n        ;\n            return da;\n        },\n        getContentRoot: function() {\n            y(!!this._innerWrapper);\n            return this._innerWrapper;\n        },\n        setContent: function(ba) {\n            m.addClass(ba, \"-cx-PUBLIC-abstractContextualDialog__content\");\n            n.setContent(this.getContentRoot(), ba);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            u.set(this.getContentRoot(), \"width\", ((ba + \"px\")));\n            return this;\n        },\n        getFooter: function() {\n            return this._footer;\n        },\n        getArrowDimensions: function() {\n            return this._config.arrowDimensions;\n        }\n    });\n    v(aa, {\n        setContext: function(ba, ca) {\n            ba.setContext(ca);\n        }\n    });\n    e.exports = aa;\n});\n__d(\"Hovercard\", [\"JSXDOM\",\"JSBNG__Event\",\"function-extensions\",\"AccessibleLayer\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ContextualDialog\",\"ContextualThing\",\"DOM\",\"LayerAutoFocus\",\"Parent\",\"JSBNG__Rect\",\"Style\",\"UserAgent\",\"Vector\",\"clickRefAction\",\"cx\",\"csx\",\"emptyFunction\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var i = b(\"AccessibleLayer\"), j = b(\"Arbiter\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"ContextualDialog\"), n = b(\"ContextualThing\"), o = b(\"DOM\"), p = b(\"LayerAutoFocus\"), q = b(\"Parent\"), r = b(\"JSBNG__Rect\"), s = b(\"Style\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"clickRefAction\"), w = b(\"cx\"), x = b(\"csx\"), y = b(\"emptyFunction\"), z = b(\"tx\"), aa = b(\"userAction\"), ba = {\n    }, ca = {\n    }, da = null, ea = null, fa = null, ga = 150, ha = 700, ia = 1000, ja = 250, ka = null, la = null, ma = null, na = null;\n    function oa(JSBNG__event) {\n        var db = q.byTag(JSBNG__event.getTarget(), \"a\");\n        ((cb.processNode(db) && JSBNG__event.JSBNG__stop()));\n    };\n;\n    function pa(db) {\n        ea = db;\n        if (!qa(db)) {\n            var eb;\n            if (((!db || !(eb = ra(db))))) {\n                ((ca.moveToken && ca.moveToken.remove()));\n                ca = {\n                };\n                return false;\n            }\n        ;\n        ;\n            if (((ca.node != db))) {\n                ((ca.moveToken && ca.moveToken.remove()));\n                ca = {\n                    node: db,\n                    endpoint: eb,\n                    pos: null\n                };\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function qa(db) {\n        return ((((db && da)) && ((ca.node == db))));\n    };\n;\n    function ra(db) {\n        return db.getAttribute(\"data-hovercard\");\n    };\n;\n    function sa(db) {\n        var eb = o.scry(db, \"^.-cx-PRIVATE-fbEntstreamFeedObject__root .-cx-PUBLIC-fbEntstreamEmbed__root\").length;\n        if (eb) {\n            return;\n        }\n    ;\n    ;\n        var fb = h.listen(db, \"mouseout\", function() {\n            JSBNG__clearTimeout(ka);\n            JSBNG__clearTimeout(la);\n            fb.remove();\n            ea = null;\n            if (!cb.contains(db)) {\n                cb.hide();\n            }\n        ;\n        ;\n        });\n        if (!ca.moveToken) {\n            ca.moveToken = h.listen(db, \"mousemove\", function(JSBNG__event) {\n                ca.pos = u.getEventPosition(JSBNG__event);\n            });\n        }\n    ;\n    ;\n        JSBNG__clearTimeout(ka);\n        JSBNG__clearTimeout(la);\n        JSBNG__clearTimeout(na);\n        var gb = ga, hb = ((da ? ja : ha));\n        if (db.getAttribute(\"data-hovercard-instant\")) {\n            gb = hb = 50;\n        }\n    ;\n    ;\n        ka = JSBNG__setTimeout(xa.curry(db), gb);\n        la = JSBNG__setTimeout(ta.curry(db), hb);\n    };\n;\n    function ta(db, eb) {\n        if (((ca.node != db))) {\n            return;\n        }\n    ;\n    ;\n        var fb = ba[ra(db)];\n        if (fb) {\n            va(fb);\n        }\n         else if (eb) {\n            va(za());\n        }\n         else {\n            var gb = ((da ? ja : ha));\n            ma = JSBNG__setTimeout(ta.curry(db, true), ((ia - gb)));\n        }\n        \n    ;\n    ;\n    };\n;\n    function ua() {\n        cb.hide(true);\n        JSBNG__clearTimeout(la);\n    };\n;\n    function va(db) {\n        var eb = ca.node, fb = da, gb = ((fb != eb));\n        if (fa) {\n            var hb = fa.getContentRoot();\n            if (!n.containsIncludingLayers(hb, eb)) {\n                fa.hide();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!o.contains(JSBNG__document.body, eb)) {\n            cb.hide(true);\n            return;\n        }\n    ;\n    ;\n        da = eb;\n        fa = db;\n        db.setContextWithBounds(eb, wa(eb)).show();\n        if (gb) {\n            (function() {\n                new l(\"/ajax/hovercard/shown.php\").send();\n                v(\"himp\", da, null, \"FORCE\", {\n                    ft: {\n                        evt: 39\n                    }\n                });\n                aa(\"hovercard\", da).uai(\"show\");\n            }).defer();\n        }\n    ;\n    ;\n    };\n;\n    function wa(db) {\n        var eb = ca.pos, fb = db.getClientRects();\n        if (((!eb || ((fb.length === 0))))) {\n            return r.getElementBounds(db);\n        }\n    ;\n    ;\n        var gb, hb = false;\n        for (var ib = 0; ((ib < fb.length)); ib++) {\n            var jb = new r(Math.round(fb[ib].JSBNG__top), Math.round(fb[ib].right), Math.round(fb[ib].bottom), Math.round(fb[ib].left), \"viewport\").convertTo(\"JSBNG__document\"), kb = jb.getPositionVector(), lb = kb.add(jb.getDimensionVector());\n            if (((!gb || ((((kb.x <= gb.l)) && ((kb.y > gb.t))))))) {\n                if (hb) {\n                    break;\n                }\n            ;\n            ;\n                gb = new r(kb.y, lb.x, lb.y, kb.x, \"JSBNG__document\");\n            }\n             else {\n                gb.t = Math.min(gb.t, kb.y);\n                gb.b = Math.max(gb.b, lb.y);\n                gb.r = lb.x;\n            }\n        ;\n        ;\n            if (jb.contains(eb)) {\n                hb = true;\n            }\n        ;\n        ;\n        };\n    ;\n        return gb;\n    };\n;\n    function xa(db) {\n        if (((db.id && ((ba[db.id] != null))))) {\n            return;\n        }\n    ;\n    ;\n        var eb = ra(db);\n        if (((ba[eb] != null))) {\n            return;\n        }\n    ;\n    ;\n        ya(eb);\n        var fb = function() {\n            cb.dirty(eb);\n            ua();\n        };\n        new k(eb).setData({\n            endpoint: eb\n        }).setMethod(\"GET\").setReadOnly(true).setErrorHandler(fb).setTransportErrorHandler(fb).send();\n    };\n;\n    function ya(db) {\n        ba[db] = false;\n    };\n;\n    var za = function() {\n        var db = new m({\n            width: 275\n        }, g.div({\n            className: \"-cx-PRIVATE-hovercard__loading\"\n        }, \"Loading...\"));\n        db.disableBehavior(i).disableBehavior(p);\n        ab(db);\n        za = y.thatReturns(db);\n        return db;\n    };\n    function ab(db) {\n        var eb = [db.subscribe(\"mouseenter\", function() {\n            JSBNG__clearTimeout(na);\n            ea = ca.node;\n        }),db.subscribe(\"mouseleave\", function() {\n            db.hide();\n            ea = null;\n        }),db.subscribe(\"destroy\", function() {\n            while (eb.length) {\n                eb.pop().unsubscribe();\n            ;\n            };\n        ;\n            eb = null;\n        }),];\n    };\n;\n    var bb = true, cb = {\n        hide: function(db) {\n            if (!da) {\n                return;\n            }\n        ;\n        ;\n            if (db) {\n                if (fa) {\n                    fa.hide();\n                }\n            ;\n            ;\n                ea = null;\n                da = null;\n                fa = null;\n            }\n             else na = JSBNG__setTimeout(cb.hide.curry(true), ja);\n        ;\n        ;\n        },\n        setDialog: function(db, eb) {\n            eb.disableBehavior(i).disableBehavior(p);\n            ba[db] = eb;\n            ab(eb);\n            if (((((ca.endpoint == db)) && ((ea == ca.node))))) {\n                za().hide();\n                var fb = ca.node.getAttribute(\"data-hovercard-position\");\n                ((fb && eb.setPosition(fb)));\n                var gb = ca.node.getAttribute(\"data-hovercard-offset-x\");\n                ((gb && eb.setOffsetX(parseInt(gb, 10))));\n                var hb = ca.node.getAttribute(\"data-hovercard-offset-y\");\n                ((hb && eb.setOffsetY(parseInt(hb, 10))));\n                va(eb);\n            }\n        ;\n        ;\n        },\n        getDialog: function(db) {\n            return ba[db];\n        },\n        contains: function(db) {\n            if (fa) {\n                return n.containsIncludingLayers(fa.getContentRoot(), db);\n            }\n        ;\n        ;\n            return false;\n        },\n        dirty: function(db) {\n            var eb = ba[db];\n            if (eb) {\n                eb.destroy();\n                delete ba[db];\n            }\n        ;\n        ;\n        },\n        dirtyAll: function() {\n            {\n                var fin108keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin108i = (0);\n                var db;\n                for (; (fin108i < fin108keys.length); (fin108i++)) {\n                    ((db) = (fin108keys[fin108i]));\n                    {\n                        var eb = ba[db];\n                        ((eb && cb.dirty(db)));\n                    };\n                };\n            };\n        ;\n            j.inform(\"Hovercard/dirty\");\n        },\n        processNode: function(db) {\n            if (((db && pa(db)))) {\n                sa(db);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        setDirtyAllOnPageTransition: function(db) {\n            bb = db;\n        }\n    };\n    (function() {\n        if (((t.ie() < 8))) {\n            return;\n        }\n    ;\n    ;\n        h.listen(JSBNG__document.documentElement, \"mouseover\", oa);\n        h.listen(window, \"JSBNG__scroll\", function() {\n            if (((da && s.isFixed(da)))) {\n                cb.hide(true);\n            }\n        ;\n        ;\n        });\n        j.subscribe(\"page_transition\", function() {\n            ua();\n            ((bb && cb.dirtyAll()));\n        }, j.SUBSCRIBE_NEW);\n    })();\n    e.exports = cb;\n});\n__d(\"ScrollableArea\", [\"Animation\",\"ArbiterMixin\",\"BrowserSupport\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Run\",\"SimpleDrag\",\"Style\",\"UserAgent\",\"Vector\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"BrowserSupport\"), j = b(\"JSBNG__CSS\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Run\"), p = b(\"SimpleDrag\"), q = b(\"Style\"), r = b(\"UserAgent\"), s = b(\"Vector\"), t = b(\"copyProperties\"), u = b(\"throttle\"), v = 12;\n    function w(x, y) {\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        y = ((y || {\n        }));\n        this._elem = x;\n        this._wrap = l.JSBNG__find(x, \"div.uiScrollableAreaWrap\");\n        this._body = l.JSBNG__find(this._wrap, \"div.uiScrollableAreaBody\");\n        this._content = l.JSBNG__find(this._body, \"div.uiScrollableAreaContent\");\n        this._track = l.JSBNG__find(x, \"div.uiScrollableAreaTrack\");\n        this._gripper = l.JSBNG__find(this._track, \"div.uiScrollableAreaGripper\");\n        this._options = y;\n        this._throttledComputeHeights = u.withBlocking(this._computeHeights, 250, this);\n        this.throttledAdjustGripper = u.withBlocking(this.adjustGripper, 250, this);\n        this._throttledShowGripperAndShadows = u.withBlocking(this._showGripperAndShadows, 250, this);\n        this._throttledRespondMouseMove = u(this._respondMouseMove, 250, this);\n        this.adjustGripper.bind(this).defer();\n        this._listeners = [m.listen(this._wrap, \"JSBNG__scroll\", this._handleScroll.bind(this)),m.listen(x, \"mousemove\", this._handleMouseMove.bind(this)),m.listen(this._track, \"click\", this._handleClickOnTrack.bind(this)),];\n        if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"click\", this._handleClickOnTrack.bind(this)));\n        }\n    ;\n    ;\n        if (((y.fade !== false))) {\n            this._listeners.push(m.listen(x, \"mouseenter\", this._handleMouseEnter.bind(this)), m.listen(x, \"mouseleave\", this._handleMouseLeave.bind(this)), m.listen(x, \"focusin\", this.showScrollbar.bind(this, false)), m.listen(x, \"focusout\", this.hideScrollbar.bind(this)));\n        }\n         else if (i.hasPointerEvents()) {\n            this._listeners.push(m.listen(x, \"mouseleave\", j.removeClass.curry(x, \"uiScrollableAreaTrackOver\")));\n        }\n        \n    ;\n    ;\n        if (((r.webkit() || r.chrome()))) {\n            this._listeners.push(m.listen(x, \"mousedown\", function() {\n                var z = m.listen(window, \"mouseup\", function() {\n                    if (x.scrollLeft) {\n                        x.scrollLeft = 0;\n                    }\n                ;\n                ;\n                    z.remove();\n                });\n            }));\n        }\n         else if (r.firefox()) {\n            this._wrap.JSBNG__addEventListener(\"DOMMouseScroll\", function(JSBNG__event) {\n                ((((JSBNG__event.axis === JSBNG__event.HORIZONTAL_AXIS)) && JSBNG__event.preventDefault()));\n            }, false);\n        }\n        \n    ;\n    ;\n        this.initDrag();\n        k.set(this._elem, \"ScrollableArea\", this);\n        if (!y.persistent) {\n            o.onLeave(this.destroy.bind(this));\n        }\n    ;\n    ;\n        if (((y.shadow !== false))) {\n            j.addClass(this._elem, \"uiScrollableAreaWithShadow\");\n        }\n    ;\n    ;\n    };\n;\n    t(w, {\n        renderDOM: function() {\n            var x = l.create(\"div\", {\n                className: \"uiScrollableAreaContent\"\n            }), y = l.create(\"div\", {\n                className: \"uiScrollableAreaBody\"\n            }, x), z = l.create(\"div\", {\n                className: \"uiScrollableAreaWrap\"\n            }, y), aa = l.create(\"div\", {\n                className: \"uiScrollableArea native\"\n            }, z);\n            return {\n                root: aa,\n                wrap: z,\n                body: y,\n                JSBNG__content: x\n            };\n        },\n        fromNative: function(x, y) {\n            if (((!j.hasClass(x, \"uiScrollableArea\") || !j.hasClass(x, \"native\")))) {\n                return;\n            }\n        ;\n        ;\n            y = ((y || {\n            }));\n            j.removeClass(x, \"native\");\n            var z = l.create(\"div\", {\n                className: \"uiScrollableAreaTrack\"\n            }, l.create(\"div\", {\n                className: \"uiScrollableAreaGripper\"\n            }));\n            if (((y.fade !== false))) {\n                j.addClass(x, \"fade\");\n                j.addClass(z, \"invisible_elem\");\n            }\n             else j.addClass(x, \"nofade\");\n        ;\n        ;\n            l.appendContent(x, z);\n            var aa = new w(x, y);\n            aa.resize();\n            return aa;\n        },\n        getInstance: function(x) {\n            var y = n.byClass(x, \"uiScrollableArea\");\n            return ((y ? k.get(y, \"ScrollableArea\") : null));\n        },\n        poke: function(x) {\n            var y = w.getInstance(x);\n            ((y && y.poke()));\n        }\n    });\n    t(w.prototype, h, {\n        initDrag: function() {\n            var x = i.hasPointerEvents(), y = new p(((x ? this._elem : this._gripper)));\n            y.subscribe(\"start\", function(z, JSBNG__event) {\n                if (!((((JSBNG__event.which && ((JSBNG__event.which === 1)))) || ((JSBNG__event.button && ((JSBNG__event.button === 1))))))) {\n                    return;\n                }\n            ;\n            ;\n                var aa = s.getEventPosition(JSBNG__event, \"viewport\");\n                if (x) {\n                    var ba = this._gripper.getBoundingClientRect();\n                    if (((((((((aa.x < ba.left)) || ((aa.x > ba.right)))) || ((aa.y < ba.JSBNG__top)))) || ((aa.y > ba.bottom))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"grip_start\");\n                var ca = aa.y, da = this._gripper.offsetTop;\n                j.addClass(this._elem, \"uiScrollableAreaDragging\");\n                var ea = y.subscribe(\"update\", function(ga, JSBNG__event) {\n                    var ha = ((s.getEventPosition(JSBNG__event, \"viewport\").y - ca));\n                    this._throttledComputeHeights();\n                    var ia = ((this._contentHeight - this._containerHeight)), ja = ((da + ha)), ka = ((this._trackHeight - this._gripperHeight));\n                    ja = Math.max(Math.min(ja, ka), 0);\n                    var la = ((((ja / ka)) * ia));\n                    this._wrap.scrollTop = la;\n                }.bind(this)), fa = y.subscribe(\"end\", function() {\n                    y.unsubscribe(ea);\n                    y.unsubscribe(fa);\n                    j.removeClass(this._elem, \"uiScrollableAreaDragging\");\n                    this.inform(\"grip_end\");\n                }.bind(this));\n            }.bind(this));\n        },\n        adjustGripper: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_565), function() {\n            if (this._needsGripper()) {\n                q.set(this._gripper, \"height\", ((this._gripperHeight + \"px\")));\n                this._slideGripper();\n            }\n        ;\n        ;\n            this._throttledShowGripperAndShadows();\n            return this;\n        })),\n        _computeHeights: function() {\n            this._containerHeight = this._elem.clientHeight;\n            this._contentHeight = this._content.offsetHeight;\n            this._trackHeight = this._track.offsetHeight;\n            this._gripperHeight = Math.max(((((this._containerHeight / this._contentHeight)) * this._trackHeight)), v);\n        },\n        _needsGripper: function() {\n            this._throttledComputeHeights();\n            return ((this._gripperHeight < this._trackHeight));\n        },\n        _slideGripper: function() {\n            var x = ((((this._wrap.scrollTop / ((this._contentHeight - this._containerHeight)))) * ((this._trackHeight - this._gripperHeight))));\n            q.set(this._gripper, \"JSBNG__top\", ((x + \"px\")));\n        },\n        _showGripperAndShadows: function() {\n            j.conditionShow(this._gripper, this._needsGripper());\n            j.conditionClass(this._elem, \"contentBefore\", ((this._wrap.scrollTop > 0)));\n            j.conditionClass(this._elem, \"contentAfter\", !this.isScrolledToBottom());\n        },\n        destroy: function() {\n            this._listeners.forEach(function(x) {\n                x.remove();\n            });\n            this._listeners.length = 0;\n        },\n        _handleClickOnTrack: function(JSBNG__event) {\n            var x = s.getEventPosition(JSBNG__event, \"viewport\"), y = this._gripper.getBoundingClientRect();\n            if (((((x.x < y.right)) && ((x.x > y.left))))) {\n                if (((x.y < y.JSBNG__top))) {\n                    this.setScrollTop(((this.getScrollTop() - this._elem.clientHeight)));\n                }\n                 else if (((x.y > y.bottom))) {\n                    this.setScrollTop(((this.getScrollTop() + this._elem.clientHeight)));\n                }\n                \n            ;\n            ;\n                JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _handleMouseMove: function(JSBNG__event) {\n            var x = ((this._options.fade !== false));\n            if (((i.hasPointerEvents() || x))) {\n                this._mousePos = s.getEventPosition(JSBNG__event);\n                this._throttledRespondMouseMove();\n            }\n        ;\n        ;\n        },\n        _respondMouseMove: function() {\n            if (!this._mouseOver) {\n                return;\n            }\n        ;\n        ;\n            var x = ((this._options.fade !== false)), y = this._mousePos, z = s.getElementPosition(this._track).x, aa = s.getElementDimensions(this._track).x, ba = Math.abs(((((z + ((aa / 2)))) - y.x)));\n            j.conditionClass(this._elem, \"uiScrollableAreaTrackOver\", ((i.hasPointerEvents() && ((ba <= 10)))));\n            if (x) {\n                if (((ba < 25))) {\n                    this.showScrollbar(false);\n                }\n                 else if (!this._options.no_fade_on_hover) {\n                    this.hideScrollbar();\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        _handleScroll: function(JSBNG__event) {\n            if (this._needsGripper()) {\n                this._slideGripper();\n            }\n        ;\n        ;\n            this.throttledAdjustGripper();\n            if (((this._options.fade !== false))) {\n                this.showScrollbar();\n            }\n        ;\n        ;\n            this.inform(\"JSBNG__scroll\");\n        },\n        _handleMouseLeave: function() {\n            this._mouseOver = false;\n            this.hideScrollbar();\n        },\n        _handleMouseEnter: function() {\n            this._mouseOver = true;\n            this.showScrollbar();\n        },\n        hideScrollbar: function(x) {\n            if (!this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = false;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (x) {\n                q.set(this._track, \"opacity\", 0);\n                j.addClass.curry(this._track, \"invisible_elem\");\n            }\n             else this._hideTimeout = function() {\n                if (this._hideAnimation) {\n                    this._hideAnimation.JSBNG__stop();\n                    this._hideAnimation = null;\n                }\n            ;\n            ;\n                this._hideAnimation = (new g(this._track)).from(\"opacity\", 1).to(\"opacity\", 0).duration(250).ondone(j.addClass.curry(this._track, \"invisible_elem\")).go();\n            }.bind(this).defer(750);\n        ;\n        ;\n            return this;\n        },\n        resize: function() {\n            var x = s.getElementDimensions(this._elem).x;\n            if (((this._options.fade === false))) {\n                x -= 10;\n            }\n        ;\n        ;\n            x = Math.max(0, x);\n            q.set(this._body, \"width\", ((x + \"px\")));\n            return this;\n        },\n        showScrollbar: function(x) {\n            this.throttledAdjustGripper();\n            if (this._scrollbarVisible) {\n                return this;\n            }\n        ;\n        ;\n            this._scrollbarVisible = true;\n            if (this._hideTimeout) {\n                JSBNG__clearTimeout(this._hideTimeout);\n                this._hideTimeout = null;\n            }\n        ;\n        ;\n            if (this._hideAnimation) {\n                this._hideAnimation.JSBNG__stop();\n                this._hideAnimation = null;\n            }\n        ;\n        ;\n            q.set(this._track, \"opacity\", 1);\n            j.removeClass(this._track, \"invisible_elem\");\n            if (((((x !== false)) && !this._options.no_fade_on_hover))) {\n                this.hideScrollbar();\n            }\n        ;\n        ;\n            return this;\n        },\n        isScrolledToBottom: function() {\n            return ((this._wrap.scrollTop >= ((this._contentHeight - this._containerHeight))));\n        },\n        isScrolledToTop: function() {\n            return ((this._wrap.scrollTop === 0));\n        },\n        scrollToBottom: function(x) {\n            this.setScrollTop(this._wrap.scrollHeight, x);\n        },\n        scrollToTop: function(x) {\n            this.setScrollTop(0, x);\n        },\n        scrollIntoView: function(x, y) {\n            var z = this._wrap.clientHeight, aa = x.offsetHeight, ba = this._wrap.scrollTop, ca = ((ba + z)), da = x.offsetTop, ea = ((da + aa));\n            if (((((da < ba)) || ((z < aa))))) {\n                this.setScrollTop(da, y);\n            }\n             else if (((ea > ca))) {\n                this.setScrollTop(((ba + ((ea - ca)))), y);\n            }\n            \n        ;\n        ;\n        },\n        scrollElemToTop: function(x, y, z) {\n            this.setScrollTop(x.offsetTop, y, {\n                callback: z\n            });\n        },\n        poke: function() {\n            var x = this._wrap.scrollTop;\n            this._wrap.scrollTop += 1;\n            this._wrap.scrollTop -= 1;\n            this._wrap.scrollTop = x;\n            return this.showScrollbar(false);\n        },\n        getScrollTop: function() {\n            return this._wrap.scrollTop;\n        },\n        getScrollHeight: function() {\n            return this._wrap.scrollHeight;\n        },\n        setScrollTop: function(x, y, z) {\n            z = ((z || {\n            }));\n            if (((y !== false))) {\n                if (this._scrollTopAnimation) {\n                    this._scrollTopAnimation.JSBNG__stop();\n                }\n            ;\n            ;\n                var aa = ((z.duration || 250)), ba = ((z.ease || g.ease.end));\n                this._scrollTopAnimation = (new g(this._wrap)).to(\"scrollTop\", x).ease(ba).duration(aa).ondone(z.callback).go();\n            }\n             else {\n                this._wrap.scrollTop = x;\n                ((z.callback && z.callback()));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:Tooltip\", [\"Tooltip\",], function(a, b, c, d) {\n    a.Tooltip = b(\"Tooltip\");\n}, 3);\n__d(\"ClearableTypeahead\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = {\n        resetOnCloseButtonClick: function(i, j) {\n            g.listen(j, \"click\", function() {\n                var k = i.getCore();\n                k.getElement().JSBNG__focus();\n                k.reset();\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"TypeaheadShowLoadingIndicator\", [\"JSBNG__CSS\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._typeahead = j;\n    };\n;\n    h(i.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._typeahead.subscribe(\"loading\", function(j, k) {\n                g.conditionClass(this._typeahead.getElement(), \"typeaheadLoading\", k.loading);\n                g.conditionClass(this._typeahead.getView().getElement(), \"typeaheadViewLoading\", k.loading);\n            }.bind(this));\n        },\n        disable: function() {\n            this._typeahead.unsubscribe(this._subscription);\n            this._subscription = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"legacy:ShowLoadingIndicatorTypeaheadBehavior\", [\"TypeaheadShowLoadingIndicator\",], function(a, b, c, d) {\n    var e = b(\"TypeaheadShowLoadingIndicator\");\n    if (!a.TypeaheadBehaviors) {\n        a.TypeaheadBehaviors = {\n        };\n    }\n;\n;\n    a.TypeaheadBehaviors.showLoadingIndicator = function(f) {\n        f.enableBehavior(e);\n    };\n}, 3);\n__d(\"CompactTypeaheadRenderer\", [\"Badge\",\"DOM\",\"TypeaheadFacepile\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\"), i = b(\"TypeaheadFacepile\");\n    function j(k, l) {\n        var m = [];\n        if (k.xhp) {\n            return h.create(\"li\", {\n                className: \"raw\"\n            }, k.xhp);\n        }\n    ;\n    ;\n        var n = ((k.photos || k.photo));\n        if (n) {\n            if (((n instanceof Array))) {\n                n = i.render(n);\n            }\n             else n = h.create(\"img\", {\n                alt: \"\",\n                src: n\n            });\n        ;\n        ;\n            m.push(n);\n        }\n    ;\n    ;\n        if (k.text) {\n            var o = [k.text,];\n            if (k.verified) {\n                o.push(g(\"xsmall\", \"verified\"));\n            }\n        ;\n        ;\n            m.push(h.create(\"span\", {\n                className: \"text\"\n            }, o));\n        }\n    ;\n    ;\n        var p = k.subtext, q = k.category;\n        if (((p || q))) {\n            var r = [];\n            ((p && r.push(p)));\n            ((((p && q)) && r.push(\" \\u00b7 \")));\n            ((q && r.push(q)));\n            m.push(h.create(\"span\", {\n                className: \"subtext\"\n            }, r));\n        }\n    ;\n    ;\n        var s = h.create(\"li\", {\n            className: ((k.type || \"\"))\n        }, m);\n        if (k.text) {\n            s.setAttribute(\"aria-label\", k.text);\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    j.className = \"compact\";\n    e.exports = j;\n});\n__d(\"endsWith\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i, ((h.length - i.length))) > -1));\n    };\n;\n    e.exports = g;\n});\n__d(\"extendArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Array.prototype.push.apply(h, i);\n        return h;\n    };\n;\n    e.exports = g;\n});");
// 5056
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o38,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/cV-1QIoVTI-.js",o55);
// undefined
o38 = null;
// undefined
o55 = null;
// 5061
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"AVmr9\",]);\n}\n;\n__d(\"ChatConfig\", [\"ChatConfigInitialData\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfigInitialData\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        get: function(k, l) {\n            return ((k in i) ? i[k] : l);\n        },\n        set: function(k) {\n            if ((arguments.length > 1)) {\n                var l = {\n                };\n                l[k] = arguments[1];\n                k = l;\n            }\n        ;\n            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactPropTypes\",\"React\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = b(\"tx\"), l = g.hasCSSAnimations(), m = i.createClass({\n        displayName: \"XUISpinner\",\n        propTypes: {\n            size: h.oneOf([\"small\",\"large\",]),\n            background: h.oneOf([\"light\",\"dark\",])\n        },\n        getDefaultProps: function() {\n            return {\n                size: \"small\",\n                background: \"light\"\n            };\n        },\n        render: function() {\n            var n = (((((((\"-cx-PRIVATE-xuiSpinner__root\") + (((this.props.size == \"small\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__small\") : \"\"))) + (((this.props.size == \"large\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__large\") : \"\"))) + (((this.props.background == \"light\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__light\") : \"\"))) + (((this.props.background == \"dark\") ? (\" \" + \"-cx-PRIVATE-xuiSpinner__dark\") : \"\"))) + ((!l ? (\" \" + \"-cx-PRIVATE-xuiSpinner__animatedgif\") : \"\"))));\n            return this.transferPropsTo(i.DOM.span({\n                className: n\n            }, \"Loading...\"));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ViewportBounds\", [\"Style\",\"Vector\",\"emptyFunction\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"Vector\"), i = b(\"emptyFunction\"), j = b(\"ge\"), k = b(\"removeFromArray\"), l = {\n        top: [],\n        right: [],\n        bottom: [],\n        left: []\n    };\n    function m(q) {\n        return function() {\n            var r = 0;\n            l[q].forEach(function(s) {\n                r = Math.max(r, s.getSize());\n            });\n            return r;\n        };\n    };\n    function n(q) {\n        return function(r) {\n            return new o(q, r);\n        };\n    };\n    function o(q, r) {\n        this.getSide = i.thatReturns(q);\n        this.getSize = function() {\n            return ((typeof r === \"function\") ? r() : r);\n        };\n        l[q].push(this);\n    };\n    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"top\"),\n        getRight: m(\"right\"),\n        getBottom: m(\"bottom\"),\n        getLeft: m(\"left\"),\n        getElementPosition: function(q) {\n            var r = h.getElementPosition(q);\n            r.y -= p.getTop();\n            return r;\n        },\n        addTop: n(\"top\"),\n        addRight: n(\"right\"),\n        addBottom: n(\"bottom\"),\n        addLeft: n(\"left\")\n    };\n    p.addTop(function() {\n        var q = j(\"blueBar\");\n        if ((q && g.isFixed(q))) {\n            return j(\"blueBarHolder\").offsetHeight\n        };\n        return 0;\n    });\n    e.exports = p;\n});\n__d(\"isAsyncScrollQuery\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = null;\n    function i() {\n        if ((h === null)) {\n            h = (((g.osx() >= 10.8) && (g.webkit() >= 536.25)) && !g.chrome());\n        };\n        return h;\n    };\n    e.exports = i;\n});\n__d(\"ScrollAwareDOM\", [\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMDimensions\",\"DOMPosition\",\"DOMQuery\",\"HTML\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"DOMPosition\"), l = b(\"DOMQuery\"), m = b(\"HTML\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"isAsyncScrollQuery\");\n    function r(w, x) {\n        return function() {\n            v.monitor(arguments[w], x.curry.apply(x, arguments));\n        };\n    };\n    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\n        };\n        for (var x = 0; (x < w.length); x++) {\n            var y = m.replaceJSONWrapper(w[x]);\n            if ((y instanceof m)) {\n                return y.getRootNode();\n            }\n             else if (i.isNode(y)) {\n                return y\n            }\n        ;\n        };\n        return null;\n    };\n    function t(w) {\n        return (k.getElementPosition(w).y > o.getTop());\n    };\n    function u(w) {\n        var x = (k.getElementPosition(w).y + j.getElementDimensions(w).height), y = (j.getViewportDimensions().height - o.getBottom());\n        return (x >= y);\n    };\n    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x()\n            };\n            var y = s(w);\n            if (y) {\n                var z = !!y.offsetParent;\n                if ((z && ((t(y) || u(y))))) {\n                    return x()\n                };\n                var aa = n.getDocumentDimensions(), ba = x();\n                if ((z || ((y.offsetParent && !t(y))))) {\n                    var ca = n.getDocumentDimensions().sub(aa), da = {\n                        delta: ca,\n                        target: y\n                    };\n                    if ((v.inform(\"scroll\", da) !== false)) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\n                    };\n                }\n            ;\n                return ba;\n            }\n             else return x()\n        ;\n        },\n        replace: function(w, x) {\n            var y = s(x);\n            if ((!y || h.hasClass(y, \"hidden_elem\"))) {\n                y = w;\n            };\n            return v.monitor(y, function() {\n                i.replace(w, x);\n            });\n        },\n        prependContent: r(1, i.prependContent),\n        insertAfter: r(1, i.insertAfter),\n        insertBefore: r(1, i.insertBefore),\n        setContent: r(0, i.setContent),\n        appendContent: r(1, i.appendContent),\n        remove: r(0, i.remove),\n        empty: r(0, i.empty)\n    }, g);\n    e.exports = v;\n});\n__d(\"legacy:ScrollAwareDOM\", [\"ScrollAwareDOM\",], function(a, b, c, d) {\n    a.ScrollAwareDOM = b(\"ScrollAwareDOM\");\n}, 3);\n__d(\"legacy:css\", [\"CSS\",], function(a, b, c, d) {\n    a.CSS = b(\"CSS\");\n}, 3);\n__d(\"FBDesktopDetect\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = \"facebook.desktopplugin\", i = {\n        mimeType: \"application/x-facebook-desktop-1\",\n        isPluginInstalled: function() {\n            if (g.osx()) {\n                return false\n            };\n            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true\n                    };\n                } catch (k) {\n                \n                };\n            }\n             else if ((a.navigator && a.navigator.plugins)) {\n                a.navigator.plugins.refresh(false);\n                for (var l = 0, m = a.navigator.plugins.length; (l < m); l++) {\n                    j = a.navigator.plugins[l];\n                    if ((j.length && (j[0].type === this.mimeType))) {\n                        return true\n                    };\n                };\n            }\n            \n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"FlipDirectionOnKeypress\", [\"Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(event) {\n        var l = event.getTarget(), m = (h.isNodeOfType(l, \"input\") && ((l.type == \"text\"))), n = h.isNodeOfType(l, \"textarea\");\n        if ((!((m || n)) || l.getAttribute(\"data-prevent-auto-flip\"))) {\n            return\n        };\n        var o = i.getValue(l), p = ((l.style && l.style.direction));\n        if (!p) {\n            var q = 0, r = true;\n            for (var s = 0; (s < o.length); s++) {\n                var t = o.charCodeAt(s);\n                if ((t >= 48)) {\n                    if (r) {\n                        r = false;\n                        q++;\n                    }\n                ;\n                    if (((t >= 1470) && (t <= 1920))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                    if ((q == 5)) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                }\n                 else r = true;\n            ;\n            };\n        }\n         else if ((o.length === 0)) {\n            j.set(l, \"direction\", \"\");\n        }\n    ;\n    };\n    g.listen(document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Input\");\n    g.listen(document.documentElement, \"submit\", function(i) {\n        var j = i.getTarget().getElementsByTagName(\"*\");\n        for (var k = 0; (k < j.length); k++) {\n            if ((j[k].getAttribute(\"placeholder\") && h.isEmpty(j[k]))) {\n                h.setValue(j[k], \"\");\n            };\n        };\n    });\n});\n__d(\"EagleEye\", [\"Arbiter\",\"Env\",\"OnloadEvent\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"OnloadEvent\"), j = b(\"isInIframe\"), k = (h.eagleEyeConfig || {\n    }), l = \"_e_\", m = ((window.name || \"\")).toString();\n    if (((m.length == 7) && (m.substr(0, 3) == l))) {\n        m = m.substr(3);\n    }\n     else {\n        m = k.seed;\n        if (!j()) {\n            window.name = (l + m);\n        };\n    }\n;\n    var n = ((((window.location.protocol == \"https:\") && document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\"), o = ((l + m) + \"_\"), p = new Date((Date.now() + 604800000)).toGMTString(), q = window.location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((\"; expires=\" + p) + \";path=/; domain=\") + q) + n), s = 0, t, u = (k.sessionStorage && a.sessionStorage), v = document.cookie.length, w = false, x = Date.now();\n    function y(ca) {\n        return ((((o + (s++)) + \"=\") + encodeURIComponent(ca)) + r);\n    };\n    function z() {\n        var ca = [], da = false, ea = 0, fa = 0;\n        this.isEmpty = function() {\n            return !ca.length;\n        };\n        this.enqueue = function(ga, ha) {\n            if (ha) {\n                ca.unshift(ga);\n            }\n             else ca.push(ga);\n        ;\n        };\n        this.dequeue = function() {\n            ca.shift();\n        };\n        this.peek = function() {\n            return ca[0];\n        };\n        this.clear = function(ga) {\n            v = Math.min(v, document.cookie.length);\n            if ((!w && (((new Date() - x) > 60000)))) {\n                w = true;\n            };\n            var ha = (!ga && ((document.cookie.search(l) >= 0))), ia = !!h.cookie_header_limit, ja = (h.cookie_count_limit || 19), ka = (h.cookie_header_limit || 3950), la = (ja - 5), ma = (ka - 1000);\n            while (!this.isEmpty()) {\n                var na = y(this.peek());\n                if ((ia && (((na.length > ka) || ((w && ((na.length + v) > ka))))))) {\n                    this.dequeue();\n                    continue;\n                }\n            ;\n                if ((((ha || ia)) && (((((document.cookie.length + na.length) > ka)) || ((document.cookie.split(\";\").length > ja)))))) {\n                    break;\n                };\n                document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n            var oa = Date.now();\n            if ((ga || ((((!da && ha) && ((((fa > 0)) && (((Math.min((10 * Math.pow(2, (fa - 1))), 60000) + ea) < oa))))) && g.query(i.ONLOAD)) && (((!this.isEmpty() || ((document.cookie.length > ma))) || ((document.cookie.split(\";\").length > la))))))) {\n                var pa = new Image(), qa = this, ra = (h.tracking_domain || \"\");\n                da = true;\n                pa.onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.onerror = pa.onabort = function ua() {\n                    da = false;\n                    ea = Date.now();\n                    fa++;\n                };\n                var sa = (h.fb_isb ? (\"&fb_isb=\" + h.fb_isb) : \"\"), ta = (\"&__user=\" + h.user);\n                pa.src = (((((((ra + \"/ajax/nectar.php?asyncSignal=\") + ((Math.floor((Math.random() * 10000)) + 1))) + sa) + ta) + \"&\") + ((!ga ? \"\" : \"s=\"))) + oa);\n            }\n        ;\n        };\n    };\n    t = new z();\n    if (u) {\n        var aa = function() {\n            var ca = 0, da = ca;\n            function ea() {\n                var ha = sessionStorage.getItem(\"_e_ids\");\n                if (ha) {\n                    var ia = ((ha + \"\")).split(\";\");\n                    if ((ia.length == 2)) {\n                        ca = parseInt(ia[0], 10);\n                        da = parseInt(ia[1], 10);\n                    }\n                ;\n                }\n            ;\n            };\n            function fa() {\n                var ha = ((ca + \";\") + da);\n                sessionStorage.setItem(\"_e_ids\", ha);\n            };\n            function ga(ha) {\n                return (\"_e_\" + ((((ha !== undefined)) ? ha : ca++)));\n            };\n            this.isEmpty = function() {\n                return (da === ca);\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = (ia ? ga(--da) : ga());\n                sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = sessionStorage.getItem(ga(da));\n                return (ha ? ((ha + \"\")) : ha);\n            };\n            this.clear = t.clear;\n            ea();\n        };\n        t = new aa();\n    }\n;\n    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return\n            };\n            var fa = [m,Date.now(),ca,].concat(da);\n            fa.push(fa.length);\n            function ga() {\n                var ha = JSON.stringify(fa);\n                try {\n                    t.enqueue(ha, !!ea);\n                    t.clear(!!ea);\n                } catch (ia) {\n                    if ((u && ((ia.code === 1000)))) {\n                        t = new z();\n                        u = false;\n                        ga();\n                    }\n                ;\n                };\n            };\n            ga();\n        },\n        getSessionID: function() {\n            return m;\n        }\n    };\n    e.exports = ba;\n    a.EagleEye = ba;\n}, 3);\n__d(\"ScriptPathState\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h, i, j, k, l = 100, m = {\n        setIsUIPageletRequest: function(n) {\n            j = n;\n        },\n        setUserURISampleRate: function(n) {\n            k = n;\n        },\n        reset: function() {\n            h = null;\n            i = false;\n            j = false;\n        },\n        _shouldUpdateScriptPath: function() {\n            return ((i && !j));\n        },\n        _shouldSendURI: function() {\n            return ((Math.random() < k));\n        },\n        getParams: function() {\n            var n = {\n            };\n            if (m._shouldUpdateScriptPath()) {\n                if ((m._shouldSendURI() && (h !== null))) {\n                    n.user_uri = h.substring(0, l);\n                };\n            }\n             else n.no_script_path = 1;\n        ;\n            return n;\n        }\n    };\n    g.subscribe(\"pre_page_transition\", function(n, o) {\n        i = true;\n        h = o.to.getUnqualifiedURI().toString();\n    });\n    e.exports = a.ScriptPathState = m;\n});\n__d(\"goOrReplace\", [\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"UserAgent\");\n    function i(j, k, l) {\n        var m = new g(k), n = a.Quickling;\n        if ((((((j.pathname == \"/\") && (m.getPath() != \"/\")) && n) && n.isActive()) && n.isPageActive(m))) {\n            var o = (j.search ? {\n            } : {\n                q: \"\"\n            });\n            m = new g().setPath(\"/\").setQueryData(o).setFragment(m.getUnqualifiedURI().toString());\n            k = m.toString();\n        }\n    ;\n        if ((l && !((h.ie() < 8)))) {\n            j.replace(k);\n        }\n         else if ((j.href == k)) {\n            j.reload();\n        }\n         else j.href = k;\n        \n    ;\n    };\n    e.exports = i;\n});\n__d(\"AjaxPipeRequest\", [\"Arbiter\",\"AsyncRequest\",\"BigPipe\",\"CSS\",\"DOM\",\"Env\",\"PageletSet\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"goOrReplace\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BigPipe\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"PageletSet\"), n = b(\"ScriptPathState\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"goOrReplace\"), r = b(\"ge\"), s;\n    function t(w, x) {\n        var y = r(w);\n        if (!y) {\n            return\n        };\n        if (!x) {\n            y.style.minHeight = \"600px\";\n        };\n        var z = m.getPageletIDs();\n        for (var aa = 0; (aa < z.length); aa++) {\n            var ba = z[aa];\n            if (k.contains(y, ba)) {\n                m.removePagelet(ba);\n            };\n        };\n        k.empty(y);\n        g.inform(\"pagelet/destroy\", {\n            id: null,\n            root: y\n        });\n    };\n    function u(w, x) {\n        var y = r(w);\n        if ((y && !x)) {\n            y.style.minHeight = \"100px\";\n        };\n    };\n    function v(w, x) {\n        this._uri = w;\n        this._query_data = x;\n        this._request = new h();\n        this._canvas_id = null;\n        this._allow_cross_page_transition = true;\n    };\n    p(v.prototype, {\n        setCanvasId: function(w) {\n            this._canvas_id = w;\n            return this;\n        },\n        setURI: function(w) {\n            this._uri = w;\n            return this;\n        },\n        setData: function(w) {\n            this._query_data = w;\n            return this;\n        },\n        getData: function(w) {\n            return this._query_data;\n        },\n        setAllowCrossPageTransition: function(w) {\n            this._allow_cross_page_transition = w;\n            return this;\n        },\n        setAppend: function(w) {\n            this._append = w;\n            return this;\n        },\n        send: function() {\n            var w = {\n                ajaxpipe: 1,\n                ajaxpipe_token: l.ajaxpipe_token\n            };\n            p(w, n.getParams());\n            n.reset();\n            this._request.setOption(\"useIframeTransport\", true).setURI(this._uri).setData(p(w, this._query_data)).setPreBootloadHandler(this._preBootloadHandler.bind(this)).setInitialHandler(this._onInitialResponse.bind(this)).setHandler(this._onResponse.bind(this)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._allow_cross_page_transition);\n            if (this._automatic) {\n                this._relevantRequest = s;\n            }\n             else s = this._request;\n        ;\n            this._request.send();\n            return this;\n        },\n        _preBootloadFirstResponse: function(w) {\n            return false;\n        },\n        _fireDomContentCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/domcontent_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _fireOnloadCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/onload_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _isRelevant: function(w) {\n            return (((this._request == s) || ((this._automatic && (this._relevantRequest == s)))) || this._jsNonBlock);\n        },\n        _preBootloadHandler: function(w) {\n            var x = w.getPayload();\n            if (((!x || x.redirect) || !this._isRelevant(w))) {\n                return false\n            };\n            var y = false;\n            if (w.is_first) {\n                ((!this._append && !this._displayCallback) && t(this._canvas_id, this._constHeight));\n                this._arbiter = new g();\n                y = this._preBootloadFirstResponse(w);\n                this.pipe = new i({\n                    arbiter: this._arbiter,\n                    rootNodeID: this._canvas_id,\n                    lid: this._request.lid,\n                    isAjax: true,\n                    domContentCallback: this._fireDomContentCallback.bind(this),\n                    onloadCallback: this._fireOnloadCallback.bind(this),\n                    domContentEvt: \"ajaxpipe/domcontent_callback\",\n                    onloadEvt: \"ajaxpipe/onload_callback\",\n                    jsNonBlock: this._jsNonBlock,\n                    automatic: this._automatic,\n                    displayCallback: this._displayCallback\n                });\n            }\n        ;\n            return y;\n        },\n        _redirect: function(w) {\n            if (w.redirect) {\n                if ((w.force || !this.isPageActive(w.redirect))) {\n                    var x = [\"ajaxpipe\",\"ajaxpipe_token\",].concat(this.getSanitizedParameters());\n                    q(window.location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\n                }\n            ;\n                return true;\n            }\n             else return false\n        ;\n        },\n        isPageActive: function(w) {\n            return true;\n        },\n        getSanitizedParameters: function() {\n            return [];\n        },\n        _versionCheck: function(w) {\n            return true;\n        },\n        _onInitialResponse: function(w) {\n            var x = w.getPayload();\n            if (!this._isRelevant(w)) {\n                return false\n            };\n            if (!x) {\n                return true\n            };\n            if ((this._redirect(x) || !this._versionCheck(x))) {\n                return false\n            };\n            return true;\n        },\n        _processFirstResponse: function(w) {\n            var x = w.getPayload();\n            if ((r(this._canvas_id) && (x.canvas_class != null))) {\n                j.setClass(this._canvas_id, x.canvas_class);\n            };\n        },\n        setFirstResponseCallback: function(w) {\n            this._firstResponseCallback = w;\n            return this;\n        },\n        setFirstResponseHandler: function(w) {\n            this._processFirstResponse = w;\n            return this;\n        },\n        _onResponse: function(w) {\n            var x = w.payload;\n            if (!this._isRelevant(w)) {\n                return h.suppressOnloadToken\n            };\n            if (w.is_first) {\n                this._processFirstResponse(w);\n                (this._firstResponseCallback && this._firstResponseCallback());\n                x.provides = (x.provides || []);\n                x.provides.push(\"uipage_onload\");\n                if (this._append) {\n                    x.append = this._canvas_id;\n                };\n            }\n        ;\n            if (x) {\n                if ((((\"content\" in x.content) && (this._canvas_id !== null)) && (this._canvas_id != \"content\"))) {\n                    x.content[this._canvas_id] = x.content.content;\n                    delete x.content.content;\n                }\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\n            };\n            return h.suppressOnloadToken;\n        },\n        setNectarModuleDataSafe: function(w) {\n            this._request.setNectarModuleDataSafe(w);\n            return this;\n        },\n        setFinallyHandler: function(w) {\n            this._request.setFinallyHandler(w);\n            return this;\n        },\n        setErrorHandler: function(w) {\n            this._request.setErrorHandler(w);\n            return this;\n        },\n        abort: function() {\n            this._request.abort();\n            if ((s == this._request)) {\n                s = null;\n            };\n            this._request = null;\n            return this;\n        },\n        setJSNonBlock: function(w) {\n            this._jsNonBlock = w;\n            return this;\n        },\n        setAutomatic: function(w) {\n            this._automatic = w;\n            return this;\n        },\n        setDisplayCallback: function(w) {\n            this._displayCallback = w;\n            return this;\n        },\n        setConstHeight: function(w) {\n            this._constHeight = w;\n            return this;\n        },\n        getAsyncRequest: function() {\n            return this._request;\n        }\n    });\n    p(v, {\n        getCurrentRequest: function() {\n            return s;\n        },\n        setCurrentRequest: function(w) {\n            s = w;\n        }\n    });\n    e.exports = v;\n});\n__d(\"AsyncRequestNectarLogging\", [\"AsyncRequest\",\"Nectar\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Nectar\"), i = b(\"copyProperties\");\n    i(g.prototype, {\n        setNectarModuleData: function(j) {\n            if ((this.method == \"POST\")) {\n                h.addModuleData(this.data, j);\n            };\n        },\n        setNectarImpressionId: function() {\n            if ((this.method == \"POST\")) {\n                h.addImpressionID(this.data);\n            };\n        }\n    });\n});\n__d(\"CSSClassTransition\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = [];\n    function i() {\n    \n    };\n    g(i, {\n        go: function(j, k, l, m) {\n            var n;\n            for (var o = 0; (o < h.length); o++) {\n                if ((h[o](j, k, l, m) === true)) {\n                    n = true;\n                };\n            };\n            if (!n) {\n                j.className = k;\n            };\n        },\n        registerHandler: function(j) {\n            h.push(j);\n            return {\n                remove: function() {\n                    var k = h.indexOf(j);\n                    if ((k >= 0)) {\n                        h.splice(k, 1);\n                    };\n                }\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"DOMClone\", [], function(a, b, c, d, e, f) {\n    var g = {\n        shallowClone: function(i) {\n            return h(i, false);\n        },\n        deepClone: function(i) {\n            return h(i, true);\n        }\n    };\n    function h(i, j) {\n        var k = i.cloneNode(j);\n        if ((typeof k.__FB_TOKEN !== \"undefined\")) {\n            delete k.__FB_TOKEN;\n        };\n        return k;\n    };\n    e.exports = g;\n});\n__d(\"DOMScroll\", [\"Animation\",\"Arbiter\",\"DOM\",\"DOMQuery\",\"Vector\",\"ViewportBounds\",\"ge\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Vector\"), l = b(\"ViewportBounds\"), m = b(\"ge\"), n = b(\"isAsyncScrollQuery\"), o = {\n        SCROLL: \"dom-scroll\",\n        getScrollState: function() {\n            var p = k.getViewportDimensions(), q = k.getDocumentDimensions(), r = ((q.x > p.x)), s = ((q.y > p.y));\n            r += 0;\n            s += 0;\n            return new k(r, s);\n        },\n        _scrollbarSize: null,\n        _initScrollbarSize: function() {\n            var p = i.create(\"p\");\n            p.style.width = \"100%\";\n            p.style.height = \"200px\";\n            var q = i.create(\"div\");\n            q.style.position = \"absolute\";\n            q.style.top = \"0px\";\n            q.style.left = \"0px\";\n            q.style.visibility = \"hidden\";\n            q.style.width = \"200px\";\n            q.style.height = \"150px\";\n            q.style.overflow = \"hidden\";\n            q.appendChild(p);\n            document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"scroll\";\n            var s = p.offsetWidth;\n            if ((r == s)) {\n                s = q.clientWidth;\n            };\n            document.body.removeChild(q);\n            o._scrollbarSize = (r - s);\n        },\n        getScrollbarSize: function() {\n            if ((o._scrollbarSize === null)) {\n                o._initScrollbarSize();\n            };\n            return o._scrollbarSize;\n        },\n        scrollTo: function(p, q, r, s, t) {\n            if (((typeof q == \"undefined\") || (q === true))) {\n                q = 750;\n            };\n            if (n()) {\n                q = false;\n            };\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"document\");\n                if (!s) {\n                    p.y -= (l.getTop() / ((r ? 2 : 1)));\n                };\n            }\n        ;\n            if (r) {\n                p.y -= (k.getViewportDimensions().y / 2);\n            }\n             else if (s) {\n                p.y -= k.getViewportDimensions().y;\n                p.y += s;\n            }\n            \n        ;\n            p = p.convertTo(\"document\");\n            if (q) {\n                return new g(document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.scrollTo) {\n                window.scrollTo(p.x, p.y);\n                (t && t());\n            }\n            \n        ;\n            h.inform(o.SCROLL);\n        },\n        ensureVisible: function(p, q, r, s, t) {\n            if ((r === undefined)) {\n                r = 10;\n            };\n            p = m(p);\n            if (q) {\n                p = j.find(p, q);\n            };\n            var u = k.getScrollPosition().x, v = k.getScrollPosition().y, w = (v + k.getViewportDimensions().y), x = k.getElementPosition(p).y, y = (x + k.getElementDimensions(p).y);\n            x -= l.getTop();\n            x -= r;\n            y += r;\n            if ((x < v)) {\n                o.scrollTo(new k(u, x, \"document\"), s, false, false, t);\n            }\n             else if ((y > w)) {\n                if (((x - ((y - w))) < v)) {\n                    o.scrollTo(new k(u, x, \"document\"), s, false, false, t);\n                }\n                 else o.scrollTo(new k(u, y, \"document\"), s, false, true, t);\n            \n            }\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.scrollTo(new k(q.x, 0, \"document\"), (p !== false));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"Parent\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = \"uiButtonDisabled\", o = \"uiButtonDepressed\", p = \"-cx-PUBLIC-abstractButton__disabled\", q = \"-cx-PUBLIC-abstractButton__depressed\", r = \"button:blocker\", s = \"href\", t = \"ajaxify\";\n    function u(aa, ba) {\n        var ca = h.get(aa, r);\n        if (ba) {\n            if (ca) {\n                ca.remove();\n                h.remove(aa, r);\n            }\n        ;\n        }\n         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\n        }\n    ;\n    };\n    function v(aa) {\n        var ba = (k.byClass(aa, \"uiButton\") || k.byClass(aa, \"-cx-PRIVATE-abstractButton__root\"));\n        if (!ba) {\n            throw new Error(\"invalid use case\")\n        };\n        return ba;\n    };\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n    function y(aa) {\n        return g.hasClass(aa, \"-cx-PRIVATE-abstractButton__root\");\n    };\n    var z = {\n        getInputElement: function(aa) {\n            aa = v(aa);\n            if (w(aa)) {\n                throw new Error(\"invalid use case\")\n            };\n            return (x(aa) ? aa : i.find(aa, \"input\"));\n        },\n        isEnabled: function(aa) {\n            return !((g.hasClass(v(aa), n) || g.hasClass(v(aa), p)));\n        },\n        setEnabled: function(aa, ba) {\n            aa = v(aa);\n            var ca = (y(aa) ? p : n);\n            g.conditionClass(aa, ca, !ba);\n            if (w(aa)) {\n                var da = aa.getAttribute(\"href\"), ea = aa.getAttribute(\"ajaxify\"), fa = h.get(aa, s, \"#\"), ga = h.get(aa, t);\n                if (ba) {\n                    if (!da) {\n                        aa.setAttribute(\"href\", fa);\n                    };\n                    if ((!ea && ga)) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    };\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if ((da && (da !== fa))) {\n                        h.set(aa, s, da);\n                    };\n                    if ((ea && (ea !== ga))) {\n                        h.set(aa, t, ea);\n                    };\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\n                }\n            ;\n                u(aa, ba);\n            }\n             else {\n                var ha = z.getInputElement(aa);\n                ha.disabled = !ba;\n                u(ha, ba);\n            }\n        ;\n        },\n        setDepressed: function(aa, ba) {\n            aa = v(aa);\n            var ca = (y(aa) ? q : o);\n            g.conditionClass(aa, ca, ba);\n        },\n        isDepressed: function(aa) {\n            aa = v(aa);\n            var ba = (y(aa) ? q : o);\n            return g.hasClass(aa, ba);\n        },\n        setLabel: function(aa, ba) {\n            aa = v(aa);\n            if (y(aa)) {\n                var ca = [];\n                if (ba) {\n                    ca.push(ba);\n                };\n                var da = i.scry(aa, \".img\")[0];\n                if (da) {\n                    if ((aa.firstChild == da)) {\n                        ca.unshift(da);\n                    }\n                     else ca.push(da);\n                \n                };\n                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\n            \n        ;\n            var fa = (y(aa) ? \"-cx-PUBLIC-abstractButton__notext\" : \"uiButtonNoText\");\n            g.conditionClass(aa, fa, !ba);\n        },\n        setIcon: function(aa, ba) {\n            if ((ba && !i.isNode(ba))) {\n                return\n            };\n            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                (ca && i.remove(ca));\n                return;\n            }\n        ;\n            g.addClass(ba, \"customimg\");\n            if ((ca != ba)) {\n                if (ca) {\n                    i.replace(ca, ba);\n                }\n                 else i.prependContent(aa, ba);\n            \n            };\n        }\n    };\n    e.exports = z;\n});\n__d(\"Locale\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h, i = {\n        isRTL: function() {\n            if ((h === undefined)) {\n                h = ((\"rtl\" === g.get(document.body, \"direction\")));\n            };\n            return h;\n        }\n    };\n    e.exports = i;\n});\n__d(\"getOverlayZIndex\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\");\n    function h(i, j) {\n        j = (j || document.body);\n        var k = [];\n        while ((i && (i !== j))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n        if ((i !== j)) {\n            return 0\n        };\n        for (var l = (k.length - 1); (l >= 0); l--) {\n            var m = k[l];\n            if ((g.get(m, \"position\") != \"static\")) {\n                var n = parseInt(g.get(m, \"z-index\"), 10);\n                if (!isNaN(n)) {\n                    return n\n                };\n            }\n        ;\n        };\n        return 0;\n    };\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"CSS\",\"DOM\",\"Event\",\"Focus\",\"Form\",\"HTML\",\"Keys\",\"Locale\",\"Parent\",\"Run\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"bind\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"getObjectValues\",\"getOverlayZIndex\",\"removeFromArray\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Button\"), l = b(\"ContextualThing\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Event\"), p = b(\"Focus\"), q = b(\"Form\"), r = b(\"HTML\"), s = b(\"Keys\"), t = b(\"Locale\"), u = b(\"Parent\"), v = b(\"Run\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"UserAgent\"), z = b(\"Vector\"), aa = b(\"bind\"), ba = b(\"copyProperties\"), ca = b(\"createArrayFrom\"), da = b(\"emptyFunction\"), ea = b(\"getObjectValues\"), fa = b(\"getOverlayZIndex\"), ga = b(\"removeFromArray\"), ha = b(\"shield\"), ia = b(\"tx\"), ja = function() {\n        var la = document.body, ma = document.createElement(\"div\"), na = document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.top = \"20px\";\n        var oa = (ma.offsetTop !== na.offsetTop);\n        la.removeChild(ma);\n        la.removeChild(na);\n        ja = da.thatReturns(oa);\n        return oa;\n    };\n    function ka(la) {\n        this._show_loading = true;\n        this._auto_focus = true;\n        this._submit_on_enter = false;\n        this._fade_enabled = true;\n        this._onload_handlers = [];\n        this._top = 125;\n        this._uniqueID = (\"dialog_\" + ka._globalCount++);\n        this._content = null;\n        this._obj = null;\n        this._popup = null;\n        this._overlay = null;\n        this._shim = null;\n        this._causal_elem = null;\n        this._previous_focus = null;\n        this._buttons = [];\n        this._buildDialog();\n        if (la) {\n            this._setFromModel(la);\n        };\n        ka._init();\n    };\n    ba(ka, {\n        OK: {\n            name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            name: \"confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            name: \"delete\",\n            label: \"Delete\"\n        },\n        _globalCount: 0,\n        _bottoms: [0,],\n        max_bottom: 0,\n        _updateMaxBottom: function() {\n            ka.max_bottom = Math.max.apply(Math, ka._bottoms);\n        }\n    });\n    ba(ka, {\n        OK_AND_CANCEL: [ka.OK,ka.CANCEL,],\n        _STANDARD_BUTTONS: [ka.OK,ka.CANCEL,ka.CLOSE,ka.SAVE,ka.SUBMIT,ka.CONFIRM,ka.DELETE,],\n        SIZE: {\n            WIDE: 555,\n            STANDARD: 445\n        },\n        _HALO_WIDTH: 10,\n        _BORDER_WIDTH: 1,\n        _PADDING_WIDTH: 10,\n        _PAGE_MARGIN: 40,\n        _stack: [],\n        _isUsingCSSBorders: function() {\n            return (y.ie() < 7);\n        },\n        newButton: function(la, ma, na, oa) {\n            var pa = {\n                name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            };\n            if (oa) {\n                pa.handler = oa;\n            };\n            return pa;\n        },\n        getCurrent: function() {\n            var la = ka._stack;\n            return (la.length ? la[(la.length - 1)] : null);\n        },\n        hideCurrent: function() {\n            var la = ka.getCurrent();\n            (la && la.hide());\n        },\n        bootstrap: function(la, ma, na, oa, pa, qa) {\n            ma = (ma || {\n            });\n            ba(ma, new x(la).getQueryData());\n            oa = (oa || ((na ? \"GET\" : \"POST\")));\n            var ra = (u.byClass(qa, \"stat_elem\") || qa);\n            if ((ra && m.hasClass(ra, \"async_saving\"))) {\n                return false\n            };\n            var sa = new i().setReadOnly(!!na).setMethod(oa).setRelativeTo(qa).setStatusElement(ra).setURI(la).setNectarModuleDataSafe(qa).setData(ma), ta = new ka(pa).setCausalElement(qa).setAsync(sa);\n            ta.show();\n            return false;\n        },\n        showFromModel: function(la, ma) {\n            var na = new ka(la).setCausalElement(ma).show();\n            if (la.hiding) {\n                na.hide();\n            };\n        },\n        _init: function() {\n            this._init = da;\n            v.onLeave(ha(ka._tearDown, null, false));\n            h.subscribe(\"page_transition\", ha(ka._tearDown, null, true));\n            o.listen(document.documentElement, \"keydown\", function(event) {\n                if (((o.getKeyCode(event) == s.ESC) && !event.getModifiers().any)) {\n                    if (ka._escape()) {\n                        event.kill();\n                    };\n                }\n                 else if (((o.getKeyCode(event) == s.RETURN) && !event.getModifiers().any)) {\n                    if (ka._enter()) {\n                        event.kill();\n                    }\n                }\n            ;\n            });\n            o.listen(window, \"resize\", function(event) {\n                var la = ka.getCurrent();\n                (la && la._resetDialogObj());\n            });\n        },\n        _findButton: function(la, ma) {\n            if (la) {\n                for (var na = 0; (na < la.length); ++na) {\n                    if ((la[na].name == ma)) {\n                        return la[na]\n                    };\n                }\n            };\n            return null;\n        },\n        _tearDown: function(la) {\n            var ma = ka._stack.slice();\n            for (var na = (ma.length - 1); (na >= 0); na--) {\n                if ((((la && !ma[na]._cross_transition)) || ((!la && !ma[na]._cross_quickling)))) {\n                    ma[na].hide();\n                };\n            };\n        },\n        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false\n            };\n            var ma = la._semi_modal, na = la._buttons;\n            if ((!na.length && !ma)) {\n                return false\n            };\n            if ((ma && !na.length)) {\n                la.hide();\n                return true;\n            }\n        ;\n            var oa, pa = ka._findButton(na, \"cancel\");\n            if (la._cancelHandler) {\n                la.cancel();\n                return true;\n            }\n             else if (pa) {\n                oa = pa;\n            }\n             else if ((na.length == 1)) {\n                oa = na[0];\n            }\n             else return false\n            \n            \n        ;\n            la._handleButton(oa);\n            return true;\n        },\n        _enter: function() {\n            var la = ka.getCurrent();\n            if ((!la || !la._submit_on_enter)) {\n                return false\n            };\n            if ((document.activeElement != la._frame)) {\n                return false\n            };\n            var ma = la._buttons;\n            if (!ma) {\n                return false\n            };\n            la._handleButton(ma[0]);\n            return true;\n        },\n        call_or_eval: function(la, ma, na) {\n            if (!ma) {\n                return undefined\n            };\n            na = (na || {\n            });\n            if ((typeof ma == \"string\")) {\n                var oa = Object.keys(na).join(\", \");\n                ma = (eval)(((((\"({f: function(\" + oa) + \") { \") + ma) + \"}})\")).f;\n            }\n        ;\n            return ma.apply(la, ea(na));\n        }\n    });\n    ba(ka.prototype, {\n        _cross_quickling: false,\n        _cross_transition: false,\n        _loading: false,\n        _showing: false,\n        show: function() {\n            this._showing = true;\n            if (this._async_request) {\n                if (this._show_loading) {\n                    this.showLoading();\n                };\n            }\n             else this._update();\n        ;\n            return this;\n        },\n        showLoading: function() {\n            this._loading = true;\n            m.addClass(this._frame, \"dialog_loading_shown\");\n            this._renderDialog();\n            return this;\n        },\n        hide: function() {\n            if ((!this._showing && !this._loading)) {\n                return this\n            };\n            this._showing = false;\n            if (this._autohide_timeout) {\n                clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n            if ((this._fade_enabled && (ka._stack.length <= 1))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n            return this;\n        },\n        cancel: function() {\n            if ((!this._cancelHandler || (this._cancelHandler() !== false))) {\n                this.hide();\n            };\n        },\n        getRoot: function() {\n            return this._obj;\n        },\n        getBody: function() {\n            return n.scry(this._obj, \"div.dialog_body\")[0];\n        },\n        getButtonElement: function(la) {\n            if ((typeof la == \"string\")) {\n                la = ka._findButton(this._buttons, la);\n            };\n            if ((!la || !la.name)) {\n                return null\n            };\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return (oa.name == la.name);\n            };\n            return (ma.filter(na)[0] || null);\n        },\n        getContentNode: function() {\n            return n.find(this._content, \"div.dialog_content\");\n        },\n        getFormData: function() {\n            return q.serialize(this.getContentNode());\n        },\n        setAllowCrossPageTransition: function(la) {\n            this._cross_transition = la;\n            return this;\n        },\n        setAllowCrossQuicklingNavigation: function(la) {\n            this._cross_quickling = la;\n            return this;\n        },\n        setShowing: function() {\n            this.show();\n            return this;\n        },\n        setHiding: function() {\n            this.hide();\n            return this;\n        },\n        setTitle: function(la) {\n            var ma = this._nodes.title, na = this._nodes.title_inner, oa = this._nodes.content;\n            n.setContent(na, this._format((la || \"\")));\n            m.conditionShow(ma, !!la);\n            m.conditionClass(oa, \"dialog_content_titleless\", !la);\n            return this;\n        },\n        setBody: function(la) {\n            n.setContent(this._nodes.body, this._format(la));\n            return this;\n        },\n        setExtraData: function(la) {\n            this._extra_data = la;\n            return this;\n        },\n        setReturnData: function(la) {\n            this._return_data = la;\n            return this;\n        },\n        setShowLoading: function(la) {\n            this._show_loading = la;\n            return this;\n        },\n        setCustomLoading: function(la) {\n            var ma = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, la);\n            n.setContent(this._frame, [this._nodes.title,this._nodes.content,ma,]);\n            return this;\n        },\n        setFullBleed: function(la) {\n            this._full_bleed = la;\n            this._updateWidth();\n            m.conditionClass(this._obj, \"full_bleed\", la);\n            return this;\n        },\n        setCausalElement: function(la) {\n            this._causal_elem = la;\n            return this;\n        },\n        setUserData: function(la) {\n            this._user_data = la;\n            return this;\n        },\n        getUserData: function() {\n            return this._user_data;\n        },\n        setAutohide: function(la) {\n            if (la) {\n                if (this._showing) {\n                    this._autohide_timeout = setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\n                }\n            ;\n            }\n        ;\n            return this;\n        },\n        setSummary: function(la) {\n            var ma = this._nodes.summary;\n            n.setContent(ma, this._format((la || \"\")));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setButtons: function(la) {\n            var ma, na;\n            if (!((la instanceof Array))) {\n                ma = ca(arguments);\n            }\n             else ma = la;\n        ;\n            for (var oa = 0; (oa < ma.length); ++oa) {\n                if ((typeof ma[oa] == \"string\")) {\n                    na = ka._findButton(ka._STANDARD_BUTTONS, ma[oa]);\n                    ma[oa] = na;\n                }\n            ;\n            };\n            this._buttons = ma;\n            var pa = [];\n            if ((ma && (ma.length > 0))) {\n                for (var qa = 0; (qa < ma.length); qa++) {\n                    na = ma[qa];\n                    var ra = n.create(\"input\", {\n                        type: \"button\",\n                        name: (na.name || \"\"),\n                        value: na.label\n                    }), sa = n.create(\"label\", {\n                        className: \"uiButton uiButtonLarge uiButtonConfirm\"\n                    }, ra);\n                    if (na.className) {\n                        na.className.split(/\\s+/).forEach(function(ua) {\n                            m.addClass(sa, ua);\n                        });\n                        if (m.hasClass(sa, \"inputaux\")) {\n                            m.removeClass(sa, \"inputaux\");\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        };\n                    }\n                ;\n                    if (na.icon) {\n                        n.prependContent(sa, n.create(\"img\", {\n                            src: na.icon,\n                            className: \"img mrs\"\n                        }));\n                    };\n                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    };\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.name));\n                    for (var ta in na) {\n                        if (((ta.indexOf(\"data-\") === 0) && (ta.length > 5))) {\n                            ra.setAttribute(ta, na[ta]);\n                        };\n                    };\n                    pa.push(sa);\n                }\n            };\n            n.setContent(this._nodes.buttons, pa);\n            this._updateButtonVisibility();\n            return this;\n        },\n        setButtonsMessage: function(la) {\n            n.setContent(this._nodes.button_message, this._format((la || \"\")));\n            this._has_button_message = !!la;\n            this._updateButtonVisibility();\n            return this;\n        },\n        _updateButtonVisibility: function() {\n            var la = ((this._buttons.length > 0) || this._has_button_message);\n            m.conditionShow(this._nodes.button_wrapper, la);\n            m.conditionClass(this._obj, \"omitDialogFooter\", !la);\n        },\n        setClickButtonOnEnter: function(la, ma) {\n            this._clickOnEnterTarget = la;\n            if (!this._clickOnEnterListener) {\n                this._clickOnEnterListener = o.listen(this._nodes.body, \"keypress\", function(event) {\n                    var na = event.getTarget();\n                    if ((na && (na.id === this._clickOnEnterTarget))) {\n                        if ((o.getKeyCode(event) == s.RETURN)) {\n                            this._handleButton(ma);\n                            event.kill();\n                        }\n                    \n                    };\n                    return true;\n                }.bind(this));\n            };\n            return this;\n        },\n        setStackable: function(la, ma) {\n            this._is_stackable = la;\n            this._shown_while_stacked = (la && ma);\n            return this;\n        },\n        setHandler: function(la) {\n            this._handler = la;\n            return this;\n        },\n        setCancelHandler: function(la) {\n            this._cancelHandler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        setCloseHandler: function(la) {\n            this._close_handler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        clearHandler: function() {\n            return this.setHandler(null);\n        },\n        setPostURI: function(la, ma) {\n            if ((ma === undefined)) {\n                ma = true;\n            };\n            if (ma) {\n                this.setHandler(this._submitForm.bind(this, \"POST\", la));\n            }\n             else this.setHandler(function() {\n                q.post(la, this.getFormData());\n                this.hide();\n            }.bind(this));\n        ;\n            return this;\n        },\n        setGetURI: function(la) {\n            this.setHandler(this._submitForm.bind(this, \"GET\", la));\n            return this;\n        },\n        setModal: function(la) {\n            this._modal = la;\n            m.conditionClass(this._obj, \"generic_dialog_modal\", la);\n            return this;\n        },\n        setSemiModal: function(la) {\n            if (la) {\n                this.setModal(true);\n                this._semiModalListener = o.listen(this._obj, \"click\", function(ma) {\n                    if (!n.contains(this._popup, ma.getTarget())) {\n                        this.hide();\n                    };\n                }.bind(this));\n            }\n             else (this._semiModalListener && this._semiModalListener.remove());\n        ;\n            this._semi_modal = la;\n            return this;\n        },\n        setWideDialog: function(la) {\n            this._wide_dialog = la;\n            this._updateWidth();\n            return this;\n        },\n        setContentWidth: function(la) {\n            this._content_width = la;\n            this._updateWidth();\n            return this;\n        },\n        setTitleLoading: function(la) {\n            if ((la === undefined)) {\n                la = true;\n            };\n            var ma = n.find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\n            };\n            return this;\n        },\n        setSecure: function(la) {\n            m.conditionClass(this._nodes.title, \"secure\", la);\n            return this;\n        },\n        setClassName: function(la) {\n            la.split(/\\s+/).forEach(m.addClass.bind(m, this._obj));\n            return this;\n        },\n        setFadeEnabled: function(la) {\n            this._fade_enabled = la;\n            return this;\n        },\n        setFooter: function(la) {\n            var ma = this._nodes.footer;\n            n.setContent(ma, this._format((la || \"\")));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setAutoFocus: function(la) {\n            this._auto_focus = la;\n            return this;\n        },\n        setTop: function(la) {\n            this._top = la;\n            this._resetDialogObj();\n            return this;\n        },\n        onloadRegister: function(la) {\n            ca(la).forEach(function(ma) {\n                if ((typeof ma == \"string\")) {\n                    ma = new Function(ma);\n                };\n                this._onload_handlers.push(ma.bind(this));\n            }.bind(this));\n            return this;\n        },\n        setAsyncURL: function(la) {\n            return this.setAsync(new i(la));\n        },\n        setAsync: function(la) {\n            var ma = function(ua) {\n                if ((this._async_request != la)) {\n                    return\n                };\n                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                };\n                if ((typeof wa == \"string\")) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\n            ;\n                this._update();\n            }.bind(this), na = la.getData();\n            na.__d = 1;\n            la.setData(na);\n            var oa = (la.getHandler() || da);\n            la.setHandler(function(ua) {\n                oa(ua);\n                ma(ua);\n            });\n            var pa = la, qa = (pa.getErrorHandler() || da), ra = (pa.getTransportErrorHandler() || da), sa = function() {\n                this._async_request = null;\n                this._loading = false;\n                if ((this._showing && this._shown_while_stacked)) {\n                    this._update();\n                }\n                 else this._hide(this._is_stackable);\n            ;\n            }.bind(this), ta = (pa.getServerDialogCancelHandler() || sa);\n            pa.setAllowCrossPageTransition(this._cross_transition).setErrorHandler(function(ua) {\n                sa();\n                qa(ua);\n            }).setTransportErrorHandler(function(ua) {\n                sa();\n                ra(ua);\n            }).setServerDialogCancelHandler(ta);\n            la.send();\n            this._async_request = la;\n            if (this._showing) {\n                this.show();\n            };\n            return this;\n        },\n        _format: function(la) {\n            if ((typeof la == \"string\")) {\n                la = r(la);\n            }\n             else la = r.replaceJSONWrapper(la);\n        ;\n            if ((la instanceof r)) {\n                la.setDeferred(true);\n            };\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return\n            };\n            if (((this._autohide && !this._async_request) && !this._autohide_timeout)) {\n                this._autohide_timeout = setTimeout(aa(this, \"hide\"), this._autohide);\n            };\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = document.activeElement;\n            p.set(this._frame);\n        },\n        _runOnloads: function() {\n            for (var la = 0; (la < this._onload_handlers.length); ++la) {\n                try {\n                    this._onload_handlers[la]();\n                } catch (ma) {\n                \n                };\n            };\n            this._onload_handlers = [];\n        },\n        _updateWidth: function() {\n            var la = (2 * ka._BORDER_WIDTH);\n            if (ka._isUsingCSSBorders()) {\n                la += (2 * ka._HALO_WIDTH);\n            };\n            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += (2 * ka._PADDING_WIDTH);\n                };\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\n            \n        ;\n            this._popup.style.width = (la + \"px\");\n        },\n        _updateZIndex: function() {\n            if ((!this._hasSetZIndex && this._causal_elem)) {\n                var la = fa(this._causal_elem), ma = this._causal_elem;\n                while ((!la && (ma = l.getContext(ma)))) {\n                    la = fa(ma);;\n                };\n                this._hasSetZIndex = (la > ((this._modal ? 400 : 200)));\n                w.set(this._obj, \"z-index\", (this._hasSetZIndex ? la : \"\"));\n            }\n        ;\n        },\n        _renderDialog: function() {\n            this._updateZIndex();\n            this._pushOntoStack();\n            this._obj.style.height = (((this._modal && (y.ie() < 7))) ? (z.getDocumentDimensions().y + \"px\") : null);\n            if ((this._obj && this._obj.style.display)) {\n                this._obj.style.visibility = \"hidden\";\n                this._obj.style.display = \"\";\n                this.resetDialogPosition();\n                this._obj.style.visibility = \"\";\n                this._obj.dialog = this;\n            }\n             else this.resetDialogPosition();\n        ;\n            clearInterval(this.active_hiding);\n            this.active_hiding = setInterval(this._activeResize.bind(this), 500);\n            this._submit_on_enter = false;\n            if (this._auto_focus) {\n                var la = q.getFirstElement(this._content, [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",]);\n                if (la) {\n                    q.focusFirst.bind(this, this._content).defer();\n                }\n                 else this._submit_on_enter = true;\n            ;\n            }\n        ;\n            var ma = (z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y);\n            ka._bottoms.push(ma);\n            this._bottom = ma;\n            ka._updateMaxBottom();\n            return this;\n        },\n        _buildDialog: function() {\n            this._obj = n.create(\"div\", {\n                className: \"generic_dialog\",\n                id: this._uniqueID\n            });\n            this._obj.style.display = \"none\";\n            n.appendContent(document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\n                });\n            };\n            this._obj.appendChild(this._popup);\n            if (((y.ie() < 7) && !this._shim)) {\n                j.loadModules([\"IframeShim\",], function(xa) {\n                    this._shim = new xa(this._popup);\n                });\n            };\n            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\n            };\n            var la;\n            if (ka._isUsingCSSBorders()) {\n                la = ((\"\\u003Cdiv class=\\\"pop_container_advanced\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_content\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003C/div\\u003E\");\n            }\n             else la = ((((((((\"\\u003Cdiv class=\\\"pop_container\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_verticalslab\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_horizontalslab\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_topleft\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_topright\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_bottomright\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_bottomleft\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003Cdiv class=\\\"pop_content pop_content_old\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\") + \"\\u003C/div\\u003E\");\n        ;\n            n.setContent(this._popup, r(la));\n            var ma = n.find(this._popup, \"div.pop_content\");\n            ma.setAttribute(\"tabIndex\", \"0\");\n            ma.setAttribute(\"role\", \"alertdialog\");\n            this._frame = this._content = ma;\n            var na = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, \"Loading...\"), oa = n.create(\"span\"), pa = n.create(\"h2\", {\n                className: \"dialog_title hidden_elem\",\n                id: (\"title_\" + this._uniqueID)\n            }, oa), qa = n.create(\"div\", {\n                className: \"dialog_summary hidden_elem\"\n            }), ra = n.create(\"div\", {\n                className: \"dialog_body\"\n            }), sa = n.create(\"div\", {\n                className: \"rfloat mlm\"\n            }), ta = n.create(\"div\", {\n                className: \"dialog_buttons_msg\"\n            }), ua = n.create(\"div\", {\n                className: \"dialog_buttons clearfix hidden_elem\"\n            }, [sa,ta,]), va = n.create(\"div\", {\n                className: \"dialog_footer hidden_elem\"\n            }), wa = n.create(\"div\", {\n                className: \"dialog_content\"\n            }, [qa,ra,ua,va,]);\n            this._nodes = {\n                summary: qa,\n                body: ra,\n                buttons: sa,\n                button_message: ta,\n                button_wrapper: ua,\n                footer: va,\n                content: wa,\n                title: pa,\n                title_inner: oa\n            };\n            n.setContent(this._frame, [pa,wa,na,]);\n        },\n        _updateShim: function() {\n            return (this._shim && this._shim.show());\n        },\n        _activeResize: function() {\n            if ((this.last_offset_height != this._content.offsetHeight)) {\n                this.last_offset_height = this._content.offsetHeight;\n                this.resetDialogPosition();\n            }\n        ;\n        },\n        resetDialogPosition: function() {\n            if (!this._popup) {\n                return\n            };\n            this._resetDialogObj();\n            this._updateShim();\n        },\n        _resetDialogObj: function() {\n            var la = (2 * ka._PAGE_MARGIN), ma = z.getViewportDimensions(), na = (ma.x - la), oa = (ma.y - la), pa = (2 * ka._HALO_WIDTH), qa = z.getElementDimensions(this._content), ra = (qa.x + pa), sa = (qa.y + pa), ta = this._top, ua = (na - ra), va = (oa - sa);\n            if ((va < 0)) {\n                ta = ka._PAGE_MARGIN;\n            }\n             else if ((ta > va)) {\n                ta = (ka._PAGE_MARGIN + ((Math.max(va, 0) / 2)));\n            }\n        ;\n            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\n            };\n            w.set(this._popup, \"marginTop\", (ta + \"px\"));\n            var xa = (wa && (((ua < 0) || (va < 0))));\n            m.conditionClass(this._obj, \"generic_dialog_fixed_overflow\", xa);\n            m.conditionClass(document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return\n            };\n            try {\n                new g(this._obj).duration(0).checkpoint().to(\"opacity\", 0).hide().duration(250).ondone(this._hide.bind(this, la)).go();\n            } catch (ma) {\n                this._hide(la);\n            };\n        },\n        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            };\n            m.removeClass(document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            clearInterval(this.active_hiding);\n            if (this._bottom) {\n                var ma = ka._bottoms;\n                ma.splice(ma.indexOf(this._bottom), 1);\n                ka._updateMaxBottom();\n            }\n        ;\n            if (((this._previous_focus && document.activeElement) && n.contains(this._obj, document.activeElement))) {\n                p.set(this._previous_focus);\n            };\n            if (la) {\n                return\n            };\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            clearInterval(this.active_hiding);\n            if (this._obj) {\n                n.remove(this._obj);\n                this._obj = null;\n                (this._shim && this._shim.hide());\n                this._shim = null;\n            }\n        ;\n            (this._clickOnEnterListener && this._clickOnEnterListener.remove());\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            };\n        },\n        _handleButton: function(la) {\n            if ((typeof la == \"string\")) {\n                la = ka._findButton(this._buttons, la);\n            };\n            var ma = ka.call_or_eval(la, la.handler);\n            if ((ma === false)) {\n                return\n            };\n            if ((la.name == \"cancel\")) {\n                this.cancel();\n            }\n             else if ((ka.call_or_eval(this, this._handler, {\n                button: la\n            }) !== false)) {\n                this.hide();\n            }\n        ;\n        },\n        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.name] = na.label;\n            };\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\n            };\n            var pa = new i().setURI(ma).setData(oa).setMethod(la).setNectarModuleDataSafe(this._causal_elem).setReadOnly((la == \"GET\"));\n            this.setAsync(pa);\n            return false;\n        },\n        _setFromModel: function(la) {\n            var ma = {\n            };\n            ba(ma, la);\n            for (var na in ma) {\n                if ((na == \"onloadRegister\")) {\n                    this.onloadRegister(ma[na]);\n                    continue;\n                }\n            ;\n                var oa = this[((\"set\" + na.substr(0, 1).toUpperCase()) + na.substr(1))];\n                oa.apply(this, ca(ma[na]));\n            };\n        },\n        _updateBottom: function() {\n            var la = (z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y);\n            ka._bottoms[(ka._bottoms.length - 1)] = la;\n            ka._updateMaxBottom();\n        },\n        _pushOntoStack: function() {\n            var la = ka._stack;\n            if (!la.length) {\n                h.inform(\"layer_shown\", {\n                    type: \"Dialog\"\n                });\n            };\n            ga(la, this);\n            la.push(this);\n            for (var ma = (la.length - 2); (ma >= 0); ma--) {\n                var na = la[ma];\n                if ((!na._is_stackable && !na._async_request)) {\n                    na._hide();\n                }\n                 else if (!na._shown_while_stacked) {\n                    na._hide(true);\n                }\n            ;\n            };\n        },\n        _popFromStack: function() {\n            var la = ka._stack, ma = ((la[(la.length - 1)] === this));\n            ga(la, this);\n            if (la.length) {\n                if (ma) {\n                    la[(la.length - 1)].show();\n                };\n            }\n             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\n            });\n        ;\n        }\n    });\n    e.exports = ka;\n    a.Dialog = ka;\n});\n__d(\"DocumentTitle\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = document.title, i = null, j = 1500, k = [], l = 0, m = null, n = false;\n    function o() {\n        if ((k.length > 0)) {\n            if (!n) {\n                p(k[l].title);\n                l = (++l % k.length);\n            }\n             else q();\n        ;\n        }\n         else {\n            clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    };\n    function p(s) {\n        document.title = s;\n        n = true;\n    };\n    function q() {\n        r.set((i || h), true);\n        n = false;\n    };\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            document.title = s;\n            if (!t) {\n                h = s;\n                i = null;\n                g.inform(\"update_title\", s);\n            }\n             else i = s;\n        ;\n        },\n        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if ((m === null)) {\n                m = setInterval(o, j);\n            };\n            return {\n                stop: function() {\n                    var u = k.indexOf(t);\n                    if ((u >= 0)) {\n                        k.splice(u, 1);\n                        if ((l > u)) {\n                            l--;\n                        }\n                         else if (((l == u) && (l == k.length))) {\n                            l = 0;\n                        }\n                    ;\n                    }\n                ;\n                }\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"FileInput\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMClone\"), k = b(\"Focus\"), l = b(\"UserAgent\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = l.ie();\n    function p(q, r, s) {\n        this.container = q;\n        this.control = r;\n        this.input = s;\n        var t = i.scry(this.container, \"a\")[0];\n        (t && t.removeAttribute(\"href\"));\n        var u = i.create(\"div\", {\n            className: \"-cx-PRIVATE-uiFileInput__wrap\"\n        }, this.input);\n        i.appendContent(this.control, u);\n        this._initListeners();\n    };\n    m(p.prototype, h, {\n        getValue: function() {\n            return this.input.value;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        clear: function() {\n            if (o) {\n                var q = j.deepClone(this.input);\n                i.replace(this.input, q);\n                this.input = q;\n                while (this._listeners.length) {\n                    this._listeners.pop().remove();;\n                };\n                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\n            }\n        ;\n        },\n        _initListeners: function() {\n            k.relocate(this.input, this.control);\n            this._listeners = [g.listen(this.input, \"change\", this._handleChange.bind(this)),];\n        },\n        _handleChange: function(event) {\n            this.inform(\"change\", event);\n            var q = this.input.form;\n            if ((q && (o < 9))) {\n                g.fire(q, \"change\", event);\n            };\n        }\n    });\n    e.exports = p;\n});\n__d(\"LinkController\", [\"Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(event) {\n        var r = i.byTag(event.getTarget(), \"a\"), s = (r && r.getAttribute(\"href\", 2));\n        if ((((!s || r.rel) || !p(s)) || h.get(r, k))) {\n            return\n        };\n        var t = g.listen(r, \"click\", function(u) {\n            if ((s.charAt((s.length - 1)) == \"#\")) {\n                u.prevent();\n                return;\n            }\n        ;\n            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n    function o(r, event) {\n        if ((((r.target || r.rel) || event.getModifiers().any) || ((event.which && (event.which != 1))))) {\n            return\n        };\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; (t < u); t++) {\n            if ((s[t](r, event) === false)) {\n                return event.prevent()\n            };\n        };\n    };\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return (!s || s[1].match(/^http/i));\n    };\n    var q = {\n        registerHandler: function(r) {\n            l.push(r);\n        },\n        registerFallbackHandler: function(r) {\n            m.push(r);\n        }\n    };\n    g.listen(document.documentElement, \"mousedown\", n);\n    g.listen(document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"OnloadHooks\", [\"Arbiter\",\"ErrorUtils\",\"InitialJSLoader\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"InitialJSLoader\"), j = b(\"OnloadEvent\");\n    function k() {\n        var r = a.CavalryLogger;\n        if ((!window.loaded && r)) {\n            r.getInstance().setTimeStamp(\"t_prehooks\");\n        };\n        n(\"onloadhooks\");\n        if ((!window.loaded && r)) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        };\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\n    };\n    function m(r, s) {\n        return h.applyWithGuard(r, null, null, function(t) {\n            t.event_type = s;\n            t.category = \"runhook\";\n        });\n    };\n    function n(r) {\n        var s = (((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\")));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            };\n            if (!s) {\n                window[r] = null;\n            };\n            for (var u = 0; (u < t.length); u++) {\n                var v = m(t[u], r);\n                if ((s && v)) {\n                    return v\n                };\n            };\n        } while ((!s && window[r]));\n    };\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\n        }\n    ;\n    };\n    function p() {\n        g.registerCallback(k, [j.ONLOAD_DOMCONTENT_CALLBACK,i.INITIAL_JS_READY,]);\n        g.registerCallback(l, [j.ONLOAD_DOMCONTENT_CALLBACK,j.ONLOAD_CALLBACK,i.INITIAL_JS_READY,]);\n        g.subscribe(j.ONBEFOREUNLOAD, function(r, s) {\n            s.warn = (n(\"onbeforeleavehooks\") || n(\"onbeforeunloadhooks\"));\n            if (!s.warn) {\n                window.loaded = false;\n                window.afterloaded = false;\n            }\n        ;\n        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\n    };\n    var q = {\n        _onloadHook: k,\n        _onafterloadHook: l,\n        runHook: m,\n        runHooks: n,\n        keepWindowSetAsLoaded: o\n    };\n    p();\n    a.OnloadHooks = e.exports = q;\n});\n__d(\"areEqual\", [], function(a, b, c, d, e, f) {\n    var g = function(k, l, m, n) {\n        if ((k === l)) {\n            return ((k !== 0) || ((1 / k) == (1 / l)))\n        };\n        if (((k == null) || (l == null))) {\n            return false\n        };\n        if (((typeof k != \"object\") || (typeof l != \"object\"))) {\n            return false\n        };\n        var o = Object.prototype.toString, p = o.call(k);\n        if ((p != o.call(l))) {\n            return false\n        };\n        switch (p) {\n          case \"[object String]\":\n            return (k == String(l));\n          case \"[object Number]\":\n            return ((isNaN(k) || isNaN(l)) ? false : (k == Number(l)));\n          case \"[object Date]\":\n        \n          case \"[object Boolean]\":\n            return (+k == +l);\n          case \"[object RegExp]\":\n            return ((((k.source == l.source) && (k.global == l.global)) && (k.multiline == l.multiline)) && (k.ignoreCase == l.ignoreCase));\n        };\n        var q = m.length;\n        while (q--) {\n            if ((m[q] == k)) {\n                return (n[q] == l)\n            };\n        };\n        m.push(k);\n        n.push(l);\n        var r = 0;\n        if ((p === \"[object Array]\")) {\n            r = k.length;\n            if ((r !== l.length)) {\n                return false\n            };\n            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false\n                };\n            };\n        }\n         else {\n            if ((k.constructor !== l.constructor)) {\n                return false\n            };\n            if ((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\"))) {\n                return (k.valueOf() == l.valueOf())\n            };\n            var s = Object.keys(k);\n            if ((s.length != Object.keys(l).length)) {\n                return false\n            };\n            for (var t = 0; (t < s.length); t++) {\n                if (!g(k[s[t]], l[s[t]], m, n)) {\n                    return false\n                };\n            };\n        }\n    ;\n        m.pop();\n        n.pop();\n        return true;\n    }, h = [], i = [], j = function(k, l) {\n        var m = (h.length ? h.pop() : []), n = (i.length ? i.pop() : []), o = g(k, l, m, n);\n        m.length = 0;\n        n.length = 0;\n        h.push(m);\n        i.push(n);\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"computeRelativeURI\", [\"URI\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"isEmpty\");\n    function i(k, l) {\n        if (!l) {\n            return k\n        };\n        if ((l.charAt(0) == \"/\")) {\n            return l\n        };\n        var m = k.split(\"/\").slice(0, -1);\n        (m[0] !== \"\");\n        l.split(\"/\").forEach(function(n) {\n            if (!((n == \".\"))) {\n                if ((n == \"..\")) {\n                    if ((m.length > 1)) {\n                        m = m.slice(0, -1);\n                    };\n                }\n                 else m.push(n);\n            \n            };\n        });\n        return m.join(\"/\");\n    };\n    function j(k, l) {\n        var m = new g(), n = l;\n        k = new g(k);\n        l = new g(l);\n        if ((l.getDomain() && !l.isFacebookURI())) {\n            return n\n        };\n        var o = k, p = [\"Protocol\",\"Domain\",\"Port\",\"Path\",\"QueryData\",\"Fragment\",];\n        p.forEach(function(q) {\n            var r = ((q == \"Path\") && (o === k));\n            if (r) {\n                m.setPath(i(k.getPath(), l.getPath()));\n            };\n            if (!h(l[(\"get\" + q)]())) {\n                o = l;\n            };\n            if (!r) {\n                m[(\"set\" + q)](o[(\"get\" + q)]());\n            };\n        });\n        return m;\n    };\n    e.exports = j;\n});\n__d(\"escapeJSQuotes\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if ((((typeof h == \"undefined\") || (h == null)) || !h.valueOf())) {\n            return \"\"\n        };\n        return h.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, \"\\\\x22\").replace(/'/g, \"\\\\'\").replace(/</g, \"\\\\x3c\").replace(/>/g, \"\\\\x3e\").replace(/&/g, \"\\\\x26\");\n    };\n    e.exports = g;\n});\n__d(\"htmlSpecialChars\", [], function(a, b, c, d, e, f) {\n    var g = /&/g, h = /</g, i = />/g, j = /\"/g, k = /'/g;\n    function l(m) {\n        if ((((typeof m == \"undefined\") || (m === null)) || !m.toString)) {\n            return \"\"\n        };\n        if ((m === false)) {\n            return \"0\";\n        }\n         else if ((m === true)) {\n            return \"1\"\n        }\n    ;\n        return m.toString().replace(g, \"&amp;\").replace(j, \"&quot;\").replace(k, \"&#039;\").replace(h, \"&lt;\").replace(i, \"&gt;\");\n    };\n    e.exports = l;\n});\n__d(\"htmlize\", [\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"htmlSpecialChars\");\n    function h(i) {\n        return g(i).replace(/\\r\\n|[\\r\\n]/g, \"\\u003Cbr/\\u003E\");\n    };\n    e.exports = h;\n});\n__d(\"setTimeoutAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return setTimeout(h, i, false);\n    };\n    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"Event\",\"Form\",\"HistoryManager\",\"JSLogger\",\"LinkController\",\"OnloadHooks\",\"Parent\",\"URI\",\"UserAgent\",\"Vector\",\"areEqual\",\"clickRefAction\",\"computeRelativeURI\",\"copyProperties\",\"escapeJSQuotes\",\"ge\",\"goOrReplace\",\"htmlize\",\"setTimeoutAcrossTransitions\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Dialog\"), i = b(\"DOMQuery\"), j = b(\"DOMScroll\"), k = b(\"Env\"), l = b(\"Event\"), m = b(\"Form\"), n = b(\"HistoryManager\"), o = b(\"JSLogger\"), p = b(\"LinkController\"), q = b(\"OnloadHooks\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"areEqual\"), w = b(\"clickRefAction\"), x = b(\"computeRelativeURI\"), y = b(\"copyProperties\"), z = b(\"escapeJSQuotes\"), aa = b(\"ge\"), ba = b(\"goOrReplace\"), ca = b(\"htmlize\"), da = b(\"setTimeoutAcrossTransitions\"), ea = b(\"startsWith\"), fa = b(\"tx\"), ga = b(\"userAction\"), ha = {\n    };\n    function ia(ta, ua) {\n        ha[ta.getUnqualifiedURI()] = ua;\n    };\n    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n    function oa(event) {\n        if (ma) {\n            if (!event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n            event.prevent();\n        }\n         else {\n            la = event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\n        }\n    ;\n    };\n    function pa(ta) {\n        var ua = ta.getAttribute(\"href\"), va = x(ra._most_recent_uri.getQualifiedURI(), ua).toString();\n        if ((ua != va)) {\n            ta.setAttribute(\"href\", va);\n        };\n    };\n    function qa(event) {\n        var ta = event.getTarget();\n        if ((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\"))) {\n            return\n        };\n        w(\"form\", ta, event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\n        };\n        var wa = new s((m.getAttribute(ta, \"action\") || \"\")), xa = x(ra._most_recent_uri, wa);\n        ta.setAttribute(\"action\", xa.toString());\n        if ((((m.getAttribute(ta, \"method\") || \"GET\")).toUpperCase() === \"GET\")) {\n            var ya = m.serialize(ta), za = la;\n            if (((za && (((i.isNodeOfType(za, \"input\") && (za.type === \"submit\")) || (za = r.byTag(za, \"button\"))))) && za.name)) {\n                ya[za.name] = za.value;\n            };\n            ra.go(xa.addQueryData(ya));\n            event.kill();\n        }\n    ;\n    };\n    var ra = {\n        _transition_handlers: [],\n        _scroll_locked: false,\n        isInitialized: function() {\n            return !!ra._initialized;\n        },\n        _init: function() {\n            if (k.DISABLE_PAGE_TRANSITIONS) {\n                return\n            };\n            if ((!k.ALLOW_TRANSITION_IN_IFRAME && (window != window.top))) {\n                return\n            };\n            if (ra._initialized) {\n                return ra\n            };\n            ra._initialized = true;\n            var ta = s.getRequestURI(false), ua = ta.getUnqualifiedURI(), va = s(ua).setFragment(null), wa = ua.getFragment();\n            if (((wa.charAt(0) === \"!\") && (va.toString() === wa.substr(1)))) {\n                ua = va;\n            };\n            y(ra, {\n                _current_uri: ua,\n                _most_recent_uri: ua,\n                _next_uri: ua\n            });\n            var xa;\n            if (ea(ta.getFragment(), \"/\")) {\n                xa = ta.getFragment();\n            }\n             else xa = ua;\n        ;\n            n.init().setCanonicalLocation((\"#\" + xa)).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\n                };\n            });\n            return ra;\n        },\n        registerHandler: function(ta, ua) {\n            ra._init();\n            ua = (ua || 5);\n            if (!ra._transition_handlers[ua]) {\n                ra._transition_handlers[ua] = [];\n            };\n            ra._transition_handlers[ua].push(ta);\n        },\n        getCurrentURI: function(ta) {\n            if ((!ra._current_uri && !ta)) {\n                return new s(ra._most_recent_uri)\n            };\n            return new s(ra._current_uri);\n        },\n        getMostRecentURI: function() {\n            return new s(ra._most_recent_uri);\n        },\n        getNextURI: function() {\n            return new s(ra._next_uri);\n        },\n        go: function(ta, ua) {\n            var va = new s(ta).removeQueryData(\"quickling\").getQualifiedURI();\n            o.create(\"pagetransition\").debug(\"go\", {\n                uri: va.toString()\n            });\n            ka(va);\n            (!ua && w(\"uri\", {\n                href: va.toString()\n            }, null, \"INDIRECT\"));\n            sa.lookBusy();\n            ra._loadPage(va, function(wa) {\n                if (wa) {\n                    n.go(va.toString(), false, ua);\n                }\n                 else ba(window.location, va, ua);\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if ((ta.charAt(0) != \"/\")) {\n                return false\n            };\n            w(\"h\", {\n                href: ta\n            });\n            ga(\"page_transitions\").uai(null, \"history_manager\");\n            ra._loadPage(new s(ta), function(ua) {\n                if (!ua) {\n                    ba(window.location, ta, true);\n                };\n            });\n            return true;\n        },\n        _loadPage: function(ta, ua) {\n            if ((s(ta).getFragment() && v(s(ta).setFragment(null).getQualifiedURI(), s(ra._current_uri).setFragment(null).getQualifiedURI()))) {\n                if (ra.restoreScrollPosition(ta)) {\n                    ra._current_uri = ra._most_recent_uri = ta;\n                    sa.stopLookingBusy();\n                    return;\n                }\n            \n            };\n            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            };\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.scrollTo(va, false);\n            };\n            var wa = function() {\n                ra._scroll_locked = true;\n                var ya = ra._handleTransition(ta);\n                (ua && ua(ya));\n            }, xa = q.runHooks(\"onbeforeleavehooks\");\n            if (xa) {\n                sa.stopLookingBusy();\n                ra._warnBeforeLeaving(xa, wa);\n            }\n             else wa();\n        ;\n        },\n        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false\n            };\n            var ua = (window.AsyncRequest && window.AsyncRequest.getLastID());\n            g.inform(\"pre_page_transition\", {\n                from: ra.getMostRecentURI(),\n                to: ta\n            });\n            for (var va = (ra._transition_handlers.length - 1); (va >= 0); --va) {\n                var wa = ra._transition_handlers[va];\n                if (!wa) {\n                    continue;\n                };\n                for (var xa = (wa.length - 1); (xa >= 0); --xa) {\n                    if ((wa[xa](ta) === true)) {\n                        var ya = {\n                            sender: this,\n                            uri: ta,\n                            id: ua\n                        };\n                        try {\n                            g.inform(\"page_transition\", ya);\n                        } catch (za) {\n                        \n                        };\n                        return true;\n                    }\n                     else wa.splice(xa, 1);\n                ;\n                };\n            };\n            return false;\n        },\n        unifyURI: function() {\n            ra._current_uri = ra._most_recent_uri = ra._next_uri;\n        },\n        transitionComplete: function(ta) {\n            ra._executeCompletionCallback();\n            sa.stopLookingBusy();\n            ra.unifyURI();\n            if (!ta) {\n                ra.restoreScrollPosition(ra._current_uri);\n            };\n            try {\n                if ((document.activeElement && (document.activeElement.nodeName === \"A\"))) {\n                    document.activeElement.blur();\n                };\n            } catch (ua) {\n            \n            };\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\n            };\n            ra._completionCallback = null;\n        },\n        setCompletionCallback: function(ta) {\n            ra._completionCallback = ta;\n        },\n        rewriteCurrentURI: function(ta, ua) {\n            ra.registerHandler(function() {\n                if ((ta == ra.getMostRecentURI().getUnqualifiedURI().toString())) {\n                    ra.transitionComplete();\n                    return true;\n                }\n            ;\n            });\n            ra.go(ua, true);\n        },\n        _warnBeforeLeaving: function(ta, ua) {\n            new h().setTitle(\"Are you sure you want to leave this page?\").setBody(ca(ta)).setButtons([{\n                name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        restoreScrollPosition: function(ta) {\n            ra._scroll_locked = false;\n            var ua = ja(ta);\n            if (ua) {\n                j.scrollTo(ua, false);\n                return true;\n            }\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null\n                };\n                var za = ((\"a[name='\" + z(ya)) + \"']\");\n                return (i.scry(document.body, za)[0] || aa(ya));\n            };\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.scrollTo(xa);\n                return true;\n            }\n        ;\n            return false;\n        }\n    }, sa = (window._BusyUIManager || {\n        _looking_busy: false,\n        _original_cursors: [],\n        lookBusy: function(ta) {\n            if (ta) {\n                sa._giveProgressCursor(ta);\n            };\n            if (sa._looking_busy) {\n                return\n            };\n            sa._looking_busy = true;\n            sa._giveProgressCursor(document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return\n            };\n            sa._looking_busy = false;\n            while (sa._original_cursors.length) {\n                var ta = sa._original_cursors.pop(), ua = ta[0], va = ta[1];\n                if (ua.style) {\n                    ua.style.cursor = (va || \"\");\n                };\n            };\n        },\n        _giveProgressCursor: function(ta) {\n            if (!t.webkit()) {\n                sa._original_cursors.push([ta,ta.style.cursor,]);\n                ta.style.cursor = \"progress\";\n            }\n        ;\n        }\n    });\n    e.exports = ra;\n    a.PageTransitions = ra;\n});\n__d(\"PixelRatio\", [\"Arbiter\",\"Cookie\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Cookie\"), i = b(\"Run\"), j = \"dpr\", k, l;\n    function m() {\n        return (window.devicePixelRatio || 1);\n    };\n    function n() {\n        h.set(j, m());\n    };\n    function o() {\n        h.clear(j);\n    };\n    function p() {\n        var r = m();\n        if ((r !== k)) {\n            n();\n        }\n         else o();\n    ;\n    };\n    var q = {\n        startDetecting: function(r) {\n            k = (r || 1);\n            o();\n            if (l) {\n                return\n            };\n            l = [g.subscribe(\"pre_page_transition\", p),];\n            i.onBeforeUnload(p);\n        }\n    };\n    e.exports = q;\n});\n__d(\"PostLoadJS\", [\"Bootloader\",\"Run\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\"), i = b(\"emptyFunction\");\n    function j(l, m) {\n        h.onAfterLoad(function() {\n            g.loadModules.call(g, [l,], m);\n        });\n    };\n    var k = {\n        loadAndRequire: function(l) {\n            j(l, i);\n        },\n        loadAndCall: function(l, m, n) {\n            j(l, function(o) {\n                o[m].apply(o, n);\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"ControlledReferer\", [\"Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"URI\"), i = b(\"UserAgent\"), j = {\n        useFacebookReferer: function(k, l, m) {\n            var n = false;\n            function o() {\n                if (n) {\n                    return\n                };\n                var q = k.contentWindow.location.pathname;\n                if (((q !== \"/intern/common/referer_frame.php\") && (q !== \"/common/referer_frame.php\"))) {\n                    return\n                };\n                n = true;\n                k.contentWindow.document.body.style.margin = 0;\n                l();\n            };\n            var p;\n            if ((document.domain !== \"facebook.com\")) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.opera()) {\n                p = \"/common/referer_frame.php\";\n            }\n             else if (h().isSecure()) {\n                p = \"https://s-static.ak.facebook.com/common/referer_frame.php\";\n            }\n             else p = \"http://static.ak.facebook.com/common/referer_frame.php\";\n            \n            \n        ;\n            if (m) {\n                p += (\"?fb_source=\" + m);\n            };\n            g.listen(k, \"load\", o);\n            k.src = p;\n        },\n        useFacebookRefererHtml: function(k, l, m) {\n            j.useFacebookReferer(k, function() {\n                k.contentWindow.document.body.innerHTML = l;\n            }, m);\n        }\n    };\n    e.exports = j;\n});\n__d(\"SoundRPC\", [\"Event\",\"SoundSynchronizer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"SoundSynchronizer\");\n    function i(k, l, m) {\n        h.play(k, l, m);\n    };\n    var j = {\n        playLocal: i,\n        playRemote: function(k, l, m, n) {\n            var o = {\n                paths: l,\n                sync: m,\n                loop: n\n            };\n            k.postMessage(JSON.stringify(o), \"*\");\n        },\n        supportsRPC: function() {\n            return !!window.postMessage;\n        },\n        _listen: function() {\n            g.listen(window, \"message\", function(k) {\n                if (!/\\.facebook.com$/.test(k.origin)) {\n                    return\n                };\n                var l = JSON.parse(k.data);\n                i(l.paths, l.sync, l.loop);\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"TabbableElements\", [\"Style\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"createArrayFrom\");\n    function i(l) {\n        if ((l.tabIndex >= 0)) {\n            return true\n        };\n        switch (l.tagName) {\n          case \"A\":\n            return (l.href && (l.rel != \"ignore\"));\n          case \"INPUT\":\n            return (((l.type != \"hidden\") && (l.type != \"file\")) && !l.disabled);\n          case \"BUTTON\":\n        \n          case \"SELECT\":\n        \n          case \"TEXTAREA\":\n            return !l.disabled;\n        };\n        return false;\n    };\n    function j(l) {\n        if (((l.offsetHeight === 0) && (l.offsetWidth === 0))) {\n            return false\n        };\n        while (((l !== document) && (g.get(l, \"visibility\") != \"hidden\"))) {\n            l = l.parentNode;;\n        };\n        return (l === document);\n    };\n    var k = {\n        find: function(l) {\n            var m = h(l.getElementsByTagName(\"*\"));\n            return m.filter(k.isTabbable);\n        },\n        isTabbable: function(l) {\n            return (i(l) && j(l));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = 5000, j = 500, k = -5, l = Date.now(), m = l, n = {\n        subscribeOnce: function(p) {\n            var q = n.subscribe(function() {\n                n.unsubscribe(q);\n                p();\n            });\n        },\n        subscribe: function(p) {\n            return g.subscribe(\"useractivity/activity\", p);\n        },\n        unsubscribe: function(p) {\n            p.unsubscribe();\n        },\n        isActive: function(p) {\n            return (((new Date() - l) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(event) {\n        l = Date.now();\n        var p = (l - m);\n        if ((p > j)) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                event: event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if ((p < k)) {\n            m = l;\n        }\n    ;\n    };\n    h.listen(window, \"scroll\", o);\n    h.listen(window, \"focus\", o);\n    h.listen(document.documentElement, {\n        DOMMouseScroll: o,\n        mousewheel: o,\n        keydown: o,\n        mouseover: o,\n        mousemove: o,\n        click: o\n    });\n    g.subscribe(\"Event/stop\", function(p, q) {\n        o(q.event);\n    });\n    e.exports = n;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return (\"f\" + ((Math.random() * ((1 << 30)))).toString(16).replace(\".\", \"\"));\n    };\n    e.exports = g;\n});\n__d(\"throttle\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j, k, l) {\n        return i(j, k, l, false, false);\n    };\n    g(h, {\n        acrossTransitions: function(j, k, l) {\n            return i(j, k, l, true, false);\n        },\n        withBlocking: function(j, k, l) {\n            return i(j, k, l, false, true);\n        }\n    });\n    function i(j, k, l, m, n) {\n        if ((k == null)) {\n            k = 100;\n        };\n        var o, p, q;\n        function r() {\n            p = Date.now();\n            if (o) {\n                j.apply(l, o);\n                o = null;\n                q = setTimeout(r, k, !m);\n            }\n             else q = false;\n        ;\n        };\n        return function s() {\n            o = arguments;\n            if ((!q || (((Date.now() - p) > k)))) {\n                if (n) {\n                    r();\n                }\n                 else q = setTimeout(r, 0, !m);\n            \n            };\n        };\n    };\n    e.exports = h;\n});\n__d(\"UIPagelet\", [\"AjaxPipeRequest\",\"AsyncRequest\",\"DOM\",\"HTML\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"ScriptPathState\"), l = b(\"URI\"), m = b(\"copyProperties\"), n = b(\"emptyFunction\"), o = b(\"ge\");\n    function p(q, r, s) {\n        var t = ((q && i.isElementNode(q)) ? q.id : q);\n        this._id = (t || null);\n        this._element = o((q || i.create(\"div\")));\n        this._src = (r || null);\n        this._context_data = (s || {\n        });\n        this._data = {\n        };\n        this._handler = n;\n        this._request = null;\n        this._use_ajaxpipe = false;\n        this._is_bundle = true;\n        this._allow_cross_page_transition = false;\n        this._append = false;\n    };\n    p.loadFromEndpoint = function(q, r, s, t) {\n        t = (t || {\n        });\n        var u = (\"/ajax/pagelet/generic.php/\" + q);\n        if (t.intern) {\n            u = (\"/intern\" + u);\n        };\n        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\n        };\n        var w = new p(r, v, s).setUseAjaxPipe(t.usePipe).setBundleOption((t.bundle !== false)).setAppend(t.append).setJSNonBlock(t.jsNonblock).setAutomatic(t.automatic).setDisplayCallback(t.displayCallback).setConstHeight(t.constHeight).setAllowCrossPageTransition(t.crossPage).setFinallyHandler((t.finallyHandler || n)).setTransportErrorHandler(t.transportErrorHandler);\n        (t.handler && w.setHandler(t.handler));\n        w.go();\n        return w;\n    };\n    m(p.prototype, {\n        getElement: function() {\n            return this._element;\n        },\n        setHandler: function(q) {\n            this._handler = q;\n            return this;\n        },\n        go: function(q, r) {\n            if (((arguments.length >= 2) || (typeof q == \"string\"))) {\n                this._src = q;\n                this._data = (r || {\n                });\n            }\n             else if ((arguments.length == 1)) {\n                this._data = q;\n            }\n        ;\n            this.refresh();\n            return this;\n        },\n        setAllowCrossPageTransition: function(q) {\n            this._allow_cross_page_transition = q;\n            return this;\n        },\n        setBundleOption: function(q) {\n            this._is_bundle = q;\n            return this;\n        },\n        setTransportErrorHandler: function(q) {\n            this.transportErrorHandler = q;\n            return this;\n        },\n        refresh: function() {\n            if (this._use_ajaxpipe) {\n                k.setIsUIPageletRequest(true);\n                this._request = new g();\n                this._request.setCanvasId(this._id).setAppend(this._append).setConstHeight(this._constHeight).setJSNonBlock(this._jsNonblock).setAutomatic(this._automatic).setDisplayCallback(this._displayCallback).setFinallyHandler(this._finallyHandler);\n            }\n             else {\n                var q = function(t) {\n                    this._request = null;\n                    var u = j(t.getPayload());\n                    if (this._append) {\n                        i.appendContent(this._element, u);\n                    }\n                     else i.setContent(this._element, u);\n                ;\n                    this._handler();\n                }.bind(this), r = this._displayCallback;\n                this._request = new h().setMethod(\"GET\").setReadOnly(true).setOption(\"bundle\", this._is_bundle).setHandler(function(t) {\n                    if (r) {\n                        r(q.curry(t));\n                    }\n                     else q(t);\n                ;\n                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    };\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\n                };\n            }\n        ;\n            var s = {\n            };\n            m(s, this._context_data);\n            m(s, this._data);\n            this._request.setURI(this._src).setAllowCrossPageTransition(this._allow_cross_page_transition).setData({\n                data: JSON.stringify(s)\n            }).send();\n            return this;\n        },\n        cancel: function() {\n            if (this._request) {\n                this._request.abort();\n            };\n        },\n        setUseAjaxPipe: function(q) {\n            this._use_ajaxpipe = !!q;\n            return this;\n        },\n        setAppend: function(q) {\n            this._append = !!q;\n            return this;\n        },\n        setJSNonBlock: function(q) {\n            this._jsNonblock = !!q;\n            return this;\n        },\n        setAutomatic: function(q) {\n            this._automatic = !!q;\n            return this;\n        },\n        setDisplayCallback: function(q) {\n            this._displayCallback = q;\n            return this;\n        },\n        setConstHeight: function(q) {\n            this._constHeight = !!q;\n            return this;\n        },\n        setFinallyHandler: function(q) {\n            this._finallyHandler = q;\n            return this;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TabIsolation\", [\"Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOMQuery\"), i = b(\"Focus\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"copyProperties\"), m = [], n = 0;\n    function o(p) {\n        this._root = p;\n        this._eventHandler = null;\n        this._identifier = n++;\n    };\n    l(o.prototype, {\n        enable: function() {\n            m.unshift(this._identifier);\n            this._eventHandler = g.listen(window, \"keydown\", function(p) {\n                if ((m[0] === this._identifier)) {\n                    this._tabHandler(p);\n                };\n            }.bind(this), g.Priority.URGENT);\n        },\n        disable: function() {\n            var p;\n            if (this._eventHandler) {\n                p = m.indexOf(this._identifier);\n                if ((p > -1)) {\n                    m.splice(p, 1);\n                };\n                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        },\n        _tabHandler: function(p) {\n            if ((g.getKeyCode(p) !== j.TAB)) {\n                return\n            };\n            var q = p.getTarget();\n            if (!q) {\n                return\n            };\n            var r = k.find(this._root), s = r[0], t = r[(r.length - 1)], u = p.getModifiers().shift;\n            if ((u && (q === s))) {\n                p.preventDefault();\n                i.set(t);\n            }\n             else if ((((!u && (q === t))) || !h.contains(this._root, q))) {\n                p.preventDefault();\n                i.set(s);\n            }\n            \n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attachScrollListener.bind(this)),this._layer.subscribe(\"hide\", this._removeScrollListener.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return\n            };\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"scroll\", this._layer.updatePosition.bind(this._layer));\n        },\n        _removeScrollListener: function() {\n            (this._listener && this._listener.remove());\n            this._listener = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerAutoFocus\", [\"function-extensions\",\"DOMQuery\",\"Focus\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Focus\"), i = b(\"TabbableElements\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n    j(k.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"aftershow\", this._focus.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _focus: function() {\n            var l = this._layer.getRoot(), m = g.scry(l, \".autofocus\")[0], n = true;\n            if (!m) {\n                var o = document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return\n                };\n                var p = i.find(l);\n                for (var q = 0; (q < p.length); q++) {\n                    if ((p[q].tagName != \"A\")) {\n                        m = p[q];\n                        n = false;\n                        break;\n                    }\n                ;\n                };\n            }\n             else if ((m.tabIndex !== 0)) {\n                n = false;\n            }\n        ;\n            if (m) {\n                (n ? h.set(m) : h.setWithoutOutline(m));\n            }\n             else {\n                l.tabIndex = 0;\n                h.setWithoutOutline(l);\n            }\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerButtons\", [\"Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\n    };\n    i(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _handle: function(k) {\n            var l = k.getTarget(), m = h.byClass(l, \"layerConfirm\");\n            if (m) {\n                if ((this._layer.inform(\"confirm\", m) === false)) {\n                    k.prevent();\n                };\n                return;\n            }\n        ;\n            var n = h.byClass(l, \"layerCancel\");\n            if (n) {\n                if ((this._layer.inform(\"cancel\", n) !== false)) {\n                    this._layer.hide();\n                };\n                k.prevent();\n                return;\n            }\n        ;\n            var o = h.byClass(l, \"layerButton\");\n            if (o) {\n                if ((this._layer.inform(\"button\", o) === false)) {\n                    k.prevent();\n                }\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerFadeOnShow\", [\"Animation\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\"), i = b(\"UserAgent\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if ((i.ie() < 9)) {\n                return\n            };\n            this._subscriptions = [this._layer.subscribe(\"beforeshow\", function() {\n                h.set(this._layer.getRoot(), \"opacity\", 0);\n            }.bind(this)),this._layer.subscribe(\"show\", this._animate.bind(this)),];\n        },\n        disable: function() {\n            if (this._subscriptions) {\n                while (this._subscriptions.length) {\n                    this._subscriptions.pop().unsubscribe();;\n                };\n                this._subscriptions = null;\n            }\n        ;\n        },\n        _getDuration: function() {\n            return 100;\n        },\n        _animate: function() {\n            var l = this._layer.getRoot();\n            new g(l).from(\"opacity\", 0).to(\"opacity\", 1).duration(this._getDuration()).ondone(h.set.curry(l, \"opacity\", \"\")).go();\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerFormHooks\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n    h(i.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var j = this._layer.getRoot();\n            this._subscriptions = [g.listen(j, \"submit\", this._onSubmit.bind(this)),g.listen(j, \"success\", this._onSuccess.bind(this)),g.listen(j, \"error\", this._onError.bind(this)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(j) {\n                j.remove();\n            });\n            this._subscriptions = null;\n        },\n        _onSubmit: function(event) {\n            if ((this._layer.inform(\"submit\", event) === false)) {\n                event.kill();\n            };\n        },\n        _onSuccess: function(event) {\n            if ((this._layer.inform(\"success\", event) === false)) {\n                event.kill();\n            };\n        },\n        _onError: function(event) {\n            var j = event.getData();\n            if ((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false)) {\n                event.kill();\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerRefocusOnHide\", [\"copyProperties\",\"Focus\",\"ContextualThing\",\"DOM\",\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Focus\"), i = b(\"ContextualThing\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"Parent\");\n    function m(n) {\n        this._layer = n;\n    };\n    g(m.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(n, event) {\n            if (((document.activeElement === document.body) || k.contains(this._layer.getRoot(), document.activeElement))) {\n                var o = this._layer.getCausalElement();\n                while ((o && (!o.offsetWidth))) {\n                    var p = l.byClass(o, \"uiToggle\");\n                    if ((p && p.offsetWidth)) {\n                        o = j.scry(p, \"[rel=\\\"toggle\\\"]\")[0];\n                    }\n                     else {\n                        var q = i.getContext(o);\n                        if (q) {\n                            o = q;\n                        }\n                         else o = o.parentNode;\n                    ;\n                    }\n                ;\n                };\n                if ((o && ((o.tabIndex != -1)))) {\n                    h.setWithoutOutline(o);\n                };\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"LayerTabIsolation\", [\"TabIsolation\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TabIsolation\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n        this._tabIsolation = null;\n    };\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._tabIsolation = new g(this._layer.getRoot());\n            this._subscriptions = [this._layer.subscribe(\"show\", this._tabIsolation.enable.bind(this._tabIsolation)),this._layer.subscribe(\"hide\", this._tabIsolation.disable.bind(this._tabIsolation)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();;\n            };\n            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMDimensions\",\"DOMQuery\",\"ScrollAwareDOM\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"isAsyncScrollQuery\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"DOMQuery\"), n = b(\"ScrollAwareDOM\"), o = b(\"Style\"), p = b(\"URI\"), q = b(\"UserAgent\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"debounceAcrossTransitions\"), w = b(\"isAsyncScrollQuery\"), x = b(\"removeFromArray\"), y = [], z = null, aa = null, ba = null;\n    function ca() {\n        if (!ba) {\n            ba = m.scry(document.body, \".-cx-PRIVATE-fbLayout__root\")[0];\n        };\n        return ba;\n    };\n    function da(la) {\n        var ma = {\n            position: r.getScrollPosition()\n        }, na = (la.offsetTop - ma.position.y);\n        i.addClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n        o.set(la, \"top\", (na + \"px\"));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = (la.offsetTop - pa.delta.y);\n                o.set(la, \"top\", (qa + \"px\"));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if ((q.firefox() < 13)) {\n            ea.curry(la).defer();\n        };\n    };\n    function ea(la) {\n        m.scry(la, \"div.swfObject\").forEach(function(ma) {\n            var na = ma.getAttribute(\"data-swfid\");\n            if ((na && window[na])) {\n                var oa = window[na];\n                oa.addParam(\"autostart\", \"false\");\n                oa.addParam(\"autoplay\", \"false\");\n                oa.addParam(\"play\", \"false\");\n                oa.addVariable(\"video_autoplay\", \"0\");\n                oa.addVariable(\"autoplay\", \"0\");\n                oa.addVariable(\"play\", \"0\");\n                var pa = p(oa.getAttribute(\"swf\"));\n                pa.addQueryData({\n                    autoplay: \"0\"\n                });\n                pa.setPath(pa.getPath().replace(\"autoplay=1\", \"autoplay=0\"));\n                oa.setAttribute(\"swf\", pa.toString());\n                oa.write(ma);\n            }\n        ;\n        });\n    };\n    function fa(la, ma) {\n        var na = j.get(la, \"ModalLayerData\");\n        if (na) {\n            var oa = function() {\n                i.removeClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n                o.set(la, \"top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\n                }\n            ;\n                h.inform(\"reflow\");\n                na.listener.unsubscribe();\n                na.listener = null;\n                j.remove(la, \"ModalLayerData\");\n            };\n            if ((ma && w())) {\n                var pa = k.create(\"div\", {\n                    className: \"-cx-PRIVATE-ModalLayer__support\"\n                });\n                o.set(pa, \"height\", (la.offsetHeight + \"px\"));\n                k.appendContent(document.body, pa);\n                var qa = m.getDocumentScrollElement();\n                qa.scrollTop = na.position.y;\n                ma = false;\n                !function() {\n                    oa();\n                    k.remove(pa);\n                }.defer();\n            }\n             else oa();\n        ;\n        }\n    ;\n        if ((q.ie() < 7)) {\n            o.set(la, \"height\", \"\");\n        };\n    };\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"-cx-PRIVATE-ModalLayer__fixed\")) {\n            da(la);\n        };\n    };\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\n        };\n    };\n    function ia() {\n        var la;\n        if ((q.ie() < 7)) {\n            var ma = y[(y.length - 1)].getLayerRoot(), na = Math.max(ma.offsetHeight, ma.scrollHeight);\n            la = function(ta) {\n                o.set(ta, \"height\", (((-ta.offsetTop + na)) + \"px\"));\n            };\n        }\n    ;\n        var oa = y.length;\n        while (oa--) {\n            var pa = y[oa], qa = pa.getLayerRoot();\n            ja(qa, \"\");\n            var ra = pa.getLayerContentRoot(), sa = (ra.offsetWidth + l.measureElementBox(ra, \"width\", 0, 0, 1));\n            ja(qa, sa);\n            if ((la && (oa < (y.length - 1)))) {\n                la(qa);\n            };\n        };\n        (la && la(ca()));\n    };\n    function ja(la, ma) {\n        var na = (q.ie() < 7);\n        if (((na && ma) && (ma <= document.body.clientWidth))) {\n            ma = \"\";\n        };\n        o.set(la, (na ? \"width\" : \"min-width\"), (ma + ((ma ? \"px\" : \"\"))));\n    };\n    function ka(la) {\n        this._layer = la;\n    };\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return\n            };\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(la) {\n                ((la == \"show\") ? this._addModal() : this._removeModal());\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._addModal();\n            };\n        },\n        disable: function() {\n            if (!ca()) {\n                return\n            };\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\n            };\n        },\n        _addModal: function() {\n            i.addClass(this.getLayerRoot(), \"-cx-PRIVATE-ModalLayer__root\");\n            var la = y[(y.length - 1)];\n            if (la) {\n                da(la.getLayerRoot());\n            }\n             else ga();\n        ;\n            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if ((q.ie() < 7)) {\n                    i.addClass(document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                };\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\n            }\n        ;\n            y.push(this);\n            ia.defer();\n        },\n        _removeModal: function() {\n            var la = this.getLayerRoot();\n            i.removeClass(la, \"-cx-PRIVATE-ModalLayer__root\");\n            ja(la, \"\");\n            var ma = (this === y[(y.length - 1)]);\n            x(y, this);\n            var na = y[(y.length - 1)];\n            if (!na) {\n                z.remove();\n                z = null;\n                aa.unsubscribe();\n                aa = null;\n            }\n        ;\n            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if ((q.ie() < 7)) {\n                    i.removeClass(document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                }\n            ;\n            }.defer(400, false);\n        },\n        getLayerRoot: function() {\n            return this._layer.getRoot();\n        },\n        getLayerContentRoot: function() {\n            return this._layer.getContentRoot();\n        }\n    });\n    e.exports = ka;\n});\n__d(\"DialogPosition\", [\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = 40, i, j = {\n        calculateTopMargin: function(k, l) {\n            if (i) {\n                return i\n            };\n            var m = g.getViewportDimensions(), n = Math.floor(((((m.x + k)) * ((m.y - l))) / ((4 * m.x))));\n            return Math.max(n, h);\n        },\n        setFixedTopMargin: function(k) {\n            i = k;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DialogX\", [\"function-extensions\",\"JSXDOM\",\"Arbiter\",\"Class\",\"CSS\",\"DialogPosition\",\"Event\",\"Layer\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerFormHooks\",\"LayerRefocusOnHide\",\"LayerTabIsolation\",\"ModalLayer\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",\"debounce\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DialogPosition\"), l = b(\"Event\"), m = b(\"Layer\"), n = b(\"LayerAutoFocus\"), o = b(\"LayerButtons\"), p = b(\"LayerFormHooks\"), q = b(\"LayerRefocusOnHide\"), r = b(\"LayerTabIsolation\"), s = b(\"ModalLayer\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"copyProperties\"), w = b(\"cx\"), x = b(\"debounce\"), y = b(\"shield\");\n    function z(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n    i.extend(z, m);\n    v(z.prototype, {\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            j.addClass(this.getRoot(), \"-cx-PRIVATE-ModalLayer__xui\");\n            if (ba.autohide) {\n                var da = this.subscribe(\"show\", function() {\n                    da.unsubscribe();\n                    y(this.hide, this).defer(ba.autohide);\n                }.bind(this))\n            };\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([aa,s,n,o,p,r,q,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = (ba.xui ? \"-cx-PRIVATE-xuiDialog__content\" : \"-cx-PRIVATE-uiDialog__content\"), ea = (ba.xui ? \"-cx-PUBLIC-xuiDialog__wrapper\" : \"-cx-PUBLIC-uiDialog__wrapper\");\n            this._innerContent = g.div(null, ca);\n            this._wrapper = g.div({\n                className: ea,\n                role: \"dialog\",\n                \"aria-labelledby\": (ba.titleID || null)\n            }, g.div({\n                className: da\n            }, this._innerContent));\n            this.setWidth(ba.width);\n            return (g.div({\n                className: \"-cx-PRIVATE-uiDialog__positioner\",\n                role: \"dialog\"\n            }, this._wrapper));\n        },\n        getContentRoot: function() {\n            return this._wrapper;\n        },\n        getInnerContent: function() {\n            return this._innerContent;\n        },\n        updatePosition: function() {\n            var ba = u.getElementDimensions(this._wrapper), ca = k.calculateTopMargin(ba.x, ba.y);\n            t.set(this._wrapper, \"margin-top\", (ca + \"px\"));\n            this.inform(\"update_position\", {\n                type: \"DialogX\",\n                top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if ((ba === this._width)) {\n                return\n            };\n            this._width = ba;\n            t.set(this._wrapper, \"width\", (ba + \"px\"));\n        },\n        getWidth: function() {\n            return this._width;\n        }\n    });\n    function aa(ba) {\n        this._layer = ba;\n    };\n    v(aa.prototype, {\n        _subscription: null,\n        _resize: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(ba) {\n                if ((ba === \"show\")) {\n                    this._attach();\n                    h.inform(\"layer_shown\", {\n                        type: \"DialogX\"\n                    });\n                }\n                 else {\n                    this._detach();\n                    h.inform(\"layer_hidden\", {\n                        type: \"DialogX\"\n                    });\n                }\n            ;\n            }.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            (this._resize && this._detach());\n        },\n        _attach: function() {\n            this._layer.updatePosition();\n            this._resize = l.listen(window, \"resize\", x(this._layer.updatePosition.bind(this._layer)));\n        },\n        _detach: function() {\n            this._resize.remove();\n            this._resize = null;\n        }\n    });\n    e.exports = z;\n});\n__d(\"eachKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if ((!h || !i)) {\n            return\n        };\n        var k = Object.keys(h), l;\n        for (l = 0; (l < k.length); l++) {\n            i.call(j, k[l], h[k[l]], h, l);;\n        };\n    };\n    e.exports = g;\n});\n__d(\"LoadingDialogDimensions\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HEIGHT: 96,\n        WIDTH: 300\n    };\n    e.exports = g;\n});\n__d(\"AsyncDialog\", [\"AsyncRequest\",\"Bootloader\",\"CSS\",\"DialogX\",\"DOM\",\"Env\",\"Keys\",\"LayerFadeOnShow\",\"Parent\",\"React\",\"URI\",\"XUISpinner.react\",\"copyProperties\",\"cx\",\"eachKeyVal\",\"emptyFunction\",\"LoadingDialogDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DialogX\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"Keys\"), n = b(\"LayerFadeOnShow\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"URI\"), r = b(\"XUISpinner.react\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"eachKeyVal\"), v = b(\"emptyFunction\"), w = b(\"LoadingDialogDimensions\").WIDTH, x;\n    function y() {\n        if (!x) {\n            var ga = k.create(\"div\", {\n                className: \"-cx-PRIVATE-loadingDialog__spinnercontainer\"\n            });\n            x = new j({\n                width: w,\n                addedBehaviors: [n,],\n                xui: true\n            }, k.create(\"div\", null, ga));\n            p.renderComponent(r({\n                size: \"large\"\n            }), ga);\n            x.subscribe([\"key\",\"blur\",], function(ha, ia) {\n                if (((ha == \"blur\") || (((ha == \"key\") && (ia.keyCode == m.ESC))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            });\n        }\n    ;\n        return x;\n    };\n    var z = {\n    }, aa = 1, ba = [];\n    function ca() {\n        u(z, function(ga, ha) {\n            ha.abandon();\n            da(ga);\n        });\n    };\n    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\n        };\n    };\n    function ea(ga, ha) {\n        var ia = aa++;\n        ba[ia] = ha;\n        z[ia] = ga;\n        var ja = da.curry((\"\" + ia));\n        s(ga.getData(), {\n            __asyncDialog: ia\n        });\n        y().setCausalElement(ga.getRelativeTo()).show();\n        var ka = ga.finallyHandler;\n        ga.setFinallyHandler(function(la) {\n            var ma = la.getPayload();\n            if ((ma && ma.asyncURL)) {\n                fa.send(new g(ma.asyncURL));\n            };\n            ja();\n            (ka && ka(la));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\n    };\n    var fa = {\n        send: function(ga, ha) {\n            ea(ga, (ha || v));\n        },\n        bootstrap: function(ga, ha, ia) {\n            if (!ga) {\n                return\n            };\n            var ja = (o.byClass(ha, \"stat_elem\") || ha);\n            if ((ja && i.hasClass(ja, \"async_saving\"))) {\n                return false\n            };\n            var ka = new q(ga).getQueryData(), la = (ia === \"dialog\"), ma = new g().setURI(ga).setData(ka).setMethod((la ? \"GET\" : \"POST\")).setReadOnly(la).setRelativeTo(ha).setStatusElement(ja).setNectarModuleDataSafe(ha);\n            if (l.is_desktop) {\n                h.loadModules([\"FbdDialogProvider\",], function(na) {\n                    na.sendDialog(ma, fa.send);\n                });\n                return;\n            }\n        ;\n            fa.send(ma);\n        },\n        respond: function(ga, ha) {\n            var ia = ba[ga];\n            if (ia) {\n                ia(ha);\n                delete ba[ga];\n            }\n        ;\n        },\n        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"MenuTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        className: \"-cx-PRIVATE-uiMenu__root\"\n    };\n});\n__d(\"BanzaiODS\", [\"Banzai\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"invariant\");\n    function i() {\n        var k = {\n        }, l = {\n        };\n        function m(n, o, p, q) {\n            if ((p === undefined)) {\n                p = 1;\n            };\n            if ((q === undefined)) {\n                q = 1;\n            };\n            if ((n in l)) {\n                if ((l[n] <= 0)) {\n                    return;\n                }\n                 else p /= l[n];\n            \n            };\n            var r = (k[n] || (k[n] = {\n            })), s = (r[o] || (r[o] = [0,]));\n            p = Number(p);\n            q = Number(q);\n            if ((!isFinite(p) || !isFinite(q))) {\n                return\n            };\n            s[0] += p;\n            if ((arguments.length >= 4)) {\n                if (!s[1]) {\n                    s[1] = 0;\n                };\n                s[1] += q;\n            }\n        ;\n        };\n        return {\n            setEntitySample: function(n, o) {\n                l[n] = ((Math.random() < o) ? o : 0);\n            },\n            bumpEntityKey: function(n, o, p) {\n                m(n, o, p);\n            },\n            bumpFraction: function(n, o, p, q) {\n                m(n, o, p, q);\n            },\n            flush: function(n) {\n                for (var o in k) {\n                    g.post((\"ods:\" + o), k[o], n);;\n                };\n                k = {\n                };\n            }\n        };\n    };\n    var j = i();\n    j.create = i;\n    g.subscribe(g.SEND, j.flush.bind(j, null));\n    e.exports = j;\n});\n__d(\"arrayContains\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return (h.indexOf(i) != -1);\n    };\n    e.exports = g;\n});");
// 5062
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"safe1dc0686fd0ec733696cd5bd87cc5a6bc0fea2");
// 5063
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"AVmr9\",]);\n}\n;\n;\n__d(\"ChatConfig\", [\"ChatConfigInitialData\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfigInitialData\"), h = b(\"copyProperties\"), i = {\n    }, j = {\n        get: function(k, l) {\n            return ((((k in i)) ? i[k] : l));\n        },\n        set: function(k) {\n            if (((arguments.length > 1))) {\n                var l = {\n                };\n                l[k] = arguments[1];\n                k = l;\n            }\n        ;\n        ;\n            h(i, k);\n        },\n        getDebugInfo: function() {\n            return i;\n        }\n    };\n    j.set(g);\n    e.exports = j;\n});\n__d(\"XUISpinner.react\", [\"BrowserSupport\",\"ReactPropTypes\",\"React\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = b(\"tx\"), l = g.hasCSSAnimations(), m = i.createClass({\n        displayName: \"XUISpinner\",\n        propTypes: {\n            size: h.oneOf([\"small\",\"large\",]),\n            background: h.oneOf([\"light\",\"dark\",])\n        },\n        getDefaultProps: function() {\n            return {\n                size: \"small\",\n                background: \"light\"\n            };\n        },\n        render: function() {\n            var n = (((((((((((\"-cx-PRIVATE-xuiSpinner__root\") + ((((this.props.size == \"small\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__small\")) : \"\")))) + ((((this.props.size == \"large\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__large\")) : \"\")))) + ((((this.props.background == \"light\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__light\")) : \"\")))) + ((((this.props.background == \"dark\")) ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__dark\")) : \"\")))) + ((!l ? ((\" \" + \"-cx-PRIVATE-xuiSpinner__animatedgif\")) : \"\"))));\n            return this.transferPropsTo(i.DOM.span({\n                className: n\n            }, \"Loading...\"));\n        }\n    });\n    e.exports = m;\n});\n__d(\"ViewportBounds\", [\"Style\",\"Vector\",\"emptyFunction\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"Vector\"), i = b(\"emptyFunction\"), j = b(\"ge\"), k = b(\"removeFromArray\"), l = {\n        JSBNG__top: [],\n        right: [],\n        bottom: [],\n        left: []\n    };\n    function m(q) {\n        return function() {\n            var r = 0;\n            l[q].forEach(function(s) {\n                r = Math.max(r, s.getSize());\n            });\n            return r;\n        };\n    };\n;\n    function n(q) {\n        return function(r) {\n            return new o(q, r);\n        };\n    };\n;\n    function o(q, r) {\n        this.getSide = i.thatReturns(q);\n        this.getSize = function() {\n            return ((((typeof r === \"function\")) ? r() : r));\n        };\n        l[q].push(this);\n    };\n;\n    o.prototype.remove = function() {\n        k(l[this.getSide()], this);\n    };\n    var p = {\n        getTop: m(\"JSBNG__top\"),\n        getRight: m(\"right\"),\n        getBottom: m(\"bottom\"),\n        getLeft: m(\"left\"),\n        getElementPosition: function(q) {\n            var r = h.getElementPosition(q);\n            r.y -= p.getTop();\n            return r;\n        },\n        addTop: n(\"JSBNG__top\"),\n        addRight: n(\"right\"),\n        addBottom: n(\"bottom\"),\n        addLeft: n(\"left\")\n    };\n    p.addTop(function() {\n        var q = j(\"blueBar\");\n        if (((q && g.isFixed(q)))) {\n            return j(\"blueBarHolder\").offsetHeight;\n        }\n    ;\n    ;\n        return 0;\n    });\n    e.exports = p;\n});\n__d(\"isAsyncScrollQuery\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = null;\n    function i() {\n        if (((h === null))) {\n            h = ((((((g.osx() >= 10.8)) && ((g.webkit() >= 536.25)))) && !g.chrome()));\n        }\n    ;\n    ;\n        return h;\n    };\n;\n    e.exports = i;\n});\n__d(\"ScrollAwareDOM\", [\"ArbiterMixin\",\"JSBNG__CSS\",\"DOM\",\"DOMDimensions\",\"DOMPosition\",\"DOMQuery\",\"HTML\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"DOMPosition\"), l = b(\"DOMQuery\"), m = b(\"HTML\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"isAsyncScrollQuery\");\n    function r(w, x) {\n        return function() {\n            v.monitor(arguments[w], x.curry.apply(x, arguments));\n        };\n    };\n;\n    function s(w) {\n        if (!((w instanceof Array))) {\n            w = [w,];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); x++) {\n            var y = m.replaceJSONWrapper(w[x]);\n            if (((y instanceof m))) {\n                return y.getRootNode();\n            }\n             else if (i.isNode(y)) {\n                return y;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function t(w) {\n        return ((k.getElementPosition(w).y > o.getTop()));\n    };\n;\n    function u(w) {\n        var x = ((k.getElementPosition(w).y + j.getElementDimensions(w).height)), y = ((j.getViewportDimensions().height - o.getBottom()));\n        return ((x >= y));\n    };\n;\n    var v = p({\n        monitor: function(w, x) {\n            if (q()) {\n                return x();\n            }\n        ;\n        ;\n            var y = s(w);\n            if (y) {\n                var z = !!y.offsetParent;\n                if (((z && ((t(y) || u(y)))))) {\n                    return x();\n                }\n            ;\n            ;\n                var aa = n.getDocumentDimensions(), ba = x();\n                if (((z || ((y.offsetParent && !t(y)))))) {\n                    var ca = n.getDocumentDimensions().sub(aa), da = {\n                        delta: ca,\n                        target: y\n                    };\n                    if (((v.inform(\"JSBNG__scroll\", da) !== false))) {\n                        ca.scrollElementBy(l.getDocumentScrollElement());\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                return ba;\n            }\n             else return x()\n        ;\n        },\n        replace: function(w, x) {\n            var y = s(x);\n            if (((!y || h.hasClass(y, \"hidden_elem\")))) {\n                y = w;\n            }\n        ;\n        ;\n            return v.monitor(y, function() {\n                i.replace(w, x);\n            });\n        },\n        prependContent: r(1, i.prependContent),\n        insertAfter: r(1, i.insertAfter),\n        insertBefore: r(1, i.insertBefore),\n        setContent: r(0, i.setContent),\n        appendContent: r(1, i.appendContent),\n        remove: r(0, i.remove),\n        empty: r(0, i.empty)\n    }, g);\n    e.exports = v;\n});\n__d(\"legacy:ScrollAwareDOM\", [\"ScrollAwareDOM\",], function(a, b, c, d) {\n    a.ScrollAwareDOM = b(\"ScrollAwareDOM\");\n}, 3);\n__d(\"legacy:css\", [\"JSBNG__CSS\",], function(a, b, c, d) {\n    a.JSBNG__CSS = b(\"JSBNG__CSS\");\n}, 3);\n__d(\"FBDesktopDetect\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = \"facebook.desktopplugin\", i = {\n        mimeType: \"application/x-facebook-desktop-1\",\n        isPluginInstalled: function() {\n            if (g.osx()) {\n                return false;\n            }\n        ;\n        ;\n            var j = null;\n            if (a.ActiveXObject) {\n                try {\n                    j = new a.ActiveXObject(h);\n                    if (j) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (k) {\n                \n                };\n            ;\n            }\n             else if (((a.JSBNG__navigator && a.JSBNG__navigator.plugins))) {\n                a.JSBNG__navigator.plugins.refresh(false);\n                for (var l = 0, m = a.JSBNG__navigator.plugins.length; ((l < m)); l++) {\n                    j = a.JSBNG__navigator.plugins[l];\n                    if (((j.length && ((j[0].type === this.mimeType))))) {\n                        return true;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n            \n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"FlipDirectionOnKeypress\", [\"JSBNG__Event\",\"DOM\",\"Input\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Input\"), j = b(\"Style\");\n    function k(JSBNG__event) {\n        var l = JSBNG__event.getTarget(), m = ((h.isNodeOfType(l, \"input\") && ((l.type == \"text\")))), n = h.isNodeOfType(l, \"textarea\");\n        if (((!((m || n)) || l.getAttribute(\"data-prevent-auto-flip\")))) {\n            return;\n        }\n    ;\n    ;\n        var o = i.getValue(l), p = ((l.style && l.style.direction));\n        if (!p) {\n            var q = 0, r = true;\n            for (var s = 0; ((s < o.length)); s++) {\n                var t = o.charCodeAt(s);\n                if (((t >= 48))) {\n                    if (r) {\n                        r = false;\n                        q++;\n                    }\n                ;\n                ;\n                    if (((((t >= 1470)) && ((t <= 1920))))) {\n                        j.set(l, \"direction\", \"rtl\");\n                        return;\n                    }\n                ;\n                ;\n                    if (((q == 5))) {\n                        j.set(l, \"direction\", \"ltr\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else r = true;\n            ;\n            ;\n            };\n        ;\n        }\n         else if (((o.length === 0))) {\n            j.set(l, \"direction\", \"\");\n        }\n        \n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, {\n        keyup: k,\n        input: k\n    });\n});\n__d(\"PlaceholderOnsubmitFormListener\", [\"JSBNG__Event\",\"Input\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Input\");\n    g.listen(JSBNG__document.documentElement, \"submit\", function(i) {\n        var j = i.getTarget().getElementsByTagName(\"*\");\n        for (var k = 0; ((k < j.length)); k++) {\n            if (((j[k].getAttribute(\"placeholder\") && h.isEmpty(j[k])))) {\n                h.setValue(j[k], \"\");\n            }\n        ;\n        ;\n        };\n    ;\n    });\n});\n__d(\"EagleEye\", [\"Arbiter\",\"Env\",\"OnloadEvent\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"OnloadEvent\"), j = b(\"isInIframe\"), k = ((h.eagleEyeConfig || {\n    })), l = \"_e_\", m = ((window.JSBNG__name || \"\")).toString();\n    if (((((m.length == 7)) && ((m.substr(0, 3) == l))))) {\n        m = m.substr(3);\n    }\n     else {\n        m = k.seed;\n        if (!j()) {\n            window.JSBNG__name = ((l + m));\n        }\n    ;\n    ;\n    }\n;\n;\n    var n = ((((((window.JSBNG__location.protocol == \"https:\")) && JSBNG__document.cookie.match(/\\bcsm=1/))) ? \"; secure\" : \"\")), o = ((((l + m)) + \"_\")), p = new JSBNG__Date(((JSBNG__Date.now() + 604800000))).toGMTString(), q = window.JSBNG__location.hostname.replace(/^.*(facebook\\..*)$/i, \"$1\"), r = ((((((((\"; expires=\" + p)) + \";path=/; domain=\")) + q)) + n)), s = 0, t, u = ((k.JSBNG__sessionStorage && a.JSBNG__sessionStorage)), v = JSBNG__document.cookie.length, w = false, x = JSBNG__Date.now();\n    function y(ca) {\n        return ((((((((o + (s++))) + \"=\")) + encodeURIComponent(ca))) + r));\n    };\n;\n    function z() {\n        var ca = [], da = false, ea = 0, fa = 0;\n        this.isEmpty = function() {\n            return !ca.length;\n        };\n        this.enqueue = function(ga, ha) {\n            if (ha) {\n                ca.unshift(ga);\n            }\n             else ca.push(ga);\n        ;\n        ;\n        };\n        this.dequeue = function() {\n            ca.shift();\n        };\n        this.peek = function() {\n            return ca[0];\n        };\n        this.clear = function(ga) {\n            v = Math.min(v, JSBNG__document.cookie.length);\n            if (((!w && ((((new JSBNG__Date() - x)) > 60000))))) {\n                w = true;\n            }\n        ;\n        ;\n            var ha = ((!ga && ((JSBNG__document.cookie.search(l) >= 0)))), ia = !!h.cookie_header_limit, ja = ((h.cookie_count_limit || 19)), ka = ((h.cookie_header_limit || 3950)), la = ((ja - 5)), ma = ((ka - 1000));\n            while (!this.isEmpty()) {\n                var na = y(this.peek());\n                if (((ia && ((((na.length > ka)) || ((w && ((((na.length + v)) > ka))))))))) {\n                    this.dequeue();\n                    continue;\n                }\n            ;\n            ;\n                if (((((ha || ia)) && ((((((JSBNG__document.cookie.length + na.length)) > ka)) || ((JSBNG__document.cookie.split(\";\").length > ja))))))) {\n                    break;\n                }\n            ;\n            ;\n                JSBNG__document.cookie = na;\n                ha = true;\n                this.dequeue();\n            };\n        ;\n            var oa = JSBNG__Date.now();\n            if (((ga || ((((((((!da && ha)) && ((((fa > 0)) && ((((Math.min(((10 * Math.pow(2, ((fa - 1))))), 60000) + ea)) < oa)))))) && g.query(i.ONLOAD))) && ((((!this.isEmpty() || ((JSBNG__document.cookie.length > ma)))) || ((JSBNG__document.cookie.split(\";\").length > la))))))))) {\n                var pa = new JSBNG__Image(), qa = this, ra = ((h.tracking_domain || \"\"));\n                da = true;\n                pa.JSBNG__onload = function ua() {\n                    da = false;\n                    fa = 0;\n                    qa.clear();\n                };\n                pa.JSBNG__onerror = pa.JSBNG__onabort = function ua() {\n                    da = false;\n                    ea = JSBNG__Date.now();\n                    fa++;\n                };\n                var sa = ((h.fb_isb ? ((\"&fb_isb=\" + h.fb_isb)) : \"\")), ta = ((\"&__user=\" + h.user));\n                pa.src = ((((((((((((((ra + \"/ajax/nectar.php?asyncSignal=\")) + ((Math.floor(((Math.JSBNG__random() * 10000))) + 1)))) + sa)) + ta)) + \"&\")) + ((!ga ? \"\" : \"s=\")))) + oa));\n            }\n        ;\n        ;\n        };\n    };\n;\n    t = new z();\n    if (u) {\n        var aa = function() {\n            var ca = 0, da = ca;\n            function ea() {\n                var ha = JSBNG__sessionStorage.getItem(\"_e_ids\");\n                if (ha) {\n                    var ia = ((ha + \"\")).split(\";\");\n                    if (((ia.length == 2))) {\n                        ca = parseInt(ia[0], 10);\n                        da = parseInt(ia[1], 10);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            function fa() {\n                var ha = ((((ca + \";\")) + da));\n                JSBNG__sessionStorage.setItem(\"_e_ids\", ha);\n            };\n        ;\n            function ga(ha) {\n                return ((\"_e_\" + ((((ha !== undefined)) ? ha : ca++))));\n            };\n        ;\n            this.isEmpty = function() {\n                return ((da === ca));\n            };\n            this.enqueue = function(ha, ia) {\n                var ja = ((ia ? ga(--da) : ga()));\n                JSBNG__sessionStorage.setItem(ja, ha);\n                fa();\n            };\n            this.dequeue = function() {\n                this.isEmpty();\n                JSBNG__sessionStorage.removeItem(ga(da));\n                da++;\n                fa();\n            };\n            this.peek = function() {\n                var ha = JSBNG__sessionStorage.getItem(ga(da));\n                return ((ha ? ((ha + \"\")) : ha));\n            };\n            this.clear = t.clear;\n            ea();\n        };\n        t = new aa();\n    }\n;\n;\n    var ba = {\n        log: function(ca, da, ea) {\n            if (h.no_cookies) {\n                return;\n            }\n        ;\n        ;\n            var fa = [m,JSBNG__Date.now(),ca,].concat(da);\n            fa.push(fa.length);\n            function ga() {\n                var ha = JSON.stringify(fa);\n                try {\n                    t.enqueue(ha, !!ea);\n                    t.clear(!!ea);\n                } catch (ia) {\n                    if (((u && ((ia.code === 1000))))) {\n                        t = new z();\n                        u = false;\n                        ga();\n                    }\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            ga();\n        },\n        getSessionID: function() {\n            return m;\n        }\n    };\n    e.exports = ba;\n    a.EagleEye = ba;\n}, 3);\n__d(\"ScriptPathState\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h, i, j, k, l = 100, m = {\n        setIsUIPageletRequest: function(n) {\n            j = n;\n        },\n        setUserURISampleRate: function(n) {\n            k = n;\n        },\n        reset: function() {\n            h = null;\n            i = false;\n            j = false;\n        },\n        _shouldUpdateScriptPath: function() {\n            return ((i && !j));\n        },\n        _shouldSendURI: function() {\n            return ((Math.JSBNG__random() < k));\n        },\n        getParams: function() {\n            var n = {\n            };\n            if (m._shouldUpdateScriptPath()) {\n                if (((m._shouldSendURI() && ((h !== null))))) {\n                    n.user_uri = h.substring(0, l);\n                }\n            ;\n            ;\n            }\n             else n.no_script_path = 1;\n        ;\n        ;\n            return n;\n        }\n    };\n    g.subscribe(\"pre_page_transition\", function(n, o) {\n        i = true;\n        h = o.to.getUnqualifiedURI().toString();\n    });\n    e.exports = a.ScriptPathState = m;\n});\n__d(\"goOrReplace\", [\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"UserAgent\");\n    function i(j, k, l) {\n        var m = new g(k), n = a.Quickling;\n        if (((((((((((j.pathname == \"/\")) && ((m.getPath() != \"/\")))) && n)) && n.isActive())) && n.isPageActive(m)))) {\n            var o = ((j.search ? {\n            } : {\n                q: \"\"\n            }));\n            m = new g().setPath(\"/\").setQueryData(o).setFragment(m.getUnqualifiedURI().toString());\n            k = m.toString();\n        }\n    ;\n    ;\n        if (((l && !((h.ie() < 8))))) {\n            j.replace(k);\n        }\n         else if (((j.href == k))) {\n            j.reload();\n        }\n         else j.href = k;\n        \n    ;\n    ;\n    };\n;\n    e.exports = i;\n});\n__d(\"AjaxPipeRequest\", [\"Arbiter\",\"AsyncRequest\",\"BigPipe\",\"JSBNG__CSS\",\"DOM\",\"Env\",\"PageletSet\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"goOrReplace\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BigPipe\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"PageletSet\"), n = b(\"ScriptPathState\"), o = b(\"URI\"), p = b(\"copyProperties\"), q = b(\"goOrReplace\"), r = b(\"ge\"), s;\n    function t(w, x) {\n        var y = r(w);\n        if (!y) {\n            return;\n        }\n    ;\n    ;\n        if (!x) {\n            y.style.minHeight = \"600px\";\n        }\n    ;\n    ;\n        var z = m.getPageletIDs();\n        for (var aa = 0; ((aa < z.length)); aa++) {\n            var ba = z[aa];\n            if (k.contains(y, ba)) {\n                m.removePagelet(ba);\n            }\n        ;\n        ;\n        };\n    ;\n        k.empty(y);\n        g.inform(\"pagelet/destroy\", {\n            id: null,\n            root: y\n        });\n    };\n;\n    function u(w, x) {\n        var y = r(w);\n        if (((y && !x))) {\n            y.style.minHeight = \"100px\";\n        }\n    ;\n    ;\n    };\n;\n    function v(w, x) {\n        this._uri = w;\n        this._query_data = x;\n        this._request = new h();\n        this._canvas_id = null;\n        this._allow_cross_page_transition = true;\n    };\n;\n    p(v.prototype, {\n        setCanvasId: function(w) {\n            this._canvas_id = w;\n            return this;\n        },\n        setURI: function(w) {\n            this._uri = w;\n            return this;\n        },\n        setData: function(w) {\n            this._query_data = w;\n            return this;\n        },\n        getData: function(w) {\n            return this._query_data;\n        },\n        setAllowCrossPageTransition: function(w) {\n            this._allow_cross_page_transition = w;\n            return this;\n        },\n        setAppend: function(w) {\n            this._append = w;\n            return this;\n        },\n        send: function() {\n            var w = {\n                ajaxpipe: 1,\n                ajaxpipe_token: l.ajaxpipe_token\n            };\n            p(w, n.getParams());\n            n.reset();\n            this._request.setOption(\"useIframeTransport\", true).setURI(this._uri).setData(p(w, this._query_data)).setPreBootloadHandler(this._preBootloadHandler.bind(this)).setInitialHandler(this._onInitialResponse.bind(this)).setHandler(this._onResponse.bind(this)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(this._allow_cross_page_transition);\n            if (this._automatic) {\n                this._relevantRequest = s;\n            }\n             else s = this._request;\n        ;\n        ;\n            this._request.send();\n            return this;\n        },\n        _preBootloadFirstResponse: function(w) {\n            return false;\n        },\n        _fireDomContentCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/domcontent_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _fireOnloadCallback: function() {\n            this._arbiter.inform(\"ajaxpipe/onload_callback\", true, g.BEHAVIOR_STATE);\n        },\n        _isRelevant: function(w) {\n            return ((((((this._request == s)) || ((this._automatic && ((this._relevantRequest == s)))))) || this._jsNonBlock));\n        },\n        _preBootloadHandler: function(w) {\n            var x = w.getPayload();\n            if (((((!x || x.redirect)) || !this._isRelevant(w)))) {\n                return false;\n            }\n        ;\n        ;\n            var y = false;\n            if (w.is_first) {\n                ((((!this._append && !this._displayCallback)) && t(this._canvas_id, this._constHeight)));\n                this._arbiter = new g();\n                y = this._preBootloadFirstResponse(w);\n                this.pipe = new i({\n                    arbiter: this._arbiter,\n                    rootNodeID: this._canvas_id,\n                    lid: this._request.lid,\n                    isAjax: true,\n                    domContentCallback: this._fireDomContentCallback.bind(this),\n                    onloadCallback: this._fireOnloadCallback.bind(this),\n                    domContentEvt: \"ajaxpipe/domcontent_callback\",\n                    onloadEvt: \"ajaxpipe/onload_callback\",\n                    jsNonBlock: this._jsNonBlock,\n                    automatic: this._automatic,\n                    displayCallback: this._displayCallback\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        _redirect: function(w) {\n            if (w.redirect) {\n                if (((w.force || !this.isPageActive(w.redirect)))) {\n                    var x = [\"ajaxpipe\",\"ajaxpipe_token\",].concat(this.getSanitizedParameters());\n                    q(window.JSBNG__location, o(w.redirect).removeQueryData(x), true);\n                }\n                 else {\n                    var y = a.PageTransitions;\n                    y.go(w.redirect, true);\n                }\n            ;\n            ;\n                return true;\n            }\n             else return false\n        ;\n        },\n        isPageActive: function(w) {\n            return true;\n        },\n        getSanitizedParameters: function() {\n            return [];\n        },\n        _versionCheck: function(w) {\n            return true;\n        },\n        _onInitialResponse: function(w) {\n            var x = w.getPayload();\n            if (!this._isRelevant(w)) {\n                return false;\n            }\n        ;\n        ;\n            if (!x) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._redirect(x) || !this._versionCheck(x)))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        _processFirstResponse: function(w) {\n            var x = w.getPayload();\n            if (((r(this._canvas_id) && ((x.canvas_class != null))))) {\n                j.setClass(this._canvas_id, x.canvas_class);\n            }\n        ;\n        ;\n        },\n        setFirstResponseCallback: function(w) {\n            this._firstResponseCallback = w;\n            return this;\n        },\n        setFirstResponseHandler: function(w) {\n            this._processFirstResponse = w;\n            return this;\n        },\n        _onResponse: function(w) {\n            var x = w.payload;\n            if (!this._isRelevant(w)) {\n                return h.suppressOnloadToken;\n            }\n        ;\n        ;\n            if (w.is_first) {\n                this._processFirstResponse(w);\n                ((this._firstResponseCallback && this._firstResponseCallback()));\n                x.provides = ((x.provides || []));\n                x.provides.push(\"uipage_onload\");\n                if (this._append) {\n                    x.append = this._canvas_id;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (x) {\n                if (((((((\"JSBNG__content\" in x.JSBNG__content)) && ((this._canvas_id !== null)))) && ((this._canvas_id != \"JSBNG__content\"))))) {\n                    x.JSBNG__content[this._canvas_id] = x.JSBNG__content.JSBNG__content;\n                    delete x.JSBNG__content.JSBNG__content;\n                }\n            ;\n            ;\n                this.pipe.onPageletArrive(x);\n            }\n        ;\n        ;\n            if (w.is_last) {\n                u(this._canvas_id, this._constHeight);\n            }\n        ;\n        ;\n            return h.suppressOnloadToken;\n        },\n        setNectarModuleDataSafe: function(w) {\n            this._request.setNectarModuleDataSafe(w);\n            return this;\n        },\n        setFinallyHandler: function(w) {\n            this._request.setFinallyHandler(w);\n            return this;\n        },\n        setErrorHandler: function(w) {\n            this._request.setErrorHandler(w);\n            return this;\n        },\n        abort: function() {\n            this._request.abort();\n            if (((s == this._request))) {\n                s = null;\n            }\n        ;\n        ;\n            this._request = null;\n            return this;\n        },\n        setJSNonBlock: function(w) {\n            this._jsNonBlock = w;\n            return this;\n        },\n        setAutomatic: function(w) {\n            this._automatic = w;\n            return this;\n        },\n        setDisplayCallback: function(w) {\n            this._displayCallback = w;\n            return this;\n        },\n        setConstHeight: function(w) {\n            this._constHeight = w;\n            return this;\n        },\n        getAsyncRequest: function() {\n            return this._request;\n        }\n    });\n    p(v, {\n        getCurrentRequest: function() {\n            return s;\n        },\n        setCurrentRequest: function(w) {\n            s = w;\n        }\n    });\n    e.exports = v;\n});\n__d(\"AsyncRequestNectarLogging\", [\"AsyncRequest\",\"Nectar\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Nectar\"), i = b(\"copyProperties\");\n    i(g.prototype, {\n        setNectarModuleData: function(j) {\n            if (((this.method == \"POST\"))) {\n                h.addModuleData(this.data, j);\n            }\n        ;\n        ;\n        },\n        setNectarImpressionId: function() {\n            if (((this.method == \"POST\"))) {\n                h.addImpressionID(this.data);\n            }\n        ;\n        ;\n        }\n    });\n});\n__d(\"CSSClassTransition\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = [];\n    function i() {\n    \n    };\n;\n    g(i, {\n        go: function(j, k, l, m) {\n            var n;\n            for (var o = 0; ((o < h.length)); o++) {\n                if (((h[o](j, k, l, m) === true))) {\n                    n = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!n) {\n                j.className = k;\n            }\n        ;\n        ;\n        },\n        registerHandler: function(j) {\n            h.push(j);\n            return {\n                remove: function() {\n                    var k = h.indexOf(j);\n                    if (((k >= 0))) {\n                        h.splice(k, 1);\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    });\n    e.exports = i;\n});\n__d(\"DOMClone\", [], function(a, b, c, d, e, f) {\n    var g = {\n        shallowClone: function(i) {\n            return h(i, false);\n        },\n        deepClone: function(i) {\n            return h(i, true);\n        }\n    };\n    function h(i, j) {\n        var k = i.cloneNode(j);\n        if (((typeof k.__FB_TOKEN !== \"undefined\"))) {\n            delete k.__FB_TOKEN;\n        }\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = g;\n});\n__d(\"DOMScroll\", [\"Animation\",\"Arbiter\",\"DOM\",\"DOMQuery\",\"Vector\",\"ViewportBounds\",\"ge\",\"isAsyncScrollQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Vector\"), l = b(\"ViewportBounds\"), m = b(\"ge\"), n = b(\"isAsyncScrollQuery\"), o = {\n        SCROLL: \"dom-scroll\",\n        getScrollState: function() {\n            var p = k.getViewportDimensions(), q = k.getDocumentDimensions(), r = ((q.x > p.x)), s = ((q.y > p.y));\n            r += 0;\n            s += 0;\n            return new k(r, s);\n        },\n        _scrollbarSize: null,\n        _initScrollbarSize: function() {\n            var p = i.create(\"p\");\n            p.style.width = \"100%\";\n            p.style.height = \"200px\";\n            var q = i.create(\"div\");\n            q.style.position = \"absolute\";\n            q.style.JSBNG__top = \"0px\";\n            q.style.left = \"0px\";\n            q.style.visibility = \"hidden\";\n            q.style.width = \"200px\";\n            q.style.height = \"150px\";\n            q.style.overflow = \"hidden\";\n            q.appendChild(p);\n            JSBNG__document.body.appendChild(q);\n            var r = p.offsetWidth;\n            q.style.overflow = \"JSBNG__scroll\";\n            var s = p.offsetWidth;\n            if (((r == s))) {\n                s = q.clientWidth;\n            }\n        ;\n        ;\n            JSBNG__document.body.removeChild(q);\n            o._scrollbarSize = ((r - s));\n        },\n        getScrollbarSize: function() {\n            if (((o._scrollbarSize === null))) {\n                o._initScrollbarSize();\n            }\n        ;\n        ;\n            return o._scrollbarSize;\n        },\n        JSBNG__scrollTo: function(p, q, r, s, t) {\n            if (((((typeof q == \"undefined\")) || ((q === true))))) {\n                q = 750;\n            }\n        ;\n        ;\n            if (n()) {\n                q = false;\n            }\n        ;\n        ;\n            if (!((p instanceof k))) {\n                var u = k.getScrollPosition().x, v = k.getElementPosition(m(p)).y;\n                p = new k(u, v, \"JSBNG__document\");\n                if (!s) {\n                    p.y -= ((l.getTop() / ((r ? 2 : 1))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (r) {\n                p.y -= ((k.getViewportDimensions().y / 2));\n            }\n             else if (s) {\n                p.y -= k.getViewportDimensions().y;\n                p.y += s;\n            }\n            \n        ;\n        ;\n            p = p.convertTo(\"JSBNG__document\");\n            if (q) {\n                return new g(JSBNG__document.body).to(\"scrollTop\", p.y).to(\"scrollLeft\", p.x).ease(g.ease.end).duration(q).ondone(t).go();\n            }\n             else if (window.JSBNG__scrollTo) {\n                window.JSBNG__scrollTo(p.x, p.y);\n                ((t && t()));\n            }\n            \n        ;\n        ;\n            h.inform(o.SCROLL);\n        },\n        ensureVisible: function(p, q, r, s, t) {\n            if (((r === undefined))) {\n                r = 10;\n            }\n        ;\n        ;\n            p = m(p);\n            if (q) {\n                p = j.JSBNG__find(p, q);\n            }\n        ;\n        ;\n            var u = k.getScrollPosition().x, v = k.getScrollPosition().y, w = ((v + k.getViewportDimensions().y)), x = k.getElementPosition(p).y, y = ((x + k.getElementDimensions(p).y));\n            x -= l.getTop();\n            x -= r;\n            y += r;\n            if (((x < v))) {\n                o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n            }\n             else if (((y > w))) {\n                if (((((x - ((y - w)))) < v))) {\n                    o.JSBNG__scrollTo(new k(u, x, \"JSBNG__document\"), s, false, false, t);\n                }\n                 else o.JSBNG__scrollTo(new k(u, y, \"JSBNG__document\"), s, false, true, t);\n            ;\n            }\n            \n        ;\n        ;\n        },\n        scrollToTop: function(p) {\n            var q = k.getScrollPosition();\n            o.JSBNG__scrollTo(new k(q.x, 0, \"JSBNG__document\"), ((p !== false)));\n        }\n    };\n    e.exports = o;\n});\n__d(\"Button\", [\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Parent\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = \"uiButtonDisabled\", o = \"uiButtonDepressed\", p = \"-cx-PUBLIC-abstractButton__disabled\", q = \"-cx-PUBLIC-abstractButton__depressed\", r = \"button:blocker\", s = \"href\", t = \"ajaxify\";\n    function u(aa, ba) {\n        var ca = h.get(aa, r);\n        if (ba) {\n            if (ca) {\n                ca.remove();\n                h.remove(aa, r);\n            }\n        ;\n        ;\n        }\n         else if (!ca) {\n            h.set(aa, r, j.listen(aa, \"click\", m.thatReturnsFalse, j.Priority.URGENT));\n        }\n        \n    ;\n    ;\n    };\n;\n    function v(aa) {\n        var ba = ((k.byClass(aa, \"uiButton\") || k.byClass(aa, \"-cx-PRIVATE-abstractButton__root\")));\n        if (!ba) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function w(aa) {\n        return i.isNodeOfType(aa, \"a\");\n    };\n;\n    function x(aa) {\n        return i.isNodeOfType(aa, \"button\");\n    };\n;\n    function y(aa) {\n        return g.hasClass(aa, \"-cx-PRIVATE-abstractButton__root\");\n    };\n;\n    var z = {\n        getInputElement: function(aa) {\n            aa = v(aa);\n            if (w(aa)) {\n                throw new Error(\"invalid use case\");\n            }\n        ;\n        ;\n            return ((x(aa) ? aa : i.JSBNG__find(aa, \"input\")));\n        },\n        isEnabled: function(aa) {\n            return !((g.hasClass(v(aa), n) || g.hasClass(v(aa), p)));\n        },\n        setEnabled: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? p : n));\n            g.conditionClass(aa, ca, !ba);\n            if (w(aa)) {\n                var da = aa.getAttribute(\"href\"), ea = aa.getAttribute(\"ajaxify\"), fa = h.get(aa, s, \"#\"), ga = h.get(aa, t);\n                if (ba) {\n                    if (!da) {\n                        aa.setAttribute(\"href\", fa);\n                    }\n                ;\n                ;\n                    if (((!ea && ga))) {\n                        aa.setAttribute(\"ajaxify\", ga);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"tabIndex\");\n                }\n                 else {\n                    if (((da && ((da !== fa))))) {\n                        h.set(aa, s, da);\n                    }\n                ;\n                ;\n                    if (((ea && ((ea !== ga))))) {\n                        h.set(aa, t, ea);\n                    }\n                ;\n                ;\n                    aa.removeAttribute(\"href\");\n                    aa.removeAttribute(\"ajaxify\");\n                    aa.setAttribute(\"tabIndex\", \"-1\");\n                }\n            ;\n            ;\n                u(aa, ba);\n            }\n             else {\n                var ha = z.getInputElement(aa);\n                ha.disabled = !ba;\n                u(ha, ba);\n            }\n        ;\n        ;\n        },\n        setDepressed: function(aa, ba) {\n            aa = v(aa);\n            var ca = ((y(aa) ? q : o));\n            g.conditionClass(aa, ca, ba);\n        },\n        isDepressed: function(aa) {\n            aa = v(aa);\n            var ba = ((y(aa) ? q : o));\n            return g.hasClass(aa, ba);\n        },\n        setLabel: function(aa, ba) {\n            aa = v(aa);\n            if (y(aa)) {\n                var ca = [];\n                if (ba) {\n                    ca.push(ba);\n                }\n            ;\n            ;\n                var da = i.scry(aa, \".img\")[0];\n                if (da) {\n                    if (((aa.firstChild == da))) {\n                        ca.unshift(da);\n                    }\n                     else ca.push(da);\n                ;\n                }\n            ;\n            ;\n                i.setContent(aa, ca);\n            }\n             else if (w(aa)) {\n                var ea = i.JSBNG__find(aa, \"span.uiButtonText\");\n                i.setContent(ea, ba);\n            }\n             else z.getInputElement(aa).value = ba;\n            \n        ;\n        ;\n            var fa = ((y(aa) ? \"-cx-PUBLIC-abstractButton__notext\" : \"uiButtonNoText\"));\n            g.conditionClass(aa, fa, !ba);\n        },\n        setIcon: function(aa, ba) {\n            if (((ba && !i.isNode(ba)))) {\n                return;\n            }\n        ;\n        ;\n            aa = v(aa);\n            var ca = i.scry(aa, \".img\")[0];\n            if (!ba) {\n                ((ca && i.remove(ca)));\n                return;\n            }\n        ;\n        ;\n            g.addClass(ba, \"customimg\");\n            if (((ca != ba))) {\n                if (ca) {\n                    i.replace(ca, ba);\n                }\n                 else i.prependContent(aa, ba);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = z;\n});\n__d(\"Locale\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h, i = {\n        isRTL: function() {\n            if (((h === undefined))) {\n                h = ((\"rtl\" === g.get(JSBNG__document.body, \"direction\")));\n            }\n        ;\n        ;\n            return h;\n        }\n    };\n    e.exports = i;\n});\n__d(\"getOverlayZIndex\", [\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\");\n    function h(i, j) {\n        j = ((j || JSBNG__document.body));\n        var k = [];\n        while (((i && ((i !== j))))) {\n            k.push(i);\n            i = i.parentNode;\n        };\n    ;\n        if (((i !== j))) {\n            return 0;\n        }\n    ;\n    ;\n        for (var l = ((k.length - 1)); ((l >= 0)); l--) {\n            var m = k[l];\n            if (((g.get(m, \"position\") != \"static\"))) {\n                var n = parseInt(g.get(m, \"z-index\"), 10);\n                if (!isNaN(n)) {\n                    return n;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        return 0;\n    };\n;\n    e.exports = h;\n});\n__d(\"Dialog\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"Bootloader\",\"Button\",\"ContextualThing\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"Focus\",\"Form\",\"HTML\",\"Keys\",\"Locale\",\"Parent\",\"Run\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"bind\",\"copyProperties\",\"createArrayFrom\",\"emptyFunction\",\"getObjectValues\",\"getOverlayZIndex\",\"removeFromArray\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Button\"), l = b(\"ContextualThing\"), m = b(\"JSBNG__CSS\"), n = b(\"DOM\"), o = b(\"JSBNG__Event\"), p = b(\"Focus\"), q = b(\"Form\"), r = b(\"HTML\"), s = b(\"Keys\"), t = b(\"Locale\"), u = b(\"Parent\"), v = b(\"Run\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"UserAgent\"), z = b(\"Vector\"), aa = b(\"bind\"), ba = b(\"copyProperties\"), ca = b(\"createArrayFrom\"), da = b(\"emptyFunction\"), ea = b(\"getObjectValues\"), fa = b(\"getOverlayZIndex\"), ga = b(\"removeFromArray\"), ha = b(\"shield\"), ia = b(\"tx\"), ja = function() {\n        var la = JSBNG__document.body, ma = JSBNG__document.createElement(\"div\"), na = JSBNG__document.createElement(\"div\");\n        la.insertBefore(ma, la.firstChild);\n        la.insertBefore(na, la.firstChild);\n        ma.style.position = \"fixed\";\n        ma.style.JSBNG__top = \"20px\";\n        var oa = ((ma.offsetTop !== na.offsetTop));\n        la.removeChild(ma);\n        la.removeChild(na);\n        ja = da.thatReturns(oa);\n        return oa;\n    };\n    function ka(la) {\n        this._show_loading = true;\n        this._auto_focus = true;\n        this._submit_on_enter = false;\n        this._fade_enabled = true;\n        this._onload_handlers = [];\n        this._top = 125;\n        this._uniqueID = ((\"dialog_\" + ka._globalCount++));\n        this._content = null;\n        this._obj = null;\n        this._popup = null;\n        this._overlay = null;\n        this._shim = null;\n        this._causal_elem = null;\n        this._previous_focus = null;\n        this._buttons = [];\n        this._buildDialog();\n        if (la) {\n            this._setFromModel(la);\n        }\n    ;\n    ;\n        ka._init();\n    };\n;\n    ba(ka, {\n        OK: {\n            JSBNG__name: \"ok\",\n            label: \"Okay\"\n        },\n        CANCEL: {\n            JSBNG__name: \"cancel\",\n            label: \"Cancel\",\n            className: \"inputaux\"\n        },\n        CLOSE: {\n            JSBNG__name: \"close\",\n            label: \"Close\"\n        },\n        NEXT: {\n            JSBNG__name: \"next\",\n            label: \"Next\"\n        },\n        SAVE: {\n            JSBNG__name: \"save\",\n            label: \"Save\"\n        },\n        SUBMIT: {\n            JSBNG__name: \"submit\",\n            label: \"Submit\"\n        },\n        CONFIRM: {\n            JSBNG__name: \"JSBNG__confirm\",\n            label: \"Confirm\"\n        },\n        DELETE: {\n            JSBNG__name: \"delete\",\n            label: \"Delete\"\n        },\n        _globalCount: 0,\n        _bottoms: [0,],\n        max_bottom: 0,\n        _updateMaxBottom: function() {\n            ka.max_bottom = Math.max.apply(Math, ka._bottoms);\n        }\n    });\n    ba(ka, {\n        OK_AND_CANCEL: [ka.OK,ka.CANCEL,],\n        _STANDARD_BUTTONS: [ka.OK,ka.CANCEL,ka.CLOSE,ka.SAVE,ka.SUBMIT,ka.CONFIRM,ka.DELETE,],\n        SIZE: {\n            WIDE: 555,\n            STANDARD: 445\n        },\n        _HALO_WIDTH: 10,\n        _BORDER_WIDTH: 1,\n        _PADDING_WIDTH: 10,\n        _PAGE_MARGIN: 40,\n        _stack: [],\n        _isUsingCSSBorders: function() {\n            return ((y.ie() < 7));\n        },\n        newButton: function(la, ma, na, oa) {\n            var pa = {\n                JSBNG__name: la,\n                label: ma\n            };\n            if (na) {\n                pa.className = na;\n            }\n        ;\n        ;\n            if (oa) {\n                pa.handler = oa;\n            }\n        ;\n        ;\n            return pa;\n        },\n        getCurrent: function() {\n            var la = ka._stack;\n            return ((la.length ? la[((la.length - 1))] : null));\n        },\n        hideCurrent: function() {\n            var la = ka.getCurrent();\n            ((la && la.hide()));\n        },\n        bootstrap: function(la, ma, na, oa, pa, qa) {\n            ma = ((ma || {\n            }));\n            ba(ma, new x(la).getQueryData());\n            oa = ((oa || ((na ? \"GET\" : \"POST\"))));\n            var ra = ((u.byClass(qa, \"stat_elem\") || qa));\n            if (((ra && m.hasClass(ra, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = new i().setReadOnly(!!na).setMethod(oa).setRelativeTo(qa).setStatusElement(ra).setURI(la).setNectarModuleDataSafe(qa).setData(ma), ta = new ka(pa).setCausalElement(qa).setAsync(sa);\n            ta.show();\n            return false;\n        },\n        showFromModel: function(la, ma) {\n            var na = new ka(la).setCausalElement(ma).show();\n            if (la.hiding) {\n                na.hide();\n            }\n        ;\n        ;\n        },\n        _init: function() {\n            this._init = da;\n            v.onLeave(ha(ka._tearDown, null, false));\n            h.subscribe(\"page_transition\", ha(ka._tearDown, null, true));\n            o.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n                if (((((o.getKeyCode(JSBNG__event) == s.ESC)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._escape()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                ;\n                }\n                 else if (((((o.getKeyCode(JSBNG__event) == s.RETURN)) && !JSBNG__event.getModifiers().any))) {\n                    if (ka._enter()) {\n                        JSBNG__event.kill();\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            });\n            o.listen(window, \"resize\", function(JSBNG__event) {\n                var la = ka.getCurrent();\n                ((la && la._resetDialogObj()));\n            });\n        },\n        _findButton: function(la, ma) {\n            if (la) {\n                for (var na = 0; ((na < la.length)); ++na) {\n                    if (((la[na].JSBNG__name == ma))) {\n                        return la[na];\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            return null;\n        },\n        _tearDown: function(la) {\n            var ma = ka._stack.slice();\n            for (var na = ((ma.length - 1)); ((na >= 0)); na--) {\n                if (((((la && !ma[na]._cross_transition)) || ((!la && !ma[na]._cross_quickling))))) {\n                    ma[na].hide();\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _escape: function() {\n            var la = ka.getCurrent();\n            if (!la) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._semi_modal, na = la._buttons;\n            if (((!na.length && !ma))) {\n                return false;\n            }\n        ;\n        ;\n            if (((ma && !na.length))) {\n                la.hide();\n                return true;\n            }\n        ;\n        ;\n            var oa, pa = ka._findButton(na, \"cancel\");\n            if (la._cancelHandler) {\n                la.cancel();\n                return true;\n            }\n             else if (pa) {\n                oa = pa;\n            }\n             else if (((na.length == 1))) {\n                oa = na[0];\n            }\n             else return false\n            \n            \n        ;\n            la._handleButton(oa);\n            return true;\n        },\n        _enter: function() {\n            var la = ka.getCurrent();\n            if (((!la || !la._submit_on_enter))) {\n                return false;\n            }\n        ;\n        ;\n            if (((JSBNG__document.activeElement != la._frame))) {\n                return false;\n            }\n        ;\n        ;\n            var ma = la._buttons;\n            if (!ma) {\n                return false;\n            }\n        ;\n        ;\n            la._handleButton(ma[0]);\n            return true;\n        },\n        call_or_eval: function(la, ma, na) {\n            if (!ma) {\n                return undefined;\n            }\n        ;\n        ;\n            na = ((na || {\n            }));\n            if (((typeof ma == \"string\"))) {\n                var oa = Object.keys(na).join(\", \");\n                ma = (eval)(((((((((\"({f: function(\" + oa)) + \") { \")) + ma)) + \"}})\"))).f;\n            }\n        ;\n        ;\n            return ma.apply(la, ea(na));\n        }\n    });\n    ba(ka.prototype, {\n        _cross_quickling: false,\n        _cross_transition: false,\n        _loading: false,\n        _showing: false,\n        show: function() {\n            this._showing = true;\n            if (this._async_request) {\n                if (this._show_loading) {\n                    this.showLoading();\n                }\n            ;\n            ;\n            }\n             else this._update();\n        ;\n        ;\n            return this;\n        },\n        showLoading: function() {\n            this._loading = true;\n            m.addClass(this._frame, \"dialog_loading_shown\");\n            this._renderDialog();\n            return this;\n        },\n        hide: function() {\n            if (((!this._showing && !this._loading))) {\n                return this;\n            }\n        ;\n        ;\n            this._showing = false;\n            if (this._autohide_timeout) {\n                JSBNG__clearTimeout(this._autohide_timeout);\n                this._autohide_timeout = null;\n            }\n        ;\n        ;\n            if (((this._fade_enabled && ((ka._stack.length <= 1))))) {\n                this._fadeOut();\n            }\n             else this._hide();\n        ;\n        ;\n            return this;\n        },\n        cancel: function() {\n            if (((!this._cancelHandler || ((this._cancelHandler() !== false))))) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        getRoot: function() {\n            return this._obj;\n        },\n        getBody: function() {\n            return n.scry(this._obj, \"div.dialog_body\")[0];\n        },\n        getButtonElement: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            if (((!la || !la.JSBNG__name))) {\n                return null;\n            }\n        ;\n        ;\n            var ma = n.scry(this._popup, \"input\"), na = function(oa) {\n                return ((oa.JSBNG__name == la.JSBNG__name));\n            };\n            return ((ma.filter(na)[0] || null));\n        },\n        getContentNode: function() {\n            return n.JSBNG__find(this._content, \"div.dialog_content\");\n        },\n        getFormData: function() {\n            return q.serialize(this.getContentNode());\n        },\n        setAllowCrossPageTransition: function(la) {\n            this._cross_transition = la;\n            return this;\n        },\n        setAllowCrossQuicklingNavigation: function(la) {\n            this._cross_quickling = la;\n            return this;\n        },\n        setShowing: function() {\n            this.show();\n            return this;\n        },\n        setHiding: function() {\n            this.hide();\n            return this;\n        },\n        setTitle: function(la) {\n            var ma = this._nodes.title, na = this._nodes.title_inner, oa = this._nodes.JSBNG__content;\n            n.setContent(na, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            m.conditionClass(oa, \"dialog_content_titleless\", !la);\n            return this;\n        },\n        setBody: function(la) {\n            n.setContent(this._nodes.body, this._format(la));\n            return this;\n        },\n        setExtraData: function(la) {\n            this._extra_data = la;\n            return this;\n        },\n        setReturnData: function(la) {\n            this._return_data = la;\n            return this;\n        },\n        setShowLoading: function(la) {\n            this._show_loading = la;\n            return this;\n        },\n        setCustomLoading: function(la) {\n            var ma = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, la);\n            n.setContent(this._frame, [this._nodes.title,this._nodes.JSBNG__content,ma,]);\n            return this;\n        },\n        setFullBleed: function(la) {\n            this._full_bleed = la;\n            this._updateWidth();\n            m.conditionClass(this._obj, \"full_bleed\", la);\n            return this;\n        },\n        setCausalElement: function(la) {\n            this._causal_elem = la;\n            return this;\n        },\n        setUserData: function(la) {\n            this._user_data = la;\n            return this;\n        },\n        getUserData: function() {\n            return this._user_data;\n        },\n        setAutohide: function(la) {\n            if (la) {\n                if (this._showing) {\n                    this._autohide_timeout = JSBNG__setTimeout(ha(this.hide, this), la);\n                }\n                 else this._autohide = la;\n            ;\n            ;\n            }\n             else {\n                this._autohide = null;\n                if (this._autohide_timeout) {\n                    JSBNG__clearTimeout(this._autohide_timeout);\n                    this._autohide_timeout = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        setSummary: function(la) {\n            var ma = this._nodes.summary;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setButtons: function(la) {\n            var ma, na;\n            if (!((la instanceof Array))) {\n                ma = ca(arguments);\n            }\n             else ma = la;\n        ;\n        ;\n            for (var oa = 0; ((oa < ma.length)); ++oa) {\n                if (((typeof ma[oa] == \"string\"))) {\n                    na = ka._findButton(ka._STANDARD_BUTTONS, ma[oa]);\n                    ma[oa] = na;\n                }\n            ;\n            ;\n            };\n        ;\n            this._buttons = ma;\n            var pa = [];\n            if (((ma && ((ma.length > 0))))) {\n                for (var qa = 0; ((qa < ma.length)); qa++) {\n                    na = ma[qa];\n                    var ra = n.create(\"input\", {\n                        type: \"button\",\n                        JSBNG__name: ((na.JSBNG__name || \"\")),\n                        value: na.label\n                    }), sa = n.create(\"label\", {\n                        className: \"uiButton uiButtonLarge uiButtonConfirm\"\n                    }, ra);\n                    if (na.className) {\n                        na.className.split(/\\s+/).forEach(function(ua) {\n                            m.addClass(sa, ua);\n                        });\n                        if (m.hasClass(sa, \"inputaux\")) {\n                            m.removeClass(sa, \"inputaux\");\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                        if (m.hasClass(sa, \"uiButtonSpecial\")) {\n                            m.removeClass(sa, \"uiButtonConfirm\");\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    if (na.icon) {\n                        n.prependContent(sa, n.create(\"img\", {\n                            src: na.icon,\n                            className: \"img mrs\"\n                        }));\n                    }\n                ;\n                ;\n                    if (na.disabled) {\n                        k.setEnabled(sa, false);\n                    }\n                ;\n                ;\n                    o.listen(ra, \"click\", this._handleButton.bind(this, na.JSBNG__name));\n                    {\n                        var fin109keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin109i = (0);\n                        var ta;\n                        for (; (fin109i < fin109keys.length); (fin109i++)) {\n                            ((ta) = (fin109keys[fin109i]));\n                            {\n                                if (((((ta.indexOf(\"data-\") === 0)) && ((ta.length > 5))))) {\n                                    ra.setAttribute(ta, na[ta]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    pa.push(sa);\n                };\n            }\n        ;\n        ;\n            n.setContent(this._nodes.buttons, pa);\n            this._updateButtonVisibility();\n            return this;\n        },\n        setButtonsMessage: function(la) {\n            n.setContent(this._nodes.button_message, this._format(((la || \"\"))));\n            this._has_button_message = !!la;\n            this._updateButtonVisibility();\n            return this;\n        },\n        _updateButtonVisibility: function() {\n            var la = ((((this._buttons.length > 0)) || this._has_button_message));\n            m.conditionShow(this._nodes.button_wrapper, la);\n            m.conditionClass(this._obj, \"omitDialogFooter\", !la);\n        },\n        setClickButtonOnEnter: function(la, ma) {\n            this._clickOnEnterTarget = la;\n            if (!this._clickOnEnterListener) {\n                this._clickOnEnterListener = o.listen(this._nodes.body, \"keypress\", function(JSBNG__event) {\n                    var na = JSBNG__event.getTarget();\n                    if (((na && ((na.id === this._clickOnEnterTarget))))) {\n                        if (((o.getKeyCode(JSBNG__event) == s.RETURN))) {\n                            this._handleButton(ma);\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    return true;\n                }.bind(this));\n            }\n        ;\n        ;\n            return this;\n        },\n        setStackable: function(la, ma) {\n            this._is_stackable = la;\n            this._shown_while_stacked = ((la && ma));\n            return this;\n        },\n        setHandler: function(la) {\n            this._handler = la;\n            return this;\n        },\n        setCancelHandler: function(la) {\n            this._cancelHandler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        setCloseHandler: function(la) {\n            this._close_handler = ka.call_or_eval.bind(null, this, la);\n            return this;\n        },\n        clearHandler: function() {\n            return this.setHandler(null);\n        },\n        setPostURI: function(la, ma) {\n            if (((ma === undefined))) {\n                ma = true;\n            }\n        ;\n        ;\n            if (ma) {\n                this.setHandler(this._submitForm.bind(this, \"POST\", la));\n            }\n             else this.setHandler(function() {\n                q.post(la, this.getFormData());\n                this.hide();\n            }.bind(this));\n        ;\n        ;\n            return this;\n        },\n        setGetURI: function(la) {\n            this.setHandler(this._submitForm.bind(this, \"GET\", la));\n            return this;\n        },\n        setModal: function(la) {\n            this._modal = la;\n            m.conditionClass(this._obj, \"generic_dialog_modal\", la);\n            return this;\n        },\n        setSemiModal: function(la) {\n            if (la) {\n                this.setModal(true);\n                this._semiModalListener = o.listen(this._obj, \"click\", function(ma) {\n                    if (!n.contains(this._popup, ma.getTarget())) {\n                        this.hide();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else ((this._semiModalListener && this._semiModalListener.remove()));\n        ;\n        ;\n            this._semi_modal = la;\n            return this;\n        },\n        setWideDialog: function(la) {\n            this._wide_dialog = la;\n            this._updateWidth();\n            return this;\n        },\n        setContentWidth: function(la) {\n            this._content_width = la;\n            this._updateWidth();\n            return this;\n        },\n        setTitleLoading: function(la) {\n            if (((la === undefined))) {\n                la = true;\n            }\n        ;\n        ;\n            var ma = n.JSBNG__find(this._popup, \"h2.dialog_title\");\n            if (ma) {\n                m.conditionClass(ma, \"loading\", la);\n            }\n        ;\n        ;\n            return this;\n        },\n        setSecure: function(la) {\n            m.conditionClass(this._nodes.title, \"secure\", la);\n            return this;\n        },\n        setClassName: function(la) {\n            la.split(/\\s+/).forEach(m.addClass.bind(m, this._obj));\n            return this;\n        },\n        setFadeEnabled: function(la) {\n            this._fade_enabled = la;\n            return this;\n        },\n        setFooter: function(la) {\n            var ma = this._nodes.footer;\n            n.setContent(ma, this._format(((la || \"\"))));\n            m.conditionShow(ma, !!la);\n            return this;\n        },\n        setAutoFocus: function(la) {\n            this._auto_focus = la;\n            return this;\n        },\n        setTop: function(la) {\n            this._top = la;\n            this._resetDialogObj();\n            return this;\n        },\n        onloadRegister: function(la) {\n            ca(la).forEach(function(ma) {\n                if (((typeof ma == \"string\"))) {\n                    ma = new Function(ma);\n                }\n            ;\n            ;\n                this._onload_handlers.push(ma.bind(this));\n            }.bind(this));\n            return this;\n        },\n        setAsyncURL: function(la) {\n            return this.setAsync(new i(la));\n        },\n        setAsync: function(la) {\n            var ma = function(ua) {\n                if (((this._async_request != la))) {\n                    return;\n                }\n            ;\n            ;\n                this._async_request = null;\n                var va = ua.getPayload(), wa = va;\n                if (this._loading) {\n                    this._showing = true;\n                }\n            ;\n            ;\n                if (((typeof wa == \"string\"))) {\n                    this.setBody(wa);\n                }\n                 else this._setFromModel(wa);\n            ;\n            ;\n                this._update();\n            }.bind(this), na = la.getData();\n            na.__d = 1;\n            la.setData(na);\n            var oa = ((la.getHandler() || da));\n            la.setHandler(function(ua) {\n                oa(ua);\n                ma(ua);\n            });\n            var pa = la, qa = ((pa.getErrorHandler() || da)), ra = ((pa.getTransportErrorHandler() || da)), sa = function() {\n                this._async_request = null;\n                this._loading = false;\n                if (((this._showing && this._shown_while_stacked))) {\n                    this._update();\n                }\n                 else this._hide(this._is_stackable);\n            ;\n            ;\n            }.bind(this), ta = ((pa.getServerDialogCancelHandler() || sa));\n            pa.setAllowCrossPageTransition(this._cross_transition).setErrorHandler(function(ua) {\n                sa();\n                qa(ua);\n            }).setTransportErrorHandler(function(ua) {\n                sa();\n                ra(ua);\n            }).setServerDialogCancelHandler(ta);\n            la.send();\n            this._async_request = la;\n            if (this._showing) {\n                this.show();\n            }\n        ;\n        ;\n            return this;\n        },\n        _format: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = r(la);\n            }\n             else la = r.replaceJSONWrapper(la);\n        ;\n        ;\n            if (((la instanceof r))) {\n                la.setDeferred(true);\n            }\n        ;\n        ;\n            return la;\n        },\n        _update: function() {\n            if (!this._showing) {\n                return;\n            }\n        ;\n        ;\n            if (((((this._autohide && !this._async_request)) && !this._autohide_timeout))) {\n                this._autohide_timeout = JSBNG__setTimeout(aa(this, \"hide\"), this._autohide);\n            }\n        ;\n        ;\n            m.removeClass(this._frame, \"dialog_loading_shown\");\n            this._loading = false;\n            this._renderDialog();\n            this._runOnloads();\n            this._previous_focus = JSBNG__document.activeElement;\n            p.set(this._frame);\n        },\n        _runOnloads: function() {\n            for (var la = 0; ((la < this._onload_handlers.length)); ++la) {\n                try {\n                    this._onload_handlers[la]();\n                } catch (ma) {\n                \n                };\n            ;\n            };\n        ;\n            this._onload_handlers = [];\n        },\n        _updateWidth: function() {\n            var la = ((2 * ka._BORDER_WIDTH));\n            if (ka._isUsingCSSBorders()) {\n                la += ((2 * ka._HALO_WIDTH));\n            }\n        ;\n        ;\n            if (this._content_width) {\n                la += this._content_width;\n                if (!this._full_bleed) {\n                    la += ((2 * ka._PADDING_WIDTH));\n                }\n            ;\n            ;\n            }\n             else if (this._wide_dialog) {\n                la += ka.SIZE.WIDE;\n            }\n             else la += ka.SIZE.STANDARD;\n            \n        ;\n        ;\n            this._popup.style.width = ((la + \"px\"));\n        },\n        _updateZIndex: function() {\n            if (((!this._hasSetZIndex && this._causal_elem))) {\n                var la = fa(this._causal_elem), ma = this._causal_elem;\n                while (((!la && (ma = l.getContext(ma))))) {\n                    la = fa(ma);\n                ;\n                };\n            ;\n                this._hasSetZIndex = ((la > ((this._modal ? 400 : 200))));\n                w.set(this._obj, \"z-index\", ((this._hasSetZIndex ? la : \"\")));\n            }\n        ;\n        ;\n        },\n        _renderDialog: function() {\n            this._updateZIndex();\n            this._pushOntoStack();\n            this._obj.style.height = ((((this._modal && ((y.ie() < 7)))) ? ((z.getDocumentDimensions().y + \"px\")) : null));\n            if (((this._obj && this._obj.style.display))) {\n                this._obj.style.visibility = \"hidden\";\n                this._obj.style.display = \"\";\n                this.resetDialogPosition();\n                this._obj.style.visibility = \"\";\n                this._obj.dialog = this;\n            }\n             else this.resetDialogPosition();\n        ;\n        ;\n            JSBNG__clearInterval(this.active_hiding);\n            this.active_hiding = JSBNG__setInterval(this._activeResize.bind(this), 500);\n            this._submit_on_enter = false;\n            if (this._auto_focus) {\n                var la = q.getFirstElement(this._content, [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",]);\n                if (la) {\n                    q.focusFirst.bind(this, this._content).defer();\n                }\n                 else this._submit_on_enter = true;\n            ;\n            ;\n            }\n        ;\n        ;\n            var ma = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms.push(ma);\n            this._bottom = ma;\n            ka._updateMaxBottom();\n            return this;\n        },\n        _buildDialog: function() {\n            this._obj = n.create(\"div\", {\n                className: \"generic_dialog\",\n                id: this._uniqueID\n            });\n            this._obj.style.display = \"none\";\n            n.appendContent(JSBNG__document.body, this._obj);\n            if (!this._popup) {\n                this._popup = n.create(\"div\", {\n                    className: \"generic_dialog_popup\"\n                });\n            }\n        ;\n        ;\n            this._obj.appendChild(this._popup);\n            if (((((y.ie() < 7)) && !this._shim))) {\n                j.loadModules([\"IframeShim\",], function(xa) {\n                    this._shim = new xa(this._popup);\n                });\n            }\n        ;\n        ;\n            m.addClass(this._obj, \"pop_dialog\");\n            if (t.isRTL()) {\n                m.addClass(this._obj, \"pop_dialog_rtl\");\n            }\n        ;\n        ;\n            var la;\n            if (ka._isUsingCSSBorders()) {\n                la = ((((\"\\u003Cdiv class=\\\"pop_container_advanced\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_content\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n            }\n             else la = ((((((((((((((((\"\\u003Cdiv class=\\\"pop_container\\\"\\u003E\" + \"\\u003Cdiv class=\\\"pop_verticalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_horizontalslab\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_topright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomright\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_bottomleft\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003Cdiv class=\\\"pop_content pop_content_old\\\" id=\\\"pop_content\\\"\\u003E\\u003C/div\\u003E\")) + \"\\u003C/div\\u003E\"));\n        ;\n        ;\n            n.setContent(this._popup, r(la));\n            var ma = n.JSBNG__find(this._popup, \"div.pop_content\");\n            ma.setAttribute(\"tabIndex\", \"0\");\n            ma.setAttribute(\"role\", \"alertdialog\");\n            this._frame = this._content = ma;\n            var na = n.create(\"div\", {\n                className: \"dialog_loading\"\n            }, \"Loading...\"), oa = n.create(\"span\"), pa = n.create(\"h2\", {\n                className: \"dialog_title hidden_elem\",\n                id: ((\"title_\" + this._uniqueID))\n            }, oa), qa = n.create(\"div\", {\n                className: \"dialog_summary hidden_elem\"\n            }), ra = n.create(\"div\", {\n                className: \"dialog_body\"\n            }), sa = n.create(\"div\", {\n                className: \"rfloat mlm\"\n            }), ta = n.create(\"div\", {\n                className: \"dialog_buttons_msg\"\n            }), ua = n.create(\"div\", {\n                className: \"dialog_buttons clearfix hidden_elem\"\n            }, [sa,ta,]), va = n.create(\"div\", {\n                className: \"dialog_footer hidden_elem\"\n            }), wa = n.create(\"div\", {\n                className: \"dialog_content\"\n            }, [qa,ra,ua,va,]);\n            this._nodes = {\n                summary: qa,\n                body: ra,\n                buttons: sa,\n                button_message: ta,\n                button_wrapper: ua,\n                footer: va,\n                JSBNG__content: wa,\n                title: pa,\n                title_inner: oa\n            };\n            n.setContent(this._frame, [pa,wa,na,]);\n        },\n        _updateShim: function() {\n            return ((this._shim && this._shim.show()));\n        },\n        _activeResize: function() {\n            if (((this.last_offset_height != this._content.offsetHeight))) {\n                this.last_offset_height = this._content.offsetHeight;\n                this.resetDialogPosition();\n            }\n        ;\n        ;\n        },\n        resetDialogPosition: function() {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            this._resetDialogObj();\n            this._updateShim();\n        },\n        _resetDialogObj: function() {\n            var la = ((2 * ka._PAGE_MARGIN)), ma = z.getViewportDimensions(), na = ((ma.x - la)), oa = ((ma.y - la)), pa = ((2 * ka._HALO_WIDTH)), qa = z.getElementDimensions(this._content), ra = ((qa.x + pa)), sa = ((qa.y + pa)), ta = this._top, ua = ((na - ra)), va = ((oa - sa));\n            if (((va < 0))) {\n                ta = ka._PAGE_MARGIN;\n            }\n             else if (((ta > va))) {\n                ta = ((ka._PAGE_MARGIN + ((Math.max(va, 0) / 2))));\n            }\n            \n        ;\n        ;\n            var wa = ja();\n            if (!wa) {\n                ta += z.getScrollPosition().y;\n            }\n        ;\n        ;\n            w.set(this._popup, \"marginTop\", ((ta + \"px\")));\n            var xa = ((wa && ((((ua < 0)) || ((va < 0))))));\n            m.conditionClass(this._obj, \"generic_dialog_fixed_overflow\", xa);\n            m.conditionClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\", xa);\n        },\n        _fadeOut: function(la) {\n            if (!this._popup) {\n                return;\n            }\n        ;\n        ;\n            try {\n                new g(this._obj).duration(0).checkpoint().to(\"opacity\", 0).hide().duration(250).ondone(this._hide.bind(this, la)).go();\n            } catch (ma) {\n                this._hide(la);\n            };\n        ;\n        },\n        _hide: function(la) {\n            if (this._obj) {\n                this._obj.style.display = \"none\";\n            }\n        ;\n        ;\n            m.removeClass(JSBNG__document.documentElement, \"generic_dialog_overflow_mode\");\n            this._updateShim();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._bottom) {\n                var ma = ka._bottoms;\n                ma.splice(ma.indexOf(this._bottom), 1);\n                ka._updateMaxBottom();\n            }\n        ;\n        ;\n            if (((((this._previous_focus && JSBNG__document.activeElement)) && n.contains(this._obj, JSBNG__document.activeElement)))) {\n                p.set(this._previous_focus);\n            }\n        ;\n        ;\n            if (la) {\n                return;\n            }\n        ;\n        ;\n            this.destroy();\n        },\n        destroy: function() {\n            this._popFromStack();\n            JSBNG__clearInterval(this.active_hiding);\n            if (this._obj) {\n                n.remove(this._obj);\n                this._obj = null;\n                ((this._shim && this._shim.hide()));\n                this._shim = null;\n            }\n        ;\n        ;\n            ((this._clickOnEnterListener && this._clickOnEnterListener.remove()));\n            if (this._close_handler) {\n                this._close_handler({\n                    return_data: this._return_data\n                });\n            }\n        ;\n        ;\n        },\n        _handleButton: function(la) {\n            if (((typeof la == \"string\"))) {\n                la = ka._findButton(this._buttons, la);\n            }\n        ;\n        ;\n            var ma = ka.call_or_eval(la, la.handler);\n            if (((ma === false))) {\n                return;\n            }\n        ;\n        ;\n            if (((la.JSBNG__name == \"cancel\"))) {\n                this.cancel();\n            }\n             else if (((ka.call_or_eval(this, this._handler, {\n                button: la\n            }) !== false))) {\n                this.hide();\n            }\n            \n        ;\n        ;\n        },\n        _submitForm: function(la, ma, na) {\n            var oa = this.getFormData();\n            if (na) {\n                oa[na.JSBNG__name] = na.label;\n            }\n        ;\n        ;\n            if (this._extra_data) {\n                ba(oa, this._extra_data);\n            }\n        ;\n        ;\n            var pa = new i().setURI(ma).setData(oa).setMethod(la).setNectarModuleDataSafe(this._causal_elem).setReadOnly(((la == \"GET\")));\n            this.setAsync(pa);\n            return false;\n        },\n        _setFromModel: function(la) {\n            var ma = {\n            };\n            ba(ma, la);\n            {\n                var fin110keys = ((window.top.JSBNG_Replay.forInKeys)((ma))), fin110i = (0);\n                var na;\n                for (; (fin110i < fin110keys.length); (fin110i++)) {\n                    ((na) = (fin110keys[fin110i]));\n                    {\n                        if (((na == \"onloadRegister\"))) {\n                            this.onloadRegister(ma[na]);\n                            continue;\n                        }\n                    ;\n                    ;\n                        var oa = this[((((\"set\" + na.substr(0, 1).toUpperCase())) + na.substr(1)))];\n                        oa.apply(this, ca(ma[na]));\n                    };\n                };\n            };\n        ;\n        },\n        _updateBottom: function() {\n            var la = ((z.getElementDimensions(this._content).y + z.getElementPosition(this._content).y));\n            ka._bottoms[((ka._bottoms.length - 1))] = la;\n            ka._updateMaxBottom();\n        },\n        _pushOntoStack: function() {\n            var la = ka._stack;\n            if (!la.length) {\n                h.inform(\"layer_shown\", {\n                    type: \"Dialog\"\n                });\n            }\n        ;\n        ;\n            ga(la, this);\n            la.push(this);\n            for (var ma = ((la.length - 2)); ((ma >= 0)); ma--) {\n                var na = la[ma];\n                if (((!na._is_stackable && !na._async_request))) {\n                    na._hide();\n                }\n                 else if (!na._shown_while_stacked) {\n                    na._hide(true);\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        _popFromStack: function() {\n            var la = ka._stack, ma = ((la[((la.length - 1))] === this));\n            ga(la, this);\n            if (la.length) {\n                if (ma) {\n                    la[((la.length - 1))].show();\n                }\n            ;\n            ;\n            }\n             else h.inform(\"layer_hidden\", {\n                type: \"Dialog\"\n            });\n        ;\n        ;\n        }\n    });\n    e.exports = ka;\n    a.Dialog = ka;\n});\n__d(\"DocumentTitle\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = JSBNG__document.title, i = null, j = 1500, k = [], l = 0, m = null, n = false;\n    function o() {\n        if (((k.length > 0))) {\n            if (!n) {\n                p(k[l].title);\n                l = ((++l % k.length));\n            }\n             else q();\n        ;\n        ;\n        }\n         else {\n            JSBNG__clearInterval(m);\n            m = null;\n            q();\n        }\n    ;\n    ;\n    };\n;\n    function p(s) {\n        JSBNG__document.title = s;\n        n = true;\n    };\n;\n    function q() {\n        r.set(((i || h)), true);\n        n = false;\n    };\n;\n    var r = {\n        get: function() {\n            return h;\n        },\n        set: function(s, t) {\n            JSBNG__document.title = s;\n            if (!t) {\n                h = s;\n                i = null;\n                g.inform(\"update_title\", s);\n            }\n             else i = s;\n        ;\n        ;\n        },\n        blink: function(s) {\n            var t = {\n                title: s\n            };\n            k.push(t);\n            if (((m === null))) {\n                m = JSBNG__setInterval(o, j);\n            }\n        ;\n        ;\n            return {\n                JSBNG__stop: function() {\n                    var u = k.indexOf(t);\n                    if (((u >= 0))) {\n                        k.splice(u, 1);\n                        if (((l > u))) {\n                            l--;\n                        }\n                         else if (((((l == u)) && ((l == k.length))))) {\n                            l = 0;\n                        }\n                        \n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"FileInput\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMClone\",\"Focus\",\"UserAgent\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMClone\"), k = b(\"Focus\"), l = b(\"UserAgent\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = l.ie();\n    function p(q, r, s) {\n        this.container = q;\n        this.control = r;\n        this.input = s;\n        var t = i.scry(this.container, \"a\")[0];\n        ((t && t.removeAttribute(\"href\")));\n        var u = i.create(\"div\", {\n            className: \"-cx-PRIVATE-uiFileInput__wrap\"\n        }, this.input);\n        i.appendContent(this.control, u);\n        this._initListeners();\n    };\n;\n    m(p.prototype, h, {\n        getValue: function() {\n            return this.input.value;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        clear: function() {\n            if (o) {\n                var q = j.deepClone(this.input);\n                i.replace(this.input, q);\n                this.input = q;\n                while (this._listeners.length) {\n                    this._listeners.pop().remove();\n                ;\n                };\n            ;\n                this._initListeners();\n            }\n             else {\n                this.input.value = \"\";\n                this.input.files = null;\n            }\n        ;\n        ;\n        },\n        _initListeners: function() {\n            k.relocate(this.input, this.control);\n            this._listeners = [g.listen(this.input, \"change\", this._handleChange.bind(this)),];\n        },\n        _handleChange: function(JSBNG__event) {\n            this.inform(\"change\", JSBNG__event);\n            var q = this.input.form;\n            if (((q && ((o < 9))))) {\n                g.fire(q, \"change\", JSBNG__event);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"LinkController\", [\"JSBNG__Event\",\"DataStore\",\"Parent\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DataStore\"), i = b(\"Parent\"), j = b(\"trackReferrer\"), k = \"LinkControllerHandler\", l = [], m = [];\n    function n(JSBNG__event) {\n        var r = i.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && r.getAttribute(\"href\", 2)));\n        if (((((((!s || r.rel)) || !p(s))) || h.get(r, k)))) {\n            return;\n        }\n    ;\n    ;\n        var t = g.listen(r, \"click\", function(u) {\n            if (((s.charAt(((s.length - 1))) == \"#\"))) {\n                u.prevent();\n                return;\n            }\n        ;\n        ;\n            j(r, s);\n            o(r, u);\n        });\n        h.set(r, k, t);\n    };\n;\n    function o(r, JSBNG__event) {\n        if (((((((r.target || r.rel)) || JSBNG__event.getModifiers().any)) || ((JSBNG__event.which && ((JSBNG__event.which != 1))))))) {\n            return;\n        }\n    ;\n    ;\n        var s = l.concat(m);\n        for (var t = 0, u = s.length; ((t < u)); t++) {\n            if (((s[t](r, JSBNG__event) === false))) {\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function p(r) {\n        var s = r.match(/^(\\w+):/);\n        return ((!s || s[1].match(/^http/i)));\n    };\n;\n    var q = {\n        registerHandler: function(r) {\n            l.push(r);\n        },\n        registerFallbackHandler: function(r) {\n            m.push(r);\n        }\n    };\n    g.listen(JSBNG__document.documentElement, \"mousedown\", n);\n    g.listen(JSBNG__document.documentElement, \"keydown\", n);\n    e.exports = q;\n});\n__d(\"OnloadHooks\", [\"Arbiter\",\"ErrorUtils\",\"InitialJSLoader\",\"OnloadEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"InitialJSLoader\"), j = b(\"OnloadEvent\");\n    function k() {\n        var r = a.CavalryLogger;\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_prehooks\");\n        }\n    ;\n    ;\n        n(\"onloadhooks\");\n        if (((!window.loaded && r))) {\n            r.getInstance().setTimeStamp(\"t_hooks\");\n        }\n    ;\n    ;\n        window.loaded = true;\n        g.inform(\"uipage_onload\", true, g.BEHAVIOR_STATE);\n    };\n;\n    function l() {\n        n(\"onafterloadhooks\");\n        window.afterloaded = true;\n    };\n;\n    function m(r, s) {\n        return h.applyWithGuard(r, null, null, function(t) {\n            t.event_type = s;\n            t.category = \"runhook\";\n        });\n    };\n;\n    function n(r) {\n        var s = ((((r == \"onbeforeleavehooks\")) || ((r == \"onbeforeunloadhooks\"))));\n        do {\n            var t = window[r];\n            if (!t) {\n                break;\n            }\n        ;\n        ;\n            if (!s) {\n                window[r] = null;\n            }\n        ;\n        ;\n            for (var u = 0; ((u < t.length)); u++) {\n                var v = m(t[u], r);\n                if (((s && v))) {\n                    return v;\n                }\n            ;\n            ;\n            };\n        ;\n        } while (((!s && window[r])));\n    };\n;\n    function o() {\n        if (!window.loaded) {\n            window.loaded = true;\n            n(\"onloadhooks\");\n        }\n    ;\n    ;\n        if (!window.afterloaded) {\n            window.afterloaded = true;\n            n(\"onafterloadhooks\");\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        g.registerCallback(k, [j.ONLOAD_DOMCONTENT_CALLBACK,i.INITIAL_JS_READY,]);\n        g.registerCallback(l, [j.ONLOAD_DOMCONTENT_CALLBACK,j.ONLOAD_CALLBACK,i.INITIAL_JS_READY,]);\n        g.subscribe(j.ONBEFOREUNLOAD, function(r, s) {\n            s.warn = ((n(\"onbeforeleavehooks\") || n(\"onbeforeunloadhooks\")));\n            if (!s.warn) {\n                window.loaded = false;\n                window.afterloaded = false;\n            }\n        ;\n        ;\n        }, g.SUBSCRIBE_NEW);\n        g.subscribe(j.ONUNLOAD, function(r, s) {\n            n(\"onunloadhooks\");\n            n(\"onafterunloadhooks\");\n        }, g.SUBSCRIBE_NEW);\n    };\n;\n    var q = {\n        _onloadHook: k,\n        _onafterloadHook: l,\n        runHook: m,\n        runHooks: n,\n        keepWindowSetAsLoaded: o\n    };\n    p();\n    a.OnloadHooks = e.exports = q;\n});\n__d(\"areEqual\", [], function(a, b, c, d, e, f) {\n    var g = function(k, l, m, n) {\n        if (((k === l))) {\n            return ((((k !== 0)) || ((((1 / k)) == ((1 / l))))));\n        }\n    ;\n    ;\n        if (((((k == null)) || ((l == null))))) {\n            return false;\n        }\n    ;\n    ;\n        if (((((typeof k != \"object\")) || ((typeof l != \"object\"))))) {\n            return false;\n        }\n    ;\n    ;\n        var o = Object.prototype.toString, p = o.call(k);\n        if (((p != o.call(l)))) {\n            return false;\n        }\n    ;\n    ;\n        switch (p) {\n          case \"[object String]\":\n            return ((k == String(l)));\n          case \"[object Number]\":\n            return ((((isNaN(k) || isNaN(l))) ? false : ((k == Number(l)))));\n          case \"[object Date]\":\n        \n          case \"[object Boolean]\":\n            return ((+k == +l));\n          case \"[object RegExp]\":\n            return ((((((((k.source == l.source)) && ((k.global == l.global)))) && ((k.multiline == l.multiline)))) && ((k.ignoreCase == l.ignoreCase))));\n        };\n    ;\n        var q = m.length;\n        while (q--) {\n            if (((m[q] == k))) {\n                return ((n[q] == l));\n            }\n        ;\n        ;\n        };\n    ;\n        m.push(k);\n        n.push(l);\n        var r = 0;\n        if (((p === \"[object Array]\"))) {\n            r = k.length;\n            if (((r !== l.length))) {\n                return false;\n            }\n        ;\n        ;\n            while (r--) {\n                if (!g(k[r], l[r], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n         else {\n            if (((k.constructor !== l.constructor))) {\n                return false;\n            }\n        ;\n        ;\n            if (((k.hasOwnProperty(\"valueOf\") && l.hasOwnProperty(\"valueOf\")))) {\n                return ((k.valueOf() == l.valueOf()));\n            }\n        ;\n        ;\n            var s = Object.keys(k);\n            if (((s.length != Object.keys(l).length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var t = 0; ((t < s.length)); t++) {\n                if (!g(k[s[t]], l[s[t]], m, n)) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        m.pop();\n        n.pop();\n        return true;\n    }, h = [], i = [], j = function(k, l) {\n        var m = ((h.length ? h.pop() : [])), n = ((i.length ? i.pop() : [])), o = g(k, l, m, n);\n        m.length = 0;\n        n.length = 0;\n        h.push(m);\n        i.push(n);\n        return o;\n    };\n    e.exports = j;\n});\n__d(\"computeRelativeURI\", [\"URI\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"isEmpty\");\n    function i(k, l) {\n        if (!l) {\n            return k;\n        }\n    ;\n    ;\n        if (((l.charAt(0) == \"/\"))) {\n            return l;\n        }\n    ;\n    ;\n        var m = k.split(\"/\").slice(0, -1);\n        ((m[0] !== \"\"));\n        l.split(\"/\").forEach(function(n) {\n            if (!((n == \".\"))) {\n                if (((n == \"..\"))) {\n                    if (((m.length > 1))) {\n                        m = m.slice(0, -1);\n                    }\n                ;\n                ;\n                }\n                 else m.push(n);\n            ;\n            }\n        ;\n        ;\n        });\n        return m.join(\"/\");\n    };\n;\n    function j(k, l) {\n        var m = new g(), n = l;\n        k = new g(k);\n        l = new g(l);\n        if (((l.getDomain() && !l.isFacebookURI()))) {\n            return n;\n        }\n    ;\n    ;\n        var o = k, p = [\"Protocol\",\"Domain\",\"Port\",\"Path\",\"QueryData\",\"Fragment\",];\n        p.forEach(function(q) {\n            var r = ((((q == \"Path\")) && ((o === k))));\n            if (r) {\n                m.setPath(i(k.getPath(), l.getPath()));\n            }\n        ;\n        ;\n            if (!h(l[((\"get\" + q))]())) {\n                o = l;\n            }\n        ;\n        ;\n            if (!r) {\n                m[((\"set\" + q))](o[((\"get\" + q))]());\n            }\n        ;\n        ;\n        });\n        return m;\n    };\n;\n    e.exports = j;\n});\n__d(\"escapeJSQuotes\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        if (((((((typeof h == \"undefined\")) || ((h == null)))) || !h.valueOf()))) {\n            return \"\";\n        }\n    ;\n    ;\n        return h.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, \"\\\\x22\").replace(/'/g, \"\\\\'\").replace(/</g, \"\\\\x3c\").replace(/>/g, \"\\\\x3e\").replace(/&/g, \"\\\\x26\");\n    };\n;\n    e.exports = g;\n});\n__d(\"htmlSpecialChars\", [], function(a, b, c, d, e, f) {\n    var g = /&/g, h = /</g, i = />/g, j = /\"/g, k = /'/g;\n    function l(m) {\n        if (((((((typeof m == \"undefined\")) || ((m === null)))) || !m.toString))) {\n            return \"\";\n        }\n    ;\n    ;\n        if (((m === false))) {\n            return \"0\";\n        }\n         else if (((m === true))) {\n            return \"1\";\n        }\n        \n    ;\n    ;\n        return m.toString().replace(g, \"&amp;\").replace(j, \"&quot;\").replace(k, \"&#039;\").replace(h, \"&lt;\").replace(i, \"&gt;\");\n    };\n;\n    e.exports = l;\n});\n__d(\"htmlize\", [\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"htmlSpecialChars\");\n    function h(i) {\n        return g(i).replace(/\\r\\n|[\\r\\n]/g, \"\\u003Cbr/\\u003E\");\n    };\n;\n    e.exports = h;\n});\n__d(\"setTimeoutAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setTimeout(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"PageTransitions\", [\"Arbiter\",\"Dialog\",\"DOMQuery\",\"DOMScroll\",\"Env\",\"JSBNG__Event\",\"Form\",\"HistoryManager\",\"JSLogger\",\"LinkController\",\"OnloadHooks\",\"Parent\",\"URI\",\"UserAgent\",\"Vector\",\"areEqual\",\"clickRefAction\",\"computeRelativeURI\",\"copyProperties\",\"escapeJSQuotes\",\"ge\",\"goOrReplace\",\"htmlize\",\"setTimeoutAcrossTransitions\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Dialog\"), i = b(\"DOMQuery\"), j = b(\"DOMScroll\"), k = b(\"Env\"), l = b(\"JSBNG__Event\"), m = b(\"Form\"), n = b(\"HistoryManager\"), o = b(\"JSLogger\"), p = b(\"LinkController\"), q = b(\"OnloadHooks\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"areEqual\"), w = b(\"clickRefAction\"), x = b(\"computeRelativeURI\"), y = b(\"copyProperties\"), z = b(\"escapeJSQuotes\"), aa = b(\"ge\"), ba = b(\"goOrReplace\"), ca = b(\"htmlize\"), da = b(\"setTimeoutAcrossTransitions\"), ea = b(\"startsWith\"), fa = b(\"tx\"), ga = b(\"userAction\"), ha = {\n    };\n    function ia(ta, ua) {\n        ha[ta.getUnqualifiedURI()] = ua;\n    };\n;\n    function ja(ta) {\n        return ha[ta.getUnqualifiedURI()];\n    };\n;\n    function ka(ta) {\n        delete ha[ta.getUnqualifiedURI()];\n    };\n;\n    var la = null, ma = null;\n    function na(ta) {\n        ma = ta;\n        da(function() {\n            ma = null;\n        }, 0);\n    };\n;\n    function oa(JSBNG__event) {\n        if (ma) {\n            if (!JSBNG__event.isDefaultPrevented()) {\n                pa(ma);\n                sa.lookBusy(ma);\n                ra.go(ma.getAttribute(\"href\"));\n            }\n        ;\n        ;\n            JSBNG__event.prevent();\n        }\n         else {\n            la = JSBNG__event.getTarget();\n            da(function() {\n                la = null;\n            }, 0);\n        }\n    ;\n    ;\n    };\n;\n    function pa(ta) {\n        var ua = ta.getAttribute(\"href\"), va = x(ra._most_recent_uri.getQualifiedURI(), ua).toString();\n        if (((ua != va))) {\n            ta.setAttribute(\"href\", va);\n        }\n    ;\n    ;\n    };\n;\n    function qa(JSBNG__event) {\n        var ta = JSBNG__event.getTarget();\n        if (((m.getAttribute(ta, \"rel\") || m.getAttribute(ta, \"target\")))) {\n            return;\n        }\n    ;\n    ;\n        w(\"form\", ta, JSBNG__event).set_namespace(\"page_transition\");\n        var ua = ga(\"page_transitions\", ta, JSBNG__event, {\n            mode: \"DEDUP\"\n        }).uai_fallback(null, \"form\"), va = a.ArbiterMonitor;\n        if (va) {\n            va.initUA(ua, [ta,]);\n        }\n    ;\n    ;\n        var wa = new s(((m.getAttribute(ta, \"action\") || \"\"))), xa = x(ra._most_recent_uri, wa);\n        ta.setAttribute(\"action\", xa.toString());\n        if (((((m.getAttribute(ta, \"method\") || \"GET\")).toUpperCase() === \"GET\"))) {\n            var ya = m.serialize(ta), za = la;\n            if (((((za && ((((i.isNodeOfType(za, \"input\") && ((za.type === \"submit\")))) || (za = r.byTag(za, \"button\")))))) && za.JSBNG__name))) {\n                ya[za.JSBNG__name] = za.value;\n            }\n        ;\n        ;\n            ra.go(xa.addQueryData(ya));\n            JSBNG__event.kill();\n        }\n    ;\n    ;\n    };\n;\n    var ra = {\n        _transition_handlers: [],\n        _scroll_locked: false,\n        isInitialized: function() {\n            return !!ra._initialized;\n        },\n        _init: function() {\n            if (k.DISABLE_PAGE_TRANSITIONS) {\n                return;\n            }\n        ;\n        ;\n            if (((!k.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (ra._initialized) {\n                return ra;\n            }\n        ;\n        ;\n            ra._initialized = true;\n            var ta = s.getRequestURI(false), ua = ta.getUnqualifiedURI(), va = s(ua).setFragment(null), wa = ua.getFragment();\n            if (((((wa.charAt(0) === \"!\")) && ((va.toString() === wa.substr(1)))))) {\n                ua = va;\n            }\n        ;\n        ;\n            y(ra, {\n                _current_uri: ua,\n                _most_recent_uri: ua,\n                _next_uri: ua\n            });\n            var xa;\n            if (ea(ta.getFragment(), \"/\")) {\n                xa = ta.getFragment();\n            }\n             else xa = ua;\n        ;\n        ;\n            n.init().setCanonicalLocation(((\"#\" + xa))).registerURIHandler(ra._historyManagerHandler);\n            p.registerFallbackHandler(na);\n            l.listen(JSBNG__document, \"click\", oa, l.Priority._BUBBLE);\n            l.listen(JSBNG__document, \"submit\", qa, l.Priority._BUBBLE);\n            l.listen(window, \"JSBNG__scroll\", function() {\n                if (!ra._scroll_locked) {\n                    ia(ra._current_uri, u.getScrollPosition());\n                }\n            ;\n            ;\n            });\n            return ra;\n        },\n        registerHandler: function(ta, ua) {\n            ra._init();\n            ua = ((ua || 5));\n            if (!ra._transition_handlers[ua]) {\n                ra._transition_handlers[ua] = [];\n            }\n        ;\n        ;\n            ra._transition_handlers[ua].push(ta);\n        },\n        getCurrentURI: function(ta) {\n            if (((!ra._current_uri && !ta))) {\n                return new s(ra._most_recent_uri);\n            }\n        ;\n        ;\n            return new s(ra._current_uri);\n        },\n        getMostRecentURI: function() {\n            return new s(ra._most_recent_uri);\n        },\n        getNextURI: function() {\n            return new s(ra._next_uri);\n        },\n        go: function(ta, ua) {\n            var va = new s(ta).removeQueryData(\"quickling\").getQualifiedURI();\n            o.create(\"pagetransition\").debug(\"go\", {\n                uri: va.toString()\n            });\n            ka(va);\n            ((!ua && w(\"uri\", {\n                href: va.toString()\n            }, null, \"INDIRECT\")));\n            sa.lookBusy();\n            ra._loadPage(va, function(wa) {\n                if (wa) {\n                    n.go(va.toString(), false, ua);\n                }\n                 else ba(window.JSBNG__location, va, ua);\n            ;\n            ;\n            });\n        },\n        _historyManagerHandler: function(ta) {\n            if (((ta.charAt(0) != \"/\"))) {\n                return false;\n            }\n        ;\n        ;\n            w(\"h\", {\n                href: ta\n            });\n            ga(\"page_transitions\").uai(null, \"history_manager\");\n            ra._loadPage(new s(ta), function(ua) {\n                if (!ua) {\n                    ba(window.JSBNG__location, ta, true);\n                }\n            ;\n            ;\n            });\n            return true;\n        },\n        _loadPage: function(ta, ua) {\n            if (((s(ta).getFragment() && v(s(ta).setFragment(null).getQualifiedURI(), s(ra._current_uri).setFragment(null).getQualifiedURI())))) {\n                if (ra.restoreScrollPosition(ta)) {\n                    ra._current_uri = ra._most_recent_uri = ta;\n                    sa.stopLookingBusy();\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            var va;\n            if (ra._current_uri) {\n                va = ja(ra._current_uri);\n            }\n        ;\n        ;\n            ra._current_uri = null;\n            ra._next_uri = ta;\n            if (va) {\n                j.JSBNG__scrollTo(va, false);\n            }\n        ;\n        ;\n            var wa = function() {\n                ra._scroll_locked = true;\n                var ya = ra._handleTransition(ta);\n                ((ua && ua(ya)));\n            }, xa = q.runHooks(\"onbeforeleavehooks\");\n            if (xa) {\n                sa.stopLookingBusy();\n                ra._warnBeforeLeaving(xa, wa);\n            }\n             else wa();\n        ;\n        ;\n        },\n        _handleTransition: function(ta) {\n            window.onbeforeleavehooks = undefined;\n            sa.lookBusy();\n            if (!ta.isSameOrigin()) {\n                return false;\n            }\n        ;\n        ;\n            var ua = ((window.AsyncRequest && window.AsyncRequest.getLastID()));\n            g.inform(\"pre_page_transition\", {\n                from: ra.getMostRecentURI(),\n                to: ta\n            });\n            for (var va = ((ra._transition_handlers.length - 1)); ((va >= 0)); --va) {\n                var wa = ra._transition_handlers[va];\n                if (!wa) {\n                    continue;\n                }\n            ;\n            ;\n                for (var xa = ((wa.length - 1)); ((xa >= 0)); --xa) {\n                    if (((wa[xa](ta) === true))) {\n                        var ya = {\n                            sender: this,\n                            uri: ta,\n                            id: ua\n                        };\n                        try {\n                            g.inform(\"page_transition\", ya);\n                        } catch (za) {\n                        \n                        };\n                    ;\n                        return true;\n                    }\n                     else wa.splice(xa, 1);\n                ;\n                ;\n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        unifyURI: function() {\n            ra._current_uri = ra._most_recent_uri = ra._next_uri;\n        },\n        transitionComplete: function(ta) {\n            ra._executeCompletionCallback();\n            sa.stopLookingBusy();\n            ra.unifyURI();\n            if (!ta) {\n                ra.restoreScrollPosition(ra._current_uri);\n            }\n        ;\n        ;\n            try {\n                if (((JSBNG__document.activeElement && ((JSBNG__document.activeElement.nodeName === \"A\"))))) {\n                    JSBNG__document.activeElement.JSBNG__blur();\n                }\n            ;\n            ;\n            } catch (ua) {\n            \n            };\n        ;\n        },\n        _executeCompletionCallback: function() {\n            if (ra._completionCallback) {\n                ra._completionCallback();\n            }\n        ;\n        ;\n            ra._completionCallback = null;\n        },\n        setCompletionCallback: function(ta) {\n            ra._completionCallback = ta;\n        },\n        rewriteCurrentURI: function(ta, ua) {\n            ra.registerHandler(function() {\n                if (((ta == ra.getMostRecentURI().getUnqualifiedURI().toString()))) {\n                    ra.transitionComplete();\n                    return true;\n                }\n            ;\n            ;\n            });\n            ra.go(ua, true);\n        },\n        _warnBeforeLeaving: function(ta, ua) {\n            new h().setTitle(\"Are you sure you want to leave this page?\").setBody(ca(ta)).setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: ua\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        restoreScrollPosition: function(ta) {\n            ra._scroll_locked = false;\n            var ua = ja(ta);\n            if (ua) {\n                j.JSBNG__scrollTo(ua, false);\n                return true;\n            }\n        ;\n        ;\n            function va(ya) {\n                if (!ya) {\n                    return null;\n                }\n            ;\n            ;\n                var za = ((((\"a[name='\" + z(ya))) + \"']\"));\n                return ((i.scry(JSBNG__document.body, za)[0] || aa(ya)));\n            };\n        ;\n            var wa = va(s(ta).getFragment());\n            if (wa) {\n                var xa = u.getElementPosition(wa);\n                xa.x = 0;\n                j.JSBNG__scrollTo(xa);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    }, sa = ((window._BusyUIManager || {\n        _looking_busy: false,\n        _original_cursors: [],\n        lookBusy: function(ta) {\n            if (ta) {\n                sa._giveProgressCursor(ta);\n            }\n        ;\n        ;\n            if (sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = true;\n            sa._giveProgressCursor(JSBNG__document.documentElement);\n        },\n        stopLookingBusy: function() {\n            if (!sa._looking_busy) {\n                return;\n            }\n        ;\n        ;\n            sa._looking_busy = false;\n            while (sa._original_cursors.length) {\n                var ta = sa._original_cursors.pop(), ua = ta[0], va = ta[1];\n                if (ua.style) {\n                    ua.style.cursor = ((va || \"\"));\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _giveProgressCursor: function(ta) {\n            if (!t.webkit()) {\n                sa._original_cursors.push([ta,ta.style.cursor,]);\n                ta.style.cursor = \"progress\";\n            }\n        ;\n        ;\n        }\n    }));\n    e.exports = ra;\n    a.PageTransitions = ra;\n});\n__d(\"PixelRatio\", [\"Arbiter\",\"Cookie\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Cookie\"), i = b(\"Run\"), j = \"dpr\", k, l;\n    function m() {\n        return ((window.JSBNG__devicePixelRatio || 1));\n    };\n;\n    function n() {\n        h.set(j, m());\n    };\n;\n    function o() {\n        h.clear(j);\n    };\n;\n    function p() {\n        var r = m();\n        if (((r !== k))) {\n            n();\n        }\n         else o();\n    ;\n    ;\n    };\n;\n    var q = {\n        startDetecting: function(r) {\n            k = ((r || 1));\n            o();\n            if (l) {\n                return;\n            }\n        ;\n        ;\n            l = [g.subscribe(\"pre_page_transition\", p),];\n            i.onBeforeUnload(p);\n        }\n    };\n    e.exports = q;\n});\n__d(\"PostLoadJS\", [\"Bootloader\",\"Run\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Run\"), i = b(\"emptyFunction\");\n    function j(l, m) {\n        h.onAfterLoad(function() {\n            g.loadModules.call(g, [l,], m);\n        });\n    };\n;\n    var k = {\n        loadAndRequire: function(l) {\n            j(l, i);\n        },\n        loadAndCall: function(l, m, n) {\n            j(l, function(o) {\n                o[m].apply(o, n);\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"ControlledReferer\", [\"JSBNG__Event\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"URI\"), i = b(\"UserAgent\"), j = {\n        useFacebookReferer: function(k, l, m) {\n            var n = false;\n            function o() {\n                if (n) {\n                    return;\n                }\n            ;\n            ;\n                var q = k.contentWindow.JSBNG__location.pathname;\n                if (((((q !== \"/intern/common/referer_frame.php\")) && ((q !== \"/common/referer_frame.php\"))))) {\n                    return;\n                }\n            ;\n            ;\n                n = true;\n                k.contentWindow.JSBNG__document.body.style.margin = 0;\n                l();\n            };\n        ;\n            var p;\n            if (((JSBNG__document.domain !== \"facebook.com\"))) {\n                p = \"/intern/common/referer_frame.php\";\n            }\n             else if (i.JSBNG__opera()) {\n                p = \"/common/referer_frame.php\";\n            }\n             else if (h().isSecure()) {\n                p = \"https://s-static.ak.facebook.com/common/referer_frame.php\";\n            }\n             else p = \"http://static.ak.facebook.com/common/referer_frame.php\";\n            \n            \n        ;\n        ;\n            if (m) {\n                p += ((\"?fb_source=\" + m));\n            }\n        ;\n        ;\n            g.listen(k, \"load\", o);\n            k.src = p;\n        },\n        useFacebookRefererHtml: function(k, l, m) {\n            j.useFacebookReferer(k, function() {\n                k.contentWindow.JSBNG__document.body.innerHTML = l;\n            }, m);\n        }\n    };\n    e.exports = j;\n});\n__d(\"SoundRPC\", [\"JSBNG__Event\",\"SoundSynchronizer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"SoundSynchronizer\");\n    function i(k, l, m) {\n        h.play(k, l, m);\n    };\n;\n    var j = {\n        playLocal: i,\n        playRemote: function(k, l, m, n) {\n            var o = {\n                paths: l,\n                sync: m,\n                loop: n\n            };\n            k.JSBNG__postMessage(JSON.stringify(o), \"*\");\n        },\n        supportsRPC: function() {\n            return !!window.JSBNG__postMessage;\n        },\n        _listen: function() {\n            g.listen(window, \"message\", function(k) {\n                if (!/\\.facebook.com$/.test(k.origin)) {\n                    return;\n                }\n            ;\n            ;\n                var l = JSON.parse(k.data);\n                i(l.paths, l.sync, l.loop);\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"TabbableElements\", [\"Style\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Style\"), h = b(\"createArrayFrom\");\n    function i(l) {\n        if (((l.tabIndex >= 0))) {\n            return true;\n        }\n    ;\n    ;\n        switch (l.tagName) {\n          case \"A\":\n            return ((l.href && ((l.rel != \"ignore\"))));\n          case \"INPUT\":\n            return ((((((l.type != \"hidden\")) && ((l.type != \"file\")))) && !l.disabled));\n          case \"BUTTON\":\n        \n          case \"SELECT\":\n        \n          case \"TEXTAREA\":\n            return !l.disabled;\n        };\n    ;\n        return false;\n    };\n;\n    function j(l) {\n        if (((((l.offsetHeight === 0)) && ((l.offsetWidth === 0))))) {\n            return false;\n        }\n    ;\n    ;\n        while (((((l !== JSBNG__document)) && ((g.get(l, \"visibility\") != \"hidden\"))))) {\n            l = l.parentNode;\n        ;\n        };\n    ;\n        return ((l === JSBNG__document));\n    };\n;\n    var k = {\n        JSBNG__find: function(l) {\n            var m = h(l.getElementsByTagName(\"*\"));\n            return m.filter(k.isTabbable);\n        },\n        isTabbable: function(l) {\n            return ((i(l) && j(l)));\n        }\n    };\n    e.exports = k;\n});\n__d(\"UserActivity\", [\"Arbiter\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = 5000, j = 500, k = -5, l = JSBNG__Date.now(), m = l, n = {\n        subscribeOnce: function(p) {\n            var q = n.subscribe(function() {\n                n.unsubscribe(q);\n                p();\n            });\n        },\n        subscribe: function(p) {\n            return g.subscribe(\"useractivity/activity\", p);\n        },\n        unsubscribe: function(p) {\n            p.unsubscribe();\n        },\n        isActive: function(p) {\n            return ((((new JSBNG__Date() - l)) < ((p || i))));\n        },\n        getLastInformTime: function() {\n            return m;\n        }\n    };\n    function o(JSBNG__event) {\n        l = JSBNG__Date.now();\n        var p = ((l - m));\n        if (((p > j))) {\n            m = l;\n            g.inform(\"useractivity/activity\", {\n                JSBNG__event: JSBNG__event,\n                idleness: p,\n                last_inform: m\n            });\n        }\n         else if (((p < k))) {\n            m = l;\n        }\n        \n    ;\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", o);\n    h.listen(window, \"JSBNG__focus\", o);\n    h.listen(JSBNG__document.documentElement, {\n        DOMMouseScroll: o,\n        mousewheel: o,\n        keydown: o,\n        mouseover: o,\n        mousemove: o,\n        click: o\n    });\n    g.subscribe(\"Event/stop\", function(p, q) {\n        o(q.JSBNG__event);\n    });\n    e.exports = n;\n});\n__d(\"guid\", [], function(a, b, c, d, e, f) {\n    function g() {\n        return ((\"f\" + ((Math.JSBNG__random() * ((1 << 30)))).toString(16).replace(\".\", \"\")));\n    };\n;\n    e.exports = g;\n});\n__d(\"throttle\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(j, k, l) {\n        return i(j, k, l, false, false);\n    };\n;\n    g(h, {\n        acrossTransitions: function(j, k, l) {\n            return i(j, k, l, true, false);\n        },\n        withBlocking: function(j, k, l) {\n            return i(j, k, l, false, true);\n        }\n    });\n    function i(j, k, l, m, n) {\n        if (((k == null))) {\n            k = 100;\n        }\n    ;\n    ;\n        var o, p, q;\n        function r() {\n            p = JSBNG__Date.now();\n            if (o) {\n                j.apply(l, o);\n                o = null;\n                q = JSBNG__setTimeout(r, k, !m);\n            }\n             else q = false;\n        ;\n        ;\n        };\n    ;\n        return function s() {\n            o = arguments;\n            if (((!q || ((((JSBNG__Date.now() - p)) > k))))) {\n                if (n) {\n                    r();\n                }\n                 else q = JSBNG__setTimeout(r, 0, !m);\n            ;\n            }\n        ;\n        ;\n        };\n    };\n;\n    e.exports = h;\n});\n__d(\"UIPagelet\", [\"AjaxPipeRequest\",\"AsyncRequest\",\"DOM\",\"HTML\",\"ScriptPathState\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"HTML\"), k = b(\"ScriptPathState\"), l = b(\"URI\"), m = b(\"copyProperties\"), n = b(\"emptyFunction\"), o = b(\"ge\");\n    function p(q, r, s) {\n        var t = ((((q && i.isElementNode(q))) ? q.id : q));\n        this._id = ((t || null));\n        this._element = o(((q || i.create(\"div\"))));\n        this._src = ((r || null));\n        this._context_data = ((s || {\n        }));\n        this._data = {\n        };\n        this._handler = n;\n        this._request = null;\n        this._use_ajaxpipe = false;\n        this._is_bundle = true;\n        this._allow_cross_page_transition = false;\n        this._append = false;\n    };\n;\n    p.loadFromEndpoint = function(q, r, s, t) {\n        t = ((t || {\n        }));\n        var u = ((\"/ajax/pagelet/generic.php/\" + q));\n        if (t.intern) {\n            u = ((\"/intern\" + u));\n        }\n    ;\n    ;\n        var v = new l(u.replace(/\\/+/g, \"/\"));\n        if (t.subdomain) {\n            v.setSubdomain(t.subdomain);\n        }\n    ;\n    ;\n        var w = new p(r, v, s).setUseAjaxPipe(t.usePipe).setBundleOption(((t.bundle !== false))).setAppend(t.append).setJSNonBlock(t.jsNonblock).setAutomatic(t.automatic).setDisplayCallback(t.displayCallback).setConstHeight(t.constHeight).setAllowCrossPageTransition(t.crossPage).setFinallyHandler(((t.finallyHandler || n))).setTransportErrorHandler(t.transportErrorHandler);\n        ((t.handler && w.setHandler(t.handler)));\n        w.go();\n        return w;\n    };\n    m(p.prototype, {\n        getElement: function() {\n            return this._element;\n        },\n        setHandler: function(q) {\n            this._handler = q;\n            return this;\n        },\n        go: function(q, r) {\n            if (((((arguments.length >= 2)) || ((typeof q == \"string\"))))) {\n                this._src = q;\n                this._data = ((r || {\n                }));\n            }\n             else if (((arguments.length == 1))) {\n                this._data = q;\n            }\n            \n        ;\n        ;\n            this.refresh();\n            return this;\n        },\n        setAllowCrossPageTransition: function(q) {\n            this._allow_cross_page_transition = q;\n            return this;\n        },\n        setBundleOption: function(q) {\n            this._is_bundle = q;\n            return this;\n        },\n        setTransportErrorHandler: function(q) {\n            this.transportErrorHandler = q;\n            return this;\n        },\n        refresh: function() {\n            if (this._use_ajaxpipe) {\n                k.setIsUIPageletRequest(true);\n                this._request = new g();\n                this._request.setCanvasId(this._id).setAppend(this._append).setConstHeight(this._constHeight).setJSNonBlock(this._jsNonblock).setAutomatic(this._automatic).setDisplayCallback(this._displayCallback).setFinallyHandler(this._finallyHandler);\n            }\n             else {\n                var q = function(t) {\n                    this._request = null;\n                    var u = j(t.getPayload());\n                    if (this._append) {\n                        i.appendContent(this._element, u);\n                    }\n                     else i.setContent(this._element, u);\n                ;\n                ;\n                    this._handler();\n                }.bind(this), r = this._displayCallback;\n                this._request = new h().setMethod(\"GET\").setReadOnly(true).setOption(\"bundle\", this._is_bundle).setHandler(function(t) {\n                    if (r) {\n                        r(q.curry(t));\n                    }\n                     else q(t);\n                ;\n                ;\n                    if (this._finallyHandler) {\n                        this._finallyHandler();\n                    }\n                ;\n                ;\n                });\n                if (this.transportErrorHandler) {\n                    this._request.setTransportErrorHandler(this.transportErrorHandler);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = {\n            };\n            m(s, this._context_data);\n            m(s, this._data);\n            this._request.setURI(this._src).setAllowCrossPageTransition(this._allow_cross_page_transition).setData({\n                data: JSON.stringify(s)\n            }).send();\n            return this;\n        },\n        cancel: function() {\n            if (this._request) {\n                this._request.abort();\n            }\n        ;\n        ;\n        },\n        setUseAjaxPipe: function(q) {\n            this._use_ajaxpipe = !!q;\n            return this;\n        },\n        setAppend: function(q) {\n            this._append = !!q;\n            return this;\n        },\n        setJSNonBlock: function(q) {\n            this._jsNonblock = !!q;\n            return this;\n        },\n        setAutomatic: function(q) {\n            this._automatic = !!q;\n            return this;\n        },\n        setDisplayCallback: function(q) {\n            this._displayCallback = q;\n            return this;\n        },\n        setConstHeight: function(q) {\n            this._constHeight = !!q;\n            return this;\n        },\n        setFinallyHandler: function(q) {\n            this._finallyHandler = q;\n            return this;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TabIsolation\", [\"JSBNG__Event\",\"DOMQuery\",\"Focus\",\"Keys\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMQuery\"), i = b(\"Focus\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"copyProperties\"), m = [], n = 0;\n    function o(p) {\n        this._root = p;\n        this._eventHandler = null;\n        this._identifier = n++;\n    };\n;\n    l(o.prototype, {\n        enable: function() {\n            m.unshift(this._identifier);\n            this._eventHandler = g.listen(window, \"keydown\", function(p) {\n                if (((m[0] === this._identifier))) {\n                    this._tabHandler(p);\n                }\n            ;\n            ;\n            }.bind(this), g.Priority.URGENT);\n        },\n        disable: function() {\n            var p;\n            if (this._eventHandler) {\n                p = m.indexOf(this._identifier);\n                if (((p > -1))) {\n                    m.splice(p, 1);\n                }\n            ;\n            ;\n                this._eventHandler.remove();\n                this._eventHandler = null;\n            }\n        ;\n        ;\n        },\n        _tabHandler: function(p) {\n            if (((g.getKeyCode(p) !== j.TAB))) {\n                return;\n            }\n        ;\n        ;\n            var q = p.getTarget();\n            if (!q) {\n                return;\n            }\n        ;\n        ;\n            var r = k.JSBNG__find(this._root), s = r[0], t = r[((r.length - 1))], u = p.getModifiers().shift;\n            if (((u && ((q === s))))) {\n                p.preventDefault();\n                i.set(t);\n            }\n             else if (((((!u && ((q === t)))) || !h.contains(this._root, q)))) {\n                p.preventDefault();\n                i.set(s);\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ContextualLayerUpdateOnScroll\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._subscriptions = [this._layer.subscribe(\"show\", this._attachScrollListener.bind(this)),this._layer.subscribe(\"hide\", this._removeScrollListener.bind(this)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this.detach();\n        },\n        _attachScrollListener: function() {\n            if (this._listener) {\n                return;\n            }\n        ;\n        ;\n            var j = this._layer.getContextScrollParent();\n            this._listener = g.listen(j, \"JSBNG__scroll\", this._layer.updatePosition.bind(this._layer));\n        },\n        _removeScrollListener: function() {\n            ((this._listener && this._listener.remove()));\n            this._listener = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerAutoFocus\", [\"function-extensions\",\"DOMQuery\",\"Focus\",\"TabbableElements\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"DOMQuery\"), h = b(\"Focus\"), i = b(\"TabbableElements\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"aftershow\", this._focus.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _focus: function() {\n            var l = this._layer.getRoot(), m = g.scry(l, \".autofocus\")[0], n = true;\n            if (!m) {\n                var o = JSBNG__document.activeElement;\n                if (g.isNodeOfType(o, [\"input\",\"textarea\",])) {\n                    return;\n                }\n            ;\n            ;\n                var p = i.JSBNG__find(l);\n                for (var q = 0; ((q < p.length)); q++) {\n                    if (((p[q].tagName != \"A\"))) {\n                        m = p[q];\n                        n = false;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n             else if (((m.tabIndex !== 0))) {\n                n = false;\n            }\n            \n        ;\n        ;\n            if (m) {\n                ((n ? h.set(m) : h.setWithoutOutline(m)));\n            }\n             else {\n                l.tabIndex = 0;\n                h.setWithoutOutline(l);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerButtons\", [\"JSBNG__Event\",\"Parent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Parent\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    i(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _handle: function(k) {\n            var l = k.getTarget(), m = h.byClass(l, \"layerConfirm\");\n            if (m) {\n                if (((this._layer.inform(\"JSBNG__confirm\", m) === false))) {\n                    k.prevent();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var n = h.byClass(l, \"layerCancel\");\n            if (n) {\n                if (((this._layer.inform(\"cancel\", n) !== false))) {\n                    this._layer.hide();\n                }\n            ;\n            ;\n                k.prevent();\n                return;\n            }\n        ;\n        ;\n            var o = h.byClass(l, \"layerButton\");\n            if (o) {\n                if (((this._layer.inform(\"button\", o) === false))) {\n                    k.prevent();\n                }\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"LayerFadeOnShow\", [\"Animation\",\"Style\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Style\"), i = b(\"UserAgent\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    j(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            if (((i.ie() < 9))) {\n                return;\n            }\n        ;\n        ;\n            this._subscriptions = [this._layer.subscribe(\"beforeshow\", function() {\n                h.set(this._layer.getRoot(), \"opacity\", 0);\n            }.bind(this)),this._layer.subscribe(\"show\", this._animate.bind(this)),];\n        },\n        disable: function() {\n            if (this._subscriptions) {\n                while (this._subscriptions.length) {\n                    this._subscriptions.pop().unsubscribe();\n                ;\n                };\n            ;\n                this._subscriptions = null;\n            }\n        ;\n        ;\n        },\n        _getDuration: function() {\n            return 100;\n        },\n        _animate: function() {\n            var l = this._layer.getRoot();\n            new g(l).from(\"opacity\", 0).to(\"opacity\", 1).duration(this._getDuration()).ondone(h.set.curry(l, \"opacity\", \"\")).go();\n        }\n    });\n    e.exports = k;\n});\n__d(\"LayerFormHooks\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var j = this._layer.getRoot();\n            this._subscriptions = [g.listen(j, \"submit\", this._onSubmit.bind(this)),g.listen(j, \"success\", this._onSuccess.bind(this)),g.listen(j, \"error\", this._onError.bind(this)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(j) {\n                j.remove();\n            });\n            this._subscriptions = null;\n        },\n        _onSubmit: function(JSBNG__event) {\n            if (((this._layer.inform(\"submit\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onSuccess: function(JSBNG__event) {\n            if (((this._layer.inform(\"success\", JSBNG__event) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _onError: function(JSBNG__event) {\n            var j = JSBNG__event.getData();\n            if (((this._layer.inform(\"error\", {\n                response: j.response\n            }) === false))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = i;\n});\n__d(\"LayerRefocusOnHide\", [\"copyProperties\",\"Focus\",\"ContextualThing\",\"DOM\",\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Focus\"), i = b(\"ContextualThing\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"Parent\");\n    function m(n) {\n        this._layer = n;\n    };\n;\n    g(m.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"hide\", this._handle.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _handle: function(n, JSBNG__event) {\n            if (((((JSBNG__document.activeElement === JSBNG__document.body)) || k.contains(this._layer.getRoot(), JSBNG__document.activeElement)))) {\n                var o = this._layer.getCausalElement();\n                while (((o && (!o.offsetWidth)))) {\n                    var p = l.byClass(o, \"uiToggle\");\n                    if (((p && p.offsetWidth))) {\n                        o = j.scry(p, \"[rel=\\\"toggle\\\"]\")[0];\n                    }\n                     else {\n                        var q = i.getContext(o);\n                        if (q) {\n                            o = q;\n                        }\n                         else o = o.parentNode;\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((o && ((o.tabIndex != -1))))) {\n                    h.setWithoutOutline(o);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"LayerTabIsolation\", [\"TabIsolation\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"TabIsolation\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._layer = j;\n        this._tabIsolation = null;\n    };\n;\n    h(i.prototype, {\n        _subscriptions: [],\n        enable: function() {\n            this._tabIsolation = new g(this._layer.getRoot());\n            this._subscriptions = [this._layer.subscribe(\"show\", this._tabIsolation.enable.bind(this._tabIsolation)),this._layer.subscribe(\"hide\", this._tabIsolation.disable.bind(this._tabIsolation)),];\n        },\n        disable: function() {\n            while (this._subscriptions.length) {\n                this._subscriptions.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._tabIsolation.disable();\n            this._tabIsolation = null;\n        }\n    });\n    e.exports = i;\n});\n__d(\"ModalLayer\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"DOMDimensions\",\"DOMQuery\",\"ScrollAwareDOM\",\"Style\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"isAsyncScrollQuery\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"DOMQuery\"), n = b(\"ScrollAwareDOM\"), o = b(\"Style\"), p = b(\"URI\"), q = b(\"UserAgent\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"debounceAcrossTransitions\"), w = b(\"isAsyncScrollQuery\"), x = b(\"removeFromArray\"), y = [], z = null, aa = null, ba = null;\n    function ca() {\n        if (!ba) {\n            ba = m.scry(JSBNG__document.body, \".-cx-PRIVATE-fbLayout__root\")[0];\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    function da(la) {\n        var ma = {\n            position: r.getScrollPosition()\n        }, na = ((la.offsetTop - ma.position.y));\n        i.addClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n        o.set(la, \"JSBNG__top\", ((na + \"px\")));\n        h.inform(\"reflow\");\n        ma.listener = n.subscribe(\"JSBNG__scroll\", function(oa, pa) {\n            if (m.contains(la, pa.target)) {\n                var qa = ((la.offsetTop - pa.delta.y));\n                o.set(la, \"JSBNG__top\", ((qa + \"px\")));\n                ma.position = ma.position.add(pa.delta);\n                return false;\n            }\n        ;\n        ;\n        });\n        j.set(la, \"ModalLayerData\", ma);\n        if (((q.firefox() < 13))) {\n            ea.curry(la).defer();\n        }\n    ;\n    ;\n    };\n;\n    function ea(la) {\n        m.scry(la, \"div.swfObject\").forEach(function(ma) {\n            var na = ma.getAttribute(\"data-swfid\");\n            if (((na && window[na]))) {\n                var oa = window[na];\n                oa.addParam(\"autostart\", \"false\");\n                oa.addParam(\"autoplay\", \"false\");\n                oa.addParam(\"play\", \"false\");\n                oa.addVariable(\"video_autoplay\", \"0\");\n                oa.addVariable(\"autoplay\", \"0\");\n                oa.addVariable(\"play\", \"0\");\n                var pa = p(oa.getAttribute(\"swf\"));\n                pa.addQueryData({\n                    autoplay: \"0\"\n                });\n                pa.setPath(pa.getPath().replace(\"autoplay=1\", \"autoplay=0\"));\n                oa.setAttribute(\"swf\", pa.toString());\n                oa.write(ma);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function fa(la, ma) {\n        var na = j.get(la, \"ModalLayerData\");\n        if (na) {\n            var oa = function() {\n                i.removeClass(la, \"-cx-PRIVATE-ModalLayer__fixed\");\n                o.set(la, \"JSBNG__top\", \"\");\n                if (ma) {\n                    var ra = m.getDocumentScrollElement();\n                    ra.scrollTop = na.position.y;\n                }\n            ;\n            ;\n                h.inform(\"reflow\");\n                na.listener.unsubscribe();\n                na.listener = null;\n                j.remove(la, \"ModalLayerData\");\n            };\n            if (((ma && w()))) {\n                var pa = k.create(\"div\", {\n                    className: \"-cx-PRIVATE-ModalLayer__support\"\n                });\n                o.set(pa, \"height\", ((la.offsetHeight + \"px\")));\n                k.appendContent(JSBNG__document.body, pa);\n                var qa = m.getDocumentScrollElement();\n                qa.scrollTop = na.position.y;\n                ma = false;\n                !function() {\n                    oa();\n                    k.remove(pa);\n                }.defer();\n            }\n             else oa();\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((q.ie() < 7))) {\n            o.set(la, \"height\", \"\");\n        }\n    ;\n    ;\n    };\n;\n    function ga() {\n        var la = ca();\n        if (!i.hasClass(la, \"-cx-PRIVATE-ModalLayer__fixed\")) {\n            da(la);\n        }\n    ;\n    ;\n    };\n;\n    function ha() {\n        if (!y.length) {\n            fa(ca(), true);\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        var la;\n        if (((q.ie() < 7))) {\n            var ma = y[((y.length - 1))].getLayerRoot(), na = Math.max(ma.offsetHeight, ma.scrollHeight);\n            la = function(ta) {\n                o.set(ta, \"height\", ((((-ta.offsetTop + na)) + \"px\")));\n            };\n        }\n    ;\n    ;\n        var oa = y.length;\n        while (oa--) {\n            var pa = y[oa], qa = pa.getLayerRoot();\n            ja(qa, \"\");\n            var ra = pa.getLayerContentRoot(), sa = ((ra.offsetWidth + l.measureElementBox(ra, \"width\", 0, 0, 1)));\n            ja(qa, sa);\n            if (((la && ((oa < ((y.length - 1))))))) {\n                la(qa);\n            }\n        ;\n        ;\n        };\n    ;\n        ((la && la(ca())));\n    };\n;\n    function ja(la, ma) {\n        var na = ((q.ie() < 7));\n        if (((((na && ma)) && ((ma <= JSBNG__document.body.clientWidth))))) {\n            ma = \"\";\n        }\n    ;\n    ;\n        o.set(la, ((na ? \"width\" : \"min-width\")), ((ma + ((ma ? \"px\" : \"\")))));\n    };\n;\n    function ka(la) {\n        this._layer = la;\n    };\n;\n    s(ka.prototype, {\n        _subscription: null,\n        enable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(la) {\n                ((((la == \"show\")) ? this._addModal() : this._removeModal()));\n            }.bind(this));\n            if (this._layer.isShown()) {\n                this._addModal();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (!ca()) {\n                return;\n            }\n        ;\n        ;\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            if (this._layer.isShown()) {\n                this._removeModal();\n            }\n        ;\n        ;\n        },\n        _addModal: function() {\n            i.addClass(this.getLayerRoot(), \"-cx-PRIVATE-ModalLayer__root\");\n            var la = y[((y.length - 1))];\n            if (la) {\n                da(la.getLayerRoot());\n            }\n             else ga();\n        ;\n        ;\n            var ma = m.getDocumentScrollElement();\n            ma.scrollTop = 0;\n            if (!y.length) {\n                if (((q.ie() < 7))) {\n                    i.addClass(JSBNG__document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                }\n            ;\n            ;\n                var na = v(ia, 100);\n                z = g.listen(window, \"resize\", na);\n                aa = h.subscribe(\"reflow\", na);\n            }\n        ;\n        ;\n            y.push(this);\n            ia.defer();\n        },\n        _removeModal: function() {\n            var la = this.getLayerRoot();\n            i.removeClass(la, \"-cx-PRIVATE-ModalLayer__root\");\n            ja(la, \"\");\n            var ma = ((this === y[((y.length - 1))]));\n            x(y, this);\n            var na = y[((y.length - 1))];\n            if (!na) {\n                z.remove();\n                z = null;\n                aa.unsubscribe();\n                aa = null;\n            }\n        ;\n        ;\n            !function() {\n                if (na) {\n                    fa(na.getLayerRoot(), ma);\n                }\n                 else ha();\n            ;\n            ;\n                if (y.length) {\n                    ia.defer();\n                }\n                 else if (((q.ie() < 7))) {\n                    i.removeClass(JSBNG__document.documentElement, \"-cx-PRIVATE-ModalLayer__open\");\n                }\n                \n            ;\n            ;\n            }.defer(400, false);\n        },\n        getLayerRoot: function() {\n            return this._layer.getRoot();\n        },\n        getLayerContentRoot: function() {\n            return this._layer.getContentRoot();\n        }\n    });\n    e.exports = ka;\n});\n__d(\"DialogPosition\", [\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Vector\"), h = 40, i, j = {\n        calculateTopMargin: function(k, l) {\n            if (i) {\n                return i;\n            }\n        ;\n        ;\n            var m = g.getViewportDimensions(), n = Math.floor(((((((m.x + k)) * ((m.y - l)))) / ((4 * m.x)))));\n            return Math.max(n, h);\n        },\n        setFixedTopMargin: function(k) {\n            i = k;\n        }\n    };\n    e.exports = j;\n});\n__d(\"DialogX\", [\"function-extensions\",\"JSXDOM\",\"Arbiter\",\"Class\",\"JSBNG__CSS\",\"DialogPosition\",\"JSBNG__Event\",\"Layer\",\"LayerAutoFocus\",\"LayerButtons\",\"LayerFormHooks\",\"LayerRefocusOnHide\",\"LayerTabIsolation\",\"ModalLayer\",\"Style\",\"Vector\",\"copyProperties\",\"cx\",\"debounce\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"JSBNG__CSS\"), k = b(\"DialogPosition\"), l = b(\"JSBNG__Event\"), m = b(\"Layer\"), n = b(\"LayerAutoFocus\"), o = b(\"LayerButtons\"), p = b(\"LayerFormHooks\"), q = b(\"LayerRefocusOnHide\"), r = b(\"LayerTabIsolation\"), s = b(\"ModalLayer\"), t = b(\"Style\"), u = b(\"Vector\"), v = b(\"copyProperties\"), w = b(\"cx\"), x = b(\"debounce\"), y = b(\"shield\");\n    function z(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    i.extend(z, m);\n    v(z.prototype, {\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            j.addClass(this.getRoot(), \"-cx-PRIVATE-ModalLayer__xui\");\n            if (ba.autohide) {\n                var da = this.subscribe(\"show\", function() {\n                    da.unsubscribe();\n                    y(this.hide, this).defer(ba.autohide);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([aa,s,n,o,p,r,q,]);\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = ((ba.xui ? \"-cx-PRIVATE-xuiDialog__content\" : \"-cx-PRIVATE-uiDialog__content\")), ea = ((ba.xui ? \"-cx-PUBLIC-xuiDialog__wrapper\" : \"-cx-PUBLIC-uiDialog__wrapper\"));\n            this._innerContent = g.div(null, ca);\n            this._wrapper = g.div({\n                className: ea,\n                role: \"dialog\",\n                \"aria-labelledby\": ((ba.titleID || null))\n            }, g.div({\n                className: da\n            }, this._innerContent));\n            this.setWidth(ba.width);\n            return (g.div({\n                className: \"-cx-PRIVATE-uiDialog__positioner\",\n                role: \"dialog\"\n            }, this._wrapper));\n        },\n        getContentRoot: function() {\n            return this._wrapper;\n        },\n        getInnerContent: function() {\n            return this._innerContent;\n        },\n        updatePosition: function() {\n            var ba = u.getElementDimensions(this._wrapper), ca = k.calculateTopMargin(ba.x, ba.y);\n            t.set(this._wrapper, \"margin-top\", ((ca + \"px\")));\n            this.inform(\"update_position\", {\n                type: \"DialogX\",\n                JSBNG__top: ca\n            });\n        },\n        setWidth: function(ba) {\n            ba = Math.floor(ba);\n            if (((ba === this._width))) {\n                return;\n            }\n        ;\n        ;\n            this._width = ba;\n            t.set(this._wrapper, \"width\", ((ba + \"px\")));\n        },\n        getWidth: function() {\n            return this._width;\n        }\n    });\n    function aa(ba) {\n        this._layer = ba;\n    };\n;\n    v(aa.prototype, {\n        _subscription: null,\n        _resize: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(ba) {\n                if (((ba === \"show\"))) {\n                    this._attach();\n                    h.inform(\"layer_shown\", {\n                        type: \"DialogX\"\n                    });\n                }\n                 else {\n                    this._detach();\n                    h.inform(\"layer_hidden\", {\n                        type: \"DialogX\"\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n            ((this._resize && this._detach()));\n        },\n        _attach: function() {\n            this._layer.updatePosition();\n            this._resize = l.listen(window, \"resize\", x(this._layer.updatePosition.bind(this._layer)));\n        },\n        _detach: function() {\n            this._resize.remove();\n            this._resize = null;\n        }\n    });\n    e.exports = z;\n});\n__d(\"eachKeyVal\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        if (((!h || !i))) {\n            return;\n        }\n    ;\n    ;\n        var k = Object.keys(h), l;\n        for (l = 0; ((l < k.length)); l++) {\n            i.call(j, k[l], h[k[l]], h, l);\n        ;\n        };\n    ;\n    };\n;\n    e.exports = g;\n});\n__d(\"LoadingDialogDimensions\", [], function(a, b, c, d, e, f) {\n    var g = {\n        HEIGHT: 96,\n        WIDTH: 300\n    };\n    e.exports = g;\n});\n__d(\"AsyncDialog\", [\"AsyncRequest\",\"Bootloader\",\"JSBNG__CSS\",\"DialogX\",\"DOM\",\"Env\",\"Keys\",\"LayerFadeOnShow\",\"Parent\",\"React\",\"URI\",\"XUISpinner.react\",\"copyProperties\",\"cx\",\"eachKeyVal\",\"emptyFunction\",\"LoadingDialogDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"JSBNG__CSS\"), j = b(\"DialogX\"), k = b(\"DOM\"), l = b(\"Env\"), m = b(\"Keys\"), n = b(\"LayerFadeOnShow\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"URI\"), r = b(\"XUISpinner.react\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"eachKeyVal\"), v = b(\"emptyFunction\"), w = b(\"LoadingDialogDimensions\").WIDTH, x;\n    function y() {\n        if (!x) {\n            var ga = k.create(\"div\", {\n                className: \"-cx-PRIVATE-loadingDialog__spinnercontainer\"\n            });\n            x = new j({\n                width: w,\n                addedBehaviors: [n,],\n                xui: true\n            }, k.create(\"div\", null, ga));\n            p.renderComponent(r({\n                size: \"large\"\n            }), ga);\n            x.subscribe([\"key\",\"JSBNG__blur\",], function(ha, ia) {\n                if (((((ha == \"JSBNG__blur\")) || ((((ha == \"key\")) && ((ia.keyCode == m.ESC))))))) {\n                    ca();\n                    return false;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    var z = {\n    }, aa = 1, ba = [];\n    function ca() {\n        u(z, function(ga, ha) {\n            ha.abandon();\n            da(ga);\n        });\n    };\n;\n    function da(ga) {\n        delete z[ga];\n        if (!Object.keys(z).length) {\n            y().hide();\n        }\n    ;\n    ;\n    };\n;\n    function ea(ga, ha) {\n        var ia = aa++;\n        ba[ia] = ha;\n        z[ia] = ga;\n        var ja = da.curry(((\"\" + ia)));\n        s(ga.getData(), {\n            __asyncDialog: ia\n        });\n        y().setCausalElement(ga.getRelativeTo()).show();\n        var ka = ga.finallyHandler;\n        ga.setFinallyHandler(function(la) {\n            var ma = la.getPayload();\n            if (((ma && ma.asyncURL))) {\n                fa.send(new g(ma.asyncURL));\n            }\n        ;\n        ;\n            ja();\n            ((ka && ka(la)));\n        });\n        ga.setInterceptHandler(ja).setAbortHandler(ja);\n        ga.send();\n    };\n;\n    var fa = {\n        send: function(ga, ha) {\n            ea(ga, ((ha || v)));\n        },\n        bootstrap: function(ga, ha, ia) {\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            var ja = ((o.byClass(ha, \"stat_elem\") || ha));\n            if (((ja && i.hasClass(ja, \"async_saving\")))) {\n                return false;\n            }\n        ;\n        ;\n            var ka = new q(ga).getQueryData(), la = ((ia === \"dialog\")), ma = new g().setURI(ga).setData(ka).setMethod(((la ? \"GET\" : \"POST\"))).setReadOnly(la).setRelativeTo(ha).setStatusElement(ja).setNectarModuleDataSafe(ha);\n            if (l.is_desktop) {\n                h.loadModules([\"FbdDialogProvider\",], function(na) {\n                    na.sendDialog(ma, fa.send);\n                });\n                return;\n            }\n        ;\n        ;\n            fa.send(ma);\n        },\n        respond: function(ga, ha) {\n            var ia = ba[ga];\n            if (ia) {\n                ia(ha);\n                delete ba[ga];\n            }\n        ;\n        ;\n        },\n        getLoadingDialog: function() {\n            return y();\n        }\n    };\n    e.exports = fa;\n});\n__d(\"MenuTheme\", [\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\");\n    e.exports = {\n        className: \"-cx-PRIVATE-uiMenu__root\"\n    };\n});\n__d(\"BanzaiODS\", [\"Banzai\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"invariant\");\n    function i() {\n        var k = {\n        }, l = {\n        };\n        function m(n, o, p, q) {\n            if (((p === undefined))) {\n                p = 1;\n            }\n        ;\n        ;\n            if (((q === undefined))) {\n                q = 1;\n            }\n        ;\n        ;\n            if (((n in l))) {\n                if (((l[n] <= 0))) {\n                    return;\n                }\n                 else p /= l[n];\n            ;\n            }\n        ;\n        ;\n            var r = ((k[n] || (k[n] = {\n            }))), s = ((r[o] || (r[o] = [0,])));\n            p = Number(p);\n            q = Number(q);\n            if (((!isFinite(p) || !isFinite(q)))) {\n                return;\n            }\n        ;\n        ;\n            s[0] += p;\n            if (((arguments.length >= 4))) {\n                if (!s[1]) {\n                    s[1] = 0;\n                }\n            ;\n            ;\n                s[1] += q;\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            setEntitySample: function(n, o) {\n                l[n] = ((((Math.JSBNG__random() < o)) ? o : 0));\n            },\n            bumpEntityKey: function(n, o, p) {\n                m(n, o, p);\n            },\n            bumpFraction: function(n, o, p, q) {\n                m(n, o, p, q);\n            },\n            flush: function(n) {\n                {\n                    var fin111keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin111i = (0);\n                    var o;\n                    for (; (fin111i < fin111keys.length); (fin111i++)) {\n                        ((o) = (fin111keys[fin111i]));\n                        {\n                            g.post(((\"ods:\" + o)), k[o], n);\n                        ;\n                        };\n                    };\n                };\n            ;\n                k = {\n                };\n            }\n        };\n    };\n;\n    var j = i();\n    j.create = i;\n    g.subscribe(g.SEND, j.flush.bind(j, null));\n    e.exports = j;\n});\n__d(\"arrayContains\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return ((h.indexOf(i) != -1));\n    };\n;\n    e.exports = g;\n});");
// 5118
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o60,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/n7J6-ECl4cu.js",o61);
// undefined
o60 = null;
// undefined
o61 = null;
// 5123
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"f7Tpb\",]);\n}\n;\n__d(\"BrowserSupport\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = {\n    }, i = [\"Webkit\",\"Moz\",\"O\",\"ms\",], j = document.createElement(\"div\"), k = function(m) {\n        if ((h[m] === undefined)) {\n            var n = null;\n            if ((m in j.style)) {\n                n = m;\n            }\n             else for (var o = 0; (o < i.length); o++) {\n                var p = ((i[o] + m.charAt(0).toUpperCase()) + m.slice(1));\n                if ((p in j.style)) {\n                    n = p;\n                    break;\n                }\n            ;\n            }\n        ;\n            h[m] = n;\n        }\n    ;\n        return h[m];\n    }, l = {\n        hasCSSAnimations: function() {\n            return !!k(\"animationName\");\n        },\n        hasCSSTransforms: function() {\n            return !!k(\"transform\");\n        },\n        hasCSS3DTransforms: function() {\n            return !!k(\"perspective\");\n        },\n        hasCSSTransitions: function() {\n            return !!k(\"transition\");\n        },\n        hasPositionSticky: function() {\n            if ((h.sticky === undefined)) {\n                j.style.cssText = (\"position:-webkit-sticky;position:-moz-sticky;\" + \"position:-o-sticky;position:-ms-sticky;position:sticky;\");\n                h.sticky = /sticky/.test(j.style.position);\n            }\n        ;\n            return h.sticky;\n        },\n        hasPointerEvents: function() {\n            if ((h.pointerEvents === undefined)) {\n                if (!((\"pointerEvents\" in j.style))) {\n                    h.pointerEvents = false;\n                }\n                 else {\n                    j.style.pointerEvents = \"auto\";\n                    j.style.pointerEvents = \"x\";\n                    g.appendContent(document.documentElement, j);\n                    h.pointerEvents = (window.getComputedStyle && (getComputedStyle(j, \"\").pointerEvents === \"auto\"));\n                    g.remove(j);\n                }\n            \n            };\n            return h.pointerEvents;\n        },\n        getTransitionEndEvent: function() {\n            if ((h.transitionEnd === undefined)) {\n                var m = {\n                    transition: \"transitionend\",\n                    WebkitTransition: \"webkitTransitionEnd\",\n                    MozTransition: \"mozTransitionEnd\",\n                    OTransition: \"oTransitionEnd\"\n                }, n = k(\"transition\");\n                h.transitionEnd = (m[n] || null);\n            }\n        ;\n            return h.transitionEnd;\n        }\n    };\n    e.exports = l;\n});\n__d(\"shield\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if ((typeof h != \"function\")) {\n            throw new TypeError()\n        };\n        var j = Array.prototype.slice.call(arguments, 2);\n        return function() {\n            return h.apply(i, j);\n        };\n    };\n    e.exports = g;\n});\n__d(\"Animation\", [\"BrowserSupport\",\"CSS\",\"DataStore\",\"DOM\",\"Style\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Style\"), l = b(\"shield\"), m, n = [], o;\n    function p(ga) {\n        if ((a == this)) {\n            return new p(ga);\n        }\n         else {\n            this.obj = ga;\n            this._reset_state();\n            this.queue = [];\n            this.last_attr = null;\n        }\n    ;\n    };\n    function q(ga) {\n        if (g.hasCSS3DTransforms()) {\n            return t(ga);\n        }\n         else return s(ga)\n    ;\n    };\n    function r(ga) {\n        return ga.toFixed(8);\n    };\n    function s(ga) {\n        ga = [ga[0],ga[4],ga[1],ga[5],ga[12],ga[13],];\n        return ((\"matrix(\" + ga.map(r).join(\",\")) + \")\");\n    };\n    function t(ga) {\n        return ((\"matrix3d(\" + ga.map(r).join(\",\")) + \")\");\n    };\n    function u(ga, ha) {\n        if (!ga) {\n            ga = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,];\n        };\n        var ia = [];\n        for (var ja = 0; (ja < 4); ja++) {\n            for (var ka = 0; (ka < 4); ka++) {\n                var la = 0;\n                for (var ma = 0; (ma < 4); ma++) {\n                    la += (ga[((ja * 4) + ma)] * ha[((ma * 4) + ka)]);;\n                };\n                ia[((ja * 4) + ka)] = la;\n            };\n        };\n        return ia;\n    };\n    var v = 0;\n    p.prototype._reset_state = function() {\n        this.state = {\n            attrs: {\n            },\n            duration: 500\n        };\n    };\n    p.prototype.stop = function() {\n        this._reset_state();\n        this.queue = [];\n        return this;\n    };\n    p.prototype._build_container = function() {\n        if (this.container_div) {\n            this._refresh_container();\n            return;\n        }\n    ;\n        if ((this.obj.firstChild && this.obj.firstChild.__animation_refs)) {\n            this.container_div = this.obj.firstChild;\n            this.container_div.__animation_refs++;\n            this._refresh_container();\n            return;\n        }\n    ;\n        var ga = document.createElement(\"div\");\n        ga.style.padding = \"0px\";\n        ga.style.margin = \"0px\";\n        ga.style.border = \"0px\";\n        ga.__animation_refs = 1;\n        var ha = this.obj.childNodes;\n        while (ha.length) {\n            ga.appendChild(ha[0]);;\n        };\n        this.obj.appendChild(ga);\n        this._orig_overflow = this.obj.style.overflow;\n        this.obj.style.overflow = \"hidden\";\n        this.container_div = ga;\n        this._refresh_container();\n    };\n    p.prototype._refresh_container = function() {\n        this.container_div.style.height = \"auto\";\n        this.container_div.style.width = \"auto\";\n        this.container_div.style.height = (this.container_div.offsetHeight + \"px\");\n        this.container_div.style.width = (this.container_div.offsetWidth + \"px\");\n    };\n    p.prototype._destroy_container = function() {\n        if (!this.container_div) {\n            return\n        };\n        if (!--this.container_div.__animation_refs) {\n            var ga = this.container_div.childNodes;\n            while (ga.length) {\n                this.obj.appendChild(ga[0]);;\n            };\n            this.obj.removeChild(this.container_div);\n        }\n    ;\n        this.container_div = null;\n        this.obj.style.overflow = this._orig_overflow;\n    };\n    var w = 1, x = 2, y = 3;\n    p.prototype._attr = function(ga, ha, ia) {\n        ga = ga.replace(/-[a-z]/gi, function(ka) {\n            return ka.substring(1).toUpperCase();\n        });\n        var ja = false;\n        switch (ga) {\n          case \"background\":\n            this._attr(\"backgroundColor\", ha, ia);\n            return this;\n          case \"backgroundColor\":\n        \n          case \"borderColor\":\n        \n          case \"color\":\n            ha = ca(ha);\n            break;\n          case \"opacity\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"height\":\n        \n          case \"width\":\n            if ((ha == \"auto\")) {\n                ja = true;\n            }\n             else ha = parseInt(ha, 10);\n        ;\n            break;\n          case \"borderWidth\":\n        \n          case \"lineHeight\":\n        \n          case \"fontSize\":\n        \n          case \"margin\":\n        \n          case \"marginBottom\":\n        \n          case \"marginLeft\":\n        \n          case \"marginRight\":\n        \n          case \"marginTop\":\n        \n          case \"padding\":\n        \n          case \"paddingBottom\":\n        \n          case \"paddingLeft\":\n        \n          case \"paddingRight\":\n        \n          case \"paddingTop\":\n        \n          case \"bottom\":\n        \n          case \"left\":\n        \n          case \"right\":\n        \n          case \"top\":\n        \n          case \"scrollTop\":\n        \n          case \"scrollLeft\":\n            ha = parseInt(ha, 10);\n            break;\n          case \"rotateX\":\n        \n          case \"rotateY\":\n        \n          case \"rotateZ\":\n            ha = ((parseInt(ha, 10) * Math.PI) / 180);\n            break;\n          case \"translateX\":\n        \n          case \"translateY\":\n        \n          case \"translateZ\":\n        \n          case \"scaleX\":\n        \n          case \"scaleY\":\n        \n          case \"scaleZ\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"rotate3d\":\n            this._attr(\"rotateX\", ha[0], ia);\n            this._attr(\"rotateY\", ha[1], ia);\n            this._attr(\"rotateZ\", ha[2], ia);\n            return this;\n          case \"rotate\":\n            this._attr(\"rotateZ\", ha, ia);\n            return this;\n          case \"scale3d\":\n            this._attr(\"scaleZ\", ha[2], ia);\n          case \"scale\":\n            this._attr(\"scaleX\", ha[0], ia);\n            this._attr(\"scaleY\", ha[1], ia);\n            return this;\n          case \"translate3d\":\n            this._attr(\"translateZ\", ha[2], ia);\n          case \"translate\":\n            this._attr(\"translateX\", ha[0], ia);\n            this._attr(\"translateY\", ha[1], ia);\n            return this;\n          default:\n            throw new Error((ga + \" is not a supported attribute!\"));\n        };\n        if ((this.state.attrs[ga] === undefined)) {\n            this.state.attrs[ga] = {\n            };\n        };\n        if (ja) {\n            this.state.attrs[ga].auto = true;\n        };\n        switch (ia) {\n          case y:\n            this.state.attrs[ga].start = ha;\n            break;\n          case x:\n            this.state.attrs[ga].by = true;\n          case w:\n            this.state.attrs[ga].value = ha;\n            break;\n        };\n    };\n    function z(ga) {\n        var ha = parseInt(k.get(ga, \"paddingLeft\"), 10), ia = parseInt(k.get(ga, \"paddingRight\"), 10), ja = parseInt(k.get(ga, \"borderLeftWidth\"), 10), ka = parseInt(k.get(ga, \"borderRightWidth\"), 10);\n        return ((((ga.offsetWidth - ((ha ? ha : 0))) - ((ia ? ia : 0))) - ((ja ? ja : 0))) - ((ka ? ka : 0)));\n    };\n    function aa(ga) {\n        var ha = parseInt(k.get(ga, \"paddingTop\"), 10), ia = parseInt(k.get(ga, \"paddingBottom\"), 10), ja = parseInt(k.get(ga, \"borderTopWidth\"), 10), ka = parseInt(k.get(ga, \"borderBottomWidth\"), 10);\n        return ((((ga.offsetHeight - ((ha ? ha : 0))) - ((ia ? ia : 0))) - ((ja ? ja : 0))) - ((ka ? ka : 0)));\n    };\n    p.prototype.to = function(ga, ha) {\n        if ((ha === undefined)) {\n            this._attr(this.last_attr, ga, w);\n        }\n         else {\n            this._attr(ga, ha, w);\n            this.last_attr = ga;\n        }\n    ;\n        return this;\n    };\n    p.prototype.by = function(ga, ha) {\n        if ((ha === undefined)) {\n            this._attr(this.last_attr, ga, x);\n        }\n         else {\n            this._attr(ga, ha, x);\n            this.last_attr = ga;\n        }\n    ;\n        return this;\n    };\n    p.prototype.from = function(ga, ha) {\n        if ((ha === undefined)) {\n            this._attr(this.last_attr, ga, y);\n        }\n         else {\n            this._attr(ga, ha, y);\n            this.last_attr = ga;\n        }\n    ;\n        return this;\n    };\n    p.prototype.duration = function(ga) {\n        this.state.duration = (ga ? ga : 0);\n        return this;\n    };\n    p.prototype.checkpoint = function(ga, ha) {\n        if ((ga === undefined)) {\n            ga = 1;\n        };\n        this.state.checkpoint = ga;\n        this.queue.push(this.state);\n        this._reset_state();\n        this.state.checkpointcb = ha;\n        return this;\n    };\n    p.prototype.blind = function() {\n        this.state.blind = true;\n        return this;\n    };\n    p.prototype.hide = function() {\n        this.state.hide = true;\n        return this;\n    };\n    p.prototype.show = function() {\n        this.state.show = true;\n        return this;\n    };\n    p.prototype.ease = function(ga) {\n        this.state.ease = ga;\n        return this;\n    };\n    p.prototype.go = function() {\n        var ga = Date.now();\n        this.queue.push(this.state);\n        for (var ha = 0; (ha < this.queue.length); ha++) {\n            this.queue[ha].start = (ga - v);\n            if (this.queue[ha].checkpoint) {\n                ga += (this.queue[ha].checkpoint * this.queue[ha].duration);\n            };\n        };\n        da(this);\n        return this;\n    };\n    p.prototype._show = function() {\n        h.show(this.obj);\n    };\n    p.prototype._hide = function() {\n        h.hide(this.obj);\n    };\n    p.prototype._frame = function(ga) {\n        var ha = true, ia = false, ja;\n        function ka(db) {\n            return (document.documentElement[db] || document.body[db]);\n        };\n        for (var la = 0; (la < this.queue.length); la++) {\n            var ma = this.queue[la];\n            if ((ma.start > ga)) {\n                ha = false;\n                continue;\n            }\n        ;\n            if (ma.checkpointcb) {\n                this._callback(ma.checkpointcb, (ga - ma.start));\n                ma.checkpointcb = null;\n            }\n        ;\n            if ((ma.started === undefined)) {\n                if (ma.show) {\n                    this._show();\n                };\n                for (var na in ma.attrs) {\n                    if ((ma.attrs[na].start !== undefined)) {\n                        continue;\n                    };\n                    switch (na) {\n                      case \"backgroundColor\":\n                    \n                      case \"borderColor\":\n                    \n                      case \"color\":\n                        ja = ca(k.get(this.obj, ((na == \"borderColor\") ? \"borderLeftColor\" : na)));\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value[0] = Math.min(255, Math.max(0, (ma.attrs[na].value[0] + ja[0])));\n                            ma.attrs[na].value[1] = Math.min(255, Math.max(0, (ma.attrs[na].value[1] + ja[1])));\n                            ma.attrs[na].value[2] = Math.min(255, Math.max(0, (ma.attrs[na].value[2] + ja[2])));\n                        }\n                    ;\n                        break;\n                      case \"opacity\":\n                        ja = k.getOpacity(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value = Math.min(1, Math.max(0, (ma.attrs[na].value + ja)));\n                        };\n                        break;\n                      case \"height\":\n                        ja = aa(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      case \"width\":\n                        ja = z(this.obj);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      case \"scrollLeft\":\n                    \n                      case \"scrollTop\":\n                        ja = (((this.obj === document.body)) ? ka(na) : this.obj[na]);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        ma[(\"last\" + na)] = ja;\n                        break;\n                      case \"rotateX\":\n                    \n                      case \"rotateY\":\n                    \n                      case \"rotateZ\":\n                    \n                      case \"translateX\":\n                    \n                      case \"translateY\":\n                    \n                      case \"translateZ\":\n                        ja = i.get(this.obj, na, 0);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      case \"scaleX\":\n                    \n                      case \"scaleY\":\n                    \n                      case \"scaleZ\":\n                        ja = i.get(this.obj, na, 1);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                      default:\n                        ja = (parseInt(k.get(this.obj, na), 10) || 0);\n                        if (ma.attrs[na].by) {\n                            ma.attrs[na].value += ja;\n                        };\n                        break;\n                    };\n                    ma.attrs[na].start = ja;\n                };\n                if ((((ma.attrs.height && ma.attrs.height.auto)) || ((ma.attrs.width && ma.attrs.width.auto)))) {\n                    this._destroy_container();\n                    for (var na in {\n                        height: 1,\n                        width: 1,\n                        fontSize: 1,\n                        borderLeftWidth: 1,\n                        borderRightWidth: 1,\n                        borderTopWidth: 1,\n                        borderBottomWidth: 1,\n                        paddingLeft: 1,\n                        paddingRight: 1,\n                        paddingTop: 1,\n                        paddingBottom: 1\n                    }) {\n                        if (ma.attrs[na]) {\n                            this.obj.style[na] = (ma.attrs[na].value + (((typeof ma.attrs[na].value == \"number\") ? \"px\" : \"\")));\n                        };\n                    };\n                    if ((ma.attrs.height && ma.attrs.height.auto)) {\n                        ma.attrs.height.value = aa(this.obj);\n                    };\n                    if ((ma.attrs.width && ma.attrs.width.auto)) {\n                        ma.attrs.width.value = z(this.obj);\n                    };\n                }\n            ;\n                ma.started = true;\n                if (ma.blind) {\n                    this._build_container();\n                };\n            }\n        ;\n            var oa = (((ga - ma.start)) / ma.duration);\n            if ((oa >= 1)) {\n                oa = 1;\n                if (ma.hide) {\n                    this._hide();\n                };\n            }\n             else ha = false;\n        ;\n            var pa = (ma.ease ? ma.ease(oa) : oa);\n            if (((!ia && (oa != 1)) && ma.blind)) {\n                ia = true;\n            };\n            for (var na in ma.attrs) {\n                switch (na) {\n                  case \"backgroundColor\":\n                \n                  case \"borderColor\":\n                \n                  case \"color\":\n                    if ((ma.attrs[na].start[3] != ma.attrs[na].value[3])) {\n                        this.obj.style[na] = ((((((((\"rgba(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true)) + \",\") + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true)) + \",\") + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true)) + \",\") + ba(pa, ma.attrs[na].start[3], ma.attrs[na].value[3], false)) + \")\");\n                    }\n                     else this.obj.style[na] = ((((((\"rgb(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true)) + \",\") + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true)) + \",\") + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true)) + \")\");\n                ;\n                    break;\n                  case \"opacity\":\n                    k.set(this.obj, \"opacity\", ba(pa, ma.attrs[na].start, ma.attrs[na].value));\n                    break;\n                  case \"height\":\n                \n                  case \"width\":\n                    this.obj.style[na] = (((pa == 1) && ma.attrs[na].auto) ? \"auto\" : (ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"));\n                    break;\n                  case \"scrollLeft\":\n                \n                  case \"scrollTop\":\n                    var qa = (this.obj === document.body);\n                    ja = (qa ? ka(na) : this.obj[na]);\n                    if ((ma[(\"last\" + na)] !== ja)) {\n                        delete ma.attrs[na];\n                    }\n                     else {\n                        var ra = ba(pa, ma.attrs[na].start, ma.attrs[na].value, true);\n                        if (!qa) {\n                            ra = this.obj[na] = ra;\n                        }\n                         else {\n                            if ((na == \"scrollLeft\")) {\n                                a.scrollTo(ra, ka(\"scrollTop\"));\n                            }\n                             else a.scrollTo(ka(\"scrollLeft\"), ra);\n                        ;\n                            ra = ka(na);\n                        }\n                    ;\n                        ma[(\"last\" + na)] = ra;\n                    }\n                ;\n                    break;\n                  case \"translateX\":\n                \n                  case \"translateY\":\n                \n                  case \"translateZ\":\n                \n                  case \"rotateX\":\n                \n                  case \"rotateY\":\n                \n                  case \"rotateZ\":\n                \n                  case \"scaleX\":\n                \n                  case \"scaleY\":\n                \n                  case \"scaleZ\":\n                    i.set(this.obj, na, ba(pa, ma.attrs[na].start, ma.attrs[na].value, false));\n                    break;\n                  default:\n                    this.obj.style[na] = (ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\");\n                    break;\n                };\n            };\n            var sa = null, ta = i.get(this.obj, \"translateX\", 0), ua = i.get(this.obj, \"translateY\", 0), va = i.get(this.obj, \"translateZ\", 0);\n            if (((ta || ua) || va)) {\n                sa = u(sa, [1,0,0,0,0,1,0,0,0,0,1,0,ta,ua,va,1,]);\n            };\n            var wa = i.get(this.obj, \"scaleX\", 1), xa = i.get(this.obj, \"scaleY\", 1), ya = i.get(this.obj, \"scaleZ\", 1);\n            if ((((wa - 1) || (xa - 1)) || (ya - 1))) {\n                sa = u(sa, [wa,0,0,0,0,xa,0,0,0,0,ya,0,0,0,0,1,]);\n            };\n            var za = i.get(this.obj, \"rotateX\", 0);\n            if (za) {\n                sa = u(sa, [1,0,0,0,0,Math.cos(za),Math.sin(-za),0,0,Math.sin(za),Math.cos(za),0,0,0,0,1,]);\n            };\n            var ab = i.get(this.obj, \"rotateY\", 0);\n            if (ab) {\n                sa = u(sa, [Math.cos(ab),0,Math.sin(ab),0,0,1,0,0,Math.sin(-ab),0,Math.cos(ab),0,0,0,0,1,]);\n            };\n            var bb = i.get(this.obj, \"rotateZ\", 0);\n            if (bb) {\n                sa = u(sa, [Math.cos(bb),Math.sin(-bb),0,0,Math.sin(bb),Math.cos(bb),0,0,0,0,1,0,0,0,0,1,]);\n            };\n            if (sa) {\n                var cb = q(sa);\n                k.apply(this.obj, {\n                    \"-webkit-transform\": cb,\n                    \"-moz-transform\": cb,\n                    \"-ms-transform\": cb,\n                    \"-o-transform\": cb,\n                    transform: cb\n                });\n            }\n             else if (ha) {\n                k.apply(this.obj, {\n                    \"-webkit-transform\": null,\n                    \"-moz-transform\": null,\n                    \"-ms-transform\": null,\n                    \"-o-transform\": null,\n                    transform: null\n                });\n            }\n        ;\n            if ((oa == 1)) {\n                this.queue.splice(la--, 1);\n                this._callback(ma.ondone, ((ga - ma.start) - ma.duration));\n            }\n        ;\n        };\n        if ((!ia && this.container_div)) {\n            this._destroy_container();\n        };\n        return !ha;\n    };\n    p.prototype.ondone = function(ga) {\n        this.state.ondone = ga;\n        return this;\n    };\n    p.prototype._callback = function(ga, ha) {\n        if (ga) {\n            v = ha;\n            ga.call(this);\n            v = 0;\n        }\n    ;\n    };\n    function ba(ga, ha, ia, ja) {\n        return ((ja ? parseInt : parseFloat))(((((ia - ha)) * ga) + ha), 10);\n    };\n    function ca(ga) {\n        var ha = /^#([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i.exec(ga);\n        if (ha) {\n            return [parseInt(((ha[1].length == 1) ? (ha[1] + ha[1]) : ha[1]), 16),parseInt(((ha[2].length == 1) ? (ha[2] + ha[2]) : ha[2]), 16),parseInt(((ha[3].length == 1) ? (ha[3] + ha[3]) : ha[3]), 16),1,];\n        }\n         else {\n            var ia = /^rgba? *\\(([0-9]+), *([0-9]+), *([0-9]+)(?:, *([0-9\\.]+))?\\)$/.exec(ga);\n            if (ia) {\n                return [parseInt(ia[1], 10),parseInt(ia[2], 10),parseInt(ia[3], 10),(ia[4] ? parseFloat(ia[4]) : 1),];\n            }\n             else if ((ga == \"transparent\")) {\n                return [255,255,255,0,];\n            }\n             else throw \"Named color attributes are not supported.\"\n            \n        ;\n        }\n    ;\n    };\n    function da(ga) {\n        n.push(ga);\n        if ((n.length === 1)) {\n            if (!m) {\n                var ha = ((a.requestAnimationFrame || a.webkitRequestAnimationFrame) || a.mozRequestAnimationFrame);\n                if (ha) {\n                    m = ha.bind(a);\n                };\n            }\n        ;\n            if (m) {\n                m(fa);\n            }\n             else o = setInterval(fa, 20, false);\n        ;\n        }\n    ;\n        if (m) {\n            ea();\n        };\n        fa(Date.now(), true);\n    };\n    function ea() {\n        if (!m) {\n            throw new Error(\"Ending timer only valid with requestAnimationFrame\")\n        };\n        var ga = 0;\n        for (var ha = 0; (ha < n.length); ha++) {\n            var ia = n[ha];\n            for (var ja = 0; (ja < ia.queue.length); ja++) {\n                var ka = (ia.queue[ja].start + ia.queue[ja].duration);\n                if ((ka > ga)) {\n                    ga = ka;\n                };\n            };\n        };\n        if (o) {\n            clearTimeout(o);\n            o = null;\n        }\n    ;\n        var la = Date.now();\n        if ((ga > la)) {\n            o = setTimeout(l(fa), (ga - la), false);\n        };\n    };\n    function fa(ga, ha) {\n        var ia = Date.now();\n        for (var ja = (((ha === true)) ? (n.length - 1) : 0); (ja < n.length); ja++) {\n            try {\n                if (!n[ja]._frame(ia)) {\n                    n.splice(ja--, 1);\n                };\n            } catch (ka) {\n                n.splice(ja--, 1);\n            };\n        };\n        if ((n.length === 0)) {\n            if (o) {\n                if (m) {\n                    clearTimeout(o);\n                }\n                 else clearInterval(o);\n            ;\n                o = null;\n            }\n        ;\n        }\n         else if (m) {\n            m(fa);\n        }\n    ;\n    };\n    p.ease = {\n    };\n    p.ease.begin = function(ga) {\n        return (Math.sin(((Math.PI / 2) * ((ga - 1)))) + 1);\n    };\n    p.ease.end = function(ga) {\n        return Math.sin(((14085 * Math.PI) * ga));\n    };\n    p.ease.both = function(ga) {\n        return ((14134 * Math.sin((Math.PI * ((ga - 14158))))) + 14163);\n    };\n    p.prependInsert = function(ga, ha) {\n        p.insert(ga, ha, j.prependContent);\n    };\n    p.appendInsert = function(ga, ha) {\n        p.insert(ga, ha, j.appendContent);\n    };\n    p.insert = function(ga, ha, ia) {\n        k.set(ha, \"opacity\", 0);\n        ia(ga, ha);\n        new p(ha).from(\"opacity\", 0).to(\"opacity\", 1).duration(400).go();\n    };\n    e.exports = p;\n});\n__d(\"BootloadedReact\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = function(j) {\n        g.loadModules([\"React\",], j);\n    }, i = {\n        isValidComponent: function(j) {\n            return (((j && (typeof j.mountComponentIntoNode === \"function\")) && (typeof j.receiveProps === \"function\")));\n        },\n        initializeTouchEvents: function(j, k) {\n            h(function(l) {\n                l.initializeTouchEvents(j);\n                (k && k());\n            });\n        },\n        createClass: function(j, k) {\n            h(function(l) {\n                var m = l.createClass(j);\n                (k && k(m));\n            });\n        },\n        renderComponent: function(j, k, l) {\n            h(function(m) {\n                var n = m.renderComponent(j, k);\n                (l && l(n));\n            });\n        },\n        unmountAndReleaseReactRootNode: function(j, k) {\n            h(function(l) {\n                l.unmountAndReleaseReactRootNode(j);\n                (k && k());\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ContextualThing\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        register: function(j, k) {\n            j.setAttribute(\"data-ownerid\", g.getID(k));\n        },\n        containsIncludingLayers: function(j, k) {\n            while (k) {\n                if (g.contains(j, k)) {\n                    return true\n                };\n                k = i.getContext(k);\n            };\n            return false;\n        },\n        getContext: function(j) {\n            var k;\n            while (j) {\n                if ((j.getAttribute && (k = j.getAttribute(\"data-ownerid\")))) {\n                    return h(k)\n                };\n                j = j.parentNode;\n            };\n            return null;\n        }\n    };\n    e.exports = i;\n});\n__d(\"DOMPosition\", [\"DOMDimensions\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = {\n        getScrollPosition: function() {\n            var j = h.getDocumentScrollElement();\n            return {\n                x: j.scrollLeft,\n                y: j.scrollTop\n            };\n        },\n        getNormalizedScrollPosition: function() {\n            var j = i.getScrollPosition(), k = g.getDocumentDimensions(), l = g.getViewportDimensions(), m = (k.height - l.height), n = (k.width - l.width);\n            return {\n                y: Math.max(0, Math.min(j.y, m)),\n                x: Math.max(0, Math.min(j.x, n))\n            };\n        },\n        getElementPosition: function(j) {\n            if (!j) {\n                return\n            };\n            var k = document.documentElement;\n            if ((!((\"getBoundingClientRect\" in j)) || !h.contains(k, j))) {\n                return {\n                    x: 0,\n                    y: 0\n                }\n            };\n            var l = j.getBoundingClientRect(), m = (Math.round(l.left) - k.clientLeft), n = (Math.round(l.top) - k.clientTop);\n            return {\n                x: m,\n                y: n\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"Form\", [\"Event\",\"AsyncRequest\",\"AsyncResponse\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"DataStore\",\"Env\",\"Input\",\"Parent\",\"URI\",\"createArrayFrom\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMPosition\"), m = b(\"DOMQuery\"), n = b(\"DataStore\"), o = b(\"Env\"), p = b(\"Input\"), q = b(\"Parent\"), r = b(\"URI\"), s = b(\"createArrayFrom\"), t = b(\"trackReferrer\"), u = (\"FileList\" in window), v = (\"FormData\" in window);\n    function w(y) {\n        var z = {\n        };\n        r.implodeQuery(y).split(\"&\").forEach(function(aa) {\n            if (aa) {\n                var ba = /^([^=]*)(?:=(.*))?$/.exec(aa), ca = r.decodeComponent(ba[1]), da = (ba[2] ? r.decodeComponent(ba[2]) : null);\n                z[ca] = da;\n            }\n        ;\n        });\n        return z;\n    };\n    var x = {\n        getInputs: function(y) {\n            y = (y || document);\n            return [].concat(s(m.scry(y, \"input\")), s(m.scry(y, \"select\")), s(m.scry(y, \"textarea\")), s(m.scry(y, \"button\")));\n        },\n        getInputsByName: function(y) {\n            var z = {\n            };\n            x.getInputs(y).forEach(function(aa) {\n                var ba = z[aa.name];\n                z[aa.name] = ((typeof ba === \"undefined\") ? aa : [aa,].concat(ba));\n            });\n            return z;\n        },\n        getSelectValue: function(y) {\n            return y.options[y.selectedIndex].value;\n        },\n        setSelectValue: function(y, z) {\n            for (var aa = 0; (aa < y.options.length); ++aa) {\n                if ((y.options[aa].value == z)) {\n                    y.selectedIndex = aa;\n                    break;\n                }\n            ;\n            };\n        },\n        getRadioValue: function(y) {\n            for (var z = 0; (z < y.length); z++) {\n                if (y[z].checked) {\n                    return y[z].value\n                };\n            };\n            return null;\n        },\n        getElements: function(y) {\n            return s((((y.tagName == \"FORM\") && (y.elements != y)) ? y.elements : x.getInputs(y)));\n        },\n        getAttribute: function(y, z) {\n            return (((y.getAttributeNode(z) || {\n            })).value || null);\n        },\n        setDisabled: function(y, z) {\n            x.getElements(y).forEach(function(aa) {\n                if ((aa.disabled !== undefined)) {\n                    var ba = n.get(aa, \"origDisabledState\");\n                    if (z) {\n                        if ((ba === undefined)) {\n                            n.set(aa, \"origDisabledState\", aa.disabled);\n                        };\n                        aa.disabled = z;\n                    }\n                     else if ((ba !== true)) {\n                        aa.disabled = false;\n                    }\n                ;\n                }\n            ;\n            });\n        },\n        bootstrap: function(y, z) {\n            var aa = ((x.getAttribute(y, \"method\") || \"GET\")).toUpperCase();\n            z = (q.byTag(z, \"button\") || z);\n            var ba = (q.byClass(z, \"stat_elem\") || y);\n            if (j.hasClass(ba, \"async_saving\")) {\n                return\n            };\n            if ((z && ((((z.form !== y) || (((z.nodeName != \"INPUT\") && (z.nodeName != \"BUTTON\")))) || (z.type != \"submit\"))))) {\n                var ca = m.scry(y, \".enter_submit_target\")[0];\n                (ca && (z = ca));\n            }\n        ;\n            var da = x.serialize(y, z);\n            x.setDisabled(y, true);\n            var ea = (x.getAttribute(y, \"ajaxify\") || x.getAttribute(y, \"action\"));\n            t(y, ea);\n            var fa = new h(ea);\n            fa.setData(da).setNectarModuleDataSafe(y).setReadOnly((aa == \"GET\")).setMethod(aa).setRelativeTo(y).setStatusElement(ba).setInitialHandler(x.setDisabled.curry(y, false)).setHandler(function(ga) {\n                g.fire(y, \"success\", {\n                    response: ga\n                });\n            }).setErrorHandler(function(ga) {\n                if ((g.fire(y, \"error\", {\n                    response: ga\n                }) !== false)) {\n                    i.defaultErrorHandler(ga);\n                };\n            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((ba.name && !ba.disabled) && (ba.type !== \"submit\"))) {\n                    if ((((((!ba.type || (((((ba.type === \"radio\") || (ba.type === \"checkbox\"))) && ba.checked))) || (ba.type === \"text\")) || (ba.type === \"password\")) || (ba.type === \"hidden\")) || (ba.nodeName === \"TEXTAREA\"))) {\n                        aa(ba.type, ba.name, p.getValue(ba));\n                    }\n                     else if ((ba.nodeName === \"SELECT\")) {\n                        for (var ca = 0, da = ba.options.length; (ca < da); ca++) {\n                            var ea = ba.options[ca];\n                            if (ea.selected) {\n                                aa(\"select\", ba.name, ea.value);\n                            };\n                        };\n                    }\n                     else if ((u && (ba.type === \"file\"))) {\n                        var fa = ba.files;\n                        for (var ga = 0; (ga < fa.length); ga++) {\n                            aa(\"file\", ba.name, fa.item(ga));;\n                        };\n                    }\n                    \n                    \n                \n                };\n            });\n            if (((((z && z.name) && (z.type === \"submit\")) && m.contains(y, z)) && m.isNodeOfType(z, [\"input\",\"button\",]))) {\n                aa(\"submit\", z.name, z.value);\n            };\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null\n            };\n            var aa = new FormData();\n            if (y) {\n                if (m.isNode(y)) {\n                    x.forEachValue(y, z, function(da, ea, fa) {\n                        aa.append(ea, fa);\n                    });\n                }\n                 else {\n                    var ba = w(y);\n                    for (var ca in ba) {\n                        aa.append(ca, ba[ca]);;\n                    };\n                }\n            \n            };\n            return aa;\n        },\n        serialize: function(y, z) {\n            var aa = {\n            };\n            x.forEachValue(y, z, function(ba, ca, da) {\n                if ((ba === \"file\")) {\n                    return\n                };\n                x._serializeHelper(aa, ca, da);\n            });\n            return x._serializeFix(aa);\n        },\n        _serializeHelper: function(y, z, aa) {\n            var ba = Object.prototype.hasOwnProperty, ca = /([^\\]]+)\\[([^\\]]*)\\](.*)/.exec(z);\n            if (ca) {\n                if ((!y[ca[1]] || !ba.call(y, ca[1]))) {\n                    var da;\n                    y[ca[1]] = da = {\n                    };\n                    if ((y[ca[1]] !== da)) {\n                        return\n                    };\n                }\n            ;\n                var ea = 0;\n                if ((ca[2] === \"\")) {\n                    while ((y[ca[1]][ea] !== undefined)) {\n                        ea++;;\n                    };\n                }\n                 else ea = ca[2];\n            ;\n                if ((ca[3] === \"\")) {\n                    y[ca[1]][ea] = aa;\n                }\n                 else x._serializeHelper(y[ca[1]], ea.concat(ca[3]), aa);\n            ;\n            }\n             else y[z] = aa;\n        ;\n        },\n        _serializeFix: function(y) {\n            for (var z in y) {\n                if ((y[z] instanceof Object)) {\n                    y[z] = x._serializeFix(y[z]);\n                };\n            };\n            var aa = Object.keys(y);\n            if (((aa.length === 0) || aa.some(isNaN))) {\n                return y\n            };\n            aa.sort(function(da, ea) {\n                return (da - ea);\n            });\n            var ba = 0, ca = aa.every(function(da) {\n                return (+da === ba++);\n            });\n            if (ca) {\n                return aa.map(function(da) {\n                    return y[da];\n                })\n            };\n            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = document.createElement(\"form\");\n            ba.action = y.toString();\n            ba.method = \"POST\";\n            ba.style.display = \"none\";\n            if (aa) {\n                ba.target = aa;\n            };\n            z.fb_dtsg = o.fb_dtsg;\n            x.createHiddenInputs(z, ba);\n            m.getRootElement().appendChild(ba);\n            ba.submit();\n            return false;\n        },\n        createHiddenInputs: function(y, z, aa, ba) {\n            aa = (aa || {\n            });\n            var ca = w(y);\n            for (var da in ca) {\n                if ((ca[da] === null)) {\n                    continue;\n                };\n                if ((aa[da] && ba)) {\n                    aa[da].value = ca[da];\n                }\n                 else {\n                    var ea = k.create(\"input\", {\n                        type: \"hidden\",\n                        name: da,\n                        value: ca[da]\n                    });\n                    aa[da] = ea;\n                    z.appendChild(ea);\n                }\n            ;\n            };\n            return aa;\n        },\n        getFirstElement: function(y, z) {\n            z = (z || [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",\"input[type=\\\"button\\\"]\",\"input[type=\\\"submit\\\"]\",]);\n            var aa = [];\n            for (var ba = 0; (ba < z.length); ba++) {\n                aa = m.scry(y, z[ba]);\n                for (var ca = 0; (ca < aa.length); ca++) {\n                    var da = aa[ca];\n                    try {\n                        var fa = l.getElementPosition(da);\n                        if (((fa.y > 0) && (fa.x > 0))) {\n                            return da\n                        };\n                    } catch (ea) {\n                    \n                    };\n                };\n            };\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.focus();\n                return true;\n            }\n        ;\n            return false;\n        }\n    };\n    e.exports = x;\n});\n__d(\"HistoryManager\", [\"Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Cookie\"), i = b(\"Env\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = b(\"copyProperties\"), m = b(\"emptyFunction\"), n = b(\"goOrReplace\"), o = {\n        _IFRAME_BASE_URI: \"http://static.ak.facebook.com/common/history_manager.php\",\n        history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = (o.history.length - 1);\n            o.iframe.src = ((((o._IFRAME_BASE_URI + \"?|index=\") + q) + \"#\") + encodeURIComponent(p));\n            return o;\n        },\n        getIframeSrcFragment: function() {\n            return decodeURIComponent(j(o.iframe.contentWindow.document.location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\n            }\n        ;\n            if ((p !== undefined)) {\n                o.iframeQueue.push(p);\n            }\n             else {\n                o.iframeQueue.splice(0, 1);\n                o.iframeTimeout = null;\n                o.checkURI();\n            }\n        ;\n            if ((o.iframeQueue.length && !o.iframeTimeout)) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if ((!i.ALLOW_TRANSITION_IN_IFRAME && (window != window.top))) {\n                return\n            };\n            if (o._initialized) {\n                return o\n            };\n            var p = j(), q = (p.getFragment() || \"\");\n            if ((q.charAt(0) === \"!\")) {\n                q = q.substr(1);\n                p.setFragment(q);\n            }\n        ;\n            if ((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\")) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            };\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                history: [p,],\n                callbacks: [],\n                lastChanged: Date.now(),\n                canonical: j(\"#\"),\n                fragmentTimeout: null,\n                user: 0,\n                iframeTimeout: null,\n                iframeQueue: [],\n                enabled: true,\n                debug: m\n            });\n            if ((window.history && history.pushState)) {\n                this.lastURI = document.URL;\n                window.history.replaceState(this.lastURI, null);\n                g.listen(window, \"popstate\", function(r) {\n                    if (((r && r.state) && (o.lastURI != r.state))) {\n                        o.lastURI = r.state;\n                        o.lastChanged = Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                }.bind(o));\n                if (((k.webkit() < 534) || (k.chrome() <= 13))) {\n                    setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n                return o;\n            }\n        ;\n            o._updateRefererURI(j.getRequestURI(false));\n            if (((k.webkit() < 500) || (k.firefox() < 2))) {\n                o.enabled = false;\n                return o;\n            }\n        ;\n            if ((k.ie() < 8)) {\n                o.iframe = document.createElement(\"iframe\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                document.body.insertBefore(o.iframe, document.body.firstChild);\n            }\n             else if ((\"onhashchange\" in window)) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else setInterval(o.checkURI, 42, false);\n            \n        ;\n            return o;\n        },\n        registerURIHandler: function(p) {\n            o.callbacks.push(p);\n            return o;\n        },\n        setCanonicalLocation: function(p) {\n            o.canonical = j(p);\n            return o;\n        },\n        notify: function(p) {\n            if ((p == o.orig_fragment)) {\n                p = o.canonical.getFragment();\n            };\n            for (var q = 0; (q < o.callbacks.length); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true\n                    };\n                } catch (r) {\n                \n                };\n            };\n            return false;\n        },\n        checkURI: function() {\n            if (((Date.now() - o.lastChanged) < 400)) {\n                return\n            };\n            if ((window.history && history.pushState)) {\n                var p = j(document.URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if ((p != q)) {\n                    o.lastChanged = Date.now();\n                    o.lastURI = p;\n                    if ((k.webkit() < 534)) {\n                        o._updateRefererURI(p);\n                    };\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n                return;\n            }\n        ;\n            if (((k.ie() < 8) && o.iframeQueue.length)) {\n                return\n            };\n            if ((k.webkit() && (window.history.length == 200))) {\n                if (!o.warned) {\n                    o.warned = true;\n                };\n                return;\n            }\n        ;\n            var r = j().getFragment();\n            if ((r.charAt(0) == \"!\")) {\n                r = r.substr(1);\n            };\n            if ((k.ie() < 8)) {\n                r = o.getIframeSrcFragment();\n            };\n            r = r.replace(/%23/g, \"#\");\n            if ((r != o.fragment.replace(/%23/g, \"#\"))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.history.length,\"QHL: \",o.history.length,].join(\" \"));\n                for (var s = (o.history.length - 1); (s >= 0); --s) {\n                    if ((o.history[s].getFragment().replace(/%23/g, \"#\") == r)) {\n                        break;\n                    };\n                };\n                ++o.user;\n                if ((s >= 0)) {\n                    o.go((s - o.current));\n                }\n                 else o.go((\"#\" + r));\n            ;\n                --o.user;\n            }\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((p.charAt(0) != \"/\") && (p.indexOf(\"//\") == -1))) {\n                return\n            };\n            var q = new j(window.location);\n            if (q.isFacebookURI()) {\n                var r = (q.getPath() + window.location.search);\n            }\n             else var r = \"\"\n        ;\n            var s = j(p).getQualifiedURI().setFragment(r).toString(), t = 2048;\n            if ((s.length > t)) {\n                s = (s.substring(0, t) + \"...\");\n            };\n            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if ((window.history && history.pushState)) {\n                (q || (typeof (p) == \"number\"));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.history.replaceState(p, null, s);\n                }\n                 else window.history.pushState(p, null, s);\n            ;\n                if ((k.webkit() < 534)) {\n                    o._updateRefererURI(p);\n                };\n                return false;\n            }\n        ;\n            o.debug((\"go: \" + p));\n            if ((q === undefined)) {\n                q = true;\n            };\n            if (!o.enabled) {\n                if (!q) {\n                    return false\n                }\n            };\n            if ((typeof (p) == \"number\")) {\n                if (!p) {\n                    return false\n                };\n                var t = (p + o.current), u = Math.max(0, Math.min((o.history.length - 1), t));\n                o.current = u;\n                t = (o.history[u].getFragment() || o.orig_fragment);\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = Date.now();\n                if ((k.ie() < 8)) {\n                    if (o.fragmentTimeout) {\n                        clearTimeout(o.fragmentTimeout);\n                    };\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = setTimeout(function() {\n                        window.location.hash = (\"#!\" + t);\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    };\n                }\n                 else if (!o.user) {\n                    n(window.location, ((window.location.href.split(\"#\")[0] + \"#!\") + t), r);\n                }\n            ;\n                if (q) {\n                    o.notify(t);\n                };\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n            p = j(p);\n            if ((p.getDomain() == j().getDomain())) {\n                p = j((\"#\" + p.getUnqualifiedURI()));\n            };\n            var v = o.history[o.current].getFragment(), w = p.getFragment();\n            if (((w == v) || (((v == o.orig_fragment) && (w == o.canonical.getFragment()))))) {\n                if (q) {\n                    o.notify(w);\n                };\n                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n            if (r) {\n                o.current--;\n            };\n            var x = (((o.history.length - o.current)) - 1);\n            o.history.splice((o.current + 1), x);\n            o.history.push(j(p));\n            return o.go(1, q, r);\n        },\n        getCurrentFragment: function() {\n            var p = ((o._temporary_fragment !== undefined) ? o._temporary_fragment : j.getRequestURI(false).getFragment());\n            return ((p == o.orig_fragment) ? o.canonical.getFragment() : p);\n        }\n    };\n    e.exports = o;\n});\n__d(\"InputSelection\", [\"DOM\",\"Focus\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Focus\"), i = {\n        get: function(j) {\n            if (!document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                }\n            };\n            var k = document.selection.createRange();\n            if ((k.parentElement() !== j)) {\n                return {\n                    start: 0,\n                    end: 0\n                }\n            };\n            var l = j.value.length;\n            if (g.isNodeOfType(j, \"input\")) {\n                return {\n                    start: -k.moveStart(\"character\", -l),\n                    end: -k.moveEnd(\"character\", -l)\n                };\n            }\n             else {\n                var m = k.duplicate();\n                m.moveToElementText(j);\n                m.setEndPoint(\"StartToEnd\", k);\n                var n = (l - m.text.length);\n                m.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: (l - m.text.length),\n                    end: n\n                };\n            }\n        ;\n        },\n        set: function(j, k, l) {\n            if ((typeof l == \"undefined\")) {\n                l = k;\n            };\n            if (document.selection) {\n                if ((j.tagName == \"TEXTAREA\")) {\n                    var m = ((j.value.slice(0, k).match(/\\r/g) || [])).length, n = ((j.value.slice(k, l).match(/\\r/g) || [])).length;\n                    k -= m;\n                    l -= (m + n);\n                }\n            ;\n                var o = j.createTextRange();\n                o.collapse(true);\n                o.moveStart(\"character\", k);\n                o.moveEnd(\"character\", (l - k));\n                o.select();\n            }\n             else {\n                j.selectionStart = k;\n                j.selectionEnd = Math.min(l, j.value.length);\n                h.set(j);\n            }\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSONPTransport\", [\"ArbiterMixin\",\"DOM\",\"HTML\",\"URI\",\"asyncCallback\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"URI\"), k = b(\"asyncCallback\"), l = b(\"copyProperties\"), m = {\n    }, n = 2, o = \"jsonp\", p = \"iframe\";\n    function q(s) {\n        delete m[s];\n    };\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\n    };\n    l(r, {\n        respond: function(s, t, u) {\n            var v = m[s];\n            if (v) {\n                if (!u) {\n                    q(s);\n                };\n                if ((v._type == p)) {\n                    t = JSON.parse(JSON.stringify(t));\n                };\n                k(v.handleResponse.bind(v), \"json\")(t);\n            }\n             else {\n                var w = a.ErrorSignal;\n                if ((w && !u)) {\n                    w.logJSError(\"ajax\", {\n                        error: \"UnexpectedJsonResponse\",\n                        extra: {\n                            id: s,\n                            uri: (((t.payload && t.payload.uri)) || \"\")\n                        }\n                    });\n                };\n            }\n        ;\n        }\n    });\n    l(r.prototype, g, {\n        getID: function() {\n            return (this._id || (this._id = n++));\n        },\n        hasFinished: function() {\n            return !((this.getID() in m));\n        },\n        getRequestURI: function() {\n            return j(this._uri).addQueryData({\n                __a: 1,\n                __adt: this.getID(),\n                __req: (\"jsonp_\" + this.getID())\n            });\n        },\n        getTransportFrame: function() {\n            if (this._iframe) {\n                return this._iframe\n            };\n            var s = (\"transport_frame_\" + this.getID()), t = i(((\"\\u003Ciframe class=\\\"hidden_elem\\\" name=\\\"\" + s) + \"\\\" src=\\\"javascript:void(0)\\\" /\\u003E\"));\n            return this._iframe = h.appendContent(document.body, t)[0];\n        },\n        send: function() {\n            if ((this._type === o)) {\n                (function() {\n                    h.appendContent(document.body, h.create(\"script\", {\n                        src: this.getRequestURI().toString(),\n                        type: \"text/javascript\"\n                    }));\n                }).bind(this).defer();\n            }\n             else this.getTransportFrame().src = this.getRequestURI().toString();\n        ;\n        },\n        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            };\n        },\n        abort: function() {\n            if (this._aborted) {\n                return\n            };\n            this._aborted = true;\n            this._cleanup();\n            q(this.getID());\n            this.inform(\"abort\");\n        },\n        _cleanup: function() {\n            if (this._iframe) {\n                h.remove(this._iframe);\n                this._iframe = null;\n            }\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"KeyEventController\", [\"DOM\",\"Event\",\"Run\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = b(\"isEmpty\");\n    function l() {\n        this.handlers = {\n        };\n        document.onkeyup = this.onkeyevent.bind(this, \"onkeyup\");\n        document.onkeydown = this.onkeyevent.bind(this, \"onkeydown\");\n        document.onkeypress = this.onkeyevent.bind(this, \"onkeypress\");\n    };\n    j(l, {\n        instance: null,\n        getInstance: function() {\n            return (l.instance || (l.instance = new l()));\n        },\n        defaultFilter: function(event, m) {\n            event = h.$E(event);\n            return ((l.filterEventTypes(event, m) && l.filterEventTargets(event, m)) && l.filterEventModifiers(event, m));\n        },\n        filterEventTypes: function(event, m) {\n            if ((m === \"onkeydown\")) {\n                return true\n            };\n            return false;\n        },\n        filterEventTargets: function(event, m) {\n            var n = event.getTarget(), o = (n.contentEditable === \"true\");\n            return (((!((o || g.isNodeOfType(n, l._interactiveElements))) || (n.type in l._uninterestingTypes)) || (((event.keyCode in l._controlKeys) && ((((g.isNodeOfType(n, [\"input\",\"textarea\",]) && (n.value.length === 0))) || ((o && (g.getText(n).length === 0)))))))));\n        },\n        filterEventModifiers: function(event, m) {\n            if ((((event.ctrlKey || event.altKey) || event.metaKey) || event.repeat)) {\n                return false\n            };\n            return true;\n        },\n        registerKey: function(m, n, o, p) {\n            if ((o === undefined)) {\n                o = l.defaultFilter;\n            };\n            var q = l.getInstance(), r = q.mapKey(m);\n            if (k(q.handlers)) {\n                i.onLeave(q.resetHandlers.bind(q));\n            };\n            var s = {\n            };\n            for (var t = 0; (t < r.length); t++) {\n                m = r[t];\n                if ((!q.handlers[m] || p)) {\n                    q.handlers[m] = [];\n                };\n                var u = {\n                    callback: n,\n                    filter: o\n                };\n                s[m] = u;\n                q.handlers[m].push(u);\n            };\n            return {\n                remove: function() {\n                    for (var v in s) {\n                        if ((q.handlers[v] && q.handlers[v].length)) {\n                            var w = q.handlers[v].indexOf(s[v]);\n                            ((w >= 0) && q.handlers[v].splice(w, 1));\n                        }\n                    ;\n                        delete s[v];\n                    };\n                }\n            };\n        },\n        keyCodeMap: {\n            BACKSPACE: [8,],\n            TAB: [9,],\n            RETURN: [13,],\n            ESCAPE: [27,],\n            LEFT: [37,63234,],\n            UP: [38,63232,],\n            RIGHT: [39,63235,],\n            DOWN: [40,63233,],\n            DELETE: [46,],\n            COMMA: [188,],\n            PERIOD: [190,],\n            SLASH: [191,],\n            \"`\": [192,],\n            \"[\": [219,],\n            \"]\": [221,]\n        },\n        _interactiveElements: [\"input\",\"select\",\"textarea\",\"object\",\"embed\",],\n        _uninterestingTypes: {\n            button: 1,\n            checkbox: 1,\n            radio: 1,\n            submit: 1\n        },\n        _controlKeys: {\n            8: 1,\n            9: 1,\n            13: 1,\n            27: 1,\n            37: 1,\n            63234: 1,\n            38: 1,\n            63232: 1,\n            39: 1,\n            63235: 1,\n            40: 1,\n            63233: 1,\n            46: 1\n        }\n    });\n    j(l.prototype, {\n        mapKey: function(m) {\n            if (((m >= 0) && (m <= 9))) {\n                if ((typeof (m) != \"number\")) {\n                    m = (m.charCodeAt(0) - 48);\n                };\n                return [(48 + m),(96 + m),];\n            }\n        ;\n            var n = l.keyCodeMap[m.toUpperCase()];\n            if (n) {\n                return n\n            };\n            return [m.toUpperCase().charCodeAt(0),];\n        },\n        onkeyevent: function(m, n) {\n            n = h.$E(n);\n            var o = (this.handlers[n.keyCode] || this.handlers[n.which]), p, q, r;\n            if (o) {\n                for (var s = 0; (s < o.length); s++) {\n                    p = o[s].callback;\n                    q = o[s].filter;\n                    try {\n                        if ((!q || q(n, m))) {\n                            r = p(n, m);\n                            if ((r === false)) {\n                                return h.kill(n)\n                            };\n                        }\n                    ;\n                    } catch (t) {\n                    \n                    };\n                }\n            };\n            return true;\n        },\n        resetHandlers: function() {\n            this.handlers = {\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"KeyStatus\", [\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = null, i = null;\n    function j() {\n        if (!i) {\n            i = g.listen(window, \"blur\", function() {\n                h = null;\n                k();\n            });\n        };\n    };\n    function k() {\n        if (i) {\n            i.remove();\n            i = null;\n        }\n    ;\n    };\n    g.listen(document.documentElement, \"keydown\", function(m) {\n        h = g.getKeyCode(m);\n        j();\n    }, g.Priority.URGENT);\n    g.listen(document.documentElement, \"keyup\", function(m) {\n        h = null;\n        k();\n    }, g.Priority.URGENT);\n    var l = {\n        isKeyDown: function() {\n            return !!h;\n        },\n        getKeyDownCode: function() {\n            return h;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BehaviorsMixin\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(l) {\n        this._behavior = l;\n        this._enabled = false;\n    };\n    g(h.prototype, {\n        enable: function() {\n            if (!this._enabled) {\n                this._enabled = true;\n                this._behavior.enable();\n            }\n        ;\n        },\n        disable: function() {\n            if (this._enabled) {\n                this._enabled = false;\n                this._behavior.disable();\n            }\n        ;\n        }\n    });\n    var i = 1;\n    function j(l) {\n        if (!l.__BEHAVIOR_ID) {\n            l.__BEHAVIOR_ID = i++;\n        };\n        return l.__BEHAVIOR_ID;\n    };\n    var k = {\n        enableBehavior: function(l) {\n            if (!this._behaviors) {\n                this._behaviors = {\n                };\n            };\n            var m = j(l);\n            if (!this._behaviors[m]) {\n                this._behaviors[m] = new h(new l(this));\n            };\n            this._behaviors[m].enable();\n            return this;\n        },\n        disableBehavior: function(l) {\n            if (this._behaviors) {\n                var m = j(l);\n                if (this._behaviors[m]) {\n                    this._behaviors[m].disable();\n                };\n            }\n        ;\n            return this;\n        },\n        enableBehaviors: function(l) {\n            l.forEach(this.enableBehavior.bind(this));\n            return this;\n        },\n        destroyBehaviors: function() {\n            if (this._behaviors) {\n                for (var l in this._behaviors) {\n                    this._behaviors[l].disable();;\n                };\n                this._behaviors = {\n                };\n            }\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"removeFromArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = h.indexOf(i);\n        ((j != -1) && h.splice(j, 1));\n    };\n    e.exports = g;\n});\n__d(\"Layer\", [\"Event\",\"function-extensions\",\"ArbiterMixin\",\"BehaviorsMixin\",\"BootloadedReact\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"HTML\",\"KeyEventController\",\"Parent\",\"Style\",\"copyProperties\",\"ge\",\"removeFromArray\",\"KeyStatus\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"BootloadedReact\"), k = b(\"ContextualThing\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"HTML\"), p = b(\"KeyEventController\"), q = b(\"Parent\"), r = b(\"Style\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"removeFromArray\");\n    b(\"KeyStatus\");\n    var v = [];\n    function w(x, y) {\n        this._config = (x || {\n        });\n        if (y) {\n            this._configure(this._config, y);\n            var z = (this._config.addedBehaviors || []);\n            this.enableBehaviors(this._getDefaultBehaviors().concat(z));\n        }\n    ;\n    };\n    s(w, h);\n    s(w, {\n        init: function(x, y) {\n            x.init(y);\n        },\n        initAndShow: function(x, y) {\n            x.init(y).show();\n        },\n        show: function(x) {\n            x.show();\n        },\n        getTopmostLayer: function() {\n            return v[(v.length - 1)];\n        }\n    });\n    s(w.prototype, h, i, {\n        _initialized: false,\n        _root: null,\n        _shown: false,\n        _hiding: false,\n        _causalElement: null,\n        _reactContainer: null,\n        init: function(x) {\n            this._configure(this._config, x);\n            var y = (this._config.addedBehaviors || []);\n            this.enableBehaviors(this._getDefaultBehaviors().concat(y));\n            this._initialized = true;\n            return this;\n        },\n        _configure: function(x, y) {\n            if (y) {\n                var z = n.isNode(y), aa = ((typeof y === \"string\") || o.isHTML(y));\n                this.containsReactComponent = j.isValidComponent(y);\n                if (aa) {\n                    y = o(y).getRootNode();\n                }\n                 else if (this.containsReactComponent) {\n                    var ba = document.createElement(\"div\");\n                    j.renderComponent(y, ba);\n                    y = this._reactContainer = ba;\n                }\n                \n            ;\n            }\n        ;\n            this._root = this._buildWrapper(x, y);\n            if (x.attributes) {\n                n.setAttributes(this._root, x.attributes);\n            };\n            if (x.classNames) {\n                x.classNames.forEach(l.addClass.curry(this._root));\n            };\n            l.addClass(this._root, \"uiLayer\");\n            if (x.causalElement) {\n                this._causalElement = t(x.causalElement);\n            };\n            if (x.permanent) {\n                this._permanent = x.permanent;\n            };\n            m.set(this._root, \"layer\", this);\n        },\n        _getDefaultBehaviors: function() {\n            return [];\n        },\n        getCausalElement: function() {\n            return this._causalElement;\n        },\n        setCausalElement: function(x) {\n            this._causalElement = x;\n            return this;\n        },\n        getInsertParent: function() {\n            return (this._insertParent || document.body);\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getContentRoot: function() {\n            return this._root;\n        },\n        _buildWrapper: function(x, y) {\n            return y;\n        },\n        setInsertParent: function(x) {\n            if (x) {\n                if ((this._shown && (x !== this.getInsertParent()))) {\n                    n.appendContent(x, this.getRoot());\n                    this.updatePosition();\n                }\n            ;\n                this._insertParent = x;\n            }\n        ;\n            return this;\n        },\n        show: function() {\n            if (this._shown) {\n                return this\n            };\n            var x = this.getRoot();\n            this.inform(\"beforeshow\");\n            r.set(x, \"visibility\", \"hidden\");\n            r.set(x, \"overflow\", \"hidden\");\n            l.show(x);\n            n.appendContent(this.getInsertParent(), x);\n            if ((this.updatePosition() !== false)) {\n                this._shown = true;\n                this.inform(\"show\");\n                w.inform(\"show\", this);\n                if (!this._permanent) {\n                    !function() {\n                        if (this._shown) {\n                            v.push(this);\n                        };\n                    }.bind(this).defer();\n                };\n            }\n             else l.hide(x);\n        ;\n            r.set(x, \"visibility\", \"\");\n            r.set(x, \"overflow\", \"\");\n            this.inform(\"aftershow\");\n            return this;\n        },\n        hide: function() {\n            if (((this._hiding || !this._shown) || (this.inform(\"beforehide\") === false))) {\n                return this\n            };\n            this._hiding = true;\n            if ((this.inform(\"starthide\") !== false)) {\n                this.finishHide();\n            };\n            return this;\n        },\n        conditionShow: function(x) {\n            return (x ? this.show() : this.hide());\n        },\n        finishHide: function() {\n            if (this._shown) {\n                if (!this._permanent) {\n                    u(v, this);\n                };\n                this._hiding = false;\n                this._shown = false;\n                l.hide(this.getRoot());\n                this.inform(\"hide\");\n                w.inform(\"hide\", this);\n            }\n        ;\n        },\n        isShown: function() {\n            return this._shown;\n        },\n        updatePosition: function() {\n            return true;\n        },\n        destroy: function() {\n            if (this.containsReactComponent) {\n                j.unmountAndReleaseReactRootNode(this._reactContainer);\n            };\n            this.finishHide();\n            var x = this.getRoot();\n            n.remove(x);\n            this.destroyBehaviors();\n            this.inform(\"destroy\");\n            w.inform(\"destroy\", this);\n            m.remove(x, \"layer\");\n            this._root = this._causalElement = null;\n        }\n    });\n    g.listen(document.documentElement, \"keydown\", function(event) {\n        if (p.filterEventTargets(event, \"keydown\")) {\n            for (var x = (v.length - 1); (x >= 0); x--) {\n                if ((v[x].inform(\"key\", event) === false)) {\n                    return false\n                };\n            }\n        };\n    }, g.Priority.URGENT);\n    g.listen(document.documentElement, \"click\", function(event) {\n        var x = v.length;\n        if (!x) {\n            return\n        };\n        var y = event.getTarget();\n        if (!n.contains(document.documentElement, y)) {\n            return\n        };\n        if (!y.offsetWidth) {\n            return\n        };\n        if (q.byClass(y, \"generic_dialog\")) {\n            return\n        };\n        while (x--) {\n            var z = v[x], aa = z.getContentRoot();\n            if (k.containsIncludingLayers(aa, y)) {\n                return\n            };\n            if (((z.inform(\"blur\") === false) || z.isShown())) {\n                return\n            };\n        };\n    });\n    e.exports = w;\n});\n__d(\"PopupWindow\", [\"DOMDimensions\",\"DOMQuery\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = b(\"Layer\"), j = b(\"copyProperties\"), k = {\n        _opts: {\n            allowShrink: true,\n            strategy: \"vector\",\n            timeout: 100,\n            widthElement: null\n        },\n        init: function(l) {\n            j(k._opts, l);\n            setInterval(k._resizeCheck, k._opts.timeout);\n        },\n        _resizeCheck: function() {\n            var l = g.getViewportDimensions(), m = k._getDocumentSize(), n = i.getTopmostLayer();\n            if (n) {\n                var o = n.getRoot().firstChild, p = g.getElementDimensions(o);\n                p.height += g.measureElementBox(o, \"height\", true, true, true);\n                p.width += g.measureElementBox(o, \"width\", true, true, true);\n                m.height = Math.max(m.height, p.height);\n                m.width = Math.max(m.width, p.width);\n            }\n        ;\n            var q = (m.height - l.height), r = (m.width - l.width);\n            if (((r < 0) && !k._opts.widthElement)) {\n                r = 0;\n            };\n            r = ((r > 1) ? r : 0);\n            if ((!k._opts.allowShrink && (q < 0))) {\n                q = 0;\n            };\n            if ((q || r)) {\n                try {\n                    (window.console && window.console.firebug);\n                    window.resizeBy(r, q);\n                    if (r) {\n                        window.moveBy((r / -2), 0);\n                    };\n                } catch (s) {\n                \n                }\n            };\n        },\n        _getDocumentSize: function() {\n            var l = g.getDocumentDimensions();\n            if ((k._opts.strategy === \"offsetHeight\")) {\n                l.height = document.body.offsetHeight;\n            };\n            if (k._opts.widthElement) {\n                var m = h.scry(document.body, k._opts.widthElement)[0];\n                if (m) {\n                    l.width = g.getElementDimensions(m).width;\n                };\n            }\n        ;\n            var n = a.Dialog;\n            if (((n && n.max_bottom) && (n.max_bottom > l.height))) {\n                l.height = n.max_bottom;\n            };\n            return l;\n        },\n        open: function(l, m, n) {\n            var o = ((typeof window.screenX != \"undefined\") ? window.screenX : window.screenLeft), p = ((typeof window.screenY != \"undefined\") ? window.screenY : window.screenTop), q = ((typeof window.outerWidth != \"undefined\") ? window.outerWidth : document.body.clientWidth), r = ((typeof window.outerHeight != \"undefined\") ? window.outerHeight : ((document.body.clientHeight - 22))), s = parseInt((o + ((((q - n)) / 2))), 10), t = parseInt((p + ((((r - m)) / 2.5))), 10), u = ((((((((\"width=\" + n) + \",height=\") + m) + \",left=\") + s) + \",top=\") + t));\n            return window.open(l, \"_blank\", u);\n        }\n    };\n    e.exports = k;\n});\n__d(\"Vector\", [\"Event\",\"DOMDimensions\",\"DOMPosition\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOMDimensions\"), i = b(\"DOMPosition\"), j = b(\"copyProperties\");\n    function k(l, m, n) {\n        j(this, {\n            x: parseFloat(l),\n            y: parseFloat(m),\n            domain: (n || \"pure\")\n        });\n    };\n    j(k.prototype, {\n        toString: function() {\n            return ((((\"(\" + this.x) + \", \") + this.y) + \")\");\n        },\n        add: function(l, m) {\n            if ((arguments.length == 1)) {\n                if ((l.domain != \"pure\")) {\n                    l = l.convertTo(this.domain);\n                };\n                return this.add(l.x, l.y);\n            }\n        ;\n            var n = parseFloat(l), o = parseFloat(m);\n            return new k((this.x + n), (this.y + o), this.domain);\n        },\n        mul: function(l, m) {\n            if ((typeof m == \"undefined\")) {\n                m = l;\n            };\n            return new k((this.x * l), (this.y * m), this.domain);\n        },\n        div: function(l, m) {\n            if ((typeof m == \"undefined\")) {\n                m = l;\n            };\n            return new k(((this.x * 1) / l), ((this.y * 1) / m), this.domain);\n        },\n        sub: function(l, m) {\n            if ((arguments.length == 1)) {\n                return this.add(l.mul(-1));\n            }\n             else return this.add(-l, -m)\n        ;\n        },\n        distanceTo: function(l) {\n            return this.sub(l).magnitude();\n        },\n        magnitude: function() {\n            return Math.sqrt((((this.x * this.x)) + ((this.y * this.y))));\n        },\n        rotate: function(l) {\n            return new k(((this.x * Math.cos(l)) - (this.y * Math.sin(l))), ((this.x * Math.sin(l)) + (this.y * Math.cos(l))));\n        },\n        convertTo: function(l) {\n            if ((((l != \"pure\") && (l != \"viewport\")) && (l != \"document\"))) {\n                return new k(0, 0)\n            };\n            if ((l == this.domain)) {\n                return new k(this.x, this.y, this.domain)\n            };\n            if ((l == \"pure\")) {\n                return new k(this.x, this.y)\n            };\n            if ((this.domain == \"pure\")) {\n                return new k(0, 0)\n            };\n            var m = k.getScrollPosition(\"document\"), n = this.x, o = this.y;\n            if ((this.domain == \"document\")) {\n                n -= m.x;\n                o -= m.y;\n            }\n             else {\n                n += m.x;\n                o += m.y;\n            }\n        ;\n            return new k(n, o, l);\n        },\n        setElementPosition: function(l) {\n            var m = this.convertTo(\"document\");\n            l.style.left = (parseInt(m.x) + \"px\");\n            l.style.top = (parseInt(m.y) + \"px\");\n            return this;\n        },\n        setElementDimensions: function(l) {\n            return this.setElementWidth(l).setElementHeight(l);\n        },\n        setElementWidth: function(l) {\n            l.style.width = (parseInt(this.x, 10) + \"px\");\n            return this;\n        },\n        setElementHeight: function(l) {\n            l.style.height = (parseInt(this.y, 10) + \"px\");\n            return this;\n        },\n        scrollElementBy: function(l) {\n            if ((l == document.body)) {\n                window.scrollBy(this.x, this.y);\n            }\n             else {\n                l.scrollLeft += this.x;\n                l.scrollTop += this.y;\n            }\n        ;\n            return this;\n        }\n    });\n    j(k, {\n        getEventPosition: function(l, m) {\n            m = (m || \"document\");\n            var n = g.getPosition(l), o = new k(n.x, n.y, \"document\");\n            return o.convertTo(m);\n        },\n        getScrollPosition: function(l) {\n            l = (l || \"document\");\n            var m = i.getScrollPosition();\n            return new k(m.x, m.y, \"document\").convertTo(l);\n        },\n        getElementPosition: function(l, m) {\n            m = (m || \"document\");\n            var n = i.getElementPosition(l);\n            return new k(n.x, n.y, \"viewport\").convertTo(m);\n        },\n        getElementDimensions: function(l) {\n            var m = h.getElementDimensions(l);\n            return new k(m.width, m.height);\n        },\n        getViewportDimensions: function() {\n            var l = h.getViewportDimensions();\n            return new k(l.width, l.height, \"viewport\");\n        },\n        getDocumentDimensions: function(l) {\n            var m = h.getDocumentDimensions(l);\n            return new k(m.width, m.height, \"document\");\n        },\n        deserialize: function(l) {\n            var m = l.split(\",\");\n            return new k(m[0], m[1]);\n        }\n    });\n    e.exports = k;\n});\n__d(\"enforceMaxLength\", [\"Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"DOM\"), i = b(\"Input\"), j = b(\"InputSelection\"), k = function(n, o) {\n        var p = i.getValue(n), q = p.length, r = (q - o);\n        if ((r > 0)) {\n            var s, t;\n            try {\n                s = j.get(n);\n                t = s.end;\n            } catch (u) {\n                s = null;\n                t = 0;\n            };\n            if ((t >= r)) {\n                q = t;\n            };\n            var v = (q - r);\n            if ((v && (((p.charCodeAt((v - 1)) & 64512)) === 55296))) {\n                v--;\n            };\n            t = Math.min(t, v);\n            i.setValue(n, (p.slice(0, v) + p.slice(q)));\n            if (s) {\n                j.set(n, Math.min(s.start, t), t);\n            };\n        }\n    ;\n    }, l = function(event) {\n        var n = event.getTarget(), o = (n.getAttribute && parseInt(n.getAttribute(\"maxlength\"), 10));\n        if (((o > 0) && h.isNodeOfType(n, [\"input\",\"textarea\",]))) {\n            k.bind(null, n, o).defer();\n        };\n    }, m = ((\"maxLength\" in h.create(\"input\")) && (\"maxLength\" in h.create(\"textarea\")));\n    if (!m) {\n        g.listen(document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    };\n    e.exports = k;\n});\n__d(\"requestAnimationFrame\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = 0, i = (((((a.requestAnimationFrame || a.webkitRequestAnimationFrame) || a.mozRequestAnimationFrame) || a.oRequestAnimationFrame) || a.msRequestAnimationFrame) || function(j) {\n        var k = Date.now(), l = Math.max(0, (16 - ((k - h))));\n        h = (k + l);\n        return a.setTimeout(j, l);\n    });\n    i(g);\n    e.exports = i;\n});\n__d(\"queryThenMutateDOM\", [\"function-extensions\",\"Run\",\"createArrayFrom\",\"emptyFunction\",\"requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Run\"), h = b(\"createArrayFrom\"), i = b(\"emptyFunction\"), j = b(\"requestAnimationFrame\"), k, l, m = {\n    }, n = [], o = [];\n    function p(s, t, u) {\n        if ((!s && !t)) {\n            return\n        };\n        if ((u && m.hasOwnProperty(u))) {\n            return;\n        }\n         else if (u) {\n            m[u] = 1;\n        }\n    ;\n        n.push((t || i));\n        o.push((s || i));\n        r();\n        if (!k) {\n            k = true;\n            g.onLeave(function() {\n                k = false;\n                l = false;\n                m = {\n                };\n                n.length = 0;\n                o.length = 0;\n            });\n        }\n    ;\n    };\n    p.prepare = function(s, t, u) {\n        return function() {\n            var v = h(arguments);\n            v.unshift(this);\n            var w = Function.prototype.bind.apply(s, v), x = t.bind(this);\n            p(w, x, u);\n        };\n    };\n    function q() {\n        m = {\n        };\n        var s = o.length, t = n.length, u = [], v;\n        while (s--) {\n            v = o.shift();\n            u.push(v());\n        };\n        while (t--) {\n            v = n.shift();\n            v(u.shift());\n        };\n        l = false;\n        r();\n    };\n    function r() {\n        if ((!l && ((o.length || n.length)))) {\n            l = true;\n            j(q);\n        }\n    ;\n    };\n    e.exports = p;\n});\n__d(\"UIForm\", [\"Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"DOM\"), k = b(\"Form\"), l = b(\"Run\"), m = b(\"areObjectsEqual\"), n = b(\"copyProperties\");\n    function o(p, q, r, s, t) {\n        this._root = p;\n        this.controller = p;\n        this._message = q;\n        if (s) {\n            this._confirm_dialog = s;\n            s.subscribe(\"confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                name: \"confirmed\",\n                value: \"true\"\n            }));\n        }\n    ;\n        l.onAfterLoad(function() {\n            this._originalState = k.serialize(this._root);\n        }.bind(this));\n        this._forceDirty = r;\n        this._confirmed = false;\n        this._submitted = false;\n        g.listen(this._root, \"submit\", this._handleSubmit.bind(this));\n        if ((t && t.length)) {\n            this.enableBehaviors(t);\n        };\n        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\n    };\n    n(o.prototype, h, i, {\n        getRoot: function() {\n            return this._root;\n        },\n        _handleSubmit: function() {\n            if ((this._confirm_dialog && !this._confirmed)) {\n                this._confirm_dialog.show();\n                return false;\n            }\n        ;\n            if ((this.inform(\"submit\") === false)) {\n                return false\n            };\n            this._submitted = true;\n            return true;\n        },\n        _handleDialogConfirm: function() {\n            this._confirmed = true;\n            this._confirm_dialog.hide();\n            if (this._root.getAttribute(\"ajaxify\")) {\n                g.fire(this._root, \"submit\");\n            }\n             else if (this._handleSubmit()) {\n                this._root.submit();\n            }\n        ;\n        },\n        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if ((this._submitted || !j.contains(document.body, this._root))) {\n                return false\n            };\n            if (this._forceDirty) {\n                return true\n            };\n            var p = k.serialize(this._root);\n            return !m(p, this._originalState);\n        },\n        checkUnsaved: function() {\n            if (this.isDirty()) {\n                return this._message\n            };\n            return null;\n        }\n    });\n    e.exports = (a.UIForm || o);\n});");
// 5124
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s745724cb144ffb0314d39065d8a453b0cfbd0f73");
// 5125
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"f7Tpb\",]);\n}\n;\n;\n__d(\"BrowserSupport\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = {\n    }, i = [\"Webkit\",\"Moz\",\"O\",\"ms\",], j = JSBNG__document.createElement(\"div\"), k = function(m) {\n        if (((h[m] === undefined))) {\n            var n = null;\n            if (((m in j.style))) {\n                n = m;\n            }\n             else for (var o = 0; ((o < i.length)); o++) {\n                var p = ((((i[o] + m.charAt(0).toUpperCase())) + m.slice(1)));\n                if (((p in j.style))) {\n                    n = p;\n                    break;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            h[m] = n;\n        }\n    ;\n    ;\n        return h[m];\n    }, l = {\n        hasCSSAnimations: function() {\n            return !!k(\"animationName\");\n        },\n        hasCSSTransforms: function() {\n            return !!k(\"transform\");\n        },\n        hasCSS3DTransforms: function() {\n            return !!k(\"perspective\");\n        },\n        hasCSSTransitions: function() {\n            return !!k(\"transition\");\n        },\n        hasPositionSticky: function() {\n            if (((h.sticky === undefined))) {\n                j.style.cssText = ((\"position:-webkit-sticky;position:-moz-sticky;\" + \"position:-o-sticky;position:-ms-sticky;position:sticky;\"));\n                h.sticky = /sticky/.test(j.style.position);\n            }\n        ;\n        ;\n            return h.sticky;\n        },\n        hasPointerEvents: function() {\n            if (((h.pointerEvents === undefined))) {\n                if (!((\"pointerEvents\" in j.style))) {\n                    h.pointerEvents = false;\n                }\n                 else {\n                    j.style.pointerEvents = \"auto\";\n                    j.style.pointerEvents = \"x\";\n                    g.appendContent(JSBNG__document.documentElement, j);\n                    h.pointerEvents = ((window.JSBNG__getComputedStyle && ((JSBNG__getComputedStyle(j, \"\").pointerEvents === \"auto\"))));\n                    g.remove(j);\n                }\n            ;\n            }\n        ;\n        ;\n            return h.pointerEvents;\n        },\n        getTransitionEndEvent: function() {\n            if (((h.transitionEnd === undefined))) {\n                var m = {\n                    transition: \"transitionend\",\n                    WebkitTransition: \"webkitTransitionEnd\",\n                    MozTransition: \"mozTransitionEnd\",\n                    OTransition: \"oTransitionEnd\"\n                }, n = k(\"transition\");\n                h.transitionEnd = ((m[n] || null));\n            }\n        ;\n        ;\n            return h.transitionEnd;\n        }\n    };\n    e.exports = l;\n});\n__d(\"shield\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        if (((typeof h != \"function\"))) {\n            throw new TypeError();\n        }\n    ;\n    ;\n        var j = Array.prototype.slice.call(arguments, 2);\n        return function() {\n            return h.apply(i, j);\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"Animation\", [\"BrowserSupport\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Style\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowserSupport\"), h = b(\"JSBNG__CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Style\"), l = b(\"shield\"), m, n = [], o;\n    function p(ga) {\n        if (((a == this))) {\n            return new p(ga);\n        }\n         else {\n            this.obj = ga;\n            this._reset_state();\n            this.queue = [];\n            this.last_attr = null;\n        }\n    ;\n    ;\n    };\n;\n    function q(ga) {\n        if (g.hasCSS3DTransforms()) {\n            return t(ga);\n        }\n         else return s(ga)\n    ;\n    };\n;\n    function r(ga) {\n        return ga.toFixed(8);\n    };\n;\n    function s(ga) {\n        ga = [ga[0],ga[4],ga[1],ga[5],ga[12],ga[13],];\n        return ((((\"matrix(\" + ga.map(r).join(\",\"))) + \")\"));\n    };\n;\n    function t(ga) {\n        return ((((\"matrix3d(\" + ga.map(r).join(\",\"))) + \")\"));\n    };\n;\n    function u(ga, ha) {\n        if (!ga) {\n            ga = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,];\n        }\n    ;\n    ;\n        var ia = [];\n        for (var ja = 0; ((ja < 4)); ja++) {\n            for (var ka = 0; ((ka < 4)); ka++) {\n                var la = 0;\n                for (var ma = 0; ((ma < 4)); ma++) {\n                    la += ((ga[((((ja * 4)) + ma))] * ha[((((ma * 4)) + ka))]));\n                ;\n                };\n            ;\n                ia[((((ja * 4)) + ka))] = la;\n            };\n        ;\n        };\n    ;\n        return ia;\n    };\n;\n    var v = 0;\n    p.prototype._reset_state = function() {\n        this.state = {\n            attrs: {\n            },\n            duration: 500\n        };\n    };\n    p.prototype.JSBNG__stop = function() {\n        this._reset_state();\n        this.queue = [];\n        return this;\n    };\n    p.prototype._build_container = function() {\n        if (this.container_div) {\n            this._refresh_container();\n            return;\n        }\n    ;\n    ;\n        if (((this.obj.firstChild && this.obj.firstChild.__animation_refs))) {\n            this.container_div = this.obj.firstChild;\n            this.container_div.__animation_refs++;\n            this._refresh_container();\n            return;\n        }\n    ;\n    ;\n        var ga = JSBNG__document.createElement(\"div\");\n        ga.style.padding = \"0px\";\n        ga.style.margin = \"0px\";\n        ga.style.border = \"0px\";\n        ga.__animation_refs = 1;\n        var ha = this.obj.childNodes;\n        while (ha.length) {\n            ga.appendChild(ha[0]);\n        ;\n        };\n    ;\n        this.obj.appendChild(ga);\n        this._orig_overflow = this.obj.style.overflow;\n        this.obj.style.overflow = \"hidden\";\n        this.container_div = ga;\n        this._refresh_container();\n    };\n    p.prototype._refresh_container = function() {\n        this.container_div.style.height = \"auto\";\n        this.container_div.style.width = \"auto\";\n        this.container_div.style.height = ((this.container_div.offsetHeight + \"px\"));\n        this.container_div.style.width = ((this.container_div.offsetWidth + \"px\"));\n    };\n    p.prototype._destroy_container = function() {\n        if (!this.container_div) {\n            return;\n        }\n    ;\n    ;\n        if (!--this.container_div.__animation_refs) {\n            var ga = this.container_div.childNodes;\n            while (ga.length) {\n                this.obj.appendChild(ga[0]);\n            ;\n            };\n        ;\n            this.obj.removeChild(this.container_div);\n        }\n    ;\n    ;\n        this.container_div = null;\n        this.obj.style.overflow = this._orig_overflow;\n    };\n    var w = 1, x = 2, y = 3;\n    p.prototype._attr = function(ga, ha, ia) {\n        ga = ga.replace(/-[a-z]/gi, function(ka) {\n            return ka.substring(1).toUpperCase();\n        });\n        var ja = false;\n        switch (ga) {\n          case \"background\":\n            this._attr(\"backgroundColor\", ha, ia);\n            return this;\n          case \"backgroundColor\":\n        \n          case \"borderColor\":\n        \n          case \"color\":\n            ha = ca(ha);\n            break;\n          case \"opacity\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"height\":\n        \n          case \"width\":\n            if (((ha == \"auto\"))) {\n                ja = true;\n            }\n             else ha = parseInt(ha, 10);\n        ;\n        ;\n            break;\n          case \"borderWidth\":\n        \n          case \"lineHeight\":\n        \n          case \"fontSize\":\n        \n          case \"margin\":\n        \n          case \"marginBottom\":\n        \n          case \"marginLeft\":\n        \n          case \"marginRight\":\n        \n          case \"marginTop\":\n        \n          case \"padding\":\n        \n          case \"paddingBottom\":\n        \n          case \"paddingLeft\":\n        \n          case \"paddingRight\":\n        \n          case \"paddingTop\":\n        \n          case \"bottom\":\n        \n          case \"left\":\n        \n          case \"right\":\n        \n          case \"JSBNG__top\":\n        \n          case \"scrollTop\":\n        \n          case \"scrollLeft\":\n            ha = parseInt(ha, 10);\n            break;\n          case \"rotateX\":\n        \n          case \"rotateY\":\n        \n          case \"rotateZ\":\n            ha = ((((parseInt(ha, 10) * Math.PI)) / 180));\n            break;\n          case \"translateX\":\n        \n          case \"translateY\":\n        \n          case \"translateZ\":\n        \n          case \"scaleX\":\n        \n          case \"scaleY\":\n        \n          case \"scaleZ\":\n            ha = parseFloat(ha, 10);\n            break;\n          case \"rotate3d\":\n            this._attr(\"rotateX\", ha[0], ia);\n            this._attr(\"rotateY\", ha[1], ia);\n            this._attr(\"rotateZ\", ha[2], ia);\n            return this;\n          case \"rotate\":\n            this._attr(\"rotateZ\", ha, ia);\n            return this;\n          case \"scale3d\":\n            this._attr(\"scaleZ\", ha[2], ia);\n          case \"scale\":\n            this._attr(\"scaleX\", ha[0], ia);\n            this._attr(\"scaleY\", ha[1], ia);\n            return this;\n          case \"translate3d\":\n            this._attr(\"translateZ\", ha[2], ia);\n          case \"translate\":\n            this._attr(\"translateX\", ha[0], ia);\n            this._attr(\"translateY\", ha[1], ia);\n            return this;\n          default:\n            throw new Error(((ga + \" is not a supported attribute!\")));\n        };\n    ;\n        if (((this.state.attrs[ga] === undefined))) {\n            this.state.attrs[ga] = {\n            };\n        }\n    ;\n    ;\n        if (ja) {\n            this.state.attrs[ga].auto = true;\n        }\n    ;\n    ;\n        switch (ia) {\n          case y:\n            this.state.attrs[ga].start = ha;\n            break;\n          case x:\n            this.state.attrs[ga].by = true;\n          case w:\n            this.state.attrs[ga].value = ha;\n            break;\n        };\n    ;\n    };\n    function z(ga) {\n        var ha = parseInt(k.get(ga, \"paddingLeft\"), 10), ia = parseInt(k.get(ga, \"paddingRight\"), 10), ja = parseInt(k.get(ga, \"borderLeftWidth\"), 10), ka = parseInt(k.get(ga, \"borderRightWidth\"), 10);\n        return ((((((((ga.offsetWidth - ((ha ? ha : 0)))) - ((ia ? ia : 0)))) - ((ja ? ja : 0)))) - ((ka ? ka : 0))));\n    };\n;\n    function aa(ga) {\n        var ha = parseInt(k.get(ga, \"paddingTop\"), 10), ia = parseInt(k.get(ga, \"paddingBottom\"), 10), ja = parseInt(k.get(ga, \"borderTopWidth\"), 10), ka = parseInt(k.get(ga, \"borderBottomWidth\"), 10);\n        return ((((((((ga.offsetHeight - ((ha ? ha : 0)))) - ((ia ? ia : 0)))) - ((ja ? ja : 0)))) - ((ka ? ka : 0))));\n    };\n;\n    p.prototype.to = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, w);\n        }\n         else {\n            this._attr(ga, ha, w);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.by = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, x);\n        }\n         else {\n            this._attr(ga, ha, x);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.from = function(ga, ha) {\n        if (((ha === undefined))) {\n            this._attr(this.last_attr, ga, y);\n        }\n         else {\n            this._attr(ga, ha, y);\n            this.last_attr = ga;\n        }\n    ;\n    ;\n        return this;\n    };\n    p.prototype.duration = function(ga) {\n        this.state.duration = ((ga ? ga : 0));\n        return this;\n    };\n    p.prototype.checkpoint = function(ga, ha) {\n        if (((ga === undefined))) {\n            ga = 1;\n        }\n    ;\n    ;\n        this.state.checkpoint = ga;\n        this.queue.push(this.state);\n        this._reset_state();\n        this.state.checkpointcb = ha;\n        return this;\n    };\n    p.prototype.blind = function() {\n        this.state.blind = true;\n        return this;\n    };\n    p.prototype.hide = function() {\n        this.state.hide = true;\n        return this;\n    };\n    p.prototype.show = function() {\n        this.state.show = true;\n        return this;\n    };\n    p.prototype.ease = function(ga) {\n        this.state.ease = ga;\n        return this;\n    };\n    p.prototype.go = function() {\n        var ga = JSBNG__Date.now();\n        this.queue.push(this.state);\n        for (var ha = 0; ((ha < this.queue.length)); ha++) {\n            this.queue[ha].start = ((ga - v));\n            if (this.queue[ha].checkpoint) {\n                ga += ((this.queue[ha].checkpoint * this.queue[ha].duration));\n            }\n        ;\n        ;\n        };\n    ;\n        da(this);\n        return this;\n    };\n    p.prototype._show = function() {\n        h.show(this.obj);\n    };\n    p.prototype._hide = function() {\n        h.hide(this.obj);\n    };\n    p.prototype._frame = function(ga) {\n        var ha = true, ia = false, ja;\n        function ka(db) {\n            return ((JSBNG__document.documentElement[db] || JSBNG__document.body[db]));\n        };\n    ;\n        for (var la = 0; ((la < this.queue.length)); la++) {\n            var ma = this.queue[la];\n            if (((ma.start > ga))) {\n                ha = false;\n                continue;\n            }\n        ;\n        ;\n            if (ma.checkpointcb) {\n                this._callback(ma.checkpointcb, ((ga - ma.start)));\n                ma.checkpointcb = null;\n            }\n        ;\n        ;\n            if (((ma.started === undefined))) {\n                if (ma.show) {\n                    this._show();\n                }\n            ;\n            ;\n                {\n                    var fin112keys = ((window.top.JSBNG_Replay.forInKeys)((ma.attrs))), fin112i = (0);\n                    var na;\n                    for (; (fin112i < fin112keys.length); (fin112i++)) {\n                        ((na) = (fin112keys[fin112i]));\n                        {\n                            if (((ma.attrs[na].start !== undefined))) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            switch (na) {\n                              case \"backgroundColor\":\n                            \n                              case \"borderColor\":\n                            \n                              case \"color\":\n                                ja = ca(k.get(this.obj, ((((na == \"borderColor\")) ? \"borderLeftColor\" : na))));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value[0] = Math.min(255, Math.max(0, ((ma.attrs[na].value[0] + ja[0]))));\n                                    ma.attrs[na].value[1] = Math.min(255, Math.max(0, ((ma.attrs[na].value[1] + ja[1]))));\n                                    ma.attrs[na].value[2] = Math.min(255, Math.max(0, ((ma.attrs[na].value[2] + ja[2]))));\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"opacity\":\n                                ja = k.getOpacity(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value = Math.min(1, Math.max(0, ((ma.attrs[na].value + ja))));\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"height\":\n                                ja = aa(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"width\":\n                                ja = z(this.obj);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"scrollLeft\":\n                            \n                              case \"scrollTop\":\n                                ja = ((((this.obj === JSBNG__document.body)) ? ka(na) : this.obj[na]));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                ma[((\"last\" + na))] = ja;\n                                break;\n                              case \"rotateX\":\n                            \n                              case \"rotateY\":\n                            \n                              case \"rotateZ\":\n                            \n                              case \"translateX\":\n                            \n                              case \"translateY\":\n                            \n                              case \"translateZ\":\n                                ja = i.get(this.obj, na, 0);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              case \"scaleX\":\n                            \n                              case \"scaleY\":\n                            \n                              case \"scaleZ\":\n                                ja = i.get(this.obj, na, 1);\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                              default:\n                                ja = ((parseInt(k.get(this.obj, na), 10) || 0));\n                                if (ma.attrs[na].by) {\n                                    ma.attrs[na].value += ja;\n                                }\n                            ;\n                            ;\n                                break;\n                            };\n                        ;\n                            ma.attrs[na].start = ja;\n                        };\n                    };\n                };\n            ;\n                if (((((ma.attrs.height && ma.attrs.height.auto)) || ((ma.attrs.width && ma.attrs.width.auto))))) {\n                    this._destroy_container();\n                    {\n                        var fin113keys = ((window.top.JSBNG_Replay.forInKeys)(({\n                            height: 1,\n                            width: 1,\n                            fontSize: 1,\n                            borderLeftWidth: 1,\n                            borderRightWidth: 1,\n                            borderTopWidth: 1,\n                            borderBottomWidth: 1,\n                            paddingLeft: 1,\n                            paddingRight: 1,\n                            paddingTop: 1,\n                            paddingBottom: 1\n                        }))), fin113i = (0);\n                        var na;\n                        for (; (fin113i < fin113keys.length); (fin113i++)) {\n                            ((na) = (fin113keys[fin113i]));\n                            {\n                                if (ma.attrs[na]) {\n                                    this.obj.style[na] = ((ma.attrs[na].value + ((((typeof ma.attrs[na].value == \"number\")) ? \"px\" : \"\"))));\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (((ma.attrs.height && ma.attrs.height.auto))) {\n                        ma.attrs.height.value = aa(this.obj);\n                    }\n                ;\n                ;\n                    if (((ma.attrs.width && ma.attrs.width.auto))) {\n                        ma.attrs.width.value = z(this.obj);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                ma.started = true;\n                if (ma.blind) {\n                    this._build_container();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var oa = ((((ga - ma.start)) / ma.duration));\n            if (((oa >= 1))) {\n                oa = 1;\n                if (ma.hide) {\n                    this._hide();\n                }\n            ;\n            ;\n            }\n             else ha = false;\n        ;\n        ;\n            var pa = ((ma.ease ? ma.ease(oa) : oa));\n            if (((((!ia && ((oa != 1)))) && ma.blind))) {\n                ia = true;\n            }\n        ;\n        ;\n            {\n                var fin114keys = ((window.top.JSBNG_Replay.forInKeys)((ma.attrs))), fin114i = (0);\n                var na;\n                for (; (fin114i < fin114keys.length); (fin114i++)) {\n                    ((na) = (fin114keys[fin114i]));\n                    {\n                        switch (na) {\n                          case \"backgroundColor\":\n                        \n                          case \"borderColor\":\n                        \n                          case \"color\":\n                            if (((ma.attrs[na].start[3] != ma.attrs[na].value[3]))) {\n                                this.obj.style[na] = ((((((((((((((((\"rgba(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true))) + \",\")) + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true))) + \",\")) + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true))) + \",\")) + ba(pa, ma.attrs[na].start[3], ma.attrs[na].value[3], false))) + \")\"));\n                            }\n                             else this.obj.style[na] = ((((((((((((\"rgb(\" + ba(pa, ma.attrs[na].start[0], ma.attrs[na].value[0], true))) + \",\")) + ba(pa, ma.attrs[na].start[1], ma.attrs[na].value[1], true))) + \",\")) + ba(pa, ma.attrs[na].start[2], ma.attrs[na].value[2], true))) + \")\"));\n                        ;\n                        ;\n                            break;\n                          case \"opacity\":\n                            k.set(this.obj, \"opacity\", ba(pa, ma.attrs[na].start, ma.attrs[na].value));\n                            break;\n                          case \"height\":\n                        \n                          case \"width\":\n                            this.obj.style[na] = ((((((pa == 1)) && ma.attrs[na].auto)) ? \"auto\" : ((ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"))));\n                            break;\n                          case \"scrollLeft\":\n                        \n                          case \"scrollTop\":\n                            var qa = ((this.obj === JSBNG__document.body));\n                            ja = ((qa ? ka(na) : this.obj[na]));\n                            if (((ma[((\"last\" + na))] !== ja))) {\n                                delete ma.attrs[na];\n                            }\n                             else {\n                                var ra = ba(pa, ma.attrs[na].start, ma.attrs[na].value, true);\n                                if (!qa) {\n                                    ra = this.obj[na] = ra;\n                                }\n                                 else {\n                                    if (((na == \"scrollLeft\"))) {\n                                        a.JSBNG__scrollTo(ra, ka(\"scrollTop\"));\n                                    }\n                                     else a.JSBNG__scrollTo(ka(\"scrollLeft\"), ra);\n                                ;\n                                ;\n                                    ra = ka(na);\n                                }\n                            ;\n                            ;\n                                ma[((\"last\" + na))] = ra;\n                            }\n                        ;\n                        ;\n                            break;\n                          case \"translateX\":\n                        \n                          case \"translateY\":\n                        \n                          case \"translateZ\":\n                        \n                          case \"rotateX\":\n                        \n                          case \"rotateY\":\n                        \n                          case \"rotateZ\":\n                        \n                          case \"scaleX\":\n                        \n                          case \"scaleY\":\n                        \n                          case \"scaleZ\":\n                            i.set(this.obj, na, ba(pa, ma.attrs[na].start, ma.attrs[na].value, false));\n                            break;\n                          default:\n                            this.obj.style[na] = ((ba(pa, ma.attrs[na].start, ma.attrs[na].value, true) + \"px\"));\n                            break;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n            var sa = null, ta = i.get(this.obj, \"translateX\", 0), ua = i.get(this.obj, \"translateY\", 0), va = i.get(this.obj, \"translateZ\", 0);\n            if (((((ta || ua)) || va))) {\n                sa = u(sa, [1,0,0,0,0,1,0,0,0,0,1,0,ta,ua,va,1,]);\n            }\n        ;\n        ;\n            var wa = i.get(this.obj, \"scaleX\", 1), xa = i.get(this.obj, \"scaleY\", 1), ya = i.get(this.obj, \"scaleZ\", 1);\n            if (((((((wa - 1)) || ((xa - 1)))) || ((ya - 1))))) {\n                sa = u(sa, [wa,0,0,0,0,xa,0,0,0,0,ya,0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var za = i.get(this.obj, \"rotateX\", 0);\n            if (za) {\n                sa = u(sa, [1,0,0,0,0,Math.cos(za),Math.sin(-za),0,0,Math.sin(za),Math.cos(za),0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var ab = i.get(this.obj, \"rotateY\", 0);\n            if (ab) {\n                sa = u(sa, [Math.cos(ab),0,Math.sin(ab),0,0,1,0,0,Math.sin(-ab),0,Math.cos(ab),0,0,0,0,1,]);\n            }\n        ;\n        ;\n            var bb = i.get(this.obj, \"rotateZ\", 0);\n            if (bb) {\n                sa = u(sa, [Math.cos(bb),Math.sin(-bb),0,0,Math.sin(bb),Math.cos(bb),0,0,0,0,1,0,0,0,0,1,]);\n            }\n        ;\n        ;\n            if (sa) {\n                var cb = q(sa);\n                k.apply(this.obj, {\n                    \"-webkit-transform\": cb,\n                    \"-moz-transform\": cb,\n                    \"-ms-transform\": cb,\n                    \"-o-transform\": cb,\n                    transform: cb\n                });\n            }\n             else if (ha) {\n                k.apply(this.obj, {\n                    \"-webkit-transform\": null,\n                    \"-moz-transform\": null,\n                    \"-ms-transform\": null,\n                    \"-o-transform\": null,\n                    transform: null\n                });\n            }\n            \n        ;\n        ;\n            if (((oa == 1))) {\n                this.queue.splice(la--, 1);\n                this._callback(ma.ondone, ((((ga - ma.start)) - ma.duration)));\n            }\n        ;\n        ;\n        };\n    ;\n        if (((!ia && this.container_div))) {\n            this._destroy_container();\n        }\n    ;\n    ;\n        return !ha;\n    };\n    p.prototype.ondone = function(ga) {\n        this.state.ondone = ga;\n        return this;\n    };\n    p.prototype._callback = function(ga, ha) {\n        if (ga) {\n            v = ha;\n            ga.call(this);\n            v = 0;\n        }\n    ;\n    ;\n    };\n    function ba(ga, ha, ia, ja) {\n        return ((ja ? parseInt : parseFloat))(((((((ia - ha)) * ga)) + ha)), 10);\n    };\n;\n    function ca(ga) {\n        var ha = /^#([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i.exec(ga);\n        if (ha) {\n            return [parseInt(((((ha[1].length == 1)) ? ((ha[1] + ha[1])) : ha[1])), 16),parseInt(((((ha[2].length == 1)) ? ((ha[2] + ha[2])) : ha[2])), 16),parseInt(((((ha[3].length == 1)) ? ((ha[3] + ha[3])) : ha[3])), 16),1,];\n        }\n         else {\n            var ia = /^rgba? *\\(([0-9]+), *([0-9]+), *([0-9]+)(?:, *([0-9\\.]+))?\\)$/.exec(ga);\n            if (ia) {\n                return [parseInt(ia[1], 10),parseInt(ia[2], 10),parseInt(ia[3], 10),((ia[4] ? parseFloat(ia[4]) : 1)),];\n            }\n             else if (((ga == \"transparent\"))) {\n                return [255,255,255,0,];\n            }\n             else throw \"Named color attributes are not supported.\"\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    function da(ga) {\n        n.push(ga);\n        if (((n.length === 1))) {\n            if (!m) {\n                var ha = ((((a.JSBNG__requestAnimationFrame || a.JSBNG__webkitRequestAnimationFrame)) || a.JSBNG__mozRequestAnimationFrame));\n                if (ha) {\n                    m = ha.bind(a);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (m) {\n                m(fa);\n            }\n             else o = JSBNG__setInterval(fa, 20, false);\n        ;\n        ;\n        }\n    ;\n    ;\n        if (m) {\n            ea();\n        }\n    ;\n    ;\n        fa(JSBNG__Date.now(), true);\n    };\n;\n    function ea() {\n        if (!m) {\n            throw new Error(\"Ending timer only valid with requestAnimationFrame\");\n        }\n    ;\n    ;\n        var ga = 0;\n        for (var ha = 0; ((ha < n.length)); ha++) {\n            var ia = n[ha];\n            for (var ja = 0; ((ja < ia.queue.length)); ja++) {\n                var ka = ((ia.queue[ja].start + ia.queue[ja].duration));\n                if (((ka > ga))) {\n                    ga = ka;\n                }\n            ;\n            ;\n            };\n        ;\n        };\n    ;\n        if (o) {\n            JSBNG__clearTimeout(o);\n            o = null;\n        }\n    ;\n    ;\n        var la = JSBNG__Date.now();\n        if (((ga > la))) {\n            o = JSBNG__setTimeout(l(fa), ((ga - la)), false);\n        }\n    ;\n    ;\n    };\n;\n    function fa(ga, ha) {\n        var ia = JSBNG__Date.now();\n        for (var ja = ((((ha === true)) ? ((n.length - 1)) : 0)); ((ja < n.length)); ja++) {\n            try {\n                if (!n[ja]._frame(ia)) {\n                    n.splice(ja--, 1);\n                }\n            ;\n            ;\n            } catch (ka) {\n                n.splice(ja--, 1);\n            };\n        ;\n        };\n    ;\n        if (((n.length === 0))) {\n            if (o) {\n                if (m) {\n                    JSBNG__clearTimeout(o);\n                }\n                 else JSBNG__clearInterval(o);\n            ;\n            ;\n                o = null;\n            }\n        ;\n        ;\n        }\n         else if (m) {\n            m(fa);\n        }\n        \n    ;\n    ;\n    };\n;\n    p.ease = {\n    };\n    p.ease.begin = function(ga) {\n        return ((Math.sin(((((Math.PI / 2)) * ((ga - 1))))) + 1));\n    };\n    p.ease.end = function(ga) {\n        return Math.sin(((((14085 * Math.PI)) * ga)));\n    };\n    p.ease.both = function(ga) {\n        return ((((14134 * Math.sin(((Math.PI * ((ga - 14158))))))) + 14163));\n    };\n    p.prependInsert = function(ga, ha) {\n        p.insert(ga, ha, j.prependContent);\n    };\n    p.appendInsert = function(ga, ha) {\n        p.insert(ga, ha, j.appendContent);\n    };\n    p.insert = function(ga, ha, ia) {\n        k.set(ha, \"opacity\", 0);\n        ia(ga, ha);\n        new p(ha).from(\"opacity\", 0).to(\"opacity\", 1).duration(400).go();\n    };\n    e.exports = p;\n});\n__d(\"BootloadedReact\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = function(j) {\n        g.loadModules([\"React\",], j);\n    }, i = {\n        isValidComponent: function(j) {\n            return ((((j && ((typeof j.mountComponentIntoNode === \"function\")))) && ((typeof j.receiveProps === \"function\"))));\n        },\n        initializeTouchEvents: function(j, k) {\n            h(function(l) {\n                l.initializeTouchEvents(j);\n                ((k && k()));\n            });\n        },\n        createClass: function(j, k) {\n            h(function(l) {\n                var m = l.createClass(j);\n                ((k && k(m)));\n            });\n        },\n        renderComponent: function(j, k, l) {\n            h(function(m) {\n                var n = m.renderComponent(j, k);\n                ((l && l(n)));\n            });\n        },\n        unmountAndReleaseReactRootNode: function(j, k) {\n            h(function(l) {\n                l.unmountAndReleaseReactRootNode(j);\n                ((k && k()));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ContextualThing\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        register: function(j, k) {\n            j.setAttribute(\"data-ownerid\", g.getID(k));\n        },\n        containsIncludingLayers: function(j, k) {\n            while (k) {\n                if (g.contains(j, k)) {\n                    return true;\n                }\n            ;\n            ;\n                k = i.getContext(k);\n            };\n        ;\n            return false;\n        },\n        getContext: function(j) {\n            var k;\n            while (j) {\n                if (((j.getAttribute && (k = j.getAttribute(\"data-ownerid\"))))) {\n                    return h(k);\n                }\n            ;\n            ;\n                j = j.parentNode;\n            };\n        ;\n            return null;\n        }\n    };\n    e.exports = i;\n});\n__d(\"DOMPosition\", [\"DOMDimensions\",\"DOMQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = {\n        getScrollPosition: function() {\n            var j = h.getDocumentScrollElement();\n            return {\n                x: j.scrollLeft,\n                y: j.scrollTop\n            };\n        },\n        getNormalizedScrollPosition: function() {\n            var j = i.getScrollPosition(), k = g.getDocumentDimensions(), l = g.getViewportDimensions(), m = ((k.height - l.height)), n = ((k.width - l.width));\n            return {\n                y: Math.max(0, Math.min(j.y, m)),\n                x: Math.max(0, Math.min(j.x, n))\n            };\n        },\n        getElementPosition: function(j) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            var k = JSBNG__document.documentElement;\n            if (((!((\"getBoundingClientRect\" in j)) || !h.contains(k, j)))) {\n                return {\n                    x: 0,\n                    y: 0\n                };\n            }\n        ;\n        ;\n            var l = j.getBoundingClientRect(), m = ((Math.round(l.left) - k.clientLeft)), n = ((Math.round(l.JSBNG__top) - k.clientTop));\n            return {\n                x: m,\n                y: n\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"Form\", [\"JSBNG__Event\",\"AsyncRequest\",\"AsyncResponse\",\"JSBNG__CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"DataStore\",\"Env\",\"Input\",\"Parent\",\"URI\",\"createArrayFrom\",\"trackReferrer\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"DOMPosition\"), m = b(\"DOMQuery\"), n = b(\"DataStore\"), o = b(\"Env\"), p = b(\"Input\"), q = b(\"Parent\"), r = b(\"URI\"), s = b(\"createArrayFrom\"), t = b(\"trackReferrer\"), u = ((\"JSBNG__FileList\" in window)), v = ((\"JSBNG__FormData\" in window));\n    function w(y) {\n        var z = {\n        };\n        r.implodeQuery(y).split(\"&\").forEach(function(aa) {\n            if (aa) {\n                var ba = /^([^=]*)(?:=(.*))?$/.exec(aa), ca = r.decodeComponent(ba[1]), da = ((ba[2] ? r.decodeComponent(ba[2]) : null));\n                z[ca] = da;\n            }\n        ;\n        ;\n        });\n        return z;\n    };\n;\n    var x = {\n        getInputs: function(y) {\n            y = ((y || JSBNG__document));\n            return [].concat(s(m.scry(y, \"input\")), s(m.scry(y, \"select\")), s(m.scry(y, \"textarea\")), s(m.scry(y, \"button\")));\n        },\n        getInputsByName: function(y) {\n            var z = {\n            };\n            x.getInputs(y).forEach(function(aa) {\n                var ba = z[aa.JSBNG__name];\n                z[aa.JSBNG__name] = ((((typeof ba === \"undefined\")) ? aa : [aa,].concat(ba)));\n            });\n            return z;\n        },\n        getSelectValue: function(y) {\n            return y.options[y.selectedIndex].value;\n        },\n        setSelectValue: function(y, z) {\n            for (var aa = 0; ((aa < y.options.length)); ++aa) {\n                if (((y.options[aa].value == z))) {\n                    y.selectedIndex = aa;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        getRadioValue: function(y) {\n            for (var z = 0; ((z < y.length)); z++) {\n                if (y[z].checked) {\n                    return y[z].value;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getElements: function(y) {\n            return s(((((((y.tagName == \"FORM\")) && ((y.elements != y)))) ? y.elements : x.getInputs(y))));\n        },\n        getAttribute: function(y, z) {\n            return ((((y.getAttributeNode(z) || {\n            })).value || null));\n        },\n        setDisabled: function(y, z) {\n            x.getElements(y).forEach(function(aa) {\n                if (((aa.disabled !== undefined))) {\n                    var ba = n.get(aa, \"origDisabledState\");\n                    if (z) {\n                        if (((ba === undefined))) {\n                            n.set(aa, \"origDisabledState\", aa.disabled);\n                        }\n                    ;\n                    ;\n                        aa.disabled = z;\n                    }\n                     else if (((ba !== true))) {\n                        aa.disabled = false;\n                    }\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        bootstrap: function(y, z) {\n            var aa = ((x.getAttribute(y, \"method\") || \"GET\")).toUpperCase();\n            z = ((q.byTag(z, \"button\") || z));\n            var ba = ((q.byClass(z, \"stat_elem\") || y));\n            if (j.hasClass(ba, \"async_saving\")) {\n                return;\n            }\n        ;\n        ;\n            if (((z && ((((((z.form !== y)) || ((((z.nodeName != \"INPUT\")) && ((z.nodeName != \"BUTTON\")))))) || ((z.type != \"submit\"))))))) {\n                var ca = m.scry(y, \".enter_submit_target\")[0];\n                ((ca && (z = ca)));\n            }\n        ;\n        ;\n            var da = x.serialize(y, z);\n            x.setDisabled(y, true);\n            var ea = ((x.getAttribute(y, \"ajaxify\") || x.getAttribute(y, \"action\")));\n            t(y, ea);\n            var fa = new h(ea);\n            fa.setData(da).setNectarModuleDataSafe(y).setReadOnly(((aa == \"GET\"))).setMethod(aa).setRelativeTo(y).setStatusElement(ba).setInitialHandler(x.setDisabled.curry(y, false)).setHandler(function(ga) {\n                g.fire(y, \"success\", {\n                    response: ga\n                });\n            }).setErrorHandler(function(ga) {\n                if (((g.fire(y, \"error\", {\n                    response: ga\n                }) !== false))) {\n                    i.defaultErrorHandler(ga);\n                }\n            ;\n            ;\n            }).setFinallyHandler(x.setDisabled.curry(y, false)).send();\n        },\n        forEachValue: function(y, z, aa) {\n            x.getElements(y).forEach(function(ba) {\n                if (((((ba.JSBNG__name && !ba.disabled)) && ((ba.type !== \"submit\"))))) {\n                    if (((((((((((!ba.type || ((((((ba.type === \"radio\")) || ((ba.type === \"checkbox\")))) && ba.checked)))) || ((ba.type === \"text\")))) || ((ba.type === \"password\")))) || ((ba.type === \"hidden\")))) || ((ba.nodeName === \"TEXTAREA\"))))) {\n                        aa(ba.type, ba.JSBNG__name, p.getValue(ba));\n                    }\n                     else if (((ba.nodeName === \"SELECT\"))) {\n                        for (var ca = 0, da = ba.options.length; ((ca < da)); ca++) {\n                            var ea = ba.options[ca];\n                            if (ea.selected) {\n                                aa(\"select\", ba.JSBNG__name, ea.value);\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else if (((u && ((ba.type === \"file\"))))) {\n                        var fa = ba.files;\n                        for (var ga = 0; ((ga < fa.length)); ga++) {\n                            aa(\"file\", ba.JSBNG__name, fa.JSBNG__item(ga));\n                        ;\n                        };\n                    ;\n                    }\n                    \n                    \n                ;\n                }\n            ;\n            ;\n            });\n            if (((((((((z && z.JSBNG__name)) && ((z.type === \"submit\")))) && m.contains(y, z))) && m.isNodeOfType(z, [\"input\",\"button\",])))) {\n                aa(\"submit\", z.JSBNG__name, z.value);\n            }\n        ;\n        ;\n        },\n        createFormData: function(y, z) {\n            if (!v) {\n                return null;\n            }\n        ;\n        ;\n            var aa = new JSBNG__FormData();\n            if (y) {\n                if (m.isNode(y)) {\n                    x.forEachValue(y, z, function(da, ea, fa) {\n                        aa.append(ea, fa);\n                    });\n                }\n                 else {\n                    var ba = w(y);\n                    {\n                        var fin115keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin115i = (0);\n                        var ca;\n                        for (; (fin115i < fin115keys.length); (fin115i++)) {\n                            ((ca) = (fin115keys[fin115i]));\n                            {\n                                aa.append(ca, ba[ca]);\n                            ;\n                            };\n                        };\n                    };\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return aa;\n        },\n        serialize: function(y, z) {\n            var aa = {\n            };\n            x.forEachValue(y, z, function(ba, ca, da) {\n                if (((ba === \"file\"))) {\n                    return;\n                }\n            ;\n            ;\n                x._serializeHelper(aa, ca, da);\n            });\n            return x._serializeFix(aa);\n        },\n        _serializeHelper: function(y, z, aa) {\n            var ba = Object.prototype.hasOwnProperty, ca = /([^\\]]+)\\[([^\\]]*)\\](.*)/.exec(z);\n            if (ca) {\n                if (((!y[ca[1]] || !ba.call(y, ca[1])))) {\n                    var da;\n                    y[ca[1]] = da = {\n                    };\n                    if (((y[ca[1]] !== da))) {\n                        return;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var ea = 0;\n                if (((ca[2] === \"\"))) {\n                    while (((y[ca[1]][ea] !== undefined))) {\n                        ea++;\n                    ;\n                    };\n                ;\n                }\n                 else ea = ca[2];\n            ;\n            ;\n                if (((ca[3] === \"\"))) {\n                    y[ca[1]][ea] = aa;\n                }\n                 else x._serializeHelper(y[ca[1]], ea.concat(ca[3]), aa);\n            ;\n            ;\n            }\n             else y[z] = aa;\n        ;\n        ;\n        },\n        _serializeFix: function(y) {\n            {\n                var fin116keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin116i = (0);\n                var z;\n                for (; (fin116i < fin116keys.length); (fin116i++)) {\n                    ((z) = (fin116keys[fin116i]));\n                    {\n                        if (((y[z] instanceof Object))) {\n                            y[z] = x._serializeFix(y[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = Object.keys(y);\n            if (((((aa.length === 0)) || aa.some(isNaN)))) {\n                return y;\n            }\n        ;\n        ;\n            aa.sort(function(da, ea) {\n                return ((da - ea));\n            });\n            var ba = 0, ca = aa.every(function(da) {\n                return ((+da === ba++));\n            });\n            if (ca) {\n                return aa.map(function(da) {\n                    return y[da];\n                });\n            }\n        ;\n        ;\n            return y;\n        },\n        post: function(y, z, aa) {\n            var ba = JSBNG__document.createElement(\"form\");\n            ba.action = y.toString();\n            ba.method = \"POST\";\n            ba.style.display = \"none\";\n            if (aa) {\n                ba.target = aa;\n            }\n        ;\n        ;\n            z.fb_dtsg = o.fb_dtsg;\n            x.createHiddenInputs(z, ba);\n            m.getRootElement().appendChild(ba);\n            ba.submit();\n            return false;\n        },\n        createHiddenInputs: function(y, z, aa, ba) {\n            aa = ((aa || {\n            }));\n            var ca = w(y);\n            {\n                var fin117keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin117i = (0);\n                var da;\n                for (; (fin117i < fin117keys.length); (fin117i++)) {\n                    ((da) = (fin117keys[fin117i]));\n                    {\n                        if (((ca[da] === null))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (((aa[da] && ba))) {\n                            aa[da].value = ca[da];\n                        }\n                         else {\n                            var ea = k.create(\"input\", {\n                                type: \"hidden\",\n                                JSBNG__name: da,\n                                value: ca[da]\n                            });\n                            aa[da] = ea;\n                            z.appendChild(ea);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return aa;\n        },\n        getFirstElement: function(y, z) {\n            z = ((z || [\"input[type=\\\"text\\\"]\",\"textarea\",\"input[type=\\\"password\\\"]\",\"input[type=\\\"button\\\"]\",\"input[type=\\\"submit\\\"]\",]));\n            var aa = [];\n            for (var ba = 0; ((ba < z.length)); ba++) {\n                aa = m.scry(y, z[ba]);\n                for (var ca = 0; ((ca < aa.length)); ca++) {\n                    var da = aa[ca];\n                    try {\n                        var fa = l.getElementPosition(da);\n                        if (((((fa.y > 0)) && ((fa.x > 0))))) {\n                            return da;\n                        }\n                    ;\n                    ;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                };\n            ;\n            };\n        ;\n            return null;\n        },\n        focusFirst: function(y) {\n            var z = x.getFirstElement(y);\n            if (z) {\n                z.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = x;\n});\n__d(\"HistoryManager\", [\"JSBNG__Event\",\"function-extensions\",\"Cookie\",\"Env\",\"URI\",\"UserAgent\",\"copyProperties\",\"emptyFunction\",\"goOrReplace\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Cookie\"), i = b(\"Env\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = b(\"copyProperties\"), m = b(\"emptyFunction\"), n = b(\"goOrReplace\"), o = {\n        _IFRAME_BASE_URI: \"http://static.ak.facebook.com/common/history_manager.php\",\n        JSBNG__history: null,\n        current: 0,\n        fragment: null,\n        _setIframeSrcFragment: function(p) {\n            p = p.toString();\n            var q = ((o.JSBNG__history.length - 1));\n            o.iframe.src = ((((((((o._IFRAME_BASE_URI + \"?|index=\")) + q)) + \"#\")) + encodeURIComponent(p)));\n            return o;\n        },\n        getIframeSrcFragment: function() {\n            return decodeURIComponent(j(o.iframe.contentWindow.JSBNG__document.JSBNG__location.href).getFragment());\n        },\n        nextframe: function(p, q) {\n            if (q) {\n                o._setIframeSrcFragment(p);\n                return;\n            }\n        ;\n        ;\n            if (((p !== undefined))) {\n                o.iframeQueue.push(p);\n            }\n             else {\n                o.iframeQueue.splice(0, 1);\n                o.iframeTimeout = null;\n                o.checkURI();\n            }\n        ;\n        ;\n            if (((o.iframeQueue.length && !o.iframeTimeout))) {\n                var r = o.iframeQueue[0];\n                o.iframeTimeout = JSBNG__setTimeout(function() {\n                    o._setIframeSrcFragment(r);\n                }, 100, false);\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return !!o._initialized;\n        },\n        init: function() {\n            if (((!i.ALLOW_TRANSITION_IN_IFRAME && ((window != window.JSBNG__top))))) {\n                return;\n            }\n        ;\n        ;\n            if (o._initialized) {\n                return o;\n            }\n        ;\n        ;\n            var p = j(), q = ((p.getFragment() || \"\"));\n            if (((q.charAt(0) === \"!\"))) {\n                q = q.substr(1);\n                p.setFragment(q);\n            }\n        ;\n        ;\n            if (((j.getRequestURI(false).getProtocol().toLowerCase() == \"https\"))) {\n                o._IFRAME_BASE_URI = \"https://s-static.ak.facebook.com/common/history_manager.php\";\n            }\n        ;\n        ;\n            l(o, {\n                _initialized: true,\n                fragment: q,\n                orig_fragment: q,\n                JSBNG__history: [p,],\n                callbacks: [],\n                lastChanged: JSBNG__Date.now(),\n                canonical: j(\"#\"),\n                fragmentTimeout: null,\n                user: 0,\n                iframeTimeout: null,\n                iframeQueue: [],\n                enabled: true,\n                debug: m\n            });\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                this.lastURI = JSBNG__document.JSBNG__URL;\n                window.JSBNG__history.replaceState(this.lastURI, null);\n                g.listen(window, \"popstate\", function(r) {\n                    if (((((r && r.state)) && ((o.lastURI != r.state))))) {\n                        o.lastURI = r.state;\n                        o.lastChanged = JSBNG__Date.now();\n                        o.notify(j(r.state).getUnqualifiedURI().toString());\n                    }\n                ;\n                ;\n                }.bind(o));\n                if (((((k.webkit() < 534)) || ((k.chrome() <= 13))))) {\n                    JSBNG__setInterval(o.checkURI, 42, false);\n                    o._updateRefererURI(this.lastURI);\n                }\n            ;\n            ;\n                return o;\n            }\n        ;\n        ;\n            o._updateRefererURI(j.getRequestURI(false));\n            if (((((k.webkit() < 500)) || ((k.firefox() < 2))))) {\n                o.enabled = false;\n                return o;\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                o.iframe = JSBNG__document.createElement(\"div\");\n                l(o.iframe.style, {\n                    width: \"0\",\n                    height: \"0\",\n                    frameborder: \"0\",\n                    left: \"0\",\n                    JSBNG__top: \"0\",\n                    position: \"absolute\"\n                });\n                o._setIframeSrcFragment(q);\n                JSBNG__document.body.insertBefore(o.iframe, JSBNG__document.body.firstChild);\n            }\n             else if (((\"JSBNG__onhashchange\" in window))) {\n                g.listen(window, \"hashchange\", function() {\n                    o.checkURI.bind(o).defer();\n                });\n            }\n             else JSBNG__setInterval(o.checkURI, 42, false);\n            \n        ;\n        ;\n            return o;\n        },\n        registerURIHandler: function(p) {\n            o.callbacks.push(p);\n            return o;\n        },\n        setCanonicalLocation: function(p) {\n            o.canonical = j(p);\n            return o;\n        },\n        notify: function(p) {\n            if (((p == o.orig_fragment))) {\n                p = o.canonical.getFragment();\n            }\n        ;\n        ;\n            for (var q = 0; ((q < o.callbacks.length)); q++) {\n                try {\n                    if (o.callbacks[q](p)) {\n                        return true;\n                    }\n                ;\n                ;\n                } catch (r) {\n                \n                };\n            ;\n            };\n        ;\n            return false;\n        },\n        checkURI: function() {\n            if (((((JSBNG__Date.now() - o.lastChanged)) < 400))) {\n                return;\n            }\n        ;\n        ;\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                var p = j(JSBNG__document.JSBNG__URL).removeQueryData(\"ref\").toString(), q = j(o.lastURI).removeQueryData(\"ref\").toString();\n                if (((p != q))) {\n                    o.lastChanged = JSBNG__Date.now();\n                    o.lastURI = p;\n                    if (((k.webkit() < 534))) {\n                        o._updateRefererURI(p);\n                    }\n                ;\n                ;\n                    o.notify(j(p).getUnqualifiedURI().toString());\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            if (((((k.ie() < 8)) && o.iframeQueue.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((k.webkit() && ((window.JSBNG__history.length == 200))))) {\n                if (!o.warned) {\n                    o.warned = true;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var r = j().getFragment();\n            if (((r.charAt(0) == \"!\"))) {\n                r = r.substr(1);\n            }\n        ;\n        ;\n            if (((k.ie() < 8))) {\n                r = o.getIframeSrcFragment();\n            }\n        ;\n        ;\n            r = r.replace(/%23/g, \"#\");\n            if (((r != o.fragment.replace(/%23/g, \"#\")))) {\n                o.debug([r,\" vs \",o.fragment,\"whl: \",window.JSBNG__history.length,\"QHL: \",o.JSBNG__history.length,].join(\" \"));\n                for (var s = ((o.JSBNG__history.length - 1)); ((s >= 0)); --s) {\n                    if (((o.JSBNG__history[s].getFragment().replace(/%23/g, \"#\") == r))) {\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                ++o.user;\n                if (((s >= 0))) {\n                    o.go(((s - o.current)));\n                }\n                 else o.go(((\"#\" + r)));\n            ;\n            ;\n                --o.user;\n            }\n        ;\n        ;\n        },\n        _updateRefererURI: function(p) {\n            p = p.toString();\n            if (((((p.charAt(0) != \"/\")) && ((p.indexOf(\"//\") == -1))))) {\n                return;\n            }\n        ;\n        ;\n            var q = new j(window.JSBNG__location);\n            if (q.isFacebookURI()) {\n                var r = ((q.getPath() + window.JSBNG__location.search));\n            }\n             else var r = \"\"\n        ;\n            var s = j(p).getQualifiedURI().setFragment(r).toString(), t = 2048;\n            if (((s.length > t))) {\n                s = ((s.substring(0, t) + \"...\"));\n            }\n        ;\n        ;\n            h.set(\"x-referer\", s);\n        },\n        go: function(p, q, r) {\n            if (((window.JSBNG__history && JSBNG__history.pushState))) {\n                ((q || ((typeof (p) == \"number\"))));\n                var s = j(p).removeQueryData(\"ref\").toString();\n                o.lastChanged = JSBNG__Date.now();\n                this.lastURI = s;\n                if (r) {\n                    window.JSBNG__history.replaceState(p, null, s);\n                }\n                 else window.JSBNG__history.pushState(p, null, s);\n            ;\n            ;\n                if (((k.webkit() < 534))) {\n                    o._updateRefererURI(p);\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            o.debug(((\"go: \" + p)));\n            if (((q === undefined))) {\n                q = true;\n            }\n        ;\n        ;\n            if (!o.enabled) {\n                if (!q) {\n                    return false;\n                }\n            ;\n            }\n        ;\n        ;\n            if (((typeof (p) == \"number\"))) {\n                if (!p) {\n                    return false;\n                }\n            ;\n            ;\n                var t = ((p + o.current)), u = Math.max(0, Math.min(((o.JSBNG__history.length - 1)), t));\n                o.current = u;\n                t = ((o.JSBNG__history[u].getFragment() || o.orig_fragment));\n                t = j(t).removeQueryData(\"ref\").getUnqualifiedURI().toString();\n                o.fragment = t;\n                o.lastChanged = JSBNG__Date.now();\n                if (((k.ie() < 8))) {\n                    if (o.fragmentTimeout) {\n                        JSBNG__clearTimeout(o.fragmentTimeout);\n                    }\n                ;\n                ;\n                    o._temporary_fragment = t;\n                    o.fragmentTimeout = JSBNG__setTimeout(function() {\n                        window.JSBNG__location.hash = ((\"#!\" + t));\n                        delete o._temporary_fragment;\n                    }, 750, false);\n                    if (!o.user) {\n                        o.nextframe(t, r);\n                    }\n                ;\n                ;\n                }\n                 else if (!o.user) {\n                    n(window.JSBNG__location, ((((window.JSBNG__location.href.split(\"#\")[0] + \"#!\")) + t)), r);\n                }\n                \n            ;\n            ;\n                if (q) {\n                    o.notify(t);\n                }\n            ;\n            ;\n                o._updateRefererURI(t);\n                return false;\n            }\n        ;\n        ;\n            p = j(p);\n            if (((p.getDomain() == j().getDomain()))) {\n                p = j(((\"#\" + p.getUnqualifiedURI())));\n            }\n        ;\n        ;\n            var v = o.JSBNG__history[o.current].getFragment(), w = p.getFragment();\n            if (((((w == v)) || ((((v == o.orig_fragment)) && ((w == o.canonical.getFragment()))))))) {\n                if (q) {\n                    o.notify(w);\n                }\n            ;\n            ;\n                o._updateRefererURI(w);\n                return false;\n            }\n        ;\n        ;\n            if (r) {\n                o.current--;\n            }\n        ;\n        ;\n            var x = ((((o.JSBNG__history.length - o.current)) - 1));\n            o.JSBNG__history.splice(((o.current + 1)), x);\n            o.JSBNG__history.push(j(p));\n            return o.go(1, q, r);\n        },\n        getCurrentFragment: function() {\n            var p = ((((o._temporary_fragment !== undefined)) ? o._temporary_fragment : j.getRequestURI(false).getFragment()));\n            return ((((p == o.orig_fragment)) ? o.canonical.getFragment() : p));\n        }\n    };\n    e.exports = o;\n});\n__d(\"InputSelection\", [\"DOM\",\"Focus\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Focus\"), i = {\n        get: function(j) {\n            if (!JSBNG__document.selection) {\n                return {\n                    start: j.selectionStart,\n                    end: j.selectionEnd\n                };\n            }\n        ;\n        ;\n            var k = JSBNG__document.selection.createRange();\n            if (((k.parentElement() !== j))) {\n                return {\n                    start: 0,\n                    end: 0\n                };\n            }\n        ;\n        ;\n            var l = j.value.length;\n            if (g.isNodeOfType(j, \"input\")) {\n                return {\n                    start: -k.moveStart(\"character\", -l),\n                    end: -k.moveEnd(\"character\", -l)\n                };\n            }\n             else {\n                var m = k.duplicate();\n                m.moveToElementText(j);\n                m.setEndPoint(\"StartToEnd\", k);\n                var n = ((l - m.text.length));\n                m.setEndPoint(\"StartToStart\", k);\n                return {\n                    start: ((l - m.text.length)),\n                    end: n\n                };\n            }\n        ;\n        ;\n        },\n        set: function(j, k, l) {\n            if (((typeof l == \"undefined\"))) {\n                l = k;\n            }\n        ;\n        ;\n            if (JSBNG__document.selection) {\n                if (((j.tagName == \"TEXTAREA\"))) {\n                    var m = ((j.value.slice(0, k).match(/\\r/g) || [])).length, n = ((j.value.slice(k, l).match(/\\r/g) || [])).length;\n                    k -= m;\n                    l -= ((m + n));\n                }\n            ;\n            ;\n                var o = j.createTextRange();\n                o.collapse(true);\n                o.moveStart(\"character\", k);\n                o.moveEnd(\"character\", ((l - k)));\n                o.select();\n            }\n             else {\n                j.selectionStart = k;\n                j.selectionEnd = Math.min(l, j.value.length);\n                h.set(j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"JSONPTransport\", [\"ArbiterMixin\",\"DOM\",\"HTML\",\"URI\",\"asyncCallback\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"URI\"), k = b(\"asyncCallback\"), l = b(\"copyProperties\"), m = {\n    }, n = 2, o = \"jsonp\", p = \"div\";\n    function q(s) {\n        delete m[s];\n    };\n;\n    function r(s, t) {\n        this._type = s;\n        this._uri = t;\n        m[this.getID()] = this;\n    };\n;\n    l(r, {\n        respond: function(s, t, u) {\n            var v = m[s];\n            if (v) {\n                if (!u) {\n                    q(s);\n                }\n            ;\n            ;\n                if (((v._type == p))) {\n                    t = JSON.parse(JSON.stringify(t));\n                }\n            ;\n            ;\n                k(v.handleResponse.bind(v), \"json\")(t);\n            }\n             else {\n                var w = a.ErrorSignal;\n                if (((w && !u))) {\n                    w.logJSError(\"ajax\", {\n                        error: \"UnexpectedJsonResponse\",\n                        extra: {\n                            id: s,\n                            uri: ((((t.payload && t.payload.uri)) || \"\"))\n                        }\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    l(r.prototype, g, {\n        getID: function() {\n            return ((this._id || (this._id = n++)));\n        },\n        hasFinished: function() {\n            return !((this.getID() in m));\n        },\n        getRequestURI: function() {\n            return j(this._uri).addQueryData({\n                __a: 1,\n                __adt: this.getID(),\n                __req: ((\"jsonp_\" + this.getID()))\n            });\n        },\n        getTransportFrame: function() {\n            if (this._iframe) {\n                return this._iframe;\n            }\n        ;\n        ;\n            var s = ((\"transport_frame_\" + this.getID())), t = i(((((\"\\u003Ciframe class=\\\"hidden_elem\\\" name=\\\"\" + s)) + \"\\\" src=\\\"javascript:void(0)\\\" /\\u003E\")));\n            return this._iframe = h.appendContent(JSBNG__document.body, t)[0];\n        },\n        send: function() {\n            if (((this._type === o))) {\n                (function() {\n                    h.appendContent(JSBNG__document.body, h.create(\"script\", {\n                        src: this.getRequestURI().toString(),\n                        type: \"text/javascript\"\n                    }));\n                }).bind(this).defer();\n            }\n             else this.getTransportFrame().src = this.getRequestURI().toString();\n        ;\n        ;\n        },\n        handleResponse: function(s) {\n            this.inform(\"response\", s);\n            if (this.hasFinished()) {\n                this._cleanup.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        abort: function() {\n            if (this._aborted) {\n                return;\n            }\n        ;\n        ;\n            this._aborted = true;\n            this._cleanup();\n            q(this.getID());\n            this.inform(\"abort\");\n        },\n        _cleanup: function() {\n            if (this._iframe) {\n                h.remove(this._iframe);\n                this._iframe = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"KeyEventController\", [\"DOM\",\"JSBNG__Event\",\"Run\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"copyProperties\"), k = b(\"isEmpty\");\n    function l() {\n        this.handlers = {\n        };\n        JSBNG__document.JSBNG__onkeyup = this.onkeyevent.bind(this, \"JSBNG__onkeyup\");\n        JSBNG__document.JSBNG__onkeydown = this.onkeyevent.bind(this, \"JSBNG__onkeydown\");\n        JSBNG__document.JSBNG__onkeypress = this.onkeyevent.bind(this, \"JSBNG__onkeypress\");\n    };\n;\n    j(l, {\n        instance: null,\n        getInstance: function() {\n            return ((l.instance || (l.instance = new l())));\n        },\n        defaultFilter: function(JSBNG__event, m) {\n            JSBNG__event = h.$E(JSBNG__event);\n            return ((((l.filterEventTypes(JSBNG__event, m) && l.filterEventTargets(JSBNG__event, m))) && l.filterEventModifiers(JSBNG__event, m)));\n        },\n        filterEventTypes: function(JSBNG__event, m) {\n            if (((m === \"JSBNG__onkeydown\"))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        filterEventTargets: function(JSBNG__event, m) {\n            var n = JSBNG__event.getTarget(), o = ((n.contentEditable === \"true\"));\n            return ((((!((o || g.isNodeOfType(n, l._interactiveElements))) || ((n.type in l._uninterestingTypes)))) || ((((JSBNG__event.keyCode in l._controlKeys)) && ((((g.isNodeOfType(n, [\"input\",\"textarea\",]) && ((n.value.length === 0)))) || ((o && ((g.getText(n).length === 0))))))))));\n        },\n        filterEventModifiers: function(JSBNG__event, m) {\n            if (((((((JSBNG__event.ctrlKey || JSBNG__event.altKey)) || JSBNG__event.metaKey)) || JSBNG__event.repeat))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        registerKey: function(m, n, o, p) {\n            if (((o === undefined))) {\n                o = l.defaultFilter;\n            }\n        ;\n        ;\n            var q = l.getInstance(), r = q.mapKey(m);\n            if (k(q.handlers)) {\n                i.onLeave(q.resetHandlers.bind(q));\n            }\n        ;\n        ;\n            var s = {\n            };\n            for (var t = 0; ((t < r.length)); t++) {\n                m = r[t];\n                if (((!q.handlers[m] || p))) {\n                    q.handlers[m] = [];\n                }\n            ;\n            ;\n                var u = {\n                    callback: n,\n                    filter: o\n                };\n                s[m] = u;\n                q.handlers[m].push(u);\n            };\n        ;\n            return {\n                remove: function() {\n                    {\n                        var fin118keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin118i = (0);\n                        var v;\n                        for (; (fin118i < fin118keys.length); (fin118i++)) {\n                            ((v) = (fin118keys[fin118i]));\n                            {\n                                if (((q.handlers[v] && q.handlers[v].length))) {\n                                    var w = q.handlers[v].indexOf(s[v]);\n                                    ((((w >= 0)) && q.handlers[v].splice(w, 1)));\n                                }\n                            ;\n                            ;\n                                delete s[v];\n                            };\n                        };\n                    };\n                ;\n                }\n            };\n        },\n        keyCodeMap: {\n            BACKSPACE: [8,],\n            TAB: [9,],\n            RETURN: [13,],\n            ESCAPE: [27,],\n            LEFT: [37,63234,],\n            UP: [38,63232,],\n            RIGHT: [39,63235,],\n            DOWN: [40,63233,],\n            DELETE: [46,],\n            COMMA: [188,],\n            PERIOD: [190,],\n            SLASH: [191,],\n            \"`\": [192,],\n            \"[\": [219,],\n            \"]\": [221,]\n        },\n        _interactiveElements: [\"input\",\"select\",\"textarea\",\"object\",\"embed\",],\n        _uninterestingTypes: {\n            button: 1,\n            checkbox: 1,\n            radio: 1,\n            submit: 1\n        },\n        _controlKeys: {\n            8: 1,\n            9: 1,\n            13: 1,\n            27: 1,\n            37: 1,\n            63234: 1,\n            38: 1,\n            63232: 1,\n            39: 1,\n            63235: 1,\n            40: 1,\n            63233: 1,\n            46: 1\n        }\n    });\n    j(l.prototype, {\n        mapKey: function(m) {\n            if (((((m >= 0)) && ((m <= 9))))) {\n                if (((typeof (m) != \"number\"))) {\n                    m = ((m.charCodeAt(0) - 48));\n                }\n            ;\n            ;\n                return [((48 + m)),((96 + m)),];\n            }\n        ;\n        ;\n            var n = l.keyCodeMap[m.toUpperCase()];\n            if (n) {\n                return n;\n            }\n        ;\n        ;\n            return [m.toUpperCase().charCodeAt(0),];\n        },\n        onkeyevent: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148), function(m, n) {\n            n = h.$E(n);\n            var o = ((this.handlers[n.keyCode] || this.handlers[n.which])), p, q, r;\n            if (o) {\n                for (var s = 0; ((s < o.length)); s++) {\n                    p = o[s].callback;\n                    q = o[s].filter;\n                    try {\n                        if (((!q || q(n, m)))) {\n                            r = p(n, m);\n                            if (((r === false))) {\n                                return h.kill(n);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    } catch (t) {\n                    \n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            return true;\n        })),\n        resetHandlers: function() {\n            this.handlers = {\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"KeyStatus\", [\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = null, i = null;\n    function j() {\n        if (!i) {\n            i = g.listen(window, \"JSBNG__blur\", function() {\n                h = null;\n                k();\n            });\n        }\n    ;\n    ;\n    };\n;\n    function k() {\n        if (i) {\n            i.remove();\n            i = null;\n        }\n    ;\n    ;\n    };\n;\n    g.listen(JSBNG__document.documentElement, \"keydown\", function(m) {\n        h = g.getKeyCode(m);\n        j();\n    }, g.Priority.URGENT);\n    g.listen(JSBNG__document.documentElement, \"keyup\", function(m) {\n        h = null;\n        k();\n    }, g.Priority.URGENT);\n    var l = {\n        isKeyDown: function() {\n            return !!h;\n        },\n        getKeyDownCode: function() {\n            return h;\n        }\n    };\n    e.exports = l;\n});\n__d(\"BehaviorsMixin\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(l) {\n        this._behavior = l;\n        this._enabled = false;\n    };\n;\n    g(h.prototype, {\n        enable: function() {\n            if (!this._enabled) {\n                this._enabled = true;\n                this._behavior.enable();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            if (this._enabled) {\n                this._enabled = false;\n                this._behavior.disable();\n            }\n        ;\n        ;\n        }\n    });\n    var i = 1;\n    function j(l) {\n        if (!l.__BEHAVIOR_ID) {\n            l.__BEHAVIOR_ID = i++;\n        }\n    ;\n    ;\n        return l.__BEHAVIOR_ID;\n    };\n;\n    var k = {\n        enableBehavior: function(l) {\n            if (!this._behaviors) {\n                this._behaviors = {\n                };\n            }\n        ;\n        ;\n            var m = j(l);\n            if (!this._behaviors[m]) {\n                this._behaviors[m] = new h(new l(this));\n            }\n        ;\n        ;\n            this._behaviors[m].enable();\n            return this;\n        },\n        disableBehavior: function(l) {\n            if (this._behaviors) {\n                var m = j(l);\n                if (this._behaviors[m]) {\n                    this._behaviors[m].disable();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        enableBehaviors: function(l) {\n            l.forEach(this.enableBehavior.bind(this));\n            return this;\n        },\n        destroyBehaviors: function() {\n            if (this._behaviors) {\n                {\n                    var fin119keys = ((window.top.JSBNG_Replay.forInKeys)((this._behaviors))), fin119i = (0);\n                    var l;\n                    for (; (fin119i < fin119keys.length); (fin119i++)) {\n                        ((l) = (fin119keys[fin119i]));\n                        {\n                            this._behaviors[l].disable();\n                        ;\n                        };\n                    };\n                };\n            ;\n                this._behaviors = {\n                };\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"removeFromArray\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = h.indexOf(i);\n        ((((j != -1)) && h.splice(j, 1)));\n    };\n;\n    e.exports = g;\n});\n__d(\"Layer\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"BehaviorsMixin\",\"BootloadedReact\",\"ContextualThing\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"HTML\",\"KeyEventController\",\"Parent\",\"Style\",\"copyProperties\",\"ge\",\"removeFromArray\",\"KeyStatus\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"BootloadedReact\"), k = b(\"ContextualThing\"), l = b(\"JSBNG__CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"HTML\"), p = b(\"KeyEventController\"), q = b(\"Parent\"), r = b(\"Style\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"removeFromArray\");\n    b(\"KeyStatus\");\n    var v = [];\n    function w(x, y) {\n        this._config = ((x || {\n        }));\n        if (y) {\n            this._configure(this._config, y);\n            var z = ((this._config.addedBehaviors || []));\n            this.enableBehaviors(this._getDefaultBehaviors().concat(z));\n        }\n    ;\n    ;\n    };\n;\n    s(w, h);\n    s(w, {\n        init: function(x, y) {\n            x.init(y);\n        },\n        initAndShow: function(x, y) {\n            x.init(y).show();\n        },\n        show: function(x) {\n            x.show();\n        },\n        getTopmostLayer: function() {\n            return v[((v.length - 1))];\n        }\n    });\n    s(w.prototype, h, i, {\n        _initialized: false,\n        _root: null,\n        _shown: false,\n        _hiding: false,\n        _causalElement: null,\n        _reactContainer: null,\n        init: function(x) {\n            this._configure(this._config, x);\n            var y = ((this._config.addedBehaviors || []));\n            this.enableBehaviors(this._getDefaultBehaviors().concat(y));\n            this._initialized = true;\n            return this;\n        },\n        _configure: function(x, y) {\n            if (y) {\n                var z = n.isNode(y), aa = ((((typeof y === \"string\")) || o.isHTML(y)));\n                this.containsReactComponent = j.isValidComponent(y);\n                if (aa) {\n                    y = o(y).getRootNode();\n                }\n                 else if (this.containsReactComponent) {\n                    var ba = JSBNG__document.createElement(\"div\");\n                    j.renderComponent(y, ba);\n                    y = this._reactContainer = ba;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            this._root = this._buildWrapper(x, y);\n            if (x.attributes) {\n                n.setAttributes(this._root, x.attributes);\n            }\n        ;\n        ;\n            if (x.classNames) {\n                x.classNames.forEach(l.addClass.curry(this._root));\n            }\n        ;\n        ;\n            l.addClass(this._root, \"uiLayer\");\n            if (x.causalElement) {\n                this._causalElement = t(x.causalElement);\n            }\n        ;\n        ;\n            if (x.permanent) {\n                this._permanent = x.permanent;\n            }\n        ;\n        ;\n            m.set(this._root, \"layer\", this);\n        },\n        _getDefaultBehaviors: function() {\n            return [];\n        },\n        getCausalElement: function() {\n            return this._causalElement;\n        },\n        setCausalElement: function(x) {\n            this._causalElement = x;\n            return this;\n        },\n        getInsertParent: function() {\n            return ((this._insertParent || JSBNG__document.body));\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getContentRoot: function() {\n            return this._root;\n        },\n        _buildWrapper: function(x, y) {\n            return y;\n        },\n        setInsertParent: function(x) {\n            if (x) {\n                if (((this._shown && ((x !== this.getInsertParent()))))) {\n                    n.appendContent(x, this.getRoot());\n                    this.updatePosition();\n                }\n            ;\n            ;\n                this._insertParent = x;\n            }\n        ;\n        ;\n            return this;\n        },\n        show: function() {\n            if (this._shown) {\n                return this;\n            }\n        ;\n        ;\n            var x = this.getRoot();\n            this.inform(\"beforeshow\");\n            r.set(x, \"visibility\", \"hidden\");\n            r.set(x, \"overflow\", \"hidden\");\n            l.show(x);\n            n.appendContent(this.getInsertParent(), x);\n            if (((this.updatePosition() !== false))) {\n                this._shown = true;\n                this.inform(\"show\");\n                w.inform(\"show\", this);\n                if (!this._permanent) {\n                    !function() {\n                        if (this._shown) {\n                            v.push(this);\n                        }\n                    ;\n                    ;\n                    }.bind(this).defer();\n                }\n            ;\n            ;\n            }\n             else l.hide(x);\n        ;\n        ;\n            r.set(x, \"visibility\", \"\");\n            r.set(x, \"overflow\", \"\");\n            this.inform(\"aftershow\");\n            return this;\n        },\n        hide: function() {\n            if (((((this._hiding || !this._shown)) || ((this.inform(\"beforehide\") === false))))) {\n                return this;\n            }\n        ;\n        ;\n            this._hiding = true;\n            if (((this.inform(\"starthide\") !== false))) {\n                this.finishHide();\n            }\n        ;\n        ;\n            return this;\n        },\n        conditionShow: function(x) {\n            return ((x ? this.show() : this.hide()));\n        },\n        finishHide: function() {\n            if (this._shown) {\n                if (!this._permanent) {\n                    u(v, this);\n                }\n            ;\n            ;\n                this._hiding = false;\n                this._shown = false;\n                l.hide(this.getRoot());\n                this.inform(\"hide\");\n                w.inform(\"hide\", this);\n            }\n        ;\n        ;\n        },\n        isShown: function() {\n            return this._shown;\n        },\n        updatePosition: function() {\n            return true;\n        },\n        destroy: function() {\n            if (this.containsReactComponent) {\n                j.unmountAndReleaseReactRootNode(this._reactContainer);\n            }\n        ;\n        ;\n            this.finishHide();\n            var x = this.getRoot();\n            n.remove(x);\n            this.destroyBehaviors();\n            this.inform(\"destroy\");\n            w.inform(\"destroy\", this);\n            m.remove(x, \"layer\");\n            this._root = this._causalElement = null;\n        }\n    });\n    g.listen(JSBNG__document.documentElement, \"keydown\", function(JSBNG__event) {\n        if (p.filterEventTargets(JSBNG__event, \"keydown\")) {\n            for (var x = ((v.length - 1)); ((x >= 0)); x--) {\n                if (((v[x].inform(\"key\", JSBNG__event) === false))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n    }, g.Priority.URGENT);\n    g.listen(JSBNG__document.documentElement, \"click\", function(JSBNG__event) {\n        var x = v.length;\n        if (!x) {\n            return;\n        }\n    ;\n    ;\n        var y = JSBNG__event.getTarget();\n        if (!n.contains(JSBNG__document.documentElement, y)) {\n            return;\n        }\n    ;\n    ;\n        if (!y.offsetWidth) {\n            return;\n        }\n    ;\n    ;\n        if (q.byClass(y, \"generic_dialog\")) {\n            return;\n        }\n    ;\n    ;\n        while (x--) {\n            var z = v[x], aa = z.getContentRoot();\n            if (k.containsIncludingLayers(aa, y)) {\n                return;\n            }\n        ;\n        ;\n            if (((((z.inform(\"JSBNG__blur\") === false)) || z.isShown()))) {\n                return;\n            }\n        ;\n        ;\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"PopupWindow\", [\"DOMDimensions\",\"DOMQuery\",\"Layer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMDimensions\"), h = b(\"DOMQuery\"), i = b(\"Layer\"), j = b(\"copyProperties\"), k = {\n        _opts: {\n            allowShrink: true,\n            strategy: \"vector\",\n            timeout: 100,\n            widthElement: null\n        },\n        init: function(l) {\n            j(k._opts, l);\n            JSBNG__setInterval(k._resizeCheck, k._opts.timeout);\n        },\n        _resizeCheck: function() {\n            var l = g.getViewportDimensions(), m = k._getDocumentSize(), n = i.getTopmostLayer();\n            if (n) {\n                var o = n.getRoot().firstChild, p = g.getElementDimensions(o);\n                p.height += g.measureElementBox(o, \"height\", true, true, true);\n                p.width += g.measureElementBox(o, \"width\", true, true, true);\n                m.height = Math.max(m.height, p.height);\n                m.width = Math.max(m.width, p.width);\n            }\n        ;\n        ;\n            var q = ((m.height - l.height)), r = ((m.width - l.width));\n            if (((((r < 0)) && !k._opts.widthElement))) {\n                r = 0;\n            }\n        ;\n        ;\n            r = ((((r > 1)) ? r : 0));\n            if (((!k._opts.allowShrink && ((q < 0))))) {\n                q = 0;\n            }\n        ;\n        ;\n            if (((q || r))) {\n                try {\n                    ((window.JSBNG__console && window.JSBNG__console.firebug));\n                    window.JSBNG__resizeBy(r, q);\n                    if (r) {\n                        window.JSBNG__moveBy(((r / -2)), 0);\n                    }\n                ;\n                ;\n                } catch (s) {\n                \n                };\n            }\n        ;\n        ;\n        },\n        _getDocumentSize: function() {\n            var l = g.getDocumentDimensions();\n            if (((k._opts.strategy === \"offsetHeight\"))) {\n                l.height = JSBNG__document.body.offsetHeight;\n            }\n        ;\n        ;\n            if (k._opts.widthElement) {\n                var m = h.scry(JSBNG__document.body, k._opts.widthElement)[0];\n                if (m) {\n                    l.width = g.getElementDimensions(m).width;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var n = a.Dialog;\n            if (((((n && n.max_bottom)) && ((n.max_bottom > l.height))))) {\n                l.height = n.max_bottom;\n            }\n        ;\n        ;\n            return l;\n        },\n        open: function(l, m, n) {\n            var o = ((((typeof window.JSBNG__screenX != \"undefined\")) ? window.JSBNG__screenX : window.JSBNG__screenLeft)), p = ((((typeof window.JSBNG__screenY != \"undefined\")) ? window.JSBNG__screenY : window.JSBNG__screenTop)), q = ((((typeof window.JSBNG__outerWidth != \"undefined\")) ? window.JSBNG__outerWidth : JSBNG__document.body.clientWidth)), r = ((((typeof window.JSBNG__outerHeight != \"undefined\")) ? window.JSBNG__outerHeight : ((JSBNG__document.body.clientHeight - 22)))), s = parseInt(((o + ((((q - n)) / 2)))), 10), t = parseInt(((p + ((((r - m)) / 2.5)))), 10), u = ((((((((((((((\"width=\" + n)) + \",height=\")) + m)) + \",left=\")) + s)) + \",top=\")) + t));\n            return window.open(l, \"_blank\", u);\n        }\n    };\n    e.exports = k;\n});\n__d(\"Vector\", [\"JSBNG__Event\",\"DOMDimensions\",\"DOMPosition\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOMDimensions\"), i = b(\"DOMPosition\"), j = b(\"copyProperties\");\n    function k(l, m, n) {\n        j(this, {\n            x: parseFloat(l),\n            y: parseFloat(m),\n            domain: ((n || \"pure\"))\n        });\n    };\n;\n    j(k.prototype, {\n        toString: function() {\n            return ((((((((\"(\" + this.x)) + \", \")) + this.y)) + \")\"));\n        },\n        add: function(l, m) {\n            if (((arguments.length == 1))) {\n                if (((l.domain != \"pure\"))) {\n                    l = l.convertTo(this.domain);\n                }\n            ;\n            ;\n                return this.add(l.x, l.y);\n            }\n        ;\n        ;\n            var n = parseFloat(l), o = parseFloat(m);\n            return new k(((this.x + n)), ((this.y + o)), this.domain);\n        },\n        mul: function(l, m) {\n            if (((typeof m == \"undefined\"))) {\n                m = l;\n            }\n        ;\n        ;\n            return new k(((this.x * l)), ((this.y * m)), this.domain);\n        },\n        div: function(l, m) {\n            if (((typeof m == \"undefined\"))) {\n                m = l;\n            }\n        ;\n        ;\n            return new k(((((this.x * 1)) / l)), ((((this.y * 1)) / m)), this.domain);\n        },\n        sub: function(l, m) {\n            if (((arguments.length == 1))) {\n                return this.add(l.mul(-1));\n            }\n             else return this.add(-l, -m)\n        ;\n        },\n        distanceTo: function(l) {\n            return this.sub(l).magnitude();\n        },\n        magnitude: function() {\n            return Math.sqrt(((((this.x * this.x)) + ((this.y * this.y)))));\n        },\n        rotate: function(l) {\n            return new k(((((this.x * Math.cos(l))) - ((this.y * Math.sin(l))))), ((((this.x * Math.sin(l))) + ((this.y * Math.cos(l))))));\n        },\n        convertTo: function(l) {\n            if (((((((l != \"pure\")) && ((l != \"viewport\")))) && ((l != \"JSBNG__document\"))))) {\n                return new k(0, 0);\n            }\n        ;\n        ;\n            if (((l == this.domain))) {\n                return new k(this.x, this.y, this.domain);\n            }\n        ;\n        ;\n            if (((l == \"pure\"))) {\n                return new k(this.x, this.y);\n            }\n        ;\n        ;\n            if (((this.domain == \"pure\"))) {\n                return new k(0, 0);\n            }\n        ;\n        ;\n            var m = k.getScrollPosition(\"JSBNG__document\"), n = this.x, o = this.y;\n            if (((this.domain == \"JSBNG__document\"))) {\n                n -= m.x;\n                o -= m.y;\n            }\n             else {\n                n += m.x;\n                o += m.y;\n            }\n        ;\n        ;\n            return new k(n, o, l);\n        },\n        setElementPosition: function(l) {\n            var m = this.convertTo(\"JSBNG__document\");\n            l.style.left = ((parseInt(m.x) + \"px\"));\n            l.style.JSBNG__top = ((parseInt(m.y) + \"px\"));\n            return this;\n        },\n        setElementDimensions: function(l) {\n            return this.setElementWidth(l).setElementHeight(l);\n        },\n        setElementWidth: function(l) {\n            l.style.width = ((parseInt(this.x, 10) + \"px\"));\n            return this;\n        },\n        setElementHeight: function(l) {\n            l.style.height = ((parseInt(this.y, 10) + \"px\"));\n            return this;\n        },\n        scrollElementBy: function(l) {\n            if (((l == JSBNG__document.body))) {\n                window.JSBNG__scrollBy(this.x, this.y);\n            }\n             else {\n                l.scrollLeft += this.x;\n                l.scrollTop += this.y;\n            }\n        ;\n        ;\n            return this;\n        }\n    });\n    j(k, {\n        getEventPosition: function(l, m) {\n            m = ((m || \"JSBNG__document\"));\n            var n = g.getPosition(l), o = new k(n.x, n.y, \"JSBNG__document\");\n            return o.convertTo(m);\n        },\n        getScrollPosition: function(l) {\n            l = ((l || \"JSBNG__document\"));\n            var m = i.getScrollPosition();\n            return new k(m.x, m.y, \"JSBNG__document\").convertTo(l);\n        },\n        getElementPosition: function(l, m) {\n            m = ((m || \"JSBNG__document\"));\n            var n = i.getElementPosition(l);\n            return new k(n.x, n.y, \"viewport\").convertTo(m);\n        },\n        getElementDimensions: function(l) {\n            var m = h.getElementDimensions(l);\n            return new k(m.width, m.height);\n        },\n        getViewportDimensions: function() {\n            var l = h.getViewportDimensions();\n            return new k(l.width, l.height, \"viewport\");\n        },\n        getDocumentDimensions: function(l) {\n            var m = h.getDocumentDimensions(l);\n            return new k(m.width, m.height, \"JSBNG__document\");\n        },\n        deserialize: function(l) {\n            var m = l.split(\",\");\n            return new k(m[0], m[1]);\n        }\n    });\n    e.exports = k;\n});\n__d(\"enforceMaxLength\", [\"JSBNG__Event\",\"function-extensions\",\"DOM\",\"Input\",\"InputSelection\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"DOM\"), i = b(\"Input\"), j = b(\"InputSelection\"), k = function(n, o) {\n        var p = i.getValue(n), q = p.length, r = ((q - o));\n        if (((r > 0))) {\n            var s, t;\n            try {\n                s = j.get(n);\n                t = s.end;\n            } catch (u) {\n                s = null;\n                t = 0;\n            };\n        ;\n            if (((t >= r))) {\n                q = t;\n            }\n        ;\n        ;\n            var v = ((q - r));\n            if (((v && ((((p.charCodeAt(((v - 1))) & 64512)) === 55296))))) {\n                v--;\n            }\n        ;\n        ;\n            t = Math.min(t, v);\n            i.setValue(n, ((p.slice(0, v) + p.slice(q))));\n            if (s) {\n                j.set(n, Math.min(s.start, t), t);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    }, l = function(JSBNG__event) {\n        var n = JSBNG__event.getTarget(), o = ((n.getAttribute && parseInt(n.getAttribute(\"maxlength\"), 10)));\n        if (((((o > 0)) && h.isNodeOfType(n, [\"input\",\"textarea\",])))) {\n            k.bind(null, n, o).defer();\n        }\n    ;\n    ;\n    }, m = ((((\"maxLength\" in h.create(\"input\"))) && ((\"maxLength\" in h.create(\"textarea\")))));\n    if (!m) {\n        g.listen(JSBNG__document.documentElement, {\n            keydown: l,\n            paste: l\n        });\n    }\n;\n;\n    e.exports = k;\n});\n__d(\"JSBNG__requestAnimationFrame\", [\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"emptyFunction\"), h = 0, i = ((((((((((a.JSBNG__requestAnimationFrame || a.JSBNG__webkitRequestAnimationFrame)) || a.JSBNG__mozRequestAnimationFrame)) || a.oRequestAnimationFrame)) || a.JSBNG__msRequestAnimationFrame)) || function(j) {\n        var k = JSBNG__Date.now(), l = Math.max(0, ((16 - ((k - h)))));\n        h = ((k + l));\n        return a.JSBNG__setTimeout(j, l);\n    }));\n    i(g);\n    e.exports = i;\n});\n__d(\"queryThenMutateDOM\", [\"function-extensions\",\"Run\",\"createArrayFrom\",\"emptyFunction\",\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Run\"), h = b(\"createArrayFrom\"), i = b(\"emptyFunction\"), j = b(\"JSBNG__requestAnimationFrame\"), k, l, m = {\n    }, n = [], o = [];\n    function p(s, t, u) {\n        if (((!s && !t))) {\n            return;\n        }\n    ;\n    ;\n        if (((u && m.hasOwnProperty(u)))) {\n            return;\n        }\n         else if (u) {\n            m[u] = 1;\n        }\n        \n    ;\n    ;\n        n.push(((t || i)));\n        o.push(((s || i)));\n        r();\n        if (!k) {\n            k = true;\n            g.onLeave(function() {\n                k = false;\n                l = false;\n                m = {\n                };\n                n.length = 0;\n                o.length = 0;\n            });\n        }\n    ;\n    ;\n    };\n;\n    p.prepare = function(s, t, u) {\n        return function() {\n            var v = h(arguments);\n            v.unshift(this);\n            var w = Function.prototype.bind.apply(s, v), x = t.bind(this);\n            p(w, x, u);\n        };\n    };\n    function q() {\n        m = {\n        };\n        var s = o.length, t = n.length, u = [], v;\n        while (s--) {\n            v = o.shift();\n            u.push(v());\n        };\n    ;\n        while (t--) {\n            v = n.shift();\n            v(u.shift());\n        };\n    ;\n        l = false;\n        r();\n    };\n;\n    function r() {\n        if (((!l && ((o.length || n.length))))) {\n            l = true;\n            j(q);\n        }\n    ;\n    ;\n    };\n;\n    e.exports = p;\n});\n__d(\"UIForm\", [\"JSBNG__Event\",\"ArbiterMixin\",\"BehaviorsMixin\",\"DOM\",\"Form\",\"Run\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"BehaviorsMixin\"), j = b(\"DOM\"), k = b(\"Form\"), l = b(\"Run\"), m = b(\"areObjectsEqual\"), n = b(\"copyProperties\");\n    function o(p, q, r, s, t) {\n        this._root = p;\n        this.controller = p;\n        this._message = q;\n        if (s) {\n            this._confirm_dialog = s;\n            s.subscribe(\"JSBNG__confirm\", this._handleDialogConfirm.bind(this));\n            j.prependContent(this._root, j.create(\"input\", {\n                type: \"hidden\",\n                JSBNG__name: \"confirmed\",\n                value: \"true\"\n            }));\n        }\n    ;\n    ;\n        l.onAfterLoad(function() {\n            this._originalState = k.serialize(this._root);\n        }.bind(this));\n        this._forceDirty = r;\n        this._confirmed = false;\n        this._submitted = false;\n        g.listen(this._root, \"submit\", this._handleSubmit.bind(this));\n        if (((t && t.length))) {\n            this.enableBehaviors(t);\n        }\n    ;\n    ;\n        var u = true;\n        l.onBeforeUnload(this.checkUnsaved.bind(this), u);\n    };\n;\n    n(o.prototype, h, i, {\n        getRoot: function() {\n            return this._root;\n        },\n        _handleSubmit: function() {\n            if (((this._confirm_dialog && !this._confirmed))) {\n                this._confirm_dialog.show();\n                return false;\n            }\n        ;\n        ;\n            if (((this.inform(\"submit\") === false))) {\n                return false;\n            }\n        ;\n        ;\n            this._submitted = true;\n            return true;\n        },\n        _handleDialogConfirm: function() {\n            this._confirmed = true;\n            this._confirm_dialog.hide();\n            if (this._root.getAttribute(\"ajaxify\")) {\n                g.fire(this._root, \"submit\");\n            }\n             else if (this._handleSubmit()) {\n                this._root.submit();\n            }\n            \n        ;\n        ;\n        },\n        reset: function() {\n            this.inform(\"reset\");\n            this._submitted = false;\n            this._confirmed = false;\n        },\n        isDirty: function() {\n            if (((this._submitted || !j.contains(JSBNG__document.body, this._root)))) {\n                return false;\n            }\n        ;\n        ;\n            if (this._forceDirty) {\n                return true;\n            }\n        ;\n        ;\n            var p = k.serialize(this._root);\n            return !m(p, this._originalState);\n        },\n        checkUnsaved: function() {\n            if (this.isDirty()) {\n                return this._message;\n            }\n        ;\n        ;\n            return null;\n        }\n    });\n    e.exports = ((a.UIForm || o));\n});");
// 5956
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o30,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y5/r/eV_B8SPw3se.js",o80);
// undefined
o30 = null;
// undefined
o80 = null;
// 6044
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_2e\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_3p\",\"m_0_3q\",\"m_0_3r\",],[{\n            __m: \"m_0_3p\"\n        },{\n            __m: \"m_0_3q\"\n        },{\n            __m: \"m_0_3r\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_3s\",],[\"m_0_3u\",],[\"m_0_3r\",],[\"Typeahead\",\"init\",[\"m_0_3v\",\"m_0_3r\",],[{\n            __m: \"m_0_3v\"\n        },{\n            __m: \"m_0_3r\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_3r\",\"m_0_3x\",],[{\n            __m: \"m_0_3r\"\n        },{\n            __m: \"m_0_3x\"\n        },],],[\"m_0_40\",],[\"m_0_41\",],[\"Layer\",\"init\",[\"m_0_41\",\"m_0_42\",],[{\n            __m: \"m_0_41\"\n        },{\n            __m: \"m_0_42\"\n        },],],[\"m_0_3q\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_48\",[\"XHPTemplate\",\"m_0_4c\",],[{\n            __m: \"m_0_4c\"\n        },],2,],[\"m_0_4a\",[\"XHPTemplate\",\"m_0_4f\",],[{\n            __m: \"m_0_4f\"\n        },],2,],[\"m_0_3y\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_4b\",[\"XHPTemplate\",\"m_0_4h\",],[{\n            __m: \"m_0_4h\"\n        },],2,],[\"m_0_49\",[\"XHPTemplate\",\"m_0_4d\",],[{\n            __m: \"m_0_4d\"\n        },],2,],[\"m_0_3u\",[\"ScrollableArea\",\"m_0_3t\",],[{\n            __m: \"m_0_3t\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_3r\",[\"Typeahead\",\"m_0_3y\",\"ChatTypeaheadView\",\"m_0_3v\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadCore\",\"m_0_3w\",],[{\n            __m: \"m_0_3y\"\n        },{\n            node_id: \"u_0_21\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_3v\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                showBadges: 1,\n                autoSelect: true\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                resetOnSelect: true,\n                setValueOnSelect: false,\n                keepFocused: false\n            }\n        },{\n            __m: \"m_0_3w\"\n        },],7,],[\"m_0_3s\",[\"LiveBarDark\",\"m_0_3q\",],[{\n            __m: \"m_0_3q\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_40\",[\"ChatSidebarDropdown\",\"m_0_3z\",],[{\n            __m: \"m_0_3z\"\n        },null,],1,],[\"m_0_41\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_3q\",[\"ChatOrderedList\",\"m_0_43\",\"m_0_44\",\"m_0_45\",\"m_0_41\",],[true,{\n            __m: \"m_0_43\"\n        },{\n            __m: \"m_0_44\"\n        },{\n            __m: \"m_0_45\"\n        },{\n            __m: \"m_0_41\"\n        },null,],5,],[\"m_0_45\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],[\"m_0_44\",[\"XHPTemplate\",\"m_0_46\",],[{\n            __m: \"m_0_46\"\n        },],2,],],\n        define: [[\"ChatOptionsInitialData\",[],{\n            sound: 1,\n            browser_notif: 0,\n            sidebar_mode: true\n        },13,],[\"ChatSidebarCalloutData\",[],{\n            isShown: false\n        },14,],[\"ChannelImplementation\",[\"ChannelConnection\",],{\n            instance: {\n                __m: \"ChannelConnection\"\n            }\n        },150,],[\"ChannelInitialData\",[],{\n            channelConfig: {\n                IFRAME_LOAD_TIMEOUT: 30000,\n                P_TIMEOUT: 30000,\n                STREAMING_TIMEOUT: 70000,\n                PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n                PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n                user_channel: \"p_100006118350059\",\n                seq: -1,\n                retry_interval: 0,\n                max_conn: 6,\n                forceIframe: false,\n                streamProbe: false,\n                tryStreaming: true,\n                bustIframe: false,\n                webrtcSupport: false\n            },\n            reason: 6,\n            state: \"reconnect!\"\n        },143,],[\"MercuryConstants\",[\"MercuryAttachmentType\",\"MercuryPayloadSource\",\"MercuryParticipantTypes\",\"MercuryAttachmentContentType\",\"MercuryThreadlistConstants\",\"MessagingConfig\",\"MercuryTimePassed\",\"MercurySourceType\",\"MessagingEvent\",\"MercuryLogMessageType\",\"MercuryThreadMode\",\"MercuryMessageSourceTags\",\"MercuryActionStatus\",\"MercuryActionTypeConstants\",\"MercuryErrorType\",\"MercuryParticipantsConstants\",\"MessagingTag\",\"MercuryGlobalActionType\",\"MercuryGenericConstants\",\"MercuryAPIArgsSource\",],{\n            MercuryAttachmentType: {\n                __m: \"MercuryAttachmentType\"\n            },\n            VideoChatConstants: {\n                START_SESSION: 1,\n                GET_SKYPE_TOKEN: 2,\n                AWAITING_CALL: 3,\n                CANCELLED_CALL: 4,\n                CONNECTED_CALL: 5,\n                HANDLED_CALL: 6,\n                GOT_START_SESSION: 7,\n                INSTALLING: 8,\n                INSTALLED: 9,\n                INSTALL_CANCELED: 10,\n                ASSOC_CONNECTED_CALL: 118224944915447,\n                ASSOC_VIEWED_CALL_PROMO: 250568041676842,\n                MAX_VC_PROMO_VIEWS: 2,\n                MINIMUM_VC_PROMO_VIEW_INTERVAL: 5184000,\n                MINIMUM_VC_LAST_CALLED_INTERVAL: 5184000\n            },\n            MercuryAttachmentAudioClip: \"fb_voice_message\",\n            MercuryAppIDs: {\n                DESKTOP_NOTIFIER: 220764691281998,\n                DESKTOP_SOCIALFOX: 276729612446445\n            },\n            MercuryPayloadSource: {\n                __m: \"MercuryPayloadSource\"\n            },\n            AttachmentMaxSize: 26214400,\n            MercuryParticipantTypes: {\n                __m: \"MercuryParticipantTypes\"\n            },\n            MercuryTypeaheadConstants: {\n                COMPOSER_FRIENDS_MAX: 4,\n                COMPOSER_NON_FRIENDS_MAX: 2,\n                COMPOSER_SHOW_MORE_LIMIT: 4,\n                COMPOSER_THREADS_INITIAL_LIMIT: 2,\n                USER_TYPE: \"user\",\n                PAGE_TYPE: \"page\",\n                THREAD_TYPE: \"thread\",\n                HEADER_TYPE: \"header\",\n                FRIEND_TYPE: \"friend\",\n                NON_FRIEND_TYPE: \"non_friend\",\n                VALID_EMAIL: \"^([A-Z0-9._%+-]+@((?!facebook\\\\.com))[A-Z0-9.-]+\\\\.[A-Z]{2,4}|(([A-Z._%+-]+[A-Z0-9._%+-]*)|([A-Z0-9._%+-]+[A-Z._%+-]+[A-Z0-9._%+-]*))@(?:facebook\\\\.com))$\"\n            },\n            MercuryAttachmentContentType: {\n                __m: \"MercuryAttachmentContentType\"\n            },\n            MercurySendMessageTimeout: 45000,\n            ChatNotificationConstants: {\n                NORMAL: 0,\n                NO_USER_MESSAGE_NOTIFICATION: 1\n            },\n            MercuryThreadlistConstants: {\n                __m: \"MercuryThreadlistConstants\"\n            },\n            MessagingConfig: {\n                __m: \"MessagingConfig\"\n            },\n            MercuryTimePassed: {\n                __m: \"MercuryTimePassed\"\n            },\n            MercurySourceType: {\n                __m: \"MercurySourceType\"\n            },\n            MessagingEventTypes: {\n                __m: \"MessagingEvent\"\n            },\n            MessagingFilteringType: {\n                LEGACY: \"legacy\",\n                MODERATE: \"moderate\",\n                STRICT: \"strict\"\n            },\n            MercurySupportedShareType: {\n                FB_PHOTO: 2,\n                FB_ALBUM: 3,\n                FB_VIDEO: 11,\n                FB_SONG: 28,\n                FB_MUSIC_ALBUM: 30,\n                FB_PLAYLIST: 31,\n                FB_MUSICIAN: 35,\n                FB_RADIO_STATION: 33,\n                EXTERNAL: 100,\n                FB_TEMPLATE: 300,\n                FB_SOCIAL_REPORT_PHOTO: 48,\n                FB_COUPON: 32,\n                FB_SHARE: 99,\n                FB_HC_QUESTION: 55,\n                FB_HC_ANSWER: 56\n            },\n            Sandbox: {\n                ORIGIN: \"http://jsbngssl.fbstatic-a.akamaihd.net\",\n                PAGE_URL: \"http://jsbngssl.fbstatic-a.akamaihd.net/fbsbx/fbsbx.php?1\"\n            },\n            MercuryLogMessageType: {\n                __m: \"MercuryLogMessageType\"\n            },\n            MercuryThreadMode: {\n                __m: \"MercuryThreadMode\"\n            },\n            MercuryMessageSourceTags: {\n                __m: \"MercuryMessageSourceTags\"\n            },\n            MercuryActionStatus: {\n                __m: \"MercuryActionStatus\"\n            },\n            MercuryActionType: {\n                __m: \"MercuryActionTypeConstants\"\n            },\n            UIPushPhase: \"V3\",\n            MercuryErrorType: {\n                __m: \"MercuryErrorType\"\n            },\n            MercuryParticipantsConstants: {\n                __m: \"MercuryParticipantsConstants\"\n            },\n            MessagingTag: {\n                __m: \"MessagingTag\"\n            },\n            MercuryGlobalActionType: {\n                __m: \"MercuryGlobalActionType\"\n            },\n            MercuryGenericConstants: {\n                __m: \"MercuryGenericConstants\"\n            },\n            MercuryAPIArgsSource: {\n                __m: \"MercuryAPIArgsSource\"\n            }\n        },36,],[\"PresenceInitialData\",[],{\n            serverTime: \"1374851147000\",\n            cookiePollInterval: 500,\n            cookieVersion: 2,\n            dictEncode: true\n        },57,],[\"BlackbirdUpsellTemplates\",[\"m_0_48\",\"m_0_49\",\"m_0_4a\",\"m_0_4b\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_48\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_49\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_4a\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_4b\"\n            }\n        },10,],[\"InitialChatFriendsList\",[],{\n            list: []\n        },26,],[\"BlackbirdUpsellConfig\",[],{\n            EducationTimeOfflineThresdhold: 5184000,\n            UpsellImpressions: 0,\n            UpsellGK: false,\n            UpsellImpressionLimit: 3,\n            TimeOffline: 0,\n            UpsellMinFriendCount: 50,\n            FriendCount: 0,\n            EducationDismissed: 0,\n            EducationGK: 1,\n            UpsellDismissed: 0,\n            EducationImpressionLimit: 2,\n            EducationImpressions: 0\n        },8,],[\"InitialMultichatList\",[],{\n        },132,],[\"ChatConfigInitialData\",[],{\n            warning_countdown_threshold_msec: 15000,\n            \"24h_times\": false,\n            livebar_fetch_defer: 1000,\n            \"video.collision_connect\": 1,\n            \"ordered_list.top_mobile\": 5,\n            mute_warning_time_msec: 25000,\n            \"blackbird.min_for_clear_button\": 10,\n            chat_multi_typ_send: 1,\n            web_messenger_suppress_tab_unread: 1,\n            \"ordered_list.top_friends\": 0,\n            chat_impression_logging_with_click: true,\n            channel_manual_reconnect_defer_msec: 2000,\n            \"sidebar.minimum_width\": 1225,\n            \"sound.notif_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yq/r/Mpd0-fRgh5n.mp3\",\n            \"roger.seen_delay\": 15000,\n            tab_max_load_age: 86400000,\n            typing_notifications: true,\n            show_sticker_nux: true,\n            chat_web_ranking_with_presence: 1,\n            chat_ranked_by_coefficient: 1,\n            \"video.skype_client_log\": 1,\n            \"periodical_impression_logging_config.interval\": 1800000,\n            chat_tab_title_link_timeline: 1,\n            max_sidebar_multichats: 3,\n            tab_auto_close_timeout: 86400000,\n            chat_impression_logging_periodical: true,\n            divebar_has_new_groups_button: true,\n            sound_enabled: true,\n            \"sound.ringtone_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/y3/r/mbcn6dBHIeX.ogg\",\n            sidebar_ticker: 1\n        },12,],[\"AvailableListInitialData\",[],{\n            chatNotif: 0,\n            pollInterval: 100000,\n            birthdayFriends: null,\n            availableList: {\n            },\n            lazyPollInterval: 300000,\n            favoriteList: [],\n            mobileFriends: null,\n            lazyThreshold: 300000,\n            availableCount: 0,\n            lastActiveTimes: null,\n            updateTime: 1374851147000\n        },166,],],\n        elements: [[\"m_0_3z\",\"u_0_27\",2,],[\"m_0_3v\",\"u_0_26\",4,],[\"m_0_3x\",\"u_0_25\",2,],[\"m_0_43\",\"u_0_29\",2,],[\"m_0_3t\",\"u_0_23\",2,],[\"m_0_4g\",\"u_0_2c\",2,\"m_0_4f\",],[\"m_0_3p\",\"u_0_22\",2,],[\"m_0_4e\",\"u_0_2b\",2,\"m_0_4d\",],[\"m_0_3w\",\"u_0_24\",2,],[\"m_0_4i\",\"u_0_2d\",2,\"m_0_4h\",],],\n        markup: [[\"m_0_4f\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2c\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E While you have chat turned off for some friends, their messages go to your inbox. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_4h\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2d\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E When chat is off, messages from friends go to your inbox for you to read later. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_42\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_28\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4c\",{\n            __html: \"\\u003Cdiv class=\\\"pam -cx-PRIVATE-blackbirdUpsell__dialogframe\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat img sp_3yt8ar sx_de779b\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_2a\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_2a\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"prs\\\" data-jsid=\\\"dialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_47\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_4d\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=offline&amp;promo_source=educate\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2b\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E You can turn on chat for just a few friends. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003Cdiv class=\\\"-cx-PRIVATE-blackbirdUpsell__buttoncontainer\\\"\\u003E\\u003Ca class=\\\"mvm -cx-PRIVATE-blackbirdUpsell__chatsettingsbutton uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" ajaxify=\\\"/ajax/chat/privacy/settings_dialog.php\\\" rel=\\\"dialog\\\" data-jsid=\\\"chatSettingsButton\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EEdit Chat Settings\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_46\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],]\n    },\n    css: [\"za92D\",\"HgCpx\",\"UmFO+\",\"veUjj\",\"tAd6o\",\"c6lUE\",],\n    bootloadable: {\n        SortableGroup: {\n            resources: [\"OH3xD\",\"6tAwh\",\"f7Tpb\",\"/MWWQ\",],\n            \"module\": true\n        },\n        LitestandSidebarBookmarksDisplay: {\n            resources: [\"OH3xD\",\"veUjj\",\"za92D\",\"3Mxco\",],\n            \"module\": true\n        },\n        LitestandSidebar: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"kVM+7\",\"js0se\",\"AVmr9\",\"za92D\",\"UmFO+\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/Oe0OO6kzRjj.js\"\n        },\n        \"1YKDj\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yQ/r/mxp6_mu5GrT.js\"\n        },\n        \"3Mxco\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/lRDMT2kJPzt.js\"\n        },\n        \"kVM+7\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/mgoWhiluXyn.js\"\n        }\n    },\n    ixData: {\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_faf97d\"\n        },\n        \"/images/gifts/icons/cake_icon.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_06a61f\"\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_6e4a51\"\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_047178\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_5ed30e\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_dd19b5\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_ff5be1\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_bf972e\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_b0241d\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_8d09d2\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_26b2d5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_479fb2\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_0de2a7\"\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_9a8650\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"XH2Cu\",\"OSd/n\",\"TXKLp\",\"zBhY6\",\"WD1Wm\",\"/MWWQ\",\"bmJBG\",\"1YKDj\",\"js0se\",],\n    onload: [\"FbdInstall.updateSidebarLinkVisibility()\",],\n    id: \"pagelet_sidebar\",\n    phase: 3\n});");
// 6045
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s8f96b3320152a4e1d6ca28c80e5264cf27418715");
// 6046
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_sidebar: {\n            container_id: \"u_0_2e\"\n        }\n    },\n    jsmods: {\n        require: [[\"ChatSidebar\",\"init\",[\"m_0_3p\",\"m_0_3q\",\"m_0_3r\",],[{\n            __m: \"m_0_3p\"\n        },{\n            __m: \"m_0_3q\"\n        },{\n            __m: \"m_0_3r\"\n        },[],],],[\"ChatSidebarLog\",\"start\",[],[],],[\"m_0_3s\",],[\"m_0_3u\",],[\"m_0_3r\",],[\"Typeahead\",\"init\",[\"m_0_3v\",\"m_0_3r\",],[{\n            __m: \"m_0_3v\"\n        },{\n            __m: \"m_0_3r\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_3r\",\"m_0_3x\",],[{\n            __m: \"m_0_3r\"\n        },{\n            __m: \"m_0_3x\"\n        },],],[\"m_0_40\",],[\"m_0_41\",],[\"Layer\",\"init\",[\"m_0_41\",\"m_0_42\",],[{\n            __m: \"m_0_41\"\n        },{\n            __m: \"m_0_42\"\n        },],],[\"m_0_3q\",],[\"PresencePrivacy\",],],\n        instances: [[\"m_0_48\",[\"XHPTemplate\",\"m_0_4c\",],[{\n            __m: \"m_0_4c\"\n        },],2,],[\"m_0_4a\",[\"XHPTemplate\",\"m_0_4f\",],[{\n            __m: \"m_0_4f\"\n        },],2,],[\"m_0_3y\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_4b\",[\"XHPTemplate\",\"m_0_4h\",],[{\n            __m: \"m_0_4h\"\n        },],2,],[\"m_0_49\",[\"XHPTemplate\",\"m_0_4d\",],[{\n            __m: \"m_0_4d\"\n        },],2,],[\"m_0_3u\",[\"ScrollableArea\",\"m_0_3t\",],[{\n            __m: \"m_0_3t\"\n        },{\n            persistent: true\n        },],1,],[\"m_0_3r\",[\"Typeahead\",\"m_0_3y\",\"ChatTypeaheadView\",\"m_0_3v\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadCore\",\"m_0_3w\",],[{\n            __m: \"m_0_3y\"\n        },{\n            node_id: \"u_0_21\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_3v\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                showBadges: 1,\n                autoSelect: true\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                resetOnSelect: true,\n                setValueOnSelect: false,\n                keepFocused: false\n            }\n        },{\n            __m: \"m_0_3w\"\n        },],7,],[\"m_0_3s\",[\"LiveBarDark\",\"m_0_3q\",],[{\n            __m: \"m_0_3q\"\n        },[],[\"music\",\"canvas\",\"checkin\",\"travelling\",],],1,],[\"m_0_40\",[\"ChatSidebarDropdown\",\"m_0_3z\",],[{\n            __m: \"m_0_3z\"\n        },null,],1,],[\"m_0_41\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_3q\",[\"ChatOrderedList\",\"m_0_43\",\"m_0_44\",\"m_0_45\",\"m_0_41\",],[true,{\n            __m: \"m_0_43\"\n        },{\n            __m: \"m_0_44\"\n        },{\n            __m: \"m_0_45\"\n        },{\n            __m: \"m_0_41\"\n        },null,],5,],[\"m_0_45\",[\"XHPTemplate\",\"m_0_47\",],[{\n            __m: \"m_0_47\"\n        },],2,],[\"m_0_44\",[\"XHPTemplate\",\"m_0_46\",],[{\n            __m: \"m_0_46\"\n        },],2,],],\n        define: [[\"ChatOptionsInitialData\",[],{\n            sound: 1,\n            browser_notif: 0,\n            sidebar_mode: true\n        },13,],[\"ChatSidebarCalloutData\",[],{\n            isShown: false\n        },14,],[\"ChannelImplementation\",[\"ChannelConnection\",],{\n            instance: {\n                __m: \"ChannelConnection\"\n            }\n        },150,],[\"ChannelInitialData\",[],{\n            channelConfig: {\n                IFRAME_LOAD_TIMEOUT: 30000,\n                P_TIMEOUT: 30000,\n                STREAMING_TIMEOUT: 70000,\n                PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n                PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n                user_channel: \"p_100006118350059\",\n                seq: -1,\n                retry_interval: 0,\n                max_conn: 6,\n                forceIframe: false,\n                streamProbe: false,\n                tryStreaming: true,\n                bustIframe: false,\n                webrtcSupport: false\n            },\n            reason: 6,\n            state: \"reconnect!\"\n        },143,],[\"MercuryConstants\",[\"MercuryAttachmentType\",\"MercuryPayloadSource\",\"MercuryParticipantTypes\",\"MercuryAttachmentContentType\",\"MercuryThreadlistConstants\",\"MessagingConfig\",\"MercuryTimePassed\",\"MercurySourceType\",\"MessagingEvent\",\"MercuryLogMessageType\",\"MercuryThreadMode\",\"MercuryMessageSourceTags\",\"MercuryActionStatus\",\"MercuryActionTypeConstants\",\"MercuryErrorType\",\"MercuryParticipantsConstants\",\"MessagingTag\",\"MercuryGlobalActionType\",\"MercuryGenericConstants\",\"MercuryAPIArgsSource\",],{\n            MercuryAttachmentType: {\n                __m: \"MercuryAttachmentType\"\n            },\n            VideoChatConstants: {\n                START_SESSION: 1,\n                GET_SKYPE_TOKEN: 2,\n                AWAITING_CALL: 3,\n                CANCELLED_CALL: 4,\n                CONNECTED_CALL: 5,\n                HANDLED_CALL: 6,\n                GOT_START_SESSION: 7,\n                INSTALLING: 8,\n                INSTALLED: 9,\n                INSTALL_CANCELED: 10,\n                ASSOC_CONNECTED_CALL: 118224944915447,\n                ASSOC_VIEWED_CALL_PROMO: 250568041676842,\n                MAX_VC_PROMO_VIEWS: 2,\n                MINIMUM_VC_PROMO_VIEW_INTERVAL: 5184000,\n                MINIMUM_VC_LAST_CALLED_INTERVAL: 5184000\n            },\n            MercuryAttachmentAudioClip: \"fb_voice_message\",\n            MercuryAppIDs: {\n                DESKTOP_NOTIFIER: 220764691281998,\n                DESKTOP_SOCIALFOX: 276729612446445\n            },\n            MercuryPayloadSource: {\n                __m: \"MercuryPayloadSource\"\n            },\n            AttachmentMaxSize: 26214400,\n            MercuryParticipantTypes: {\n                __m: \"MercuryParticipantTypes\"\n            },\n            MercuryTypeaheadConstants: {\n                COMPOSER_FRIENDS_MAX: 4,\n                COMPOSER_NON_FRIENDS_MAX: 2,\n                COMPOSER_SHOW_MORE_LIMIT: 4,\n                COMPOSER_THREADS_INITIAL_LIMIT: 2,\n                USER_TYPE: \"user\",\n                PAGE_TYPE: \"page\",\n                THREAD_TYPE: \"thread\",\n                HEADER_TYPE: \"header\",\n                FRIEND_TYPE: \"friend\",\n                NON_FRIEND_TYPE: \"non_friend\",\n                VALID_EMAIL: \"^([A-Z0-9._%+-]+@((?!facebook\\\\.com))[A-Z0-9.-]+\\\\.[A-Z]{2,4}|(([A-Z._%+-]+[A-Z0-9._%+-]*)|([A-Z0-9._%+-]+[A-Z._%+-]+[A-Z0-9._%+-]*))@(?:facebook\\\\.com))$\"\n            },\n            MercuryAttachmentContentType: {\n                __m: \"MercuryAttachmentContentType\"\n            },\n            MercurySendMessageTimeout: 45000,\n            ChatNotificationConstants: {\n                NORMAL: 0,\n                NO_USER_MESSAGE_NOTIFICATION: 1\n            },\n            MercuryThreadlistConstants: {\n                __m: \"MercuryThreadlistConstants\"\n            },\n            MessagingConfig: {\n                __m: \"MessagingConfig\"\n            },\n            MercuryTimePassed: {\n                __m: \"MercuryTimePassed\"\n            },\n            MercurySourceType: {\n                __m: \"MercurySourceType\"\n            },\n            MessagingEventTypes: {\n                __m: \"MessagingEvent\"\n            },\n            MessagingFilteringType: {\n                LEGACY: \"legacy\",\n                MODERATE: \"moderate\",\n                STRICT: \"strict\"\n            },\n            MercurySupportedShareType: {\n                FB_PHOTO: 2,\n                FB_ALBUM: 3,\n                FB_VIDEO: 11,\n                FB_SONG: 28,\n                FB_MUSIC_ALBUM: 30,\n                FB_PLAYLIST: 31,\n                FB_MUSICIAN: 35,\n                FB_RADIO_STATION: 33,\n                EXTERNAL: 100,\n                FB_TEMPLATE: 300,\n                FB_SOCIAL_REPORT_PHOTO: 48,\n                FB_COUPON: 32,\n                FB_SHARE: 99,\n                FB_HC_QUESTION: 55,\n                FB_HC_ANSWER: 56\n            },\n            Sandbox: {\n                ORIGIN: \"http://jsbngssl.fbstatic-a.akamaihd.net\",\n                PAGE_URL: \"http://jsbngssl.fbstatic-a.akamaihd.net/fbsbx/fbsbx.php?1\"\n            },\n            MercuryLogMessageType: {\n                __m: \"MercuryLogMessageType\"\n            },\n            MercuryThreadMode: {\n                __m: \"MercuryThreadMode\"\n            },\n            MercuryMessageSourceTags: {\n                __m: \"MercuryMessageSourceTags\"\n            },\n            MercuryActionStatus: {\n                __m: \"MercuryActionStatus\"\n            },\n            MercuryActionType: {\n                __m: \"MercuryActionTypeConstants\"\n            },\n            UIPushPhase: \"V3\",\n            MercuryErrorType: {\n                __m: \"MercuryErrorType\"\n            },\n            MercuryParticipantsConstants: {\n                __m: \"MercuryParticipantsConstants\"\n            },\n            MessagingTag: {\n                __m: \"MessagingTag\"\n            },\n            MercuryGlobalActionType: {\n                __m: \"MercuryGlobalActionType\"\n            },\n            MercuryGenericConstants: {\n                __m: \"MercuryGenericConstants\"\n            },\n            MercuryAPIArgsSource: {\n                __m: \"MercuryAPIArgsSource\"\n            }\n        },36,],[\"PresenceInitialData\",[],{\n            serverTime: \"1374851147000\",\n            cookiePollInterval: 500,\n            cookieVersion: 2,\n            dictEncode: true\n        },57,],[\"BlackbirdUpsellTemplates\",[\"m_0_48\",\"m_0_49\",\"m_0_4a\",\"m_0_4b\",],{\n            \":fb:chat:blackbird:dialog-frame\": {\n                __m: \"m_0_48\"\n            },\n            \":fb:chat:blackbird:offline-educate\": {\n                __m: \"m_0_49\"\n            },\n            \":fb:chat:blackbird:most-friends-educate\": {\n                __m: \"m_0_4a\"\n            },\n            \":fb:chat:blackbird:some-friends-educate\": {\n                __m: \"m_0_4b\"\n            }\n        },10,],[\"InitialChatFriendsList\",[],{\n            list: []\n        },26,],[\"BlackbirdUpsellConfig\",[],{\n            EducationTimeOfflineThresdhold: 5184000,\n            UpsellImpressions: 0,\n            UpsellGK: false,\n            UpsellImpressionLimit: 3,\n            TimeOffline: 0,\n            UpsellMinFriendCount: 50,\n            FriendCount: 0,\n            EducationDismissed: 0,\n            EducationGK: 1,\n            UpsellDismissed: 0,\n            EducationImpressionLimit: 2,\n            EducationImpressions: 0\n        },8,],[\"InitialMultichatList\",[],{\n        },132,],[\"ChatConfigInitialData\",[],{\n            warning_countdown_threshold_msec: 15000,\n            \"24h_times\": false,\n            livebar_fetch_defer: 1000,\n            \"video.collision_connect\": 1,\n            \"ordered_list.top_mobile\": 5,\n            mute_warning_time_msec: 25000,\n            \"blackbird.min_for_clear_button\": 10,\n            chat_multi_typ_send: 1,\n            web_messenger_suppress_tab_unread: 1,\n            \"ordered_list.top_friends\": 0,\n            chat_impression_logging_with_click: true,\n            channel_manual_reconnect_defer_msec: 2000,\n            \"sidebar.minimum_width\": 1225,\n            \"sound.notif_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg\",\n            idle_limit: 1800000,\n            \"sidebar.min_friends\": 7,\n            \"sound.notif_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yb/r/VBbzpp2k5li.mp3\",\n            idle_poll_interval: 300000,\n            activity_limit: 60000,\n            \"sound.ringtone_mp3_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yq/r/Mpd0-fRgh5n.mp3\",\n            \"roger.seen_delay\": 15000,\n            tab_max_load_age: 86400000,\n            typing_notifications: true,\n            show_sticker_nux: true,\n            chat_web_ranking_with_presence: 1,\n            chat_ranked_by_coefficient: 1,\n            \"video.skype_client_log\": 1,\n            \"periodical_impression_logging_config.interval\": 1800000,\n            chat_tab_title_link_timeline: 1,\n            max_sidebar_multichats: 3,\n            tab_auto_close_timeout: 86400000,\n            chat_impression_logging_periodical: true,\n            divebar_has_new_groups_button: true,\n            sound_enabled: true,\n            \"sound.ringtone_ogg_url\": \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/y3/r/mbcn6dBHIeX.ogg\",\n            sidebar_ticker: 1\n        },12,],[\"AvailableListInitialData\",[],{\n            chatNotif: 0,\n            pollInterval: 100000,\n            birthdayFriends: null,\n            availableList: {\n            },\n            lazyPollInterval: 300000,\n            favoriteList: [],\n            mobileFriends: null,\n            lazyThreshold: 300000,\n            availableCount: 0,\n            lastActiveTimes: null,\n            updateTime: 1374851147000\n        },166,],],\n        elements: [[\"m_0_3z\",\"u_0_27\",2,],[\"m_0_3v\",\"u_0_26\",4,],[\"m_0_3x\",\"u_0_25\",2,],[\"m_0_43\",\"u_0_29\",2,],[\"m_0_3t\",\"u_0_23\",2,],[\"m_0_4g\",\"u_0_2c\",2,\"m_0_4f\",],[\"m_0_3p\",\"u_0_22\",2,],[\"m_0_4e\",\"u_0_2b\",2,\"m_0_4d\",],[\"m_0_3w\",\"u_0_24\",2,],[\"m_0_4i\",\"u_0_2d\",2,\"m_0_4h\",],],\n        markup: [[\"m_0_4f\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2c\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E While you have chat turned off for some friends, their messages go to your inbox. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_4h\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=blackbird\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2d\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E When chat is off, messages from friends go to your inbox for you to read later. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003C/form\\u003E\"\n        },3,],[\"m_0_42\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_28\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4c\",{\n            __html: \"\\u003Cdiv class=\\\"pam -cx-PRIVATE-blackbirdUpsell__dialogframe\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__smallimage lfloat img sp_3yt8ar sx_de779b\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"clearfix -cx-PRIVATE-uiImageBlock__smallcontent -cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_2a\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"dialogCloseButton\\\" id=\\\"u_0_2a\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"prs\\\" data-jsid=\\\"dialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_47\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_4d\",{\n            __html: \"\\u003Cform method=\\\"post\\\" action=\\\"/ajax/chat/blackbird/learn_more.php?source=offline&amp;promo_source=educate\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_2b\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cstrong\\u003ETip:\\u003C/strong\\u003E You can turn on chat for just a few friends. \\u003Clabel class=\\\"uiLinkButton\\\"\\u003E\\u003Cinput type=\\\"submit\\\" value=\\\"Learn more\\\" /\\u003E\\u003C/label\\u003E.\\u003Cdiv class=\\\"-cx-PRIVATE-blackbirdUpsell__buttoncontainer\\\"\\u003E\\u003Ca class=\\\"mvm -cx-PRIVATE-blackbirdUpsell__chatsettingsbutton uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" ajaxify=\\\"/ajax/chat/privacy/settings_dialog.php\\\" rel=\\\"dialog\\\" data-jsid=\\\"chatSettingsButton\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EEdit Chat Settings\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\"\n        },3,],[\"m_0_46\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],]\n    },\n    css: [\"za92D\",\"HgCpx\",\"UmFO+\",\"veUjj\",\"tAd6o\",\"c6lUE\",],\n    bootloadable: {\n        SortableGroup: {\n            resources: [\"OH3xD\",\"6tAwh\",\"f7Tpb\",\"/MWWQ\",],\n            \"module\": true\n        },\n        LitestandSidebarBookmarksDisplay: {\n            resources: [\"OH3xD\",\"veUjj\",\"za92D\",\"3Mxco\",],\n            \"module\": true\n        },\n        LitestandSidebar: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"kVM+7\",\"js0se\",\"AVmr9\",\"za92D\",\"UmFO+\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"6tAwh\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/Oe0OO6kzRjj.js\"\n        },\n        \"1YKDj\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yQ/r/mxp6_mu5GrT.js\"\n        },\n        \"3Mxco\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yR/r/lRDMT2kJPzt.js\"\n        },\n        \"kVM+7\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/mgoWhiluXyn.js\"\n        }\n    },\n    ixData: {\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_faf97d\"\n        },\n        \"/images/gifts/icons/cake_icon.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_06a61f\"\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_6e4a51\"\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_047178\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_5ed30e\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_dd19b5\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_ff5be1\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_bf972e\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_b0241d\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_8d09d2\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_26b2d5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_479fb2\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_0de2a7\"\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_9a8650\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"XH2Cu\",\"OSd/n\",\"TXKLp\",\"zBhY6\",\"WD1Wm\",\"/MWWQ\",\"bmJBG\",\"1YKDj\",\"js0se\",],\n    JSBNG__onload: [\"FbdInstall.updateSidebarLinkVisibility()\",],\n    id: \"pagelet_sidebar\",\n    phase: 3\n});");
// 6076
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"u_0_19_right\",\n    is_last: true,\n    is_second_to_last_phase: true,\n    content: {\n        pagelet_timeline_recent_segment_0_0_right: {\n            container_id: \"u_0_2r\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"markSectionAsLoaded\",[],[\"u_0_1a\",\"recent\",\"0\",],],[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_19\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",\"VPsP4\",\"6T3FY\",],\n    bootloadable: {\n    },\n    resource_map: {\n        VPsP4: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/s8lpf9hIvl4.css\"\n        },\n        \"6T3FY\": {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/6TQwVHfa0ql.css\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",\"XH2Cu\",\"gyG67\",\"e0RyX\",],\n    id: \"pagelet_timeline_recent_segment_0_0_right\",\n    phase: 3\n});");
// 6077
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s24d05b9cd73e1a2cea749ba47329c4b59ea3806a");
// 6078
geval("bigPipe.onPageletArrive({\n    append: \"u_0_19_right\",\n    is_last: true,\n    is_second_to_last_phase: true,\n    JSBNG__content: {\n        pagelet_timeline_recent_segment_0_0_right: {\n            container_id: \"u_0_2r\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"markSectionAsLoaded\",[],[\"u_0_1a\",\"recent\",\"0\",],],[\"TimelineCapsule\",\"loadTwoColumnUnits\",[],[\"u_0_19\",],],[\"TimelineStickyRightColumn\",\"adjust\",[],[],],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"j1x0z\",\"VPsP4\",\"6T3FY\",],\n    bootloadable: {\n    },\n    resource_map: {\n        VPsP4: {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/s8lpf9hIvl4.css\"\n        },\n        \"6T3FY\": {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/6TQwVHfa0ql.css\"\n        }\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",\"XH2Cu\",\"gyG67\",\"e0RyX\",],\n    id: \"pagelet_timeline_recent_segment_0_0_right\",\n    phase: 3\n});");
// 6122
fpc.call(JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_565[0], o81,undefined);
// undefined
o81 = null;
// 6223
fpc.call(JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_565[0], o70,undefined);
// undefined
o70 = null;
// 6260
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_178[0](false);
// 6273
fpc.call(JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_104[0], o9,undefined);
// undefined
o9 = null;
// 6301
fpc.call(JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_565[0], o4,undefined);
// undefined
o4 = null;
// 6600
fpc.call(JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_565[0], o74,undefined);
// undefined
o74 = null;
// 6640
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_side_ads: {\n            container_id: \"u_0_2t\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineSideAds\",\"init\",[\"m_0_4j\",],[{\n            __m: \"m_0_4j\"\n        },1055580469,{\n            refresh_delay: 5000,\n            refresh_threshold: 30000,\n            mouse_move: 1,\n            max_ads: 5\n        },],],],\n        elements: [[\"m_0_4j\",\"u_0_2s\",2,],]\n    },\n    css: [\"veUjj\",\"UmFO+\",\"j1x0z\",],\n    bootloadable: {\n    },\n    resource_map: {\n        R940f: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/kUk1EmwlmF-.js\"\n        }\n    },\n    js: [\"OH3xD\",\"/MWWQ\",\"f7Tpb\",\"R940f\",\"nxD7O\",\"AVmr9\",],\n    id: \"pagelet_side_ads\",\n    phase: 4\n});");
// 6641
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sf86513d80bdc51d2e8e303a0d02a6e4095d1b1d6");
// 6642
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_side_ads: {\n            container_id: \"u_0_2t\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineSideAds\",\"init\",[\"m_0_4j\",],[{\n            __m: \"m_0_4j\"\n        },1055580469,{\n            refresh_delay: 5000,\n            refresh_threshold: 30000,\n            mouse_move: 1,\n            max_ads: 5\n        },],],],\n        elements: [[\"m_0_4j\",\"u_0_2s\",2,],]\n    },\n    css: [\"veUjj\",\"UmFO+\",\"j1x0z\",],\n    bootloadable: {\n    },\n    resource_map: {\n        R940f: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/kUk1EmwlmF-.js\"\n        }\n    },\n    js: [\"OH3xD\",\"/MWWQ\",\"f7Tpb\",\"R940f\",\"nxD7O\",\"AVmr9\",],\n    id: \"pagelet_side_ads\",\n    phase: 4\n});");
// 6649
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_dock: {\n            container_id: \"u_0_3i\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_4k\",],[{\n            __m: \"m_0_4k\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_4l\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_4l\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_4m\",\"m_0_4n\",],[{\n            __m: \"m_0_4m\"\n        },{\n            __m: \"m_0_4n\"\n        },{\n            payload_source: \"server_initial_data\"\n        },],],[\"ChatOptions\",],[\"ShortProfiles\",\"setMulti\",[],[{\n            100006118350059: {\n                id: \"100006118350059\",\n                name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null,\n                showVideoPromo: false,\n                searchTokens: [\"Cript\",\"Javasee\",]\n            }\n        },],],[\"m_0_4p\",],[\"m_0_4r\",],[\"Typeahead\",\"init\",[\"m_0_4s\",\"m_0_4r\",],[{\n            __m: \"m_0_4s\"\n        },{\n            __m: \"m_0_4r\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_4r\",\"m_0_4u\",],[{\n            __m: \"m_0_4r\"\n        },{\n            __m: \"m_0_4u\"\n        },],],[\"m_0_4x\",],[\"m_0_4y\",],[\"Layer\",\"init\",[\"m_0_4y\",\"m_0_4z\",],[{\n            __m: \"m_0_4y\"\n        },{\n            __m: \"m_0_4z\"\n        },],],[\"m_0_4q\",],[\"m_0_75\",],[\"Typeahead\",\"init\",[\"m_0_73\",\"m_0_75\",],[{\n            __m: \"m_0_73\"\n        },{\n            __m: \"m_0_75\"\n        },[],null,],],],\n        instances: [[\"m_0_4x\",[\"ChatSidebarDropdown\",\"m_0_4w\",],[{\n            __m: \"m_0_4w\"\n        },null,],1,],[\"m_0_5t\",[\"XHPTemplate\",\"m_0_6x\",],[{\n            __m: \"m_0_6x\"\n        },],2,],[\"m_0_5r\",[\"XHPTemplate\",\"m_0_6v\",],[{\n            __m: \"m_0_6v\"\n        },],2,],[\"m_0_5u\",[\"XHPTemplate\",\"m_0_6y\",],[{\n            __m: \"m_0_6y\"\n        },],2,],[\"m_0_52\",[\"XHPTemplate\",\"m_0_54\",],[{\n            __m: \"m_0_54\"\n        },],2,],[\"m_0_5o\",[\"XHPTemplate\",\"m_0_6s\",],[{\n            __m: \"m_0_6s\"\n        },],2,],[\"m_0_56\",[\"XHPTemplate\",\"m_0_6b\",],[{\n            __m: \"m_0_6b\"\n        },],2,],[\"m_0_64\",[\"XHPTemplate\",\"m_0_7e\",],[{\n            __m: \"m_0_7e\"\n        },],2,],[\"m_0_5h\",[\"XHPTemplate\",\"m_0_6l\",],[{\n            __m: \"m_0_6l\"\n        },],2,],[\"m_0_5v\",[\"XHPTemplate\",\"m_0_6z\",],[{\n            __m: \"m_0_6z\"\n        },],2,],[\"m_0_58\",[\"XHPTemplate\",\"m_0_6d\",],[{\n            __m: \"m_0_6d\"\n        },],2,],[\"m_0_5b\",[\"XHPTemplate\",\"m_0_6g\",],[{\n            __m: \"m_0_6g\"\n        },],2,],[\"m_0_5e\",[\"XHPTemplate\",\"m_0_6j\",],[{\n            __m: \"m_0_6j\"\n        },],2,],[\"m_0_69\",[\"XHPTemplate\",\"m_0_7l\",],[{\n            __m: \"m_0_7l\"\n        },],2,],[\"m_0_5p\",[\"XHPTemplate\",\"m_0_6t\",],[{\n            __m: \"m_0_6t\"\n        },],2,],[\"m_0_5l\",[\"XHPTemplate\",\"m_0_6p\",],[{\n            __m: \"m_0_6p\"\n        },],2,],[\"m_0_5n\",[\"XHPTemplate\",\"m_0_6r\",],[{\n            __m: \"m_0_6r\"\n        },],2,],[\"m_0_5i\",[\"XHPTemplate\",\"m_0_6m\",],[{\n            __m: \"m_0_6m\"\n        },],2,],[\"m_0_4v\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_5a\",[\"XHPTemplate\",\"m_0_6f\",],[{\n            __m: \"m_0_6f\"\n        },],2,],[\"m_0_5g\",[\"DataSource\",],[{\n            maxResults: 5,\n            queryData: [],\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"1374777501-7\",\n                filter: [\"user\",],\n                options: [\"friends_only\",],\n                context: \"messages_bootstrap\"\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/first_degree.php\"\n        },],2,],[\"m_0_5j\",[\"XHPTemplate\",\"m_0_6n\",],[{\n            __m: \"m_0_6n\"\n        },],2,],[\"m_0_63\",[\"XHPTemplate\",\"m_0_7d\",],[{\n            __m: \"m_0_7d\"\n        },],2,],[\"m_0_5m\",[\"XHPTemplate\",\"m_0_6q\",],[{\n            __m: \"m_0_6q\"\n        },],2,],[\"m_0_5q\",[\"XHPTemplate\",\"m_0_6u\",],[{\n            __m: \"m_0_6u\"\n        },],2,],[\"m_0_4r\",[\"Typeahead\",\"m_0_4v\",\"ChatTypeaheadView\",\"m_0_4s\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadCore\",\"m_0_4t\",],[{\n            __m: \"m_0_4v\"\n        },{\n            node_id: \"u_0_2x\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_4s\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                showBadges: 1,\n                autoSelect: true\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                resetOnSelect: true,\n                setValueOnSelect: false,\n                keepFocused: false\n            }\n        },{\n            __m: \"m_0_4t\"\n        },],7,],[\"m_0_4q\",[\"ChatOrderedList\",\"m_0_50\",\"m_0_51\",\"m_0_52\",\"m_0_4y\",],[false,{\n            __m: \"m_0_50\"\n        },{\n            __m: \"m_0_51\"\n        },{\n            __m: \"m_0_52\"\n        },{\n            __m: \"m_0_4y\"\n        },null,],3,],[\"m_0_62\",[\"XHPTemplate\",\"m_0_7c\",],[{\n            __m: \"m_0_7c\"\n        },],2,],[\"m_0_59\",[\"XHPTemplate\",\"m_0_6e\",],[{\n            __m: \"m_0_6e\"\n        },],2,],[\"m_0_5d\",[\"XHPTemplate\",\"m_0_6i\",],[{\n            __m: \"m_0_6i\"\n        },],2,],[\"m_0_66\",[\"XHPTemplate\",\"m_0_7i\",],[{\n            __m: \"m_0_7i\"\n        },],2,],[\"m_0_5z\",[\"XHPTemplate\",\"m_0_79\",],[{\n            __m: \"m_0_79\"\n        },],2,],[\"m_0_61\",[\"XHPTemplate\",\"m_0_7b\",],[{\n            __m: \"m_0_7b\"\n        },],2,],[\"m_0_4y\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_51\",[\"XHPTemplate\",\"m_0_53\",],[{\n            __m: \"m_0_53\"\n        },],2,],[\"m_0_75\",[\"Typeahead\",\"m_0_76\",\"ContextualTypeaheadView\",\"m_0_73\",\"TypeaheadCore\",\"m_0_74\",],[{\n            __m: \"m_0_76\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_73\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"TypeaheadCore\"\n            },\n            options: {\n            }\n        },{\n            __m: \"m_0_74\"\n        },],3,],[\"m_0_57\",[\"XHPTemplate\",\"m_0_6c\",],[{\n            __m: \"m_0_6c\"\n        },],2,],[\"m_0_5c\",[\"XHPTemplate\",\"m_0_6h\",],[{\n            __m: \"m_0_6h\"\n        },],2,],[\"m_0_5w\",[\"XHPTemplate\",\"m_0_72\",],[{\n            __m: \"m_0_72\"\n        },],2,],[\"m_0_55\",[\"XHPTemplate\",\"m_0_6a\",],[{\n            __m: \"m_0_6a\"\n        },],2,],[\"m_0_5k\",[\"XHPTemplate\",\"m_0_6o\",],[{\n            __m: \"m_0_6o\"\n        },],2,],[\"m_0_5s\",[\"XHPTemplate\",\"m_0_6w\",],[{\n            __m: \"m_0_6w\"\n        },],2,],[\"m_0_5y\",[\"XHPTemplate\",\"m_0_78\",],[{\n            __m: \"m_0_78\"\n        },],2,],[\"m_0_65\",[\"XHPTemplate\",\"m_0_7h\",],[{\n            __m: \"m_0_7h\"\n        },],2,],[\"m_0_5x\",[\"XHPTemplate\",\"m_0_77\",],[{\n            __m: \"m_0_77\"\n        },],2,],[\"m_0_4p\",[\"BuddyListNub\",\"m_0_4o\",\"m_0_4q\",\"m_0_4r\",],[{\n            __m: \"m_0_4o\"\n        },{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4r\"\n        },],1,],[\"m_0_5f\",[\"XHPTemplate\",\"m_0_6k\",],[{\n            __m: \"m_0_6k\"\n        },],2,],[\"m_0_68\",[\"XHPTemplate\",\"m_0_7k\",],[{\n            __m: \"m_0_7k\"\n        },],2,],[\"m_0_76\",[\"DataSource\",],[[],],2,],[\"m_0_60\",[\"XHPTemplate\",\"m_0_7a\",],[{\n            __m: \"m_0_7a\"\n        },],2,],[\"m_0_67\",[\"XHPTemplate\",\"m_0_7j\",],[{\n            __m: \"m_0_7j\"\n        },],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: true,\n            render_verification_rate: 1000\n        },27,],[\"ChatTabTemplates\",[\"m_0_5h\",\"m_0_5i\",\"m_0_5j\",\"m_0_5k\",\"m_0_5l\",\"m_0_5m\",\"m_0_5n\",\"m_0_5o\",\"m_0_5p\",\"m_0_5q\",\"m_0_5r\",\"m_0_5s\",\"m_0_5t\",\"m_0_5u\",\"m_0_5v\",\"m_0_5w\",\"m_0_5x\",\"m_0_5y\",\"m_0_5z\",\"m_0_60\",\"m_0_61\",\"m_0_62\",\"m_0_63\",\"m_0_64\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_5h\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_5i\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_5j\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_5k\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_5l\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_5m\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_5n\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_5o\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_5p\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_5q\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_5r\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_5s\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_5t\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_5u\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_5v\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_5w\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_5x\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_5y\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_5z\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_60\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_61\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_62\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_63\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_64\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_65\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_65\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_66\",\"m_0_67\",\"m_0_68\",\"m_0_69\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_66\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_67\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_68\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_69\"\n            }\n        },43,],[\"MercurySheetTemplates\",[\"m_0_55\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_55\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_56\",\"m_0_57\",\"m_0_58\",\"m_0_59\",\"m_0_5a\",\"m_0_5b\",\"m_0_5c\",\"m_0_5d\",\"m_0_5e\",\"m_0_5f\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_56\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_57\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_58\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_59\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_5a\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_5b\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_5c\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_5d\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_5e\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_5f\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_5g\",],{\n            source: {\n                __m: \"m_0_5g\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                name: \"Meep\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                name: \"Pusheen\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                name: \"Emoticons\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],],\n        elements: [[\"m_0_4n\",\"u_0_2w\",2,],[\"m_0_7f\",\"u_0_3h\",2,\"m_0_7e\",],[\"m_0_71\",\"u_0_39\",2,\"m_0_6z\",],[\"m_0_4t\",\"u_0_2y\",2,],[\"m_0_4o\",\"fbDockChatBuddylistNub\",2,],[\"m_0_70\",\"u_0_3a\",2,\"m_0_6z\",],[\"m_0_4u\",\"u_0_2z\",2,],[\"m_0_73\",\"u_0_3c\",4,\"m_0_72\",],[\"m_0_4w\",\"u_0_31\",2,],[\"m_0_4m\",\"u_0_2v\",2,],[\"m_0_4s\",\"u_0_30\",4,],[\"m_0_74\",\"u_0_3b\",2,\"m_0_72\",],[\"m_0_4l\",\"u_0_34\",2,],[\"m_0_4k\",\"u_0_2u\",2,],[\"m_0_7g\",\"u_0_3g\",2,\"m_0_7e\",],[\"m_0_50\",\"u_0_33\",2,],],\n        markup: [[\"m_0_6f\",{\n            __html: \"\\u003Cdiv class=\\\"musicAttachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\" data-jsid=\\\"icon_link\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_77\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__root fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6h\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_78\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_4ie5gn sx_4e6efe\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETry talking face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_4ie5gn sx_f7362e\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EClose\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6n\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__undertext fwb fcg\\\" data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6q\",{\n            __html: \"\\u003Cdiv class=\\\"uiToggle -cx-PRIVATE-fbNub__root fbNub -cx-PRIVATE-fbChatTabSelector__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"messagesIcon img sp_3yt8ar sx_de779b\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"numTabs\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatTabSelector__nummessages\\\" data-jsid=\\\"numMessages\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout uiToggleFlyout noTitlebar\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu\\\" data-jsid=\\\"menu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Dummy\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E Dummy \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7d\",{\n            __html: \"\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 4:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\"\n        },2,],[\"m_0_7h\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"mrm -cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__iconimage -cx-PRIVATE-uiSquareImage__large img sp_283j6i sx_8ef0b4\\\" data-jsid=\\\"profilePhoto\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiImageBlockDeprecated__iconcontent -cx-PRIVATE-uiImageBlockDeprecated__content\\\"\\u003E\\u003Cdiv class=\\\"mbs fsl fwb fcb\\\" data-jsid=\\\"mainText\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"aux-message fcg\\\" data-jsid=\\\"auxMessage\\\"\\u003EVideo will start as soon as you answer.\\u003C/div\\u003E\\u003Cdiv class=\\\"mts hidden_elem fcg\\\" data-jsid=\\\"slowMessage\\\"\\u003E\\u003Cspan class=\\\"fwb fcb\\\"\\u003EHaving trouble?\\u003C/span\\u003E Your connection may be \\u003Ca href=\\\"/help/214265948627885\\\" target=\\\"_blank\\\"\\u003Etoo slow\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6o\",{\n            __html: \"\\u003Cli class=\\\"uiMenuItem -cx-PRIVATE-fbChatTabSelector__item\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_36\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_36\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatTabSelector__itemcontent\\\"\\u003E\\u003Cspan class=\\\"unreadCount\\\" data-jsid=\\\"unreadCount\\\"\\u003E\\u003C/span\\u003E\\u003Cspan data-jsid=\\\"content\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6x\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_72\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatNameConversation__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatNameConversation__inputcontainer\\\"\\u003E\\u003Cdiv class=\\\"uiTypeahead\\\" id=\\\"u_0_3b\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput DOMControl_placeholder\\\" data-jsid=\\\"nameInput\\\" placeholder=\\\"Name this conversation\\\" autocomplete=\\\"off\\\" aria-autocomplete=\\\"list\\\" aria-expanded=\\\"false\\\" aria-owns=\\\"typeahead_list_u_0_3b\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this conversation\\\" aria-label=\\\"Name this conversation\\\" id=\\\"u_0_3c\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root selected -cx-PRIVATE-uiButton__confirm\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\"\\u003EDone\\u003C/button\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_7j\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__header\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryTypeahead__loadingspinner img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingSpinner\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryTypeahead__link\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6y\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriendsEmptyTab__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__to\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003ETo:\\u003C/span\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__typeahead\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7k\",{\n            __html: \"\\u003Cdiv class=\\\"uiTypeahead\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput\\\" data-jsid=\\\"textfield\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6z\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatThreadTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_37\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_39\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Edit Conversation Name\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"nameConversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EEdit Conversation Name\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Leave Conversation...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unsubscribeLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ELeave Conversation...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_37\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_38\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_38\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3a\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"emoteTogglerImg img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/tPCHWcomJXO.png\\\" alt=\\\"Choose an emoticon\\\" title=\\\"Choose an emoticon\\\" width=\\\"14\\\" height=\\\"14\\\" /\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_7l\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__row\\\"\\u003E\\u003Cdiv class=\\\"clearfix pvs\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage mrm -cx-PRIVATE-mercuryTypeahead__image lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__rightcontent\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryTypeahead__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__snippet fsm fwn fcg\\\" data-jsid=\\\"snippet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_7i\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix uiTokenizer uiInlineTokenizer\\\"\\u003E\\u003Cdiv class=\\\"tokenarea hidden_elem\\\" data-jsid=\\\"tokenarea\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6w\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-chatTabSheet__sheetimg img sp_4p6kmz sx_c2c2e3\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent\\\"\\u003E\\u003Cspan class=\\\"fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv\\u003E\\u003Ca href=\\\"#\\\" data-jsid=\\\"actionLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_79\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriends__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriends__typeaheadcontainer\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Clabel class=\\\"doneButton uiButton uiButtonConfirm\\\" for=\\\"u_0_3d\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_3d\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6p\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-fbChatMessage__forwardicon\\\" href=\\\"#\\\" style=\\\"padding-left: 12px;\\\" data-jsid=\\\"forwardLink\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_90e3a1\\\" style=\\\"top: 3px;\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"forwardText\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6t\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_4ie5gn sx_4e6efe\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETalk face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_4ie5gn sx_f7362e\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EOkay\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6c\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" /\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6m\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PRIVATE-fbChatMessageGroup__root clearfix small\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__piccontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__profilename\\\" data-jsid=\\\"profileName\\\"\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"profileLink\\\" href=\\\"#\\\" data-jsid=\\\"profileLink\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"profilePhoto\\\" src=\\\"/images/spacer.gif\\\" data-jsid=\\\"profilePhoto\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"messages\\\" data-jsid=\\\"messages\\\"\\u003E\\u003Cdiv class=\\\"metaInfoContainer fss fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"reportLinkWithDot\\\" class=\\\"hidden_elem\\\"\\u003E\\u003Ca href=\\\"#\\\" rel=\\\"dialog\\\" data-jsid=\\\"reportLink\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003EReport\\u003C/span\\u003E\\u003C/a\\u003E \\u00b7 \\u003C/span\\u003E\\u003Cspan class=\\\"timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7c\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typingcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typing\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6v\",{\n            __html: \"\\u003Ca href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_3yt8ar sx_de779b\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_6i\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca data-jsid=\\\"link\\\" target=\\\"_blank\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cspan data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7e\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatUserTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_3e\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Start a video call\\\" class=\\\"videoicon button\\\" href=\\\"#\\\" data-jsid=\\\"videoCallLink\\\" data-gt=\\\"&#123;&quot;videochat&quot;:&quot;call_clicked_chat_tab&quot;&#125;\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" tabindex=\\\"0\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3g\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"privacyLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Clear Window\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"clearWindowLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EClear Window\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Report as Spam or Abuse...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"reportSpamLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EReport as Spam or Abuse...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_3e\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_3f\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_3f\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3h\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"emoteTogglerImg img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/tPCHWcomJXO.png\\\" alt=\\\"Choose an emoticon\\\" title=\\\"Choose an emoticon\\\" width=\\\"14\\\" height=\\\"14\\\" /\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_53\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6b\",{\n            __html: \"\\u003Cdiv class=\\\"mtm pam -cx-PRIVATE-mercuryAttachments__errorbox attachment uiBoxGray\\\"\\u003E\\u003Cspan class=\\\"uiIconText MercuryThreadlistIconError\\\" data-jsid=\\\"error\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_25310e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6g\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6d\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6r\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix mvs\\\"\\u003E\\u003Ci class=\\\"rfloat img sp_3yt8ar sx_047178\\\" data-jsid=\\\"icon\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6e\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Cdiv class=\\\"clearfix MercuryExternalLink\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem lfloat\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"MercuryLinkRight rfloat\\\"\\u003E\\u003Cdiv class=\\\"MercuryLinkTitle\\\"\\u003E\\u003Ca class=\\\"linkTitle\\\" target=\\\"_blank\\\" href=\\\"#\\\" data-jsid=\\\"name\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\" data-jsid=\\\"shortLink\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_54\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6j\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__composersupplemental -cx-PRIVATE-mercuryComposer__uploadfilerow uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryComposer__uploadingindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"-cx-PRIVATE-mercuryComposer__closefileupload uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_35\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_35\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__uploadfiletext\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" data-jsid=\\\"iconText\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7b\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent -cx-PRIVATE-chatTabSheet__link fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Ca class=\\\"pas\\\" data-jsid=\\\"unmuteButton\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003EUnmute\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6u\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_3yt8ar sx_de779b\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6a\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem -cx-PRIVATE-fbMercuryTabSheet__loading img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_6l\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PUBLIC-fbChatEventMsg__root clearfix\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__iconwrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChatEventMsg__eventicon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"icon\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__messagewrapper\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatEventMsg__message fsm fcg\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"mls -cx-PRIVATE-fbChatEventMsg__timestamp fss fcg\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatEventMsg__logmessageattachment\\\" data-jsid=\\\"attachment\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7a\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__errorstatus clearfix\\\"\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6s\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatConvDateBreak__root mhs mbs fbChatConvItem\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatConvDateBreak__date fss fwb fcg\\\" data-jsid=\\\"date\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4z\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_32\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6k\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__filelinks\\\"\\u003E\\u003Cdiv data-jsid=\\\"openLinkContainer\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__openlinkcontainer hidden_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__openfilelink\\\" href=\\\"#\\\" data-jsid=\\\"openFile\\\" role=\\\"button\\\"\\u003Eopen\\u003C/a\\u003E \\u00b7 \\u003C/div\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__downloadfilelink\\\" href=\\\"#\\\" data-jsid=\\\"downloadFile\\\" role=\\\"button\\\"\\u003Edownload\\u003C/a\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\" data-jsid=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"c6lUE\",\"za92D\",\"oVWZ1\",\"tAd6o\",\"HgCpx\",\"jmZRT\",],\n    bootloadable: {\n        VideoCallController: {\n            resources: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"UmFO+\",\"zqZyK\",\"/MWWQ\",\"XH2Cu\",\"zBhY6\",\"WD1Wm\",\"OSd/n\",\"TXKLp\",\"gMfWI\",\"veUjj\",\"nxD7O\",\"KPLqg\",],\n            \"module\": true\n        },\n        SpotifyJSONPRequest: {\n            resources: [\"OH3xD\",\"xO/k5\",],\n            \"module\": true\n        },\n        \"legacy:control-textarea\": {\n            resources: [\"OH3xD\",\"4/uwC\",\"veUjj\",\"7z4pW\",]\n        },\n        ErrorDialog: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"nxD7O\",],\n            \"module\": true\n        },\n        Music: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"js0se\",\"qu1rX\",\"2xA31\",\"GK3bz\",\"WD1Wm\",\"oVWZ1\",],\n            \"module\": true\n        },\n        FBRTCCallController: {\n            resources: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"UmFO+\",\"zqZyK\",\"WD1Wm\",\"OSd/n\",\"XH2Cu\",\"TXKLp\",\"zBhY6\",\"gMfWI\",\"/MWWQ\",\"a3inZ\",\"KPLqg\",\"veUjj\",\"nxD7O\",\"LTaK/\",\"21lHn\",\"e0RyX\",\"9aS3c\",\"MfG6c\",\"LsRx/\",\"3h2ll\",\"Mzbs2\",\"wGXi/\",\"d6Evh\",\"6WF8S\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"9aS3c\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/p3UmoEMXDUD.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        jmZRT: {\n            type: \"css\",\n            permanent: 1,\n            nonblocking: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/oxmIub316pX.css\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"xO/k5\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n        },\n        \"cmK7/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/_oJ2eyBZFAi.js\"\n        },\n        zqZyK: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/DZVcIcmc3QT.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"2xA31\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yQ/r/0h38ritUVHh.js\"\n        },\n        oVWZ1: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/ZGslomlch7n.css\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        qu1rX: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n        },\n        \"7z4pW\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/NFZIio5Ki72.js\"\n        },\n        GK3bz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/ATgjpnoErA_.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/895-sItSveZ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/QylH5JvJ2tZ.js\"\n        }\n    },\n    ixData: {\n        \"/images/messaging/stickers/selector/leftarrow.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_ddb76f\"\n        },\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_faf97d\"\n        },\n        \"/images/gifts/icons/cake_icon.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_06a61f\"\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_6e4a51\"\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_047178\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_5ed30e\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_dd19b5\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_ff5be1\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_bf972e\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_b0241d\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_8d09d2\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_26b2d5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_479fb2\"\n        },\n        \"/images/messaging/stickers/selector/rightarrow.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_445519\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_0de2a7\"\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_9a8650\"\n        },\n        \"/images/messaging/stickers/selector/store.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_5b913c\"\n        }\n    },\n    js: [\"OH3xD\",\"XH2Cu\",\"f7Tpb\",\"AVmr9\",\"js0se\",\"/MWWQ\",\"1YKDj\",\"4/uwC\",\"WD1Wm\",\"cmK7/\",\"OSd/n\",\"zBhY6\",\"TXKLp\",\"bmJBG\",],\n    id: \"pagelet_dock\",\n    phase: 4\n});");
// 6650
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s627bb4e3baaa214b90c62b30c755beff78e17ab9");
// 6651
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_dock: {\n            container_id: \"u_0_3i\"\n        }\n    },\n    jsmods: {\n        require: [[\"MusicButtonManager\",\"init\",[],[[\"music.song\",],],],[\"initLiveMessageReceiver\",],[\"Dock\",\"init\",[\"m_0_4k\",],[{\n            __m: \"m_0_4k\"\n        },],],[\"React\",\"constructAndRenderComponent\",[\"NotificationBeeper.react\",\"m_0_4l\",],[{\n            __m: \"NotificationBeeper.react\"\n        },{\n            unseenVsUnread: false,\n            canPause: false,\n            shouldLogImpressions: false,\n            soundPath: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/yy/r/odIeERVR1c5.mp3\",\n            soundEnabled: true,\n            tracking: \"{\\\"ref\\\":\\\"beeper\\\",\\\"jewel\\\":\\\"notifications\\\",\\\"type\\\":\\\"click2canvas\\\"}\"\n        },{\n            __m: \"m_0_4l\"\n        },],],[\"ChatApp\",\"init\",[\"m_0_4m\",\"m_0_4n\",],[{\n            __m: \"m_0_4m\"\n        },{\n            __m: \"m_0_4n\"\n        },{\n            payload_source: \"server_initial_data\"\n        },],],[\"ChatOptions\",],[\"ShortProfiles\",\"setMulti\",[],[{\n            100006118350059: {\n                id: \"100006118350059\",\n                JSBNG__name: \"Javasee Cript\",\n                firstName: \"Javasee\",\n                vanity: \"javasee.cript\",\n                thumbSrc: \"http://jsbngssl.fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/s32x32/275646_100006118350059_324335073_q.jpg\",\n                uri: \"http://jsbngssl.www.facebook.com/javasee.cript\",\n                gender: 2,\n                type: \"user\",\n                is_friend: false,\n                social_snippets: null,\n                showVideoPromo: false,\n                searchTokens: [\"Cript\",\"Javasee\",]\n            }\n        },],],[\"m_0_4p\",],[\"m_0_4r\",],[\"Typeahead\",\"init\",[\"m_0_4s\",\"m_0_4r\",],[{\n            __m: \"m_0_4s\"\n        },{\n            __m: \"m_0_4r\"\n        },[\"chatTypeahead\",\"buildBestAvailableNames\",\"showLoadingIndicator\",],null,],],[\"ClearableTypeahead\",\"resetOnCloseButtonClick\",[\"m_0_4r\",\"m_0_4u\",],[{\n            __m: \"m_0_4r\"\n        },{\n            __m: \"m_0_4u\"\n        },],],[\"m_0_4x\",],[\"m_0_4y\",],[\"Layer\",\"init\",[\"m_0_4y\",\"m_0_4z\",],[{\n            __m: \"m_0_4y\"\n        },{\n            __m: \"m_0_4z\"\n        },],],[\"m_0_4q\",],[\"m_0_75\",],[\"Typeahead\",\"init\",[\"m_0_73\",\"m_0_75\",],[{\n            __m: \"m_0_73\"\n        },{\n            __m: \"m_0_75\"\n        },[],null,],],],\n        instances: [[\"m_0_4x\",[\"ChatSidebarDropdown\",\"m_0_4w\",],[{\n            __m: \"m_0_4w\"\n        },null,],1,],[\"m_0_5t\",[\"XHPTemplate\",\"m_0_6x\",],[{\n            __m: \"m_0_6x\"\n        },],2,],[\"m_0_5r\",[\"XHPTemplate\",\"m_0_6v\",],[{\n            __m: \"m_0_6v\"\n        },],2,],[\"m_0_5u\",[\"XHPTemplate\",\"m_0_6y\",],[{\n            __m: \"m_0_6y\"\n        },],2,],[\"m_0_52\",[\"XHPTemplate\",\"m_0_54\",],[{\n            __m: \"m_0_54\"\n        },],2,],[\"m_0_5o\",[\"XHPTemplate\",\"m_0_6s\",],[{\n            __m: \"m_0_6s\"\n        },],2,],[\"m_0_56\",[\"XHPTemplate\",\"m_0_6b\",],[{\n            __m: \"m_0_6b\"\n        },],2,],[\"m_0_64\",[\"XHPTemplate\",\"m_0_7e\",],[{\n            __m: \"m_0_7e\"\n        },],2,],[\"m_0_5h\",[\"XHPTemplate\",\"m_0_6l\",],[{\n            __m: \"m_0_6l\"\n        },],2,],[\"m_0_5v\",[\"XHPTemplate\",\"m_0_6z\",],[{\n            __m: \"m_0_6z\"\n        },],2,],[\"m_0_58\",[\"XHPTemplate\",\"m_0_6d\",],[{\n            __m: \"m_0_6d\"\n        },],2,],[\"m_0_5b\",[\"XHPTemplate\",\"m_0_6g\",],[{\n            __m: \"m_0_6g\"\n        },],2,],[\"m_0_5e\",[\"XHPTemplate\",\"m_0_6j\",],[{\n            __m: \"m_0_6j\"\n        },],2,],[\"m_0_69\",[\"XHPTemplate\",\"m_0_7l\",],[{\n            __m: \"m_0_7l\"\n        },],2,],[\"m_0_5p\",[\"XHPTemplate\",\"m_0_6t\",],[{\n            __m: \"m_0_6t\"\n        },],2,],[\"m_0_5l\",[\"XHPTemplate\",\"m_0_6p\",],[{\n            __m: \"m_0_6p\"\n        },],2,],[\"m_0_5n\",[\"XHPTemplate\",\"m_0_6r\",],[{\n            __m: \"m_0_6r\"\n        },],2,],[\"m_0_5i\",[\"XHPTemplate\",\"m_0_6m\",],[{\n            __m: \"m_0_6m\"\n        },],2,],[\"m_0_4v\",[\"ChatTypeaheadDataSource\",],[{\n            alwaysPrefixMatch: true,\n            showOfflineUsers: true\n        },],2,],[\"m_0_5a\",[\"XHPTemplate\",\"m_0_6f\",],[{\n            __m: \"m_0_6f\"\n        },],2,],[\"m_0_5g\",[\"DataSource\",],[{\n            maxResults: 5,\n            queryData: [],\n            bootstrapData: {\n                viewer: 100006118350059,\n                token: \"1374777501-7\",\n                filter: [\"user\",],\n                options: [\"friends_only\",],\n                context: \"messages_bootstrap\"\n            },\n            bootstrapEndpoint: \"/ajax/typeahead/first_degree.php\"\n        },],2,],[\"m_0_5j\",[\"XHPTemplate\",\"m_0_6n\",],[{\n            __m: \"m_0_6n\"\n        },],2,],[\"m_0_63\",[\"XHPTemplate\",\"m_0_7d\",],[{\n            __m: \"m_0_7d\"\n        },],2,],[\"m_0_5m\",[\"XHPTemplate\",\"m_0_6q\",],[{\n            __m: \"m_0_6q\"\n        },],2,],[\"m_0_5q\",[\"XHPTemplate\",\"m_0_6u\",],[{\n            __m: \"m_0_6u\"\n        },],2,],[\"m_0_4r\",[\"Typeahead\",\"m_0_4v\",\"ChatTypeaheadView\",\"m_0_4s\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadCore\",\"m_0_4t\",],[{\n            __m: \"m_0_4v\"\n        },{\n            node_id: \"u_0_2x\",\n            node: null,\n            ctor: {\n                __m: \"ChatTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_4s\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                renderer: {\n                    __m: \"ChatTypeaheadRenderer\"\n                },\n                showBadges: 1,\n                autoSelect: true\n            }\n        },{\n            ctor: {\n                __m: \"ChatTypeaheadCore\"\n            },\n            options: {\n                resetOnSelect: true,\n                setValueOnSelect: false,\n                keepFocused: false\n            }\n        },{\n            __m: \"m_0_4t\"\n        },],7,],[\"m_0_4q\",[\"ChatOrderedList\",\"m_0_50\",\"m_0_51\",\"m_0_52\",\"m_0_4y\",],[false,{\n            __m: \"m_0_50\"\n        },{\n            __m: \"m_0_51\"\n        },{\n            __m: \"m_0_52\"\n        },{\n            __m: \"m_0_4y\"\n        },null,],3,],[\"m_0_62\",[\"XHPTemplate\",\"m_0_7c\",],[{\n            __m: \"m_0_7c\"\n        },],2,],[\"m_0_59\",[\"XHPTemplate\",\"m_0_6e\",],[{\n            __m: \"m_0_6e\"\n        },],2,],[\"m_0_5d\",[\"XHPTemplate\",\"m_0_6i\",],[{\n            __m: \"m_0_6i\"\n        },],2,],[\"m_0_66\",[\"XHPTemplate\",\"m_0_7i\",],[{\n            __m: \"m_0_7i\"\n        },],2,],[\"m_0_5z\",[\"XHPTemplate\",\"m_0_79\",],[{\n            __m: \"m_0_79\"\n        },],2,],[\"m_0_61\",[\"XHPTemplate\",\"m_0_7b\",],[{\n            __m: \"m_0_7b\"\n        },],2,],[\"m_0_4y\",[\"LegacyContextualDialog\",\"AccessibleLayer\",],[{\n            buildWrapper: false,\n            causalElement: null,\n            addedBehaviors: [{\n                __m: \"AccessibleLayer\"\n            },]\n        },],5,],[\"m_0_51\",[\"XHPTemplate\",\"m_0_53\",],[{\n            __m: \"m_0_53\"\n        },],2,],[\"m_0_75\",[\"Typeahead\",\"m_0_76\",\"ContextualTypeaheadView\",\"m_0_73\",\"TypeaheadCore\",\"m_0_74\",],[{\n            __m: \"m_0_76\"\n        },{\n            node_id: \"\",\n            node: null,\n            ctor: {\n                __m: \"ContextualTypeaheadView\"\n            },\n            options: {\n                causalElement: {\n                    __m: \"m_0_73\"\n                },\n                minWidth: 0,\n                alignment: \"left\",\n                showBadges: 1\n            }\n        },{\n            ctor: {\n                __m: \"TypeaheadCore\"\n            },\n            options: {\n            }\n        },{\n            __m: \"m_0_74\"\n        },],3,],[\"m_0_57\",[\"XHPTemplate\",\"m_0_6c\",],[{\n            __m: \"m_0_6c\"\n        },],2,],[\"m_0_5c\",[\"XHPTemplate\",\"m_0_6h\",],[{\n            __m: \"m_0_6h\"\n        },],2,],[\"m_0_5w\",[\"XHPTemplate\",\"m_0_72\",],[{\n            __m: \"m_0_72\"\n        },],2,],[\"m_0_55\",[\"XHPTemplate\",\"m_0_6a\",],[{\n            __m: \"m_0_6a\"\n        },],2,],[\"m_0_5k\",[\"XHPTemplate\",\"m_0_6o\",],[{\n            __m: \"m_0_6o\"\n        },],2,],[\"m_0_5s\",[\"XHPTemplate\",\"m_0_6w\",],[{\n            __m: \"m_0_6w\"\n        },],2,],[\"m_0_5y\",[\"XHPTemplate\",\"m_0_78\",],[{\n            __m: \"m_0_78\"\n        },],2,],[\"m_0_65\",[\"XHPTemplate\",\"m_0_7h\",],[{\n            __m: \"m_0_7h\"\n        },],2,],[\"m_0_5x\",[\"XHPTemplate\",\"m_0_77\",],[{\n            __m: \"m_0_77\"\n        },],2,],[\"m_0_4p\",[\"BuddyListNub\",\"m_0_4o\",\"m_0_4q\",\"m_0_4r\",],[{\n            __m: \"m_0_4o\"\n        },{\n            __m: \"m_0_4q\"\n        },{\n            __m: \"m_0_4r\"\n        },],1,],[\"m_0_5f\",[\"XHPTemplate\",\"m_0_6k\",],[{\n            __m: \"m_0_6k\"\n        },],2,],[\"m_0_68\",[\"XHPTemplate\",\"m_0_7k\",],[{\n            __m: \"m_0_7k\"\n        },],2,],[\"m_0_76\",[\"DataSource\",],[[],],2,],[\"m_0_60\",[\"XHPTemplate\",\"m_0_7a\",],[{\n            __m: \"m_0_7a\"\n        },],2,],[\"m_0_67\",[\"XHPTemplate\",\"m_0_7j\",],[{\n            __m: \"m_0_7j\"\n        },],2,],],\n        define: [[\"LinkshimHandlerConfig\",[],{\n            supports_meta_referrer: true,\n            render_verification_rate: 1000\n        },27,],[\"ChatTabTemplates\",[\"m_0_5h\",\"m_0_5i\",\"m_0_5j\",\"m_0_5k\",\"m_0_5l\",\"m_0_5m\",\"m_0_5n\",\"m_0_5o\",\"m_0_5p\",\"m_0_5q\",\"m_0_5r\",\"m_0_5s\",\"m_0_5t\",\"m_0_5u\",\"m_0_5v\",\"m_0_5w\",\"m_0_5x\",\"m_0_5y\",\"m_0_5z\",\"m_0_60\",\"m_0_61\",\"m_0_62\",\"m_0_63\",\"m_0_64\",],{\n            \":fb:chat:conversation:message:event\": {\n                __m: \"m_0_5h\"\n            },\n            \":fb:chat:conversation:message-group\": {\n                __m: \"m_0_5i\"\n            },\n            \":fb:chat:conversation:message:undertext\": {\n                __m: \"m_0_5j\"\n            },\n            \":fb:chat:tab:selector:item\": {\n                __m: \"m_0_5k\"\n            },\n            \":fb:mercury:chat:message:forward\": {\n                __m: \"m_0_5l\"\n            },\n            \":fb:chat:tab:selector\": {\n                __m: \"m_0_5m\"\n            },\n            \":fb:mercury:chat:multichat-tooltip-item\": {\n                __m: \"m_0_5n\"\n            },\n            \":fb:chat:conversation:date-break\": {\n                __m: \"m_0_5o\"\n            },\n            \":fb:mercury:call:tour\": {\n                __m: \"m_0_5p\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-icon-sheet\": {\n                __m: \"m_0_5q\"\n            },\n            \":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\": {\n                __m: \"m_0_5r\"\n            },\n            \":fb:mercury:chat:tab-sheet:user-blocked\": {\n                __m: \"m_0_5s\"\n            },\n            \":fb:chat:conversation:message:subject\": {\n                __m: \"m_0_5t\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends-empty-tab\": {\n                __m: \"m_0_5u\"\n            },\n            \":fb:mercury:chat:multichat-tab\": {\n                __m: \"m_0_5v\"\n            },\n            \":fb:mercury:chat:tab-sheet:name-conversation\": {\n                __m: \"m_0_5w\"\n            },\n            \":fb:chat:conversation:message\": {\n                __m: \"m_0_5x\"\n            },\n            \":fb:mercury:call:promo\": {\n                __m: \"m_0_5y\"\n            },\n            \":fb:mercury:chat:tab-sheet:add-friends\": {\n                __m: \"m_0_5z\"\n            },\n            \":fb:chat:conversation:message:status\": {\n                __m: \"m_0_60\"\n            },\n            \":fb:mercury:chat:tab-sheet:message-mute-sheet\": {\n                __m: \"m_0_61\"\n            },\n            \":fb:mercury:typing-indicator:typing\": {\n                __m: \"m_0_62\"\n            },\n            \":fb:mercury:timestamp\": {\n                __m: \"m_0_63\"\n            },\n            \":fb:mercury:chat:user-tab\": {\n                __m: \"m_0_64\"\n            }\n        },15,],[\"VideoCallTemplates\",[\"m_0_65\",],{\n            \":fb:videocall:incoming-dialog\": {\n                __m: \"m_0_65\"\n            }\n        },74,],[\"MercuryTypeaheadTemplates\",[\"m_0_66\",\"m_0_67\",\"m_0_68\",\"m_0_69\",],{\n            \":fb:mercury:tokenizer\": {\n                __m: \"m_0_66\"\n            },\n            \":fb:mercury:typeahead:header\": {\n                __m: \"m_0_67\"\n            },\n            \":fb:mercury:typeahead\": {\n                __m: \"m_0_68\"\n            },\n            \":fb:mercury:typeahead:result\": {\n                __m: \"m_0_69\"\n            }\n        },43,],[\"MercurySheetTemplates\",[\"m_0_55\",],{\n            \":fb:mercury:tab-sheet:loading\": {\n                __m: \"m_0_55\"\n            }\n        },40,],[\"MercuryAttachmentTemplates\",[\"m_0_56\",\"m_0_57\",\"m_0_58\",\"m_0_59\",\"m_0_5a\",\"m_0_5b\",\"m_0_5c\",\"m_0_5d\",\"m_0_5e\",\"m_0_5f\",],{\n            \":fb:mercury:attachment:error\": {\n                __m: \"m_0_56\"\n            },\n            \":fb:mercury:attachment:video-thumb\": {\n                __m: \"m_0_57\"\n            },\n            \":fb:mercury:attachment:file-name\": {\n                __m: \"m_0_58\"\n            },\n            \":fb:mercury:attachment:external-link\": {\n                __m: \"m_0_59\"\n            },\n            \":fb:mercury:attachment:music\": {\n                __m: \"m_0_5a\"\n            },\n            \":fb:mercury:attachment:file-link\": {\n                __m: \"m_0_5b\"\n            },\n            \":fb:mercury:attachment:preview\": {\n                __m: \"m_0_5c\"\n            },\n            \":fb:mercury:attachment:share-link\": {\n                __m: \"m_0_5d\"\n            },\n            \":fb:mercury:upload-file-row\": {\n                __m: \"m_0_5e\"\n            },\n            \":fb:mercury:attachment:extended-file-link\": {\n                __m: \"m_0_5f\"\n            }\n        },34,],[\"MercuryDataSourceWrapper\",[\"m_0_5g\",],{\n            source: {\n                __m: \"m_0_5g\"\n            }\n        },37,],[\"MercuryStickersInitialData\",[],{\n            packs: [{\n                id: 126361870881943,\n                JSBNG__name: \"Meep\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yd/r/wn5XeO2Rkqj.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/sZ4spcbuYtY.png\"\n            },{\n                id: 350357561732812,\n                JSBNG__name: \"Pusheen\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yy/r/kLIslj7Vlau.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/58FtCc-hDRb.png\"\n            },{\n                id: \"emoticons\",\n                JSBNG__name: \"Emoticons\",\n                icon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/4Dc6kC7GMzT.png\",\n                selectedIcon: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/d-mu_AVkpiU.png\"\n            },]\n        },144,],],\n        elements: [[\"m_0_4n\",\"u_0_2w\",2,],[\"m_0_7f\",\"u_0_3h\",2,\"m_0_7e\",],[\"m_0_71\",\"u_0_39\",2,\"m_0_6z\",],[\"m_0_4t\",\"u_0_2y\",2,],[\"m_0_4o\",\"fbDockChatBuddylistNub\",2,],[\"m_0_70\",\"u_0_3a\",2,\"m_0_6z\",],[\"m_0_4u\",\"u_0_2z\",2,],[\"m_0_73\",\"u_0_3c\",4,\"m_0_72\",],[\"m_0_4w\",\"u_0_31\",2,],[\"m_0_4m\",\"u_0_2v\",2,],[\"m_0_4s\",\"u_0_30\",4,],[\"m_0_74\",\"u_0_3b\",2,\"m_0_72\",],[\"m_0_4l\",\"u_0_34\",2,],[\"m_0_4k\",\"u_0_2u\",2,],[\"m_0_7g\",\"u_0_3g\",2,\"m_0_7e\",],[\"m_0_50\",\"u_0_33\",2,],],\n        markup: [[\"m_0_6f\",{\n            __html: \"\\u003Cdiv class=\\\"musicAttachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\" data-jsid=\\\"icon_link\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_77\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__root fsm\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6h\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_78\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_4ie5gn sx_4e6efe\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETry talking face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_4ie5gn sx_f7362e\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EClose\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6n\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStatus__undertext fwb fcg\\\" data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6q\",{\n            __html: \"\\u003Cdiv class=\\\"uiToggle -cx-PRIVATE-fbNub__root fbNub -cx-PRIVATE-fbChatTabSelector__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"messagesIcon img sp_3yt8ar sx_de779b\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"numTabs\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatTabSelector__nummessages\\\" data-jsid=\\\"numMessages\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout uiToggleFlyout noTitlebar\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu\\\" data-jsid=\\\"menu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Dummy\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E Dummy \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7d\",{\n            __html: \"\\u003Cabbr title=\\\"Wednesday, December 31, 1969 at 4:00pm\\\" data-utime=\\\"0\\\" class=\\\"hidden_elem timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003Eover a year ago\\u003C/abbr\\u003E\"\n        },2,],[\"m_0_7h\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Ci class=\\\"mrm -cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiImageBlockDeprecated__image -cx-PRIVATE-uiImageBlockDeprecated__iconimage -cx-PRIVATE-uiSquareImage__large img sp_283j6i sx_8ef0b4\\\" data-jsid=\\\"profilePhoto\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiImageBlockDeprecated__iconcontent -cx-PRIVATE-uiImageBlockDeprecated__content\\\"\\u003E\\u003Cdiv class=\\\"mbs fsl fwb fcb\\\" data-jsid=\\\"mainText\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"aux-message fcg\\\" data-jsid=\\\"auxMessage\\\"\\u003EVideo will start as soon as you answer.\\u003C/div\\u003E\\u003Cdiv class=\\\"mts hidden_elem fcg\\\" data-jsid=\\\"slowMessage\\\"\\u003E\\u003Cspan class=\\\"fwb fcb\\\"\\u003EHaving trouble?\\u003C/span\\u003E Your connection may be \\u003Ca href=\\\"/help/214265948627885\\\" target=\\\"_blank\\\"\\u003Etoo slow\\u003C/a\\u003E.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6o\",{\n            __html: \"\\u003Cli class=\\\"uiMenuItem -cx-PRIVATE-fbChatTabSelector__item\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Clabel class=\\\"rfloat uiCloseButton uiCloseButtonSmall\\\" for=\\\"u_0_36\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeButton\\\" id=\\\"u_0_36\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatTabSelector__itemcontent\\\"\\u003E\\u003Cspan class=\\\"unreadCount\\\" data-jsid=\\\"unreadCount\\\"\\u003E\\u003C/span\\u003E\\u003Cspan data-jsid=\\\"content\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6x\",{\n            __html: \"\\u003Cdiv class=\\\"fbChatMessageSubject fsm fwb\\\" data-jsid=\\\"messageSubject\\\"\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_72\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatNameConversation__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatNameConversation__inputcontainer\\\"\\u003E\\u003Cdiv class=\\\"uiTypeahead\\\" id=\\\"u_0_3b\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput DOMControl_placeholder\\\" data-jsid=\\\"nameInput\\\" placeholder=\\\"Name this conversation\\\" autocomplete=\\\"off\\\" aria-autocomplete=\\\"list\\\" aria-expanded=\\\"false\\\" aria-owns=\\\"typeahead_list_u_0_3b\\\" role=\\\"combobox\\\" spellcheck=\\\"false\\\" value=\\\"Name this conversation\\\" aria-label=\\\"Name this conversation\\\" id=\\\"u_0_3c\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Cbutton value=\\\"1\\\" class=\\\"-cx-PRIVATE-abstractButton__root -cx-PRIVATE-uiButton__root selected -cx-PRIVATE-uiButton__confirm\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\"\\u003EDone\\u003C/button\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_7j\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__header\\\"\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"lfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryTypeahead__loadingspinner img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingSpinner\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryTypeahead__link\\\" data-jsid=\\\"link\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6y\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriendsEmptyTab__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__to\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003ETo:\\u003C/span\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriendsEmptyTab__typeahead\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7k\",{\n            __html: \"\\u003Cdiv class=\\\"uiTypeahead\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" class=\\\"hiddenInput\\\" /\\u003E\\u003Cdiv class=\\\"innerWrap\\\"\\u003E\\u003Cinput type=\\\"text\\\" class=\\\"inputtext textInput\\\" data-jsid=\\\"textfield\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6z\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatThreadTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_37\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_39\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Edit Conversation Name\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"nameConversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EEdit Conversation Name\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Leave Conversation...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unsubscribeLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ELeave Conversation...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_37\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_38\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_38\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3a\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"emoteTogglerImg img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/tPCHWcomJXO.png\\\" alt=\\\"Choose an emoticon\\\" title=\\\"Choose an emoticon\\\" width=\\\"14\\\" height=\\\"14\\\" /\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_7l\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-mercuryTypeahead__row\\\"\\u003E\\u003Cdiv class=\\\"clearfix pvs\\\"\\u003E\\u003Cdiv class=\\\"MercuryThreadImage mrm -cx-PRIVATE-mercuryTypeahead__image lfloat\\\" data-jsid=\\\"image\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-uiSquareImage__root -cx-PRIVATE-uiSquareImage__large img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__rightcontent\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryTypeahead__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypeahead__snippet fsm fwn fcg\\\" data-jsid=\\\"snippet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_7i\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix uiTokenizer uiInlineTokenizer\\\"\\u003E\\u003Cdiv class=\\\"tokenarea hidden_elem\\\" data-jsid=\\\"tokenarea\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6w\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-chatTabSheet__sheetimg img sp_4p6kmz sx_c2c2e3\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent\\\"\\u003E\\u003Cspan class=\\\"fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv\\u003E\\u003Ca href=\\\"#\\\" data-jsid=\\\"actionLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_79\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-chatAddFriends__root\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vTop -cx-PRIVATE-chatAddFriends__typeaheadcontainer\\\"\\u003E\\u003Cdiv data-jsid=\\\"participantsTypeahead\\\"\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"vTop\\\"\\u003E\\u003Clabel class=\\\"doneButton uiButton uiButtonConfirm\\\" for=\\\"u_0_3d\\\"\\u003E\\u003Cinput value=\\\"Done\\\" data-jsid=\\\"doneButton\\\" type=\\\"submit\\\" id=\\\"u_0_3d\\\" /\\u003E\\u003C/label\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6p\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-fbChatMessage__forwardicon\\\" href=\\\"#\\\" style=\\\"padding-left: 12px;\\\" data-jsid=\\\"forwardLink\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_90e3a1\\\" style=\\\"top: 3px;\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"forwardText\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6t\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv class=\\\"clearfix mvm mrm mll videoCallPromo\\\"\\u003E\\u003Ci class=\\\"-cx-PRIVATE-uiImageBlock__image -cx-PRIVATE-uiImageBlock__mediumimage lfloat img sp_4ie5gn sx_4e6efe\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiFlexibleBlock__flexiblecontent\\\"\\u003E\\u003Cdiv class=\\\"pls\\\"\\u003E\\u003Cspan class=\\\"calloutTitle fwb\\\"\\u003ETalk face to face\\u003C/span\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\"\\u003EClick \\u003Cspan\\u003E ( \\u003Ci class=\\\"onlineStatusIcon img sp_4ie5gn sx_f7362e\\\"\\u003E\\u003C/i\\u003E )\\u003C/span\\u003E below to start a video call.\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder\\\"\\u003E\\u003Ctable class=\\\"uiGrid\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"prs uiOverlayFooterMessage\\\"\\u003E\\u003Ca target=\\\"_blank\\\" href=\\\"/help/?page=177940565599960\\\"\\u003ELearn more\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"uiOverlayFooterButtons\\\"\\u003E\\u003Ca class=\\\"uiOverlayButton layerCancel uiButton uiButtonConfirm\\\" href=\\\"#\\\" role=\\\"button\\\" name=\\\"cancel\\\"\\u003E\\u003Cspan class=\\\"uiButtonText\\\"\\u003EOkay\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6c\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca class=\\\"uiVideoThumb videoPreview\\\" href=\\\"#\\\" data-jsid=\\\"thumb\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" /\\u003E\\u003Ci\\u003E\\u003C/i\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6m\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PRIVATE-fbChatMessageGroup__root clearfix small\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__piccontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessageGroup__profilename\\\" data-jsid=\\\"profileName\\\"\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"profileLink\\\" href=\\\"#\\\" data-jsid=\\\"profileLink\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"profilePhoto\\\" src=\\\"/images/spacer.gif\\\" data-jsid=\\\"profilePhoto\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"messages\\\" data-jsid=\\\"messages\\\"\\u003E\\u003Cdiv class=\\\"metaInfoContainer fss fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"reportLinkWithDot\\\" class=\\\"hidden_elem\\\"\\u003E\\u003Ca href=\\\"#\\\" rel=\\\"dialog\\\" data-jsid=\\\"reportLink\\\" role=\\\"button\\\"\\u003E\\u003Cspan class=\\\"fcg\\\"\\u003EReport\\u003C/span\\u003E\\u003C/a\\u003E \\u00b7 \\u003C/span\\u003E\\u003Cspan class=\\\"timestamp\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7c\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typingcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryTypingIndicator__typing\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6v\",{\n            __html: \"\\u003Ca href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_3yt8ar sx_de779b\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\"\n        },2,],[\"m_0_6i\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Ca data-jsid=\\\"link\\\" target=\\\"_blank\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cspan data-jsid=\\\"name\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7e\",{\n            __html: \"\\u003Cdiv class=\\\"fbNub -cx-PRIVATE-fbNub__root -cx-PRIVATE-fbMercuryChatTab__root -cx-PRIVATE-fbMercuryChatUserTab__root\\\"\\u003E\\u003Ca class=\\\"fbNubButton\\\" tabindex=\\\"0\\\" href=\\\"#\\\" data-jsid=\\\"dockButton\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbChatTab\\\"\\u003E\\u003Cdiv class=\\\"funhouse rfloat\\\"\\u003E\\u003Cdiv class=\\\"close\\\" title=\\\"Close\\\" data-jsid=\\\"closeButton\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"wrapWrapper\\\"\\u003E\\u003Cdiv class=\\\"wrap\\\"\\u003E\\u003Cdiv class=\\\"name fwb\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbMercuryChatTab__nummessages hidden_elem\\\" data-jsid=\\\"numMessages\\\"\\u003E0\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"fbNubFlyout fbDockChatTabFlyout\\\" data-jsid=\\\"chatWrapper\\\" role=\\\"complementary\\\" aria-labelledby=\\\"u_0_3e\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutOuter\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutInner\\\"\\u003E\\u003Cdiv class=\\\"clearfix fbNubFlyoutTitlebar titlebar\\\" data-jsid=\\\"nubFlyoutTitlebar\\\"\\u003E\\u003Cdiv class=\\\"mls titlebarButtonWrapper rfloat\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Add more friends to chat\\\" class=\\\"addToThread button\\\" href=\\\"#\\\" data-jsid=\\\"addToThreadLink\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Start a video call\\\" class=\\\"videoicon button\\\" href=\\\"#\\\" data-jsid=\\\"videoCallLink\\\" data-gt=\\\"&#123;&quot;videochat&quot;:&quot;call_clicked_chat_tab&quot;&#125;\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelector inlineBlock -cx-PRIVATE-fbDockChatDropdown__root\\\" data-jsid=\\\"dropdown\\\"\\u003E\\u003Cdiv class=\\\"uiToggle wrap\\\"\\u003E\\u003Ca data-hover=\\\"tooltip\\\" aria-label=\\\"Options\\\" data-tooltip-alignh=\\\"center\\\" class=\\\"button uiSelectorButton\\\" href=\\\"#\\\" role=\\\"button\\\" aria-haspopup=\\\"1\\\" rel=\\\"toggle\\\"\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"uiSelectorMenuWrapper uiToggleFlyout\\\"\\u003E\\u003Cdiv role=\\\"menu\\\" class=\\\"uiMenu uiSelectorMenu\\\"\\u003E\\u003Cul class=\\\"uiMenuInner\\\"\\u003E\\u003Cli class=\\\"uiMenuItem\\\" tabindex=\\\"0\\\"\\u003E\\u003Cform data-jsid=\\\"attachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3g\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"attachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root itemLabel\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"fileInput\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button itemAnchor\\\"\\u003EAdd Files...\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Add Friends to Chat...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"addFriendLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EAdd Friends to Chat...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"privacyLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003E \\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"See Full Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"conversationLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003ESee Full Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Mute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"muteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EMute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem hidden_elem\\\" data-label=\\\"Unmute Conversation\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"unmuteThreadLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EUnmute Conversation\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Clear Window\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"clearWindowLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EClear Window\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuSeparator\\\"\\u003E\\u003C/li\\u003E\\u003Cli class=\\\"uiMenuItem\\\" data-label=\\\"Report as Spam or Abuse...\\\"\\u003E\\u003Ca class=\\\"itemAnchor\\\" role=\\\"menuitem\\\" tabindex=\\\"-1\\\" href=\\\"#\\\" data-jsid=\\\"reportSpamLink\\\"\\u003E\\u003Cspan class=\\\"itemLabel fsm\\\"\\u003EReport as Spam or Abuse...\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\\u003C/ul\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"close button\\\" href=\\\"#\\\" data-jsid=\\\"titlebarCloseButton\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"titlebarLabel clearfix\\\"\\u003E\\u003Ch4 class=\\\"titlebarTextWrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbMercuryChatUserTab__presenceindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"presenceIndicator\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Ca class=\\\"titlebarText noLink\\\" href=\\\"#\\\" rel=\\\"none\\\" data-jsid=\\\"titlebarText\\\" aria-level=\\\"3\\\" id=\\\"u_0_3e\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/h4\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutHeader\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheetcontainer\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryTabSheet__sheet hidden_elem\\\" data-jsid=\\\"sheet\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBody scrollable\\\" data-jsid=\\\"chatConv\\\"\\u003E\\u003Cdiv class=\\\"fbNubFlyoutBodyContent\\\"\\u003E\\u003Ctable class=\\\"uiGrid conversationContainer\\\" cellspacing=\\\"0\\\" cellpadding=\\\"0\\\" role=\\\"log\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"vBot\\\"\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation Start\\u003C/div\\u003E\\u003Cimg class=\\\"pvm loading hidden_elem img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" data-jsid=\\\"loadingIndicator\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Cdiv class=\\\"conversation\\\" aria-live=\\\"polite\\\" aria-atomic=\\\"false\\\" data-jsid=\\\"conversation\\\" id=\\\"u_0_3f\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"accessible_elem\\\"\\u003EChat Conversation End\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryTypingIndicator__root\\\" data-jsid=\\\"typingIndicator\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__root\\\" data-jsid=\\\"lastMessageIndicator\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__icon\\\"\\u003E\\u003C/div\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-mercuryLastMessageIndicator__text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutFooter\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__inputcontainer\\\" data-jsid=\\\"inputContainer\\\"\\u003E\\u003Ctextarea class=\\\"uiTextareaAutogrow -cx-PRIVATE-fbMercuryChatTab__input\\\" data-jsid=\\\"input\\\" aria-controls=\\\"u_0_3f\\\" onkeydown=\\\"window.Bootloader &amp;&amp; Bootloader.loadComponents([&quot;control-textarea&quot;], function() &#123; TextAreaControl.getInstance(this) &#125;.bind(this)); \\\"\\u003E\\u003C/textarea\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatTab__chaticonscontainer\\\" data-jsid=\\\"iconsContainer\\\"\\u003E\\u003Cform class=\\\"-cx-PRIVATE-fbMercuryChatTab__chatphotouploader\\\" data-jsid=\\\"photoAttachButtonForm\\\" action=\\\"http://jsbngssl.upload.facebook.com/ajax/mercury/upload.php\\\" method=\\\"post\\\" onsubmit=\\\"return window.Event &amp;&amp; Event.__inlineSubmit &amp;&amp; Event.__inlineSubmit(this,event)\\\" id=\\\"u_0_3h\\\"\\u003E\\u003Cinput type=\\\"hidden\\\" name=\\\"fb_dtsg\\\" value=\\\"AQApxIm6\\\" autocomplete=\\\"off\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" data-jsid=\\\"photoAttachID\\\" name=\\\"attach_id\\\" /\\u003E\\u003Cinput type=\\\"hidden\\\" autocomplete=\\\"off\\\" name=\\\"store_as_message_image\\\" value=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-uiInlineBlock__root -cx-PRIVATE-uiFileInput__container -cx-PRIVATE-mercuryFileUploader__root\\\"\\u003E\\u003Cinput type=\\\"file\\\" class=\\\"-cx-PRIVATE-uiFileInput__input\\\" name=\\\"attachment[]\\\" multiple=\\\"1\\\" data-jsid=\\\"photoFileInput\\\" accept=\\\"image/*\\\" /\\u003E\\u003Ca class=\\\"-cx-PRIVATE-mercuryFileUploader__button -cx-PRIVATE-fbMercuryChatPhotoUploader__cameralink\\\" data-jsid=\\\"photoAttachLink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryChatPhotoUploader__cameraicon\\\"\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003C/form\\u003E\\u003Cdiv class=\\\"uiToggle emoticonsPanel\\\" data-jsid=\\\"emoticons\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-fbMercuryStickersFlyout__togglerimg\\\" href=\\\"#\\\" rel=\\\"toggle\\\" role=\\\"button\\\"\\u003E\\u003Cimg class=\\\"emoteTogglerImg img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/tPCHWcomJXO.png\\\" alt=\\\"Choose an emoticon\\\" title=\\\"Choose an emoticon\\\" width=\\\"14\\\" height=\\\"14\\\" /\\u003E\\u003C/a\\u003E\\u003Cdiv class=\\\"panelFlyout -cx-PUBLIC-fbMercuryStickersFlyout__root uiToggleFlyout\\\"\\u003E\\u003Cdiv data-jsid=\\\"stickers\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__selector\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__packs\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\\\" data-id=\\\"emoticons\\\"\\u003E\\u003Ctable class=\\\"emoticonsTable\\\"\\u003E\\u003Ctbody\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_smile\\\" aria-label=\\\"smile\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_frown\\\" aria-label=\\\"frown\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_tongue\\\" aria-label=\\\"tongue\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grin\\\" aria-label=\\\"grin\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_gasp\\\" aria-label=\\\"gasp\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_wink\\\" aria-label=\\\"wink\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_pacman\\\" aria-label=\\\"pacman\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_grumpy\\\" aria-label=\\\"grumpy\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_unsure\\\" aria-label=\\\"unsure\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_cry\\\" aria-label=\\\"cry\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_kiki\\\" aria-label=\\\"kiki\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_glasses\\\" aria-label=\\\"glasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_sunglasses\\\" aria-label=\\\"sunglasses\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_heart\\\" aria-label=\\\"heart\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003Ctr\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_devil\\\" aria-label=\\\"devil\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_angel\\\" aria-label=\\\"angel\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_squint\\\" aria-label=\\\"squint\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_confused\\\" aria-label=\\\"confused\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_upset\\\" aria-label=\\\"upset\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_colonthree\\\" aria-label=\\\"colonthree\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003Ctd class=\\\"panelCell\\\"\\u003E\\u003Ca class=\\\"emoticon emoticon_like\\\" aria-label=\\\"like\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/td\\u003E\\u003C/tr\\u003E\\u003C/tbody\\u003E\\u003C/table\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"panelFlyoutArrow\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fbNubFlyoutAttachments\\\"\\u003E\\u003Cdiv class=\\\"chatAttachmentShelf\\\" data-jsid=\\\"attachmentShelf\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },4,],[\"m_0_53\",{\n            __html: \"\\u003Cli class=\\\"-cx-PRIVATE-fbChatOrderedList__item\\\"\\u003E\\u003Ca class=\\\"clearfix -cx-PRIVATE-fbChatOrderedList__link\\\" data-jsid=\\\"anchor\\\" href=\\\"#\\\" role=\\\"\\\" rel=\\\"ignore\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChat__favoritebutton -cx-PRIVATE-fbChatOrderedList__favoritebutton\\\" data-jsid=\\\"favorite_button\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"pic_container\\\"\\u003E\\u003Cimg class=\\\"pic img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"profile-photo\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChat__dragindicator -cx-PRIVATE-fbChatOrderedList__dragindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/F7kk7-cjEKk.png\\\" alt=\\\"\\\" width=\\\"10\\\" height=\\\"8\\\" /\\u003E\\u003Cdiv class=\\\"clearfix\\\"\\u003E\\u003Cdiv class=\\\"rfloat\\\"\\u003E\\u003Cspan data-jsid=\\\"accessible-name\\\" class=\\\"accessible_elem\\\"\\u003E\\u003C/span\\u003E\\u003Cdiv class=\\\"icon_container\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbLiveBar__status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003Cdiv class=\\\"active_time icon\\\"\\u003E\\u003C/div\\u003E\\u003Cimg class=\\\"status icon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003Cdiv aria-hidden=\\\"true\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__name\\\" data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatOrderedList__context\\\" data-jsid=\\\"context\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/a\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6b\",{\n            __html: \"\\u003Cdiv class=\\\"mtm pam -cx-PRIVATE-mercuryAttachments__errorbox attachment uiBoxGray\\\"\\u003E\\u003Cspan class=\\\"uiIconText MercuryThreadlistIconError\\\" data-jsid=\\\"error\\\"\\u003E\\u003Ci class=\\\"img sp_4p6kmz sx_25310e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6g\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6d\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan data-jsid=\\\"filename\\\" class=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6r\",{\n            __html: \"\\u003Cdiv class=\\\"clearfix mvs\\\"\\u003E\\u003Ci class=\\\"rfloat img sp_3yt8ar sx_047178\\\" data-jsid=\\\"icon\\\"\\u003E\\u003C/i\\u003E\\u003Cdiv data-jsid=\\\"name\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6e\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment\\\"\\u003E\\u003Cdiv class=\\\"clearfix MercuryExternalLink\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryImages__imagepreviewcontainer clearfix stat_elem lfloat\\\" data-jsid=\\\"preview\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryImages__imagepreview\\\" data-jsid=\\\"image-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" role=\\\"button\\\"\\u003E\\u003Cimg data-jsid=\\\"preview-image\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/drP8vlvSl_8.gif\\\" /\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"MercuryLinkRight rfloat\\\"\\u003E\\u003Cdiv class=\\\"MercuryLinkTitle\\\"\\u003E\\u003Ca class=\\\"linkTitle\\\" target=\\\"_blank\\\" href=\\\"#\\\" data-jsid=\\\"name\\\" role=\\\"button\\\"\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"fsm fwn fcg\\\" data-jsid=\\\"shortLink\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_54\",{\n            __html: \"\\u003Cli\\u003E\\u003Cdiv class=\\\"phs fcg\\\"\\u003E\\u003Cspan data-jsid=\\\"message\\\"\\u003ELoading...\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/li\\u003E\"\n        },2,],[\"m_0_6j\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__composersupplemental -cx-PRIVATE-mercuryComposer__uploadfilerow uploadFileRow\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-mercuryComposer__uploadingindicator img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yb/r/GsNJNwuI-UM.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"11\\\" /\\u003E\\u003Clabel class=\\\"-cx-PRIVATE-mercuryComposer__closefileupload uiCloseButton uiCloseButtonSmall uiCloseButtonSmallDark\\\" for=\\\"u_0_35\\\"\\u003E\\u003Cinput title=\\\"Remove\\\" type=\\\"button\\\" data-jsid=\\\"closeFileUpload\\\" id=\\\"u_0_35\\\" /\\u003E\\u003C/label\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-mercuryComposer__uploadfiletext\\\"\\u003E\\u003Cspan class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" data-jsid=\\\"iconText\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7b\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent -cx-PRIVATE-chatTabSheet__link fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003Ca class=\\\"pas\\\" data-jsid=\\\"unmuteButton\\\" href=\\\"#\\\" role=\\\"button\\\"\\u003EUnmute\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6u\",{\n            __html: \"\\u003Cdiv class=\\\"pas\\\"\\u003E\\u003Ci class=\\\"mrs -cx-PRIVATE-chatTabSheet__sheetimg img sp_3yt8ar sx_de779b\\\" data-jsid=\\\"image\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-chatTabSheet__sheetcontent fcg\\\" data-jsid=\\\"text\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6a\",{\n            __html: \"\\u003Cimg class=\\\"hidden_elem -cx-PRIVATE-fbMercuryTabSheet__loading img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\"\n        },2,],[\"m_0_6l\",{\n            __html: \"\\u003Cdiv class=\\\"mhs mbs pts fbChatConvItem -cx-PUBLIC-fbChatEventMsg__root clearfix\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__iconwrapper\\\"\\u003E\\u003Cimg class=\\\"-cx-PRIVATE-fbChatEventMsg__eventicon img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/-PAXP-deijE.gif\\\" data-jsid=\\\"icon\\\" alt=\\\"\\\" width=\\\"1\\\" height=\\\"1\\\" /\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatEventMsg__messagewrapper\\\"\\u003E\\u003Cspan class=\\\"-cx-PRIVATE-fbChatEventMsg__message fsm fcg\\\" data-jsid=\\\"message\\\"\\u003E\\u003C/span\\u003E\\u003Cspan class=\\\"mls -cx-PRIVATE-fbChatEventMsg__timestamp fss fcg\\\" data-jsid=\\\"timestamp\\\"\\u003E\\u003C/span\\u003E\\u003C/div\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatEventMsg__logmessageattachment\\\" data-jsid=\\\"attachment\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_7a\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatMessage__errorstatus clearfix\\\"\\u003E\\u003Cdiv data-jsid=\\\"message\\\"\\u003E\\u003C/div\\u003E\\u003Cdiv data-jsid=\\\"status\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6s\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-fbChatConvDateBreak__root mhs mbs fbChatConvItem\\\"\\u003E\\u003Cdiv class=\\\"-cx-PRIVATE-fbChatConvDateBreak__date fss fwb fcg\\\" data-jsid=\\\"date\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_4z\",{\n            __html: \"\\u003Cdiv class=\\\"uiContextualDialogPositioner\\\" id=\\\"u_0_32\\\" data-position=\\\"left\\\"\\u003E\\u003Cdiv class=\\\"uiOverlay uiContextualDialog\\\" data-width=\\\"300\\\" data-destroyonhide=\\\"false\\\" data-fadeonhide=\\\"false\\\"\\u003E\\u003Cdiv class=\\\"uiOverlayContent\\\"\\u003E\\u003Cdiv class=\\\"uiContextualDialogContent\\\"\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },2,],[\"m_0_6k\",{\n            __html: \"\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__attachment -cx-PUBLIC-mercuryAttachments__fileattachment\\\"\\u003E\\u003Cdiv class=\\\"-cx-PUBLIC-mercuryAttachments__filelinks\\\"\\u003E\\u003Cdiv data-jsid=\\\"openLinkContainer\\\" class=\\\"-cx-PUBLIC-mercuryAttachments__openlinkcontainer hidden_elem\\\"\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__openfilelink\\\" href=\\\"#\\\" data-jsid=\\\"openFile\\\" role=\\\"button\\\"\\u003Eopen\\u003C/a\\u003E \\u00b7 \\u003C/div\\u003E\\u003Ca class=\\\"-cx-PUBLIC-mercuryAttachments__downloadfilelink\\\" href=\\\"#\\\" data-jsid=\\\"downloadFile\\\" role=\\\"button\\\"\\u003Edownload\\u003C/a\\u003E\\u003C/div\\u003E\\u003Ca class=\\\"uiIconText -cx-PRIVATE-mercuryAttachments__icontext\\\" href=\\\"#\\\" data-jsid=\\\"link\\\" role=\\\"button\\\"\\u003E\\u003Ci class=\\\"img sp_4ie5gn sx_0adf5e\\\"\\u003E\\u003C/i\\u003E\\u003Cspan class=\\\"-cx-PUBLIC-mercuryAttachments__filename\\\" data-jsid=\\\"filename\\\"\\u003E\\u003C/span\\u003E\\u003C/a\\u003E\\u003C/div\\u003E\"\n        },2,],]\n    },\n    css: [\"UmFO+\",\"veUjj\",\"c6lUE\",\"za92D\",\"oVWZ1\",\"tAd6o\",\"HgCpx\",\"jmZRT\",],\n    bootloadable: {\n        VideoCallController: {\n            resources: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"UmFO+\",\"zqZyK\",\"/MWWQ\",\"XH2Cu\",\"zBhY6\",\"WD1Wm\",\"OSd/n\",\"TXKLp\",\"gMfWI\",\"veUjj\",\"nxD7O\",\"KPLqg\",],\n            \"module\": true\n        },\n        SpotifyJSONPRequest: {\n            resources: [\"OH3xD\",\"xO/k5\",],\n            \"module\": true\n        },\n        \"legacy:control-textarea\": {\n            resources: [\"OH3xD\",\"4/uwC\",\"veUjj\",\"7z4pW\",]\n        },\n        ErrorDialog: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"nxD7O\",],\n            \"module\": true\n        },\n        Music: {\n            resources: [\"OH3xD\",\"XH2Cu\",\"f7Tpb\",\"UmFO+\",\"AVmr9\",\"js0se\",\"qu1rX\",\"2xA31\",\"GK3bz\",\"WD1Wm\",\"oVWZ1\",],\n            \"module\": true\n        },\n        FBRTCCallController: {\n            resources: [\"OH3xD\",\"AVmr9\",\"f7Tpb\",\"UmFO+\",\"zqZyK\",\"WD1Wm\",\"OSd/n\",\"XH2Cu\",\"TXKLp\",\"zBhY6\",\"gMfWI\",\"/MWWQ\",\"a3inZ\",\"KPLqg\",\"veUjj\",\"nxD7O\",\"LTaK/\",\"21lHn\",\"e0RyX\",\"9aS3c\",\"MfG6c\",\"LsRx/\",\"3h2ll\",\"Mzbs2\",\"wGXi/\",\"d6Evh\",\"6WF8S\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n        \"9aS3c\": {\n            type: \"css\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yE/r/p3UmoEMXDUD.css\"\n        },\n        Mzbs2: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y7/r/sM5jkmon6X9.js\"\n        },\n        jmZRT: {\n            type: \"css\",\n            permanent: 1,\n            nonblocking: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/oxmIub316pX.css\"\n        },\n        \"3h2ll\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yz/r/8nGweTPJCKZ.js\"\n        },\n        \"6WF8S\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/cHaSy_1vFQu.js\"\n        },\n        \"xO/k5\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yB/r/fQIoBRZLBHX.js\"\n        },\n        \"cmK7/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/_oJ2eyBZFAi.js\"\n        },\n        zqZyK: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yg/r/DZVcIcmc3QT.js\"\n        },\n        \"LTaK/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/3Z79JZzbt1o.js\"\n        },\n        KPLqg: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yq/r/UJCnyWz8q3r.css\"\n        },\n        \"wGXi/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/usnMgvD8abB.js\"\n        },\n        gMfWI: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yY/r/YnJRD6K1VJA.js\"\n        },\n        \"2xA31\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yQ/r/0h38ritUVHh.js\"\n        },\n        oVWZ1: {\n            type: \"css\",\n            permanent: 1,\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/ZGslomlch7n.css\"\n        },\n        \"LsRx/\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/kS-r05X6OEA.js\"\n        },\n        qu1rX: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ym/r/5vdmAFTChHH.js\"\n        },\n        \"7z4pW\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yG/r/NFZIio5Ki72.js\"\n        },\n        GK3bz: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/ATgjpnoErA_.js\"\n        },\n        a3inZ: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yO/r/9ELMM-KdnsD.js\"\n        },\n        d6Evh: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y2/r/jalUIRLBuTe.js\"\n        },\n        MfG6c: {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yM/r/895-sItSveZ.js\"\n        },\n        \"21lHn\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yP/r/QylH5JvJ2tZ.js\"\n        }\n    },\n    ixData: {\n        \"/images/messaging/stickers/selector/leftarrow.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_ddb76f\"\n        },\n        \"/images/chat/sidebar/newGroupChatLitestand.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_faf97d\"\n        },\n        \"/images/gifts/icons/cake_icon.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_06a61f\"\n        },\n        \"/images/litestand/sidebar/blended/new_group_chat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_6e4a51\"\n        },\n        \"/images/chat/status/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_047178\"\n        },\n        \"/images/litestand/bookmarks/sidebar/remove.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_5ed30e\"\n        },\n        \"/images/litestand/sidebar/blended/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_dd19b5\"\n        },\n        \"/images/litestand/sidebar/blended/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_ff5be1\"\n        },\n        \"/images/litestand/bookmarks/sidebar/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_bf972e\"\n        },\n        \"/images/litestand/sidebar/pushable.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_b0241d\"\n        },\n        \"/images/litestand/sidebar/online.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_8d09d2\"\n        },\n        \"/images/chat/add.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_26b2d5\"\n        },\n        \"/images/chat/status/mobile.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_479fb2\"\n        },\n        \"/images/messaging/stickers/selector/rightarrow.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_445519\"\n        },\n        \"/images/chat/sidebar/newGroupChat.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_0de2a7\"\n        },\n        \"/images/chat/delete.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_3yt8ar\",\n            spriteCssClass: \"sx_9a8650\"\n        },\n        \"/images/messaging/stickers/selector/store.png\": {\n            sprited: true,\n            spriteMapCssClass: \"sp_b8k8sa\",\n            spriteCssClass: \"sx_5b913c\"\n        }\n    },\n    js: [\"OH3xD\",\"XH2Cu\",\"f7Tpb\",\"AVmr9\",\"js0se\",\"/MWWQ\",\"1YKDj\",\"4/uwC\",\"WD1Wm\",\"cmK7/\",\"OSd/n\",\"zBhY6\",\"TXKLp\",\"bmJBG\",],\n    id: \"pagelet_dock\",\n    phase: 4\n});");
// 6658
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        fbRequestsList: {\n            container_id: \"u_0_3j\"\n        }\n    },\n    css: [\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 4\n});");
// 6659
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s95897435dc64341a2009d649aee8e079fef51bfd");
// 6660
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        fbRequestsList: {\n            container_id: \"u_0_3j\"\n        }\n    },\n    css: [\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    id: \"fbRequestsList\",\n    phase: 4\n});");
// 6667
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        timeline_sticky_header: {\n            container_id: \"u_0_3t\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineStickyHeader\",\"init\",[\"m_0_7m\",],[{\n            __m: \"m_0_7m\"\n        },],],[\"SubscribeButton\",\"init\",[\"m_0_7p\",\"m_0_7o\",\"m_0_7q\",],[{\n            __m: \"m_0_7p\"\n        },{\n            __m: \"m_0_7o\"\n        },{\n            __m: \"m_0_7q\"\n        },\"1055580469\",0,false,],],[\"m_0_7p\",],[\"m_0_7q\",],[\"m_0_7v\",],[\"m_0_7u\",],[\"AddFriendButton\",\"init\",[\"m_0_7y\",],[{\n            __m: \"m_0_7y\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],[\"TimelineStickyHeaderNav\",\"init\",[\"m_0_7z\",],[{\n            __m: \"m_0_7z\"\n        },{\n            custom_subsection_menu: false\n        },],],],\n        instances: [[\"m_0_7v\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_7w\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_7w\"\n        },],3,],[\"m_0_7q\",[\"HoverButton\",\"m_0_7s\",\"m_0_7u\",\"m_0_7t\",],[{\n            __m: \"m_0_7s\"\n        },{\n            __m: \"m_0_7u\"\n        },{\n            __m: \"m_0_7t\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_7u\",[\"HoverFlyout\",\"m_0_7v\",\"m_0_7x\",],[{\n            __m: \"m_0_7v\"\n        },{\n            __m: \"m_0_7x\"\n        },150,150,],3,],[\"m_0_7p\",[\"SwapButtonDEPRECATED\",\"m_0_7o\",\"m_0_7r\",],[{\n            __m: \"m_0_7o\"\n        },{\n            __m: \"m_0_7r\"\n        },false,],3,],],\n        elements: [[\"m_0_7t\",\"u_0_3n\",2,\"m_0_7w\",],[\"m_0_7y\",\"u_0_3p\",2,],[\"m_0_7n\",\"u_0_3k\",2,],[\"m_0_7r\",\"u_0_3m\",2,],[\"m_0_7m\",\"u_0_3s\",2,],[\"m_0_7x\",\"u_0_3m\",2,],[\"m_0_7z\",\"u_0_3r\",4,],[\"m_0_7s\",\"u_0_3m\",2,],[\"m_0_7o\",\"u_0_3l\",4,],],\n        markup: [[\"m_0_7w\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_3n\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"VPsP4\",\"UmFO+\",\"veUjj\",\"j1x0z\",],\n    bootloadable: {\n        StickyController: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"R940f\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"R940f\",\"dShSX\",\"OYzUx\",\"cstCX\",],\n    id: \"timeline_sticky_header\",\n    phase: 4\n});");
// 6668
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sd3735cb42b77369cc848e96eeb073b0242f78cd5");
// 6669
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        timeline_sticky_header: {\n            container_id: \"u_0_3t\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineStickyHeader\",\"init\",[\"m_0_7m\",],[{\n            __m: \"m_0_7m\"\n        },],],[\"SubscribeButton\",\"init\",[\"m_0_7p\",\"m_0_7o\",\"m_0_7q\",],[{\n            __m: \"m_0_7p\"\n        },{\n            __m: \"m_0_7o\"\n        },{\n            __m: \"m_0_7q\"\n        },\"1055580469\",0,false,],],[\"m_0_7p\",],[\"m_0_7q\",],[\"m_0_7v\",],[\"m_0_7u\",],[\"AddFriendButton\",\"init\",[\"m_0_7y\",],[{\n            __m: \"m_0_7y\"\n        },1055580469,null,\"profile_button\",\"none\",\"/ajax/add_friend/action.php\",\"\",true,null,false,null,0,],],[\"FriendStatus\",\"setSpecialLists\",[],[{\n            close: 1374283956118870,\n            acq: \"100006118350059_124542800973931\"\n        },],],[\"TimelineStickyHeaderNav\",\"init\",[\"m_0_7z\",],[{\n            __m: \"m_0_7z\"\n        },{\n            custom_subsection_menu: false\n        },],],],\n        instances: [[\"m_0_7v\",[\"ContextualDialog\",\"ContextualDialogArrow\",\"ContextualDialogDefaultTheme\",\"LayerRemoveOnHide\",\"LayerHideOnTransition\",\"LayerFadeOnShow\",\"LayerHideOnEscape\",\"ContextualLayerAutoFlip\",\"DialogHideOnSuccess\",\"m_0_7w\",],[{\n            width: null,\n            context: null,\n            contextID: null,\n            contextSelector: null,\n            position: \"below\",\n            alignment: \"left\",\n            offsetX: 0,\n            offsetY: 0,\n            arrowBehavior: {\n                __m: \"ContextualDialogArrow\"\n            },\n            theme: {\n                __m: \"ContextualDialogDefaultTheme\"\n            },\n            addedBehaviors: [{\n                __m: \"LayerRemoveOnHide\"\n            },{\n                __m: \"LayerHideOnTransition\"\n            },{\n                __m: \"LayerFadeOnShow\"\n            },{\n                __m: \"LayerHideOnEscape\"\n            },{\n                __m: \"ContextualLayerAutoFlip\"\n            },{\n                __m: \"DialogHideOnSuccess\"\n            },]\n        },{\n            __m: \"m_0_7w\"\n        },],3,],[\"m_0_7q\",[\"HoverButton\",\"m_0_7s\",\"m_0_7u\",\"m_0_7t\",],[{\n            __m: \"m_0_7s\"\n        },{\n            __m: \"m_0_7u\"\n        },{\n            __m: \"m_0_7t\"\n        },\"/ajax/lists/interests_menu.php?profile_id=1055580469&list_location=follow_1&follow_location=1\",],3,],[\"m_0_7u\",[\"HoverFlyout\",\"m_0_7v\",\"m_0_7x\",],[{\n            __m: \"m_0_7v\"\n        },{\n            __m: \"m_0_7x\"\n        },150,150,],3,],[\"m_0_7p\",[\"SwapButtonDEPRECATED\",\"m_0_7o\",\"m_0_7r\",],[{\n            __m: \"m_0_7o\"\n        },{\n            __m: \"m_0_7r\"\n        },false,],3,],],\n        elements: [[\"m_0_7t\",\"u_0_3n\",2,\"m_0_7w\",],[\"m_0_7y\",\"u_0_3p\",2,],[\"m_0_7n\",\"u_0_3k\",2,],[\"m_0_7r\",\"u_0_3m\",2,],[\"m_0_7m\",\"u_0_3s\",2,],[\"m_0_7x\",\"u_0_3m\",2,],[\"m_0_7z\",\"u_0_3r\",4,],[\"m_0_7s\",\"u_0_3m\",2,],[\"m_0_7o\",\"u_0_3l\",4,],],\n        markup: [[\"m_0_7w\",{\n            __html: \"\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv\\u003E\\u003Cdiv id=\\\"u_0_3n\\\"\\u003E\\u003Cimg class=\\\"mal pal -cx-PRIVATE-uiHoverButton__loading center img\\\" src=\\\"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/LOOn0JtHNzb.gif\\\" alt=\\\"\\\" width=\\\"16\\\" height=\\\"16\\\" /\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\\u003C/div\\u003E\"\n        },3,],]\n    },\n    css: [\"VPsP4\",\"UmFO+\",\"veUjj\",\"j1x0z\",],\n    bootloadable: {\n        StickyController: {\n            resources: [\"OH3xD\",\"f7Tpb\",\"UmFO+\",\"R940f\",],\n            \"module\": true\n        }\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"R940f\",\"dShSX\",\"OYzUx\",\"cstCX\",],\n    id: \"timeline_sticky_header\",\n    phase: 4\n});");
// 6676
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"timeline_tab_content_extra\",\n    content: {\n        timeline_section_placeholders: {\n            container_id: \"u_0_41\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_80\",],[{\n            __m: \"m_0_80\"\n        },\"year_2013\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_81\",],[{\n            __m: \"m_0_81\"\n        },\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 8,\n            filter_after_timestamp: 1359397173,\n            section_pagelet_id: \"pagelet_timeline_year_current\",\n            load_immediately: false\n        },false,null,1,\"1.75\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_82\",],[{\n            __m: \"m_0_82\"\n        },\"year_2012\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_83\",],[{\n            __m: \"m_0_83\"\n        },\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_last\",\n            load_immediately: false\n        },false,null,2,\"24.648440122605\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_84\",],[{\n            __m: \"m_0_84\"\n        },\"year_2011\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_85\",],[{\n            __m: \"m_0_85\"\n        },\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2011\",\n            load_immediately: false\n        },false,null,3,\"6.5829925537109\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_86\",],[{\n            __m: \"m_0_86\"\n        },\"year_2008\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_87\",],[{\n            __m: \"m_0_87\"\n        },\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2008\",\n            load_immediately: false\n        },false,null,6,\"13.875\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_88\",],[{\n            __m: \"m_0_88\"\n        },\"way_back\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_89\",],[{\n            __m: \"m_0_89\"\n        },\"way_back\",{\n            profile_id: 1055580469,\n            start: 1167638400,\n            end: 1199174399,\n            query_type: 11,\n            section_pagelet_id: \"pagelet_timeline_wayback\",\n            load_immediately: false\n        },false,null,7,-1,],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_8a\",],[{\n            __m: \"m_0_8a\"\n        },\"year_2009\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_8b\",],[{\n            __m: \"m_0_8b\"\n        },\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2009\",\n            load_immediately: false\n        },false,null,5,\"14.0224609375\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_8c\",],[{\n            __m: \"m_0_8c\"\n        },\"year_2010\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_8d\",],[{\n            __m: \"m_0_8d\"\n        },\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2010\",\n            load_immediately: false\n        },false,null,4,\"9.1259155273438\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 9\n        },],],],\n        elements: [[\"m_0_83\",\"pagelet_timeline_year_last\",2,],[\"m_0_85\",\"pagelet_timeline_year_2011\",2,],[\"m_0_89\",\"pagelet_timeline_wayback\",2,],[\"m_0_80\",\"u_0_3u\",2,],[\"m_0_81\",\"pagelet_timeline_year_current\",2,],[\"m_0_82\",\"u_0_3v\",2,],[\"m_0_88\",\"u_0_3y\",2,],[\"m_0_8a\",\"u_0_3z\",2,],[\"m_0_86\",\"u_0_3x\",2,],[\"m_0_8c\",\"u_0_40\",2,],[\"m_0_8d\",\"pagelet_timeline_year_2010\",2,],[\"m_0_84\",\"u_0_3w\",2,],[\"m_0_87\",\"pagelet_timeline_year_2008\",2,],[\"m_0_8b\",\"pagelet_timeline_year_2009\",2,],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",],\n    id: \"timeline_section_placeholders\",\n    phase: 4\n});");
// 6677
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s7a7d3c668af3542f1f7f088789c284d2c2c7d506");
// 6678
geval("bigPipe.onPageletArrive({\n    append: \"timeline_tab_content_extra\",\n    JSBNG__content: {\n        timeline_section_placeholders: {\n            container_id: \"u_0_41\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_80\",],[{\n            __m: \"m_0_80\"\n        },\"year_2013\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_81\",],[{\n            __m: \"m_0_81\"\n        },\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 8,\n            filter_after_timestamp: 1359397173,\n            section_pagelet_id: \"pagelet_timeline_year_current\",\n            load_immediately: false\n        },false,null,1,\"1.75\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2013\",{\n            profile_id: 1055580469,\n            start: 1357027200,\n            end: 1388563199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_82\",],[{\n            __m: \"m_0_82\"\n        },\"year_2012\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_83\",],[{\n            __m: \"m_0_83\"\n        },\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_last\",\n            load_immediately: false\n        },false,null,2,\"24.648440122605\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2012\",{\n            profile_id: 1055580469,\n            start: 1325404800,\n            end: 1357027199,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_84\",],[{\n            __m: \"m_0_84\"\n        },\"year_2011\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_85\",],[{\n            __m: \"m_0_85\"\n        },\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2011\",\n            load_immediately: false\n        },false,null,3,\"6.5829925537109\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2011\",{\n            profile_id: 1055580469,\n            start: 1293868800,\n            end: 1325404799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_86\",],[{\n            __m: \"m_0_86\"\n        },\"year_2008\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_87\",],[{\n            __m: \"m_0_87\"\n        },\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2008\",\n            load_immediately: false\n        },false,null,6,\"13.875\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2008\",{\n            profile_id: 1055580469,\n            start: 1199174400,\n            end: 1230796799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_88\",],[{\n            __m: \"m_0_88\"\n        },\"way_back\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_89\",],[{\n            __m: \"m_0_89\"\n        },\"way_back\",{\n            profile_id: 1055580469,\n            start: 1167638400,\n            end: 1199174399,\n            query_type: 11,\n            section_pagelet_id: \"pagelet_timeline_wayback\",\n            load_immediately: false\n        },false,null,7,-1,],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_8a\",],[{\n            __m: \"m_0_8a\"\n        },\"year_2009\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_8b\",],[{\n            __m: \"m_0_8b\"\n        },\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2009\",\n            load_immediately: false\n        },false,null,5,\"14.0224609375\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2009\",{\n            profile_id: 1055580469,\n            start: 1230796800,\n            end: 1262332799,\n            query_type: 9\n        },],],[\"TimelineContentLoader\",\"loadSectionOnClick\",[\"m_0_8c\",],[{\n            __m: \"m_0_8c\"\n        },\"year_2010\",],],[\"TimelineContentLoader\",\"registerTimePeriod\",[\"m_0_8d\",],[{\n            __m: \"m_0_8d\"\n        },\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 8,\n            section_pagelet_id: \"pagelet_timeline_year_2010\",\n            load_immediately: false\n        },false,null,4,\"9.1259155273438\",],],[\"TimelineContentLoader\",\"setExpandLoadDataForSection\",[],[\"year_2010\",{\n            profile_id: 1055580469,\n            start: 1262332800,\n            end: 1293868799,\n            query_type: 9\n        },],],],\n        elements: [[\"m_0_83\",\"pagelet_timeline_year_last\",2,],[\"m_0_85\",\"pagelet_timeline_year_2011\",2,],[\"m_0_89\",\"pagelet_timeline_wayback\",2,],[\"m_0_80\",\"u_0_3u\",2,],[\"m_0_81\",\"pagelet_timeline_year_current\",2,],[\"m_0_82\",\"u_0_3v\",2,],[\"m_0_88\",\"u_0_3y\",2,],[\"m_0_8a\",\"u_0_3z\",2,],[\"m_0_86\",\"u_0_3x\",2,],[\"m_0_8c\",\"u_0_40\",2,],[\"m_0_8d\",\"pagelet_timeline_year_2010\",2,],[\"m_0_84\",\"u_0_3w\",2,],[\"m_0_87\",\"pagelet_timeline_year_2008\",2,],[\"m_0_8b\",\"pagelet_timeline_year_2009\",2,],]\n    },\n    css: [\"j1x0z\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",],\n    id: \"timeline_section_placeholders\",\n    phase: 4\n});");
// 6685
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    content: {\n        pagelet_timeline_recent_more_pager: {\n            container_id: \"u_0_43\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"updatePagerAfterLoad\",[\"m_0_8e\",],[{\n            __m: \"m_0_8e\"\n        },\"u_0_1a\",\"recent\",\"0\",true,],],],\n        elements: [[\"m_0_8e\",\"pagelet_timeline_recent_pager_1\",2,],]\n    },\n    css: [\"j1x0z\",\"veUjj\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",],\n    jscc_map: \"({\\\"jp1njVsiFS9h1xdp9Yi0\\\":function(){return new ScrollingPager(\\\"u_0_42\\\", \\\"ProfileTimelineSectionPagelet\\\", {\\\"profile_id\\\":1055580469,\\\"start\\\":0,\\\"end\\\":1375340399,\\\"query_type\\\":39,\\\"page_index\\\":1,\\\"section_container_id\\\":\\\"u_0_1a\\\",\\\"section_pagelet_id\\\":\\\"pagelet_timeline_recent\\\",\\\"unit_container_id\\\":\\\"u_0_19\\\",\\\"current_scrubber_key\\\":\\\"recent\\\",\\\"time_cutoff\\\":null,\\\"buffer\\\":50,\\\"require_click\\\":false,\\\"showing_esc\\\":false,\\\"adjust_buffer\\\":true,\\\"tipld\\\":{\\\"sc\\\":4,\\\"rc\\\":12},\\\"num_visible_units\\\":8,\\\"remove_dupes\\\":true}, {\\\"usePipe\\\":true,\\\"jsNonblock\\\":true,\\\"buffer\\\":50,\\\"constHeight\\\":true,\\\"target_id\\\":\\\"u_0_19\\\"});}})\",\n    onload: [\"JSCC.get(\\\"jp1njVsiFS9h1xdp9Yi0\\\").register();\",],\n    id: \"pagelet_timeline_recent_more_pager\",\n    phase: 4\n});");
// 6686
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sa0e5ed26581842d8138a5a60f1bb3d0304df569c");
// 6687
geval("bigPipe.onPageletArrive({\n    JSBNG__content: {\n        pagelet_timeline_recent_more_pager: {\n            container_id: \"u_0_43\"\n        }\n    },\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"updatePagerAfterLoad\",[\"m_0_8e\",],[{\n            __m: \"m_0_8e\"\n        },\"u_0_1a\",\"recent\",\"0\",true,],],],\n        elements: [[\"m_0_8e\",\"pagelet_timeline_recent_pager_1\",2,],]\n    },\n    css: [\"j1x0z\",\"veUjj\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",\"xfhln\",],\n    jscc_map: \"({\\\"jp1njVsiFS9h1xdp9Yi0\\\":function(){return new ScrollingPager(\\\"u_0_42\\\", \\\"ProfileTimelineSectionPagelet\\\", {\\\"profile_id\\\":1055580469,\\\"start\\\":0,\\\"end\\\":1375340399,\\\"query_type\\\":39,\\\"page_index\\\":1,\\\"section_container_id\\\":\\\"u_0_1a\\\",\\\"section_pagelet_id\\\":\\\"pagelet_timeline_recent\\\",\\\"unit_container_id\\\":\\\"u_0_19\\\",\\\"current_scrubber_key\\\":\\\"recent\\\",\\\"time_cutoff\\\":null,\\\"buffer\\\":50,\\\"require_click\\\":false,\\\"showing_esc\\\":false,\\\"adjust_buffer\\\":true,\\\"tipld\\\":{\\\"sc\\\":4,\\\"rc\\\":12},\\\"num_visible_units\\\":8,\\\"remove_dupes\\\":true}, {\\\"usePipe\\\":true,\\\"jsNonblock\\\":true,\\\"buffer\\\":50,\\\"constHeight\\\":true,\\\"target_id\\\":\\\"u_0_19\\\"});}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jp1njVsiFS9h1xdp9Yi0\\\").register();\",],\n    id: \"pagelet_timeline_recent_more_pager\",\n    phase: 4\n});");
// 6694
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    append: \"rightColContent\",\n    content: {\n        pagelet_timeline_scrubber: {\n            container_id: \"u_0_45\"\n        }\n    },\n    css: [\"VPsP4\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"nxD7O\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"R940f\",],\n    jscc_map: \"({\\\"jq1kBbeqgdD1pvozjpI0\\\":function(){return new TimelineMainScrubber($(\\\"u_0_44\\\"));}})\",\n    onload: [\"JSCC.get(\\\"jq1kBbeqgdD1pvozjpI0\\\")\",],\n    id: \"pagelet_timeline_scrubber\",\n    phase: 4\n});");
// 6695
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sc7483e9518dc4576991807d5ccecc05757a39433");
// 6696
geval("bigPipe.onPageletArrive({\n    append: \"rightColContent\",\n    JSBNG__content: {\n        pagelet_timeline_scrubber: {\n            container_id: \"u_0_45\"\n        }\n    },\n    css: [\"VPsP4\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"nxD7O\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"R940f\",],\n    jscc_map: \"({\\\"jq1kBbeqgdD1pvozjpI0\\\":function(){return new TimelineMainScrubber($(\\\"u_0_44\\\"));}})\",\n    JSBNG__onload: [\"JSCC.get(\\\"jq1kBbeqgdD1pvozjpI0\\\")\",],\n    id: \"pagelet_timeline_scrubber\",\n    phase: 4\n});");
// 6703
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_side_ads\",],\n    content: {\n        u_0_2s: {\n            container_id: \"u_0_47\"\n        }\n    },\n    jsmods: {\n        require: [[\"Arbiter\",\"inform\",[],[\"netego_loaded\",null,],],[\"NetEgo\",\"setup\",[],[6011858202131,],],[\"NetEgo\",\"setup\",[],[6007957621675,],],[\"NetEgo\",\"setup\",[],[6007651357550,],],[\"NetEgo\",\"setup\",[],[6010680301716,],],[\"NetEgo\",\"setup\",[],[6007882470930,],],[\"AdblockDetectorLogging\",\"assertUnblocked\",[\"m_0_8f\",],[{\n            __m: \"m_0_8f\"\n        },],],[\"TimelineController\",\"setAdsTracking\",[],[{\n            6011858202131: \"AQIXjFzVnyt1gEiMA7PSjcl3XmzMZUyVflJXFslG5Of2LEwTXJHqaA9JDrM-zCNYfqyTAu63OtlDGRuHlR3xlp2ypN4yjcGVbl3yDy0u0KPdMvJfxIoE_lcAGP0SpnC0i-IuPNJqTDfbUJ6xmXin26Ek0_2_S1UMwaRFkoMMahhEkeZJO96iHSsBKpPAlgdsWci2r6dRvGMHXI3PRjIZ97dC1AqbYC_P1ipH7Dw3RmQLuWt_vvctnoC3xuVopNkCbG3cp8BWnaFJeag4GCxKxdBDDsxjpNun0bH03qlKDh-81b23skzeT4u2bcA01Epwvl2XH3WedOSxZEd0YCWL1a9iT0mjmzYjc7Ft7zGBEmOYiEPzgAqJ1F4DWAJ42puZS6Nt4iIgXXUq4EE9pFGb4kSS5VLQeWAVfOCRIX-DXFLF4gHoACqiXXSPpHOAk46cLmlfMi_g9Z1dbZVac3y0J6gJGR1A_apUwOzsvUuwWsxn5BbPpjJb1IEy4v3yozT55pt6TYp5uyY4sG2Bn8yb_I2bCePXK_307CTQBKssaOXS7bzgjtc1We7vCI1FC1M5g3wxFfiuGLDoI9V9li55IFWBg-hVHDS8xc5KtiVEIcMt50vjxaljt4-hT2kwTZ-PRPzRXESthjjege4p8hu1y1VUfffWsYtFX6csLvpWL7T7LKySWm8I5wCtjSrTstyzH5hbqnvuixZeYbVKxWblBOPUOMK7PcF8rVk_wWUprzxgH9qeWu2L2EgOqY-avhhtzpOfXufsf0hDHkqPEUt3ZONuytotJuwvXegAdIJ2xyimANjpc82RFZtwjzLXzjPCFHKbfCU4y-EsUez_y-c_zKcGQpwFBmFSXvVt-MKhK0RPTw0rArt8fVcIS3onO1J1CEtsDCaRDKgidaTftd9vc3ajmOPKoN9T2F97ek4Eag_6PdRB24JMPplUFXhkY2fEYkpIi_SVvEYrv-xSnH1ZxdpP\",\n            6007957621675: \"AQLiT5UAYu2pJtLFxGMXsm1qit6S_bG_3r4VKPGonqOKfWV_i5bpwi6-G9k08_EjqZQqXu_GKCw4hM59IAVg-ADYNyME1vc_OM2jc_EfKBRdHAyfZGy2MncQrH9_Kr5acFvHEg8Vu23puqviAeJiZiM-Xq-FhRreO_YBQvFNhOFBGjNFXqgdThBrDMSzdwNDGsr2s7zOycrODxXHyGFwssdoXz_oESdwdq7DWd1aMR8niGA01M9dcc7K3jTVDpJb-H22ROtIk15-_s8OoIjTQ48LoVclQvlFQ6SL8_I5hJ1_aj-TytRnVWi-puF1kMlOrs-rrUgN6DFGZskvxJXBM7uFkaqoWpjiFZzraU2I8QeoghKy9P9jzMZ7fbDicA0RiqpAipuBFwWq1_AoPkinyChGWvQJgxoQ1wOq3O7xs1ECPCrPznwemW29s71GFiTXpneJf92CTj1OnEzgm_UirnJKRKYRVYS4oSxn1CL-VByecFHLVJZvfApbOpd0zFDbuIFADEwuInXPs_a96BDQITJR24h6mtpOy4ifxhm4YBvQPUeTyzUSPLZQkrC2f90kcj-IJ_-OVRNMLy8a8i6dFR8KmD8t4Jr-s1x-ULHDjzAR-YQ1BVEtyPudhpG6kuw8Kv8Ta0L5OC8fFrhFcK8o_WCnXNkGIca_b5ZKcuFT4Sx18NuQJwquQFH48-ifssNT9A6QiTbz28almxVU2lajyuRKxaLVT89dxN3550eVz76tqrY5-oyGQvo06HcE7fscMPKfSzGNTMRPJ8fjwKhHdL6ZpewOs3HboAI7XYHWF6S5spIdGBISwKnaBia7TpwBBNcZmciV_cda36zDiYfskRPRMydypGnN_d-crWWg-Woe2W3CMy2sXFtH1YGA8NXzp7FRi-1SFjJs4m9Lw2ZJVDjR3uOE8Gcj0R6k8tC7fVNUFLH0pUpxUwwgOkXhxX_T3yL7KTd5A_zkC0XDVAXPkcZF\",\n            6007651357550: \"AQJnhWF_HrXnQnvt-wuW04vsf33N17hxZ1VjLLUvG9Oe60mA-Jw5jSjNwBsFwojnTnPKLtCZL1bGEuM8nYwjqOtoGxVEK4GYwkcTLZ5bqi-3bGdgOTUmeKXm7XxPoVIzQ0UeooX4IRreCHIlQ0blVPH4k6HR_HGA6r7tykKBVrwwiwmlUkfV7wNOjGJE7s0qv8krqAf34VlMSHAaqRoMHy2p4O-dLI1qVdZ3ZIo7Cq9VqcyNX7SlOncOiOWE1olligTvWgFr8ccqixOEJgD-RygfXhKV90lMEBWKZ-IAQTu_x1aMufDt03CwTJazAcgPmNB8fkQ9Xm-VLUZCSH6Izny3dyiGYY5jJBj4h0mqZOfACJwfm72Qn6_BCPl3oyyFAXTCdTRIVzGALYoJR6TU4hn8XuU9VdEO8wsHjbW3_-_-S6kLqcE_Is3JlOjuZl05m9JxYQMS7rQdXZWIGi5GYzqoYHaMjPzBG2VAlWls-xJDizZBpFoYdiZSKOUHVbEJ1mlDfzEjyZQYXeFnlA2PQQHxsW4JHrXEPE_vkK1E4j9sWWArpBssI1_HAJIX5T0zfeQXxt7--Vqh2NeYEPC6xFRaeUyz5SJVzlbl04RwaQJBAmtwDzNG8JTIhpm-ueuFFXO1w2Zs3nvD5OvK7jgc5rp4BR0tlI5wuyupdoy9zlK6aU7X7tCmz9-abYeoMSd38u7wsJ8NJFU13iUFJ27gAwouJpdQxPbtA8IjaKPpC3NzXXow0p_MJSQxA5Wqd4oJjrmTiH26QWE3OqA_3v7zDFbD2LlcmX9Sp2BuVa4NX-3S-HkvYRZgvw4uLQECGpKMKAhE6-mM93VOVgL_SYVvkvI7yuIwKQazaERimjCHi1YgueYAQUkXkmYxq1pYayiPRk3ipNeJDa8arzDMyn0nZEE60os7gu5_xYfSiM6dYunwnoDCgc9qxdlB7UOiYn65wqYfVR5skqMUthmleZeb3n24TmCsb2wVa_X4eVICU557AQ\",\n            6010680301716: \"AQL2qB3F7L0VqeptVTsMnpcUoL3qjs0BSi_xgEx2n_XJccsA8l_IRj6UkmnoGmMTxyDdmJLsLw2SaZnDBSBq7V8llr9d8a-ZZkGKsrxmpYzfl5v-k_pmECbGIo16uJk6pKSmueCrzCJBk3-V1qcRE55tBpDxRo05MJemvAjo_hGXDfCgCKYpAi98v_aptZtkrtKtNPdSCz-zsC66BeaDotzzNi1udFeTjTEvcTsHTrk1hBojBiawZx8G12clKtTYGpfm0GDsx9JrvSJ5dzznm0gTUpmWOX-A3NBgvQZz7yMDKU39JqlLOqhXQl-lLK-8MvuqJOu9_cB9oiqS3wBQ5IZ2F7ZqlByWv-PkPxvc8EvMXMb0hrdJjvB8rSzKFbSwiBxe_L_h8zVril-ac0ehJhrGnvd3bmiFivFxiCGLsJojS6HN4BYrTJmlGK6Fi05OOPBqAZbFUNtRX-c7AIg2vdfC4Fqy-gH8B_iAw99e1sNY5-kJdVqreEWHopfgAWYvj2KEJOpIveNWUelU4E9tM0U6idEIUDW-MNyHgSSiqNcurCp0i4ZzoT9fyDtLkbR6NYiE0Mh1DjBVPhYfamTAQaOdtyrngfHjLqOC_WqcOo799w7o5B1eb4fGQY5ce9ZRE872Ht7S9mo9tc9GqgQf5d6Hkr4lCmEuZXstLDrauWmrqKjL7DeQxzyaI6PfkRyEf3Cg4WFIvlJOCoE2RMiKi2s71dWyFobqMH0zB1Z1ER8YCxzIWRynVv6mFqz2mGrC07itBxkNAgmIWyB1iGhN5o1Z7x2mF4kXgcbYbANphaTrCWAI212rSTJosv3uK3p20oAPdT6jr_ZXuPBe6lxaEyaD1OSdAZQEG830KxB09XDl6Towq7WJDqVw-gmsstCbLfR9UErlf0uwrC4wmHzCVjOE2U2ZVGwllIXM5XnIPfqgkTssnlp1J7Ua-MTV3JoJK04iYjGPs_t-7KeFYsjtvaxz\",\n            6007882470930: \"AQL_TwXjNLS-D5mFq2EjKUCtO_gL7WGZ5AvHPkQNEOIqFhvQuD3VhQVQrrZ3rk8sEaQhIZYQ8HVZGvYuERQbxFO5neVKD5BRXP8T1ERz_xymZnvj04ZoV0GSX-ofxRG-SC9Ey6mqJH0Ea2o3ocEO9SK6vPoO7zhH_Z267Y6b3wP7nMhL9qFoA-GJdx7jJOjnS1Cwm4uksA9QAE_h-ixgcjbRZddsngZH8K3kuO6HjOrjAc_o4yXV5WvCEMX1f5ky4Byzzrkx4858Mxh0KnrZY3bShVByJDEPvhA5WNWYM_QnYuIuBeXZ87VP8U7N7LcyfWNAEHA1Q6i3bZ0UGOGskBo9lwBoLnZlYyVcNb4Rr1hf9AaJEttH5lBICh6B89vsFVJNXopPYnk7UmPaVm4je5ZUrLmQ68dGgaReowi4Zoe5w83ndcsTAXmlS6goxhuUR1TiMqEybzvWSzY79r69xCZwmHP244TqwT1NZKRtCEbVSYlcoRbTUiuSopAw3CVfwvy4Fjjheqh4mYHbImJNMUL6BTN-yFXQ9LYsYHzj2EmxnfHnLwFxKbw6i2oe6BJ6n1YWIESRfMsJ5Rb3ag86itkEeJHcTmfoLlGJtAxOHaqXXQKfm8fY3YM0jHAo2kZKA1JDVk8BucobTd75BWeAI_qMXFxF_NU5viMGeafe8xDE4KWhSdA_k5WEfRCiNKNSMFCPdcw7IJpafnUO6vmTwUJlYa69q4USmZQXfnb85hCGcq-ldWa3wMD9aMSkJoe0X507qYvJTyriULhOrUOMVgDHpRh4zAi9a5FuYy6sa6rKTjPix_PuLvUK-sGwHEEz3iUErRTVd5Qc-cMTWBqNlWzw1BZCrsre6DcaxyOWSdOMQzgJr4Efj9XHJgdTfynWKGWusviF3Y_LkoCVmUqGdJOqKZz6ia22T2UAanD1AXZOol2-5mK6Zpgko364cag83gPMmEiqt8Ix4VO4EF3FBI8P\"\n        },],],],\n        elements: [[\"m_0_8f\",\"u_0_46\",2,],]\n    },\n    css: [\"veUjj\",\"HgCpx\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n        \"dm/WP\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/hXdibVSGozY.js\"\n        }\n    },\n    js: [\"OH3xD\",\"dm/WP\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",],\n    onload: [\"new EmuController(\\\"6011858202131-id_51f2904c3d16d9b66803454\\\", \\\"AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup--XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE--_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s\\\")\",\"new EmuController(\\\"6007957621675-id_51f2904c3d2240385237667\\\", \\\"AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24\\\")\",\"new EmuController(\\\"6007651357550-id_51f2904c3d26e5462905510\\\", \\\"AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W\\\")\",\"new EmuController(\\\"6010680301716-id_51f2904c3d2af8e11302550\\\", \\\"AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE\\\")\",\"new EmuController(\\\"6007882470930-id_51f2904c3d2ef2f25249809\\\", \\\"AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS--HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ\\\")\",],\n    id: \"u_0_2s\",\n    phase: 4\n});");
// 6704
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s5c91633d102c2c90d2309d9b6304fb8329aa8b87");
// 6705
geval("bigPipe.onPageletArrive({\n    display_dependency: [\"pagelet_side_ads\",],\n    JSBNG__content: {\n        u_0_2s: {\n            container_id: \"u_0_47\"\n        }\n    },\n    jsmods: {\n        require: [[\"Arbiter\",\"inform\",[],[\"netego_loaded\",null,],],[\"NetEgo\",\"setup\",[],[6011858202131,],],[\"NetEgo\",\"setup\",[],[6007957621675,],],[\"NetEgo\",\"setup\",[],[6007651357550,],],[\"NetEgo\",\"setup\",[],[6010680301716,],],[\"NetEgo\",\"setup\",[],[6007882470930,],],[\"AdblockDetectorLogging\",\"assertUnblocked\",[\"m_0_8f\",],[{\n            __m: \"m_0_8f\"\n        },],],[\"TimelineController\",\"setAdsTracking\",[],[{\n            6011858202131: \"AQIXjFzVnyt1gEiMA7PSjcl3XmzMZUyVflJXFslG5Of2LEwTXJHqaA9JDrM-zCNYfqyTAu63OtlDGRuHlR3xlp2ypN4yjcGVbl3yDy0u0KPdMvJfxIoE_lcAGP0SpnC0i-IuPNJqTDfbUJ6xmXin26Ek0_2_S1UMwaRFkoMMahhEkeZJO96iHSsBKpPAlgdsWci2r6dRvGMHXI3PRjIZ97dC1AqbYC_P1ipH7Dw3RmQLuWt_vvctnoC3xuVopNkCbG3cp8BWnaFJeag4GCxKxdBDDsxjpNun0bH03qlKDh-81b23skzeT4u2bcA01Epwvl2XH3WedOSxZEd0YCWL1a9iT0mjmzYjc7Ft7zGBEmOYiEPzgAqJ1F4DWAJ42puZS6Nt4iIgXXUq4EE9pFGb4kSS5VLQeWAVfOCRIX-DXFLF4gHoACqiXXSPpHOAk46cLmlfMi_g9Z1dbZVac3y0J6gJGR1A_apUwOzsvUuwWsxn5BbPpjJb1IEy4v3yozT55pt6TYp5uyY4sG2Bn8yb_I2bCePXK_307CTQBKssaOXS7bzgjtc1We7vCI1FC1M5g3wxFfiuGLDoI9V9li55IFWBg-hVHDS8xc5KtiVEIcMt50vjxaljt4-hT2kwTZ-PRPzRXESthjjege4p8hu1y1VUfffWsYtFX6csLvpWL7T7LKySWm8I5wCtjSrTstyzH5hbqnvuixZeYbVKxWblBOPUOMK7PcF8rVk_wWUprzxgH9qeWu2L2EgOqY-avhhtzpOfXufsf0hDHkqPEUt3ZONuytotJuwvXegAdIJ2xyimANjpc82RFZtwjzLXzjPCFHKbfCU4y-EsUez_y-c_zKcGQpwFBmFSXvVt-MKhK0RPTw0rArt8fVcIS3onO1J1CEtsDCaRDKgidaTftd9vc3ajmOPKoN9T2F97ek4Eag_6PdRB24JMPplUFXhkY2fEYkpIi_SVvEYrv-xSnH1ZxdpP\",\n            6007957621675: \"AQLiT5UAYu2pJtLFxGMXsm1qit6S_bG_3r4VKPGonqOKfWV_i5bpwi6-G9k08_EjqZQqXu_GKCw4hM59IAVg-ADYNyME1vc_OM2jc_EfKBRdHAyfZGy2MncQrH9_Kr5acFvHEg8Vu23puqviAeJiZiM-Xq-FhRreO_YBQvFNhOFBGjNFXqgdThBrDMSzdwNDGsr2s7zOycrODxXHyGFwssdoXz_oESdwdq7DWd1aMR8niGA01M9dcc7K3jTVDpJb-H22ROtIk15-_s8OoIjTQ48LoVclQvlFQ6SL8_I5hJ1_aj-TytRnVWi-puF1kMlOrs-rrUgN6DFGZskvxJXBM7uFkaqoWpjiFZzraU2I8QeoghKy9P9jzMZ7fbDicA0RiqpAipuBFwWq1_AoPkinyChGWvQJgxoQ1wOq3O7xs1ECPCrPznwemW29s71GFiTXpneJf92CTj1OnEzgm_UirnJKRKYRVYS4oSxn1CL-VByecFHLVJZvfApbOpd0zFDbuIFADEwuInXPs_a96BDQITJR24h6mtpOy4ifxhm4YBvQPUeTyzUSPLZQkrC2f90kcj-IJ_-OVRNMLy8a8i6dFR8KmD8t4Jr-s1x-ULHDjzAR-YQ1BVEtyPudhpG6kuw8Kv8Ta0L5OC8fFrhFcK8o_WCnXNkGIca_b5ZKcuFT4Sx18NuQJwquQFH48-ifssNT9A6QiTbz28almxVU2lajyuRKxaLVT89dxN3550eVz76tqrY5-oyGQvo06HcE7fscMPKfSzGNTMRPJ8fjwKhHdL6ZpewOs3HboAI7XYHWF6S5spIdGBISwKnaBia7TpwBBNcZmciV_cda36zDiYfskRPRMydypGnN_d-crWWg-Woe2W3CMy2sXFtH1YGA8NXzp7FRi-1SFjJs4m9Lw2ZJVDjR3uOE8Gcj0R6k8tC7fVNUFLH0pUpxUwwgOkXhxX_T3yL7KTd5A_zkC0XDVAXPkcZF\",\n            6007651357550: \"AQJnhWF_HrXnQnvt-wuW04vsf33N17hxZ1VjLLUvG9Oe60mA-Jw5jSjNwBsFwojnTnPKLtCZL1bGEuM8nYwjqOtoGxVEK4GYwkcTLZ5bqi-3bGdgOTUmeKXm7XxPoVIzQ0UeooX4IRreCHIlQ0blVPH4k6HR_HGA6r7tykKBVrwwiwmlUkfV7wNOjGJE7s0qv8krqAf34VlMSHAaqRoMHy2p4O-dLI1qVdZ3ZIo7Cq9VqcyNX7SlOncOiOWE1olligTvWgFr8ccqixOEJgD-RygfXhKV90lMEBWKZ-IAQTu_x1aMufDt03CwTJazAcgPmNB8fkQ9Xm-VLUZCSH6Izny3dyiGYY5jJBj4h0mqZOfACJwfm72Qn6_BCPl3oyyFAXTCdTRIVzGALYoJR6TU4hn8XuU9VdEO8wsHjbW3_-_-S6kLqcE_Is3JlOjuZl05m9JxYQMS7rQdXZWIGi5GYzqoYHaMjPzBG2VAlWls-xJDizZBpFoYdiZSKOUHVbEJ1mlDfzEjyZQYXeFnlA2PQQHxsW4JHrXEPE_vkK1E4j9sWWArpBssI1_HAJIX5T0zfeQXxt7--Vqh2NeYEPC6xFRaeUyz5SJVzlbl04RwaQJBAmtwDzNG8JTIhpm-ueuFFXO1w2Zs3nvD5OvK7jgc5rp4BR0tlI5wuyupdoy9zlK6aU7X7tCmz9-abYeoMSd38u7wsJ8NJFU13iUFJ27gAwouJpdQxPbtA8IjaKPpC3NzXXow0p_MJSQxA5Wqd4oJjrmTiH26QWE3OqA_3v7zDFbD2LlcmX9Sp2BuVa4NX-3S-HkvYRZgvw4uLQECGpKMKAhE6-mM93VOVgL_SYVvkvI7yuIwKQazaERimjCHi1YgueYAQUkXkmYxq1pYayiPRk3ipNeJDa8arzDMyn0nZEE60os7gu5_xYfSiM6dYunwnoDCgc9qxdlB7UOiYn65wqYfVR5skqMUthmleZeb3n24TmCsb2wVa_X4eVICU557AQ\",\n            6010680301716: \"AQL2qB3F7L0VqeptVTsMnpcUoL3qjs0BSi_xgEx2n_XJccsA8l_IRj6UkmnoGmMTxyDdmJLsLw2SaZnDBSBq7V8llr9d8a-ZZkGKsrxmpYzfl5v-k_pmECbGIo16uJk6pKSmueCrzCJBk3-V1qcRE55tBpDxRo05MJemvAjo_hGXDfCgCKYpAi98v_aptZtkrtKtNPdSCz-zsC66BeaDotzzNi1udFeTjTEvcTsHTrk1hBojBiawZx8G12clKtTYGpfm0GDsx9JrvSJ5dzznm0gTUpmWOX-A3NBgvQZz7yMDKU39JqlLOqhXQl-lLK-8MvuqJOu9_cB9oiqS3wBQ5IZ2F7ZqlByWv-PkPxvc8EvMXMb0hrdJjvB8rSzKFbSwiBxe_L_h8zVril-ac0ehJhrGnvd3bmiFivFxiCGLsJojS6HN4BYrTJmlGK6Fi05OOPBqAZbFUNtRX-c7AIg2vdfC4Fqy-gH8B_iAw99e1sNY5-kJdVqreEWHopfgAWYvj2KEJOpIveNWUelU4E9tM0U6idEIUDW-MNyHgSSiqNcurCp0i4ZzoT9fyDtLkbR6NYiE0Mh1DjBVPhYfamTAQaOdtyrngfHjLqOC_WqcOo799w7o5B1eb4fGQY5ce9ZRE872Ht7S9mo9tc9GqgQf5d6Hkr4lCmEuZXstLDrauWmrqKjL7DeQxzyaI6PfkRyEf3Cg4WFIvlJOCoE2RMiKi2s71dWyFobqMH0zB1Z1ER8YCxzIWRynVv6mFqz2mGrC07itBxkNAgmIWyB1iGhN5o1Z7x2mF4kXgcbYbANphaTrCWAI212rSTJosv3uK3p20oAPdT6jr_ZXuPBe6lxaEyaD1OSdAZQEG830KxB09XDl6Towq7WJDqVw-gmsstCbLfR9UErlf0uwrC4wmHzCVjOE2U2ZVGwllIXM5XnIPfqgkTssnlp1J7Ua-MTV3JoJK04iYjGPs_t-7KeFYsjtvaxz\",\n            6007882470930: \"AQL_TwXjNLS-D5mFq2EjKUCtO_gL7WGZ5AvHPkQNEOIqFhvQuD3VhQVQrrZ3rk8sEaQhIZYQ8HVZGvYuERQbxFO5neVKD5BRXP8T1ERz_xymZnvj04ZoV0GSX-ofxRG-SC9Ey6mqJH0Ea2o3ocEO9SK6vPoO7zhH_Z267Y6b3wP7nMhL9qFoA-GJdx7jJOjnS1Cwm4uksA9QAE_h-ixgcjbRZddsngZH8K3kuO6HjOrjAc_o4yXV5WvCEMX1f5ky4Byzzrkx4858Mxh0KnrZY3bShVByJDEPvhA5WNWYM_QnYuIuBeXZ87VP8U7N7LcyfWNAEHA1Q6i3bZ0UGOGskBo9lwBoLnZlYyVcNb4Rr1hf9AaJEttH5lBICh6B89vsFVJNXopPYnk7UmPaVm4je5ZUrLmQ68dGgaReowi4Zoe5w83ndcsTAXmlS6goxhuUR1TiMqEybzvWSzY79r69xCZwmHP244TqwT1NZKRtCEbVSYlcoRbTUiuSopAw3CVfwvy4Fjjheqh4mYHbImJNMUL6BTN-yFXQ9LYsYHzj2EmxnfHnLwFxKbw6i2oe6BJ6n1YWIESRfMsJ5Rb3ag86itkEeJHcTmfoLlGJtAxOHaqXXQKfm8fY3YM0jHAo2kZKA1JDVk8BucobTd75BWeAI_qMXFxF_NU5viMGeafe8xDE4KWhSdA_k5WEfRCiNKNSMFCPdcw7IJpafnUO6vmTwUJlYa69q4USmZQXfnb85hCGcq-ldWa3wMD9aMSkJoe0X507qYvJTyriULhOrUOMVgDHpRh4zAi9a5FuYy6sa6rKTjPix_PuLvUK-sGwHEEz3iUErRTVd5Qc-cMTWBqNlWzw1BZCrsre6DcaxyOWSdOMQzgJr4Efj9XHJgdTfynWKGWusviF3Y_LkoCVmUqGdJOqKZz6ia22T2UAanD1AXZOol2-5mK6Zpgko364cag83gPMmEiqt8Ix4VO4EF3FBI8P\"\n        },],],],\n        elements: [[\"m_0_8f\",\"u_0_46\",2,],]\n    },\n    css: [\"veUjj\",\"HgCpx\",\"UmFO+\",],\n    bootloadable: {\n    },\n    resource_map: {\n        \"dm/WP\": {\n            type: \"js\",\n            crossOrigin: 1,\n            src: \"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/hXdibVSGozY.js\"\n        }\n    },\n    js: [\"OH3xD\",\"dm/WP\",\"f7Tpb\",\"AVmr9\",\"/MWWQ\",\"nxD7O\",],\n    JSBNG__onload: [\"new EmuController(\\\"6011858202131-id_51f2904c3d16d9b66803454\\\", \\\"AQKeJQRxXzUhxhbYGaYgYDYhc3hQ30O_gQTSLytMewtlgvobJQH5MuaQJp4_fbqlG5W0Tung-9ZDLu-ztha3uNKKYrj85XEwPZJe-GO5gSUpcbVv7zETufLCcsIh674v1O83EtmtVxQup--XRKCr8pDY6xXlObOVvP0yoR1v_0IsC_JNt4xvJexprbqQTr6TjUMjQqtWJuu_sR7XhSWsgEH77as7rCQK0ip1DLeFa5567J46KjYuY2hQDqbzl6Mn7OvS3aEBGU4eBGAY58-SYeJ3W9bKPJYqCx9Bkwjmr9B41iWSaz5Ki6YhderlMBA9Dfg8s-1uj70k8nthPqKnwV1w5lP8Y0wOJzgBx5REj425joGQHMG-M_8PpRRjctnVo0LFsHvpUwBFLO7MVy5Og1KQZjJbE40w4N-x7jjVGgZq3mmVr1m7FmevdJl8nrJTDv_61sG9Uw4skERHbsU3NMtwgzADe1akrFYllUuYsbHMLFGwEqD3-TfoHOV94O58Hq_kOSziDKTYYmlFw6eNCJjlthWbCrTLAH9HcCNJdJxdyWr9uUWB8uubJXGdnSjD7HJ3aApft4dhnW_AcVsiT0FvlWqla1mQYmmFc0CWULTtH-H1ePnhErOS6wUI-7bUXTGD8Npu2iUdkxK8l13OeUzhoqIw0cZweNRNFpjsV-wt043C0sr5JcldR5ptLS3Ka5X8VOnkoeczYv17rPjOgAzVJvV-RTTZA72Ll0zSKYma-N3NUhZ9x5EZzTYtbw8f9maqVWx7S1WU1AD8h7NcQq0Cl7orO5GHXP_1n1jVkp-KV9rALdyuek_JD5B8TTULG_AZrDe4S1HIPG1FE8wnH8-Q9Iy6s5zKVH2X-xlJNRqaIxNyaGLj0WH9PYYFaQU8YnakM4_r-3nFy6ki7-cEoDZK3qcw7PJCp9w-iSgN9hVe2WFESd0t8pfpI0WTc6lf5ErS0yfqFsj4LPsnQJjr8Ugn3-pX4_51v7LvRfVqnrwBcEJv_da-58RdvJw-hKx6uClKEfzl6Zm4phRloZSqpxb-Zq4UeR34E6ATI9aQYs46sfH5-CilrxxE-gHzA4WxTNGFXv0Nabb01JJVZx0qbuEfSuE--_IiNWgOoF1vr9SiJfYXVQ9ofCEvj6viyzWx1jxp_a1PpUBVzpBMC9ZvXfPuxnrBqF7iQJeJGHETu7XrTrkW7RhAZSTWpJKN2ufGQjeAlCyZeKOaJkwtp7y4dC8M4KjVLz7L-1FenhrLC0_ERM1QoTmgAYBKV2sPS6tCjdkCK4PYQo76-U4OdzM_kG2s\\\")\",\"new EmuController(\\\"6007957621675-id_51f2904c3d2240385237667\\\", \\\"AQLVAEr0JNIXHSlB-t1lt9Eixl6c4gkbuzVzVjL2frflXuYtFtrkvniUnm1Ku41tGCz7o3_vAgaHc_cm0KSk80Qn5KeG7SBu4gMjRWo6WTgHRYBuM5oy8HMWqE2Pc679lHqnSR_shRQD-voE8av-VW6uhejuFIKsYxQla8mJLMIcQjP3YwlX6FBEpi3IVDI7GysDpA3w55At5HB5Z4onn49-VAvhzAroPkfTP4ed7wRi6oKUIM0AwqhWvC3FrpzbYJQIbYePYuwGg0CAbWsYVqmHHIDp2LDaZf1MyEHBSB4edMf2GSbcR0dckr9I7r5wjuhr0MNu6x1Sc-gKyyTNy7OlvCvkzo0KCx0W1IEMqrzTB5bUX8tpAHpI2ai-deBrz8z6wERn75PMsjuCU9Y0J1OON89nEwJfV7EEAXRKUUuTa_hVHUV7ivmvG6mIgiU0MnkXdt5V_Yq68vbPMu305u-1HqvHNJG0NAcM2fCCIDcFeYVMgDQEr2FmsPA4pEM_4wzNUrZ0zXILjZEsaEiCfsHAdLK4-vtwErPb4oMyBgM-mw7Q-7Vwz7HcDAQZPCdQwsJuwcxzsevzSdBGTLem4jFqySTOWOqAaNV-Zpe_H-GNPxgrMO6TBdKDo3LC2_XdWwWmZ0_qF8qpZMvxwLLn_iJkUdQiW8CFuM3V18oROQpnqij5FULDzEPAXXPDZgW76SG2ZKac8r_z-40vmvcVwJ5vYBw692SkNfAFr2xZy4r9Q4q0bm64Ynng_cGt3oJE8ACtqbIsrMDpasTUpbDt7YNTJBLwaYHUiyNTeRtZTuLbZuKfsS43LNJyRGrlCRdnG4Hg5wZyWBEbb8RAUQ9LTS75RCdUIv4-QvEGjZQOBQYnK-xUKXm9ee6pYyx5mvDsgVg4u9QuBEvz5rnUUV8Do8JGAkD3POmEw_1OeNp0oRY-N5zuvt8cg6p_ToCKlOlbHkDyzz0xRt1Zuv4t7_6SLlzBFt5ctsFLL_GuXd0l6VrKKb2E9XB3s_uWtGgzMMMth1RxVfm5RhCK-T35_udWEzRHQiE1ZZ7BAtx-Bck8Bvz_rqbXRRIP6OSKdpnu7DK5CnJKNu23VXkM6CwoeAh28lMZzPSyYdJovN7ZUVbWFbSEiHfJtT8pMwvpTsDQDM9DdYJz7eERqAu_C_XDIstBY9camapiI983pIS3A3UEoTMLjb3DmgF8M5WdkJvMv_ca0oMSZg0ZBE-xMNPypKnvrxkzFgiLKBCNk6Gy0ub2919oLCHe0yhL3C533CfOBq7fAQom3JAK21VmnzsndPjbsj24\\\")\",\"new EmuController(\\\"6007651357550-id_51f2904c3d26e5462905510\\\", \\\"AQL1hMzGDmRq_jGTMlTKJmQ1tWzYqTX1hYaAqONxRw3GgGVHJ_gEb1mb_22W5RpjgPEvYQ6iUHKM7Zuyyyv0Cx5BMJPL788LwavUCp3eJO8EIfVcxsQxPEH65GZjzV8kd4cWTTBMtGV-ANChcFXZuY8pHwWEiGUZ037op7NgKVbOrBiq05kvjf9hNdk3-hEsflaGS1qDa89TjbLLOnKvBAXLgKaND10JtJptCNAq_FX7KuYV-WaG8ad1w2eDAqNch7LzuY7MzJT97imgiE0sE-hCSyZ7L7NQaeYtI6MrSEbqfKUe6SRgrrM66reyGiG6ixLR8kY1MdYRUfVJhoTf5lC_vekk8XdUHnTZfwze7pntL0e4WiAIeYIJwwvDxNZHwdWA0M6gXt6fUoyTEIYwqBdeaI2HtSujVcAqzPUNF9hp-m6Yf0xSf-orKOPv1-cxlFkE8qy3BIEzYNyB99gNIfdtaS3YuDT6x4gQIBGW4dnW0gWm88TzKhSkRfIJ8sW8L2PDPQ31mjN9_drR6NUQ0-L7-HrJpT3pTzqjJvdw8HVUwpDalb_MQ76ZhQ4A16iLvdV82D_530cZVYMA_T4Dh8eG4qlJzhU-qV10H6Iho0o47_ZeTJ8QLN_qvlSH9RHC6nsBwS7AAcbOHcAsp8wytPlE6nOrnR33s0ux81AAMhHPs1BKPbiC92mL6F9OAD6GfKPQxmS9g8G0V_8XikoObEJ1QzBF4jXejZ3-QZlUC8erxDfVLI2bOciLhwSefJl62CSFoQSLqzbF9Y5UgWRui190UNVDmRhONFD7ivW6YEX5iuYcY52eWyvQr32D_vA0uQOFRlklRgzNzyRLDmHVThIZYNwK_5JJvpRNLLEk8ILjYNU3inUUT4-SknA3VOUsEm8XNbSvhDuHqaIZKcV0ISy2dNO73ZPV1W1RosDZ_pcjYimQlQNjD-jOkXr-oVAqdwLLzowm2L0naT4FOzFosY28eKIWEkVkg_G0Na62L44u5PngWfy8SAgrfY7ZLEGVvbU4-3Ssh8aquPUTO6M8dNxJzdN0DXyoWJTNwW8GUD8gpqailll2w70R20ZWeSka1HaYxnlv9p_n_dCO64QjzEdPwg0l_3MtQDtx3LGquGoVBlR_neZYW5dKUYXDqEzMd8dMdqM6YcOYkLpE9RR3wAhqJVt-MCp7ZkitmQJ5adNq5_gB6TuQrNQVtY2qaoxckZsbrXlUFN2uEOGw31F0BEKD8FKbuWEyh5vUo5AG0G1Oo6QO1_kc8GJxPEkPXuzF1EwykkwuNPJZTWNJX5f-K_7W\\\")\",\"new EmuController(\\\"6010680301716-id_51f2904c3d2af8e11302550\\\", \\\"AQJo2STH8Z0ZkcKUkpL2hG0UgOJaWQ_5aI4nWcbBbXwIiats8_aOWw7t38eQeUOzjUm131gL2k7B8ZEGOSUev1PnIQ29Cf-nBdHF3y70ivkN1B2vddCIDXIoN_FVZmH3Gyk4b7kEPu3CW39RpTOpADPjnm2LfNsR1NH8mKyrjjnlumXaJlyFbbOY-6vl4bm3XNmWDqWpbTYoYkJympNP4omv2CjnrDHRIXTrlZ91aQJl_oOVqIwapteoL_f0Wun0y8bxRvCZmYuhv87WdsOPxU3qUQzJcz5_hpkUTe0kXMYLqdHwL_1ekLvalEXygQARqQruPs_duth8n2zGqHnDomE6Cljswm4jMbqyyyKqPBeMJ10alWZlu3OyeC4fSZsvmi61BVxLs9JqBrcVbNV3O0MLEOkpDpFfeKMNwCjE-ExA7a_KedWBXgy5UgJWY5IN5KPthKxqV85hIJVQ4HEWTzGIdvtOmWaGGLNawRtfMWzWYoYa2CLGz5urEOfIwVa_s80O-ge0-hNlD0_sIrKmCLx7GtJ5cDjCgq0-KtyH9jVGXuXSyTpa3QwFtP8-iIgtKQ_vix6rOC82Zm1dn0cYHirhDdNRFLweDv-lYIWuUiXj614SxOZbZ_X1yZ6Y7-7DdvCSRTygqg5IArqVfv_g9n6GV-pdpOsOYjzzvnGrOaoBd-OFBY_YosMPZdBf0v34tBecySFUI5MmhFHwYpWWymiNwO-brhC1B0D8H7uUcZ1QR-dJ_z_R7PiMc15qESH87TGB41EP_HSefotdTxSow1t1XbKHcbofloRyKib_44cYTva0Unf0bXDh3nyhotODl9lRz_7X15XlMEuE7333f_8FE4rf7qr253yzjOecOC30o9GXo-Vcth091OhfqhXFLuRcv9tK-KQRqYOFSGPMyBdMC70TMzf2MxkLQVcfBNr2qheCwCENg_4AkXZFd6EGJIeofLNsVd-HkgGWelPJ2r_kq_n7phs27az3W4BEm36v5Rf43IJrZxpONnlWE9SrXCyi_pypjqsBNdzImyIRfRRBK6QN9ziiElkxUJNo9SZS4mnJ0wEKXuhT68l-graHuJf2OJHxRWFucPP5J6BgLrVvRSxFAzwHS04BuLdZwDW6M0ZGauto2kkgAhpD_-fWyseltQc_LKuVb9x9OX6SlDhGv4o-D65T9Yh62x_9GYMwsqXj8wpt02CtXStX8aBevpXR_aZ0zCJxC2Gllqne98B5AJFycvK4aPALPJxk5pwyyFyOoO0Sj-JGxb26r3dJIBE\\\")\",\"new EmuController(\\\"6007882470930-id_51f2904c3d2ef2f25249809\\\", \\\"AQKxDHTm3nyv_XoZgRGgtFyuIx1Dl-9n9KW0L1jI-n5_opSFWrvem0PGojZ7-0RQzO_Tu3Iopn9rwuueiyZ5RFrEsiTTZTDtW5iMmkly6EQLyYfHQodVCV7m8Wvq-wfpSOIQPIHd_g2dXRMVBRH6wAp9bF0Ocv3Vf9hewGLIcMIZMXjU9zH4vh8hPOQxLRh1KfX_eF0__zzpS_2FYUERtJoaHTL3yukbYbhqVMylaq79mmWtMKz2oevMrBL6C9XfDJL8ZQatILXq8rH0GE1wjp6stwakFdPMcymodiW_gBgSIkgqgDoOBg0gTuptQbZQL-vOtG_4tSaE6u0zZ55AkBeWEIxoYaL8gdQxT6QF2gHsXsPY7iMfNhX_kDUz0yiwwoNVsHVNt0d5iGn2pI-nqWFXwXReMNpxMT3Dih2hszZ46hykc4-4efJk0x2y53rLD0aB72b3VNlSvxc2XYux0MeKqhaVZmkZ7IUBo5M3W1OET70-5X_hID2-ZL5vkKVowUbD8PRMRx6794x6_n5bs9DnagwWJv8Z5B6w3YfZK1iRnablKyFNGaiAaVkOi4mdLoFBe-rhRt2ZGi6lRpgh3YphAHVeVeX18YPqSIDfZZpoDkAcmhyd98QHnz4jKpYd09hEsnITc3GhbUKeLLvbevEcgDfVUEp2XdJUpujBFAtEVYuzlJQ6h81g69e7P9Ar2oB2sMbNSLEdXf8BqyRwajlmyL1hmAGXH0ctzJ5ObeQP9cRU-PTUeIB1XyXGwWyzvg5UMHpY5hu0yuyUXmwepvCxgpQoswwF5GrDdhIDifHAH7qdtPm0Ww5OWAuzJrXUrGnS--HM3V5vU7XJu2pw4iXtN3EvWeyo8MOQFrP-xr2JNI5DyLeJteh1Lb0Ax29Ze8XO5OmARtSq3MYMZSfa8AytYsBXQHGrpq7XrdFOV4yw2GV9_PBCux9l-D4yCGDHHNhnS7vVVrv6s5C1Ea4sVx86PN8IbKLoXOeI3Xcob8L9FAlT6-blUkqPMVMxHGREiFQSSh-HzSpiWdME_lqa_DuMhzuuEiDqwaZhuL0dEoJ6dX3bxAnEq7EFiaUwtmPFDAEGBAfgmxjM8OrvQLJTDdGxr_jZWEM7RFz9ATw2CPwMB7Jfxp7RpejOpLo6S4JFKNn3VemDxNDPI2mR83ybvgkApOGautfNG-a1DdbNjTCP5i36NpXyomF5OFRsKmVjRtmIX1xXmidb2pMvlx-XMj8Js1ZWq0Z6HODjep7RHMvMe47C7eD3uzY5m4lVXN9rC34WgXa9387CnFxIBuEj9wHQ\\\")\",],\n    id: \"u_0_2s\",\n    phase: 4\n});");
// 6711
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 4,\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"setParallelLoadConfig\",[],[{\n            required_units: 5,\n            max_parallelism: 3\n        },],],]\n    },\n    is_last: true,\n    css: [\"veUjj\",\"UmFO+\",\"c6lUE\",\"za92D\",\"j1x0z\",\"tKv6W\",\"ynBUm\",\"tAd6o\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"AVmr9\",\"I+n09\",\"4vv8/\",\"zBhY6\",\"f7Tpb\",\"OSd/n\",\"+P3v8\",\"js0se\",\"BjpNB\",\"/MWWQ\",\"G3fzU\",\"mBpeN\",\"C6rJk\",\"97Zhe\",\"nxD7O\",\"xfhln\",],\n    displayJS: [\"OH3xD\",],\n    the_end: true\n});");
// 6712
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s5c2d8a11f85516eb62851a399b106220268b7047");
// 6713
geval("bigPipe.onPageletArrive({\n    id: \"\",\n    phase: 4,\n    jsmods: {\n        require: [[\"TimelineContentLoader\",\"setParallelLoadConfig\",[],[{\n            required_units: 5,\n            max_parallelism: 3\n        },],],]\n    },\n    is_last: true,\n    css: [\"veUjj\",\"UmFO+\",\"c6lUE\",\"za92D\",\"j1x0z\",\"tKv6W\",\"ynBUm\",\"tAd6o\",],\n    bootloadable: {\n    },\n    resource_map: {\n    },\n    js: [\"OH3xD\",\"XH2Cu\",\"ociRJ\",\"AVmr9\",\"I+n09\",\"4vv8/\",\"zBhY6\",\"f7Tpb\",\"OSd/n\",\"+P3v8\",\"js0se\",\"BjpNB\",\"/MWWQ\",\"G3fzU\",\"mBpeN\",\"C6rJk\",\"97Zhe\",\"nxD7O\",\"xfhln\",],\n    displayJS: [\"OH3xD\",],\n    the_end: true\n});");
// 6721
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_231[0], o0,o72);
// undefined
o0 = null;
// undefined
o72 = null;
// 7308
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_234[0](o94);
// undefined
o94 = null;
// 8159
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"I+n09\",]);\n}\n;\n__d(\"legacy:connect-xd\", [\"XD\",], function(a, b, c, d) {\n    a.UnverifiedXD = b(\"XD\").UnverifiedXD;\n    a.XD = b(\"XD\").XD;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"Base64\", [], function(a, b, c, d, e, f) {\n    var g = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function h(l) {\n        l = ((((l.charCodeAt(0) << 16)) | ((l.charCodeAt(1) << 8))) | l.charCodeAt(2));\n        return String.fromCharCode(g.charCodeAt((l >>> 18)), g.charCodeAt((((l >>> 12)) & 63)), g.charCodeAt((((l >>> 6)) & 63)), g.charCodeAt((l & 63)));\n    };\n    var i = ((\"\\u003E___?456789:;\\u003C=_______\" + \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\u0009\\u000a\\u000b\\u000c\\u000d\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\") + \"______\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123\");\n    function j(l) {\n        l = (((((i.charCodeAt((l.charCodeAt(0) - 43)) << 18)) | ((i.charCodeAt((l.charCodeAt(1) - 43)) << 12))) | ((i.charCodeAt((l.charCodeAt(2) - 43)) << 6))) | i.charCodeAt((l.charCodeAt(3) - 43)));\n        return String.fromCharCode((l >>> 16), (((l >>> 8)) & 255), (l & 255));\n    };\n    var k = {\n        encode: function(l) {\n            l = unescape(encodeURI(l));\n            var m = (((l.length + 2)) % 3);\n            l = ((l + \"\\u0000\\u0000\".slice(m))).replace(/[\\s\\S]{3}/g, h);\n            return (l.slice(0, ((l.length + m) - 2)) + \"==\".slice(m));\n        },\n        decode: function(l) {\n            l = l.replace(/[^A-Za-z0-9+\\/]/g, \"\");\n            var m = (((l.length + 3)) & 3);\n            l = ((l + \"AAA\".slice(m))).replace(/..../g, j);\n            l = l.slice(0, ((l.length + m) - 3));\n            try {\n                return decodeURIComponent(escape(l));\n            } catch (n) {\n                throw new Error(\"Not valid UTF-8\");\n            };\n        },\n        encodeObject: function(l) {\n            return k.encode(JSON.stringify(l));\n        },\n        decodeObject: function(l) {\n            return JSON.parse(k.decode(l));\n        },\n        encodeNums: function(l) {\n            return String.fromCharCode.apply(String, l.map(function(m) {\n                return g.charCodeAt(((((m | -((m > 63)))) & -((m > 0))) & 63));\n            }));\n        }\n    };\n    e.exports = k;\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; (j && (j != document.body)); j = j.parentNode) {\n                    if ((!j.id || (typeof j.id !== \"string\"))) {\n                        continue;\n                    };\n                    if ((j.id.substr(0, 8) == \"pagelet_\")) {\n                        return j.id.substr(8)\n                    };\n                    if ((j.id.substr(0, 8) == \"box_app_\")) {\n                        return j.id\n                    };\n                    if (i[j.id]) {\n                        return j.id\n                    };\n                };\n            }\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = (((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\")))) || h.action) || h.href) || h.name));\n            return ((typeof i === \"string\") ? i : null);\n        },\n        should_report: function(h, i) {\n            if ((i == \"FORCE\")) {\n                return true\n            };\n            if ((i == \"INDIRECT\")) {\n                return false\n            };\n            return (h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\"))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            document.cookie = (((\"act=\" + encodeURIComponent(i)) + \"; path=/; domain=\") + window.location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\"));\n        };\n    };\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"content\")) {\n            return [0,0,0,0,]\n        };\n        var r = n(\"content\"), s = (a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        });\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n    function p(q, r, event, s) {\n        var t = ((!a.ArbiterMonitor) ? \"r\" : \"a\"), u = [0,0,0,0,], v, w, x;\n        if (!!event) {\n            v = event.type;\n            if (((v == \"click\") && l(\"content\"))) {\n                u = o(event);\n            };\n            var y = 0;\n            (event.ctrlKey && (y += 1));\n            (event.shiftKey && (y += 2));\n            (event.altKey && (y += 4));\n            (event.metaKey && (y += 8));\n            if (y) {\n                v += y;\n            };\n        }\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        };\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n        var aa = j((!!event ? ((event.target || event.srcElement)) : r), [\"ft\",\"gt\",]);\n        k(aa.ft, (s.ft || {\n        }));\n        k(aa.gt, (s.gt || {\n        }));\n        if ((typeof (aa.ft.ei) === \"string\")) {\n            delete aa.ft.ei;\n        };\n        var ba = [q._ue_ts,q._ue_count,(w || \"-\"),q._context,(v || \"-\"),(x || i.get_intern_ref(r)),t,(a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((location.pathname + location.search) + location.hash)),aa,].concat(u).concat(z);\n        return ba;\n    };\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.location.origin);\n            };\n        }\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l\n                };\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if ((la == \"#\")) {\n                return false\n            };\n            la = new s(la);\n            if ((la.getDomain() && (la.getDomain() != s().getDomain()))) {\n                return false\n            };\n            if ((la.getPath() == \"/l.php\")) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if ((ma && (ma != s().getDomain()))) {\n                        return false\n                    };\n                }\n            ;\n            }\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += (\"?\" + s.implodeQuery(oa));\n            };\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = (la || \"Facebook\");\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.setInterval(function() {\n                    var ma = da, na = k.get();\n                    if ((ma != na)) {\n                        k.set(ma);\n                    };\n                }, 5000, false);\n            };\n        }\n    ;\n    };\n    function ga(la) {\n        var ma = document.getElementsByTagName(\"link\");\n        for (var na = 0; (na < ma.length); ++na) {\n            if ((ma[na].rel != \"alternate\")) {\n                continue;\n            };\n            l.remove(ma[na]);\n        };\n        if (la.length) {\n            var oa = l.find(document, \"head\");\n            (oa && l.appendContent(oa, n(la[0])));\n        }\n    ;\n    };\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            (this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\"));\n            p.transitionComplete();\n            (this._onPageDisplayed && this._onPageDisplayed(this.pipe));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if ((la.version == y)) {\n                return true\n            };\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga((ma.syndication || []));\n            window.scrollTo(0, 0);\n            j.go(document.body, (ma.body_class || \"\"), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return (ba >= z);\n    };\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false\n        };\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false\n        };\n        window.ExitTime = Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"content\").send();\n        return true;\n    };\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if ((typeof oa !== \"function\")) {\n                oa = eval.bind(null, oa);\n            };\n            var ra = ma(m.guard(oa), pa);\n            if ((pa > 0)) {\n                if ((qa !== false)) {\n                    r.onLeave(function() {\n                        clearInterval(ra);\n                    });\n                }\n            };\n            return ra;\n        };\n        window[la] = na;\n    };\n    r.onAfterLoad(function la() {\n        ka(\"setInterval\");\n        ka(\"setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return (\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    }, 1000);\n    function o() {\n        try {\n            if (a.sessionStorage) {\n                l = a.sessionStorage;\n                (l._ua_log && (m = JSON.parse(l._ua_log)));\n            }\n        ;\n        } catch (q) {\n            l = false;\n        };\n        m.log[(m.len % 10)] = {\n            ts: Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, event = s.event;\n            if ((!event || !((event.type in k)))) {\n                return\n            };\n            var v = {\n                path: i.getScriptPath(),\n                type: event.type,\n                ts: t._ue_ts,\n                iref: (h.get_intern_ref(u) || \"-\"),\n                index: m.len\n            };\n            m.log[(m.len++ % 10)] = v;\n            (l && n());\n        });\n    };\n    function p() {\n        return m.log.sort(function(q, r) {\n            return (((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index)));\n        });\n    };\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"CSS\",\"DOM\",\"Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"queryThenMutateDOM\"), l = document.documentElement, m, n, o = k.bind(null, function() {\n        n = (n || i.getDocumentScrollElement());\n        m = ((l.clientHeight < 400) || (l.clientWidth < n.scrollWidth));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = (i * 32), k = 1500, l, m, n, o, p, q, r, s, t;\n    function u() {\n        if (l) {\n            var ca = Date.now();\n            if ((ca > p)) {\n                r = Math.min(j, Math.ceil((((ca / 1000)) - o)));\n            };\n            var da = z();\n            if (da) {\n                l(da);\n            };\n        }\n    ;\n        y();\n    };\n    function v() {\n        w();\n        m = setTimeout(u, ((n * 1000) + k), false);\n    };\n    function w() {\n        if (m) {\n            clearTimeout(m);\n            m = null;\n        }\n    ;\n    };\n    function x(ca) {\n        o = ca;\n        p = (o * 1000);\n        q = [1,];\n        for (var da = 1; (da < i); da++) {\n            q.push(0);;\n        };\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n    function z() {\n        if (!q) {\n            return null\n        };\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n    function aa(ca) {\n        if (((ca >= p) && (((ca - p)) < 1000))) {\n            return\n        };\n        ba(Math.floor((ca / 1000)));\n    };\n    function ba(ca) {\n        var da = (ca - o);\n        if (((da < 0) || (da >= j))) {\n            u();\n        };\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[(da >> 5)] |= ((1 << ((da & 31))));\n            r = (da + 1);\n            s += 1;\n            p = (ca * 1000);\n        }\n    ;\n    };\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = (da || j);\n            x(Math.floor((Date.now() / 1000)));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        for (var v in t) {\n            var w = t.getItem(v), x = j.unicodeEscape(v);\n            if ((typeof w === \"string\")) {\n                u[x] = w.length;\n            };\n        };\n        return u;\n    };\n    function p(t) {\n        if ((a.localStorage && t.keys)) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n    };\n    function q(t) {\n        if (a.localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.localStorage.removeItem(u);\n                };\n            });\n        };\n        if (a.sessionStorage) {\n            a.sessionStorage.clear();\n        };\n    };\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    };\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return\n            };\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = Date.now(), v = {\n            }, w = false;\n            [\"localStorage\",\"sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            });\n            var x = Date.now();\n            v.logtime = (x - u);\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        };\n                        p(z);\n                    }\n                ;\n                }.bind(this)).send();\n            };\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            };\n            if (a.sessionStorage) {\n                a.sessionStorage.clear();\n            };\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.localStorage)\n    };\n    e.exports = s;\n});");
// 8160
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sb400e2fc5b4578cec05af7646f5430d8d67f9e1b");
// 8161
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"I+n09\",]);\n}\n;\n;\n__d(\"legacy:connect-xd\", [\"XD\",], function(a, b, c, d) {\n    a.UnverifiedXD = b(\"XD\").UnverifiedXD;\n    a.XD = b(\"XD\").XD;\n}, 3);\n__d(\"legacy:onload-action\", [\"OnloadHooks\",], function(a, b, c, d) {\n    var e = b(\"OnloadHooks\");\n    a._onloadHook = e._onloadHook;\n    a._onafterloadHook = e._onafterloadHook;\n    a.runHook = e.runHook;\n    a.runHooks = e.runHooks;\n    a.keep_window_set_as_loaded = e.keepWindowSetAsLoaded;\n}, 3);\n__d(\"Base64\", [], function(a, b, c, d, e, f) {\n    var g = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    function h(l) {\n        l = ((((((l.charCodeAt(0) << 16)) | ((l.charCodeAt(1) << 8)))) | l.charCodeAt(2)));\n        return String.fromCharCode(g.charCodeAt(((l >>> 18))), g.charCodeAt(((((l >>> 12)) & 63))), g.charCodeAt(((((l >>> 6)) & 63))), g.charCodeAt(((l & 63))));\n    };\n;\n    var i = ((((\"\\u003E___?456789:;\\u003C=_______\" + \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\u0009\\u000a\\u000b\\u000c\\u000d\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\")) + \"______\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123\"));\n    function j(l) {\n        l = ((((((((i.charCodeAt(((l.charCodeAt(0) - 43))) << 18)) | ((i.charCodeAt(((l.charCodeAt(1) - 43))) << 12)))) | ((i.charCodeAt(((l.charCodeAt(2) - 43))) << 6)))) | i.charCodeAt(((l.charCodeAt(3) - 43)))));\n        return String.fromCharCode(((l >>> 16)), ((((l >>> 8)) & 255)), ((l & 255)));\n    };\n;\n    var k = {\n        encode: function(l) {\n            l = unescape(encodeURI(l));\n            var m = ((((l.length + 2)) % 3));\n            l = ((l + \"\\u0000\\u0000\".slice(m))).replace(/[\\s\\S]{3}/g, h);\n            return ((l.slice(0, ((((l.length + m)) - 2))) + \"==\".slice(m)));\n        },\n        decode: function(l) {\n            l = l.replace(/[^A-Za-z0-9+\\/]/g, \"\");\n            var m = ((((l.length + 3)) & 3));\n            l = ((l + \"AAA\".slice(m))).replace(/..../g, j);\n            l = l.slice(0, ((((l.length + m)) - 3)));\n            try {\n                return decodeURIComponent(escape(l));\n            } catch (n) {\n                throw new Error(\"Not valid UTF-8\");\n            };\n        ;\n        },\n        encodeObject: function(l) {\n            return k.encode(JSON.stringify(l));\n        },\n        decodeObject: function(l) {\n            return JSON.parse(k.decode(l));\n        },\n        encodeNums: function(l) {\n            return String.fromCharCode.apply(String, l.map(function(m) {\n                return g.charCodeAt(((((((m | -((m > 63)))) & -((m > 0)))) & 63)));\n            }));\n        }\n    };\n    e.exports = k;\n});\n__d(\"ClickRefUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        get_intern_ref: function(h) {\n            if (!!h) {\n                var i = {\n                    profile_minifeed: 1,\n                    gb_content_and_toolbar: 1,\n                    gb_muffin_area: 1,\n                    ego: 1,\n                    bookmarks_menu: 1,\n                    jewelBoxNotif: 1,\n                    jewelNotif: 1,\n                    BeeperBox: 1,\n                    navSearch: 1\n                };\n                for (var j = h; ((j && ((j != JSBNG__document.body)))); j = j.parentNode) {\n                    if (((!j.id || ((typeof j.id !== \"string\"))))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (((j.id.substr(0, 8) == \"pagelet_\"))) {\n                        return j.id.substr(8);\n                    }\n                ;\n                ;\n                    if (((j.id.substr(0, 8) == \"box_app_\"))) {\n                        return j.id;\n                    }\n                ;\n                ;\n                    if (i[j.id]) {\n                        return j.id;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return \"-\";\n        },\n        get_href: function(h) {\n            var i = ((((((((h.getAttribute && ((h.getAttribute(\"ajaxify\") || h.getAttribute(\"data-endpoint\"))))) || h.action)) || h.href)) || h.JSBNG__name));\n            return ((((typeof i === \"string\")) ? i : null));\n        },\n        should_report: function(h, i) {\n            if (((i == \"FORCE\"))) {\n                return true;\n            }\n        ;\n        ;\n            if (((i == \"INDIRECT\"))) {\n                return false;\n            }\n        ;\n        ;\n            return ((h && ((g.get_href(h) || ((h.getAttribute && h.getAttribute(\"data-ft\")))))));\n        }\n    };\n    e.exports = g;\n});\n__d(\"setUECookie\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\");\n    function h(i) {\n        if (!g.no_cookies) {\n            JSBNG__document.cookie = ((((((\"act=\" + encodeURIComponent(i))) + \"; path=/; domain=\")) + window.JSBNG__location.hostname.replace(/^.*(\\.facebook\\..*)$/i, \"$1\")));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = h;\n});\n__d(\"ClickRefLogger\", [\"Arbiter\",\"EagleEye\",\"ClickRefUtils\",\"collectDataAttributes\",\"copyProperties\",\"ge\",\"setUECookie\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"EagleEye\"), i = b(\"ClickRefUtils\"), j = b(\"collectDataAttributes\"), k = b(\"copyProperties\"), l = b(\"ge\"), m = b(\"setUECookie\"), n = b(\"$\");\n    function o(q) {\n        if (!l(\"JSBNG__content\")) {\n            return [0,0,0,0,];\n        }\n    ;\n    ;\n        var r = n(\"JSBNG__content\"), s = ((a.Vector2 ? a.Vector2.getEventPosition(q) : {\n            x: 0,\n            y: 0\n        }));\n        return [s.x,s.y,r.offsetLeft,r.clientWidth,];\n    };\n;\n    function p(q, r, JSBNG__event, s) {\n        var t = (((!a.ArbiterMonitor) ? \"r\" : \"a\")), u = [0,0,0,0,], v, w, x;\n        if (!!JSBNG__event) {\n            v = JSBNG__event.type;\n            if (((((v == \"click\")) && l(\"JSBNG__content\")))) {\n                u = o(JSBNG__event);\n            }\n        ;\n        ;\n            var y = 0;\n            ((JSBNG__event.ctrlKey && (y += 1)));\n            ((JSBNG__event.shiftKey && (y += 2)));\n            ((JSBNG__event.altKey && (y += 4)));\n            ((JSBNG__event.metaKey && (y += 8)));\n            if (y) {\n                v += y;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (!!r) {\n            w = i.get_href(r);\n        }\n    ;\n    ;\n        var z = [];\n        if (a.ArbiterMonitor) {\n            x = a.ArbiterMonitor.getInternRef(r);\n            z = a.ArbiterMonitor.getActFields();\n        }\n    ;\n    ;\n        var aa = j(((!!JSBNG__event ? ((JSBNG__event.target || JSBNG__event.srcElement)) : r)), [\"ft\",\"gt\",]);\n        k(aa.ft, ((s.ft || {\n        })));\n        k(aa.gt, ((s.gt || {\n        })));\n        if (((typeof (aa.ft.ei) === \"string\"))) {\n            delete aa.ft.ei;\n        }\n    ;\n    ;\n        var ba = [q._ue_ts,q._ue_count,((w || \"-\")),q._context,((v || \"-\")),((x || i.get_intern_ref(r))),t,((a.URI ? a.URI.getRequestURI(true, true).getUnqualifiedURI().toString() : ((((JSBNG__location.pathname + JSBNG__location.search)) + JSBNG__location.hash)))),aa,].concat(u).concat(z);\n        return ba;\n    };\n;\n    g.subscribe(\"ClickRefAction/new\", function(q, r) {\n        if (i.should_report(r.node, r.mode)) {\n            var s = p(r.cfa, r.node, r.JSBNG__event, r.extra_data);\n            m(r.cfa.ue);\n            h.log(\"act\", s);\n            if (window.chromePerfExtension) {\n                window.JSBNG__postMessage({\n                    clickRef: JSON.stringify(s)\n                }, window.JSBNG__location.origin);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n});\n__d(\"QuicklingAugmenter\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = [], i = {\n        addHandler: function(j) {\n            h.push(j);\n        },\n        augmentURI: function(j) {\n            var k = [], l = g(j);\n            h.forEach(function(m) {\n                var n = m(l);\n                if (!n) {\n                    return l;\n                }\n            ;\n            ;\n                k.push(m);\n                l = l.addQueryData(n);\n            });\n            h = k;\n            return l;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Quickling\", [\"AjaxPipeRequest\",\"Arbiter\",\"Class\",\"CSSClassTransition\",\"DocumentTitle\",\"DOM\",\"ErrorUtils\",\"HTML\",\"OnloadHooks\",\"PageTransitions\",\"QuicklingAugmenter\",\"Run\",\"URI\",\"UserAgent\",\"copyProperties\",\"goOrReplace\",\"isEmpty\",\"QuicklingConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AjaxPipeRequest\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSSClassTransition\"), k = b(\"DocumentTitle\"), l = b(\"DOM\"), m = b(\"ErrorUtils\"), n = b(\"HTML\"), o = b(\"OnloadHooks\"), p = b(\"PageTransitions\"), q = b(\"QuicklingAugmenter\"), r = b(\"Run\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"copyProperties\"), v = b(\"goOrReplace\"), w = b(\"isEmpty\"), x = b(\"QuicklingConfig\"), y = x.version, z = x.sessionLength, aa = new RegExp(x.inactivePageRegex), ba = 0, ca, da = \"\", ea = {\n        isActive: function() {\n            return true;\n        },\n        isPageActive: function(la) {\n            if (((la == \"#\"))) {\n                return false;\n            }\n        ;\n        ;\n            la = new s(la);\n            if (((la.getDomain() && ((la.getDomain() != s().getDomain()))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((la.getPath() == \"/l.php\"))) {\n                var ma = la.getQueryData().u;\n                if (ma) {\n                    ma = s(unescape(ma)).getDomain();\n                    if (((ma && ((ma != s().getDomain()))))) {\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var na = la.getPath(), oa = la.getQueryData();\n            if (!w(oa)) {\n                na += ((\"?\" + s.implodeQuery(oa)));\n            }\n        ;\n        ;\n            return !aa.test(na);\n        },\n        getLoadCount: function() {\n            return ba;\n        }\n    };\n    function fa(la) {\n        la = ((la || \"Facebook\"));\n        k.set(la);\n        if (t.ie()) {\n            da = la;\n            if (!ca) {\n                ca = window.JSBNG__setInterval(function() {\n                    var ma = da, na = k.get();\n                    if (((ma != na))) {\n                        k.set(ma);\n                    }\n                ;\n                ;\n                }, 5000, false);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ga(la) {\n        var ma = JSBNG__document.getElementsByTagName(\"link\");\n        for (var na = 0; ((na < ma.length)); ++na) {\n            if (((ma[na].rel != \"alternate\"))) {\n                continue;\n            }\n        ;\n        ;\n            l.remove(ma[na]);\n        };\n    ;\n        if (la.length) {\n            var oa = l.JSBNG__find(JSBNG__document, \"head\");\n            ((oa && l.appendContent(oa, n(la[0]))));\n        }\n    ;\n    ;\n    };\n;\n    function ha(la) {\n        var ma = {\n            version: y\n        };\n        this.parent.construct(this, la, {\n            quickling: ma\n        });\n    };\n;\n    i.extend(ha, g);\n    u(ha.prototype, {\n        _preBootloadFirstResponse: function(la) {\n            return true;\n        },\n        _fireDomContentCallback: function() {\n            ((this._request.cavalry && this._request.cavalry.setTimeStamp(\"t_domcontent\")));\n            p.transitionComplete();\n            ((this._onPageDisplayed && this._onPageDisplayed(this.pipe)));\n            this.parent._fireDomContentCallback();\n        },\n        _fireOnloadCallback: function() {\n            if (this._request.cavalry) {\n                this._request.cavalry.setTimeStamp(\"t_hooks\");\n                this._request.cavalry.setTimeStamp(\"t_layout\");\n                this._request.cavalry.setTimeStamp(\"t_onload\");\n            }\n        ;\n        ;\n            this.parent._fireOnloadCallback();\n        },\n        isPageActive: function(la) {\n            return ea.isPageActive(la);\n        },\n        _versionCheck: function(la) {\n            if (((la.version == y))) {\n                return true;\n            }\n        ;\n        ;\n            var ma = [\"quickling\",\"ajaxpipe\",\"ajaxpipe_token\",];\n            v(window.JSBNG__location, s(la.uri).removeQueryData(ma), true);\n            return false;\n        },\n        _processFirstResponse: function(la) {\n            var ma = la.getPayload();\n            fa(ma.title);\n            ga(((ma.syndication || [])));\n            window.JSBNG__scrollTo(0, 0);\n            j.go(JSBNG__document.body, ((ma.body_class || \"\")), p.getMostRecentURI(), la.getRequest().getURI());\n            h.inform(\"quickling/response\");\n        },\n        getSanitizedParameters: function() {\n            return [\"quickling\",];\n        }\n    });\n    function ia() {\n        ba++;\n        return ((ba >= z));\n    };\n;\n    function ja(la) {\n        g.setCurrentRequest(null);\n        if (ia()) {\n            return false;\n        }\n    ;\n    ;\n        la = q.augmentURI(la);\n        if (!ea.isPageActive(la)) {\n            return false;\n        }\n    ;\n    ;\n        window.ExitTime = JSBNG__Date.now();\n        r.__removeHook(\"onafterloadhooks\");\n        r.__removeHook(\"onloadhooks\");\n        o.runHooks(\"onleavehooks\");\n        h.inform(\"onload/exit\", true);\n        new ha(la).setCanvasId(\"JSBNG__content\").send();\n        return true;\n    };\n;\n    function ka(la) {\n        var ma = window[la];\n        function na(oa, pa, qa) {\n            if (((typeof oa !== \"function\"))) {\n                oa = eval.bind(null, oa);\n            }\n        ;\n        ;\n            var ra = ma(m.guard(oa), pa);\n            if (((pa > 0))) {\n                if (((qa !== false))) {\n                    r.onLeave(function() {\n                        JSBNG__clearInterval(ra);\n                    });\n                }\n            ;\n            }\n        ;\n        ;\n            return ra;\n        };\n    ;\n        window[la] = na;\n    };\n;\n    r.onAfterLoad(function la() {\n        ka(\"JSBNG__setInterval\");\n        ka(\"JSBNG__setTimeout\");\n        p.registerHandler(ja, 1);\n    });\n    e.exports = a.Quickling = ea;\n});\n__d(\"StringTransformations\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        unicodeEscape: function(g) {\n            return g.replace(/[^A-Za-z0-9\\-\\.\\:\\_\\$\\/\\+\\=]/g, function(h) {\n                var i = h.charCodeAt().toString(16);\n                return ((\"\\\\u\" + ((\"0000\" + i.toUpperCase())).slice(-4)));\n            });\n        },\n        unicodeUnescape: function(g) {\n            return g.replace(/(\\\\u[0-9A-Fa-f]{4})/g, function(h) {\n                return String.fromCharCode(parseInt(h.slice(2), 16));\n            });\n        }\n    };\n});\n__d(\"UserActionHistory\", [\"Arbiter\",\"ClickRefUtils\",\"ScriptPath\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ClickRefUtils\"), i = b(\"ScriptPath\"), j = b(\"throttle\"), k = {\n        click: 1,\n        submit: 1\n    }, l = false, m = {\n        log: [],\n        len: 0\n    }, n = j.acrossTransitions(function() {\n        try {\n            l._ua_log = JSON.stringify(m);\n        } catch (q) {\n            l = false;\n        };\n    ;\n    }, 1000);\n    function o() {\n        try {\n            if (a.JSBNG__sessionStorage) {\n                l = a.JSBNG__sessionStorage;\n                ((l._ua_log && (m = JSON.parse(l._ua_log))));\n            }\n        ;\n        ;\n        } catch (q) {\n            l = false;\n        };\n    ;\n        m.log[((m.len % 10))] = {\n            ts: JSBNG__Date.now(),\n            path: \"-\",\n            index: m.len,\n            type: \"init\",\n            iref: \"-\"\n        };\n        m.len++;\n        g.subscribe(\"UserAction/new\", function(r, s) {\n            var t = s.ua, u = s.node, JSBNG__event = s.JSBNG__event;\n            if (((!JSBNG__event || !((JSBNG__event.type in k))))) {\n                return;\n            }\n        ;\n        ;\n            var v = {\n                path: i.getScriptPath(),\n                type: JSBNG__event.type,\n                ts: t._ue_ts,\n                iref: ((h.get_intern_ref(u) || \"-\")),\n                index: m.len\n            };\n            m.log[((m.len++ % 10))] = v;\n            ((l && n()));\n        });\n    };\n;\n    function p() {\n        return m.log.sort(function(q, r) {\n            return ((((r.ts != q.ts)) ? ((r.ts - q.ts)) : ((r.index - q.index))));\n        });\n    };\n;\n    o();\n    e.exports = {\n        getHistory: p\n    };\n});\n__d(\"TinyViewport\", [\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"queryThenMutateDOM\"), l = JSBNG__document.documentElement, m, n, o = k.bind(null, function() {\n        n = ((n || i.getDocumentScrollElement()));\n        m = ((((l.clientHeight < 400)) || ((l.clientWidth < n.scrollWidth))));\n    }, function() {\n        h.conditionClass(l, \"tinyViewport\", m);\n        h.conditionClass(l, \"canHaveFixedElements\", !m);\n    }, \"TinyViewport\");\n    o();\n    g.subscribe(\"quickling/response\", o);\n    j.listen(window, \"resize\", o);\n});\n__d(\"TimeSpentArray\", [\"Banzai\",\"pageID\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"pageID\"), i = 2, j = ((i * 32)), k = 1500, l, m, n, o, p, q, r, s, t;\n    {\n        function u() {\n            if (l) {\n                var ca = JSBNG__Date.now();\n                if (((ca > p))) {\n                    r = Math.min(j, Math.ceil(((((ca / 1000)) - o))));\n                }\n            ;\n            ;\n                var da = z();\n                if (da) {\n                    l(da);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            y();\n        };\n        ((window.top.JSBNG_Replay.sb400e2fc5b4578cec05af7646f5430d8d67f9e1b_61.push)((u)));\n    };\n;\n    function v() {\n        w();\n        m = JSBNG__setTimeout(u, ((((n * 1000)) + k)), false);\n    };\n;\n    function w() {\n        if (m) {\n            JSBNG__clearTimeout(m);\n            m = null;\n        }\n    ;\n    ;\n    };\n;\n    function x(ca) {\n        o = ca;\n        p = ((o * 1000));\n        q = [1,];\n        for (var da = 1; ((da < i)); da++) {\n            q.push(0);\n        ;\n        };\n    ;\n        r = 1;\n        s += 1;\n        t += 1;\n        v();\n    };\n;\n    function y() {\n        w();\n        q = null;\n        n = j;\n    };\n;\n    function z() {\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        return {\n            tos_id: h,\n            start_time: o,\n            tos_array: q.slice(0),\n            tos_len: r,\n            tos_seq: t,\n            tos_cum: s\n        };\n    };\n;\n    function aa(ca) {\n        if (((((ca >= p)) && ((((ca - p)) < 1000))))) {\n            return;\n        }\n    ;\n    ;\n        ba(Math.floor(((ca / 1000))));\n    };\n;\n    function ba(ca) {\n        var da = ((ca - o));\n        if (((((da < 0)) || ((da >= j))))) {\n            u();\n        }\n    ;\n    ;\n        if (!q) {\n            x(ca);\n        }\n         else {\n            q[((da >> 5))] |= ((1 << ((da & 31))));\n            r = ((da + 1));\n            s += 1;\n            p = ((ca * 1000));\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        init: function(ca, da) {\n            s = 0;\n            t = -1;\n            l = ca;\n            n = ((da || j));\n            x(Math.floor(((JSBNG__Date.now() / 1000))));\n            g.subscribe(g.SHUTDOWN, u);\n        },\n        update: function(ca) {\n            aa(ca);\n        },\n        get: function() {\n            return z();\n        },\n        ship: function() {\n            u();\n        },\n        reset: function() {\n            y();\n        }\n    };\n});\n__d(\"WebStorageMonster\", [\"JSBNG__Event\",\"AsyncRequest\",\"UserActivity\",\"StringTransformations\",\"arrayContains\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"UserActivity\"), j = b(\"StringTransformations\"), k = b(\"arrayContains\"), l = b(\"setTimeoutAcrossTransitions\"), m = 300000, n = false;\n    function o(t) {\n        var u = {\n        };\n        {\n            var fin120keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin120i = (0);\n            var v;\n            for (; (fin120i < fin120keys.length); (fin120i++)) {\n                ((v) = (fin120keys[fin120i]));\n                {\n                    var w = t.getItem(v), x = j.unicodeEscape(v);\n                    if (((typeof w === \"string\"))) {\n                        u[x] = w.length;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return u;\n    };\n;\n    function p(t) {\n        if (((a.JSBNG__localStorage && t.keys))) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (k(t.keys, u)) {\n                    a.JSBNG__localStorage.removeItem(u);\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function q(t) {\n        if (a.JSBNG__localStorage) {\n            s._getLocalStorageKeys().forEach(function(u) {\n                if (!t.some(function(v) {\n                    return new RegExp(v).test(u);\n                })) {\n                    a.JSBNG__localStorage.removeItem(u);\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n        if (a.JSBNG__sessionStorage) {\n            a.JSBNG__sessionStorage.clear();\n        }\n    ;\n    ;\n    };\n;\n    function r(t) {\n        if (i.isActive(m)) {\n            l(r.curry(t), m);\n        }\n         else s.cleanNow(t);\n    ;\n    ;\n    };\n;\n    var s = {\n        registerLogoutForm: function(t, u) {\n            g.listen(t, \"submit\", function(v) {\n                s.cleanOnLogout(u);\n            });\n        },\n        schedule: function(t) {\n            if (n) {\n                return;\n            }\n        ;\n        ;\n            n = true;\n            r(t);\n        },\n        cleanNow: function(t) {\n            var u = JSBNG__Date.now(), v = {\n            }, w = false;\n            [\"JSBNG__localStorage\",\"JSBNG__sessionStorage\",].forEach(function(y) {\n                if (a[y]) {\n                    v[y] = o(a[y]);\n                    w = true;\n                }\n            ;\n            ;\n            });\n            var x = JSBNG__Date.now();\n            v.logtime = ((x - u));\n            if (w) {\n                new h(\"/ajax/webstorage/process_keys.php\").setData(v).setHandler(function(y) {\n                    if (!t) {\n                        var z = y.getPayload();\n                        if (z.keys) {\n                            z.keys = z.keys.map(j.unicodeUnescape);\n                        }\n                    ;\n                    ;\n                        p(z);\n                    }\n                ;\n                ;\n                }.bind(this)).send();\n            }\n        ;\n        ;\n        },\n        cleanOnLogout: function(t) {\n            if (t) {\n                q(t);\n            }\n        ;\n        ;\n            if (a.JSBNG__sessionStorage) {\n                a.JSBNG__sessionStorage.clear();\n            }\n        ;\n        ;\n        },\n        _getLocalStorageKeys: Object.keys.curry(a.JSBNG__localStorage)\n    };\n    e.exports = s;\n});");
// 8250
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o96,o97);
// undefined
o97 = null;
// 8255
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o98,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yT/r/yNh6K2TPYo5.js",o99);
// undefined
o98 = null;
// undefined
o99 = null;
// 8260
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"4vv8/\",]);\n}\n;\n__d(\"TimeSpentBitArrayLogger\", [\"UserActivity\",\"copyProperties\",\"Banzai\",\"BanzaiODS\",\"TimeSpentArray\",\"Arbiter\",\"TimeSpentConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserActivity\"), h = b(\"copyProperties\"), i = b(\"Banzai\"), j = b(\"BanzaiODS\"), k = b(\"TimeSpentArray\"), l = b(\"Arbiter\"), m = b(\"TimeSpentConfig\"), n = {\n        store: true,\n        delay: m.initial_delay,\n        retry: true\n    };\n    function o(p) {\n        if (i.isEnabled(\"time_spent_bit_array\")) {\n            l.inform(\"timespent/tosbitdataposted\", h({\n            }, p));\n            i.post(\"time_spent_bit_array\", h({\n            }, p), n);\n            n.delay = m.delay;\n        }\n    ;\n    };\n    e.exports = {\n        init: function(p) {\n            if ((window.top == window.self)) {\n                g.subscribe(function(q, r) {\n                    k.update(r.last_inform);\n                });\n                k.init(o, m.initial_timeout);\n                j.bumpEntityKey(\"ms.time_spent.qa.www\", \"time_spent.bits.js_initialized\");\n            }\n        ;\n        }\n    };\n});");
// 8261
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s76aa385d8208e4e8eefbd18ade1f1e8c544e0113");
// 8262
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"4vv8/\",]);\n}\n;\n;\n__d(\"TimeSpentBitArrayLogger\", [\"UserActivity\",\"copyProperties\",\"Banzai\",\"BanzaiODS\",\"TimeSpentArray\",\"Arbiter\",\"TimeSpentConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserActivity\"), h = b(\"copyProperties\"), i = b(\"Banzai\"), j = b(\"BanzaiODS\"), k = b(\"TimeSpentArray\"), l = b(\"Arbiter\"), m = b(\"TimeSpentConfig\"), n = {\n        store: true,\n        delay: m.initial_delay,\n        retry: true\n    };\n    function o(p) {\n        if (i.isEnabled(\"time_spent_bit_array\")) {\n            l.inform(\"timespent/tosbitdataposted\", h({\n            }, p));\n            i.post(\"time_spent_bit_array\", h({\n            }, p), n);\n            n.delay = m.delay;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        init: function(p) {\n            if (((window.JSBNG__top == window.JSBNG__self))) {\n                g.subscribe(function(q, r) {\n                    k.update(r.last_inform);\n                });\n                k.init(o, m.initial_timeout);\n                j.bumpEntityKey(\"ms.time_spent.qa.www\", \"time_spent.bits.js_initialized\");\n            }\n        ;\n        ;\n        }\n    };\n});");
// 8269
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o100,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/VctjjLR0rnO.js",o101);
// undefined
o100 = null;
// undefined
o101 = null;
// 8274
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_55[0](13212.999999988824);
// 8288
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"BjpNB\",]);\n}\n;\n__d(\"BlueBarMinWidth\", [\"Arbiter\",\"DOM\",\"DOMDimensions\",\"Event\",\"Locale\",\"Style\",\"Vector\",\"$\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"DOMDimensions\"), j = b(\"Event\"), k = b(\"Locale\"), l = b(\"Style\"), m = b(\"Vector\"), n = b(\"$\"), o = b(\"csx\"), p = b(\"queryThenMutateDOM\");\n    f.init = function() {\n        var q = n(\"pageHead\"), r = h.find(q, \".-cx-PRIVATE-bluebarDynamicWidth__widthwrapper\"), s, t = p.bind(null, function() {\n            var u = i.getElementDimensions(q).width, v;\n            if (k.isRTL()) {\n                v = -m.getElementPosition(q).x;\n            }\n             else v = ((m.getElementPosition(q).x + u) - i.getViewportDimensions().width);\n        ;\n            if ((v > 0)) {\n                var w = i.measureElementBox(q, \"width\", true);\n                s = (((u - v) - w) + \"px\");\n            }\n             else s = \"\";\n        ;\n        }, function() {\n            l.set(r, \"width\", s);\n        }, \"BlueBarMinWidth\");\n        j.listen(window, \"resize\", t);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], t);\n        t();\n    };\n});\n__d(\"BrowseLogger\", [\"Banzai\",\"copyProperties\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"copyProperties\"), i = b(\"Run\"), j = \"browse\", k = \"browse_aggr\", l = null, m = {\n    }, n = {\n    };\n    function o() {\n        l = null;\n        m = {\n        };\n        n = {\n        };\n    };\n    function p(v) {\n        h(v, {\n            clientSessionID: l\n        });\n        return v;\n    };\n    function q(v) {\n        g.post(j, p(v));\n    };\n    function r() {\n        if ((l === null)) {\n            return\n        };\n        n.aggregated = m;\n        g.post(k, p(n));\n        o();\n    };\n    function s(v) {\n        m[v] = (((m[v] || 0)) + 1);\n    };\n    function t(v) {\n        h(n, v);\n    };\n    i.onUnload(r);\n    var u = {\n        newSession: function() {\n            r();\n            l = Math.random().toString();\n            if (!n.start_time) {\n                n.start_time = Math.round((Date.now() / 1000));\n            };\n        },\n        logResultClick: function(v, w) {\n            var x = {\n                action: \"result_click\",\n                click_type: (v.ct || \"result\"),\n                id: (v.id || 0),\n                path: (v.path || \"unknown\"),\n                rank: (v.rank || 0),\n                referrer: (v.referrer || \"unknown\"),\n                result_type: (v.result_type || \"unknown\"),\n                session_id: (v.session_id || 0),\n                query_time: v.query_time,\n                abtest_version: (v.abtest_version || \"NONE\"),\n                abtest_params: v.abtest_params,\n                typeahead_sid: (v.typeahead_sid || \"\"),\n                click_action: w\n            };\n            s((\"result_click_\" + x.click_type));\n            t({\n                path: x.path,\n                referrer: x.referrer,\n                result_type: x.result_type,\n                session_id: x.session_id,\n                abtest_version: x.abtest_version,\n                abtest_params: x.abtest_params,\n                typeahead_sid: x.typeahead_sid\n            });\n            q(x);\n        },\n        logControlsClick: function(v, w) {\n            var x = {\n                action: \"controls_click\",\n                click_type: w,\n                path: (v.path || \"unknown\"),\n                referrer: (v.referrer || \"unknown\"),\n                session_id: (v.session_id || 0),\n                query_time: v.query_time,\n                filter_name: (v.name || \"unknown\"),\n                typeahead_sid: (v.typeahead_sid || \"\"),\n                result_type: (v.result_type || \"unknown\")\n            };\n            s((\"controls_click_\" + w));\n            t({\n                path: x.path,\n                referrer: x.referrer,\n                session_id: x.session_id,\n                typeahead_sid: x.typeahead_sid\n            });\n            q(x);\n        },\n        logResultHover: function(v, w) {\n            var x = {\n                action: \"result_hover\",\n                id: (v.id || 0),\n                path: (v.path || \"unknown\"),\n                rank: v.rank,\n                session_id: (v.session_id || 0),\n                query_time: v.query_time,\n                time_elapsed: w,\n                typeahead_sid: (v.typeahead_sid || 0)\n            };\n            s(\"result_hover\");\n            t({\n                path: x.path,\n                session_id: x.session_id,\n                typeahead_sid: x.typeahead_sid\n            });\n            q(x);\n        },\n        logNUXStep: function(v) {\n            var w = {\n                action: \"nux_step\",\n                step: v\n            };\n            q(w);\n        },\n        logDisambiguationImpression: function(v, w, x, y, z) {\n            var aa = {\n                action: \"disambiguation_imp\",\n                ids: y,\n                name: v,\n                path: x,\n                type: w,\n                typeahead_sid: z\n            };\n            q(aa);\n        },\n        logDisambiguationClick: function(v, w, x, y, z, aa) {\n            var ba = {\n                action: \"disambiguation_clk\",\n                id: z,\n                index: y,\n                name: v,\n                path: x,\n                type: w,\n                typeahead_sid: aa\n            };\n            q(ba);\n        }\n    };\n    e.exports = u;\n});\n__d(\"BrowseResultsAreSlow\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = 1500, i = {\n        register: function(j, k) {\n            setTimeout(function() {\n                if ((j.firstChild === k)) {\n                    g.show(k);\n                };\n            }, h);\n        }\n    };\n    e.exports = i;\n});\n__d(\"LitestandNewsfeedCountUpdater\", [\"Arbiter\",\"AsyncRequest\",\"LitestandMessages\",\"LitestandSidebarBookmarkConfig\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"LitestandMessages\"), j = b(\"LitestandSidebarBookmarkConfig\"), k = b(\"emptyFunction\"), l, m;\n    function n() {\n        (m && clearTimeout(m));\n        if (l) {\n            return\n        };\n        m = setTimeout(o, j.nf_count_query_interval_ms, false);\n    };\n    function o() {\n        if (l) {\n            return\n        };\n        new h().setURI(\"/ajax/litestand/newsfeed_count\").setHandler(function(r) {\n            if (l) {\n                return\n            };\n            p(r.getPayload());\n            n();\n        }).setAllowCrossPageTransition(true).send();\n    };\n    function p(r) {\n        g.inform(i.UPDATE_HOME_COUNT, {\n            count: r,\n            onHome: l\n        }, g.BEHAVIOR_STATE);\n    };\n    var q = {\n        init: function() {\n            q.init = k;\n            g.subscribe(i.NEWSFEED_LOAD, function() {\n                l = true;\n                p(0);\n            });\n            g.subscribe(i.LEAVE_HOME, function() {\n                l = false;\n                n();\n            });\n            n();\n        }\n    };\n    e.exports = q;\n});\n__d(\"LitestandChromeHomeCount\", [\"Arbiter\",\"CSS\",\"DOM\",\"LitestandMessages\",\"LitestandNewsfeedCountUpdater\",\"$\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"LitestandMessages\"), k = b(\"LitestandNewsfeedCountUpdater\"), l = b(\"$\"), m = b(\"csx\"), n = b(\"cx\"), o = 20, p, q, r, s, t = {\n        init: function(u) {\n            s = u;\n            q = i.find(l(\"pageHead\"), \".-cx-PRIVATE-litestandHomeBadge__badge\");\n            p = q.parentNode;\n            r = false;\n            g.subscribe(j.UPDATE_HOME_COUNT, function(v, w) {\n                t.updateBadge((w.onHome ? 0 : w.count));\n            });\n            k.init();\n            t.updateBadge(s);\n        },\n        updateBadge: function(u) {\n            s = u;\n            var v = (u > 0);\n            t.toggleBadge(v);\n            if (v) {\n                var w = ((u > o) ? (o + \"+\") : u);\n                i.setContent(q, w);\n            }\n        ;\n        },\n        toggleBadge: function(u) {\n            if ((r === u)) {\n                return\n            };\n            r = u;\n            h.conditionClass(p, \"-cx-PRIVATE-litestandHomeBadge__hidden\", !u);\n        }\n    };\n    e.exports = t;\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n    e.exports = g;\n});\n__d(\"FacebarTypeaheadInput\", [\"ArbiterMixin\",\"csx\",\"DOM\",\"FacebarStructuredText\",\"StructuredInput\",\"Vector\",\"copyProperties\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"csx\"), i = b(\"DOM\"), j = b(\"FacebarStructuredText\"), k = b(\"StructuredInput\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = {\n        text: {\n            className: \"text\",\n            group: \"all\",\n            select: \"none\"\n        },\n        ent: {\n            className: \"entity\",\n            group: \"all\",\n            select: \"group\"\n        },\n        \"ent:hashtag_exact\": {\n            className: \"entity\",\n            group: \"hashtag\",\n            select: \"none\"\n        }\n    }, o = b(\"mixin\");\n    function p(u) {\n        return m(u.toStruct(), {\n            display: (n[u.getType()] || n[u.getTypePart(0)])\n        });\n    };\n    var q = o(g);\n    for (var r in q) {\n        if ((q.hasOwnProperty(r) && (r !== \"_metaprototype\"))) {\n            t[r] = q[r];\n        };\n    };\n    var s = ((q === null) ? null : q.prototype);\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = q;\n    function t(u) {\n        this.root = u;\n        this.input = k.getInstance(u);\n        this.value = null;\n        this.selection = {\n            offset: 0,\n            length: 0\n        };\n        this.resetOnChange = true;\n        this.initEvents();\n    };\n    t.prototype.initEvents = function() {\n        var u = function(v, w) {\n            this.inform(v, w);\n        }.bind(this);\n        this.input.subscribe(\"blur\", u);\n        this.input.subscribe(\"focus\", u);\n        this.input.subscribe(\"change\", function(v, w) {\n            if (this.resetOnChange) {\n                this.value = null;\n            };\n            this.inform(\"change\", w);\n        }.bind(this));\n    };\n    t.prototype.togglePlaceholder = function(u) {\n        return this.input.togglePlaceholder(u);\n    };\n    t.prototype.focus = function() {\n        this.input.focus();\n    };\n    t.prototype.blur = function() {\n        this.input.blur();\n    };\n    t.prototype.getElement = function() {\n        return this.root;\n    };\n    t.prototype.getRawPlaceholderElement = function() {\n        return i.find(this.root, \".-cx-PUBLIC-uiStructuredInput__placeholder\");\n    };\n    t.prototype.getRawInputElement = function() {\n        return i.scry(this.root, \".-cx-PUBLIC-uiStructuredInput__rich\")[0];\n    };\n    t.prototype.getValue = function() {\n        if ((this.value === null)) {\n            this.value = j.fromStruct(this.input.getStructure());\n        };\n        return this.value;\n    };\n    t.prototype.getLength = function() {\n        return this.getValue().getLength();\n    };\n    t.prototype.resetPlaceholder = function() {\n        this.input.resetPlaceholder();\n    };\n    t.prototype.setValue = function(u) {\n        u = u.pad();\n        this.value = u;\n        this.resetOnChange = false;\n        var v = u.toArray().map(p);\n        this.input.setStructure(v);\n        this.input.setSelection({\n            offset: u.getLength(),\n            length: 0\n        });\n        this.resetOnChange = true;\n    };\n    t.prototype.storeSelection = function() {\n        this.selection = this.input.getSelection();\n    };\n    t.prototype.restoreSelection = function() {\n        this.input.setSelection(this.selection);\n    };\n    t.prototype.setHint = function(u) {\n        var v = (u ? u.toArray().map(p) : []);\n        this.input.setHint(v);\n    };\n    t.prototype.isSelectionAtEnd = function() {\n        return this.input.isSelectionAtEnd();\n    };\n    t.prototype.selectInput = function(u) {\n        this.input.setSelection({\n            offset: (u || 0),\n            length: this.getLength()\n        });\n    };\n    t.prototype.getEndOffset = function() {\n        var u = l.getElementDimensions(this.root), v = this.input.getContentDimensions();\n        return Math.min(u.x, v.width);\n    };\n    m(t.prototype, {\n        events: [\"change\",\"focus\",\"blur\",]\n    });\n    e.exports = t;\n});\n__d(\"FacebarRender\", [\"DOM\",\"createArrayFrom\",\"hasArrayNature\",\"flattenArray\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"createArrayFrom\"), i = b(\"hasArrayNature\"), j = b(\"flattenArray\"), k = b(\"emptyFunction\");\n    function l() {\n        return j(h(arguments)).filter(k.thatReturnsArgument);\n    };\n    function m(n, o) {\n        return g.create(\"span\", {\n            className: n\n        }, l(o));\n    };\n    e.exports = {\n        span: m,\n        children: l\n    };\n});");
// 8289
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sa3fa2a6308ef166c3bef3454f7cbe38faaa17b02");
// 8290
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"BjpNB\",]);\n}\n;\n;\n__d(\"BlueBarMinWidth\", [\"Arbiter\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"Locale\",\"Style\",\"Vector\",\"$\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"DOMDimensions\"), j = b(\"JSBNG__Event\"), k = b(\"Locale\"), l = b(\"Style\"), m = b(\"Vector\"), n = b(\"$\"), o = b(\"csx\"), p = b(\"queryThenMutateDOM\");\n    f.init = function() {\n        var q = n(\"pageHead\"), r = h.JSBNG__find(q, \".-cx-PRIVATE-bluebarDynamicWidth__widthwrapper\"), s, t = p.bind(null, function() {\n            var u = i.getElementDimensions(q).width, v;\n            if (k.isRTL()) {\n                v = -m.getElementPosition(q).x;\n            }\n             else v = ((((m.getElementPosition(q).x + u)) - i.getViewportDimensions().width));\n        ;\n        ;\n            if (((v > 0))) {\n                var w = i.measureElementBox(q, \"width\", true);\n                s = ((((((u - v)) - w)) + \"px\"));\n            }\n             else s = \"\";\n        ;\n        ;\n        }, function() {\n            l.set(r, \"width\", s);\n        }, \"BlueBarMinWidth\");\n        j.listen(window, \"resize\", t);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], t);\n        t();\n    };\n});\n__d(\"BrowseLogger\", [\"Banzai\",\"copyProperties\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = b(\"copyProperties\"), i = b(\"Run\"), j = \"browse\", k = \"browse_aggr\", l = null, m = {\n    }, n = {\n    };\n    function o() {\n        l = null;\n        m = {\n        };\n        n = {\n        };\n    };\n;\n    function p(v) {\n        h(v, {\n            clientSessionID: l\n        });\n        return v;\n    };\n;\n    function q(v) {\n        g.post(j, p(v));\n    };\n;\n    function r() {\n        if (((l === null))) {\n            return;\n        }\n    ;\n    ;\n        n.aggregated = m;\n        g.post(k, p(n));\n        o();\n    };\n;\n    function s(v) {\n        m[v] = ((((m[v] || 0)) + 1));\n    };\n;\n    function t(v) {\n        h(n, v);\n    };\n;\n    i.onUnload(r);\n    var u = {\n        newSession: function() {\n            r();\n            l = Math.JSBNG__random().toString();\n            if (!n.start_time) {\n                n.start_time = Math.round(((JSBNG__Date.now() / 1000)));\n            }\n        ;\n        ;\n        },\n        logResultClick: function(v, w) {\n            var x = {\n                action: \"result_click\",\n                click_type: ((v.ct || \"result\")),\n                id: ((v.id || 0)),\n                path: ((v.path || \"unknown\")),\n                rank: ((v.rank || 0)),\n                referrer: ((v.referrer || \"unknown\")),\n                result_type: ((v.result_type || \"unknown\")),\n                session_id: ((v.session_id || 0)),\n                query_time: v.query_time,\n                abtest_version: ((v.abtest_version || \"NONE\")),\n                abtest_params: v.abtest_params,\n                typeahead_sid: ((v.typeahead_sid || \"\")),\n                click_action: w\n            };\n            s(((\"result_click_\" + x.click_type)));\n            t({\n                path: x.path,\n                referrer: x.referrer,\n                result_type: x.result_type,\n                session_id: x.session_id,\n                abtest_version: x.abtest_version,\n                abtest_params: x.abtest_params,\n                typeahead_sid: x.typeahead_sid\n            });\n            q(x);\n        },\n        logControlsClick: function(v, w) {\n            var x = {\n                action: \"controls_click\",\n                click_type: w,\n                path: ((v.path || \"unknown\")),\n                referrer: ((v.referrer || \"unknown\")),\n                session_id: ((v.session_id || 0)),\n                query_time: v.query_time,\n                filter_name: ((v.JSBNG__name || \"unknown\")),\n                typeahead_sid: ((v.typeahead_sid || \"\")),\n                result_type: ((v.result_type || \"unknown\"))\n            };\n            s(((\"controls_click_\" + w)));\n            t({\n                path: x.path,\n                referrer: x.referrer,\n                session_id: x.session_id,\n                typeahead_sid: x.typeahead_sid\n            });\n            q(x);\n        },\n        logResultHover: function(v, w) {\n            var x = {\n                action: \"result_hover\",\n                id: ((v.id || 0)),\n                path: ((v.path || \"unknown\")),\n                rank: v.rank,\n                session_id: ((v.session_id || 0)),\n                query_time: v.query_time,\n                time_elapsed: w,\n                typeahead_sid: ((v.typeahead_sid || 0))\n            };\n            s(\"result_hover\");\n            t({\n                path: x.path,\n                session_id: x.session_id,\n                typeahead_sid: x.typeahead_sid\n            });\n            q(x);\n        },\n        logNUXStep: function(v) {\n            var w = {\n                action: \"nux_step\",\n                step: v\n            };\n            q(w);\n        },\n        logDisambiguationImpression: function(v, w, x, y, z) {\n            var aa = {\n                action: \"disambiguation_imp\",\n                ids: y,\n                JSBNG__name: v,\n                path: x,\n                type: w,\n                typeahead_sid: z\n            };\n            q(aa);\n        },\n        logDisambiguationClick: function(v, w, x, y, z, aa) {\n            var ba = {\n                action: \"disambiguation_clk\",\n                id: z,\n                index: y,\n                JSBNG__name: v,\n                path: x,\n                type: w,\n                typeahead_sid: aa\n            };\n            q(ba);\n        }\n    };\n    e.exports = u;\n});\n__d(\"BrowseResultsAreSlow\", [\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = 1500, i = {\n        register: function(j, k) {\n            JSBNG__setTimeout(function() {\n                if (((j.firstChild === k))) {\n                    g.show(k);\n                }\n            ;\n            ;\n            }, h);\n        }\n    };\n    e.exports = i;\n});\n__d(\"LitestandNewsfeedCountUpdater\", [\"Arbiter\",\"AsyncRequest\",\"LitestandMessages\",\"LitestandSidebarBookmarkConfig\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"LitestandMessages\"), j = b(\"LitestandSidebarBookmarkConfig\"), k = b(\"emptyFunction\"), l, m;\n    function n() {\n        ((m && JSBNG__clearTimeout(m)));\n        if (l) {\n            return;\n        }\n    ;\n    ;\n        m = JSBNG__setTimeout(o, j.nf_count_query_interval_ms, false);\n    };\n;\n    function o() {\n        if (l) {\n            return;\n        }\n    ;\n    ;\n        new h().setURI(\"/ajax/litestand/newsfeed_count\").setHandler(function(r) {\n            if (l) {\n                return;\n            }\n        ;\n        ;\n            p(r.getPayload());\n            n();\n        }).setAllowCrossPageTransition(true).send();\n    };\n;\n    function p(r) {\n        g.inform(i.UPDATE_HOME_COUNT, {\n            count: r,\n            onHome: l\n        }, g.BEHAVIOR_STATE);\n    };\n;\n    var q = {\n        init: function() {\n            q.init = k;\n            g.subscribe(i.NEWSFEED_LOAD, function() {\n                l = true;\n                p(0);\n            });\n            g.subscribe(i.LEAVE_HOME, function() {\n                l = false;\n                n();\n            });\n            n();\n        }\n    };\n    e.exports = q;\n});\n__d(\"LitestandChromeHomeCount\", [\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"LitestandMessages\",\"LitestandNewsfeedCountUpdater\",\"$\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"LitestandMessages\"), k = b(\"LitestandNewsfeedCountUpdater\"), l = b(\"$\"), m = b(\"csx\"), n = b(\"cx\"), o = 20, p, q, r, s, t = {\n        init: function(u) {\n            s = u;\n            q = i.JSBNG__find(l(\"pageHead\"), \".-cx-PRIVATE-litestandHomeBadge__badge\");\n            p = q.parentNode;\n            r = false;\n            g.subscribe(j.UPDATE_HOME_COUNT, function(v, w) {\n                t.updateBadge(((w.onHome ? 0 : w.count)));\n            });\n            k.init();\n            t.updateBadge(s);\n        },\n        updateBadge: function(u) {\n            s = u;\n            var v = ((u > 0));\n            t.toggleBadge(v);\n            if (v) {\n                var w = ((((u > o)) ? ((o + \"+\")) : u));\n                i.setContent(q, w);\n            }\n        ;\n        ;\n        },\n        toggleBadge: function(u) {\n            if (((r === u))) {\n                return;\n            }\n        ;\n        ;\n            r = u;\n            h.conditionClass(p, \"-cx-PRIVATE-litestandHomeBadge__hidden\", !u);\n        }\n    };\n    e.exports = t;\n});\n__d(\"clip\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j) {\n        return Math.min(Math.max(h, i), j);\n    };\n;\n    e.exports = g;\n});\n__d(\"FacebarTypeaheadInput\", [\"ArbiterMixin\",\"csx\",\"DOM\",\"FacebarStructuredText\",\"StructuredInput\",\"Vector\",\"copyProperties\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"csx\"), i = b(\"DOM\"), j = b(\"FacebarStructuredText\"), k = b(\"StructuredInput\"), l = b(\"Vector\"), m = b(\"copyProperties\"), n = {\n        text: {\n            className: \"text\",\n            group: \"all\",\n            select: \"none\"\n        },\n        ent: {\n            className: \"entity\",\n            group: \"all\",\n            select: \"group\"\n        },\n        \"ent:hashtag_exact\": {\n            className: \"entity\",\n            group: \"hashtag\",\n            select: \"none\"\n        }\n    }, o = b(\"mixin\");\n    function p(u) {\n        return m(u.toStruct(), {\n            display: ((n[u.getType()] || n[u.getTypePart(0)]))\n        });\n    };\n;\n    var q = o(g);\n    {\n        var fin121keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin121i = (0);\n        var r;\n        for (; (fin121i < fin121keys.length); (fin121i++)) {\n            ((r) = (fin121keys[fin121i]));\n            {\n                if (((q.hasOwnProperty(r) && ((r !== \"_metaprototype\"))))) {\n                    t[r] = q[r];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var s = ((((q === null)) ? null : q.prototype));\n    t.prototype = Object.create(s);\n    t.prototype.constructor = t;\n    t.__superConstructor__ = q;\n    function t(u) {\n        this.root = u;\n        this.input = k.getInstance(u);\n        this.value = null;\n        this.selection = {\n            offset: 0,\n            length: 0\n        };\n        this.resetOnChange = true;\n        this.initEvents();\n    };\n;\n    t.prototype.initEvents = function() {\n        var u = function(v, w) {\n            this.inform(v, w);\n        }.bind(this);\n        this.input.subscribe(\"JSBNG__blur\", u);\n        this.input.subscribe(\"JSBNG__focus\", u);\n        this.input.subscribe(\"change\", function(v, w) {\n            if (this.resetOnChange) {\n                this.value = null;\n            }\n        ;\n        ;\n            this.inform(\"change\", w);\n        }.bind(this));\n    };\n    t.prototype.togglePlaceholder = function(u) {\n        return this.input.togglePlaceholder(u);\n    };\n    t.prototype.JSBNG__focus = function() {\n        this.input.JSBNG__focus();\n    };\n    t.prototype.JSBNG__blur = function() {\n        this.input.JSBNG__blur();\n    };\n    t.prototype.getElement = function() {\n        return this.root;\n    };\n    t.prototype.getRawPlaceholderElement = function() {\n        return i.JSBNG__find(this.root, \".-cx-PUBLIC-uiStructuredInput__placeholder\");\n    };\n    t.prototype.getRawInputElement = function() {\n        return i.scry(this.root, \".-cx-PUBLIC-uiStructuredInput__rich\")[0];\n    };\n    t.prototype.getValue = function() {\n        if (((this.value === null))) {\n            this.value = j.fromStruct(this.input.getStructure());\n        }\n    ;\n    ;\n        return this.value;\n    };\n    t.prototype.getLength = function() {\n        return this.getValue().getLength();\n    };\n    t.prototype.resetPlaceholder = function() {\n        this.input.resetPlaceholder();\n    };\n    t.prototype.setValue = function(u) {\n        u = u.pad();\n        this.value = u;\n        this.resetOnChange = false;\n        var v = u.toArray().map(p);\n        this.input.setStructure(v);\n        this.input.setSelection({\n            offset: u.getLength(),\n            length: 0\n        });\n        this.resetOnChange = true;\n    };\n    t.prototype.storeSelection = function() {\n        this.selection = this.input.JSBNG__getSelection();\n    };\n    t.prototype.restoreSelection = function() {\n        this.input.setSelection(this.selection);\n    };\n    t.prototype.setHint = function(u) {\n        var v = ((u ? u.toArray().map(p) : []));\n        this.input.setHint(v);\n    };\n    t.prototype.isSelectionAtEnd = function() {\n        return this.input.isSelectionAtEnd();\n    };\n    t.prototype.selectInput = function(u) {\n        this.input.setSelection({\n            offset: ((u || 0)),\n            length: this.getLength()\n        });\n    };\n    t.prototype.getEndOffset = function() {\n        var u = l.getElementDimensions(this.root), v = this.input.getContentDimensions();\n        return Math.min(u.x, v.width);\n    };\n    m(t.prototype, {\n        events: [\"change\",\"JSBNG__focus\",\"JSBNG__blur\",]\n    });\n    e.exports = t;\n});\n__d(\"FacebarRender\", [\"DOM\",\"createArrayFrom\",\"hasArrayNature\",\"flattenArray\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"createArrayFrom\"), i = b(\"hasArrayNature\"), j = b(\"flattenArray\"), k = b(\"emptyFunction\");\n    function l() {\n        return j(h(arguments)).filter(k.thatReturnsArgument);\n    };\n;\n    function m(n, o) {\n        return g.create(\"span\", {\n            className: n\n        }, l(o));\n    };\n;\n    e.exports = {\n        span: m,\n        children: l\n    };\n});");
// 8293
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o103,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yw/r/npgrFgy_XMu.js",o104);
// undefined
o103 = null;
// undefined
o104 = null;
// 8298
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"js0se\",]);\n}\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString()\n            };\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\"));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false\n            };\n            i = g(i);\n            return (i.isFacebookURI() && (i.getPath() == \"/ajax/vault/sharer_preview.php\"));\n        }\n    };\n    e.exports = h;\n});\n__d(\"LitestandMessages\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FILTER_SWITCH_BEGIN: \"LitestandMessages/FilterSwitchBegin\",\n        NEWSFEED_LOAD: \"LitestandMessages/NewsFeedLoad\",\n        LEAVE_HOME: \"LitestandMessages/LeaveHome\",\n        UPDATE_HOME_COUNT: \"LitestandMessages/UpdateHomeCount\",\n        STORIES_INSERTED: \"LitestandMessages/StoriesInserted\",\n        STORIES_REMOVED: \"LitestandMessages/StoriesRemoved\",\n        NEWER_STORIES_INSERTED: \"LitestandMessages/NewerStoriesInserted\",\n        EXPAND_FILTER_SWITCHER: \"LitestandMessages/ExpandFilterSwitcher\",\n        RESTORE_FILTER_SWITCHER: \"LitestandMessages/RestoreFilterSwitcher\",\n        NEW_STORY_BAR_CLICK: \"LitestandMessages/NewStoryBarClick\",\n        COLLAPSE_FILTER_SWITCHER: \"LitestandMessages/CollapseFilterSwitcher\",\n        TOUR_BEGIN: \"LitestandMessages/TourBegin\",\n        TOUR_END: \"LitestandMessages/TourEnd\",\n        TOUR_SIDEBAR_HIGHLIGHT: \"LitestandMessages/TourSidebarHighlight\",\n        TOUR_SIDEBAR_UNHIGHLIGHT: \"LitestandMessages/TourSidebarUnhighlight\",\n        RHC_RELOADED: \"LitestandMessages/RHCReloaded\",\n        UNLOCK_FILTER_SWITCHER: \"LitestandMessage/UnlockFilterSwitcher\"\n    };\n    e.exports = g;\n});\n__d(\"MegaphoneHelper\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"DOM\",\"DOMDimensions\",\"Dialog\",\"LitestandMessages\",\"Parent\",\"Run\",\"Style\",\"csx\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Dialog\"), n = b(\"LitestandMessages\"), o = b(\"Parent\"), p = b(\"Run\"), q = b(\"Style\"), r = b(\"csx\"), s = b(\"cx\"), t = b(\"ge\");\n    function u() {\n        var w = k.scry(document.body, \".megaphone_story_wrapper\")[0];\n        (w && k.remove(w));\n        v.removeLitestandHomeWash();\n    };\n    var v = {\n        hideStory: function(w, x, y, z, aa) {\n            var ba = {\n                mp_id: w,\n                location: x,\n                context: z\n            };\n            new j().setURI(\"/ajax/megaphone/megaphone_hide.php\").setMethod(\"POST\").setData(ba).setHandler(function(da) {\n                (aa && aa(da));\n            }).send();\n            var ca = t(y);\n            if (ca) {\n                new h(ca).to(\"height\", 0).duration(500).hide().go();\n            };\n        },\n        createModalStory: function(w, x, y, z) {\n            var aa;\n            if ((!w.buttons || !w.buttons.length)) {\n                w.buttons = m.CLOSE;\n                aa = v.hideStory(x, y, z, null);\n            }\n        ;\n            var ba = new m(w);\n            if (aa) {\n                ba.setHandler(aa);\n            };\n            ba.show();\n        },\n        buttonOnClick: function(w, x, y, z, aa, ba) {\n            var ca = function() {\n                if (aa) {\n                    new j().setURI(z).send();\n                }\n                 else document.location.href = z;\n            ;\n            };\n            if (ba) {\n                v.hideStory(w, x, \"\", y, ca);\n            }\n             else ca();\n        ;\n        },\n        renderFullWidth: function(w, x, y) {\n            var z = t(w);\n            k.prependContent(z, x);\n            if (y) {\n                var aa = l.getElementDimensions(x), ba = g.div({\n                    className: \"-cx-PRIVATE-litestandMegaphone__whitewash\"\n                });\n                q.set(ba, \"height\", (aa.height + \"px\"));\n                var ca = o.byClass(z, \"-cx-PUBLIC-litestandContent__root\");\n                k.prependContent(ca, ba);\n                p.onLeave(u);\n                i.subscribeOnce(n.FILTER_SWITCH_BEGIN, u);\n            }\n        ;\n            i.inform(\"Megaphone/show\", w, i.BEHAVIOR_PERSISTENT);\n        },\n        removeLitestandHomeWash: function() {\n            var w = k.find(document.body, \".-cx-PRIVATE-litestandMegaphone__whitewash\");\n            k.remove(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"legacy:megaphone\", [\"MegaphoneHelper\",], function(a, b, c, d) {\n    a.MegaphoneHelper = b(\"MegaphoneHelper\");\n}, 3);\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return\n            };\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            };\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        };\n        this.fields[m][n] = o;\n        return this;\n    };\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this\n            };\n            return k.call(this, m, n, o);\n        };\n    };\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; (q < o.length); q++) {\n            p.push(new RegExp(o[q], \"i\"));;\n        };\n        return p;\n    };\n    function l(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            };\n        };\n    };\n    function m(o, p) {\n        for (var q = 0; (q < p.length); q++) {\n            if (p[q].test(o)) {\n                return true\n            };\n        };\n        return false;\n    };\n    function n(o, p) {\n        var q = g.stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, document.getElementsByTagName(\"script\"));\n        l(q, document.getElementsByTagName(\"iframe\"));\n        for (var t = 0; (t < q.length); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            };\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            };\n        };\n    };\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            (g[i] && g[i].resetLoadingTimers());\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if ((i && j)) {\n                i = g(i);\n                j = g(j);\n                return ((i.getDomain() == j.getDomain()) && (i.getPath() == j.getPath()));\n            }\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if ((l.length !== m.length)) {\n                return false\n            };\n            for (var n = 0; (n < m.length); n++) {\n                if ((+l[n] < +m[n])) {\n                    return false;\n                }\n                 else if ((+l[n] > +m[n])) {\n                    return true\n                }\n            ;\n            };\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            for (var k in i) {\n                if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                    j[k] = i[k];\n                };\n            };\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = (a.MusicConstants || h);\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = (w || {\n        });\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = (y || \"\");\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if ((t !== this.STATES.LOADING)) {\n                this.resetLoadingTimers();\n                this.previousState = (this.state || t);\n            }\n        ;\n            if ((t === this.STATES.PLAYING)) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n            var u = this.buttonElem.parentNode;\n            (this.state && j.removeClass(u, this.state));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return (s.tracksetableTypes.indexOf(this.mediaType) !== -1);\n        },\n        handleIncomingEvent: function(t, u) {\n            clearTimeout(this._showLoadingTimer);\n            if (((u && u.provider) && (u.provider != this.provider))) {\n                return\n            };\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((u && u.track) && u.track.uri), w = ((u && u.context) && u.context.uri);\n                if (((u && u.playing) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((this.state === this.STATES.LOADING) && (((this.previousState === this.STATES.PAUSED) || (this.previousState === this.STATES.OFFLINE))))) {\n                    clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        },\n        processClick: function(t, u) {\n            if ((u != this.buttonElem)) {\n                if ((this.state === this.STATES.LOADING)) {\n                    (this.previousState && this.setState(this.previousState));\n                };\n                return;\n            }\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if ((this.state != this.STATES.PLAYING)) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", (\"music_play_button_click.\" + this.provider));\n                var w = o.byClass(this.buttonElem, \"-cx-PRIVATE-musicAppIconAttribution__wrapper\");\n                if (w) {\n                    j.addClass(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\");\n                    j.removeClass.curry(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\").defer(3000);\n                }\n            ;\n            }\n        ;\n            var x = (this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\")), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; (ca < ba.length); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((da && (da.provider == aa)) && da.isTracksetable())) {\n                        y.push(da.url);\n                    };\n                };\n            }\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            };\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = (((x && (y.length > 1))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            clearTimeout(this._hideLoadingTimer);\n            clearTimeout(this._showLoadingTimer);\n            clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            (a.Music && a.Music.reInform([this.provider,]));\n            if ((!t && (this.state === this.STATES.LOADING))) {\n                this.setState(this.STATES.PAUSED);\n            };\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = (fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea))));\n        if (!fa) {\n            return\n        };\n        return y(fa, da);\n    };\n    function x(da) {\n        var ea = (o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\"));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0]\n            };\n        }\n    ;\n        return null;\n    };\n    function y(da, event) {\n        (event && event.stop());\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n    function z(da) {\n        (a.Music && a.Music.reInform(da));\n    };\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        for (var ga in fa) {\n            if ((fa[ga].noGC || r(ga))) {\n                fa[ga].handleIncomingEvent(da, ea);\n            }\n             else l.removeButton(ga);\n        ;\n        };\n    };\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return\n            };\n            t = true;\n            k.tracksetableTypes = (da || []);\n            g.listen(document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            (t || ba.init());\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka\n            };\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                });\n            }\n        ;\n            if ((da && !u[da])) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    (na.length && z(na));\n                    u = {\n                    };\n                }.defer();\n            };\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return\n            };\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", (\"music_button_\" + v++));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            (fa && ca(fa, ea));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, (ea ? ga.tooltip : \"\"));\n        });\n    };\n    e.exports = (a.MusicButtonManager || ba);\n});");
// 8299
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s71b8b29965386bdab709a86545eeeb4fbf2046e1");
// 8300
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"js0se\",]);\n}\n;\n;\n__d(\"NotificationURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        localize: function(i) {\n            i = g(i);\n            if (!i.isFacebookURI()) {\n                return i.toString();\n            }\n        ;\n        ;\n            var j = i.getSubdomain();\n            return i.getUnqualifiedURI().getQualifiedURI().setSubdomain(j).toString();\n        },\n        snowliftable: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            i = g(i);\n            return ((i.isFacebookURI() && i.getQueryData().hasOwnProperty(\"fbid\")));\n        },\n        isVaultSetURI: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            i = g(i);\n            return ((i.isFacebookURI() && ((i.getPath() == \"/ajax/vault/sharer_preview.php\"))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"LitestandMessages\", [], function(a, b, c, d, e, f) {\n    var g = {\n        FILTER_SWITCH_BEGIN: \"LitestandMessages/FilterSwitchBegin\",\n        NEWSFEED_LOAD: \"LitestandMessages/NewsFeedLoad\",\n        LEAVE_HOME: \"LitestandMessages/LeaveHome\",\n        UPDATE_HOME_COUNT: \"LitestandMessages/UpdateHomeCount\",\n        STORIES_INSERTED: \"LitestandMessages/StoriesInserted\",\n        STORIES_REMOVED: \"LitestandMessages/StoriesRemoved\",\n        NEWER_STORIES_INSERTED: \"LitestandMessages/NewerStoriesInserted\",\n        EXPAND_FILTER_SWITCHER: \"LitestandMessages/ExpandFilterSwitcher\",\n        RESTORE_FILTER_SWITCHER: \"LitestandMessages/RestoreFilterSwitcher\",\n        NEW_STORY_BAR_CLICK: \"LitestandMessages/NewStoryBarClick\",\n        COLLAPSE_FILTER_SWITCHER: \"LitestandMessages/CollapseFilterSwitcher\",\n        TOUR_BEGIN: \"LitestandMessages/TourBegin\",\n        TOUR_END: \"LitestandMessages/TourEnd\",\n        TOUR_SIDEBAR_HIGHLIGHT: \"LitestandMessages/TourSidebarHighlight\",\n        TOUR_SIDEBAR_UNHIGHLIGHT: \"LitestandMessages/TourSidebarUnhighlight\",\n        RHC_RELOADED: \"LitestandMessages/RHCReloaded\",\n        UNLOCK_FILTER_SWITCHER: \"LitestandMessage/UnlockFilterSwitcher\"\n    };\n    e.exports = g;\n});\n__d(\"MegaphoneHelper\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"DOM\",\"DOMDimensions\",\"Dialog\",\"LitestandMessages\",\"Parent\",\"Run\",\"Style\",\"csx\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Dialog\"), n = b(\"LitestandMessages\"), o = b(\"Parent\"), p = b(\"Run\"), q = b(\"Style\"), r = b(\"csx\"), s = b(\"cx\"), t = b(\"ge\");\n    function u() {\n        var w = k.scry(JSBNG__document.body, \".megaphone_story_wrapper\")[0];\n        ((w && k.remove(w)));\n        v.removeLitestandHomeWash();\n    };\n;\n    var v = {\n        hideStory: function(w, x, y, z, aa) {\n            var ba = {\n                mp_id: w,\n                JSBNG__location: x,\n                context: z\n            };\n            new j().setURI(\"/ajax/megaphone/megaphone_hide.php\").setMethod(\"POST\").setData(ba).setHandler(function(da) {\n                ((aa && aa(da)));\n            }).send();\n            var ca = t(y);\n            if (ca) {\n                new h(ca).to(\"height\", 0).duration(500).hide().go();\n            }\n        ;\n        ;\n        },\n        createModalStory: function(w, x, y, z) {\n            var aa;\n            if (((!w.buttons || !w.buttons.length))) {\n                w.buttons = m.CLOSE;\n                aa = v.hideStory(x, y, z, null);\n            }\n        ;\n        ;\n            var ba = new m(w);\n            if (aa) {\n                ba.setHandler(aa);\n            }\n        ;\n        ;\n            ba.show();\n        },\n        buttonOnClick: function(w, x, y, z, aa, ba) {\n            var ca = function() {\n                if (aa) {\n                    new j().setURI(z).send();\n                }\n                 else JSBNG__document.JSBNG__location.href = z;\n            ;\n            ;\n            };\n            if (ba) {\n                v.hideStory(w, x, \"\", y, ca);\n            }\n             else ca();\n        ;\n        ;\n        },\n        renderFullWidth: function(w, x, y) {\n            var z = t(w);\n            k.prependContent(z, x);\n            if (y) {\n                var aa = l.getElementDimensions(x), ba = g.div({\n                    className: \"-cx-PRIVATE-litestandMegaphone__whitewash\"\n                });\n                q.set(ba, \"height\", ((aa.height + \"px\")));\n                var ca = o.byClass(z, \"-cx-PUBLIC-litestandContent__root\");\n                k.prependContent(ca, ba);\n                p.onLeave(u);\n                i.subscribeOnce(n.FILTER_SWITCH_BEGIN, u);\n            }\n        ;\n        ;\n            i.inform(\"Megaphone/show\", w, i.BEHAVIOR_PERSISTENT);\n        },\n        removeLitestandHomeWash: function() {\n            var w = k.JSBNG__find(JSBNG__document.body, \".-cx-PRIVATE-litestandMegaphone__whitewash\");\n            k.remove(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"legacy:megaphone\", [\"MegaphoneHelper\",], function(a, b, c, d) {\n    a.MegaphoneHelper = b(\"MegaphoneHelper\");\n}, 3);\n__d(\"ScubaSample\", [\"Banzai\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = \"scuba_sample\", h = b(\"Banzai\"), i = b(\"copyProperties\");\n    function j(m, n, o) {\n        this.fields = {\n        };\n        this.flush = function() {\n            if (!m) {\n                return;\n            }\n        ;\n        ;\n            var p = {\n            };\n            i(p, this.fields);\n            p._ds = m;\n            if (n) {\n                p._lid = n;\n            }\n        ;\n        ;\n            p._options = o;\n            h.post(g, p);\n            this.flush = function() {\n            \n            };\n            this.flushed = true;\n        };\n        this.lid = n;\n        return this;\n    };\n;\n    function k(m, n, o) {\n        if (!this.fields[m]) {\n            this.fields[m] = {\n            };\n        }\n    ;\n    ;\n        this.fields[m][n] = o;\n        return this;\n    };\n;\n    function l(m) {\n        return function(n, o) {\n            if (this.flushed) {\n                return this;\n            }\n        ;\n        ;\n            return k.call(this, m, n, o);\n        };\n    };\n;\n    i(j.prototype, {\n        addNormal: l(\"normal\"),\n        addInteger: l(\"int\"),\n        addDenorm: l(\"denorm\")\n    });\n    e.exports = j;\n});\n__d(\"ScriptMonitorReporter\", [\"ScriptMonitor\",\"ScubaSample\",\"setTimeoutAcrossTransitions\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"ScriptMonitor\"), h = b(\"ScubaSample\"), i = b(\"setTimeoutAcrossTransitions\"), j = b(\"URI\");\n    function k(o) {\n        var p = [];\n        for (var q = 0; ((q < o.length)); q++) {\n            p.push(new RegExp(o[q], \"i\"));\n        ;\n        };\n    ;\n        return p;\n    };\n;\n    function l(o, p) {\n        for (var q = 0; ((q < p.length)); q++) {\n            if (p[q].src) {\n                o.push(p[q].src);\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function m(o, p) {\n        for (var q = 0; ((q < p.length)); q++) {\n            if (p[q].test(o)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    function n(o, p) {\n        var q = g.JSBNG__stop(), r = {\n            addGeoFields: 1,\n            addBrowserFields: 1,\n            addUser: 1\n        }, s = {\n        };\n        l(q, JSBNG__document.getElementsByTagName(\"script\"));\n        l(q, JSBNG__document.getElementsByTagName(\"div\"));\n        for (var t = 0; ((t < q.length)); t++) {\n            var u = q[t].replace(/\\?.*/, \"\"), v;\n            if (s[u]) {\n                continue;\n            }\n        ;\n        ;\n            s[u] = 1;\n            if (!j.isValidURI(u)) {\n                v = true;\n            }\n             else if (m(u, p)) {\n                v = false;\n            }\n             else if (m(new j(u).getDomain(), o)) {\n                v = false;\n            }\n             else v = true;\n            \n            \n        ;\n        ;\n            if (v) {\n                new h(\"unknown_scripts\", 0, r).addNormal(\"url\", u).flush();\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    e.exports = {\n        runScan: function(o, p) {\n            i(function() {\n                n(k(o), k(p));\n            }, 5000);\n        }\n    };\n});\n__d(\"MusicButtonStore\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        addButton: function(i, j) {\n            g[i] = j;\n            return j;\n        },\n        getButton: function(i) {\n            return g[i];\n        },\n        getButtons: function() {\n            return g;\n        },\n        removeButton: function(i) {\n            ((g[i] && g[i].resetLoadingTimers()));\n            delete g[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MusicConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        DEBUG: false,\n        LIVE_LISTEN_MIN_SPOTIFY_VERSION: \"spotify-0.6.6.0.g5a9eaca5\",\n        enableDebug: function() {\n            this.DEBUG = true;\n        },\n        sameURLs: function(i, j) {\n            var k = /\\/$/;\n            if (((i && j))) {\n                i = g(i);\n                j = g(j);\n                return ((((i.getDomain() == j.getDomain())) && ((i.getPath() == j.getPath()))));\n            }\n        ;\n        ;\n            return false;\n        },\n        greaterOrEqualToMinimumVersion: function(i, j) {\n            var k = /(?:\\d+\\.)+/, l = i.match(k)[0].split(\".\").slice(0, -1), m = j.match(k)[0].split(\".\").slice(0, -1);\n            if (((l.length !== m.length))) {\n                return false;\n            }\n        ;\n        ;\n            for (var n = 0; ((n < m.length)); n++) {\n                if (((+l[n] < +m[n]))) {\n                    return false;\n                }\n                 else if (((+l[n] > +m[n]))) {\n                    return true;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        sanitizeForProviders: function(i) {\n            var j = {\n            };\n            {\n                var fin122keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin122i = (0);\n                var k;\n                for (; (fin122i < fin122keys.length); (fin122i++)) {\n                    ((k) = (fin122keys[fin122i]));\n                    {\n                        if (this.ALLOWED_EXTERNAL_CONTEXT_PARAMS[k]) {\n                            j[k] = i[k];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return j;\n        },\n        OP: {\n            RESUME: \"RESUME\",\n            PAUSE: \"PAUSE\",\n            PLAY: \"PLAY\",\n            VERSION: \"VERSION\"\n        },\n        STATUS_CHANGE_OP: {\n            STATUS: \"STATUS\",\n            LOGIN: \"LOGIN\",\n            REINFORM: \"REINFORM\"\n        },\n        STATUS_CHANGE_EVENT: {\n            playing: \"PLAY_STATE_CHANGED\",\n            track: \"TRACK_CHANGED\"\n        },\n        DIAGNOSTIC_EVENT: {\n            ALL_PAUSED: \"ALL_PAUSED\",\n            ALL_OFFLINE: \"ALL_OFFLINE\",\n            OFFLINE: \"OFFLINE\",\n            ONLINE: \"ONLINE\",\n            SEARCHING: \"SEARCHING\",\n            HIT: \"HIT\",\n            MISS: \"MISS\",\n            RESIGN: \"RESIGN\",\n            IFRAME_POLLING: \"IFRAME_POLLING\",\n            RELAUNCH: \"RELAUNCH\",\n            STATE_CHANGE: \"STATE_CHANGE\",\n            WRONG_VERSION: \"WRONG_VERSION\",\n            SERVICE_ERROR: \"SERVICE_ERROR\",\n            INCORRECT_ONLINE_STATE: \"INCORRECT_ONLINE_STATE\",\n            LOG_SEND_OP: \"LOG_SEND_OP\",\n            REQUEUE_OP: \"REQUEUE_OP\"\n        },\n        ALLOWED_STATUS_PARAMS: {\n            playing: \"playing\",\n            track: \"track\",\n            context: \"context\",\n            client_version: \"client_version\",\n            start_time: \"start_time\",\n            expires_in: \"expires_in\",\n            open_graph_state: \"open_graph_state\"\n        },\n        ALLOWED_EXTERNAL_CONTEXT_PARAMS: {\n            uri: true,\n            song: true,\n            radio_station: true,\n            album: true,\n            playlist: true,\n            musician: true,\n            song_list: true,\n            offset: true,\n            title: true,\n            request_id: true,\n            listen_with_friends: true,\n            needs_tos: true\n        },\n        LIVE_LISTEN_OP: {\n            NOW_LEADING: \"NOW_LEADING\",\n            NOW_LISTENING: \"NOW_LISTENING\",\n            END_SESSION: \"END_SESSION\",\n            SONG_PLAYING: \"SONG_PLAYING\",\n            LISTENER_UPDATE: \"LISTENER_UPDATE\",\n            QUEUE_SESSION: \"QUEUE_SESSION\",\n            PLAY_ERROR: \"PLAY_ERROR\",\n            SESSION_UPDATED: \"SESSION_UPDATED\",\n            QUEUING_SESSION: \"QUEUING_SESSION\"\n        },\n        MUSIC_BUTTON: {\n            ACTIVATE: \"ACTIVATE\"\n        },\n        ERROR: {\n            1: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM\",\n            2: \"SERVICE_UNAVAILABLE_WITHOUT_PREMIUM_OR_WAIT\",\n            3: \"SERVICE_UNAVAILABLE_BILLING_ISSUE\",\n            4: \"SERVICE_UNAVAILABLE_TECHNICAL_ISSUE\",\n            5: \"AUDIO_AD_PLAYING\",\n            99: \"SERVICE_TEMPORARILY_UNAVAILABLE\",\n            101: \"SONG_UNAVAILABLE_WITHOUT_PURCHASE\",\n            102: \"SONG_UNAVAILABLE_WITHOUT_PREMIUM\",\n            103: \"SONG_UNAVAILABLE_INDEFINITELY\"\n        }\n    };\n    e.exports = ((a.MusicConstants || h));\n});\n__d(\"MusicEvents\", [\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\");\n    e.exports = a.MusicEvents = new g();\n});\n__d(\"MusicButton\", [\"BanzaiODS\",\"Bootloader\",\"copyProperties\",\"JSBNG__CSS\",\"DOM\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"ScubaSample\",\"Tooltip\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiODS\"), h = b(\"Bootloader\"), i = b(\"copyProperties\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"ScubaSample\"), q = b(\"Tooltip\"), r = b(\"cx\"), s = function(t, u, v, w, x, y) {\n        this.provider = t;\n        this.buttonElem = u;\n        this.url = v;\n        this.context = ((w || {\n        }));\n        this.mediaType = x;\n        this.setState(this.STATES.OFFLINE);\n        this.tooltip = ((y || \"\"));\n        n.subscribe(m.MUSIC_BUTTON.ACTIVATE, this.processClick.bind(this));\n    };\n    i(s, {\n        tracksetableTypes: []\n    });\n    i(s.prototype, {\n        SHOW_LOADING_TIMEOUT: 500,\n        HIDE_LOADING_TIMEOUT: 4000,\n        RECENTLY_ONLINE_TIMEOUT: 6000,\n        STATES: {\n            PLAYING: \"music_playing\",\n            PAUSED: \"music_paused\",\n            LOADING: \"music_loading\",\n            DISABLED: \"music_disabled\",\n            OFFLINE: \"music_offline\"\n        },\n        setState: function(t) {\n            if (((t !== this.STATES.LOADING))) {\n                this.resetLoadingTimers();\n                this.previousState = ((this.state || t));\n            }\n        ;\n        ;\n            if (((t === this.STATES.PLAYING))) {\n                q.set(this.buttonElem, this.tooltip);\n            }\n             else q.set(this.buttonElem, \"\");\n        ;\n        ;\n            var u = this.buttonElem.parentNode;\n            ((this.state && j.removeClass(u, this.state)));\n            this.state = t;\n            j.addClass(u, this.state);\n        },\n        isTracksetable: function(t) {\n            return ((s.tracksetableTypes.indexOf(this.mediaType) !== -1));\n        },\n        handleIncomingEvent: function(t, u) {\n            JSBNG__clearTimeout(this._showLoadingTimer);\n            if (((((u && u.provider)) && ((u.provider != this.provider))))) {\n                return;\n            }\n        ;\n        ;\n            switch (t) {\n              case m.DIAGNOSTIC_EVENT.ONLINE:\n            \n              case m.STATUS_CHANGE_EVENT.track:\n            \n              case m.STATUS_CHANGE_EVENT.playing:\n                var v = ((((u && u.track)) && u.track.uri)), w = ((((u && u.context)) && u.context.uri));\n                if (((((u && u.playing)) && ((m.sameURLs(v, this.url) || m.sameURLs(w, this.url)))))) {\n                    this.setState(this.STATES.PLAYING);\n                }\n                 else if (((((this.state === this.STATES.LOADING)) && ((((this.previousState === this.STATES.PAUSED)) || ((this.previousState === this.STATES.OFFLINE))))))) {\n                    JSBNG__clearTimeout(this._attemptingPlayTimer);\n                    this._attemptingPlayTimer = this.setState.bind(this, this.STATES.PAUSED).defer(this.RECENTLY_ONLINE_TIMEOUT, false);\n                }\n                 else if (!this._attemptingPlayTimer) {\n                    this.setState(this.STATES.PAUSED);\n                }\n                \n                \n            ;\n            ;\n                break;\n              case m.DIAGNOSTIC_EVENT.OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n              case m.DIAGNOSTIC_EVENT.ALL_OFFLINE:\n                this.setState(this.STATES.OFFLINE);\n                break;\n            };\n        ;\n        },\n        processClick: function(t, u) {\n            if (((u != this.buttonElem))) {\n                if (((this.state === this.STATES.LOADING))) {\n                    ((this.previousState && this.setState(this.previousState)));\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var v = new p(\"music_play_button_click\", null, {\n                addBrowserFields: true,\n                addGeoFields: true,\n                addUser: true\n            });\n            v.addNormal(\"uses_bridge\", \"1\");\n            v.addNormal(\"state\", this.state);\n            v.addNormal(\"provider\", this.provider);\n            v.addNormal(\"class\", \"MusicButton\");\n            v.addDenorm(\"url\", this.url);\n            v.flush();\n            if (((this.state != this.STATES.PLAYING))) {\n                g.bumpEntityKey(\"music_play_button\", \"music_play_button_click\");\n                g.bumpEntityKey(\"music_play_button\", ((\"music_play_button_click.\" + this.provider)));\n                var w = o.byClass(this.buttonElem, \"-cx-PRIVATE-musicAppIconAttribution__wrapper\");\n                if (w) {\n                    j.addClass(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\");\n                    j.removeClass.curry(w, \"-cx-PRIVATE-musicAppIconAttribution__iconshow\").defer(3000);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var x = ((this.isTracksetable() && o.byClass(this.buttonElem, \"music_trackset_container\"))), y = [];\n            if (x) {\n                var z = x.getAttribute(\"data-trackset-title\"), aa = this.provider, ba = k.scry(x, \".music_button\");\n                for (var ca = 0; ((ca < ba.length)); ca++) {\n                    var da = l.getButton([ba[ca].id,]);\n                    if (((((da && ((da.provider == aa)))) && da.isTracksetable()))) {\n                        y.push(da.url);\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            if (!a.Music) {\n                this.showLoading(true);\n            }\n        ;\n        ;\n            h.loadModules([\"Music\",], function(ea) {\n                var fa = ((((x && ((y.length > 1)))) ? ea.playPauseSongList(this.provider, this.url, y, z, this.context) : ea.playPauseSong(this.provider, this.url, this.context)));\n                this.showLoading(!fa);\n            }.bind(this));\n        },\n        showLoading: function(t) {\n            this.resetLoadingTimers();\n            this._hideLoadingTimer = this._timeout.bind(this, t).defer(this.HIDE_LOADING_TIMEOUT, false);\n            this._showLoadingTimer = this.setState.bind(this, this.STATES.LOADING).defer(this.SHOW_LOADING_TIMEOUT, false);\n        },\n        resetLoadingTimers: function() {\n            JSBNG__clearTimeout(this._hideLoadingTimer);\n            JSBNG__clearTimeout(this._showLoadingTimer);\n            JSBNG__clearTimeout(this._attemptingPlayTimer);\n            this._attemptingPlayTimer = null;\n        },\n        destroy: function() {\n            this.resetLoadingTimers();\n            this.buttonElem = null;\n        },\n        _timeout: function(t) {\n            ((a.Music && a.Music.reInform([this.provider,])));\n            if (((!t && ((this.state === this.STATES.LOADING))))) {\n                this.setState(this.STATES.PAUSED);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"MusicButtonManager\", [\"JSBNG__Event\",\"DOM\",\"KeyedCallbackManager\",\"Layer\",\"MusicButton\",\"MusicButtonStore\",\"MusicConstants\",\"MusicEvents\",\"Parent\",\"$\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"KeyedCallbackManager\"), j = b(\"Layer\"), k = b(\"MusicButton\"), l = b(\"MusicButtonStore\"), m = b(\"MusicConstants\"), n = b(\"MusicEvents\"), o = b(\"Parent\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"ge\"), s = new i(), t = null, u = {\n    }, v = 0;\n    function w(da) {\n        var ea = da.getTarget(), fa = o.byClass(ea, \"music_button\");\n        fa = ((fa || ((!((da.getModifiers && da.getModifiers().any)) && x(ea)))));\n        if (!fa) {\n            return;\n        }\n    ;\n    ;\n        return y(fa, da);\n    };\n;\n    function x(da) {\n        var ea = ((o.byClass(da, \"music_button_trigger\") && o.byClass(da, \"music_button_trigger_group\")));\n        if (ea) {\n            var fa = h.scry(ea, \".music_button\");\n            if (fa.length) {\n                return fa[0];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function y(da, JSBNG__event) {\n        ((JSBNG__event && JSBNG__event.JSBNG__stop()));\n        n.inform(m.MUSIC_BUTTON.ACTIVATE, da);\n        return false;\n    };\n;\n    function z(da) {\n        ((a.Music && a.Music.reInform(da)));\n    };\n;\n    function aa(da, ea) {\n        var fa = l.getButtons();\n        {\n            var fin123keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin123i = (0);\n            var ga;\n            for (; (fin123i < fin123keys.length); (fin123i++)) {\n                ((ga) = (fin123keys[fin123i]));\n                {\n                    if (((fa[ga].noGC || r(ga)))) {\n                        fa[ga].handleIncomingEvent(da, ea);\n                    }\n                     else l.removeButton(ga);\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    var ba = {\n        init: function(da) {\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            t = true;\n            k.tracksetableTypes = ((da || []));\n            g.listen(JSBNG__document.body, \"click\", w);\n            n.subscribe([m.STATUS_CHANGE_EVENT.playing,m.STATUS_CHANGE_EVENT.track,m.DIAGNOSTIC_EVENT.OFFLINE,m.DIAGNOSTIC_EVENT.ALL_OFFLINE,m.DIAGNOSTIC_EVENT.ONLINE,], aa);\n        },\n        add: function(da, ea, fa, ga, ha, ia) {\n            ((t || ba.init()));\n            var ja = ea.id, ka = l.getButton(ja);\n            if (ka) {\n                return ka;\n            }\n        ;\n        ;\n            ka = l.addButton(ja, new k(da, ea, fa, q({\n                button_id: ja\n            }, ga), ha, ia));\n            var la = o.byClass(ea, \"uiOverlay\");\n            if (la) {\n                ka.noGC = true;\n                var ma = j.subscribe(\"destroy\", function(na, oa) {\n                    if (h.contains(oa.getRoot(), ea)) {\n                        l.removeButton(ja);\n                        j.unsubscribe(ma);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            if (((da && !u[da]))) {\n                u[da] = function() {\n                    var na = Object.keys(u);\n                    ((na.length && z(na)));\n                    u = {\n                    };\n                }.defer();\n            }\n        ;\n        ;\n            return ka;\n        },\n        addButton: function(da, ea, fa, ga, ha, ia) {\n            if (!r(ea)) {\n                return;\n            }\n        ;\n        ;\n            var ja = p(ea);\n            return ba.add(da, ja, fa, ga, ha, ia);\n        },\n        asyncAddMusicButton: function(da, ea) {\n            da.setAttribute(\"id\", ((\"music_button_\" + v++)));\n            ca(da, ea);\n        },\n        tryAddButtonInDOM: function(da, ea) {\n            var fa = r(da);\n            ((fa && ca(fa, ea)));\n        },\n        addMusicData: function(da, ea, fa, ga, ha, ia) {\n            s.setResource(da, {\n                provider: ea,\n                uri: fa,\n                context: ga,\n                media_type: ha,\n                tooltip: ia\n            });\n        }\n    };\n    function ca(da, ea) {\n        var fa = h.JSBNG__find(da, \"a.button_anchor\").getAttribute(\"href\");\n        s.executeOrEnqueue(fa, function(ga) {\n            return ba.add(ga.provider, da, ga.uri, ga.context, ga.media_type, ((ea ? ga.tooltip : \"\")));\n        });\n    };\n;\n    e.exports = ((a.MusicButtonManager || ba));\n});");
// 8333
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o106,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y0/r/BIPIZ5kbghZ.js",o107);
// undefined
o106 = null;
// undefined
o107 = null;
// 8930
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"zBhY6\",]);\n}\n;\n__d(\"MercuryAPIArgsSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        JEWEL: \"jewel\",\n        CHAT: \"chat\",\n        MERCURY: \"mercury\",\n        WEBMESSENGER: \"web_messenger\"\n    };\n});\n__d(\"MercuryActionStatus\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNCONFIRMED: 3,\n        UNSENT: 0,\n        RESENDING: 7,\n        RESENT: 6,\n        UNABLE_TO_CONFIRM: 5,\n        FAILED_UNKNOWN_REASON: 4,\n        SUCCESS: 1,\n        ERROR: 10\n    };\n});\n__d(\"MercuryActionTypeConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        LOG_MESSAGE: \"ma-type:log-message\",\n        CLEAR_CHAT: \"ma-type:clear_chat\",\n        UPDATE_ACTION_ID: \"ma-type:update-action-id\",\n        DELETE_MESSAGES: \"ma-type:delete-messages\",\n        CHANGE_FOLDER: \"ma-type:change-folder\",\n        SEND_MESSAGE: \"ma-type:send-message\",\n        CHANGE_ARCHIVED_STATUS: \"ma-type:change-archived-status\",\n        DELETE_THREAD: \"ma-type:delete-thread\",\n        USER_GENERATED_MESSAGE: \"ma-type:user-generated-message\",\n        CHANGE_READ_STATUS: \"ma-type:change_read_status\",\n        CHANGE_MUTE_SETTINGS: \"ma-type:change-mute-settings\"\n    };\n});\n__d(\"MercuryAttachmentContentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNKNOWN: \"attach:unknown\",\n        PHOTO: \"attach:image\",\n        VIDEO: \"attach:video\",\n        MSWORD: \"attach:ms:word\",\n        VOICE: \"attach:voice\",\n        MSPPT: \"attach:ms:ppt\",\n        TEXT: \"attach:text\",\n        MUSIC: \"attach:music\",\n        MSXLS: \"attach:ms:xls\"\n    };\n});\n__d(\"MercuryAttachmentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        STICKER: \"sticker\",\n        PHOTO: \"photo\",\n        FILE: \"file\",\n        SHARE: \"share\",\n        ERROR: \"error\"\n    };\n});\n__d(\"MercuryErrorType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER: 1,\n        TRANSPORT: 2,\n        TIMEOUT: 3\n    };\n});\n__d(\"MercuryGenericConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PENDING_THREAD_ID: \"pending:pending\"\n    };\n});\n__d(\"MercuryGlobalActionType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MARK_ALL_READ: \"mga-type:mark-all-read\"\n    };\n});\n__d(\"MercuryLogMessageType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_ERROR: \"log:error-msg\",\n        UNSUBSCRIBE: \"log:unsubscribe\",\n        JOINABLE_JOINED: \"log:joinable-joined\",\n        JOINABLE_CREATED: \"log:joinable-created\",\n        LIVE_LISTEN: \"log:live-listen\",\n        PHONE_CALL: \"log:phone-call\",\n        THREAD_IMAGE: \"log:thread-image\",\n        THREAD_NAME: \"log:thread-name\",\n        VIDEO_CALL: \"log:video-call\",\n        SUBSCRIBE: \"log:subscribe\"\n    };\n});\n__d(\"MercuryParticipantTypes\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        FRIEND: \"friend\",\n        USER: \"user\",\n        THREAD: \"thread\",\n        EVENT: \"event\",\n        PAGE: \"page\"\n    };\n});\n__d(\"MercuryPayloadSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_INITIAL_DATA: \"server_initial_data\",\n        CLIENT_DELETE_THREAD: \"client_delete_thread\",\n        SERVER_SAVE_DRAFT: \"server_save_draft\",\n        SERVER_CHANGE_ARCHIVED_STATUS: \"server_change_archived_status\",\n        SERVER_SEARCH: \"server_search\",\n        CLIENT_CHANGE_MUTE_SETTINGS: \"client_change_mute_settings\",\n        SERVER_UNREAD_THREADS: \"server_unread_threads\",\n        SERVER_MARK_SEEN: \"server_mark_seen\",\n        SERVER_THREAD_SYNC: \"server_thread_sync\",\n        CLIENT_DELETE_MESSAGES: \"client_delete_messages\",\n        SERVER_FETCH_THREADLIST_INFO: \"server_fetch_threadlist_info\",\n        CLIENT_CHANNEL_MESSAGE: \"client_channel_message\",\n        CLIENT_CHANGE_FOLDER: \"client_change_folder\",\n        CLIENT_CHANGE_READ_STATUS: \"client_change_read_status\",\n        CLIENT_CLEAR_CHAT: \"client_clear_chat\",\n        SERVER_FETCH_THREAD_INFO: \"server_fetch_thread_info\",\n        SERVER_CHANGE_READ_STATUS: \"server_change_read_status\",\n        SERVER_SEND_MESSAGE: \"server_send_message\",\n        CLIENT_SAVE_DRAFT: \"client_save_draft\",\n        UNKNOWN: \"unknown\",\n        SERVER_MARK_FOLDER_READ: \"server_mark_folder_read\",\n        SERVER_CONFIRM_MESSAGES: \"server_confirm_messages\",\n        SERVER_TAB_PRESENCE: \"server_tab_presence\",\n        CLIENT_CHANGE_ARCHIVED_STATUS: \"client_change-archived_status\",\n        CLIENT_SEND_MESSAGE: \"client_send_message\",\n        CLIENT_HANDLE_ERROR: \"client_handle_error\"\n    };\n});\n__d(\"MercurySourceType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        GIGABOXX_BLAST: \"source:gigaboxx:blast\",\n        TITAN_FACEWEB_BUFFY: \"source:titan:faceweb_buffy\",\n        TITAN_FACEWEB_UNKNOWN: \"source:titan:faceweb_unknown\",\n        CHAT_WEB: \"source:chat:web\",\n        WEBRTC_MOBILE: \"source:webrtc:mobile\",\n        GIGABOXX_API: \"source:gigaboxx:api\",\n        TITAN_M_JAPAN: \"source:titan:m_japan\",\n        BUFFY_SMS: \"source:buffy:sms\",\n        SEND_PLUGIN: \"source:sendplugin\",\n        CHAT_MEEBO: \"source:chat:meebo\",\n        TITAN_FACEWEB_IPAD: \"source:titan:faceweb_ipad\",\n        TITAN_FACEWEB_IPHONE: \"source:titan:faceweb_iphone\",\n        TEST: \"source:test\",\n        WEB: \"source:web\",\n        SOCIALFOX: \"source:socialfox\",\n        EMAIL: \"source:email\",\n        TITAN_API: \"source:titan:api\",\n        GIGABOXX_WEB: \"source:gigaboxx:web\",\n        DESKTOP: \"source:desktop\",\n        TITAN_FACEWEB_ANDROID: \"source:titan:faceweb_android\",\n        LEIA: \"source:leia\",\n        CHAT_JABBER: \"source:chat:jabber\",\n        CHAT_TEST: \"source:chat:test\",\n        SHARE_DIALOG: \"source:share:dialog\",\n        GIGABOXX_WAP: \"source:gigaboxx:wap\",\n        CHAT: \"source:chat\",\n        TITAN_M_APP: \"source:titan:m_app\",\n        TITAN_M_TOUCH: \"source:titan:m_touch\",\n        TITAN_ORCA: \"source:titan:orca\",\n        TITAN_WAP: \"source:titan:wap\",\n        TITAN_EMAIL_REPLY: \"source:titan:emailreply\",\n        CHAT_IPHONE: \"source:chat:iphone\",\n        SMS: \"source:sms\",\n        TITAN_M_BASIC: \"source:titan:m_basic\",\n        TITAN_M_MINI: \"source:titan:m_mini\",\n        GIGABOXX_MOBILE: \"source:gigaboxx:mobile\",\n        UNKNOWN: \"source:unknown\",\n        TITAN_WEB: \"source:titan:web\",\n        TITAN_M_ZERO: \"source:titan:m_zero\",\n        MOBILE: \"source:mobile\",\n        PAID_PROMOTION: \"source:paid_promotion\",\n        TITAN_API_MOBILE: \"source:titan:api_mobile\",\n        HELPCENTER: \"source:helpcenter\",\n        GIGABOXX_EMAIL_REPLY: \"source:gigaboxx:emailreply\",\n        CHAT_ORCA: \"source:chat:orca\",\n        TITAN_M_TALK: \"source:titan:m_talk\",\n        NEW_SHARE_DIALOG: \"source:share:dialog:new\"\n    };\n});\n__d(\"MercuryThreadMode\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        EMAIL_ORIGINATED: 1,\n        OBJECT_ORIGINATED: 3,\n        TITAN_ORIGINATED: 2\n    };\n});\n__d(\"MessagingTag\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MTA_SYSTEM_MESSAGE: \"MTA:system_message\",\n        SENT: \"sent\",\n        INBOX: \"inbox\",\n        SMS_TAG_ROOT: \"SMSShortcode:\",\n        UPDATES: \"broadcasts_inbox\",\n        OTHER: \"other\",\n        GROUPS: \"groups\",\n        FILTERED_CONTENT: \"filtered_content\",\n        ACTION_ARCHIVED: \"action:archived\",\n        UNREAD: \"unread\",\n        BCC: \"header:bcc\",\n        SMS_MUTE: \"sms_mute\",\n        ARCHIVED: \"archived\",\n        DOMAIN_AUTH_PASS: \"MTA:dmarc:pass\",\n        EVENT: \"event\",\n        VOICEMAIL: \"voicemail\",\n        DOMAIN_AUTH_FAIL: \"MTA:dmarc:fail\",\n        SPAM_SPOOFING: \"spam:spoofing\",\n        SPOOF_WARNING: \"MTA:spoof_warning\",\n        SPAM: \"spam\",\n        EMAIL_MESSAGE: \"source:email\",\n        EMAIL: \"email\",\n        APP_ID_ROOT: \"app_id:\"\n    };\n});\n__d(\"PresenceUtil\", [\"Cookie\",\"Env\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Env\"), i = b(\"randomInt\"), j = b(\"tx\"), k = (i(0, 4294967295) + 1), l = {\n        checkMaintenanceError: function(m) {\n            if ((m.getError() == 1356007)) {\n                return true\n            };\n            return false;\n        },\n        getErrorDescription: function(m) {\n            var n = m.getError(), o = m.getErrorDescription();\n            if (!o) {\n                o = \"An error occurred.\";\n            };\n            if ((n == 1357001)) {\n                o = \"Your session has timed out. Please log in.\";\n            };\n            return o;\n        },\n        getSessionID: function() {\n            return k;\n        },\n        hasUserCookie: function() {\n            return (h.user === g.get(\"c_user\"));\n        }\n    };\n    e.exports = l;\n});\n__d(\"PresencePrivacy\", [\"hasArrayNature\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"copyProperties\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"PresencePrivacyInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"copyProperties\"), l = b(\"Env\"), m = b(\"JSLogger\"), n = b(\"PresenceUtil\"), o = b(\"PresencePrivacyInitialData\"), p = \"/ajax/chat/privacy/settings.php\", q = \"/ajax/chat/privacy/online_policy.php\", r = \"/ajax/chat/privacy/visibility.php\", s = \"friend_visibility\", t = \"visibility\", u = \"online_policy\", v = k({\n    }, o.privacyData), w = o.visibility, x = k({\n    }, o.privacyData), y = w, z = o.onlinePolicy, aa = z, ba = [], ca = false;\n    function da() {\n        return m.create(\"blackbird\");\n    };\n    var ea = k(new h(), {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1\n    });\n    function fa(ra) {\n        var sa;\n        for (sa in ra) {\n            var ta = ra[sa];\n            if ((sa == l.user)) {\n                da().error(\"set_viewer_visibility\");\n                throw new Error(\"Invalid to set current user's visibility\");\n            }\n        ;\n            switch (ta) {\n              case ea.WHITELISTED:\n            \n              case ea.BLACKLISTED:\n            \n              case ea.UNLISTED:\n                break;\n              default:\n                da().error(\"set_invalid_friend_visibility\", {\n                    id: sa,\n                    value: ta\n                });\n                throw new Error((\"Invalid state: \" + ta));\n            };\n        };\n        for (sa in ra) {\n            v[sa] = ra[sa];;\n        };\n        ea.inform(\"privacy-changed\");\n    };\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\n    };\n    function ha(ra) {\n        switch (ra) {\n          case ea.ONLINE:\n        \n          case ea.OFFLINE:\n            break;\n          default:\n            da().error(\"set_invalid_visibility\", {\n                value: ra\n            });\n            throw new Error((\"Invalid visibility: \" + ra));\n        };\n        w = ra;\n        ea.inform(\"privacy-changed\");\n        ea.inform(\"privacy-user-presence-changed\");\n        h.inform(\"chat/visibility-changed\", {\n            sender: this\n        });\n    };\n    function ia(ra) {\n        switch (ra) {\n          case ea.ONLINE_TO_WHITELIST:\n        \n          case ea.ONLINE_TO_BLACKLIST:\n            break;\n          default:\n            throw new Error((\"Invalid default online policy: \" + ra));\n        };\n        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\n    };\n    function ka(ra, sa) {\n        ba.push({\n            request: ra,\n            data: sa\n        });\n        if (!ca) {\n            var ta = ba.shift();\n            ja(ta.request, ta.data);\n        }\n    ;\n    };\n    function la(ra, sa) {\n        var ta = ra.type;\n        if ((ta === s)) {\n            var ua = sa.payload.user_availabilities;\n            if (!g(ua)) {\n                ea.inform(\"privacy-availability-changed\", {\n                    user_availabilities: ua\n                });\n                for (var va in ra.settings) {\n                    x[va] = ra.settings[va];;\n                };\n            }\n        ;\n        }\n         else {\n            if ((ta === t)) {\n                y = ra.visibility;\n            }\n             else if ((ta === u)) {\n                aa = ra.online_policy;\n            }\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n    function ma(ra, sa) {\n        if ((w !== y)) {\n            ha(y);\n        };\n        if ((z !== aa)) {\n            ia(aa);\n        };\n        k(v, x);\n        ea.inform(\"privacy-changed\");\n        ba = [];\n        da().log(\"set_error_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n    function na(ra) {\n        ca = false;\n        if ((ba.length > 0)) {\n            var sa = ba.shift();\n            ja(sa.request, sa.data);\n        }\n    ;\n    };\n    function oa(ra, sa) {\n        if ((n != null)) {\n            var ta = ra.getData();\n            ta.window_id = n.getSessionID();\n            ra.setData(ta);\n        }\n    ;\n        ra.setHandler(la.bind(this, sa)).setErrorHandler(ma.bind(this, sa)).setTransportErrorHandler(ma.bind(this, sa)).setFinallyHandler(na.bind(this)).setAllowCrossPageTransition(true);\n        return ra;\n    };\n    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\n    };\n    function qa(ra, sa) {\n        var ta = sa.obj;\n        if ((ta.viewer_id != l.user)) {\n            da().error(\"invalid_viewer_for_channel_message\", {\n                type: ra,\n                data: sa\n            });\n            throw new Error(\"Viewer got from the channel is not the real viewer\");\n        }\n    ;\n        if ((ta.window_id === n.getSessionID())) {\n            return\n        };\n        var ua = ta.data;\n        if ((ta.event == \"access_control_entry\")) {\n            ua.target_ids.forEach(function(wa) {\n                ga(wa, ua.setting);\n                x[wa] = ua.setting;\n            });\n        }\n         else {\n            if ((ta.event == \"visibility_update\")) {\n                var va = (!!ua.visibility ? ea.ONLINE : ea.OFFLINE);\n                ha(va);\n                y = va;\n            }\n             else if ((ta.event == \"online_policy_update\")) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\n        });\n    };\n    k(ea, {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1,\n        init: function(ra, sa, ta) {\n        \n        },\n        setVisibility: function(ra) {\n            y = w;\n            ha(ra);\n            var sa = {\n                visibility: ra\n            }, ta = {\n                type: t,\n                visibility: ra\n            }, ua = pa(r, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_visibility\", {\n                data: sa\n            });\n            return ra;\n        },\n        getVisibility: function() {\n            return w;\n        },\n        setOnlinePolicy: function(ra) {\n            aa = z;\n            ia(ra);\n            var sa = {\n                online_policy: ra\n            }, ta = {\n                type: u,\n                online_policy: ra\n            }, ua = pa(q, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_online_policy\", {\n                data: sa\n            });\n            return ra;\n        },\n        getOnlinePolicy: function() {\n            return z;\n        },\n        getFriendVisibility: function(ra) {\n            return (v[ra] || ea.UNLISTED);\n        },\n        allows: function(ra) {\n            if ((this.getVisibility() === ea.OFFLINE)) {\n                return false\n            };\n            var sa = this.getOnlinePolicy();\n            return ((sa === ea.ONLINE_TO_WHITELIST) ? (v[ra] == ea.WHITELISTED) : (v[ra] != ea.BLACKLISTED));\n        },\n        setFriendsVisibility: function(ra, sa) {\n            if ((ra.length > 0)) {\n                var ta = {\n                };\n                for (var ua = 0; (ua < ra.length); ua++) {\n                    var va = ra[ua];\n                    x[va] = v[va];\n                    ta[va] = sa;\n                };\n                fa(ta);\n                var wa = sa;\n                if ((wa == ea.UNLISTED)) {\n                    wa = x[ra[0]];\n                };\n                var xa = {\n                    users: ra,\n                    setting: sa,\n                    setting_type: wa\n                }, ya = {\n                    type: s,\n                    settings: ta\n                }, za = pa(p, xa, ya);\n                ka(za, ya);\n                da().log(\"set_friend_visibility\", {\n                    data: xa\n                });\n            }\n        ;\n            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            for (var ta in ra) {\n                x[ta] = v[ta];;\n            };\n            fa(ra);\n            var ua = {\n                type: s,\n                settings: ra\n            };\n            ka(oa(sa, ua), ua);\n            da().log(\"set_friend_visibility_from_map\", {\n                data: ra\n            });\n        },\n        allow: function(ra) {\n            if (this.allows(ra)) {\n                da().error(\"allow_already_allowed\");\n                throw new Error((\"allow() should only be called for users that \" + \"are not already allowed\"));\n            }\n        ;\n            if ((this.getVisibility() === ea.OFFLINE)) {\n                da().error(\"allow_called_while_offline\");\n                throw new Error(\"allow() should only be called when the user is already online\");\n            }\n        ;\n            var sa = ((this.getOnlinePolicy() === ea.ONLINE_TO_WHITELIST) ? ea.WHITELISTED : ea.UNLISTED);\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        disallow: function(ra) {\n            if (!this.allows(ra)) {\n                da().error(\"disallow_already_disallowed\");\n                throw new Error((\"disallow() should only be called for users that \" + \"are not already disallowed\"));\n            }\n        ;\n            if ((this.getVisibility() === ea.OFFLINE)) {\n                da().error(\"disallow_called_while_offline\");\n                throw new Error(\"disallow() should only be called when the user is already online\");\n            }\n        ;\n            var sa = ((this.getOnlinePolicy() === ea.ONLINE_TO_BLACKLIST) ? ea.BLACKLISTED : ea.UNLISTED);\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        getBlacklist: function() {\n            var ra = [];\n            for (var sa in v) {\n                if ((v[sa] === ea.BLACKLISTED)) {\n                    ra.push(sa);\n                };\n            };\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            for (var sa in v) {\n                if ((v[sa] === ea.WHITELISTED)) {\n                    ra.push(sa);\n                };\n            };\n            return ra;\n        },\n        getMapForTest: function() {\n            return v;\n        },\n        setMapForTest: function(ra) {\n            v = ra;\n        }\n    });\n    ea.inform(\"privacy-changed\");\n    ea.inform(\"privacy-user-presence-changed\");\n    da().log(\"initialized\", {\n        visibility: w,\n        policy: z\n    });\n    h.subscribe(j.getArbiterType(\"privacy_changed\"), qa.bind(this));\n    h.subscribe(j.ON_CONFIG, function(ra, sa) {\n        var ta = sa.getConfig(\"visibility\", null);\n        if (((ta !== null) && (typeof (ta) !== \"undefined\"))) {\n            var ua = (ta ? ea.ONLINE : ea.OFFLINE);\n            ha(ua);\n            da().log(\"config_visibility\", {\n                vis: ua\n            });\n        }\n    ;\n    }.bind(this));\n    a.PresencePrivacy = e.exports = ea;\n}, 3);\n__d(\"ChatVisibility\", [\"Arbiter\",\"JSLogger\",\"PresencePrivacy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = {\n        isOnline: function() {\n            return (i.getVisibility() === i.ONLINE);\n        },\n        hasBlackbirdEnabled: function() {\n            return (this.isVisibleToMostFriends() || this.isVisibleToSomeFriends());\n        },\n        isVisibleToMostFriends: function() {\n            return ((i.getOnlinePolicy() === i.ONLINE_TO_BLACKLIST) && (i.getBlacklist().length > 0));\n        },\n        isVisibleToSomeFriends: function() {\n            return ((i.getOnlinePolicy() === i.ONLINE_TO_WHITELIST) && (i.getWhitelist().length > 0));\n        },\n        goOnline: function(k) {\n            if ((i.getVisibility() === i.OFFLINE)) {\n                h.create(\"blackbird\").log(\"chat_go_online\");\n                i.setVisibility(i.ONLINE);\n                g.inform(\"chat-visibility/go-online\");\n            }\n        ;\n            (k && k());\n        },\n        goOffline: function(k) {\n            if ((i.getVisibility() === i.ONLINE)) {\n                h.create(\"blackbird\").log(\"chat_go_offline\");\n                i.setVisibility(i.OFFLINE);\n                g.inform(\"chat-visibility/go-offline\");\n            }\n        ;\n            (k && k());\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\n        ;\n        }\n    };\n    a.ChatVisibility = e.exports = j;\n}, 3);\n__d(\"MercurySingletonMixin\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        _getInstances: function() {\n            if (!this._instances) {\n                this._instances = {\n                };\n            };\n            return this._instances;\n        },\n        get: function() {\n            return this.getForFBID(g.user);\n        },\n        getForFBID: function(i) {\n            var j = this._getInstances();\n            if (!j[i]) {\n                j[i] = new this(i);\n            };\n            return j[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryMessageClientState\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DO_NOT_SEND_TO_SERVER: \"do_not_send_to_server\",\n        SEND_TO_SERVER: \"send_to_server\"\n    };\n    e.exports = g;\n});\n__d(\"MercuryMessageIDs\", [\"KeyedCallbackManager\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = new g(), i = {\n        getServerIDs: function(j, k) {\n            var l = j.filter(function(n) {\n                return (n.indexOf(\"mail.projektitan.com\") !== -1);\n            }), m = function(n) {\n                var o = j.map(function(p) {\n                    return (n[p] ? n[p] : p);\n                });\n                k(o);\n            };\n            return h.executeOrEnqueue(l, m);\n        },\n        addServerID: function(j, k) {\n            h.setResource(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImageSourceType\", [], function(a, b, c, d, e, f) {\n    var g = {\n        PROFILE_PICTURE: \"profile_picture\",\n        IMAGE: \"image\"\n    };\n    e.exports = g;\n});\n__d(\"PhotoResizeModeConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COVER: \"s\",\n        CONTAIN: \"p\"\n    };\n    e.exports = g;\n});\n__d(\"ImageSourceRequest\", [\"arrayContains\",\"extendArray\",\"copyProperties\",\"Env\",\"KeyedCallbackManager\",\"ImageSourceType\",\"PhotoResizeModeConst\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"extendArray\"), i = b(\"copyProperties\"), j = b(\"Env\"), k = b(\"KeyedCallbackManager\"), l = b(\"ImageSourceType\"), m = b(\"PhotoResizeModeConst\"), n = b(\"MercuryServerDispatcher\");\n    function o() {\n        this._request = {\n            fbid: null,\n            type: null,\n            width: null,\n            height: null,\n            resize_mode: null\n        };\n        this._callback = null;\n    };\n    i(o.prototype, {\n        setFBID: function(s) {\n            this._request.fbid = s;\n            return this;\n        },\n        setType: function(s) {\n            if (!g([l.PROFILE_PICTURE,l.IMAGE,], s)) {\n                throw new TypeError((\"ImageSourceRequest.setType: invalid type \" + s))\n            };\n            this._request.type = s;\n            return this;\n        },\n        setDimensions: function(s, t) {\n            this._request.width = s;\n            this._request.height = t;\n            return this;\n        },\n        setResizeMode: function(s) {\n            if (!g([m.COVER,m.CONTAIN,], s)) {\n                throw new TypeError((\"ImageSourceRequest.setResizeMode: invalid resize mode \" + s))\n            };\n            this._request.resize_mode = s;\n            return this;\n        },\n        setCallback: function(s) {\n            this._callback = s;\n            return this;\n        },\n        send: function() {\n            if ((((((!this._request.fbid || !this._request.width) || !this._request.height) || !this._request.type) || !this._request.resize_mode) || !this._callback)) {\n                throw new Error(\"ImageSourceRequest: You must set all the fields\")\n            };\n            var s = q(), t = r(this._request);\n            s.executeOrEnqueue(t, this._callback);\n            if ((s.getUnavailableResourcesFromRequest(t).length === 1)) {\n                n.trySend(\"/ajax/image_source.php\", {\n                    requests: [this._request,]\n                });\n                return true;\n            }\n        ;\n            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p\n        };\n        var s = new k();\n        p = s;\n        n.registerEndpoints({\n            \"/ajax/image_source.php\": {\n                request_user_id: j.user,\n                mode: n.BATCH_DEFERRED_MULTI,\n                batch_function: function(t, u) {\n                    h(t.requests, u.requests);\n                    return t;\n                },\n                handler: function(t, u) {\n                    var v = u.getData().requests;\n                    for (var w = 0; (w < v.length); ++w) {\n                        s.setResource(r(v[w]), t[w]);;\n                    };\n                }\n            }\n        });\n        return s;\n    };\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\n    };\n    e.exports = o;\n});\n__d(\"MercuryIDs\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((typeof i === \"string\") && (i.indexOf(\":\") !== -1));\n    };\n    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false\n            };\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false\n            };\n            var j = h.tokenize(i);\n            switch (j.type) {\n              case \"user\":\n            \n              case \"group\":\n            \n              case \"thread\":\n            \n              case \"root\":\n            \n              case \"pending\":\n                return true;\n              default:\n                return false;\n            };\n        },\n        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\"\n            };\n            var j = i.indexOf(\":\");\n            return {\n                type: i.substr(0, j),\n                value: i.substr((j + 1))\n            };\n        },\n        getUserIDFromParticipantID: function(i) {\n            if (!h.isValid(i)) {\n                return null\n            };\n            var j = h.tokenize(i);\n            if ((j.type != \"fbid\")) {\n                return null\n            };\n            return j.value;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryAssert\", [\"MercuryIDs\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryIDs\");\n    e.exports = {\n        isParticipantID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_participant_id\"\n            };\n        },\n        allParticipantIDs: function(h) {\n            h.forEach(this.isParticipantID);\n        },\n        isUserParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if ((i.type != \"fbid\")) {\n                throw \"bad_user_id\"\n            };\n        },\n        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if ((i.type != \"email\")) {\n                throw \"bad_email_id\"\n            };\n        },\n        allThreadID: function(h) {\n            h.forEach(this.isThreadID);\n        },\n        isThreadID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_thread_id\"\n            };\n        }\n    };\n});\n__d(\"TimestampConverter\", [\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = g.create(\"timestamp_converter\");\n    function i(k) {\n        return (((typeof (k) == \"string\")) && (k.length > 6));\n    };\n    var j = {\n        convertActionIDToTimestamp: function(k) {\n            if (i(k)) {\n                var l = k.slice(0, -6);\n                return parseInt(l, 10);\n            }\n        ;\n        },\n        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l\n            };\n            if (!i(l)) {\n                return k\n            };\n            return (this.isGreaterThan(k, l) ? k : l);\n        },\n        isGreaterThan: function(k, l) {\n            if ((!i(k) || !i(l))) {\n                return false\n            };\n            return (this.convertActionIDToTimestamp(k) > this.convertActionIDToTimestamp(l));\n        }\n    };\n    e.exports = j;\n});\n__d(\"MessagingReliabilityLogger\", [\"function-extensions\",\"PresenceUtil\",\"MercuryServerDispatcher\",\"MessagingReliabilityLoggerInitialData\",\"isEmpty\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PresenceUtil\"), h = b(\"MercuryServerDispatcher\"), i = b(\"MessagingReliabilityLoggerInitialData\"), j = b(\"isEmpty\"), k = b(\"setTimeoutAcrossTransitions\"), l = \"/ajax/mercury/client_reliability.php\", m = 60000;\n    function n(t, u) {\n        var v = {\n            app: i.app,\n            categories: JSON.stringify(t)\n        };\n        if (!j(u)) {\n            v.extra = JSON.stringify(u);\n        };\n        return v;\n    };\n    function o(t, u, v, w) {\n        if ((t[u] === undefined)) {\n            t[u] = {\n            };\n        };\n        if ((t[u][v] === undefined)) {\n            t[u][v] = 0;\n        };\n        t[u][v] += w;\n    };\n    function p(t, u, v, w) {\n        if ((t[u] === undefined)) {\n            t[u] = {\n            };\n        };\n        if ((t[u][v] === undefined)) {\n            t[u][v] = [];\n        };\n        for (var x = 0; (x < w.length); ++x) {\n            t[u][v].push(w[x]);;\n        };\n    };\n    function q(t, u) {\n        if ((((t && !t.categories)) || ((u && !u.categories)))) {\n            return\n        };\n        var v = (t ? JSON.parse(t.categories) : {\n        }), w = ((t && t.extra) ? JSON.parse(t.extra) : {\n        }), x = JSON.parse(u.categories), y = (u.extra ? JSON.parse(u.extra) : {\n        });\n        for (var z in x) {\n            var aa = x[z], ba = y[z];\n            for (var ca in aa) {\n                o(v, z, ca, aa[ca]);\n                if ((ba !== undefined)) {\n                    var da = ba[ca];\n                    if ((da !== undefined)) {\n                        p(w, z, ca, da);\n                    };\n                }\n            ;\n            };\n        };\n        return n(v, w);\n    };\n    var r = {\n    };\n    r[l] = {\n        mode: h.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR,\n        batch_function: q\n    };\n    h.registerEndpoints(r);\n    var s = {\n        addEntry: function(t, u, v) {\n            if (!i.enabled) {\n                return\n            };\n            var w = {\n            };\n            o(w, t, u, 1);\n            var x = {\n            };\n            if ((v !== undefined)) {\n                p(x, t, u, [v,]);\n            };\n            h.trySend(l, n(w, x));\n        }\n    };\n    (function t() {\n        s.addEntry(\"page_event\", \"active\", g.getSessionID());\n        k(t, m);\n    })();\n    e.exports = s;\n});\n__d(\"MercuryThreadInformer\", [\"ArbiterMixin\",\"copyProperties\",\"MercuryAssert\",\"MercurySingletonMixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"MercuryAssert\"), j = b(\"MercurySingletonMixin\");\n    function k(m) {\n        if (!m._locked) {\n            var n = m._threadDeletions, o = m._threadChanges, p = m._threadReadChanges, q = m._threadlistChanged, r = m._unseenStateChanged, s = m._unreadStateChanged, t = m._receivedMessages, u = m._reorderedMessages, v = m._updatedMessages;\n            m._threadDeletions = {\n            };\n            m._threadChanges = {\n            };\n            m._threadReadChanges = {\n            };\n            m._threadlistChanged = false;\n            m._unseenStateChanged = false;\n            m._unreadStateChanged = false;\n            m._receivedMessages = {\n            };\n            m._reorderedMessages = {\n            };\n            m._updatedMessages = {\n            };\n            var w = Object.keys(o);\n            if ((w.length || q)) {\n                m.inform(\"threadlist-updated\", w);\n            };\n            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            };\n            for (var x in p) {\n                m.inform(\"thread-read-changed\", p);\n                break;\n            };\n            for (var x in n) {\n                m.inform(\"threads-deleted\", n);\n                break;\n            };\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            };\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            };\n            for (x in t) {\n                m.inform(\"messages-received\", t);\n                break;\n            };\n            for (x in u) {\n                m.inform(\"messages-reordered\", u);\n                break;\n            };\n            for (x in v) {\n                m.inform(\"messages-updated\", v);\n                break;\n            };\n        }\n    ;\n    };\n    function l(m) {\n        this._fbid = m;\n        this._threadDeletions = {\n        };\n        this._threadChanges = {\n        };\n        this._threadReadChanges = {\n        };\n        this._threadlistChanged = false;\n        this._unseenStateChanged = false;\n        this._unreadStateChanged = false;\n        this._receivedMessages = {\n        };\n        this._reorderedMessages = {\n        };\n        this._updatedMessages = {\n        };\n        this._locked = 0;\n    };\n    h(l.prototype, g, {\n        updatedThread: function(m) {\n            this._threadChanges[m] = true;\n            k(this);\n        },\n        deletedThread: function(m) {\n            this._threadDeletions[m] = true;\n            k(this);\n        },\n        updatedThreadlist: function() {\n            this._threadlistChanged = true;\n            k(this);\n        },\n        updatedUnseenState: function() {\n            this._unseenStateChanged = true;\n            k(this);\n        },\n        updatedUnreadState: function() {\n            this._unreadStateChanged = true;\n            k(this);\n        },\n        changedThreadReadState: function(m, n, o) {\n            if ((!this._threadReadChanges[m] || (this._threadReadChanges[m].timestamp < o))) {\n                this._threadReadChanges[m] = {\n                    mark_as_read: n,\n                    timestamp: o\n                };\n            };\n            k(this);\n        },\n        receivedMessage: function(m) {\n            i.isThreadID(m.thread_id);\n            var n = m.thread_id;\n            if (!this._receivedMessages[n]) {\n                this._receivedMessages[n] = [];\n            };\n            this._receivedMessages[n].push(m);\n            this.updatedThread(n);\n        },\n        reorderedMessages: function(m, n) {\n            this._reorderedMessages[m] = {\n                source: n\n            };\n            k(this);\n        },\n        updatedMessage: function(m, n, o) {\n            if (!this._updatedMessages[m]) {\n                this._updatedMessages[m] = {\n                };\n            };\n            this._updatedMessages[m][n] = {\n                source: o\n            };\n            this.updatedThread(m);\n        },\n        synchronizeInforms: function(m) {\n            this._locked++;\n            try {\n                m();\n            } catch (n) {\n                throw n;\n            } finally {\n                this._locked--;\n                k(this);\n            };\n        },\n        listen: function(m, n) {\n            return this.subscribe(\"threads-updated\", function(o, p) {\n                if (p[m]) {\n                    n(m);\n                };\n            });\n        }\n    });\n    h(l, j);\n    e.exports = l;\n});\n__d(\"MercuryServerRequests\", [\"ArbiterMixin\",\"AsyncResponse\",\"TimestampConverter\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAPIArgsSource\",\"MercuryAssert\",\"MercuryErrorType\",\"MercuryGenericConstants\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageClientState\",\"MercuryPayloadSource\",\"MercuryServerRequestsConfig\",\"MercurySourceType\",\"MercuryThreadlistConstants\",\"MercuryMessageIDs\",\"MessagingConfig\",\"MessagingReliabilityLogger\",\"MessagingTag\",\"MercurySingletonMixin\",\"MercuryServerDispatcher\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncResponse\"), i = b(\"TimestampConverter\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"KeyedCallbackManager\"), m = b(\"MercuryActionTypeConstants\"), n = b(\"MercuryActionStatus\"), o = b(\"MercuryAPIArgsSource\"), p = b(\"MercuryAssert\"), q = b(\"MercuryErrorType\"), r = b(\"MercuryGenericConstants\"), s = b(\"MercuryGlobalActionType\"), t = b(\"MercuryIDs\"), u = b(\"MercuryLogMessageType\"), v = b(\"MercuryMessageClientState\"), w = b(\"MercuryPayloadSource\"), x = b(\"MercuryServerRequestsConfig\"), y = b(\"MercurySourceType\"), z = b(\"MercuryThreadlistConstants\"), aa = b(\"MercuryMessageIDs\"), ba = b(\"MessagingConfig\"), ca = b(\"MessagingReliabilityLogger\"), da = b(\"MessagingTag\"), ea = b(\"MercurySingletonMixin\"), fa = b(\"MercuryServerDispatcher\"), ga = b(\"MercuryThreadInformer\"), ha = b(\"copyProperties\"), ia = b(\"createObjectFrom\"), ja = k.create(\"mercury_server\"), ka = o.MERCURY;\n    function la(tb, ub) {\n        if (ub) {\n            tb._lastActionId = i.maxValidActionID(tb._lastActionId, ub);\n        };\n    };\n    function ma(tb, ub) {\n        var vb = ub.thread_id, wb = tb._serverToClientIDs.getResource(vb);\n        if (!wb) {\n            if (ub.canonical_fbid) {\n                wb = (\"user:\" + ub.canonical_fbid);\n            }\n             else if (ub.root_message_threading_id) {\n                wb = (\"root:\" + ub.root_message_threading_id);\n            }\n        ;\n            wb = (wb || (\"thread:\" + vb));\n            na(tb, vb, wb);\n        }\n    ;\n        ub.thread_id = wb;\n    };\n    function na(tb, ub, vb) {\n        tb._serverToClientIDs.setResource(ub, vb);\n        tb._clientToServerIDs.setResource(vb, ub);\n        tb._newlyAddedClientIDs[ub] = vb;\n    };\n    function oa(tb, ub, vb) {\n        var wb = tb._clientToServerIDs.executeOrEnqueue(ub, vb), xb = tb._clientToServerIDs.getUnavailableResources(wb), yb = tb.tokenizeThreadID(ub);\n        if ((xb.length && (yb.type != \"root\"))) {\n            tb.fetchThreadData(xb);\n        };\n    };\n    function pa(tb, ub) {\n        return tb._clientToServerIDs.getResource(ub);\n    };\n    function qa(tb, ub) {\n        return !!tb._serverToClientIDs.getResource(ub);\n    };\n    function ra(tb, ub) {\n        var vb = tb._serverToClientIDs.getResource(ub);\n        if ((typeof vb == \"undefined\")) {\n            ja.warn(\"no_client_thread_id\", {\n                server_id: ub\n            });\n        };\n        return vb;\n    };\n    function sa(tb, ub, vb) {\n        tb._serverToClientIDs.executeOrEnqueue(ub, vb);\n        tb.ensureThreadIsFetched(ub);\n    };\n    function ta(tb, ub, vb) {\n        if ((ub.action_type != m.SEND_MESSAGE)) {\n            return\n        };\n        var wb = ub.client_thread_id;\n        if (!wb) {\n            wb = ra(tb, ub.thread_id);\n        };\n        var xb = null;\n        if (wb) {\n            xb = t.tokenize(wb).type;\n        };\n        ca.addEntry((\"send_\" + xb), vb, ((ub.thread_id + \",\") + ub.message_id));\n    };\n    function ua(tb) {\n        return (tb.getError() ? (\"_\" + tb.getError()) : \"\");\n    };\n    function va(tb, ub) {\n        var vb = null;\n        switch (ub.status) {\n          case n.SUCCESS:\n            vb = \"success\";\n            break;\n          case n.FAILED_UNKNOWN_REASON:\n            vb = \"confirmed_error\";\n            break;\n          case n.UNABLE_TO_CONFIRM:\n            vb = \"confirm_error\";\n            break;\n          default:\n            return;\n        };\n        ta(tb, ub, vb);\n    };\n    function wa(tb, ub) {\n        ((ub.message_counts || [])).forEach(function(dc) {\n            la(tb, dc.last_action_id);\n        });\n        ((ub.threads || [])).forEach(function(dc) {\n            ma(tb, dc);\n            delete tb._fetchingThreads[dc.thread_id];\n            var ec = pa(tb, dc.thread_id);\n            delete tb._fetchingThreads[ec];\n            la(tb, dc.last_action_id);\n        });\n        ((ub.ordered_threadlists || [])).forEach(function(dc) {\n            dc.thread_ids = dc.thread_ids.map(ra.curry(tb));\n        });\n        ub.actions = (ub.actions || []);\n        ub.actions.forEach(function(dc) {\n            va(tb, dc);\n            if (((dc.status && (dc.status != n.SUCCESS)) && !dc.thread_id)) {\n                dc.thread_id = dc.client_thread_id;\n                return;\n            }\n        ;\n            if ((((dc.action_type == m.SEND_MESSAGE) && dc.client_thread_id) && (dc.client_thread_id != r.PENDING_THREAD_ID))) {\n                na(tb, dc.thread_id, dc.client_thread_id);\n            };\n            dc.server_thread_id = dc.thread_id;\n            dc.thread_id = (qa(tb, dc.thread_id) ? ra(tb, dc.thread_id) : null);\n            la(tb, dc.action_id);\n        });\n        if (ub.end_of_history) {\n            var vb = [];\n            for (var wb = 0; (wb < ub.end_of_history.length); wb++) {\n                var xb = ub.end_of_history[wb];\n                if ((xb.type == \"user\")) {\n                    vb.push((\"user:\" + xb.id));\n                }\n                 else if (((xb.type == \"thread\") && qa(tb, xb.id))) {\n                    vb.push(ra(tb, xb.id));\n                }\n            ;\n            };\n            ub.end_of_history = vb;\n        }\n    ;\n        if (ub.roger) {\n            var yb = {\n            };\n            for (var zb in ub.roger) {\n                var ac = tb._serverToClientIDs.getResource(zb);\n                if (ac) {\n                    var bc = ub.roger[zb];\n                    yb[ac] = {\n                    };\n                    for (var cc in bc) {\n                        yb[ac][(\"fbid:\" + cc)] = bc[cc];;\n                    };\n                }\n            ;\n            };\n            ub.roger = yb;\n        }\n    ;\n    };\n    function xa(tb) {\n        if ((tb._pendingUpdates && tb._pendingUpdates.length)) {\n            var ub = tb._pendingUpdates[0];\n            tb._pendingUpdates = tb._pendingUpdates.slice(1);\n            tb.handleUpdate(ub);\n        }\n    ;\n    };\n    function ya(tb, ub) {\n        var vb = ha({\n        }, tb), wb;\n        if (ub.threads) {\n            if (!vb.threads) {\n                vb.threads = {\n                };\n            };\n            for (wb in ub.threads) {\n                vb.threads[wb] = Object.keys(ia(((vb.threads[wb] || [])).concat(ub.threads[wb])));;\n            };\n        }\n    ;\n        if (ub.messages) {\n            if (!vb.messages) {\n                vb.messages = {\n                };\n            };\n            for (wb in ub.messages) {\n                if (!vb.messages[wb]) {\n                    vb.messages[wb] = {\n                    };\n                };\n                for (var xb in ub.messages[wb]) {\n                    if (vb.messages[wb][xb]) {\n                        vb.messages[wb][xb] = bb(vb.messages[wb][xb], ub.messages[wb][xb]);\n                    }\n                     else vb.messages[wb][xb] = ub.messages[wb][xb];\n                ;\n                };\n            };\n        }\n    ;\n        vb.client = (tb.client || ub.client);\n        return vb;\n    };\n    function za(tb, ub) {\n        var vb = ha(ia(tb.folders, true), ia(ub.folders, true)), wb = (tb.client || ub.client);\n        return {\n            folders: Object.keys(vb),\n            client: wb\n        };\n    };\n    function ab(tb, ub) {\n        for (var vb in ub) {\n            if ((tb[vb] && (typeof tb[vb] === \"object\"))) {\n                tb[vb] = bb(tb[vb], ub[vb]);\n            }\n             else if ((ub[vb] && (typeof ub[vb] === \"object\"))) {\n                var wb = {\n                };\n                ha(wb, ub[vb]);\n                tb[vb] = wb;\n            }\n            \n        ;\n        };\n        return tb;\n    };\n    function bb(tb, ub) {\n        var vb = ((tb.offset < ub.offset) ? tb.offset : ub.offset), wb = (tb.offset + tb.limit), xb = (ub.offset + ub.limit), yb = (((wb > xb)) ? wb : xb), zb = (yb - vb);\n        return {\n            offset: vb,\n            limit: zb\n        };\n    };\n    function cb(tb, ub) {\n        var vb = (tb.client || ub.client), wb = {\n            ids: {\n            },\n            client: vb\n        };\n        ha(wb.ids, tb.ids);\n        ha(wb.ids, ub.ids);\n        return wb;\n    };\n    function db(tb, ub) {\n        var vb = {\n        }, wb, xb = (tb.client || ub.client);\n        delete tb.client;\n        delete ub.client;\n        for (wb in tb) {\n            ha(vb, ia(tb[wb], wb));;\n        };\n        for (wb in ub) {\n            ha(vb, ia(ub[wb], wb));;\n        };\n        var yb = {\n            client: xb\n        };\n        for (var zb in vb) {\n            wb = vb[zb];\n            if (!yb[wb]) {\n                yb[wb] = [];\n            };\n            yb[wb].push(zb);\n        };\n        return yb;\n    };\n    function eb(tb, ub) {\n        var vb = (tb.client || ub.client), wb = ia(tb.ids, true), xb = ia(ub.ids, true), yb = ha(wb, xb);\n        return {\n            ids: Object.keys(yb),\n            client: vb\n        };\n    };\n    function fb(tb) {\n        this._fbid = tb;\n        this._lastActionId = 0;\n        this._serverToClientIDs = new l();\n        this._clientToServerIDs = new l();\n        this._pendingUpdates = [];\n        this._fetchingThreads = {\n        };\n        this._newlyAddedClientIDs = {\n        };\n        rb(this);\n    };\n    ha(fb.prototype, g, {\n        tokenizeThreadID: function(tb) {\n            p.isThreadID(tb);\n            return t.tokenize(tb);\n        },\n        getServerThreadID: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, ub);\n        },\n        getClientThreadID: function(tb, ub) {\n            sa(this, tb, ub);\n        },\n        getClientThreadIDNow: function(tb) {\n            return ra(this, tb);\n        },\n        getServerThreadIDNow: function(tb) {\n            return pa(this, tb);\n        },\n        convertThreadIDIfAvailable: function(tb) {\n            var ub = this._serverToClientIDs.getResource(tb);\n            if ((ub === undefined)) {\n                return tb;\n            }\n             else return ub\n        ;\n        },\n        canLinkExternally: function(tb) {\n            p.isThreadID(tb);\n            var ub = this.tokenizeThreadID(tb);\n            return (((ub.type == \"user\")) || !!pa(this, tb));\n        },\n        fetchThreadlistInfo: function(tb, ub, vb, wb, xb) {\n            vb = (vb || da.INBOX);\n            xb = (xb || ka);\n            var yb = (wb ? fa.IMMEDIATE : null), zb = {\n                client: xb\n            };\n            zb[vb] = {\n                offset: tb,\n                limit: ub,\n                filter: wb\n            };\n            sb(this, \"/ajax/mercury/threadlist_info.php\", zb, yb);\n        },\n        fetchUnseenThreadIDs: function(tb, ub) {\n            ub = (ub || ka);\n            this.fetchThreadlistInfo(z.RECENT_THREAD_OFFSET, z.JEWEL_THREAD_COUNT, tb, null, ub);\n        },\n        fetchUnreadThreadIDs: function(tb, ub) {\n            ub = (ub || ka);\n            sb(this, \"/ajax/mercury/unread_threads.php\", {\n                folders: [tb,],\n                client: ub\n            });\n        },\n        fetchMissedMessages: function(tb, ub) {\n            ub = (ub || ka);\n            sb(this, \"/ajax/mercury/thread_sync.php\", {\n                last_action_id: this._lastActionId,\n                folders: tb,\n                client: ub\n            });\n        },\n        fetchThreadData: function(tb, ub) {\n            ub = (ub || ka);\n            p.allThreadID(tb);\n            var vb = {\n                threads: {\n                },\n                client: ub\n            }, wb = [], xb = [];\n            tb.forEach(function(zb) {\n                if (this._fetchingThreads[zb]) {\n                    return\n                };\n                this._fetchingThreads[zb] = true;\n                var ac = pa(this, zb);\n                if (ac) {\n                    xb.push(ac);\n                    vb.threads.thread_ids = xb;\n                }\n                 else {\n                    var bc = this.tokenizeThreadID(zb);\n                    if ((bc.type == \"user\")) {\n                        wb.push(bc.value);\n                        vb.threads.user_ids = wb;\n                    }\n                     else if ((bc.type == \"thread\")) {\n                        xb.push(bc.value);\n                        vb.threads.thread_ids = xb;\n                    }\n                     else if (((bc.type != \"root\") && (bc.type != \"pending\"))) {\n                        throw new Error(\"Unknown thread type\", bc)\n                    }\n                    \n                ;\n                }\n            ;\n            }.bind(this));\n            this.inform(\"fetch-thread-data\", vb);\n            for (var yb in vb.threads) {\n                sb(this, \"/ajax/mercury/thread_info.php\", vb);\n                break;\n            };\n        },\n        ensureThreadIsFetched: function(tb, ub) {\n            ub = (ub || ka);\n            if ((!this._serverToClientIDs.getResource(tb) && !this._fetchingThreads[tb])) {\n                this._fetchingThreads[tb] = true;\n                sb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [tb,]\n                    },\n                    client: ub\n                });\n            }\n        ;\n        },\n        fetchThreadMessages: function(tb, ub, vb, wb, xb) {\n            p.isThreadID(tb);\n            xb = (xb || ka);\n            var yb, zb, ac = this.tokenizeThreadID(tb), bc = pa(this, tb), cc = false;\n            if ((bc && (ac.type != \"group\"))) {\n                zb = \"thread_ids\";\n                yb = bc;\n            }\n             else {\n                yb = ac.value;\n                switch (ac.type) {\n                  case \"user\":\n                    zb = \"user_ids\";\n                    cc = true;\n                    break;\n                  case \"group\":\n                    zb = \"group_ids\";\n                    break;\n                  case \"thread\":\n                    zb = \"thread_ids\";\n                    break;\n                };\n            }\n        ;\n            var dc = {\n                messages: {\n                },\n                threads: {\n                },\n                client: xb\n            };\n            if (zb) {\n                dc.messages[zb] = {\n                };\n                dc.messages[zb][yb] = {\n                    offset: ub,\n                    limit: vb\n                };\n                if (cc) {\n                    dc.threads[zb] = [yb,];\n                };\n                sb(this, \"/ajax/mercury/thread_info.php\", dc, wb);\n            }\n             else oa(this, tb, function(ec) {\n                dc.messages.thread_ids = {\n                };\n                dc.messages.thread_ids[ec] = {\n                    offset: ub,\n                    limit: vb\n                };\n                sb(this, \"/ajax/mercury/thread_info.php\", dc, wb);\n            }.bind(this));\n        ;\n        },\n        handleThreadInfoError: function(tb) {\n            var ub = tb.getRequest().getData(), vb = [];\n            if (ub.messages) {\n                for (var wb in ub.messages.thread_ids) {\n                    vb.push(gb(ra(this, wb)));;\n                };\n                for (var xb in ub.messages.user_ids) {\n                    vb.push(gb((\"user:\" + xb)));;\n                };\n                for (var yb in ub.messages.group_ids) {\n                    vb.push(gb((\"group:\" + yb)));;\n                };\n            }\n        ;\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    from_client: true,\n                    payload_source: w.CLIENT_CHANNEL_MESSAGE\n                });\n            };\n            if ((ub.threads && (((ub.threads.user_ids || ub.threads.group_ids) || ub.threads.thread_ids)))) {\n                var zb = 5, ac = true;\n                if (!ub.retry_count) {\n                    ub.retry_count = 0;\n                    if (ub.messages) {\n                        delete ub.messages;\n                    };\n                }\n                 else if ((ub.retry_count >= zb)) {\n                    ac = false;\n                    ((ub.threads.thread_ids || [])).forEach(function(cc) {\n                        if ((cc in this._fetchingThreads)) {\n                            delete this._fetchingThreads[cc];\n                        };\n                    }.bind(this));\n                }\n                \n            ;\n                if (ac) {\n                    var bc = (ub.retry_count * 1000);\n                    (function() {\n                        ja.log(\"retry_thread\", ub);\n                        sb(this, \"/ajax/mercury/thread_info.php\", ub);\n                    }.bind(this)).defer(bc, false);\n                    ub.retry_count++;\n                }\n            ;\n            }\n        ;\n        },\n        markFolderAsRead: function(tb) {\n            sb(this, \"/ajax/mercury/mark_folder_as_read.php\", {\n                folder: tb\n            });\n            var ub = [{\n                action_type: s.MARK_ALL_READ,\n                action_id: null,\n                folder: tb\n            },];\n            this.handleUpdate({\n                global_actions: ub,\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadReadStatus: function(tb, ub, vb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                var yb = {\n                    ids: {\n                    }\n                };\n                yb.ids[xb] = ub;\n                sb(this, \"/ajax/mercury/change_read_status.php\", yb);\n            }.bind(this));\n            var wb = [{\n                action_type: m.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: tb,\n                mark_as_read: ub,\n                folder: vb\n            },];\n            this.handleUpdate({\n                actions: wb,\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadArchivedStatus: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                var yb = {\n                    ids: {\n                    }\n                };\n                yb.ids[xb] = ub;\n                sb(this, \"/ajax/mercury/change_archived_status.php\", yb);\n            }.bind(this));\n            var vb = {\n                action_type: m.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: tb,\n                archived: ub\n            }, wb = {\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_ARCHIVED_STATUS\n            };\n            this.handleUpdate(wb);\n        },\n        changeThreadFolder: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                var yb = {\n                };\n                yb[ub] = [xb,];\n                sb(this, \"/ajax/mercury/move_thread.php\", yb);\n            }.bind(this));\n            var vb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: tb,\n                new_folder: ub\n            }, wb = {\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(wb);\n        },\n        changeMutingOnThread: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                sb(this, \"/ajax/mercury/change_mute_thread.php\", {\n                    thread_id: xb,\n                    mute_settings: ub,\n                    payload_source: ka\n                });\n            }.bind(this));\n            var vb = {\n                action_type: m.CHANGE_MUTE_SETTINGS,\n                action_id: null,\n                thread_id: tb,\n                mute_settings: ub\n            }, wb = {\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_MUTE_SETTINGS\n            };\n            this.handleUpdate(wb);\n        },\n        markThreadSpam: function(tb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(wb) {\n                sb(this, \"/ajax/mercury/mark_spam.php\", {\n                    id: wb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: tb,\n                new_folder: da.SPAM\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        markMessagesSpam: function(tb, ub) {\n            aa.getServerIDs((ub || []), function(wb) {\n                sb(this, \"/ajax/mercury/mark_spam_messages.php\", {\n                    message_ids: wb\n                });\n            }.bind(this));\n            var vb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: tb,\n                message_ids: ub\n            };\n            this.handleUpdate({\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_DELETE_MESSAGES\n            });\n        },\n        unmarkThreadSpam: function(tb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(wb) {\n                sb(this, \"/ajax/mercury/unmark_spam.php\", {\n                    id: wb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: tb,\n                new_folder: da.INBOX\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        deleteThread: function(tb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(wb) {\n                var xb = {\n                    ids: [wb,]\n                };\n                sb(this, \"/ajax/mercury/delete_thread.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.DELETE_THREAD,\n                action_id: null,\n                thread_id: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: w.CLIENT_DELETE_THREAD\n            };\n            this.handleUpdate(vb);\n        },\n        deleteMessages: function(tb, ub, vb) {\n            aa.getServerIDs((ub || []), function(xb) {\n                sb(this, \"/ajax/mercury/delete_messages.php\", {\n                    message_ids: xb\n                });\n            }.bind(this));\n            var wb;\n            if (vb) {\n                wb = {\n                    action_type: m.DELETE_THREAD,\n                    action_id: null,\n                    thread_id: tb\n                };\n            }\n             else wb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: tb,\n                message_ids: ub\n            };\n        ;\n            this.handleUpdate({\n                actions: [wb,],\n                from_client: true,\n                payload_source: w.CLIENT_DELETE_MESSAGES\n            });\n        },\n        clearChat: function(tb, ub, vb) {\n            p.isThreadID(tb);\n            sb(this, \"/ajax/chat/settings.php\", {\n                clear_history_id: ub\n            });\n            var wb = [{\n                action_type: m.CLEAR_CHAT,\n                action_id: null,\n                thread_id: tb,\n                clear_time: vb\n            },];\n            this.handleUpdate({\n                actions: wb,\n                from_client: true,\n                payload_source: w.CLIENT_CLEAR_CHAT\n            });\n        },\n        sendNewMessage: function(tb, ub) {\n            ub = (ub || ka);\n            if ((!tb.client_state || (tb.client_state == v.SEND_TO_SERVER))) {\n                aa.getServerIDs((tb.forward_message_ids || []), function(wb) {\n                    var xb = tb.thread_id, yb = this.tokenizeThreadID(tb.thread_id), zb = yb.type, ac = ha({\n                    }, tb);\n                    ac.forward_message_ids = wb;\n                    if ((((((zb == \"root\") && (yb.value == ac.message_id))) || (((zb == \"user\") && !pa(this, xb)))) || ((tb.thread_id == r.PENDING_THREAD_ID)))) {\n                        ac.client_thread_id = ac.thread_id;\n                        ac.thread_id = null;\n                        this._sendNewMessageToServer(ac, ub);\n                    }\n                     else oa(this, ac.thread_id, function(bc) {\n                        ac.thread_id = bc;\n                        this._sendNewMessageToServer(ac);\n                    }.bind(this));\n                ;\n                }.bind(this));\n            };\n            if ((tb.thread_id != r.PENDING_THREAD_ID)) {\n                var vb = {\n                    actions: [ha({\n                    }, tb),],\n                    from_client: true,\n                    payload_source: w.CLIENT_SEND_MESSAGE\n                };\n                this.handleUpdate(vb);\n            }\n        ;\n        },\n        _sendNewMessageToServer: function(tb, ub) {\n            ub = (ub || ka);\n            sb(this, \"/ajax/mercury/send_messages.php\", {\n                message_batch: [tb,],\n                client: ub\n            });\n        },\n        requestMessageConfirmation: function(tb, ub) {\n            ub = (ub || ka);\n            var vb = {\n            }, wb = {\n            };\n            for (var xb in tb) {\n                var yb = pa(this, xb);\n                if (yb) {\n                    vb[yb] = tb[xb];\n                }\n                 else {\n                    var zb = tb[xb];\n                    for (var ac = 0; (ac < zb.length); ac++) {\n                        wb[zb[ac]] = xb;;\n                    };\n                }\n            ;\n            };\n            var bc = Object.keys(vb), cc = Object.keys(wb);\n            if ((bc.length || cc.length)) {\n                sb(this, \"/ajax/mercury/confirm_messages.php\", {\n                    thread_message_map: vb,\n                    local_messages: wb,\n                    client: ub\n                });\n            };\n        },\n        handleMessageConfirmError: function(tb) {\n            var ub = tb.getRequest().getData().thread_message_map, vb = tb.getRequest().getData().local_messages;\n            if ((!ub && !vb)) {\n                return\n            };\n            var wb = [];\n            for (var xb in ub) {\n                var yb = ub[xb];\n                yb.forEach(function(bc) {\n                    wb.push({\n                        action_type: m.SEND_MESSAGE,\n                        client_message_id: bc,\n                        message_id: bc,\n                        client_thread_id: null,\n                        thread_id: xb,\n                        status: n.UNABLE_TO_CONFIRM\n                    });\n                });\n            };\n            for (var zb in vb) {\n                var ac = vb[zb];\n                wb.push({\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: zb,\n                    message_id: zb,\n                    client_thread_id: ac,\n                    thread_id: null,\n                    status: n.UNABLE_TO_CONFIRM\n                });\n            };\n            if (wb.length) {\n                this.handleUpdate({\n                    actions: wb,\n                    payload_source: w.CLIENT_HANDLE_ERROR\n                });\n            };\n        },\n        markSeen: function() {\n            var tb = i.convertActionIDToTimestamp(this._lastActionId);\n            sb(this, \"/ajax/mercury/mark_seen.php\", {\n                seen_timestamp: tb\n            });\n        },\n        handleRoger: function(tb) {\n            var ub = (tb.tid ? this._serverToClientIDs.getResource(tb.tid) : ((\"user:\" + tb.reader)));\n            if (ub) {\n                var vb = {\n                };\n                vb[ub] = {\n                };\n                vb[ub][(\"fbid:\" + tb.reader)] = tb.time;\n                this.inform(\"update-roger\", vb);\n            }\n        ;\n        },\n        handleUpdateWaitForThread: function(tb, ub, vb) {\n            vb = (vb || ka);\n            var wb = this._serverToClientIDs.getResource(ub);\n            if (wb) {\n                this.handleUpdate(tb);\n                return;\n            }\n        ;\n            this._serverToClientIDs.executeOrEnqueue(ub, function() {\n                this._pendingUpdates.push(tb);\n            }.bind(this));\n            if (!this._fetchingThreads[ub]) {\n                this._fetchingThreads[ub] = true;\n                sb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [ub,]\n                    },\n                    client: vb\n                });\n            }\n        ;\n        },\n        handleUpdate: function(tb) {\n            var ub = [];\n            if ((tb && tb.threads)) {\n                for (var vb = 0; (vb < tb.threads.length); vb++) {\n                    if (!tb.threads[vb].snippet_attachments) {\n                        continue;\n                    };\n                    for (var wb = 0; (wb < tb.threads[vb].snippet_attachments.length); wb++) {\n                        if (tb.threads[vb].snippet_attachments[wb].share_xhp) {\n                            ub.push({\n                                i: vb,\n                                j: wb,\n                                xhp: tb.threads[vb].snippet_attachments[wb].share_xhp\n                            });\n                            tb.threads[vb].snippet_attachments[wb].share_xhp = ((\"HTMLDivElement not shown: object contains circular \" + \"reference, which was breaking JSON.stringify. \") + \"Look at MercuryServerRequests.handleUpdate\");\n                        }\n                    ;\n                    };\n                }\n            };\n            ja.debug(\"handle_update\", {\n                payload: tb,\n                from_client: tb.from_client\n            });\n            for (var xb = 0; (xb < ub.length); xb++) {\n                tb.threads[ub[xb].i].snippet_attachments[ub[xb].j].share_xhp = ub[xb].xhp;;\n            };\n            for (xb in tb) {\n                ga.getForFBID(this._fbid).synchronizeInforms(function() {\n                    if (!tb.from_client) {\n                        wa(this, tb);\n                        this.inform(\"payload-preprocessed\", tb);\n                    }\n                ;\n                    this.inform(\"update-thread-ids\", this._newlyAddedClientIDs);\n                    this._newlyAddedClientIDs = {\n                    };\n                    this.inform(\"update-participants\", tb);\n                    this.inform(\"update-threads\", tb);\n                    this.inform(\"update-unread\", tb);\n                    this.inform(\"update-threadlist\", tb);\n                    this.inform(\"update-messages\", tb);\n                    this.inform(\"update-unseen\", tb);\n                    this.inform(\"update-typing-state\", tb);\n                    this.inform(\"update-roger\", tb.roger);\n                    this.inform(\"model-update-completed\", null);\n                    xa(this);\n                }.bind(this));\n                break;\n            };\n        },\n        _handleSendMessageErrorCommon: function(tb, ub, vb, wb) {\n            ja.debug(\"handle_send_message_error_common\", {\n                reliability_error_status: vb,\n                request_error_status: ub\n            });\n            var xb = tb.getData(), yb = xb.message_batch, zb = yb.map(function(bc) {\n                return {\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: bc.message_id,\n                    message_id: bc.message_id,\n                    client_thread_id: bc.client_thread_id,\n                    thread_id: bc.thread_id,\n                    status: ub,\n                    error_data: wb\n                };\n            });\n            zb.forEach(function(bc) {\n                ta(this, bc, vb);\n            }.bind(this));\n            var ac = {\n                actions: zb,\n                payload_source: w.CLIENT_HANDLE_ERROR\n            };\n            this.handleUpdate(ac);\n        },\n        handleSendMessageError: function(tb) {\n            var ub = tb.getPayload(), vb = null, wb = null;\n            if ((ub && ub.error_payload)) {\n                vb = n.UNCONFIRMED;\n                wb = \"send_error\";\n            }\n             else {\n                vb = n.ERROR;\n                wb = (\"request_error\" + ua(tb));\n            }\n        ;\n            var xb = tb.error;\n            if ((xb === 1404102)) {\n                h.verboseErrorHandler(tb);\n            };\n            var yb = (/<.*>/.test(tb.getErrorDescription()) ? tb.getErrorSummary() : tb.getErrorDescription());\n            this._handleSendMessageErrorCommon(tb.getRequest(), vb, wb, {\n                type: q.SERVER,\n                code: tb.getError(),\n                description: yb,\n                is_transient: tb.isTransient()\n            });\n        },\n        handleSendMessageTransportError: function(tb) {\n            this._handleSendMessageErrorCommon(tb.getRequest(), n.ERROR, (\"transport_error\" + ua(tb)), {\n                type: q.TRANSPORT,\n                code: tb.getError(),\n                is_transient: true\n            });\n        },\n        handleSendMessageTimeout: function(tb) {\n            this._handleSendMessageErrorCommon(tb, n.ERROR, \"transport_timeout\", {\n                type: q.TIMEOUT,\n                is_transient: true\n            });\n        },\n        getLastActionID: function() {\n            return this._lastActionId;\n        }\n    });\n    ha(fb, ea);\n    function gb(tb) {\n        return {\n            action_type: m.LOG_MESSAGE,\n            thread_id: tb,\n            message_id: tb,\n            timestamp: Date.now(),\n            timestamp_absolute: \"\",\n            timestamp_relative: \"\",\n            is_unread: false,\n            source: y.UNKNOWN,\n            log_message_type: u.SERVER_ERROR,\n            log_message_data: {\n            }\n        };\n    };\n    function hb(tb) {\n        var ub = tb.getData(), vb = (ub.request_user_id ? ub.request_user_id : j.user);\n        return fb.getForFBID(vb);\n    };\n    function ib(tb, ub) {\n        hb(ub).handleUpdate(tb);\n    };\n    function jb(tb, ub) {\n        var vb = (tb.client || ub.client);\n        return {\n            client: vb,\n            message_batch: tb.message_batch.concat(ub.message_batch)\n        };\n    };\n    function kb(tb, ub) {\n        var vb = {\n        };\n        ha(vb, tb.ids);\n        ha(vb, ub.ids);\n        var wb = (tb.client || ub.client);\n        return {\n            ids: vb,\n            client: wb\n        };\n    };\n    function lb(tb, ub) {\n        return ub;\n    };\n    function mb(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleThreadInfoError(tb);\n    };\n    function nb(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleSendMessageError(tb);\n    };\n    function ob(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleSendMessageTransportError(tb);\n    };\n    function pb(tb) {\n        var ub = hb(tb);\n        ub.handleSendMessageTimeout(tb);\n    };\n    function qb(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleMessageConfirmError(tb);\n    };\n    function rb(tb) {\n        fa.registerEndpoints({\n            \"/ajax/mercury/thread_sync.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IDEMPOTENT,\n                handler: ib\n            },\n            \"/ajax/mercury/thread_info.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_DEFERRED_MULTI,\n                batch_function: ya,\n                handler: ib,\n                error_handler: mb\n            },\n            \"/ajax/mercury/mark_folder_as_read.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/change_read_status.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: kb,\n                handler: ib\n            },\n            \"/ajax/mercury/send_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: jb,\n                batch_size_limit: ba.SEND_BATCH_LIMIT,\n                handler: ib,\n                error_handler: nb,\n                transport_error_handler: ob,\n                timeout: x.sendMessageTimeout,\n                timeout_handler: pb,\n                connection_retries: ba.SEND_CONNECTION_RETRIES\n            },\n            \"/ajax/mercury/mark_seen.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: lb,\n                handler: ib\n            },\n            \"/ajax/mercury/confirm_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib,\n                error_handler: qb\n            },\n            \"/ajax/mercury/threadlist_info.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: ab,\n                handler: ib\n            },\n            \"/ajax/mercury/mark_spam.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/mark_spam_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/unmark_spam.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/unread_threads.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: za,\n                handler: ib\n            },\n            \"/ajax/chat/settings.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE\n            },\n            \"/ajax/mercury/change_archived_status.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: cb,\n                handler: ib\n            },\n            \"/ajax/mercury/delete_thread.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: eb,\n                handler: ib\n            },\n            \"/ajax/mercury/delete_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/move_thread.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: db,\n                handler: ib\n            },\n            \"/ajax/mercury/change_mute_thread.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            }\n        });\n    };\n    function sb(tb, ub, vb, wb) {\n        fa.trySend(ub, vb, wb, tb._fbid);\n    };\n    e.exports = fb;\n});\n__d(\"MercuryParticipants\", [\"Env\",\"ImageSourceRequest\",\"ImageSourceType\",\"MercuryAssert\",\"MercuryIDs\",\"MercuryParticipantTypes\",\"MercuryParticipantsConstants\",\"PhotoResizeModeConst\",\"MercuryServerRequests\",\"ShortProfiles\",\"copyProperties\",\"getObjectValues\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ImageSourceRequest\"), i = b(\"ImageSourceType\"), j = b(\"MercuryAssert\"), k = b(\"MercuryIDs\"), l = b(\"MercuryParticipantTypes\"), m = b(\"MercuryParticipantsConstants\"), n = b(\"PhotoResizeModeConst\"), o = b(\"MercuryServerRequests\").get(), p = b(\"ShortProfiles\"), q = b(\"copyProperties\"), r = b(\"getObjectValues\"), s = b(\"tx\"), t = (\"fbid:\" + g.user), u = {\n    }, v = {\n    }, w = function(ba) {\n        ba = z(ba);\n        if (u[ba.id]) {\n            q(u[ba.id], ba);\n        }\n         else u[ba.id] = q({\n        }, ba);\n    ;\n        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\n        };\n    };\n    function x(ba) {\n        j.isEmailParticipantID(ba);\n        var ca = k.tokenize(ba), da = ca.value;\n        return {\n            gender: m.UNKNOWN_GENDER,\n            href: null,\n            id: ba,\n            image_src: m.EMAIL_IMAGE,\n            big_image_src: m.EMAIL_IMAGE,\n            name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\n        };\n    };\n    function y(ba, ca, da) {\n        j.allParticipantIDs(ba);\n        var ea = {\n        }, fa = {\n        };\n        ba.forEach(function(ha) {\n            if ((u[ha] && !da)) {\n                ea[ha] = q({\n                }, u[ha]);\n            }\n             else {\n                var ia = k.tokenize(ha);\n                if ((ia.type == \"fbid\")) {\n                    var ja = ia.value;\n                    fa[ha] = ja;\n                }\n                 else if ((ia.type == \"email\")) {\n                    ea[ha] = x(ha);\n                }\n            ;\n            }\n        ;\n        });\n        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                for (var ia in fa) {\n                    var ja = fa[ia], ka = ha[ja];\n                    ea[ia] = {\n                        gender: ka.gender,\n                        href: ka.uri,\n                        id: ia,\n                        image_src: ka.thumbSrc,\n                        name: ka.name,\n                        short_name: ka.firstName,\n                        employee: ka.employee,\n                        call_promo: ka.showVideoPromo,\n                        type: ka.type,\n                        vanity: ka.vanity,\n                        is_friend: ka.is_friend,\n                        social_snippets: ka.social_snippets\n                    };\n                    w(ea[ia]);\n                };\n                ca(ea);\n            });\n        }\n         else ca(ea);\n    ;\n    };\n    function z(ba) {\n        var ca = ((ba.type === l.USER) || (ba.type === l.FRIEND));\n        if (!ca) {\n            return ba\n        };\n        if (((!ba.name && !ba.href) && !ba.vanity)) {\n            var da = \"Facebook User\";\n            ba.name = da;\n            ba.short_name = da;\n        }\n    ;\n        return ba;\n    };\n    var aa = {\n        user: t,\n        isAuthor: function(ba) {\n            return (ba === t);\n        },\n        getIDFromVanityOrFBID: function(ba) {\n            if (!ba) {\n                return\n            };\n            if (v[ba]) {\n                return v[ba]\n            };\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba)\n            };\n        },\n        getNow: function(ba) {\n            return u[ba];\n        },\n        get: function(ba, ca) {\n            j.isParticipantID(ba);\n            aa.getMulti([ba,], function(da) {\n                ca(da[ba]);\n            });\n        },\n        getMulti: function(ba, ca, da) {\n            return y(ba, ca, false);\n        },\n        getBigImageMulti: function(ba, ca) {\n            j.allParticipantIDs(ba);\n            var da = m.BIG_IMAGE_SIZE;\n            aa.getMulti(ba, function(ea) {\n                var fa = {\n                }, ga = 0, ha = function(la, ma) {\n                    ga++;\n                    fa[la] = ma;\n                    if ((ga === ba.length)) {\n                        ca(fa);\n                    };\n                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                for (var ja in ea) {\n                    var ka = ea[ja];\n                    if (!ka.big_image_src) {\n                        new h().setFBID(aa.getUserID(ja)).setType(i.PROFILE_PICTURE).setDimensions(da, da).setResizeMode(n.COVER).setCallback(ia.curry(ja)).send();\n                    }\n                     else ha(ka.id, ka.big_image_src);\n                ;\n                };\n            });\n        },\n        getOrderedBigImageMulti: function(ba, ca) {\n            aa.getBigImageMulti(ba, function(da) {\n                var ea = ba.map(function(fa) {\n                    return da[fa];\n                });\n                ca(ea);\n            });\n        },\n        getMultiForceDownload: function(ba, ca) {\n            return y(ba, ca, true);\n        },\n        getUserID: function(ba) {\n            return k.getUserIDFromParticipantID(ba);\n        },\n        getIDForUser: function(ba) {\n            return (\"fbid:\" + ba);\n        },\n        addParticipants: function(ba) {\n            ba.forEach(w);\n        }\n    };\n    o.subscribe(\"update-participants\", function(ba, ca) {\n        aa.addParticipants((ca.participants || []));\n    });\n    e.exports = aa;\n});\n__d(\"MercuryFolders\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.INBOX,g.OTHER,g.ACTION_ARCHIVED,g.SPAM,], j = {\n        getSupportedFolders: function() {\n            return i.concat();\n        },\n        isSupportedFolder: function(k) {\n            return h(i, k);\n        },\n        getFromMeta: function(k) {\n            var l = k.folder;\n            if (k.is_archived) {\n                l = g.ACTION_ARCHIVED;\n            };\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryAttachment\", [\"MercuryAttachmentContentType\",\"MercuryAttachmentType\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentContentType\"), h = b(\"MercuryAttachmentType\"), i = b(\"startsWith\"), j = {\n        getAttachIconClass: function(k) {\n            switch (k) {\n              case g.PHOTO:\n                return \"MercuryPhotoIcon\";\n              case g.VIDEO:\n                return \"MercuryVideoIcon\";\n              case g.MUSIC:\n                return \"MercuryMusicIcon\";\n              case g.VOICE:\n                return \"MercuryVoiceIcon\";\n              case g.TEXT:\n                return \"MercuryTextIcon\";\n              case g.MSWORD:\n                return \"MercuryMSWordIcon\";\n              case g.MSXLS:\n                return \"MercuryMSXLSIcon\";\n              case g.MSPPT:\n                return \"MercuryMSPPTIcon\";\n            };\n            return \"MercuryDefaultIcon\";\n        },\n        getAttachIconClassByMime: function(k) {\n            if (i(k, \"image\")) {\n                return \"MercuryPhotoIcon\";\n            }\n             else if (i(k, \"video\")) {\n                return \"MercuryVideoIcon\";\n            }\n             else if (i(k, \"audio\")) {\n                return \"MercuryMusicIcon\";\n            }\n             else if (i(k, \"text/plain\")) {\n                return \"MercuryTextIcon\";\n            }\n             else return \"MercuryDefaultIcon\"\n            \n            \n            \n        ;\n        },\n        getAttachTypeByMime: function(k) {\n            if (i(k, \"image\")) {\n                return g.PHOTO;\n            }\n             else if (i(k, \"video\")) {\n                return g.VIDEO;\n            }\n             else if (i(k, \"audio\")) {\n                return g.MUSIC;\n            }\n             else if (i(k, \"text/plain\")) {\n                return g.TEXT;\n            }\n             else return g.UNKNOWN\n            \n            \n            \n        ;\n        },\n        convertRaw: function(k) {\n            var l = [];\n            for (var m = 0; (m < k.length); m++) {\n                var n = k[m];\n                if ((n.attach_type === h.PHOTO)) {\n                    l.push(n);\n                }\n                 else if (n.filename) {\n                    var o = j.getAttachTypeByMime(n.filetype), p = {\n                    };\n                    p.attach_type = h.FILE;\n                    p.name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if ((o == g.PHOTO)) {\n                        p.preview_loading = true;\n                    };\n                    l.push(p);\n                }\n                \n            ;\n            };\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreads\", [\"Arbiter\",\"TimestampConverter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryAttachment\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercurySingletonMixin\",\"MercuryThreadMode\",\"MessagingTag\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"MercuryFolders\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryAssert\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryGlobalActionType\"), p = b(\"MercuryIDs\"), q = b(\"MercuryLogMessageType\"), r = b(\"MercurySingletonMixin\"), s = b(\"MercuryThreadMode\"), t = b(\"MessagingTag\"), u = b(\"MercuryParticipants\"), v = b(\"MercuryServerRequests\"), w = b(\"MercuryThreadInformer\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"removeFromArray\"), aa = j.create(\"mercury_threads\");\n    function ba(na, oa, pa) {\n        var qa = y(oa.participants, true), ra = u.getIDForUser(na._fbid);\n        pa.forEach(function(sa) {\n            if ((qa[sa] !== true)) {\n                oa.participants.push(sa);\n                if ((sa === ra)) {\n                    oa.is_subscribed = true;\n                };\n            }\n        ;\n        });\n    };\n    function ca(na, oa, pa) {\n        z(oa.participants, pa);\n        if ((pa === u.getIDForUser(na._fbid))) {\n            oa.is_subscribed = false;\n        };\n    };\n    function da(na, oa) {\n        if ((na.participants[0] != oa)) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\n        }\n    ;\n    };\n    function ea(na, oa) {\n        var pa = oa.body, qa = oa.subject, ra = \"\";\n        if (qa) {\n            qa = qa.toLowerCase();\n            if ((pa.slice(0, qa.length).toLowerCase() == qa)) {\n                ra = pa;\n            }\n             else if (pa) {\n                ra = ((qa + \" \\u00b7 \") + pa);\n            }\n             else ra = qa;\n            \n        ;\n        }\n         else ra = pa;\n    ;\n        na.snippet = ra;\n        na.snippet_has_attachment = oa.has_attachment;\n        if ((oa.raw_attachments && (oa.raw_attachments.length > 0))) {\n            var sa = n.convertRaw(oa.raw_attachments);\n            na.snippet_attachments = sa;\n        }\n         else na.snippet_attachments = oa.attachments;\n    ;\n        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false\n        };\n        if (!oa.timestamp) {\n            return true\n        };\n        var qa = !oa.unread_count;\n        if ((pa == qa)) {\n            return false\n        };\n        oa.unread_count = (pa ? 0 : 1);\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        for (var qa in pa) {\n            var ra = pa[qa];\n            if ((ra.folder == oa)) {\n                ra.unread_count = 0;\n                na._threads.setResource(qa, ra);\n                na._threadInformer.updatedThread(qa);\n            }\n        ;\n        };\n    };\n    function ha(na, oa, pa) {\n        if ((!oa || (oa.chat_clear_time === pa))) {\n            return false\n        };\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\n    };\n    function ia(na, oa, pa, qa) {\n        var ra = pa.action_type;\n        if (((ra == l.USER_GENERATED_MESSAGE) || (ra == l.LOG_MESSAGE))) {\n            (pa.is_unread && oa.unread_count++);\n            oa.message_count++;\n            oa.is_archived = false;\n        }\n    ;\n        switch (ra) {\n          case l.USER_GENERATED_MESSAGE:\n            da(oa, pa.author);\n            break;\n          case l.SEND_MESSAGE:\n            var sa = pa.log_message_type;\n            if ((sa == q.THREAD_IMAGE)) {\n                oa.image_src = (pa.log_message_data.image ? pa.log_message_data.image.preview_url : null);\n            };\n            oa.snippet_attachments = pa.attachments;\n            break;\n          case l.LOG_MESSAGE:\n            var sa = pa.log_message_type;\n            if ((sa == q.SUBSCRIBE)) {\n                ba(na, oa, pa.log_message_data.added_participants);\n            }\n             else if ((sa == q.JOINABLE_JOINED)) {\n                ba(na, oa, [pa.log_message_data.joined_participant,]);\n            }\n             else if ((sa == q.UNSUBSCRIBE)) {\n                ca(na, oa, pa.author);\n            }\n             else if ((sa == q.THREAD_IMAGE)) {\n                if (!qa) {\n                    oa.image_src = (pa.log_message_data.image ? pa.log_message_data.image.preview_url : null);\n                };\n            }\n             else if ((sa == q.THREAD_NAME)) {\n                oa.name = pa.log_message_data.name;\n            }\n            \n            \n            \n        ;\n            break;\n          case l.CHANGE_READ_STATUS:\n            if (pa.timestamp) {\n                na._threadInformer.changedThreadReadState(oa.thread_id, pa.mark_as_read, pa.timestamp);\n            };\n            fa(na, oa, pa.mark_as_read);\n            break;\n          case l.CLEAR_CHAT:\n            ha(na, oa, pa.clear_time);\n            break;\n          case l.CHANGE_ARCHIVED_STATUS:\n            oa.is_archived = pa.archived;\n            break;\n          case l.CHANGE_FOLDER:\n            oa.folder = pa.new_folder;\n            break;\n          case l.DELETE_MESSAGES:\n            if (qa) {\n                oa.snippet = \"...\";\n                oa.snippet_has_attachment = false;\n                oa.snippet_attachments = null;\n                oa.snippet_sender = null;\n                oa.is_forwarded_snippet = false;\n                na._threadInformer.updatedThread(pa.thread_id);\n            }\n             else if (pa.message_ids) {\n                oa.message_count = (oa.message_count - pa.message_ids.length);\n            }\n        ;\n            break;\n          case l.CHANGE_MUTE_SETTINGS:\n            if ((pa.mute_settings !== undefined)) {\n                var ta = (na._fbid + \"@facebook.com\");\n                if (oa.mute_settings) {\n                    if (pa.mute_settings) {\n                        oa.mute_settings[ta] = pa.mute_settings;\n                    }\n                     else delete oa.mute_settings[ta];\n                ;\n                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            }\n        ;\n            break;\n        };\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\n        };\n    };\n    function ja(na, oa) {\n        var pa = na._serverRequests.tokenizeThreadID(oa.thread_id);\n        if ((pa.type == \"group\")) {\n            aa.error(\"invalid_new_thread_message\", oa);\n            return undefined;\n        }\n    ;\n        var qa = la(na, oa.specific_to_list), ra = {\n            thread_id: oa.thread_id,\n            last_action_id: oa.action_id,\n            participants: oa.specific_to_list,\n            name: null,\n            snippet: oa.body,\n            snippet_has_attachment: false,\n            snippet_attachments: [],\n            snippet_sender: oa.author,\n            unread_count: 0,\n            message_count: 0,\n            image_src: null,\n            timestamp_absolute: oa.timestamp_absolute,\n            timestamp_relative: oa.timestamp_relative,\n            timestamp: oa.timestamp,\n            canonical_fbid: ((pa.type === \"user\") ? pa.value : null),\n            is_canonical_user: (pa.type === \"user\"),\n            is_canonical: qa,\n            is_subscribed: true,\n            root_message_threading_id: oa.message_id,\n            folder: t.INBOX,\n            is_archived: false,\n            mode: s.TITAN_ORIGINATED\n        };\n        return ra;\n    };\n    function ka(na) {\n        this._fbid = na;\n        this._serverRequests = v.getForFBID(this._fbid);\n        this._threadInformer = w.getForFBID(this._fbid);\n        this._threads = new k();\n        ma(this);\n    };\n    x(ka.prototype, {\n        getThreadMetaNow: function(na) {\n            m.isThreadID(na);\n            return this._threads.getResource(na);\n        },\n        getThreadMeta: function(na, oa, pa) {\n            m.isThreadID(na);\n            var qa = this._threads.executeOrEnqueue(na, oa), ra = this._threads.getUnavailableResources(qa);\n            if (ra.length) {\n                var sa = this._serverRequests.tokenizeThreadID(na);\n                if ((sa.type == \"user\")) {\n                    this.getCanonicalThreadToUser(sa.value);\n                }\n                 else this._serverRequests.fetchThreadData(ra, pa);\n            ;\n            }\n        ;\n            return qa;\n        },\n        unsubscribe: function(na) {\n            this._threads.unsubscribe(na);\n        },\n        changeThreadReadStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (fa(this, pa, oa)) {\n                this._serverRequests.changeThreadReadStatus(na, oa, i.getFromMeta(pa));\n            };\n        },\n        changeThreadArchivedStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if ((pa.is_archived != oa)) {\n                pa.is_archived = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadArchivedStatus(na, oa);\n            }\n        ;\n        },\n        markThreadSpam: function(na) {\n            this._serverRequests.markThreadSpam(na);\n        },\n        unmarkThreadSpam: function(na) {\n            this._serverRequests.unmarkThreadSpam(na);\n        },\n        updateThreadMuteSetting: function(na, oa) {\n            this._serverRequests.changeMutingOnThread(na, oa);\n        },\n        changeFolder: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if ((pa && (pa.folder != oa))) {\n                pa.folder = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadFolder(na, oa);\n            }\n        ;\n        },\n        deleteThread: function(na) {\n            m.isThreadID(na);\n            this._serverRequests.deleteThread(na);\n        },\n        updateThreads: function(na) {\n            if ((!na || !na.length)) {\n                return\n            };\n            var oa = {\n            };\n            na.forEach(function(pa) {\n                oa[pa.thread_id] = pa;\n            });\n            this._threads.addResourcesAndExecute(oa);\n        },\n        updateMetadataByActions: function(na, oa) {\n            if ((!na || !na.length)) {\n                return\n            };\n            var pa = {\n            }, qa = {\n            }, ra = {\n            };\n            for (var sa = 0; (sa < na.length); sa++) {\n                var ta = na[sa];\n                if (ta.is_forward) {\n                    continue;\n                };\n                var ua = ta.action_type, va = ta.thread_id;\n                m.isThreadID(va);\n                var wa = this.getThreadMetaNow(va);\n                if (((ua == l.LOG_MESSAGE) && (ta.log_message_type == q.SERVER_ERROR))) {\n                    continue;\n                };\n                if (((!wa && !ta.action_id) && (ua == l.USER_GENERATED_MESSAGE))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\n                }\n            ;\n                if (wa) {\n                    if ((ua == l.DELETE_THREAD)) {\n                        wa.message_count = 0;\n                        this._threadInformer.deletedThread(va);\n                        continue;\n                    }\n                ;\n                    var xa = !!ta.action_id;\n                    if (((ua == l.LOG_MESSAGE) || (ua == l.USER_GENERATED_MESSAGE))) {\n                        xa = !oa;\n                    };\n                    if (((wa.server_timestamp && (ta.timestamp <= wa.server_timestamp)) && xa)) {\n                        continue;\n                    };\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    };\n                    ia(this, ra[va], ta, oa);\n                    if ((ua == l.USER_GENERATED_MESSAGE)) {\n                        pa[va] = ta;\n                    };\n                    if ((((ua == l.USER_GENERATED_MESSAGE) || (ua == l.LOG_MESSAGE)) || (ua == l.SEND_MESSAGE))) {\n                        if (((ta && ta.timestamp) && ((!qa[va] || (ta.timestamp > qa[va].timestamp))))) {\n                            qa[va] = ta;\n                        }\n                    };\n                }\n            ;\n            };\n            for (var ya in ra) {\n                var za = ra[ya], ab = pa[ya];\n                if (ab) {\n                    ea(za, ab);\n                };\n                var bb = qa[ya], cb = za.timestamp;\n                if (bb) {\n                    if ((bb.timestamp > cb)) {\n                        za = x(za, {\n                            timestamp_absolute: bb.timestamp_absolute,\n                            timestamp_relative: bb.timestamp_relative,\n                            timestamp: bb.timestamp\n                        });\n                    };\n                    var db = za.server_timestamp;\n                    if ((!oa && (bb.timestamp > db))) {\n                        za.server_timestamp = bb.timestamp;\n                    };\n                }\n            ;\n                this._threads.setResource(ya, za);\n            };\n        },\n        getCanonicalThreadToUser: function(na, oa, pa) {\n            return this.getCanonicalThreadToParticipant((\"fbid:\" + na), oa, pa);\n        },\n        getCanonicalThreadToParticipant: function(na, oa, pa) {\n            var qa = this.getThreadIDForParticipant(na), ra = this._threads.getResource(qa);\n            if ((typeof ra == \"undefined\")) {\n                ra = this.createNewLocalThread(qa, [u.getIDForUser(this._fbid),na,], oa);\n                this._serverRequests.fetchThreadData([qa,], pa);\n            }\n        ;\n            return ra;\n        },\n        getThreadIdForUser: function(na) {\n            return (\"user:\" + na);\n        },\n        getThreadIDForParticipant: function(na) {\n            var oa = p.tokenize(na);\n            return this.getThreadIdForUser(oa.value);\n        },\n        createNewLocalThread: function(na, oa, pa) {\n            var qa = this._threads.getResource(na);\n            if (!qa) {\n                var ra = this._serverRequests.tokenizeThreadID(na);\n                qa = {\n                    thread_id: na,\n                    last_action_id: null,\n                    participants: oa,\n                    name: null,\n                    snippet: \"\",\n                    snippet_has_attachment: false,\n                    snippet_sender: null,\n                    unread_count: (pa ? pa : 0),\n                    message_count: 0,\n                    image_src: null,\n                    timestamp_absolute: null,\n                    timestamp_relative: null,\n                    timestamp: null,\n                    canonical_fbid: ((ra.type === \"user\") ? ra.value : null),\n                    is_canonical_user: (ra.type == \"user\"),\n                    is_canonical: la(this, oa),\n                    is_subscribed: true,\n                    root_message_threading_id: null,\n                    folder: t.INBOX,\n                    is_archived: false,\n                    mode: s.TITAN_ORIGINATED\n                };\n                this._threads.setResource(na, qa);\n            }\n        ;\n            return qa;\n        },\n        addParticipantsToThreadLocally: function(na, oa) {\n            var pa = this._threads.getResource(na);\n            if (pa) {\n                ba(this, pa, oa);\n                this._threadInformer.updatedThread(pa.thread_id);\n            }\n        ;\n        },\n        getCanonicalUserInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((oa.type == \"user\") ? oa.value : null);\n        },\n        getCanonicalGroupInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((oa.type == \"group\") ? oa.value : null);\n        },\n        isEmptyLocalThread: function(na) {\n            var oa = this._threads.getResource(na);\n            if (!oa) {\n                return false\n            };\n            var pa = this._serverRequests.tokenizeThreadID(na);\n            return ((pa.type == \"root\") && !oa.timestamp);\n        },\n        isNewEmptyLocalThread: function(na) {\n            if (!this.isEmptyLocalThread(na)) {\n                return false\n            };\n            var oa = this._threads.getResource(na);\n            return (oa.participants && (oa.participants.length === 0));\n        },\n        canReply: function(na) {\n            var oa = this._threads.getResource(na);\n            return (((oa && oa.is_subscribed) && (oa.mode != s.OBJECT_ORIGINATED)) && ((oa.recipients_loadable || (oa.recipients_loadable === undefined))));\n        }\n    });\n    x(ka, r);\n    function la(na, oa) {\n        var pa = oa.filter(function(qa) {\n            return (qa != u.getIDForUser(na._fbid));\n        });\n        return (pa.length <= 1);\n    };\n    function ma(na) {\n        na._serverRequests.subscribe(\"update-threads\", function(oa, pa) {\n            var qa = ((pa.actions || [])).filter(function(ua) {\n                return ua.thread_id;\n            });\n            na.updateThreads(pa.threads);\n            na.updateMetadataByActions(qa, pa.from_client);\n            ((pa.threads || [])).forEach(function(ua) {\n                na._threadInformer.updatedThread(ua.thread_id);\n            });\n            var ra = (pa.global_actions || []);\n            for (var sa = 0; (sa < ra.length); sa++) {\n                var ta = ra[sa];\n                if ((ta.action_type == o.MARK_ALL_READ)) {\n                    ga(na, ta.folder);\n                };\n            };\n        });\n    };\n    g.subscribe(j.DUMP_EVENT, function(na, oa) {\n        oa.messaging = (oa.messaging || {\n        });\n        oa.messaging.threads = {\n        };\n        var pa = ka._getInstances();\n        for (var qa in pa) {\n            oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();;\n        };\n    });\n    e.exports = ka;\n});\n__d(\"MercuryUnreadState\", [\"Arbiter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryFolders\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercuryGlobalActionType\"), m = b(\"MercurySingletonMixin\"), n = b(\"MercuryThreadlistConstants\"), o = b(\"MessagingTag\"), p = b(\"MercuryServerRequests\"), q = b(\"MercuryThreadInformer\"), r = b(\"MercuryThreads\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"createObjectFrom\"), v = ((h.getSupportedFolders() || [])).filter(function(ma) {\n        return (ma != o.ACTION_ARCHIVED);\n    }), w = \"unread_thread_hash\", x = \"unseen_thread_list\", y = n.MAX_UNREAD_COUNT, z = i.create(\"mercury_unread_state\");\n    function aa(ma) {\n        this._fbid = ma;\n        this._serverRequests = p.getForFBID(this._fbid);\n        this._threadInformer = q.getForFBID(this._fbid);\n        this._threads = r.getForFBID(this._fbid);\n        this._allReadTimestamp = {\n        };\n        this._threadReadTimestamp = {\n        };\n        this._initialUnreadCount = {\n        };\n        this._maxCount = {\n        };\n        this._unreadResources = {\n        };\n        v.forEach(function(na) {\n            this._initialUnreadCount[na] = 0;\n            this._maxCount[na] = false;\n            this._unreadResources[na] = new j();\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-unread\", function(na, oa) {\n            fa(this, oa);\n            var pa = (oa.global_actions || []);\n            for (var qa = 0; (qa < pa.length); qa++) {\n                var ra = pa[qa];\n                if ((ra.action_type == l.MARK_ALL_READ)) {\n                    ia(this, ra.folder, ra.timestamp);\n                };\n            };\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\n    };\n    t(aa.prototype, {\n        getUnreadCount: function(ma) {\n            if (this.exceedsMaxCount(ma)) {\n                z.error(\"unguarded_unread_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n            return ea(this, ma);\n        },\n        exceedsMaxCount: function(ma) {\n            return (this._maxCount[ma] || ((ea(this, ma) > y)));\n        },\n        markFolderAsRead: function(ma) {\n            if ((this._maxCount[ma] || (ea(this, ma) > 0))) {\n                this._serverRequests.markFolderAsRead(ma);\n            };\n        }\n    });\n    t(aa, m);\n    function ba(ma, na, oa) {\n        ma._unreadResources[na].setResource(w, oa);\n        ma._unreadResources[na].setResource(x, Object.keys(oa));\n    };\n    function ca(ma, na, oa) {\n        var pa = ma._unreadResources[na].executeOrEnqueue(w, oa), qa = ma._unreadResources[na].getUnavailableResources(pa);\n        if (qa.length) {\n            ma._serverRequests.fetchUnreadThreadIDs(na);\n        };\n    };\n    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\n    };\n    function ea(ma, na) {\n        var oa = ma._unreadResources[na].getResource(x);\n        if (oa) {\n            return oa.length;\n        }\n         else return ma._initialUnreadCount[na]\n    ;\n    };\n    function fa(ma, na) {\n        var oa;\n        ((na.unread_thread_ids || [])).forEach(function(pa) {\n            oa = pa.folder;\n            if (!la(oa)) {\n                return\n            };\n            var qa = ja(ma, pa.thread_ids);\n            ba(ma, oa, u(qa, true));\n            if ((qa.length > y)) {\n                ma._maxCount[oa] = true;\n            };\n            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if ((pa.unread_count === undefined)) {\n                return\n            };\n            oa = pa.folder;\n            if ((pa.unread_count > y)) {\n                ma._maxCount[oa] = true;\n                ba(ma, oa, {\n                });\n                ma._threadInformer.updatedUnreadState();\n            }\n             else {\n                ma._initialUnreadCount[oa] = pa.unread_count;\n                if ((ma._initialUnreadCount[oa] === 0)) {\n                    ba(ma, oa, {\n                    });\n                };\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return\n            };\n            var qa = k, ra = (pa.thread_id ? pa.thread_id : pa.server_thread_id);\n            if ((pa.action_type == qa.DELETE_THREAD)) {\n                v.forEach(function(ta) {\n                    ha(ma, ta, ra);\n                });\n            }\n             else if (((pa.action_type == qa.CHANGE_ARCHIVED_STATUS) || (pa.action_type == qa.CHANGE_FOLDER))) {\n                var sa = ma._threads.getThreadMetaNow(pa.thread_id);\n                oa = h.getFromMeta(sa);\n                if ((la(oa) && (sa.unread_count > 0))) {\n                    ga(ma, oa, ra);\n                };\n                v.forEach(function(ta) {\n                    if ((ta != oa)) {\n                        ha(ma, ta, ra);\n                    };\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return\n                };\n                if ((pa.action_type == qa.CHANGE_READ_STATUS)) {\n                    if (pa.mark_as_read) {\n                        ha(ma, oa, ra, pa.timestamp);\n                    }\n                     else ga(ma, oa, ra, pa.timestamp);\n                ;\n                }\n                 else if (((pa.action_type == qa.USER_GENERATED_MESSAGE) || (pa.action_type == qa.LOG_MESSAGE))) {\n                    if (pa.is_unread) {\n                        ga(ma, oa, ra, pa.timestamp);\n                    }\n                }\n            ;\n            }\n            \n        ;\n        });\n    };\n    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return\n        };\n        ca(ma, na, function(qa) {\n            var ra = (ma._allReadTimestamp[na] || 0), sa = (ma._threadReadTimestamp[oa] || 0), ta = (pa || Number.POSITIVE_INFINITY);\n            if ((((ta >= ra) && (ta >= sa)) && !qa[oa])) {\n                qa[oa] = (pa || 0);\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n    };\n    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return\n        };\n        ca(ma, na, function(qa) {\n            if (pa) {\n                var ra = ma._threadReadTimestamp[oa];\n                if ((!ra || (ra < pa))) {\n                    ma._threadReadTimestamp[oa] = pa;\n                };\n            }\n        ;\n            var sa = qa[oa];\n            if (((pa && (typeof sa == \"number\")) && (pa < sa))) {\n                return\n            };\n            if ((oa in qa)) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        });\n    };\n    function ia(ma, na, oa) {\n        ma._maxCount[na] = false;\n        ba(ma, na, {\n        });\n        ma._allReadTimestamp[na] = Math.max((ma._allReadTimestamp[na] || 0), (oa || 0));\n        ma._threadInformer.updatedUnreadState();\n    };\n    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return\n            };\n            for (var qa in na) {\n                var ra = na[qa];\n                if (pa[qa]) {\n                    pa[ra] = pa[qa];\n                    delete pa[qa];\n                }\n            ;\n            };\n            ba(ma, oa, pa);\n        });\n    };\n    function la(ma) {\n        return s(v, ma);\n    };\n    g.subscribe(i.DUMP_EVENT, function(ma, na) {\n        na.messaging = (na.messaging || {\n        });\n        na.messaging.unread = {\n        };\n        na.messaging.unread_max_count = {\n        };\n        var oa = aa._getInstances();\n        for (var pa in oa) {\n            na.messaging.unread[pa] = {\n            };\n            na.messaging.unread_max_count[pa] = {\n            };\n            v.forEach(function(qa) {\n                na.messaging.unread[pa][qa] = t({\n                }, da(oa[pa], qa));\n                na.messaging.unread_max_count[pa][qa] = oa[pa]._maxCount[qa];\n            });\n        };\n    });\n    e.exports = aa;\n});\n__d(\"MercuryChatUtils\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        canOpenChatTab: function(i) {\n            var j = (i.is_canonical && !i.is_canonical_user);\n            return ((i.is_subscribed && !j) && (i.canonical_fbid != g.user));\n        }\n    };\n    e.exports = h;\n});\n__d(\"RenderManager\", [\"function-extensions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._isDirty = false;\n        this._obj = i;\n    };\n    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\n            }\n        ;\n        },\n        _doPaint: function() {\n            this._isDirty = false;\n            this._obj.paint();\n        }\n    });\n    e.exports = h;\n});\n__d(\"CounterDisplay\", [\"Arbiter\",\"CSS\",\"DOM\",\"RenderManager\",\"Run\",\"$\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"RenderManager\"), k = b(\"Run\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\");\n    function o(p, q, r, s, t, u) {\n        m(this, {\n            _name: p,\n            _valueNode: l(q),\n            _wrapperNode: (l(r) || null),\n            _statusClass: t,\n            _rm: new j(this),\n            _arbiterSubscription: null,\n            _count: 0\n        });\n        var v = this._valueNode.firstChild;\n        if (v) {\n            var w = parseInt(v.nodeValue, 10);\n            if (!isNaN(w)) {\n                this._count = w;\n            };\n        }\n    ;\n        this._statusNode = (s ? l(s) : null);\n        this._subscribeAll();\n        o.instances.push(this);\n        if (!u) {\n            k.onLeave(this._destroy.bind(this), true);\n        };\n    };\n    m(o, {\n        EVENT_TYPE_ADJUST: \"CounterDisplay/adjust\",\n        EVENT_TYPE_UPDATE: \"CounterDisplay/update\",\n        instances: [],\n        adjustCount: function(p, q) {\n            g.inform(((o.EVENT_TYPE_ADJUST + \"/\") + p), q);\n        },\n        setCount: function(p, q) {\n            g.inform(((o.EVENT_TYPE_UPDATE + \"/\") + p), q);\n        }\n    });\n    m(o.prototype, {\n        _destroy: function() {\n            delete this._valueNode;\n            delete this._wrapperNode;\n            if (this._arbiterSubscription) {\n                this._arbiterSubscription.unsubscribe();\n                delete this._arbiterSubscription;\n            }\n        ;\n            n(o.instances, this);\n        },\n        adjustCount: function(p) {\n            this._count = Math.max(0, (this._count + p));\n            this._rm.dirty();\n            return this;\n        },\n        setCount: function(p) {\n            this._count = Math.max(0, p);\n            this._rm.dirty();\n            return this;\n        },\n        paint: function() {\n            i.setContent(this._valueNode, this._count);\n            this._toggleNodes();\n        },\n        _toggleNodes: function() {\n            if (this._wrapperNode) {\n                h.conditionClass(this._wrapperNode, \"hidden_elem\", (this._count <= 0));\n            };\n            if ((this._statusClass && this._statusNode)) {\n                h.conditionClass(this._statusNode, this._statusClass, (this._count > 0));\n            };\n        },\n        _subscribeAll: function() {\n            var p = [((o.EVENT_TYPE_ADJUST + \"/\") + this._name),((o.EVENT_TYPE_UPDATE + \"/\") + this._name),];\n            this._arbiterSubscription = g.subscribe(p, this._onInform.bind(this), g.SUBSCRIBE_NEW);\n        },\n        _onInform: function(p, q) {\n            q = parseInt(q);\n            if (isNaN(q)) {\n                return\n            };\n            if ((p.indexOf(o.EVENT_TYPE_ADJUST) != -1)) {\n                this.adjustCount(q);\n            }\n             else if ((p.indexOf(o.EVENT_TYPE_UPDATE) != -1)) {\n                this.setCount(q);\n            }\n             else return\n            \n        ;\n            return;\n        }\n    });\n    e.exports = o;\n});");
// 8931
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s29aa87ae93fc8aca2114c63815cd6c841d633925");
// 8932
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"zBhY6\",]);\n}\n;\n;\n__d(\"MercuryAPIArgsSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        JEWEL: \"jewel\",\n        CHAT: \"chat\",\n        MERCURY: \"mercury\",\n        WEBMESSENGER: \"web_messenger\"\n    };\n});\n__d(\"MercuryActionStatus\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNCONFIRMED: 3,\n        UNSENT: 0,\n        RESENDING: 7,\n        RESENT: 6,\n        UNABLE_TO_CONFIRM: 5,\n        FAILED_UNKNOWN_REASON: 4,\n        SUCCESS: 1,\n        ERROR: 10\n    };\n});\n__d(\"MercuryActionTypeConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        LOG_MESSAGE: \"ma-type:log-message\",\n        CLEAR_CHAT: \"ma-type:clear_chat\",\n        UPDATE_ACTION_ID: \"ma-type:update-action-id\",\n        DELETE_MESSAGES: \"ma-type:delete-messages\",\n        CHANGE_FOLDER: \"ma-type:change-folder\",\n        SEND_MESSAGE: \"ma-type:send-message\",\n        CHANGE_ARCHIVED_STATUS: \"ma-type:change-archived-status\",\n        DELETE_THREAD: \"ma-type:delete-thread\",\n        USER_GENERATED_MESSAGE: \"ma-type:user-generated-message\",\n        CHANGE_READ_STATUS: \"ma-type:change_read_status\",\n        CHANGE_MUTE_SETTINGS: \"ma-type:change-mute-settings\"\n    };\n});\n__d(\"MercuryAttachmentContentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNKNOWN: \"attach:unknown\",\n        PHOTO: \"attach:image\",\n        VIDEO: \"attach:video\",\n        MSWORD: \"attach:ms:word\",\n        VOICE: \"attach:voice\",\n        MSPPT: \"attach:ms:ppt\",\n        TEXT: \"attach:text\",\n        MUSIC: \"attach:music\",\n        MSXLS: \"attach:ms:xls\"\n    };\n});\n__d(\"MercuryAttachmentType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        STICKER: \"sticker\",\n        PHOTO: \"photo\",\n        FILE: \"file\",\n        SHARE: \"share\",\n        ERROR: \"error\"\n    };\n});\n__d(\"MercuryErrorType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER: 1,\n        TRANSPORT: 2,\n        TIMEOUT: 3\n    };\n});\n__d(\"MercuryGenericConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PENDING_THREAD_ID: \"pending:pending\"\n    };\n});\n__d(\"MercuryGlobalActionType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MARK_ALL_READ: \"mga-type:mark-all-read\"\n    };\n});\n__d(\"MercuryLogMessageType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_ERROR: \"log:error-msg\",\n        UNSUBSCRIBE: \"log:unsubscribe\",\n        JOINABLE_JOINED: \"log:joinable-joined\",\n        JOINABLE_CREATED: \"log:joinable-created\",\n        LIVE_LISTEN: \"log:live-listen\",\n        PHONE_CALL: \"log:phone-call\",\n        THREAD_IMAGE: \"log:thread-image\",\n        THREAD_NAME: \"log:thread-name\",\n        VIDEO_CALL: \"log:video-call\",\n        SUBSCRIBE: \"log:subscribe\"\n    };\n});\n__d(\"MercuryParticipantTypes\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        FRIEND: \"friend\",\n        USER: \"user\",\n        THREAD: \"thread\",\n        EVENT: \"JSBNG__event\",\n        PAGE: \"page\"\n    };\n});\n__d(\"MercuryPayloadSource\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        SERVER_INITIAL_DATA: \"server_initial_data\",\n        CLIENT_DELETE_THREAD: \"client_delete_thread\",\n        SERVER_SAVE_DRAFT: \"server_save_draft\",\n        SERVER_CHANGE_ARCHIVED_STATUS: \"server_change_archived_status\",\n        SERVER_SEARCH: \"server_search\",\n        CLIENT_CHANGE_MUTE_SETTINGS: \"client_change_mute_settings\",\n        SERVER_UNREAD_THREADS: \"server_unread_threads\",\n        SERVER_MARK_SEEN: \"server_mark_seen\",\n        SERVER_THREAD_SYNC: \"server_thread_sync\",\n        CLIENT_DELETE_MESSAGES: \"client_delete_messages\",\n        SERVER_FETCH_THREADLIST_INFO: \"server_fetch_threadlist_info\",\n        CLIENT_CHANNEL_MESSAGE: \"client_channel_message\",\n        CLIENT_CHANGE_FOLDER: \"client_change_folder\",\n        CLIENT_CHANGE_READ_STATUS: \"client_change_read_status\",\n        CLIENT_CLEAR_CHAT: \"client_clear_chat\",\n        SERVER_FETCH_THREAD_INFO: \"server_fetch_thread_info\",\n        SERVER_CHANGE_READ_STATUS: \"server_change_read_status\",\n        SERVER_SEND_MESSAGE: \"server_send_message\",\n        CLIENT_SAVE_DRAFT: \"client_save_draft\",\n        UNKNOWN: \"unknown\",\n        SERVER_MARK_FOLDER_READ: \"server_mark_folder_read\",\n        SERVER_CONFIRM_MESSAGES: \"server_confirm_messages\",\n        SERVER_TAB_PRESENCE: \"server_tab_presence\",\n        CLIENT_CHANGE_ARCHIVED_STATUS: \"client_change-archived_status\",\n        CLIENT_SEND_MESSAGE: \"client_send_message\",\n        CLIENT_HANDLE_ERROR: \"client_handle_error\"\n    };\n});\n__d(\"MercurySourceType\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        GIGABOXX_BLAST: \"source:gigaboxx:blast\",\n        TITAN_FACEWEB_BUFFY: \"source:titan:faceweb_buffy\",\n        TITAN_FACEWEB_UNKNOWN: \"source:titan:faceweb_unknown\",\n        CHAT_WEB: \"source:chat:web\",\n        WEBRTC_MOBILE: \"source:webrtc:mobile\",\n        GIGABOXX_API: \"source:gigaboxx:api\",\n        TITAN_M_JAPAN: \"source:titan:m_japan\",\n        BUFFY_SMS: \"source:buffy:sms\",\n        SEND_PLUGIN: \"source:sendplugin\",\n        CHAT_MEEBO: \"source:chat:meebo\",\n        TITAN_FACEWEB_IPAD: \"source:titan:faceweb_ipad\",\n        TITAN_FACEWEB_IPHONE: \"source:titan:faceweb_iphone\",\n        TEST: \"source:test\",\n        WEB: \"source:web\",\n        SOCIALFOX: \"source:socialfox\",\n        EMAIL: \"source:email\",\n        TITAN_API: \"source:titan:api\",\n        GIGABOXX_WEB: \"source:gigaboxx:web\",\n        DESKTOP: \"source:desktop\",\n        TITAN_FACEWEB_ANDROID: \"source:titan:faceweb_android\",\n        LEIA: \"source:leia\",\n        CHAT_JABBER: \"source:chat:jabber\",\n        CHAT_TEST: \"source:chat:test\",\n        SHARE_DIALOG: \"source:share:dialog\",\n        GIGABOXX_WAP: \"source:gigaboxx:wap\",\n        CHAT: \"source:chat\",\n        TITAN_M_APP: \"source:titan:m_app\",\n        TITAN_M_TOUCH: \"source:titan:m_touch\",\n        TITAN_ORCA: \"source:titan:orca\",\n        TITAN_WAP: \"source:titan:wap\",\n        TITAN_EMAIL_REPLY: \"source:titan:emailreply\",\n        CHAT_IPHONE: \"source:chat:iphone\",\n        SMS: \"source:sms\",\n        TITAN_M_BASIC: \"source:titan:m_basic\",\n        TITAN_M_MINI: \"source:titan:m_mini\",\n        GIGABOXX_MOBILE: \"source:gigaboxx:mobile\",\n        UNKNOWN: \"source:unknown\",\n        TITAN_WEB: \"source:titan:web\",\n        TITAN_M_ZERO: \"source:titan:m_zero\",\n        MOBILE: \"source:mobile\",\n        PAID_PROMOTION: \"source:paid_promotion\",\n        TITAN_API_MOBILE: \"source:titan:api_mobile\",\n        HELPCENTER: \"source:helpcenter\",\n        GIGABOXX_EMAIL_REPLY: \"source:gigaboxx:emailreply\",\n        CHAT_ORCA: \"source:chat:orca\",\n        TITAN_M_TALK: \"source:titan:m_talk\",\n        NEW_SHARE_DIALOG: \"source:share:dialog:new\"\n    };\n});\n__d(\"MercuryThreadMode\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        EMAIL_ORIGINATED: 1,\n        OBJECT_ORIGINATED: 3,\n        TITAN_ORIGINATED: 2\n    };\n});\n__d(\"MessagingTag\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        MTA_SYSTEM_MESSAGE: \"MTA:system_message\",\n        SENT: \"sent\",\n        INBOX: \"inbox\",\n        SMS_TAG_ROOT: \"SMSShortcode:\",\n        UPDATES: \"broadcasts_inbox\",\n        OTHER: \"other\",\n        GROUPS: \"groups\",\n        FILTERED_CONTENT: \"filtered_content\",\n        ACTION_ARCHIVED: \"action:archived\",\n        UNREAD: \"unread\",\n        BCC: \"header:bcc\",\n        SMS_MUTE: \"sms_mute\",\n        ARCHIVED: \"archived\",\n        DOMAIN_AUTH_PASS: \"MTA:dmarc:pass\",\n        EVENT: \"JSBNG__event\",\n        VOICEMAIL: \"voicemail\",\n        DOMAIN_AUTH_FAIL: \"MTA:dmarc:fail\",\n        SPAM_SPOOFING: \"spam:spoofing\",\n        SPOOF_WARNING: \"MTA:spoof_warning\",\n        SPAM: \"spam\",\n        EMAIL_MESSAGE: \"source:email\",\n        EMAIL: \"email\",\n        APP_ID_ROOT: \"app_id:\"\n    };\n});\n__d(\"PresenceUtil\", [\"Cookie\",\"Env\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Env\"), i = b(\"randomInt\"), j = b(\"tx\"), k = ((i(0, 4294967295) + 1)), l = {\n        checkMaintenanceError: function(m) {\n            if (((m.getError() == 1356007))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getErrorDescription: function(m) {\n            var n = m.getError(), o = m.getErrorDescription();\n            if (!o) {\n                o = \"An error occurred.\";\n            }\n        ;\n        ;\n            if (((n == 1357001))) {\n                o = \"Your session has timed out. Please log in.\";\n            }\n        ;\n        ;\n            return o;\n        },\n        getSessionID: function() {\n            return k;\n        },\n        hasUserCookie: function() {\n            return ((h.user === g.get(\"c_user\")));\n        }\n    };\n    e.exports = l;\n});\n__d(\"PresencePrivacy\", [\"hasArrayNature\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"copyProperties\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"PresencePrivacyInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"copyProperties\"), l = b(\"Env\"), m = b(\"JSLogger\"), n = b(\"PresenceUtil\"), o = b(\"PresencePrivacyInitialData\"), p = \"/ajax/chat/privacy/settings.php\", q = \"/ajax/chat/privacy/online_policy.php\", r = \"/ajax/chat/privacy/visibility.php\", s = \"friend_visibility\", t = \"visibility\", u = \"online_policy\", v = k({\n    }, o.privacyData), w = o.visibility, x = k({\n    }, o.privacyData), y = w, z = o.onlinePolicy, aa = z, ba = [], ca = false;\n    function da() {\n        return m.create(\"blackbird\");\n    };\n;\n    var ea = k(new h(), {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1\n    });\n    function fa(ra) {\n        var sa;\n        {\n            var fin124keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin124i = (0);\n            (0);\n            for (; (fin124i < fin124keys.length); (fin124i++)) {\n                ((sa) = (fin124keys[fin124i]));\n                {\n                    var ta = ra[sa];\n                    if (((sa == l.user))) {\n                        da().error(\"set_viewer_visibility\");\n                        throw new Error(\"Invalid to set current user's visibility\");\n                    }\n                ;\n                ;\n                    switch (ta) {\n                      case ea.WHITELISTED:\n                    \n                      case ea.BLACKLISTED:\n                    \n                      case ea.UNLISTED:\n                        break;\n                      default:\n                        da().error(\"set_invalid_friend_visibility\", {\n                            id: sa,\n                            value: ta\n                        });\n                        throw new Error(((\"Invalid state: \" + ta)));\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin125keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin125i = (0);\n            (0);\n            for (; (fin125i < fin125keys.length); (fin125i++)) {\n                ((sa) = (fin125keys[fin125i]));\n                {\n                    v[sa] = ra[sa];\n                ;\n                };\n            };\n        };\n    ;\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ga(ra, sa) {\n        var ta = {\n        };\n        ta[ra] = sa;\n        fa(ta);\n    };\n;\n    function ha(ra) {\n        switch (ra) {\n          case ea.ONLINE:\n        \n          case ea.OFFLINE:\n            break;\n          default:\n            da().error(\"set_invalid_visibility\", {\n                value: ra\n            });\n            throw new Error(((\"Invalid visibility: \" + ra)));\n        };\n    ;\n        w = ra;\n        ea.inform(\"privacy-changed\");\n        ea.inform(\"privacy-user-presence-changed\");\n        h.inform(\"chat/visibility-changed\", {\n            sender: this\n        });\n    };\n;\n    function ia(ra) {\n        switch (ra) {\n          case ea.ONLINE_TO_WHITELIST:\n        \n          case ea.ONLINE_TO_BLACKLIST:\n            break;\n          default:\n            throw new Error(((\"Invalid default online policy: \" + ra)));\n        };\n    ;\n        z = ra;\n        ea.inform(\"privacy-user-presence-changed\");\n        ea.inform(\"privacy-changed\");\n    };\n;\n    function ja(ra, sa) {\n        ca = true;\n        ra.send();\n    };\n;\n    function ka(ra, sa) {\n        ba.push({\n            request: ra,\n            data: sa\n        });\n        if (!ca) {\n            var ta = ba.shift();\n            ja(ta.request, ta.data);\n        }\n    ;\n    ;\n    };\n;\n    function la(ra, sa) {\n        var ta = ra.type;\n        if (((ta === s))) {\n            var ua = sa.payload.user_availabilities;\n            if (!g(ua)) {\n                ea.inform(\"privacy-availability-changed\", {\n                    user_availabilities: ua\n                });\n                {\n                    var fin126keys = ((window.top.JSBNG_Replay.forInKeys)((ra.settings))), fin126i = (0);\n                    var va;\n                    for (; (fin126i < fin126keys.length); (fin126i++)) {\n                        ((va) = (fin126keys[fin126i]));\n                        {\n                            x[va] = ra.settings[va];\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (((ta === t))) {\n                y = ra.visibility;\n            }\n             else if (((ta === u))) {\n                aa = ra.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"set_update_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function ma(ra, sa) {\n        if (((w !== y))) {\n            ha(y);\n        }\n    ;\n    ;\n        if (((z !== aa))) {\n            ia(aa);\n        }\n    ;\n    ;\n        k(v, x);\n        ea.inform(\"privacy-changed\");\n        ba = [];\n        da().log(\"set_error_response\", {\n            data: ra,\n            response: sa\n        });\n    };\n;\n    function na(ra) {\n        ca = false;\n        if (((ba.length > 0))) {\n            var sa = ba.shift();\n            ja(sa.request, sa.data);\n        }\n    ;\n    ;\n    };\n;\n    function oa(ra, sa) {\n        if (((n != null))) {\n            var ta = ra.getData();\n            ta.window_id = n.getSessionID();\n            ra.setData(ta);\n        }\n    ;\n    ;\n        ra.setHandler(la.bind(this, sa)).setErrorHandler(ma.bind(this, sa)).setTransportErrorHandler(ma.bind(this, sa)).setFinallyHandler(na.bind(this)).setAllowCrossPageTransition(true);\n        return ra;\n    };\n;\n    function pa(ra, sa, ta) {\n        return oa(new i(ra).setData(sa), ta);\n    };\n;\n    function qa(ra, sa) {\n        var ta = sa.obj;\n        if (((ta.viewer_id != l.user))) {\n            da().error(\"invalid_viewer_for_channel_message\", {\n                type: ra,\n                data: sa\n            });\n            throw new Error(\"Viewer got from the channel is not the real viewer\");\n        }\n    ;\n    ;\n        if (((ta.window_id === n.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        var ua = ta.data;\n        if (((ta.JSBNG__event == \"access_control_entry\"))) {\n            ua.target_ids.forEach(function(wa) {\n                ga(wa, ua.setting);\n                x[wa] = ua.setting;\n            });\n        }\n         else {\n            if (((ta.JSBNG__event == \"visibility_update\"))) {\n                var va = ((!!ua.visibility ? ea.ONLINE : ea.OFFLINE));\n                ha(va);\n                y = va;\n            }\n             else if (((ta.JSBNG__event == \"online_policy_update\"))) {\n                ia(ua.online_policy);\n                aa = ua.online_policy;\n            }\n            \n        ;\n        ;\n            ea.inform(\"privacy-user-presence-response\");\n        }\n    ;\n    ;\n        da().log(\"channel_message_received\", {\n            data: sa.obj\n        });\n    };\n;\n    k(ea, {\n        WHITELISTED: 1,\n        BLACKLISTED: -1,\n        UNLISTED: 0,\n        ONLINE: 1,\n        OFFLINE: 0,\n        ONLINE_TO_WHITELIST: 0,\n        ONLINE_TO_BLACKLIST: 1,\n        init: function(ra, sa, ta) {\n        \n        },\n        setVisibility: function(ra) {\n            y = w;\n            ha(ra);\n            var sa = {\n                visibility: ra\n            }, ta = {\n                type: t,\n                visibility: ra\n            }, ua = pa(r, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_visibility\", {\n                data: sa\n            });\n            return ra;\n        },\n        getVisibility: function() {\n            return w;\n        },\n        setOnlinePolicy: function(ra) {\n            aa = z;\n            ia(ra);\n            var sa = {\n                online_policy: ra\n            }, ta = {\n                type: u,\n                online_policy: ra\n            }, ua = pa(q, sa, ta);\n            ka(ua, ta);\n            da().log(\"set_online_policy\", {\n                data: sa\n            });\n            return ra;\n        },\n        getOnlinePolicy: function() {\n            return z;\n        },\n        getFriendVisibility: function(ra) {\n            return ((v[ra] || ea.UNLISTED));\n        },\n        allows: function(ra) {\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                return false;\n            }\n        ;\n        ;\n            var sa = this.getOnlinePolicy();\n            return ((((sa === ea.ONLINE_TO_WHITELIST)) ? ((v[ra] == ea.WHITELISTED)) : ((v[ra] != ea.BLACKLISTED))));\n        },\n        setFriendsVisibility: function(ra, sa) {\n            if (((ra.length > 0))) {\n                var ta = {\n                };\n                for (var ua = 0; ((ua < ra.length)); ua++) {\n                    var va = ra[ua];\n                    x[va] = v[va];\n                    ta[va] = sa;\n                };\n            ;\n                fa(ta);\n                var wa = sa;\n                if (((wa == ea.UNLISTED))) {\n                    wa = x[ra[0]];\n                }\n            ;\n            ;\n                var xa = {\n                    users: ra,\n                    setting: sa,\n                    setting_type: wa\n                }, ya = {\n                    type: s,\n                    settings: ta\n                }, za = pa(p, xa, ya);\n                ka(za, ya);\n                da().log(\"set_friend_visibility\", {\n                    data: xa\n                });\n            }\n        ;\n        ;\n            return sa;\n        },\n        setFriendVisibilityMap: function(ra, sa) {\n            {\n                var fin127keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin127i = (0);\n                var ta;\n                for (; (fin127i < fin127keys.length); (fin127i++)) {\n                    ((ta) = (fin127keys[fin127i]));\n                    {\n                        x[ta] = v[ta];\n                    ;\n                    };\n                };\n            };\n        ;\n            fa(ra);\n            var ua = {\n                type: s,\n                settings: ra\n            };\n            ka(oa(sa, ua), ua);\n            da().log(\"set_friend_visibility_from_map\", {\n                data: ra\n            });\n        },\n        allow: function(ra) {\n            if (this.allows(ra)) {\n                da().error(\"allow_already_allowed\");\n                throw new Error(((\"allow() should only be called for users that \" + \"are not already allowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"allow_called_while_offline\");\n                throw new Error(\"allow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_WHITELIST)) ? ea.WHITELISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        disallow: function(ra) {\n            if (!this.allows(ra)) {\n                da().error(\"disallow_already_disallowed\");\n                throw new Error(((\"disallow() should only be called for users that \" + \"are not already disallowed\")));\n            }\n        ;\n        ;\n            if (((this.getVisibility() === ea.OFFLINE))) {\n                da().error(\"disallow_called_while_offline\");\n                throw new Error(\"disallow() should only be called when the user is already online\");\n            }\n        ;\n        ;\n            var sa = ((((this.getOnlinePolicy() === ea.ONLINE_TO_BLACKLIST)) ? ea.BLACKLISTED : ea.UNLISTED));\n            return this.setFriendsVisibility([ra,], sa);\n        },\n        getBlacklist: function() {\n            var ra = [];\n            {\n                var fin128keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin128i = (0);\n                var sa;\n                for (; (fin128i < fin128keys.length); (fin128i++)) {\n                    ((sa) = (fin128keys[fin128i]));\n                    {\n                        if (((v[sa] === ea.BLACKLISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getWhitelist: function() {\n            var ra = [];\n            {\n                var fin129keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin129i = (0);\n                var sa;\n                for (; (fin129i < fin129keys.length); (fin129i++)) {\n                    ((sa) = (fin129keys[fin129i]));\n                    {\n                        if (((v[sa] === ea.WHITELISTED))) {\n                            ra.push(sa);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return ra;\n        },\n        getMapForTest: function() {\n            return v;\n        },\n        setMapForTest: function(ra) {\n            v = ra;\n        }\n    });\n    ea.inform(\"privacy-changed\");\n    ea.inform(\"privacy-user-presence-changed\");\n    da().log(\"initialized\", {\n        visibility: w,\n        policy: z\n    });\n    h.subscribe(j.getArbiterType(\"privacy_changed\"), qa.bind(this));\n    h.subscribe(j.ON_CONFIG, function(ra, sa) {\n        var ta = sa.getConfig(\"visibility\", null);\n        if (((((ta !== null)) && ((typeof (ta) !== \"undefined\"))))) {\n            var ua = ((ta ? ea.ONLINE : ea.OFFLINE));\n            ha(ua);\n            da().log(\"config_visibility\", {\n                vis: ua\n            });\n        }\n    ;\n    ;\n    }.bind(this));\n    a.PresencePrivacy = e.exports = ea;\n}, 3);\n__d(\"ChatVisibility\", [\"Arbiter\",\"JSLogger\",\"PresencePrivacy\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = {\n        isOnline: function() {\n            return ((i.getVisibility() === i.ONLINE));\n        },\n        hasBlackbirdEnabled: function() {\n            return ((this.isVisibleToMostFriends() || this.isVisibleToSomeFriends()));\n        },\n        isVisibleToMostFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_BLACKLIST)) && ((i.getBlacklist().length > 0))));\n        },\n        isVisibleToSomeFriends: function() {\n            return ((((i.getOnlinePolicy() === i.ONLINE_TO_WHITELIST)) && ((i.getWhitelist().length > 0))));\n        },\n        goOnline: function(k) {\n            if (((i.getVisibility() === i.OFFLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_online\");\n                i.setVisibility(i.ONLINE);\n                g.inform(\"chat-visibility/go-online\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        goOffline: function(k) {\n            if (((i.getVisibility() === i.ONLINE))) {\n                h.create(\"blackbird\").log(\"chat_go_offline\");\n                i.setVisibility(i.OFFLINE);\n                g.inform(\"chat-visibility/go-offline\");\n            }\n        ;\n        ;\n            ((k && k()));\n        },\n        toggleVisibility: function() {\n            if (j.isOnline()) {\n                j.goOffline();\n            }\n             else j.goOnline();\n        ;\n        ;\n        }\n    };\n    a.ChatVisibility = e.exports = j;\n}, 3);\n__d(\"MercurySingletonMixin\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        _getInstances: function() {\n            if (!this._instances) {\n                this._instances = {\n                };\n            }\n        ;\n        ;\n            return this._instances;\n        },\n        get: function() {\n            return this.getForFBID(g.user);\n        },\n        getForFBID: function(i) {\n            var j = this._getInstances();\n            if (!j[i]) {\n                j[i] = new this(i);\n            }\n        ;\n        ;\n            return j[i];\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryMessageClientState\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DO_NOT_SEND_TO_SERVER: \"do_not_send_to_server\",\n        SEND_TO_SERVER: \"send_to_server\"\n    };\n    e.exports = g;\n});\n__d(\"MercuryMessageIDs\", [\"KeyedCallbackManager\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = new g(), i = {\n        getServerIDs: function(j, k) {\n            var l = j.filter(function(n) {\n                return ((n.indexOf(\"mail.projektitan.com\") !== -1));\n            }), m = function(n) {\n                var o = j.map(function(p) {\n                    return ((n[p] ? n[p] : p));\n                });\n                k(o);\n            };\n            return h.executeOrEnqueue(l, m);\n        },\n        addServerID: function(j, k) {\n            h.setResource(j, k);\n        }\n    };\n    e.exports = i;\n});\n__d(\"ImageSourceType\", [], function(a, b, c, d, e, f) {\n    var g = {\n        PROFILE_PICTURE: \"profile_picture\",\n        IMAGE: \"image\"\n    };\n    e.exports = g;\n});\n__d(\"PhotoResizeModeConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        COVER: \"s\",\n        CONTAIN: \"p\"\n    };\n    e.exports = g;\n});\n__d(\"ImageSourceRequest\", [\"arrayContains\",\"extendArray\",\"copyProperties\",\"Env\",\"KeyedCallbackManager\",\"ImageSourceType\",\"PhotoResizeModeConst\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"extendArray\"), i = b(\"copyProperties\"), j = b(\"Env\"), k = b(\"KeyedCallbackManager\"), l = b(\"ImageSourceType\"), m = b(\"PhotoResizeModeConst\"), n = b(\"MercuryServerDispatcher\");\n    function o() {\n        this._request = {\n            fbid: null,\n            type: null,\n            width: null,\n            height: null,\n            resize_mode: null\n        };\n        this._callback = null;\n    };\n;\n    i(o.prototype, {\n        setFBID: function(s) {\n            this._request.fbid = s;\n            return this;\n        },\n        setType: function(s) {\n            if (!g([l.PROFILE_PICTURE,l.IMAGE,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setType: invalid type \" + s)));\n            }\n        ;\n        ;\n            this._request.type = s;\n            return this;\n        },\n        setDimensions: function(s, t) {\n            this._request.width = s;\n            this._request.height = t;\n            return this;\n        },\n        setResizeMode: function(s) {\n            if (!g([m.COVER,m.CONTAIN,], s)) {\n                throw new TypeError(((\"ImageSourceRequest.setResizeMode: invalid resize mode \" + s)));\n            }\n        ;\n        ;\n            this._request.resize_mode = s;\n            return this;\n        },\n        setCallback: function(s) {\n            this._callback = s;\n            return this;\n        },\n        send: function() {\n            if (((((((((((!this._request.fbid || !this._request.width)) || !this._request.height)) || !this._request.type)) || !this._request.resize_mode)) || !this._callback))) {\n                throw new Error(\"ImageSourceRequest: You must set all the fields\");\n            }\n        ;\n        ;\n            var s = q(), t = r(this._request);\n            s.executeOrEnqueue(t, this._callback);\n            if (((s.getUnavailableResourcesFromRequest(t).length === 1))) {\n                n.trySend(\"/ajax/image_source.php\", {\n                    requests: [this._request,]\n                });\n                return true;\n            }\n        ;\n        ;\n            return false;\n        }\n    });\n    var p = null;\n    function q() {\n        if (p) {\n            return p;\n        }\n    ;\n    ;\n        var s = new k();\n        p = s;\n        n.registerEndpoints({\n            \"/ajax/image_source.php\": {\n                request_user_id: j.user,\n                mode: n.BATCH_DEFERRED_MULTI,\n                batch_function: function(t, u) {\n                    h(t.requests, u.requests);\n                    return t;\n                },\n                handler: function(t, u) {\n                    var v = u.getData().requests;\n                    for (var w = 0; ((w < v.length)); ++w) {\n                        s.setResource(r(v[w]), t[w]);\n                    ;\n                    };\n                ;\n                }\n            }\n        });\n        return s;\n    };\n;\n    function r(s) {\n        return [s.fbid,s.type,s.width,s.height,s.resize_mode,].join(\"|\");\n    };\n;\n    e.exports = o;\n});\n__d(\"MercuryIDs\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        return ((((typeof i === \"string\")) && ((i.indexOf(\":\") !== -1))));\n    };\n;\n    var h = {\n        isValid: function(i) {\n            if (!i) {\n                return false;\n            }\n        ;\n        ;\n            return g(i);\n        },\n        isValidThreadID: function(i) {\n            if (!h.isValid(i)) {\n                return false;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            switch (j.type) {\n              case \"user\":\n            \n              case \"group\":\n            \n              case \"thread\":\n            \n              case \"root\":\n            \n              case \"pending\":\n                return true;\n              default:\n                return false;\n            };\n        ;\n        },\n        tokenize: function(i) {\n            if (!this.isValid(i)) {\n                throw \"bad_id_format\";\n            }\n        ;\n        ;\n            var j = i.indexOf(\":\");\n            return {\n                type: i.substr(0, j),\n                value: i.substr(((j + 1)))\n            };\n        },\n        getUserIDFromParticipantID: function(i) {\n            if (!h.isValid(i)) {\n                return null;\n            }\n        ;\n        ;\n            var j = h.tokenize(i);\n            if (((j.type != \"fbid\"))) {\n                return null;\n            }\n        ;\n        ;\n            return j.value;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryAssert\", [\"MercuryIDs\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryIDs\");\n    e.exports = {\n        isParticipantID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_participant_id\";\n            }\n        ;\n        ;\n        },\n        allParticipantIDs: function(h) {\n            h.forEach(this.isParticipantID);\n        },\n        isUserParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"fbid\"))) {\n                throw \"bad_user_id\";\n            }\n        ;\n        ;\n        },\n        isEmailParticipantID: function(h) {\n            var i = g.tokenize(h);\n            if (((i.type != \"email\"))) {\n                throw \"bad_email_id\";\n            }\n        ;\n        ;\n        },\n        allThreadID: function(h) {\n            h.forEach(this.isThreadID);\n        },\n        isThreadID: function(h) {\n            if (!g.isValid(h)) {\n                throw \"bad_thread_id\";\n            }\n        ;\n        ;\n        }\n    };\n});\n__d(\"TimestampConverter\", [\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = g.create(\"timestamp_converter\");\n    function i(k) {\n        return ((((typeof (k) == \"string\")) && ((k.length > 6))));\n    };\n;\n    var j = {\n        convertActionIDToTimestamp: function(k) {\n            if (i(k)) {\n                var l = k.slice(0, -6);\n                return parseInt(l, 10);\n            }\n        ;\n        ;\n        },\n        maxValidActionID: function(k, l) {\n            if (!i(k)) {\n                return l;\n            }\n        ;\n        ;\n            if (!i(l)) {\n                return k;\n            }\n        ;\n        ;\n            return ((this.isGreaterThan(k, l) ? k : l));\n        },\n        isGreaterThan: function(k, l) {\n            if (((!i(k) || !i(l)))) {\n                return false;\n            }\n        ;\n        ;\n            return ((this.convertActionIDToTimestamp(k) > this.convertActionIDToTimestamp(l)));\n        }\n    };\n    e.exports = j;\n});\n__d(\"MessagingReliabilityLogger\", [\"function-extensions\",\"PresenceUtil\",\"MercuryServerDispatcher\",\"MessagingReliabilityLoggerInitialData\",\"isEmpty\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"PresenceUtil\"), h = b(\"MercuryServerDispatcher\"), i = b(\"MessagingReliabilityLoggerInitialData\"), j = b(\"isEmpty\"), k = b(\"setTimeoutAcrossTransitions\"), l = \"/ajax/mercury/client_reliability.php\", m = 60000;\n    function n(t, u) {\n        var v = {\n            app: i.app,\n            categories: JSON.stringify(t)\n        };\n        if (!j(u)) {\n            v.extra = JSON.stringify(u);\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    function o(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = 0;\n        }\n    ;\n    ;\n        t[u][v] += w;\n    };\n;\n    function p(t, u, v, w) {\n        if (((t[u] === undefined))) {\n            t[u] = {\n            };\n        }\n    ;\n    ;\n        if (((t[u][v] === undefined))) {\n            t[u][v] = [];\n        }\n    ;\n    ;\n        for (var x = 0; ((x < w.length)); ++x) {\n            t[u][v].push(w[x]);\n        ;\n        };\n    ;\n    };\n;\n    function q(t, u) {\n        if (((((t && !t.categories)) || ((u && !u.categories))))) {\n            return;\n        }\n    ;\n    ;\n        var v = ((t ? JSON.parse(t.categories) : {\n        })), w = ((((t && t.extra)) ? JSON.parse(t.extra) : {\n        })), x = JSON.parse(u.categories), y = ((u.extra ? JSON.parse(u.extra) : {\n        }));\n        {\n            var fin130keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin130i = (0);\n            var z;\n            for (; (fin130i < fin130keys.length); (fin130i++)) {\n                ((z) = (fin130keys[fin130i]));\n                {\n                    var aa = x[z], ba = y[z];\n                    {\n                        var fin131keys = ((window.top.JSBNG_Replay.forInKeys)((aa))), fin131i = (0);\n                        var ca;\n                        for (; (fin131i < fin131keys.length); (fin131i++)) {\n                            ((ca) = (fin131keys[fin131i]));\n                            {\n                                o(v, z, ca, aa[ca]);\n                                if (((ba !== undefined))) {\n                                    var da = ba[ca];\n                                    if (((da !== undefined))) {\n                                        p(w, z, ca, da);\n                                    }\n                                ;\n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        return n(v, w);\n    };\n;\n    var r = {\n    };\n    r[l] = {\n        mode: h.BATCH_SUCCESSIVE_PIGGYBACK_ON_ERROR,\n        batch_function: q\n    };\n    h.registerEndpoints(r);\n    var s = {\n        addEntry: function(t, u, v) {\n            if (!i.enabled) {\n                return;\n            }\n        ;\n        ;\n            var w = {\n            };\n            o(w, t, u, 1);\n            var x = {\n            };\n            if (((v !== undefined))) {\n                p(x, t, u, [v,]);\n            }\n        ;\n        ;\n            h.trySend(l, n(w, x));\n        }\n    };\n    (function t() {\n        s.addEntry(\"page_event\", \"active\", g.getSessionID());\n        k(t, m);\n    })();\n    e.exports = s;\n});\n__d(\"MercuryThreadInformer\", [\"ArbiterMixin\",\"copyProperties\",\"MercuryAssert\",\"MercurySingletonMixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"MercuryAssert\"), j = b(\"MercurySingletonMixin\");\n    function k(m) {\n        if (!m._locked) {\n            var n = m._threadDeletions, o = m._threadChanges, p = m._threadReadChanges, q = m._threadlistChanged, r = m._unseenStateChanged, s = m._unreadStateChanged, t = m._receivedMessages, u = m._reorderedMessages, v = m._updatedMessages;\n            m._threadDeletions = {\n            };\n            m._threadChanges = {\n            };\n            m._threadReadChanges = {\n            };\n            m._threadlistChanged = false;\n            m._unseenStateChanged = false;\n            m._unreadStateChanged = false;\n            m._receivedMessages = {\n            };\n            m._reorderedMessages = {\n            };\n            m._updatedMessages = {\n            };\n            var w = Object.keys(o);\n            if (((w.length || q))) {\n                m.inform(\"threadlist-updated\", w);\n            }\n        ;\n        ;\n            if (w.length) {\n                m.inform(\"threads-updated\", o);\n            }\n        ;\n        ;\n            {\n                var fin132keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin132i = (0);\n                var x;\n                for (; (fin132i < fin132keys.length); (fin132i++)) {\n                    ((x) = (fin132keys[fin132i]));\n                    {\n                        m.inform(\"thread-read-changed\", p);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin133keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin133i = (0);\n                var x;\n                for (; (fin133i < fin133keys.length); (fin133i++)) {\n                    ((x) = (fin133keys[fin133i]));\n                    {\n                        m.inform(\"threads-deleted\", n);\n                        break;\n                    };\n                };\n            };\n        ;\n            if (r) {\n                m.inform(\"unseen-updated\", null);\n            }\n        ;\n        ;\n            if (s) {\n                m.inform(\"unread-updated\", null);\n            }\n        ;\n        ;\n            {\n                var fin134keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin134i = (0);\n                (0);\n                for (; (fin134i < fin134keys.length); (fin134i++)) {\n                    ((x) = (fin134keys[fin134i]));\n                    {\n                        m.inform(\"messages-received\", t);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin135keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin135i = (0);\n                (0);\n                for (; (fin135i < fin135keys.length); (fin135i++)) {\n                    ((x) = (fin135keys[fin135i]));\n                    {\n                        m.inform(\"messages-reordered\", u);\n                        break;\n                    };\n                };\n            };\n        ;\n            {\n                var fin136keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin136i = (0);\n                (0);\n                for (; (fin136i < fin136keys.length); (fin136i++)) {\n                    ((x) = (fin136keys[fin136i]));\n                    {\n                        m.inform(\"messages-updated\", v);\n                        break;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function l(m) {\n        this._fbid = m;\n        this._threadDeletions = {\n        };\n        this._threadChanges = {\n        };\n        this._threadReadChanges = {\n        };\n        this._threadlistChanged = false;\n        this._unseenStateChanged = false;\n        this._unreadStateChanged = false;\n        this._receivedMessages = {\n        };\n        this._reorderedMessages = {\n        };\n        this._updatedMessages = {\n        };\n        this._locked = 0;\n    };\n;\n    h(l.prototype, g, {\n        updatedThread: function(m) {\n            this._threadChanges[m] = true;\n            k(this);\n        },\n        deletedThread: function(m) {\n            this._threadDeletions[m] = true;\n            k(this);\n        },\n        updatedThreadlist: function() {\n            this._threadlistChanged = true;\n            k(this);\n        },\n        updatedUnseenState: function() {\n            this._unseenStateChanged = true;\n            k(this);\n        },\n        updatedUnreadState: function() {\n            this._unreadStateChanged = true;\n            k(this);\n        },\n        changedThreadReadState: function(m, n, o) {\n            if (((!this._threadReadChanges[m] || ((this._threadReadChanges[m].timestamp < o))))) {\n                this._threadReadChanges[m] = {\n                    mark_as_read: n,\n                    timestamp: o\n                };\n            }\n        ;\n        ;\n            k(this);\n        },\n        receivedMessage: function(m) {\n            i.isThreadID(m.thread_id);\n            var n = m.thread_id;\n            if (!this._receivedMessages[n]) {\n                this._receivedMessages[n] = [];\n            }\n        ;\n        ;\n            this._receivedMessages[n].push(m);\n            this.updatedThread(n);\n        },\n        reorderedMessages: function(m, n) {\n            this._reorderedMessages[m] = {\n                source: n\n            };\n            k(this);\n        },\n        updatedMessage: function(m, n, o) {\n            if (!this._updatedMessages[m]) {\n                this._updatedMessages[m] = {\n                };\n            }\n        ;\n        ;\n            this._updatedMessages[m][n] = {\n                source: o\n            };\n            this.updatedThread(m);\n        },\n        synchronizeInforms: function(m) {\n            this._locked++;\n            try {\n                m();\n            } catch (n) {\n                throw n;\n            } finally {\n                this._locked--;\n                k(this);\n            };\n        ;\n        },\n        listen: function(m, n) {\n            return this.subscribe(\"threads-updated\", function(o, p) {\n                if (p[m]) {\n                    n(m);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    h(l, j);\n    e.exports = l;\n});\n__d(\"MercuryServerRequests\", [\"ArbiterMixin\",\"AsyncResponse\",\"TimestampConverter\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAPIArgsSource\",\"MercuryAssert\",\"MercuryErrorType\",\"MercuryGenericConstants\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageClientState\",\"MercuryPayloadSource\",\"MercuryServerRequestsConfig\",\"MercurySourceType\",\"MercuryThreadlistConstants\",\"MercuryMessageIDs\",\"MessagingConfig\",\"MessagingReliabilityLogger\",\"MessagingTag\",\"MercurySingletonMixin\",\"MercuryServerDispatcher\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncResponse\"), i = b(\"TimestampConverter\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"KeyedCallbackManager\"), m = b(\"MercuryActionTypeConstants\"), n = b(\"MercuryActionStatus\"), o = b(\"MercuryAPIArgsSource\"), p = b(\"MercuryAssert\"), q = b(\"MercuryErrorType\"), r = b(\"MercuryGenericConstants\"), s = b(\"MercuryGlobalActionType\"), t = b(\"MercuryIDs\"), u = b(\"MercuryLogMessageType\"), v = b(\"MercuryMessageClientState\"), w = b(\"MercuryPayloadSource\"), x = b(\"MercuryServerRequestsConfig\"), y = b(\"MercurySourceType\"), z = b(\"MercuryThreadlistConstants\"), aa = b(\"MercuryMessageIDs\"), ba = b(\"MessagingConfig\"), ca = b(\"MessagingReliabilityLogger\"), da = b(\"MessagingTag\"), ea = b(\"MercurySingletonMixin\"), fa = b(\"MercuryServerDispatcher\"), ga = b(\"MercuryThreadInformer\"), ha = b(\"copyProperties\"), ia = b(\"createObjectFrom\"), ja = k.create(\"mercury_server\"), ka = o.MERCURY;\n    function la(tb, ub) {\n        if (ub) {\n            tb._lastActionId = i.maxValidActionID(tb._lastActionId, ub);\n        }\n    ;\n    ;\n    };\n;\n    function ma(tb, ub) {\n        var vb = ub.thread_id, wb = tb._serverToClientIDs.getResource(vb);\n        if (!wb) {\n            if (ub.canonical_fbid) {\n                wb = ((\"user:\" + ub.canonical_fbid));\n            }\n             else if (ub.root_message_threading_id) {\n                wb = ((\"root:\" + ub.root_message_threading_id));\n            }\n            \n        ;\n        ;\n            wb = ((wb || ((\"thread:\" + vb))));\n            na(tb, vb, wb);\n        }\n    ;\n    ;\n        ub.thread_id = wb;\n    };\n;\n    function na(tb, ub, vb) {\n        tb._serverToClientIDs.setResource(ub, vb);\n        tb._clientToServerIDs.setResource(vb, ub);\n        tb._newlyAddedClientIDs[ub] = vb;\n    };\n;\n    function oa(tb, ub, vb) {\n        var wb = tb._clientToServerIDs.executeOrEnqueue(ub, vb), xb = tb._clientToServerIDs.getUnavailableResources(wb), yb = tb.tokenizeThreadID(ub);\n        if (((xb.length && ((yb.type != \"root\"))))) {\n            tb.fetchThreadData(xb);\n        }\n    ;\n    ;\n    };\n;\n    function pa(tb, ub) {\n        return tb._clientToServerIDs.getResource(ub);\n    };\n;\n    function qa(tb, ub) {\n        return !!tb._serverToClientIDs.getResource(ub);\n    };\n;\n    function ra(tb, ub) {\n        var vb = tb._serverToClientIDs.getResource(ub);\n        if (((typeof vb == \"undefined\"))) {\n            ja.warn(\"no_client_thread_id\", {\n                server_id: ub\n            });\n        }\n    ;\n    ;\n        return vb;\n    };\n;\n    function sa(tb, ub, vb) {\n        tb._serverToClientIDs.executeOrEnqueue(ub, vb);\n        tb.ensureThreadIsFetched(ub);\n    };\n;\n    function ta(tb, ub, vb) {\n        if (((ub.action_type != m.SEND_MESSAGE))) {\n            return;\n        }\n    ;\n    ;\n        var wb = ub.client_thread_id;\n        if (!wb) {\n            wb = ra(tb, ub.thread_id);\n        }\n    ;\n    ;\n        var xb = null;\n        if (wb) {\n            xb = t.tokenize(wb).type;\n        }\n    ;\n    ;\n        ca.addEntry(((\"send_\" + xb)), vb, ((((ub.thread_id + \",\")) + ub.message_id)));\n    };\n;\n    function ua(tb) {\n        return ((tb.getError() ? ((\"_\" + tb.getError())) : \"\"));\n    };\n;\n    function va(tb, ub) {\n        var vb = null;\n        switch (ub.JSBNG__status) {\n          case n.SUCCESS:\n            vb = \"success\";\n            break;\n          case n.FAILED_UNKNOWN_REASON:\n            vb = \"confirmed_error\";\n            break;\n          case n.UNABLE_TO_CONFIRM:\n            vb = \"confirm_error\";\n            break;\n          default:\n            return;\n        };\n    ;\n        ta(tb, ub, vb);\n    };\n;\n    function wa(tb, ub) {\n        ((ub.message_counts || [])).forEach(function(dc) {\n            la(tb, dc.last_action_id);\n        });\n        ((ub.threads || [])).forEach(function(dc) {\n            ma(tb, dc);\n            delete tb._fetchingThreads[dc.thread_id];\n            var ec = pa(tb, dc.thread_id);\n            delete tb._fetchingThreads[ec];\n            la(tb, dc.last_action_id);\n        });\n        ((ub.ordered_threadlists || [])).forEach(function(dc) {\n            dc.thread_ids = dc.thread_ids.map(ra.curry(tb));\n        });\n        ub.actions = ((ub.actions || []));\n        ub.actions.forEach(function(dc) {\n            va(tb, dc);\n            if (((((dc.JSBNG__status && ((dc.JSBNG__status != n.SUCCESS)))) && !dc.thread_id))) {\n                dc.thread_id = dc.client_thread_id;\n                return;\n            }\n        ;\n        ;\n            if (((((((dc.action_type == m.SEND_MESSAGE)) && dc.client_thread_id)) && ((dc.client_thread_id != r.PENDING_THREAD_ID))))) {\n                na(tb, dc.thread_id, dc.client_thread_id);\n            }\n        ;\n        ;\n            dc.server_thread_id = dc.thread_id;\n            dc.thread_id = ((qa(tb, dc.thread_id) ? ra(tb, dc.thread_id) : null));\n            la(tb, dc.action_id);\n        });\n        if (ub.end_of_history) {\n            var vb = [];\n            for (var wb = 0; ((wb < ub.end_of_history.length)); wb++) {\n                var xb = ub.end_of_history[wb];\n                if (((xb.type == \"user\"))) {\n                    vb.push(((\"user:\" + xb.id)));\n                }\n                 else if (((((xb.type == \"thread\")) && qa(tb, xb.id)))) {\n                    vb.push(ra(tb, xb.id));\n                }\n                \n            ;\n            ;\n            };\n        ;\n            ub.end_of_history = vb;\n        }\n    ;\n    ;\n        if (ub.roger) {\n            var yb = {\n            };\n            {\n                var fin137keys = ((window.top.JSBNG_Replay.forInKeys)((ub.roger))), fin137i = (0);\n                var zb;\n                for (; (fin137i < fin137keys.length); (fin137i++)) {\n                    ((zb) = (fin137keys[fin137i]));\n                    {\n                        var ac = tb._serverToClientIDs.getResource(zb);\n                        if (ac) {\n                            var bc = ub.roger[zb];\n                            yb[ac] = {\n                            };\n                            {\n                                var fin138keys = ((window.top.JSBNG_Replay.forInKeys)((bc))), fin138i = (0);\n                                var cc;\n                                for (; (fin138i < fin138keys.length); (fin138i++)) {\n                                    ((cc) = (fin138keys[fin138i]));\n                                    {\n                                        yb[ac][((\"fbid:\" + cc))] = bc[cc];\n                                    ;\n                                    };\n                                };\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ub.roger = yb;\n        }\n    ;\n    ;\n    };\n;\n    function xa(tb) {\n        if (((tb._pendingUpdates && tb._pendingUpdates.length))) {\n            var ub = tb._pendingUpdates[0];\n            tb._pendingUpdates = tb._pendingUpdates.slice(1);\n            tb.handleUpdate(ub);\n        }\n    ;\n    ;\n    };\n;\n    function ya(tb, ub) {\n        var vb = ha({\n        }, tb), wb;\n        if (ub.threads) {\n            if (!vb.threads) {\n                vb.threads = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin139keys = ((window.top.JSBNG_Replay.forInKeys)((ub.threads))), fin139i = (0);\n                (0);\n                for (; (fin139i < fin139keys.length); (fin139i++)) {\n                    ((wb) = (fin139keys[fin139i]));\n                    {\n                        vb.threads[wb] = Object.keys(ia(((vb.threads[wb] || [])).concat(ub.threads[wb])));\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (ub.messages) {\n            if (!vb.messages) {\n                vb.messages = {\n                };\n            }\n        ;\n        ;\n            {\n                var fin140keys = ((window.top.JSBNG_Replay.forInKeys)((ub.messages))), fin140i = (0);\n                (0);\n                for (; (fin140i < fin140keys.length); (fin140i++)) {\n                    ((wb) = (fin140keys[fin140i]));\n                    {\n                        if (!vb.messages[wb]) {\n                            vb.messages[wb] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin141keys = ((window.top.JSBNG_Replay.forInKeys)((ub.messages[wb]))), fin141i = (0);\n                            var xb;\n                            for (; (fin141i < fin141keys.length); (fin141i++)) {\n                                ((xb) = (fin141keys[fin141i]));\n                                {\n                                    if (vb.messages[wb][xb]) {\n                                        vb.messages[wb][xb] = bb(vb.messages[wb][xb], ub.messages[wb][xb]);\n                                    }\n                                     else vb.messages[wb][xb] = ub.messages[wb][xb];\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        vb.client = ((tb.client || ub.client));\n        return vb;\n    };\n;\n    function za(tb, ub) {\n        var vb = ha(ia(tb.folders, true), ia(ub.folders, true)), wb = ((tb.client || ub.client));\n        return {\n            folders: Object.keys(vb),\n            client: wb\n        };\n    };\n;\n    function ab(tb, ub) {\n        {\n            var fin142keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin142i = (0);\n            var vb;\n            for (; (fin142i < fin142keys.length); (fin142i++)) {\n                ((vb) = (fin142keys[fin142i]));\n                {\n                    if (((tb[vb] && ((typeof tb[vb] === \"object\"))))) {\n                        tb[vb] = bb(tb[vb], ub[vb]);\n                    }\n                     else if (((ub[vb] && ((typeof ub[vb] === \"object\"))))) {\n                        var wb = {\n                        };\n                        ha(wb, ub[vb]);\n                        tb[vb] = wb;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return tb;\n    };\n;\n    function bb(tb, ub) {\n        var vb = ((((tb.offset < ub.offset)) ? tb.offset : ub.offset)), wb = ((tb.offset + tb.limit)), xb = ((ub.offset + ub.limit)), yb = ((((wb > xb)) ? wb : xb)), zb = ((yb - vb));\n        return {\n            offset: vb,\n            limit: zb\n        };\n    };\n;\n    function cb(tb, ub) {\n        var vb = ((tb.client || ub.client)), wb = {\n            ids: {\n            },\n            client: vb\n        };\n        ha(wb.ids, tb.ids);\n        ha(wb.ids, ub.ids);\n        return wb;\n    };\n;\n    function db(tb, ub) {\n        var vb = {\n        }, wb, xb = ((tb.client || ub.client));\n        delete tb.client;\n        delete ub.client;\n        {\n            var fin143keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin143i = (0);\n            (0);\n            for (; (fin143i < fin143keys.length); (fin143i++)) {\n                ((wb) = (fin143keys[fin143i]));\n                {\n                    ha(vb, ia(tb[wb], wb));\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin144keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin144i = (0);\n            (0);\n            for (; (fin144i < fin144keys.length); (fin144i++)) {\n                ((wb) = (fin144keys[fin144i]));\n                {\n                    ha(vb, ia(ub[wb], wb));\n                ;\n                };\n            };\n        };\n    ;\n        var yb = {\n            client: xb\n        };\n        {\n            var fin145keys = ((window.top.JSBNG_Replay.forInKeys)((vb))), fin145i = (0);\n            var zb;\n            for (; (fin145i < fin145keys.length); (fin145i++)) {\n                ((zb) = (fin145keys[fin145i]));\n                {\n                    wb = vb[zb];\n                    if (!yb[wb]) {\n                        yb[wb] = [];\n                    }\n                ;\n                ;\n                    yb[wb].push(zb);\n                };\n            };\n        };\n    ;\n        return yb;\n    };\n;\n    function eb(tb, ub) {\n        var vb = ((tb.client || ub.client)), wb = ia(tb.ids, true), xb = ia(ub.ids, true), yb = ha(wb, xb);\n        return {\n            ids: Object.keys(yb),\n            client: vb\n        };\n    };\n;\n    function fb(tb) {\n        this._fbid = tb;\n        this._lastActionId = 0;\n        this._serverToClientIDs = new l();\n        this._clientToServerIDs = new l();\n        this._pendingUpdates = [];\n        this._fetchingThreads = {\n        };\n        this._newlyAddedClientIDs = {\n        };\n        rb(this);\n    };\n;\n    ha(fb.prototype, g, {\n        tokenizeThreadID: function(tb) {\n            p.isThreadID(tb);\n            return t.tokenize(tb);\n        },\n        getServerThreadID: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, ub);\n        },\n        getClientThreadID: function(tb, ub) {\n            sa(this, tb, ub);\n        },\n        getClientThreadIDNow: function(tb) {\n            return ra(this, tb);\n        },\n        getServerThreadIDNow: function(tb) {\n            return pa(this, tb);\n        },\n        convertThreadIDIfAvailable: function(tb) {\n            var ub = this._serverToClientIDs.getResource(tb);\n            if (((ub === undefined))) {\n                return tb;\n            }\n             else return ub\n        ;\n        },\n        canLinkExternally: function(tb) {\n            p.isThreadID(tb);\n            var ub = this.tokenizeThreadID(tb);\n            return ((((ub.type == \"user\")) || !!pa(this, tb)));\n        },\n        fetchThreadlistInfo: function(tb, ub, vb, wb, xb) {\n            vb = ((vb || da.INBOX));\n            xb = ((xb || ka));\n            var yb = ((wb ? fa.IMMEDIATE : null)), zb = {\n                client: xb\n            };\n            zb[vb] = {\n                offset: tb,\n                limit: ub,\n                filter: wb\n            };\n            sb(this, \"/ajax/mercury/threadlist_info.php\", zb, yb);\n        },\n        fetchUnseenThreadIDs: function(tb, ub) {\n            ub = ((ub || ka));\n            this.fetchThreadlistInfo(z.RECENT_THREAD_OFFSET, z.JEWEL_THREAD_COUNT, tb, null, ub);\n        },\n        fetchUnreadThreadIDs: function(tb, ub) {\n            ub = ((ub || ka));\n            sb(this, \"/ajax/mercury/unread_threads.php\", {\n                folders: [tb,],\n                client: ub\n            });\n        },\n        fetchMissedMessages: function(tb, ub) {\n            ub = ((ub || ka));\n            sb(this, \"/ajax/mercury/thread_sync.php\", {\n                last_action_id: this._lastActionId,\n                folders: tb,\n                client: ub\n            });\n        },\n        fetchThreadData: function(tb, ub) {\n            ub = ((ub || ka));\n            p.allThreadID(tb);\n            var vb = {\n                threads: {\n                },\n                client: ub\n            }, wb = [], xb = [];\n            tb.forEach(function(zb) {\n                if (this._fetchingThreads[zb]) {\n                    return;\n                }\n            ;\n            ;\n                this._fetchingThreads[zb] = true;\n                var ac = pa(this, zb);\n                if (ac) {\n                    xb.push(ac);\n                    vb.threads.thread_ids = xb;\n                }\n                 else {\n                    var bc = this.tokenizeThreadID(zb);\n                    if (((bc.type == \"user\"))) {\n                        wb.push(bc.value);\n                        vb.threads.user_ids = wb;\n                    }\n                     else if (((bc.type == \"thread\"))) {\n                        xb.push(bc.value);\n                        vb.threads.thread_ids = xb;\n                    }\n                     else if (((((bc.type != \"root\")) && ((bc.type != \"pending\"))))) {\n                        throw new Error(\"Unknown thread type\", bc);\n                    }\n                    \n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"fetch-thread-data\", vb);\n            {\n                var fin146keys = ((window.top.JSBNG_Replay.forInKeys)((vb.threads))), fin146i = (0);\n                var yb;\n                for (; (fin146i < fin146keys.length); (fin146i++)) {\n                    ((yb) = (fin146keys[fin146i]));\n                    {\n                        sb(this, \"/ajax/mercury/thread_info.php\", vb);\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        ensureThreadIsFetched: function(tb, ub) {\n            ub = ((ub || ka));\n            if (((!this._serverToClientIDs.getResource(tb) && !this._fetchingThreads[tb]))) {\n                this._fetchingThreads[tb] = true;\n                sb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [tb,]\n                    },\n                    client: ub\n                });\n            }\n        ;\n        ;\n        },\n        fetchThreadMessages: function(tb, ub, vb, wb, xb) {\n            p.isThreadID(tb);\n            xb = ((xb || ka));\n            var yb, zb, ac = this.tokenizeThreadID(tb), bc = pa(this, tb), cc = false;\n            if (((bc && ((ac.type != \"group\"))))) {\n                zb = \"thread_ids\";\n                yb = bc;\n            }\n             else {\n                yb = ac.value;\n                switch (ac.type) {\n                  case \"user\":\n                    zb = \"user_ids\";\n                    cc = true;\n                    break;\n                  case \"group\":\n                    zb = \"group_ids\";\n                    break;\n                  case \"thread\":\n                    zb = \"thread_ids\";\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            var dc = {\n                messages: {\n                },\n                threads: {\n                },\n                client: xb\n            };\n            if (zb) {\n                dc.messages[zb] = {\n                };\n                dc.messages[zb][yb] = {\n                    offset: ub,\n                    limit: vb\n                };\n                if (cc) {\n                    dc.threads[zb] = [yb,];\n                }\n            ;\n            ;\n                sb(this, \"/ajax/mercury/thread_info.php\", dc, wb);\n            }\n             else oa(this, tb, function(ec) {\n                dc.messages.thread_ids = {\n                };\n                dc.messages.thread_ids[ec] = {\n                    offset: ub,\n                    limit: vb\n                };\n                sb(this, \"/ajax/mercury/thread_info.php\", dc, wb);\n            }.bind(this));\n        ;\n        ;\n        },\n        handleThreadInfoError: function(tb) {\n            var ub = tb.getRequest().getData(), vb = [];\n            if (ub.messages) {\n                {\n                    var fin147keys = ((window.top.JSBNG_Replay.forInKeys)((ub.messages.thread_ids))), fin147i = (0);\n                    var wb;\n                    for (; (fin147i < fin147keys.length); (fin147i++)) {\n                        ((wb) = (fin147keys[fin147i]));\n                        {\n                            vb.push(gb(ra(this, wb)));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin148keys = ((window.top.JSBNG_Replay.forInKeys)((ub.messages.user_ids))), fin148i = (0);\n                    var xb;\n                    for (; (fin148i < fin148keys.length); (fin148i++)) {\n                        ((xb) = (fin148keys[fin148i]));\n                        {\n                            vb.push(gb(((\"user:\" + xb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n                {\n                    var fin149keys = ((window.top.JSBNG_Replay.forInKeys)((ub.messages.group_ids))), fin149i = (0);\n                    var yb;\n                    for (; (fin149i < fin149keys.length); (fin149i++)) {\n                        ((yb) = (fin149keys[fin149i]));\n                        {\n                            vb.push(gb(((\"group:\" + yb))));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n            if (vb.length) {\n                this.handleUpdate({\n                    actions: vb,\n                    from_client: true,\n                    payload_source: w.CLIENT_CHANNEL_MESSAGE\n                });\n            }\n        ;\n        ;\n            if (((ub.threads && ((((ub.threads.user_ids || ub.threads.group_ids)) || ub.threads.thread_ids))))) {\n                var zb = 5, ac = true;\n                if (!ub.retry_count) {\n                    ub.retry_count = 0;\n                    if (ub.messages) {\n                        delete ub.messages;\n                    }\n                ;\n                ;\n                }\n                 else if (((ub.retry_count >= zb))) {\n                    ac = false;\n                    ((ub.threads.thread_ids || [])).forEach(function(cc) {\n                        if (((cc in this._fetchingThreads))) {\n                            delete this._fetchingThreads[cc];\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                \n            ;\n            ;\n                if (ac) {\n                    var bc = ((ub.retry_count * 1000));\n                    (function() {\n                        ja.log(\"retry_thread\", ub);\n                        sb(this, \"/ajax/mercury/thread_info.php\", ub);\n                    }.bind(this)).defer(bc, false);\n                    ub.retry_count++;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        markFolderAsRead: function(tb) {\n            sb(this, \"/ajax/mercury/mark_folder_as_read.php\", {\n                folder: tb\n            });\n            var ub = [{\n                action_type: s.MARK_ALL_READ,\n                action_id: null,\n                folder: tb\n            },];\n            this.handleUpdate({\n                global_actions: ub,\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadReadStatus: function(tb, ub, vb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                var yb = {\n                    ids: {\n                    }\n                };\n                yb.ids[xb] = ub;\n                sb(this, \"/ajax/mercury/change_read_status.php\", yb);\n            }.bind(this));\n            var wb = [{\n                action_type: m.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: tb,\n                mark_as_read: ub,\n                folder: vb\n            },];\n            this.handleUpdate({\n                actions: wb,\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_READ_STATUS\n            });\n        },\n        changeThreadArchivedStatus: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                var yb = {\n                    ids: {\n                    }\n                };\n                yb.ids[xb] = ub;\n                sb(this, \"/ajax/mercury/change_archived_status.php\", yb);\n            }.bind(this));\n            var vb = {\n                action_type: m.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: tb,\n                archived: ub\n            }, wb = {\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_ARCHIVED_STATUS\n            };\n            this.handleUpdate(wb);\n        },\n        changeThreadFolder: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                var yb = {\n                };\n                yb[ub] = [xb,];\n                sb(this, \"/ajax/mercury/move_thread.php\", yb);\n            }.bind(this));\n            var vb = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: tb,\n                new_folder: ub\n            }, wb = {\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(wb);\n        },\n        changeMutingOnThread: function(tb, ub) {\n            p.isThreadID(tb);\n            oa(this, tb, function(xb) {\n                sb(this, \"/ajax/mercury/change_mute_thread.php\", {\n                    thread_id: xb,\n                    mute_settings: ub,\n                    payload_source: ka\n                });\n            }.bind(this));\n            var vb = {\n                action_type: m.CHANGE_MUTE_SETTINGS,\n                action_id: null,\n                thread_id: tb,\n                mute_settings: ub\n            }, wb = {\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_MUTE_SETTINGS\n            };\n            this.handleUpdate(wb);\n        },\n        markThreadSpam: function(tb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(wb) {\n                sb(this, \"/ajax/mercury/mark_spam.php\", {\n                    id: wb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: tb,\n                new_folder: da.SPAM\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        markMessagesSpam: function(tb, ub) {\n            aa.getServerIDs(((ub || [])), function(wb) {\n                sb(this, \"/ajax/mercury/mark_spam_messages.php\", {\n                    message_ids: wb\n                });\n            }.bind(this));\n            var vb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: tb,\n                message_ids: ub\n            };\n            this.handleUpdate({\n                actions: [vb,],\n                from_client: true,\n                payload_source: w.CLIENT_DELETE_MESSAGES\n            });\n        },\n        unmarkThreadSpam: function(tb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(wb) {\n                sb(this, \"/ajax/mercury/unmark_spam.php\", {\n                    id: wb\n                });\n            }.bind(this));\n            var ub = {\n                action_type: m.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: tb,\n                new_folder: da.INBOX\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: w.CLIENT_CHANGE_FOLDER\n            };\n            this.handleUpdate(vb);\n        },\n        deleteThread: function(tb) {\n            p.isThreadID(tb);\n            oa(this, tb, function(wb) {\n                var xb = {\n                    ids: [wb,]\n                };\n                sb(this, \"/ajax/mercury/delete_thread.php\", xb);\n            }.bind(this));\n            var ub = {\n                action_type: m.DELETE_THREAD,\n                action_id: null,\n                thread_id: tb\n            }, vb = {\n                actions: [ub,],\n                from_client: true,\n                payload_source: w.CLIENT_DELETE_THREAD\n            };\n            this.handleUpdate(vb);\n        },\n        deleteMessages: function(tb, ub, vb) {\n            aa.getServerIDs(((ub || [])), function(xb) {\n                sb(this, \"/ajax/mercury/delete_messages.php\", {\n                    message_ids: xb\n                });\n            }.bind(this));\n            var wb;\n            if (vb) {\n                wb = {\n                    action_type: m.DELETE_THREAD,\n                    action_id: null,\n                    thread_id: tb\n                };\n            }\n             else wb = {\n                action_type: m.DELETE_MESSAGES,\n                action_id: null,\n                thread_id: tb,\n                message_ids: ub\n            };\n        ;\n        ;\n            this.handleUpdate({\n                actions: [wb,],\n                from_client: true,\n                payload_source: w.CLIENT_DELETE_MESSAGES\n            });\n        },\n        clearChat: function(tb, ub, vb) {\n            p.isThreadID(tb);\n            sb(this, \"/ajax/chat/settings.php\", {\n                clear_history_id: ub\n            });\n            var wb = [{\n                action_type: m.CLEAR_CHAT,\n                action_id: null,\n                thread_id: tb,\n                clear_time: vb\n            },];\n            this.handleUpdate({\n                actions: wb,\n                from_client: true,\n                payload_source: w.CLIENT_CLEAR_CHAT\n            });\n        },\n        sendNewMessage: function(tb, ub) {\n            ub = ((ub || ka));\n            if (((!tb.client_state || ((tb.client_state == v.SEND_TO_SERVER))))) {\n                aa.getServerIDs(((tb.forward_message_ids || [])), function(wb) {\n                    var xb = tb.thread_id, yb = this.tokenizeThreadID(tb.thread_id), zb = yb.type, ac = ha({\n                    }, tb);\n                    ac.forward_message_ids = wb;\n                    if (((((((((zb == \"root\")) && ((yb.value == ac.message_id)))) || ((((zb == \"user\")) && !pa(this, xb))))) || ((tb.thread_id == r.PENDING_THREAD_ID))))) {\n                        ac.client_thread_id = ac.thread_id;\n                        ac.thread_id = null;\n                        this._sendNewMessageToServer(ac, ub);\n                    }\n                     else oa(this, ac.thread_id, function(bc) {\n                        ac.thread_id = bc;\n                        this._sendNewMessageToServer(ac);\n                    }.bind(this));\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            if (((tb.thread_id != r.PENDING_THREAD_ID))) {\n                var vb = {\n                    actions: [ha({\n                    }, tb),],\n                    from_client: true,\n                    payload_source: w.CLIENT_SEND_MESSAGE\n                };\n                this.handleUpdate(vb);\n            }\n        ;\n        ;\n        },\n        _sendNewMessageToServer: function(tb, ub) {\n            ub = ((ub || ka));\n            sb(this, \"/ajax/mercury/send_messages.php\", {\n                message_batch: [tb,],\n                client: ub\n            });\n        },\n        requestMessageConfirmation: function(tb, ub) {\n            ub = ((ub || ka));\n            var vb = {\n            }, wb = {\n            };\n            {\n                var fin150keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin150i = (0);\n                var xb;\n                for (; (fin150i < fin150keys.length); (fin150i++)) {\n                    ((xb) = (fin150keys[fin150i]));\n                    {\n                        var yb = pa(this, xb);\n                        if (yb) {\n                            vb[yb] = tb[xb];\n                        }\n                         else {\n                            var zb = tb[xb];\n                            for (var ac = 0; ((ac < zb.length)); ac++) {\n                                wb[zb[ac]] = xb;\n                            ;\n                            };\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var bc = Object.keys(vb), cc = Object.keys(wb);\n            if (((bc.length || cc.length))) {\n                sb(this, \"/ajax/mercury/confirm_messages.php\", {\n                    thread_message_map: vb,\n                    local_messages: wb,\n                    client: ub\n                });\n            }\n        ;\n        ;\n        },\n        handleMessageConfirmError: function(tb) {\n            var ub = tb.getRequest().getData().thread_message_map, vb = tb.getRequest().getData().local_messages;\n            if (((!ub && !vb))) {\n                return;\n            }\n        ;\n        ;\n            var wb = [];\n            {\n                var fin151keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin151i = (0);\n                var xb;\n                for (; (fin151i < fin151keys.length); (fin151i++)) {\n                    ((xb) = (fin151keys[fin151i]));\n                    {\n                        var yb = ub[xb];\n                        yb.forEach(function(bc) {\n                            wb.push({\n                                action_type: m.SEND_MESSAGE,\n                                client_message_id: bc,\n                                message_id: bc,\n                                client_thread_id: null,\n                                thread_id: xb,\n                                JSBNG__status: n.UNABLE_TO_CONFIRM\n                            });\n                        });\n                    };\n                };\n            };\n        ;\n            {\n                var fin152keys = ((window.top.JSBNG_Replay.forInKeys)((vb))), fin152i = (0);\n                var zb;\n                for (; (fin152i < fin152keys.length); (fin152i++)) {\n                    ((zb) = (fin152keys[fin152i]));\n                    {\n                        var ac = vb[zb];\n                        wb.push({\n                            action_type: m.SEND_MESSAGE,\n                            client_message_id: zb,\n                            message_id: zb,\n                            client_thread_id: ac,\n                            thread_id: null,\n                            JSBNG__status: n.UNABLE_TO_CONFIRM\n                        });\n                    };\n                };\n            };\n        ;\n            if (wb.length) {\n                this.handleUpdate({\n                    actions: wb,\n                    payload_source: w.CLIENT_HANDLE_ERROR\n                });\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            var tb = i.convertActionIDToTimestamp(this._lastActionId);\n            sb(this, \"/ajax/mercury/mark_seen.php\", {\n                seen_timestamp: tb\n            });\n        },\n        handleRoger: function(tb) {\n            var ub = ((tb.tid ? this._serverToClientIDs.getResource(tb.tid) : ((\"user:\" + tb.reader))));\n            if (ub) {\n                var vb = {\n                };\n                vb[ub] = {\n                };\n                vb[ub][((\"fbid:\" + tb.reader))] = tb.time;\n                this.inform(\"update-roger\", vb);\n            }\n        ;\n        ;\n        },\n        handleUpdateWaitForThread: function(tb, ub, vb) {\n            vb = ((vb || ka));\n            var wb = this._serverToClientIDs.getResource(ub);\n            if (wb) {\n                this.handleUpdate(tb);\n                return;\n            }\n        ;\n        ;\n            this._serverToClientIDs.executeOrEnqueue(ub, function() {\n                this._pendingUpdates.push(tb);\n            }.bind(this));\n            if (!this._fetchingThreads[ub]) {\n                this._fetchingThreads[ub] = true;\n                sb(this, \"/ajax/mercury/thread_info.php\", {\n                    threads: {\n                        thread_ids: [ub,]\n                    },\n                    client: vb\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdate: function(tb) {\n            var ub = [];\n            if (((tb && tb.threads))) {\n                for (var vb = 0; ((vb < tb.threads.length)); vb++) {\n                    if (!tb.threads[vb].snippet_attachments) {\n                        continue;\n                    }\n                ;\n                ;\n                    for (var wb = 0; ((wb < tb.threads[vb].snippet_attachments.length)); wb++) {\n                        if (tb.threads[vb].snippet_attachments[wb].share_xhp) {\n                            ub.push({\n                                i: vb,\n                                j: wb,\n                                xhp: tb.threads[vb].snippet_attachments[wb].share_xhp\n                            });\n                            tb.threads[vb].snippet_attachments[wb].share_xhp = ((((\"HTMLDivElement not shown: object contains circular \" + \"reference, which was breaking JSON.stringify. \")) + \"Look at MercuryServerRequests.handleUpdate\"));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            }\n        ;\n        ;\n            ja.debug(\"handle_update\", {\n                payload: tb,\n                from_client: tb.from_client\n            });\n            for (var xb = 0; ((xb < ub.length)); xb++) {\n                tb.threads[ub[xb].i].snippet_attachments[ub[xb].j].share_xhp = ub[xb].xhp;\n            ;\n            };\n        ;\n            {\n                var fin153keys = ((window.top.JSBNG_Replay.forInKeys)((tb))), fin153i = (0);\n                (0);\n                for (; (fin153i < fin153keys.length); (fin153i++)) {\n                    ((xb) = (fin153keys[fin153i]));\n                    {\n                        ga.getForFBID(this._fbid).synchronizeInforms(function() {\n                            if (!tb.from_client) {\n                                wa(this, tb);\n                                this.inform(\"payload-preprocessed\", tb);\n                            }\n                        ;\n                        ;\n                            this.inform(\"update-thread-ids\", this._newlyAddedClientIDs);\n                            this._newlyAddedClientIDs = {\n                            };\n                            this.inform(\"update-participants\", tb);\n                            this.inform(\"update-threads\", tb);\n                            this.inform(\"update-unread\", tb);\n                            this.inform(\"update-threadlist\", tb);\n                            this.inform(\"update-messages\", tb);\n                            this.inform(\"update-unseen\", tb);\n                            this.inform(\"update-typing-state\", tb);\n                            this.inform(\"update-roger\", tb.roger);\n                            this.inform(\"model-update-completed\", null);\n                            xa(this);\n                        }.bind(this));\n                        break;\n                    };\n                };\n            };\n        ;\n        },\n        _handleSendMessageErrorCommon: function(tb, ub, vb, wb) {\n            ja.debug(\"handle_send_message_error_common\", {\n                reliability_error_status: vb,\n                request_error_status: ub\n            });\n            var xb = tb.getData(), yb = xb.message_batch, zb = yb.map(function(bc) {\n                return {\n                    action_type: m.SEND_MESSAGE,\n                    client_message_id: bc.message_id,\n                    message_id: bc.message_id,\n                    client_thread_id: bc.client_thread_id,\n                    thread_id: bc.thread_id,\n                    JSBNG__status: ub,\n                    error_data: wb\n                };\n            });\n            zb.forEach(function(bc) {\n                ta(this, bc, vb);\n            }.bind(this));\n            var ac = {\n                actions: zb,\n                payload_source: w.CLIENT_HANDLE_ERROR\n            };\n            this.handleUpdate(ac);\n        },\n        handleSendMessageError: function(tb) {\n            var ub = tb.getPayload(), vb = null, wb = null;\n            if (((ub && ub.error_payload))) {\n                vb = n.UNCONFIRMED;\n                wb = \"send_error\";\n            }\n             else {\n                vb = n.ERROR;\n                wb = ((\"request_error\" + ua(tb)));\n            }\n        ;\n        ;\n            var xb = tb.error;\n            if (((xb === 1404102))) {\n                h.verboseErrorHandler(tb);\n            }\n        ;\n        ;\n            var yb = ((/<.*>/.test(tb.getErrorDescription()) ? tb.getErrorSummary() : tb.getErrorDescription()));\n            this._handleSendMessageErrorCommon(tb.getRequest(), vb, wb, {\n                type: q.SERVER,\n                code: tb.getError(),\n                description: yb,\n                is_transient: tb.isTransient()\n            });\n        },\n        handleSendMessageTransportError: function(tb) {\n            this._handleSendMessageErrorCommon(tb.getRequest(), n.ERROR, ((\"transport_error\" + ua(tb))), {\n                type: q.TRANSPORT,\n                code: tb.getError(),\n                is_transient: true\n            });\n        },\n        handleSendMessageTimeout: function(tb) {\n            this._handleSendMessageErrorCommon(tb, n.ERROR, \"transport_timeout\", {\n                type: q.TIMEOUT,\n                is_transient: true\n            });\n        },\n        getLastActionID: function() {\n            return this._lastActionId;\n        }\n    });\n    ha(fb, ea);\n    function gb(tb) {\n        return {\n            action_type: m.LOG_MESSAGE,\n            thread_id: tb,\n            message_id: tb,\n            timestamp: JSBNG__Date.now(),\n            timestamp_absolute: \"\",\n            timestamp_relative: \"\",\n            is_unread: false,\n            source: y.UNKNOWN,\n            log_message_type: u.SERVER_ERROR,\n            log_message_data: {\n            }\n        };\n    };\n;\n    function hb(tb) {\n        var ub = tb.getData(), vb = ((ub.request_user_id ? ub.request_user_id : j.user));\n        return fb.getForFBID(vb);\n    };\n;\n    function ib(tb, ub) {\n        hb(ub).handleUpdate(tb);\n    };\n;\n    function jb(tb, ub) {\n        var vb = ((tb.client || ub.client));\n        return {\n            client: vb,\n            message_batch: tb.message_batch.concat(ub.message_batch)\n        };\n    };\n;\n    function kb(tb, ub) {\n        var vb = {\n        };\n        ha(vb, tb.ids);\n        ha(vb, ub.ids);\n        var wb = ((tb.client || ub.client));\n        return {\n            ids: vb,\n            client: wb\n        };\n    };\n;\n    function lb(tb, ub) {\n        return ub;\n    };\n;\n    function mb(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleThreadInfoError(tb);\n    };\n;\n    function nb(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleSendMessageError(tb);\n    };\n;\n    function ob(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleSendMessageTransportError(tb);\n    };\n;\n    function pb(tb) {\n        var ub = hb(tb);\n        ub.handleSendMessageTimeout(tb);\n    };\n;\n    function qb(tb) {\n        var ub = hb(tb.getRequest());\n        ub.handleMessageConfirmError(tb);\n    };\n;\n    function rb(tb) {\n        fa.registerEndpoints({\n            \"/ajax/mercury/thread_sync.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IDEMPOTENT,\n                handler: ib\n            },\n            \"/ajax/mercury/thread_info.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_DEFERRED_MULTI,\n                batch_function: ya,\n                handler: ib,\n                error_handler: mb\n            },\n            \"/ajax/mercury/mark_folder_as_read.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/change_read_status.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: kb,\n                handler: ib\n            },\n            \"/ajax/mercury/send_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: jb,\n                batch_size_limit: ba.SEND_BATCH_LIMIT,\n                handler: ib,\n                error_handler: nb,\n                transport_error_handler: ob,\n                timeout: x.sendMessageTimeout,\n                timeout_handler: pb,\n                connection_retries: ba.SEND_CONNECTION_RETRIES\n            },\n            \"/ajax/mercury/mark_seen.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: lb,\n                handler: ib\n            },\n            \"/ajax/mercury/confirm_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib,\n                error_handler: qb\n            },\n            \"/ajax/mercury/threadlist_info.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: ab,\n                handler: ib\n            },\n            \"/ajax/mercury/mark_spam.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/mark_spam_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/unmark_spam.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/unread_threads.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE_UNIQUE,\n                batch_function: za,\n                handler: ib\n            },\n            \"/ajax/chat/settings.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE\n            },\n            \"/ajax/mercury/change_archived_status.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: cb,\n                handler: ib\n            },\n            \"/ajax/mercury/delete_thread.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: eb,\n                handler: ib\n            },\n            \"/ajax/mercury/delete_messages.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            },\n            \"/ajax/mercury/move_thread.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.BATCH_SUCCESSIVE,\n                batch_function: db,\n                handler: ib\n            },\n            \"/ajax/mercury/change_mute_thread.php\": {\n                request_user_id: tb._fbid,\n                mode: fa.IMMEDIATE,\n                handler: ib\n            }\n        });\n    };\n;\n    function sb(tb, ub, vb, wb) {\n        fa.trySend(ub, vb, wb, tb._fbid);\n    };\n;\n    e.exports = fb;\n});\n__d(\"MercuryParticipants\", [\"Env\",\"ImageSourceRequest\",\"ImageSourceType\",\"MercuryAssert\",\"MercuryIDs\",\"MercuryParticipantTypes\",\"MercuryParticipantsConstants\",\"PhotoResizeModeConst\",\"MercuryServerRequests\",\"ShortProfiles\",\"copyProperties\",\"getObjectValues\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"ImageSourceRequest\"), i = b(\"ImageSourceType\"), j = b(\"MercuryAssert\"), k = b(\"MercuryIDs\"), l = b(\"MercuryParticipantTypes\"), m = b(\"MercuryParticipantsConstants\"), n = b(\"PhotoResizeModeConst\"), o = b(\"MercuryServerRequests\").get(), p = b(\"ShortProfiles\"), q = b(\"copyProperties\"), r = b(\"getObjectValues\"), s = b(\"tx\"), t = ((\"fbid:\" + g.user)), u = {\n    }, v = {\n    }, w = function(ba) {\n        ba = z(ba);\n        if (u[ba.id]) {\n            q(u[ba.id], ba);\n        }\n         else u[ba.id] = q({\n        }, ba);\n    ;\n    ;\n        if (ba.vanity) {\n            v[ba.vanity] = ba.id;\n        }\n    ;\n    ;\n    };\n    function x(ba) {\n        j.isEmailParticipantID(ba);\n        var ca = k.tokenize(ba), da = ca.value;\n        return {\n            gender: m.UNKNOWN_GENDER,\n            href: null,\n            id: ba,\n            image_src: m.EMAIL_IMAGE,\n            big_image_src: m.EMAIL_IMAGE,\n            JSBNG__name: da,\n            short_name: da,\n            employee: false,\n            call_promo: false\n        };\n    };\n;\n    function y(ba, ca, da) {\n        j.allParticipantIDs(ba);\n        var ea = {\n        }, fa = {\n        };\n        ba.forEach(function(ha) {\n            if (((u[ha] && !da))) {\n                ea[ha] = q({\n                }, u[ha]);\n            }\n             else {\n                var ia = k.tokenize(ha);\n                if (((ia.type == \"fbid\"))) {\n                    var ja = ia.value;\n                    fa[ha] = ja;\n                }\n                 else if (((ia.type == \"email\"))) {\n                    ea[ha] = x(ha);\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        var ga = r(fa);\n        if (ga.length) {\n            p.getMulti(ga, function(ha) {\n                {\n                    var fin154keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin154i = (0);\n                    var ia;\n                    for (; (fin154i < fin154keys.length); (fin154i++)) {\n                        ((ia) = (fin154keys[fin154i]));\n                        {\n                            var ja = fa[ia], ka = ha[ja];\n                            ea[ia] = {\n                                gender: ka.gender,\n                                href: ka.uri,\n                                id: ia,\n                                image_src: ka.thumbSrc,\n                                JSBNG__name: ka.JSBNG__name,\n                                short_name: ka.firstName,\n                                employee: ka.employee,\n                                call_promo: ka.showVideoPromo,\n                                type: ka.type,\n                                vanity: ka.vanity,\n                                is_friend: ka.is_friend,\n                                social_snippets: ka.social_snippets\n                            };\n                            w(ea[ia]);\n                        };\n                    };\n                };\n            ;\n                ca(ea);\n            });\n        }\n         else ca(ea);\n    ;\n    ;\n    };\n;\n    function z(ba) {\n        var ca = ((((ba.type === l.USER)) || ((ba.type === l.FRIEND))));\n        if (!ca) {\n            return ba;\n        }\n    ;\n    ;\n        if (((((!ba.JSBNG__name && !ba.href)) && !ba.vanity))) {\n            var da = \"Facebook User\";\n            ba.JSBNG__name = da;\n            ba.short_name = da;\n        }\n    ;\n    ;\n        return ba;\n    };\n;\n    var aa = {\n        user: t,\n        isAuthor: function(ba) {\n            return ((ba === t));\n        },\n        getIDFromVanityOrFBID: function(ba) {\n            if (!ba) {\n                return;\n            }\n        ;\n        ;\n            if (v[ba]) {\n                return v[ba];\n            }\n        ;\n        ;\n            if (ba.match(\"^\\\\d+$\")) {\n                return aa.getIDForUser(ba);\n            }\n        ;\n        ;\n        },\n        getNow: function(ba) {\n            return u[ba];\n        },\n        get: function(ba, ca) {\n            j.isParticipantID(ba);\n            aa.getMulti([ba,], function(da) {\n                ca(da[ba]);\n            });\n        },\n        getMulti: function(ba, ca, da) {\n            return y(ba, ca, false);\n        },\n        getBigImageMulti: function(ba, ca) {\n            j.allParticipantIDs(ba);\n            var da = m.BIG_IMAGE_SIZE;\n            aa.getMulti(ba, function(ea) {\n                var fa = {\n                }, ga = 0, ha = function(la, ma) {\n                    ga++;\n                    fa[la] = ma;\n                    if (((ga === ba.length))) {\n                        ca(fa);\n                    }\n                ;\n                ;\n                }, ia = function(la, ma) {\n                    u[la].big_image_src = ma.uri;\n                    ha(la, ma.uri);\n                };\n                {\n                    var fin155keys = ((window.top.JSBNG_Replay.forInKeys)((ea))), fin155i = (0);\n                    var ja;\n                    for (; (fin155i < fin155keys.length); (fin155i++)) {\n                        ((ja) = (fin155keys[fin155i]));\n                        {\n                            var ka = ea[ja];\n                            if (!ka.big_image_src) {\n                                new h().setFBID(aa.getUserID(ja)).setType(i.PROFILE_PICTURE).setDimensions(da, da).setResizeMode(n.COVER).setCallback(ia.curry(ja)).send();\n                            }\n                             else ha(ka.id, ka.big_image_src);\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n        },\n        getOrderedBigImageMulti: function(ba, ca) {\n            aa.getBigImageMulti(ba, function(da) {\n                var ea = ba.map(function(fa) {\n                    return da[fa];\n                });\n                ca(ea);\n            });\n        },\n        getMultiForceDownload: function(ba, ca) {\n            return y(ba, ca, true);\n        },\n        getUserID: function(ba) {\n            return k.getUserIDFromParticipantID(ba);\n        },\n        getIDForUser: function(ba) {\n            return ((\"fbid:\" + ba));\n        },\n        addParticipants: function(ba) {\n            ba.forEach(w);\n        }\n    };\n    o.subscribe(\"update-participants\", function(ba, ca) {\n        aa.addParticipants(((ca.participants || [])));\n    });\n    e.exports = aa;\n});\n__d(\"MercuryFolders\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.INBOX,g.OTHER,g.ACTION_ARCHIVED,g.SPAM,], j = {\n        getSupportedFolders: function() {\n            return i.concat();\n        },\n        isSupportedFolder: function(k) {\n            return h(i, k);\n        },\n        getFromMeta: function(k) {\n            var l = k.folder;\n            if (k.is_archived) {\n                l = g.ACTION_ARCHIVED;\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryAttachment\", [\"MercuryAttachmentContentType\",\"MercuryAttachmentType\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentContentType\"), h = b(\"MercuryAttachmentType\"), i = b(\"startsWith\"), j = {\n        getAttachIconClass: function(k) {\n            switch (k) {\n              case g.PHOTO:\n                return \"MercuryPhotoIcon\";\n              case g.VIDEO:\n                return \"MercuryVideoIcon\";\n              case g.MUSIC:\n                return \"MercuryMusicIcon\";\n              case g.VOICE:\n                return \"MercuryVoiceIcon\";\n              case g.TEXT:\n                return \"MercuryTextIcon\";\n              case g.MSWORD:\n                return \"MercuryMSWordIcon\";\n              case g.MSXLS:\n                return \"MercuryMSXLSIcon\";\n              case g.MSPPT:\n                return \"MercuryMSPPTIcon\";\n            };\n        ;\n            return \"MercuryDefaultIcon\";\n        },\n        getAttachIconClassByMime: function(k) {\n            if (i(k, \"image\")) {\n                return \"MercuryPhotoIcon\";\n            }\n             else if (i(k, \"video\")) {\n                return \"MercuryVideoIcon\";\n            }\n             else if (i(k, \"audio\")) {\n                return \"MercuryMusicIcon\";\n            }\n             else if (i(k, \"text/plain\")) {\n                return \"MercuryTextIcon\";\n            }\n             else return \"MercuryDefaultIcon\"\n            \n            \n            \n        ;\n        },\n        getAttachTypeByMime: function(k) {\n            if (i(k, \"image\")) {\n                return g.PHOTO;\n            }\n             else if (i(k, \"video\")) {\n                return g.VIDEO;\n            }\n             else if (i(k, \"audio\")) {\n                return g.MUSIC;\n            }\n             else if (i(k, \"text/plain\")) {\n                return g.TEXT;\n            }\n             else return g.UNKNOWN\n            \n            \n            \n        ;\n        },\n        convertRaw: function(k) {\n            var l = [];\n            for (var m = 0; ((m < k.length)); m++) {\n                var n = k[m];\n                if (((n.attach_type === h.PHOTO))) {\n                    l.push(n);\n                }\n                 else if (n.filename) {\n                    var o = j.getAttachTypeByMime(n.filetype), p = {\n                    };\n                    p.attach_type = h.FILE;\n                    p.JSBNG__name = n.filename;\n                    p.icon_type = o;\n                    p.url = \"\";\n                    if (((o == g.PHOTO))) {\n                        p.preview_loading = true;\n                    }\n                ;\n                ;\n                    l.push(p);\n                }\n                \n            ;\n            ;\n            };\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreads\", [\"Arbiter\",\"TimestampConverter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryAttachment\",\"MercuryGlobalActionType\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercurySingletonMixin\",\"MercuryThreadMode\",\"MessagingTag\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"MercuryFolders\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryAssert\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryGlobalActionType\"), p = b(\"MercuryIDs\"), q = b(\"MercuryLogMessageType\"), r = b(\"MercurySingletonMixin\"), s = b(\"MercuryThreadMode\"), t = b(\"MessagingTag\"), u = b(\"MercuryParticipants\"), v = b(\"MercuryServerRequests\"), w = b(\"MercuryThreadInformer\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"removeFromArray\"), aa = j.create(\"mercury_threads\");\n    function ba(na, oa, pa) {\n        var qa = y(oa.participants, true), ra = u.getIDForUser(na._fbid);\n        pa.forEach(function(sa) {\n            if (((qa[sa] !== true))) {\n                oa.participants.push(sa);\n                if (((sa === ra))) {\n                    oa.is_subscribed = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ca(na, oa, pa) {\n        z(oa.participants, pa);\n        if (((pa === u.getIDForUser(na._fbid)))) {\n            oa.is_subscribed = false;\n        }\n    ;\n    ;\n    };\n;\n    function da(na, oa) {\n        if (((na.participants[0] != oa))) {\n            z(na.participants, oa);\n            na.participants.unshift(oa);\n        }\n    ;\n    ;\n    };\n;\n    function ea(na, oa) {\n        var pa = oa.body, qa = oa.subject, ra = \"\";\n        if (qa) {\n            qa = qa.toLowerCase();\n            if (((pa.slice(0, qa.length).toLowerCase() == qa))) {\n                ra = pa;\n            }\n             else if (pa) {\n                ra = ((((qa + \" \\u00b7 \")) + pa));\n            }\n             else ra = qa;\n            \n        ;\n        ;\n        }\n         else ra = pa;\n    ;\n    ;\n        na.snippet = ra;\n        na.snippet_has_attachment = oa.has_attachment;\n        if (((oa.raw_attachments && ((oa.raw_attachments.length > 0))))) {\n            var sa = n.convertRaw(oa.raw_attachments);\n            na.snippet_attachments = sa;\n        }\n         else na.snippet_attachments = oa.attachments;\n    ;\n    ;\n        na.is_forwarded_snippet = !!oa.forward_count;\n        na.snippet_sender = oa.author;\n    };\n;\n    function fa(na, oa, pa) {\n        if (!oa) {\n            return false;\n        }\n    ;\n    ;\n        if (!oa.timestamp) {\n            return true;\n        }\n    ;\n    ;\n        var qa = !oa.unread_count;\n        if (((pa == qa))) {\n            return false;\n        }\n    ;\n    ;\n        oa.unread_count = ((pa ? 0 : 1));\n        na._threadInformer.updatedThread(oa.thread_id);\n        return true;\n    };\n;\n    function ga(na, oa) {\n        var pa = na._threads.getAllResources();\n        {\n            var fin156keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin156i = (0);\n            var qa;\n            for (; (fin156i < fin156keys.length); (fin156i++)) {\n                ((qa) = (fin156keys[fin156i]));\n                {\n                    var ra = pa[qa];\n                    if (((ra.folder == oa))) {\n                        ra.unread_count = 0;\n                        na._threads.setResource(qa, ra);\n                        na._threadInformer.updatedThread(qa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ha(na, oa, pa) {\n        if (((!oa || ((oa.chat_clear_time === pa))))) {\n            return false;\n        }\n    ;\n    ;\n        oa.chat_clear_time = pa;\n        na._threadInformer.reorderedMessages(oa.thread_id);\n        return true;\n    };\n;\n    function ia(na, oa, pa, qa) {\n        var ra = pa.action_type;\n        if (((((ra == l.USER_GENERATED_MESSAGE)) || ((ra == l.LOG_MESSAGE))))) {\n            ((pa.is_unread && oa.unread_count++));\n            oa.message_count++;\n            oa.is_archived = false;\n        }\n    ;\n    ;\n        switch (ra) {\n          case l.USER_GENERATED_MESSAGE:\n            da(oa, pa.author);\n            break;\n          case l.SEND_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.THREAD_IMAGE))) {\n                oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n            }\n        ;\n        ;\n            oa.snippet_attachments = pa.attachments;\n            break;\n          case l.LOG_MESSAGE:\n            var sa = pa.log_message_type;\n            if (((sa == q.SUBSCRIBE))) {\n                ba(na, oa, pa.log_message_data.added_participants);\n            }\n             else if (((sa == q.JOINABLE_JOINED))) {\n                ba(na, oa, [pa.log_message_data.joined_participant,]);\n            }\n             else if (((sa == q.UNSUBSCRIBE))) {\n                ca(na, oa, pa.author);\n            }\n             else if (((sa == q.THREAD_IMAGE))) {\n                if (!qa) {\n                    oa.image_src = ((pa.log_message_data.image ? pa.log_message_data.image.preview_url : null));\n                }\n            ;\n            ;\n            }\n             else if (((sa == q.THREAD_NAME))) {\n                oa.JSBNG__name = pa.log_message_data.JSBNG__name;\n            }\n            \n            \n            \n            \n        ;\n        ;\n            break;\n          case l.CHANGE_READ_STATUS:\n            if (pa.timestamp) {\n                na._threadInformer.changedThreadReadState(oa.thread_id, pa.mark_as_read, pa.timestamp);\n            }\n        ;\n        ;\n            fa(na, oa, pa.mark_as_read);\n            break;\n          case l.CLEAR_CHAT:\n            ha(na, oa, pa.clear_time);\n            break;\n          case l.CHANGE_ARCHIVED_STATUS:\n            oa.is_archived = pa.archived;\n            break;\n          case l.CHANGE_FOLDER:\n            oa.folder = pa.new_folder;\n            break;\n          case l.DELETE_MESSAGES:\n            if (qa) {\n                oa.snippet = \"...\";\n                oa.snippet_has_attachment = false;\n                oa.snippet_attachments = null;\n                oa.snippet_sender = null;\n                oa.is_forwarded_snippet = false;\n                na._threadInformer.updatedThread(pa.thread_id);\n            }\n             else if (pa.message_ids) {\n                oa.message_count = ((oa.message_count - pa.message_ids.length));\n            }\n            \n        ;\n        ;\n            break;\n          case l.CHANGE_MUTE_SETTINGS:\n            if (((pa.mute_settings !== undefined))) {\n                var ta = ((na._fbid + \"@facebook.com\"));\n                if (oa.mute_settings) {\n                    if (pa.mute_settings) {\n                        oa.mute_settings[ta] = pa.mute_settings;\n                    }\n                     else delete oa.mute_settings[ta];\n                ;\n                ;\n                    na._threadInformer.updatedThread(oa.thread_id);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            break;\n        };\n    ;\n        if (pa.action_id) {\n            oa.last_action_id = h.maxValidActionID(pa.action_id, oa.last_action_id);\n        }\n    ;\n    ;\n    };\n;\n    function ja(na, oa) {\n        var pa = na._serverRequests.tokenizeThreadID(oa.thread_id);\n        if (((pa.type == \"group\"))) {\n            aa.error(\"invalid_new_thread_message\", oa);\n            return undefined;\n        }\n    ;\n    ;\n        var qa = la(na, oa.specific_to_list), ra = {\n            thread_id: oa.thread_id,\n            last_action_id: oa.action_id,\n            participants: oa.specific_to_list,\n            JSBNG__name: null,\n            snippet: oa.body,\n            snippet_has_attachment: false,\n            snippet_attachments: [],\n            snippet_sender: oa.author,\n            unread_count: 0,\n            message_count: 0,\n            image_src: null,\n            timestamp_absolute: oa.timestamp_absolute,\n            timestamp_relative: oa.timestamp_relative,\n            timestamp: oa.timestamp,\n            canonical_fbid: ((((pa.type === \"user\")) ? pa.value : null)),\n            is_canonical_user: ((pa.type === \"user\")),\n            is_canonical: qa,\n            is_subscribed: true,\n            root_message_threading_id: oa.message_id,\n            folder: t.INBOX,\n            is_archived: false,\n            mode: s.TITAN_ORIGINATED\n        };\n        return ra;\n    };\n;\n    function ka(na) {\n        this._fbid = na;\n        this._serverRequests = v.getForFBID(this._fbid);\n        this._threadInformer = w.getForFBID(this._fbid);\n        this._threads = new k();\n        ma(this);\n    };\n;\n    x(ka.prototype, {\n        getThreadMetaNow: function(na) {\n            m.isThreadID(na);\n            return this._threads.getResource(na);\n        },\n        getThreadMeta: function(na, oa, pa) {\n            m.isThreadID(na);\n            var qa = this._threads.executeOrEnqueue(na, oa), ra = this._threads.getUnavailableResources(qa);\n            if (ra.length) {\n                var sa = this._serverRequests.tokenizeThreadID(na);\n                if (((sa.type == \"user\"))) {\n                    this.getCanonicalThreadToUser(sa.value);\n                }\n                 else this._serverRequests.fetchThreadData(ra, pa);\n            ;\n            ;\n            }\n        ;\n        ;\n            return qa;\n        },\n        unsubscribe: function(na) {\n            this._threads.unsubscribe(na);\n        },\n        changeThreadReadStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (fa(this, pa, oa)) {\n                this._serverRequests.changeThreadReadStatus(na, oa, i.getFromMeta(pa));\n            }\n        ;\n        ;\n        },\n        changeThreadArchivedStatus: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa.is_archived != oa))) {\n                pa.is_archived = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadArchivedStatus(na, oa);\n            }\n        ;\n        ;\n        },\n        markThreadSpam: function(na) {\n            this._serverRequests.markThreadSpam(na);\n        },\n        unmarkThreadSpam: function(na) {\n            this._serverRequests.unmarkThreadSpam(na);\n        },\n        updateThreadMuteSetting: function(na, oa) {\n            this._serverRequests.changeMutingOnThread(na, oa);\n        },\n        changeFolder: function(na, oa) {\n            m.isThreadID(na);\n            var pa = this._threads.getResource(na);\n            if (((pa && ((pa.folder != oa))))) {\n                pa.folder = oa;\n                this._threadInformer.updatedThread(pa.thread_id);\n                this._serverRequests.changeThreadFolder(na, oa);\n            }\n        ;\n        ;\n        },\n        deleteThread: function(na) {\n            m.isThreadID(na);\n            this._serverRequests.deleteThread(na);\n        },\n        updateThreads: function(na) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var oa = {\n            };\n            na.forEach(function(pa) {\n                oa[pa.thread_id] = pa;\n            });\n            this._threads.addResourcesAndExecute(oa);\n        },\n        updateMetadataByActions: function(na, oa) {\n            if (((!na || !na.length))) {\n                return;\n            }\n        ;\n        ;\n            var pa = {\n            }, qa = {\n            }, ra = {\n            };\n            for (var sa = 0; ((sa < na.length)); sa++) {\n                var ta = na[sa];\n                if (ta.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ua = ta.action_type, va = ta.thread_id;\n                m.isThreadID(va);\n                var wa = this.getThreadMetaNow(va);\n                if (((((ua == l.LOG_MESSAGE)) && ((ta.log_message_type == q.SERVER_ERROR))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((!wa && !ta.action_id)) && ((ua == l.USER_GENERATED_MESSAGE))))) {\n                    wa = ja(this, ta);\n                    this._threads.setResource(va, wa);\n                }\n            ;\n            ;\n                if (wa) {\n                    if (((ua == l.DELETE_THREAD))) {\n                        wa.message_count = 0;\n                        this._threadInformer.deletedThread(va);\n                        continue;\n                    }\n                ;\n                ;\n                    var xa = !!ta.action_id;\n                    if (((((ua == l.LOG_MESSAGE)) || ((ua == l.USER_GENERATED_MESSAGE))))) {\n                        xa = !oa;\n                    }\n                ;\n                ;\n                    if (((((wa.server_timestamp && ((ta.timestamp <= wa.server_timestamp)))) && xa))) {\n                        continue;\n                    }\n                ;\n                ;\n                    if (!ra[va]) {\n                        ra[va] = x({\n                        }, wa);\n                    }\n                ;\n                ;\n                    ia(this, ra[va], ta, oa);\n                    if (((ua == l.USER_GENERATED_MESSAGE))) {\n                        pa[va] = ta;\n                    }\n                ;\n                ;\n                    if (((((((ua == l.USER_GENERATED_MESSAGE)) || ((ua == l.LOG_MESSAGE)))) || ((ua == l.SEND_MESSAGE))))) {\n                        if (((((ta && ta.timestamp)) && ((!qa[va] || ((ta.timestamp > qa[va].timestamp))))))) {\n                            qa[va] = ta;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin157keys = ((window.top.JSBNG_Replay.forInKeys)((ra))), fin157i = (0);\n                var ya;\n                for (; (fin157i < fin157keys.length); (fin157i++)) {\n                    ((ya) = (fin157keys[fin157i]));\n                    {\n                        var za = ra[ya], ab = pa[ya];\n                        if (ab) {\n                            ea(za, ab);\n                        }\n                    ;\n                    ;\n                        var bb = qa[ya], cb = za.timestamp;\n                        if (bb) {\n                            if (((bb.timestamp > cb))) {\n                                za = x(za, {\n                                    timestamp_absolute: bb.timestamp_absolute,\n                                    timestamp_relative: bb.timestamp_relative,\n                                    timestamp: bb.timestamp\n                                });\n                            }\n                        ;\n                        ;\n                            var db = za.server_timestamp;\n                            if (((!oa && ((bb.timestamp > db))))) {\n                                za.server_timestamp = bb.timestamp;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        this._threads.setResource(ya, za);\n                    };\n                };\n            };\n        ;\n        },\n        getCanonicalThreadToUser: function(na, oa, pa) {\n            return this.getCanonicalThreadToParticipant(((\"fbid:\" + na)), oa, pa);\n        },\n        getCanonicalThreadToParticipant: function(na, oa, pa) {\n            var qa = this.getThreadIDForParticipant(na), ra = this._threads.getResource(qa);\n            if (((typeof ra == \"undefined\"))) {\n                ra = this.createNewLocalThread(qa, [u.getIDForUser(this._fbid),na,], oa);\n                this._serverRequests.fetchThreadData([qa,], pa);\n            }\n        ;\n        ;\n            return ra;\n        },\n        getThreadIdForUser: function(na) {\n            return ((\"user:\" + na));\n        },\n        getThreadIDForParticipant: function(na) {\n            var oa = p.tokenize(na);\n            return this.getThreadIdForUser(oa.value);\n        },\n        createNewLocalThread: function(na, oa, pa) {\n            var qa = this._threads.getResource(na);\n            if (!qa) {\n                var ra = this._serverRequests.tokenizeThreadID(na);\n                qa = {\n                    thread_id: na,\n                    last_action_id: null,\n                    participants: oa,\n                    JSBNG__name: null,\n                    snippet: \"\",\n                    snippet_has_attachment: false,\n                    snippet_sender: null,\n                    unread_count: ((pa ? pa : 0)),\n                    message_count: 0,\n                    image_src: null,\n                    timestamp_absolute: null,\n                    timestamp_relative: null,\n                    timestamp: null,\n                    canonical_fbid: ((((ra.type === \"user\")) ? ra.value : null)),\n                    is_canonical_user: ((ra.type == \"user\")),\n                    is_canonical: la(this, oa),\n                    is_subscribed: true,\n                    root_message_threading_id: null,\n                    folder: t.INBOX,\n                    is_archived: false,\n                    mode: s.TITAN_ORIGINATED\n                };\n                this._threads.setResource(na, qa);\n            }\n        ;\n        ;\n            return qa;\n        },\n        addParticipantsToThreadLocally: function(na, oa) {\n            var pa = this._threads.getResource(na);\n            if (pa) {\n                ba(this, pa, oa);\n                this._threadInformer.updatedThread(pa.thread_id);\n            }\n        ;\n        ;\n        },\n        getCanonicalUserInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"user\")) ? oa.value : null));\n        },\n        getCanonicalGroupInThread: function(na) {\n            var oa = this._serverRequests.tokenizeThreadID(na);\n            return ((((oa.type == \"group\")) ? oa.value : null));\n        },\n        isEmptyLocalThread: function(na) {\n            var oa = this._threads.getResource(na);\n            if (!oa) {\n                return false;\n            }\n        ;\n        ;\n            var pa = this._serverRequests.tokenizeThreadID(na);\n            return ((((pa.type == \"root\")) && !oa.timestamp));\n        },\n        isNewEmptyLocalThread: function(na) {\n            if (!this.isEmptyLocalThread(na)) {\n                return false;\n            }\n        ;\n        ;\n            var oa = this._threads.getResource(na);\n            return ((oa.participants && ((oa.participants.length === 0))));\n        },\n        canReply: function(na) {\n            var oa = this._threads.getResource(na);\n            return ((((((oa && oa.is_subscribed)) && ((oa.mode != s.OBJECT_ORIGINATED)))) && ((oa.recipients_loadable || ((oa.recipients_loadable === undefined))))));\n        }\n    });\n    x(ka, r);\n    function la(na, oa) {\n        var pa = oa.filter(function(qa) {\n            return ((qa != u.getIDForUser(na._fbid)));\n        });\n        return ((pa.length <= 1));\n    };\n;\n    function ma(na) {\n        na._serverRequests.subscribe(\"update-threads\", function(oa, pa) {\n            var qa = ((pa.actions || [])).filter(function(ua) {\n                return ua.thread_id;\n            });\n            na.updateThreads(pa.threads);\n            na.updateMetadataByActions(qa, pa.from_client);\n            ((pa.threads || [])).forEach(function(ua) {\n                na._threadInformer.updatedThread(ua.thread_id);\n            });\n            var ra = ((pa.global_actions || []));\n            for (var sa = 0; ((sa < ra.length)); sa++) {\n                var ta = ra[sa];\n                if (((ta.action_type == o.MARK_ALL_READ))) {\n                    ga(na, ta.folder);\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(na, oa) {\n        oa.messaging = ((oa.messaging || {\n        }));\n        oa.messaging.threads = {\n        };\n        var pa = ka._getInstances();\n        {\n            var fin158keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin158i = (0);\n            var qa;\n            for (; (fin158i < fin158keys.length); (fin158i++)) {\n                ((qa) = (fin158keys[fin158i]));\n                {\n                    oa.messaging.threads[qa] = pa[qa]._threads.dumpResources();\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = ka;\n});\n__d(\"MercuryUnreadState\", [\"Arbiter\",\"MercuryFolders\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryFolders\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercuryGlobalActionType\"), m = b(\"MercurySingletonMixin\"), n = b(\"MercuryThreadlistConstants\"), o = b(\"MessagingTag\"), p = b(\"MercuryServerRequests\"), q = b(\"MercuryThreadInformer\"), r = b(\"MercuryThreads\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"createObjectFrom\"), v = ((h.getSupportedFolders() || [])).filter(function(ma) {\n        return ((ma != o.ACTION_ARCHIVED));\n    }), w = \"unread_thread_hash\", x = \"unseen_thread_list\", y = n.MAX_UNREAD_COUNT, z = i.create(\"mercury_unread_state\");\n    function aa(ma) {\n        this._fbid = ma;\n        this._serverRequests = p.getForFBID(this._fbid);\n        this._threadInformer = q.getForFBID(this._fbid);\n        this._threads = r.getForFBID(this._fbid);\n        this._allReadTimestamp = {\n        };\n        this._threadReadTimestamp = {\n        };\n        this._initialUnreadCount = {\n        };\n        this._maxCount = {\n        };\n        this._unreadResources = {\n        };\n        v.forEach(function(na) {\n            this._initialUnreadCount[na] = 0;\n            this._maxCount[na] = false;\n            this._unreadResources[na] = new j();\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-unread\", function(na, oa) {\n            fa(this, oa);\n            var pa = ((oa.global_actions || []));\n            for (var qa = 0; ((qa < pa.length)); qa++) {\n                var ra = pa[qa];\n                if (((ra.action_type == l.MARK_ALL_READ))) {\n                    ia(this, ra.folder, ra.timestamp);\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(na, oa) {\n            ka(this, oa);\n        }.bind(this));\n    };\n;\n    t(aa.prototype, {\n        getUnreadCount: function(ma) {\n            if (this.exceedsMaxCount(ma)) {\n                z.error(\"unguarded_unread_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return ea(this, ma);\n        },\n        exceedsMaxCount: function(ma) {\n            return ((this._maxCount[ma] || ((ea(this, ma) > y))));\n        },\n        markFolderAsRead: function(ma) {\n            if (((this._maxCount[ma] || ((ea(this, ma) > 0))))) {\n                this._serverRequests.markFolderAsRead(ma);\n            }\n        ;\n        ;\n        }\n    });\n    t(aa, m);\n    function ba(ma, na, oa) {\n        ma._unreadResources[na].setResource(w, oa);\n        ma._unreadResources[na].setResource(x, Object.keys(oa));\n    };\n;\n    function ca(ma, na, oa) {\n        var pa = ma._unreadResources[na].executeOrEnqueue(w, oa), qa = ma._unreadResources[na].getUnavailableResources(pa);\n        if (qa.length) {\n            ma._serverRequests.fetchUnreadThreadIDs(na);\n        }\n    ;\n    ;\n    };\n;\n    function da(ma, na) {\n        return ma._unreadResources[na].getResource(w);\n    };\n;\n    function ea(ma, na) {\n        var oa = ma._unreadResources[na].getResource(x);\n        if (oa) {\n            return oa.length;\n        }\n         else return ma._initialUnreadCount[na]\n    ;\n    };\n;\n    function fa(ma, na) {\n        var oa;\n        ((na.unread_thread_ids || [])).forEach(function(pa) {\n            oa = pa.folder;\n            if (!la(oa)) {\n                return;\n            }\n        ;\n        ;\n            var qa = ja(ma, pa.thread_ids);\n            ba(ma, oa, u(qa, true));\n            if (((qa.length > y))) {\n                ma._maxCount[oa] = true;\n            }\n        ;\n        ;\n            ma._threadInformer.updatedUnreadState();\n        });\n        ((na.message_counts || [])).forEach(function(pa) {\n            if (((pa.unread_count === undefined))) {\n                return;\n            }\n        ;\n        ;\n            oa = pa.folder;\n            if (((pa.unread_count > y))) {\n                ma._maxCount[oa] = true;\n                ba(ma, oa, {\n                });\n                ma._threadInformer.updatedUnreadState();\n            }\n             else {\n                ma._initialUnreadCount[oa] = pa.unread_count;\n                if (((ma._initialUnreadCount[oa] === 0))) {\n                    ba(ma, oa, {\n                    });\n                }\n            ;\n            ;\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n        ((na.actions || [])).forEach(function(pa) {\n            if (pa.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var qa = k, ra = ((pa.thread_id ? pa.thread_id : pa.server_thread_id));\n            if (((pa.action_type == qa.DELETE_THREAD))) {\n                v.forEach(function(ta) {\n                    ha(ma, ta, ra);\n                });\n            }\n             else if (((((pa.action_type == qa.CHANGE_ARCHIVED_STATUS)) || ((pa.action_type == qa.CHANGE_FOLDER))))) {\n                var sa = ma._threads.getThreadMetaNow(pa.thread_id);\n                oa = h.getFromMeta(sa);\n                if (((la(oa) && ((sa.unread_count > 0))))) {\n                    ga(ma, oa, ra);\n                }\n            ;\n            ;\n                v.forEach(function(ta) {\n                    if (((ta != oa))) {\n                        ha(ma, ta, ra);\n                    }\n                ;\n                ;\n                });\n            }\n             else {\n                oa = pa.folder;\n                if (!la(oa)) {\n                    return;\n                }\n            ;\n            ;\n                if (((pa.action_type == qa.CHANGE_READ_STATUS))) {\n                    if (pa.mark_as_read) {\n                        ha(ma, oa, ra, pa.timestamp);\n                    }\n                     else ga(ma, oa, ra, pa.timestamp);\n                ;\n                ;\n                }\n                 else if (((((pa.action_type == qa.USER_GENERATED_MESSAGE)) || ((pa.action_type == qa.LOG_MESSAGE))))) {\n                    if (pa.is_unread) {\n                        ga(ma, oa, ra, pa.timestamp);\n                    }\n                ;\n                }\n                \n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n    };\n;\n    function ga(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            var ra = ((ma._allReadTimestamp[na] || 0)), sa = ((ma._threadReadTimestamp[oa] || 0)), ta = ((pa || Number.POSITIVE_INFINITY));\n            if (((((((ta >= ra)) && ((ta >= sa)))) && !qa[oa]))) {\n                qa[oa] = ((pa || 0));\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ha(ma, na, oa, pa) {\n        if (ma._maxCount[na]) {\n            return;\n        }\n    ;\n    ;\n        ca(ma, na, function(qa) {\n            if (pa) {\n                var ra = ma._threadReadTimestamp[oa];\n                if (((!ra || ((ra < pa))))) {\n                    ma._threadReadTimestamp[oa] = pa;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var sa = qa[oa];\n            if (((((pa && ((typeof sa == \"number\")))) && ((pa < sa))))) {\n                return;\n            }\n        ;\n        ;\n            if (((oa in qa))) {\n                delete qa[oa];\n                ba(ma, na, qa);\n                ma._threadInformer.updatedUnreadState();\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ia(ma, na, oa) {\n        ma._maxCount[na] = false;\n        ba(ma, na, {\n        });\n        ma._allReadTimestamp[na] = Math.max(((ma._allReadTimestamp[na] || 0)), ((oa || 0)));\n        ma._threadInformer.updatedUnreadState();\n    };\n;\n    function ja(ma, na) {\n        return na.map(ma._serverRequests.convertThreadIDIfAvailable.bind(ma._serverRequests));\n    };\n;\n    function ka(ma, na) {\n        v.forEach(function(oa) {\n            var pa = da(ma, oa);\n            if (!pa) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin159keys = ((window.top.JSBNG_Replay.forInKeys)((na))), fin159i = (0);\n                var qa;\n                for (; (fin159i < fin159keys.length); (fin159i++)) {\n                    ((qa) = (fin159keys[fin159i]));\n                    {\n                        var ra = na[qa];\n                        if (pa[qa]) {\n                            pa[ra] = pa[qa];\n                            delete pa[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            ba(ma, oa, pa);\n        });\n    };\n;\n    function la(ma) {\n        return s(v, ma);\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ma, na) {\n        na.messaging = ((na.messaging || {\n        }));\n        na.messaging.unread = {\n        };\n        na.messaging.unread_max_count = {\n        };\n        var oa = aa._getInstances();\n        {\n            var fin160keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin160i = (0);\n            var pa;\n            for (; (fin160i < fin160keys.length); (fin160i++)) {\n                ((pa) = (fin160keys[fin160i]));\n                {\n                    na.messaging.unread[pa] = {\n                    };\n                    na.messaging.unread_max_count[pa] = {\n                    };\n                    v.forEach(function(qa) {\n                        na.messaging.unread[pa][qa] = t({\n                        }, da(oa[pa], qa));\n                        na.messaging.unread_max_count[pa][qa] = oa[pa]._maxCount[qa];\n                    });\n                };\n            };\n        };\n    ;\n    });\n    e.exports = aa;\n});\n__d(\"MercuryChatUtils\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        canOpenChatTab: function(i) {\n            var j = ((i.is_canonical && !i.is_canonical_user));\n            return ((((i.is_subscribed && !j)) && ((i.canonical_fbid != g.user))));\n        }\n    };\n    e.exports = h;\n});\n__d(\"RenderManager\", [\"function-extensions\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._isDirty = false;\n        this._obj = i;\n    };\n;\n    g(h.prototype, {\n        dirty: function() {\n            if (!this._isDirty) {\n                this._isDirty = true;\n                this._doPaint.bind(this).defer();\n            }\n        ;\n        ;\n        },\n        _doPaint: function() {\n            this._isDirty = false;\n            this._obj.paint();\n        }\n    });\n    e.exports = h;\n});\n__d(\"CounterDisplay\", [\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"RenderManager\",\"Run\",\"$\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"RenderManager\"), k = b(\"Run\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\");\n    function o(p, q, r, s, t, u) {\n        m(this, {\n            _name: p,\n            _valueNode: l(q),\n            _wrapperNode: ((l(r) || null)),\n            _statusClass: t,\n            _rm: new j(this),\n            _arbiterSubscription: null,\n            _count: 0\n        });\n        var v = this._valueNode.firstChild;\n        if (v) {\n            var w = parseInt(v.nodeValue, 10);\n            if (!isNaN(w)) {\n                this._count = w;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this._statusNode = ((s ? l(s) : null));\n        this._subscribeAll();\n        o.instances.push(this);\n        if (!u) {\n            k.onLeave(this._destroy.bind(this), true);\n        }\n    ;\n    ;\n    };\n;\n    m(o, {\n        EVENT_TYPE_ADJUST: \"CounterDisplay/adjust\",\n        EVENT_TYPE_UPDATE: \"CounterDisplay/update\",\n        instances: [],\n        adjustCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_ADJUST + \"/\")) + p)), q);\n        },\n        setCount: function(p, q) {\n            g.inform(((((o.EVENT_TYPE_UPDATE + \"/\")) + p)), q);\n        }\n    });\n    m(o.prototype, {\n        _destroy: function() {\n            delete this._valueNode;\n            delete this._wrapperNode;\n            if (this._arbiterSubscription) {\n                this._arbiterSubscription.unsubscribe();\n                delete this._arbiterSubscription;\n            }\n        ;\n        ;\n            n(o.instances, this);\n        },\n        adjustCount: function(p) {\n            this._count = Math.max(0, ((this._count + p)));\n            this._rm.dirty();\n            return this;\n        },\n        setCount: function(p) {\n            this._count = Math.max(0, p);\n            this._rm.dirty();\n            return this;\n        },\n        paint: function() {\n            i.setContent(this._valueNode, this._count);\n            this._toggleNodes();\n        },\n        _toggleNodes: function() {\n            if (this._wrapperNode) {\n                h.conditionClass(this._wrapperNode, \"hidden_elem\", ((this._count <= 0)));\n            }\n        ;\n        ;\n            if (((this._statusClass && this._statusNode))) {\n                h.conditionClass(this._statusNode, this._statusClass, ((this._count > 0)));\n            }\n        ;\n        ;\n        },\n        _subscribeAll: function() {\n            var p = [((((o.EVENT_TYPE_ADJUST + \"/\")) + this._name)),((((o.EVENT_TYPE_UPDATE + \"/\")) + this._name)),];\n            this._arbiterSubscription = g.subscribe(p, this._onInform.bind(this), g.SUBSCRIBE_NEW);\n        },\n        _onInform: function(p, q) {\n            q = parseInt(q);\n            if (isNaN(q)) {\n                return;\n            }\n        ;\n        ;\n            if (((p.indexOf(o.EVENT_TYPE_ADJUST) != -1))) {\n                this.adjustCount(q);\n            }\n             else if (((p.indexOf(o.EVENT_TYPE_UPDATE) != -1))) {\n                this.setCount(q);\n            }\n             else return\n            \n        ;\n            return;\n        }\n    });\n    e.exports = o;\n});");
// 8945
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o108,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yu/r/jXjHtkFmkD1.js",o114);
// undefined
o108 = null;
// undefined
o114 = null;
// 8953
o84.readyState = 2;
// 8951
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o96,o115);
// undefined
o115 = null;
// 8957
o84.readyState = 3;
// 8955
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o96,o116);
// undefined
o116 = null;
// 8961
o84.readyState = 4;
// undefined
o84 = null;
// 9013
o119.toString = f81632121_1344;
// undefined
o119 = null;
// 8959
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o96,o117);
// undefined
o96 = null;
// undefined
o117 = null;
// 9095
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"OSd/n\",]);\n}\n;\n__d(\"MercuryMessageSourceTags\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        CHAT: \"source:chat\",\n        MOBILE: \"source:mobile\",\n        MESSENGER: \"source:messenger\",\n        EMAIL: \"source:email\"\n    };\n});\n__d(\"MercuryTimePassed\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        TODAY: 0,\n        WEEK_AGO: 1,\n        CURRENT_YEAR: 3,\n        OTHER_YEAR: 4,\n        MONTH_AGO: 2\n    };\n});\n__d(\"MessagingEvent\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNSUBSCRIBE: \"unsubscribe\",\n        DELIVERY_RECEIPT: \"delivery_receipt\",\n        REPORT_SPAM_MESSAGES: \"report_spam_messages\",\n        DELIVER_FAST_PAST: \"deliver_fast_path\",\n        DELETE_MESSAGES: \"delete_messages\",\n        READ_RECEIPT: \"read_receipt\",\n        SENT_PUSH: \"sent_push\",\n        READ: \"read\",\n        CHANGE_MUTE_SETTINGS: \"change_mute_settings\",\n        ERROR: \"error\",\n        UNMARK_SPAM: \"unmark_spam\",\n        UNREAD: \"unread\",\n        DELIVER_LOG: \"deliver_log\",\n        DELIVER: \"deliver\",\n        READ_ALL: \"read_all\",\n        TAG: \"tag\",\n        MORE_THREADS: \"more_threads\",\n        DELETE: \"delete\",\n        REPORT_SPAM: \"report_spam\",\n        SUBSCRIBE: \"subscribe\"\n    };\n});\n__d(\"AvailableListConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ON_AVAILABILITY_CHANGED: \"buddylist/availability-changed\",\n        ON_UPDATE_ERROR: \"buddylist/update-error\",\n        ON_UPDATED: \"buddylist/updated\",\n        ON_CHAT_NOTIFICATION_CHANGED: \"chat-notification-changed\",\n        OFFLINE: 0,\n        IDLE: 1,\n        ACTIVE: 2,\n        MOBILE: 3,\n        LEGACY_OVERLAY_OFFLINE: -1,\n        LEGACY_OVERLAY_ONLINE: 0,\n        LEGACY_OVERLAY_IDLE: 1,\n        legacyStatusMap: {\n            0: 2,\n            1: 1,\n            \"-1\": 0,\n            2: 3\n        },\n        reverseLegacyStatusMap: {\n            0: -1,\n            1: 1,\n            2: 0,\n            3: 2\n        }\n    };\n    a.AvailableListConstants = e.exports = g;\n});\n__d(\"RangedCallbackManager\", [\"CallbackManagerController\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"copyProperties\"), i = b(\"createObjectFrom\"), j = function(k, l, m) {\n        this._resources = [];\n        this._reachedEndOfArray = false;\n        this._error = false;\n        this._existingIDs = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n        this._getValueHandler = k;\n        this._compareValuesHandler = l;\n        this._skipOnStrictHandler = m;\n    };\n    h(j.prototype, {\n        executeOrEnqueue: function(k, l, m, n) {\n            return this._controller.executeOrEnqueue({\n                start: k,\n                limit: l\n            }, m, {\n                strict: !!n\n            });\n        },\n        unsubscribe: function(k) {\n            this._controller.unsubscribe(k);\n        },\n        getUnavailableResources: function(k) {\n            var l = this._controller.getRequest(k), m = [];\n            if ((l && !this._reachedEndOfArray)) {\n                var n = l.request, o = this._filterForStrictResults(l.options), p = (n.start + n.limit);\n                for (var q = o.length; (q < p); q++) {\n                    m.push(q);;\n                };\n            }\n        ;\n            return m;\n        },\n        addResources: function(k) {\n            k.forEach(function(l) {\n                if (!this._existingIDs[l]) {\n                    this._existingIDs[l] = true;\n                    this._resources.push(l);\n                    this._error = null;\n                }\n            ;\n            }.bind(this));\n            this.resortResources();\n            this._controller.runPossibleCallbacks();\n        },\n        addResourcesWithoutSorting: function(k, l) {\n            var m = this._resources.slice(0, l);\n            m = m.concat(k);\n            m = m.concat(this._resources.slice(l));\n            this._resources = m;\n            h(this._existingIDs, i(k, true));\n            this._error = null;\n            this._controller.runPossibleCallbacks();\n        },\n        removeResources: function(k) {\n            k.forEach(function(l) {\n                if (this._existingIDs[l]) {\n                    this._existingIDs[l] = false;\n                    var m = this._resources.indexOf(l);\n                    if ((m != -1)) {\n                        this._resources.splice(m, 1);\n                    };\n                }\n            ;\n            }.bind(this));\n        },\n        removeAllResources: function() {\n            this._resources = [];\n            this._existingIDs = {\n            };\n        },\n        resortResources: function() {\n            this._resources = this._resources.sort(function(k, l) {\n                return this._compareValuesHandler(this._getValueHandler(k), this._getValueHandler(l));\n            }.bind(this));\n        },\n        setReachedEndOfArray: function() {\n            if (!this._reachedEndOfArray) {\n                this._reachedEndOfArray = true;\n                this._error = null;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        },\n        hasReachedEndOfArray: function() {\n            return this._reachedEndOfArray;\n        },\n        setError: function(k) {\n            if ((this._error !== k)) {\n                this._error = k;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        },\n        getError: function(k, l, m) {\n            var n = this._filterForStrictResults({\n                strict: m\n            });\n            return (((k + l) > n.length) ? this._error : null);\n        },\n        hasResource: function(k) {\n            return this._existingIDs[k];\n        },\n        getResourceAtIndex: function(k) {\n            return this._resources[k];\n        },\n        getAllResources: function() {\n            return this._resources.concat();\n        },\n        getCurrentArraySize: function() {\n            return this._resources.length;\n        },\n        _filterForStrictResults: function(k) {\n            var l = this._resources;\n            if (((k && k.strict) && this._skipOnStrictHandler)) {\n                l = l.filter(this._skipOnStrictHandler);\n            };\n            return l;\n        },\n        _constructCallbackArg: function(k, l) {\n            var m = this._filterForStrictResults(l);\n            if (((!this._reachedEndOfArray && !this._error) && ((k.start + k.limit) > m.length))) {\n                return false;\n            }\n             else {\n                var n = m.slice(k.start, (k.start + k.limit)), o = (((k.start + k.limit) > m.length) ? this._error : null);\n                return [n,o,];\n            }\n        ;\n        },\n        getElementsUntil: function(k) {\n            var l = [];\n            for (var m = 0; (m < this._resources.length); m++) {\n                var n = this._getValueHandler(this._resources[m]);\n                if ((this._compareValuesHandler(n, k) > 0)) {\n                    break;\n                };\n                l.push(this._resources[m]);\n            };\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"formatDate\", [\"DateFormatConfig\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DateFormatConfig\"), h = b(\"tx\"), i = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",], j = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",], k = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",], l = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function m(o, p) {\n        p = (p || 2);\n        o = (\"\" + o);\n        while ((o.length < p)) {\n            o = (\"0\" + o);;\n        };\n        return o;\n    };\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\"\n        };\n        var s = [], t = null, u = null, v = (q ? \"getUTC\" : \"get\"), w = o[(v + \"Date\")](), x = o[(v + \"Day\")](), y = o[(v + \"Month\")](), z = o[(v + \"FullYear\")](), aa = o[(v + \"Hours\")](), ba = o[(v + \"Minutes\")](), ca = o[(v + \"Seconds\")](), da = o[(v + \"Milliseconds\")]();\n        for (var ea = 0; (ea < p.length); ea++) {\n            u = p.charAt(ea);\n            if ((u == \"\\\\\")) {\n                ea++;\n                s.push(p.charAt(ea));\n                continue;\n            }\n        ;\n            switch (u) {\n              case \"d\":\n                t = m(w);\n                break;\n              case \"D\":\n                t = i[x];\n                break;\n              case \"j\":\n                t = w;\n                break;\n              case \"l\":\n                t = j[x];\n                break;\n              case \"F\":\n            \n              case \"f\":\n                t = l[y];\n                break;\n              case \"m\":\n                t = m((y + 1));\n                break;\n              case \"M\":\n                t = k[y];\n                break;\n              case \"n\":\n                t = (y + 1);\n                break;\n              case \"Y\":\n                t = z;\n                break;\n              case \"y\":\n                t = ((\"\" + z)).slice(2);\n                break;\n              case \"a\":\n                t = ((aa < 12) ? \"am\" : \"pm\");\n                break;\n              case \"A\":\n                t = ((aa < 12) ? \"AM\" : \"PM\");\n                break;\n              case \"g\":\n                t = ((((aa == 0) || (aa == 12))) ? 12 : (aa % 12));\n                break;\n              case \"G\":\n                t = aa;\n                break;\n              case \"h\":\n                t = ((((aa == 0) || (aa == 12))) ? 12 : m((aa % 12)));\n                break;\n              case \"H\":\n                t = m(aa);\n                break;\n              case \"i\":\n                t = m(ba);\n                break;\n              case \"s\":\n                t = m(ca);\n                break;\n              case \"S\":\n                if (r) {\n                    t = g.ordinalSuffixes[w];\n                }\n                 else t = m(da, 3);\n            ;\n                break;\n              default:\n                t = u;\n            };\n            s.push(t);\n        };\n        return s.join(\"\");\n    };\n    e.exports = n;\n});\n__d(\"MercuryMessages\", [\"Arbiter\",\"AsyncRequest\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAssert\",\"MercuryAttachmentType\",\"MercuryConfig\",\"MercuryGenericConstants\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageClientState\",\"MercuryMessageSourceTags\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercurySourceType\",\"MercuryTimePassed\",\"MercuryMessageIDs\",\"MercuryParticipants\",\"PresenceUtil\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"debounce\",\"formatDate\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryActionStatus\"), n = b(\"MercuryAssert\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryConfig\"), q = b(\"MercuryGenericConstants\"), r = b(\"MercuryIDs\"), s = b(\"MercuryLogMessageType\"), t = b(\"MercuryMessageClientState\"), u = b(\"MercuryMessageSourceTags\"), v = b(\"MercuryPayloadSource\"), w = b(\"MercurySingletonMixin\"), x = b(\"MercurySourceType\"), y = b(\"MercuryTimePassed\"), z = b(\"MercuryMessageIDs\"), aa = b(\"MercuryParticipants\"), ba = b(\"PresenceUtil\"), ca = b(\"RangedCallbackManager\"), da = b(\"MercuryServerRequests\"), ea = b(\"MercuryThreadInformer\"), fa = b(\"MercuryThreads\"), ga = b(\"copyProperties\"), ha = b(\"debounce\"), ia = b(\"formatDate\"), ja = b(\"randomInt\"), ka = b(\"tx\");\n    function la(cb, db) {\n        var eb = db;\n        if (cb._localIdsMap[db]) {\n            eb = cb._localIdsMap[db];\n        };\n        return cb._messages[eb];\n    };\n    var ma = new k();\n    function na(cb, db) {\n        if ((db.status === undefined)) {\n            db.status = m.UNSENT;\n        };\n        db.timestamp_absolute = \"Today\";\n        db.message_id = (db.message_id || cb.generateNewClientMessageID(db.timestamp));\n        var eb = aa.getIDForUser(cb._fbid);\n        db.specific_to_list = (db.specific_to_list || []);\n        if ((db.specific_to_list.length && (db.specific_to_list.indexOf(eb) === -1))) {\n            db.specific_to_list.push(eb);\n        };\n        if (!db.thread_id) {\n            if ((db.specific_to_list.length == 1)) {\n                db.thread_id = (\"user:\" + cb._fbid);\n            }\n             else if ((db.specific_to_list.length == 2)) {\n                var fb = ((db.specific_to_list[0] == eb) ? db.specific_to_list[1] : db.specific_to_list[0]);\n                if ((r.tokenize(fb).type == \"email\")) {\n                    db.thread_id = q.PENDING_THREAD_ID;\n                }\n                 else db.thread_id = cb._threads.getThreadIDForParticipant(fb);\n            ;\n            }\n            \n        ;\n            db.thread_id = (db.thread_id || (\"root:\" + db.message_id));\n        }\n    ;\n        if (!db.specific_to_list.length) {\n            var gb = cb._serverRequests.tokenizeThreadID(db.thread_id);\n            if ((gb.type == \"user\")) {\n                db.specific_to_list = [(\"fbid:\" + gb.value),eb,];\n            };\n        }\n    ;\n    };\n    function oa(cb, db, eb, fb) {\n        var gb = (ya(eb) ? [u.CHAT,] : []), hb = Date.now(), ib = ia(new Date(hb), (p[\"24h_times\"] ? \"H:i\" : \"g:ia\")), jb = {\n            action_type: db,\n            thread_id: fb,\n            author: aa.getIDForUser(cb._fbid),\n            author_email: null,\n            coordinates: null,\n            timestamp: hb,\n            timestamp_absolute: (new Date(hb)).toLocaleDateString(),\n            timestamp_relative: ib,\n            timestamp_time_passed: y.TODAY,\n            is_unread: false,\n            is_cleared: false,\n            is_forward: false,\n            is_filtered_content: false,\n            spoof_warning: false,\n            source: eb,\n            source_tags: gb\n        };\n        return jb;\n    };\n    function pa(cb) {\n        switch (cb) {\n          case v.UNKNOWN:\n        \n          case v.SERVER_INITIAL_DATA:\n        \n          case v.SERVER_FETCH_THREAD_INFO:\n        \n          case v.SERVER_THREAD_SYNC:\n            return true;\n        };\n        return false;\n    };\n    function qa(cb) {\n        return (cb && (cb.substr(0, 6) === \"server\"));\n    };\n    function ra(cb, db) {\n        if (!cb._threadsToMessages[db]) {\n            cb._threadsToMessages[db] = new ca(function(eb) {\n                return la(cb, eb).timestamp;\n            }, function(eb, fb) {\n                return (fb - eb);\n            });\n        };\n        return cb._threadsToMessages[db];\n    };\n    g.subscribe(j.DUMP_EVENT, function(cb, db) {\n        var eb = {\n        }, fb = {\n        }, gb = ta._getInstances();\n        for (var hb in gb) {\n            eb[hb] = {\n            };\n            for (var ib in gb[hb]._messages) {\n                var jb = gb[hb]._messages[ib];\n                if ((Object.keys(jb).length === 0)) {\n                    continue;\n                };\n                var kb = jb.thread_id;\n                eb[hb][kb] = (eb[hb][kb] || {\n                });\n                eb[hb][kb][jb.message_id] = {\n                    action_type: jb.action_type,\n                    author: jb.author,\n                    is_unread: jb.is_unread,\n                    timestamp: jb.timestamp\n                };\n            };\n            fb[hb] = ga({\n            }, gb[hb]._localIdsMap);\n        };\n        db.messaging = (db.messaging || {\n        });\n        db.messaging.local_message_ids = fb;\n        db.messaging.messages = eb;\n    });\n    function sa(cb, db, eb) {\n        db.forEach(function(fb) {\n            var gb = ra(cb, fb);\n            gb.setReachedEndOfArray();\n            cb._threadInformer.reorderedMessages(fb, eb);\n        });\n    };\n    function ta(cb) {\n        this._fbid = cb;\n        this._serverRequests = da.getForFBID(this._fbid);\n        this._threadInformer = ea.getForFBID(this._fbid);\n        this._threads = fa.getForFBID(this._fbid);\n        this._failedHistoryFetchThreads = {\n        };\n        this._threadsToMessages = {\n        };\n        this._titanMessagesCount = {\n        };\n        this._localTitanMessagesCount = {\n        };\n        this._messages = {\n        };\n        this._attachmentData = {\n        };\n        this._messagesNeedingAttachmentData = {\n        };\n        this._localIdsMap = {\n        };\n        this._serverRequests.subscribe(\"update-messages\", function(db, eb) {\n            var fb = ((eb.actions || [])).filter(function(hb) {\n                var ib = hb.action_type;\n                return (((hb.is_forward || hb.thread_id)) && (((((((ib == l.LOG_MESSAGE) || (ib == l.USER_GENERATED_MESSAGE)) || (ib == l.SEND_MESSAGE)) || (ib == l.CLEAR_CHAT)) || (ib == l.DELETE_THREAD)) || (ib == l.DELETE_MESSAGES))));\n            }), gb = pa(eb.payload_source);\n            if (qa(eb.payload_source)) {\n                fb.forEach(function(hb) {\n                    if (!hb.is_forward) {\n                        var ib = this._threads.getThreadMetaNow(hb.thread_id);\n                        if (ib) {\n                            hb.is_cleared = (hb.timestamp < ib.chat_clear_time);\n                        };\n                    }\n                ;\n                }.bind(this));\n            };\n            this.handleUpdates(fb, gb, eb.payload_source, eb.from_client);\n            if (eb.end_of_history) {\n                sa(this, eb.end_of_history, eb.payload_source);\n            };\n        }.bind(this));\n    };\n    ga(ta.prototype, {\n        getMessagesFromIDs: function(cb) {\n            return ((cb || [])).map(la.curry(this)).filter(function(db) {\n                return db;\n            });\n        },\n        hasLoadedNMessages: function(cb, db) {\n            var eb = ra(this, cb);\n            return (eb.hasReachedEndOfArray() || (eb.getCurrentArraySize() >= db));\n        },\n        hasLoadedExactlyNMessages: function(cb, db) {\n            var eb = ra(this, cb);\n            return (eb.getCurrentArraySize() == db);\n        },\n        getThreadMessagesRange: function(cb, db, eb, fb, gb, hb) {\n            var ib = ra(this, cb), jb = function(pb) {\n                fb(ua(this, pb));\n            }.bind(this), kb = ib.executeOrEnqueue(db, eb, jb), lb = ib.getUnavailableResources(kb), mb = this._failedHistoryFetchThreads[cb];\n            if ((lb.length && !mb)) {\n                var nb = (((this._titanMessagesCount[cb] || 0)) - ((this._localTitanMessagesCount[cb] || 0))), ob = (lb.length + ((this._localTitanMessagesCount[cb] || 0)));\n                this._serverRequests.fetchThreadMessages(cb, nb, ob, gb, hb);\n            }\n             else this._failedHistoryFetchThreads[cb] = false;\n        ;\n            return kb;\n        },\n        getThreadMessagesSinceTimestamp: function(cb, db) {\n            var eb = ra(this, cb), fb = eb.getElementsUntil(db);\n            return ua(this, fb);\n        },\n        hasLoadedAllMessages: function(cb) {\n            return ra(this, cb).hasReachedEndOfArray();\n        },\n        getCurrentlyLoadedMessages: function(cb) {\n            var db = ra(this, cb).getAllResources();\n            return ua(this, db);\n        },\n        unsubscribe: function(cb, db) {\n            n.isThreadID(db);\n            var eb = ra(this, db);\n            eb.unsubscribe(cb);\n        },\n        addAttachmentData: function(cb, db, eb) {\n            var fb = la(this, cb);\n            if (fb) {\n                var gb = fb.attachments.indexOf(db);\n                if ((gb != -1)) {\n                    fb.attachments[gb] = eb;\n                    this._threadInformer.updatedMessage(fb.thread_id, fb.message_id, \"attach\");\n                }\n            ;\n            }\n             else {\n                if (!this._attachmentData[cb]) {\n                    this._attachmentData[cb] = [];\n                };\n                this._attachmentData[cb].push({\n                    attach_key: db,\n                    data: eb\n                });\n            }\n        ;\n        },\n        handleUpdates: function(cb, db, eb, fb) {\n            var gb, hb = {\n            }, ib = {\n            };\n            for (var jb = 0; (jb < cb.length); jb++) {\n                var kb = cb[jb];\n                if ((kb.is_forward || (eb == v.SERVER_SEARCH))) {\n                    if (!this._messages[kb.message_id]) {\n                        this._messages[kb.message_id] = kb;\n                        za(this, kb);\n                    }\n                ;\n                    continue;\n                }\n            ;\n                if ((kb.client_state === t.SEND_TO_SERVER)) {\n                    this._messages[kb.message_id] = kb;\n                    za(this, kb);\n                    continue;\n                }\n            ;\n                var lb = kb.action_type;\n                if ((lb == l.SEND_MESSAGE)) {\n                    var mb = kb.client_message_id;\n                    if (((mb && this._localIdsMap[mb]) && kb.status)) {\n                        if ((kb.status == m.UNCONFIRMED)) {\n                            if (!ib[kb.thread_id]) {\n                                ib[kb.thread_id] = [];\n                            };\n                            ib[kb.thread_id].push(kb.client_message_id);\n                        }\n                         else if (!hb[kb.thread_id]) {\n                            hb[kb.thread_id] = [];\n                        }\n                    ;\n                        var nb = la(this, kb.client_message_id), ob = nb.status;\n                        nb.status = kb.status;\n                        if (((kb.status === m.SUCCESS) || kb.error_data)) {\n                            nb.error_data = kb.error_data;\n                        };\n                        if ((kb.status == m.SUCCESS)) {\n                            this.updateLocalMessage(kb, eb);\n                            if ((kb.client_thread_id == q.PENDING_THREAD_ID)) {\n                                nb.thread_id = kb.thread_id;\n                                hb[kb.thread_id].push(nb.message_id);\n                                ma.setResource(nb.message_id, nb.thread_id);\n                            }\n                        ;\n                        }\n                    ;\n                        if ((((((typeof ob != \"undefined\") || (kb.status == m.FAILED_UNKNOWN_REASON)) || (kb.status == m.UNABLE_TO_CONFIRM)) || (kb.status == m.SUCCESS)) || (kb.status == m.ERROR))) {\n                            this._threadInformer.updatedMessage(kb.thread_id, la(this, kb.client_message_id).message_id, eb);\n                        };\n                    }\n                ;\n                    continue;\n                }\n                 else if ((lb == l.DELETE_THREAD)) {\n                    ra(this, kb.thread_id).removeAllResources();\n                    continue;\n                }\n                 else if ((lb == l.DELETE_MESSAGES)) {\n                    var pb = kb.message_ids.map(function(wb) {\n                        return la(this, wb).message_id;\n                    }.bind(this));\n                    gb = ra(this, kb.thread_id);\n                    gb.removeResources(pb);\n                    this._threadInformer.reorderedMessages(kb.thread_id, eb);\n                    continue;\n                }\n                 else if ((lb == l.LOG_MESSAGE)) {\n                    if ((kb.log_message_type == s.SERVER_ERROR)) {\n                        this._failedHistoryFetchThreads[kb.thread_id] = true;\n                    };\n                }\n                 else if ((lb == l.CLEAR_CHAT)) {\n                    var qb = ra(this, kb.thread_id).getAllResources();\n                    qb.map(la.curry(this)).forEach(function(wb) {\n                        wb.is_cleared = true;\n                    });\n                    continue;\n                }\n                \n                \n                \n                \n            ;\n                var rb = la(this, kb.message_id);\n                if ((((kb.threading_id && this._localIdsMap[kb.threading_id])) || ((rb && !rb.is_forward)))) {\n                    continue;\n                };\n                if (!hb[kb.thread_id]) {\n                    hb[kb.thread_id] = [];\n                };\n                hb[kb.thread_id].push(kb.message_id);\n                this._messages[kb.message_id] = kb;\n                za(this, kb);\n                if ((kb.threading_id && (kb.threading_id != kb.message_id))) {\n                    z.addServerID(kb.threading_id, kb.message_id);\n                };\n                if (!db) {\n                    this._threadInformer.receivedMessage(kb);\n                };\n            };\n            for (var sb in hb) {\n                gb = ra(this, sb);\n                var tb = gb.getAllResources(), ub = tb.filter(function(wb) {\n                    var xb = this._messages[wb];\n                    return ((xb.action_type == l.LOG_MESSAGE) && (xb.log_message_type == s.SERVER_ERROR));\n                }.bind(this));\n                gb.removeResources(ub);\n                va(this, sb, hb[sb]);\n                if (fb) {\n                    wa(this, sb, hb[sb]);\n                };\n                if (db) {\n                    gb.addResources(hb[sb]);\n                    this._threadInformer.reorderedMessages(sb, eb);\n                }\n                 else gb.addResourcesWithoutSorting(hb[sb].reverse(), 0);\n            ;\n                this._threadInformer.updatedThread(sb);\n            };\n            var vb = Object.keys(ib);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(ib);\n            };\n        },\n        sendMessage: function(cb, db, eb) {\n            db = (db || Function.prototype);\n            na(this, cb);\n            this._localIdsMap[cb.message_id] = cb.message_id;\n            if ((cb.thread_id == (\"root:\" + cb.message_id))) {\n                ra(this, cb.thread_id).setReachedEndOfArray();\n            };\n            this._serverRequests.sendNewMessage(cb, eb);\n            if ((cb.thread_id == q.PENDING_THREAD_ID)) {\n                this._messages[cb.message_id] = cb;\n                return ma.executeOrEnqueue(cb.message_id, db);\n            }\n             else db(cb.thread_id);\n        ;\n        },\n        isFirstMessage: function(cb) {\n            var db = ra(this, cb.thread_id);\n            if ((db.getCurrentArraySize() === 0)) {\n                return false\n            };\n            var eb = db.getResourceAtIndex((db.getCurrentArraySize() - 1)), fb = la(this, eb).message_id, gb = la(this, cb.message_id).message_id;\n            return (db.hasReachedEndOfArray() && (fb == gb));\n        },\n        unsubscribeSend: function(cb) {\n            ma.unsubscribe(cb);\n        },\n        resendMessage: function(cb, db) {\n            var eb = ga({\n            }, cb);\n            eb.status = m.RESENDING;\n            eb.timestamp = Date.now();\n            eb.message_id = cb.message_id;\n            this._messages[cb.message_id] = eb;\n            var fb = ra(this, cb.thread_id);\n            fb.resortResources([cb.message_id,]);\n            this.sendMessage(eb, null, db);\n            this._threadInformer.reorderedMessages(cb.thread_id, v.CLIENT_SEND_MESSAGE);\n        },\n        deleteMessages: function(cb, db) {\n            if (db.length) {\n                var eb = ra(this, cb), fb = ((eb.getCurrentArraySize() == db.length) && eb.hasReachedEndOfArray());\n                this._serverRequests.deleteMessages(cb, db, fb);\n            }\n        ;\n        },\n        markMessagesSpam: function(cb, db) {\n            if (db.length) {\n                var eb = ra(this, cb), fb = ((eb.getCurrentArraySize() == db.length) && eb.hasReachedEndOfArray());\n                if (fb) {\n                    this._serverRequests.markThreadSpam(cb);\n                }\n                 else this._serverRequests.markMessagesSpam(cb, db);\n            ;\n            }\n        ;\n        },\n        updateLocalMessage: function(cb, db) {\n            var eb = cb.message_id, fb = cb.client_message_id;\n            this._localIdsMap[fb] = eb;\n            this._messages[eb] = this._messages[fb];\n            z.addServerID(fb, eb);\n            this._messages[fb] = {\n            };\n            var gb = la(this, fb);\n            if (cb.timestamp) {\n                gb.timestamp = cb.timestamp;\n            };\n            if ((cb.attachments && cb.attachments.length)) {\n                gb.raw_attachments = null;\n                gb.attachments = cb.attachments;\n                za(this, gb, eb);\n            }\n        ;\n            if (cb.log_message_data) {\n                gb.log_message_data = cb.log_message_data;\n            };\n            if (xa(gb)) {\n                this._localTitanMessagesCount[gb.thread_id]--;\n            };\n        },\n        constructUserGeneratedMessageObject: function(cb, db, eb, fb) {\n            var gb = oa(this, l.USER_GENERATED_MESSAGE, db, eb);\n            gb.body = cb;\n            gb.has_attachment = false;\n            gb.html_body = false;\n            gb.attachments = [];\n            gb.specific_to_list = (fb || []);\n            return gb;\n        },\n        constructLogMessageObject: function(cb, db, eb, fb) {\n            var gb = oa(this, l.LOG_MESSAGE, cb, db);\n            gb.log_message_type = eb;\n            gb.log_message_data = fb;\n            return gb;\n        },\n        generateNewClientMessageID: function(cb) {\n            var db = ((((cb + \":\") + ((ja(0, 4294967295) + 1))) + \"-\") + ba.getSessionID());\n            return ((\"\\u003C\" + db) + \"@mail.projektitan.com\\u003E\");\n        },\n        getNumberLocalMessages: function(cb) {\n            return (this._localTitanMessagesCount[cb] || 0);\n        }\n    });\n    ga(ta, w, {\n        addAttachmentData: function(cb, db, eb, fb) {\n            fb = (fb || i.user);\n            ta.getForFBID(fb).addAttachmentData(cb, db, eb);\n        }\n    });\n    function ua(cb, db) {\n        var eb = db.map(la.curry(cb));\n        return eb.reverse();\n    };\n    function va(cb, db, eb) {\n        var fb = eb.filter(function(gb) {\n            return xa(la(cb, gb));\n        });\n        if (!cb._titanMessagesCount[db]) {\n            cb._titanMessagesCount[db] = 0;\n        };\n        cb._titanMessagesCount[db] += fb.length;\n    };\n    function wa(cb, db, eb) {\n        var fb = eb.filter(function(gb) {\n            return xa(la(cb, gb));\n        });\n        if (!cb._localTitanMessagesCount[db]) {\n            cb._localTitanMessagesCount[db] = 0;\n        };\n        cb._localTitanMessagesCount[db] += fb.length;\n    };\n    function xa(cb) {\n        var db = cb.action_type;\n        if ((db == l.USER_GENERATED_MESSAGE)) {\n            return true\n        };\n        switch (cb.log_message_type) {\n          case s.SUBSCRIBE:\n        \n          case s.UNSUBSCRIBE:\n        \n          case s.SERVER_ERROR:\n        \n          case s.LIVE_LISTEN:\n            return false;\n          default:\n            return true;\n        };\n    };\n    function ya(cb) {\n        switch (cb) {\n          case x.CHAT_WEB:\n        \n          case x.CHAT_JABBER:\n        \n          case x.CHAT_IPHONE:\n        \n          case x.CHAT_MEEBO:\n        \n          case x.CHAT_ORCA:\n        \n          case x.CHAT_TEST:\n        \n          case x.CHAT:\n        \n          case x.DESKTOP:\n            return true;\n          default:\n            return false;\n        };\n    };\n    function za(cb, db, eb) {\n        eb = (eb || db.message_id);\n        var fb = cb._attachmentData[eb];\n        if (fb) {\n            fb.forEach(function(gb) {\n                var hb = db.attachments.indexOf(gb.attach_key);\n                if ((hb !== -1)) {\n                    db.attachments[hb] = gb.data;\n                };\n            });\n            delete cb._attachmentData[eb];\n        }\n         else if ((!db.is_forward && ab(cb, db))) {\n            cb._messagesNeedingAttachmentData[eb] = true;\n            bb(cb);\n        }\n        \n    ;\n    };\n    function ab(cb, db) {\n        if ((!db || !db.attachments)) {\n            return false\n        };\n        for (var eb = 0; (eb < db.attachments.length); eb++) {\n            var fb = db.attachments[eb];\n            if (((typeof fb === \"string\") && (fb.indexOf(o.SHARE) === 0))) {\n                return true\n            };\n        };\n        var gb = (db.forward_message_ids || []);\n        for (eb = 0; (eb < gb.length); eb++) {\n            var hb = la(cb, gb[eb]);\n            if (ab(cb, hb)) {\n                return true\n            };\n        };\n        return false;\n    };\n    var bb = ha(function(cb) {\n        var db = {\n        };\n        for (var eb in cb._messagesNeedingAttachmentData) {\n            var fb = la(cb, eb);\n            if (ab(cb, fb)) {\n                db[eb] = true;\n            };\n        };\n        var gb = Object.keys(db);\n        if (gb.length) {\n            new h(\"/ajax/mercury/attachments/fetch_shares.php\").setData({\n                message_ids: gb\n            }).setAllowCrossPageTransition(true).send();\n        };\n        cb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = ta;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"Event\",\"MercuryIDs\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"Bootloader\"), j = b(\"ChatVisibility\"), k = b(\"Event\"), l = b(\"MercuryIDs\"), m = b(\"MercuryMessages\").get(), n = b(\"MercuryServerRequests\").get(), o = b(\"MercuryThreads\").get(), p = \"messaging_tracking\";\n    function q(u) {\n        o.getThreadMeta(u, function() {\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        });\n    };\n    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return\n            };\n            return y.kill();\n        });\n    };\n    function s(u, v, w) {\n        var x = {\n            referrer: (u || \"\"),\n            message_thread_id: v,\n            message_view: \"chat\",\n            timestamp_send: Date.now()\n        };\n        if ((w !== undefined)) {\n            x.message_target_ids = [w,];\n        };\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n    var t = {\n        openEmptyTab: function(u, v) {\n            if ((!window.Chat || !j.isOnline())) {\n                return true\n            };\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = (\"root:\" + m.generateNewClientMessageID(Date.now()));\n                    o.createNewLocalThread(x, []);\n                }\n            ;\n                q(x);\n                s(v, x);\n            });\n        },\n        listenOpenEmptyTab: function(u, v) {\n            r(u, null, v, t.openEmptyTab);\n        },\n        openThread: function(u, v) {\n            if (l.isValid(u)) {\n                q(u);\n            }\n             else n.getClientThreadID(u, q);\n        ;\n            s(v, u);\n        },\n        listenOpenThread: function(u, v, w) {\n            r(u, v, w, t.openThread);\n        },\n        openUserTab: function(u, v) {\n            var w = o.getCanonicalThreadToUser(u);\n            q(w.thread_id);\n            s(v, w.thread_id, u);\n        },\n        listenOpenUserTab: function(u, v, w) {\n            r(u, v, w, t.openUserTab);\n        }\n    };\n    e.exports = t;\n});\n__d(\"SplitImage.react\", [\"React\",\"Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"Image.react\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"SplitImage\",\n        render: function() {\n            var k = this.props.size;\n            return this.transferPropsTo(g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__root\",\n                style: {\n                    width: k,\n                    height: k\n                }\n            }, this.renderImages()));\n        },\n        renderImages: function() {\n            if (!this.props.srcs) {\n                return null\n            };\n            if (!((this.props.srcs instanceof Array))) {\n                return (h({\n                    src: this.props.srcs,\n                    height: this.props.size,\n                    width: this.props.size\n                }))\n            };\n            switch (this.props.srcs.length) {\n              case 1:\n                return (h({\n                    src: this.props.srcs[0],\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n              case 2:\n                return this.renderTwo();\n              default:\n                return this.renderThree();\n            };\n        },\n        renderTwo: function() {\n            var k = Math.floor((this.props.size / 2)), l = -Math.floor((k / 2)), m = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? (\" \" + \"-cx-PRIVATE-splitImage__borderleft\") : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: m,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            }))));\n        },\n        renderThree: function() {\n            var k = Math.floor(((this.props.size / 3) * 2)), l = -Math.floor((((this.props.size - k)) / 2)), m = Math.floor((this.props.size / 2)), n = (this.props.size - k), o = -Math.floor((((m - n)) / 2)), p = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? (\" \" + \"-cx-PRIVATE-splitImage__borderright\") : \"\")))), q = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? (\" \" + \"-cx-PRIVATE-splitImage__borderbottom\") : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: p,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: q,\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            })), g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[2],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            }))));\n        }\n    });\n    e.exports = j;\n});\n__d(\"loadImage\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = new Image();\n        j.onload = function() {\n            i(j.width, j.height, j);\n        };\n        j.src = h;\n    };\n    e.exports = g;\n});\n__d(\"PixelzFocus\", [], function(a, b, c, d, e, f) {\n    var g = {\n        search: function(h, i) {\n            var j = 0, k = (h.length - 1);\n            while ((j <= k)) {\n                var l = (j + Math.floor((((k - j)) / 2))), m = h[l];\n                if ((m > i)) {\n                    k = (l - 1);\n                }\n                 else if ((m < i)) {\n                    j = (l + 1);\n                }\n                 else return l\n                \n            ;\n            };\n            return Math.min(j, k);\n        },\n        forceSpecificPoint: function(h, i, j) {\n            var k = 1e-9, l = (g.search(h, ((i - j) - k)) + 1), m = g.search(h, (i + j));\n            return h.slice(l, (m + 1));\n        },\n        findBiggestSets: function(h, i) {\n            var j = [], k = -1;\n            for (var l = 0; (l < h.length); ++l) {\n                var m = h[l], n = l, o = g.search(h, (m + i)), p = (o - n);\n                if ((p > k)) {\n                    j = [];\n                };\n                if ((p >= k)) {\n                    k = p;\n                    j.push({\n                        low: n,\n                        high: o\n                    });\n                }\n            ;\n            };\n            return j;\n        },\n        getBestSet: function(h, i, j) {\n            var k = -1, l = null;\n            for (var m = 0; (m < i.length); ++m) {\n                var n = i[m], o = h[n.low], p = h[n.high], q = (o + (((p - o)) / 2)), r = Math.min((o - ((q - j))), (((q + j)) - p));\n                if ((r > k)) {\n                    k = r;\n                    l = n;\n                }\n            ;\n            };\n            return l;\n        },\n        getFocusFromSet: function(h, i) {\n            var j = h[i.low], k = h[i.high];\n            return (j + (((k - j)) / 2));\n        },\n        clampFocus: function(h, i) {\n            var j = (i / 2), k = (1 - ((i / 2)));\n            if ((h < j)) {\n                return j\n            };\n            if ((h > k)) {\n                return k\n            };\n            return h;\n        },\n        convertFromCenterToCSS: function(h, i) {\n            if ((Math.abs((1 - i)) < 0.00001)) {\n                return 0\n            };\n            return (((h - (i / 2))) / ((1 - i)));\n        },\n        convertFromCSSToCenter: function(h, i) {\n            return ((h * ((1 - i))) + (i / 2));\n        },\n        getVisible: function(h, i) {\n            if ((h < i)) {\n                return (h / i)\n            };\n            return (i / h);\n        },\n        getHidden: function(h, i) {\n            return (1 - g.getVisible(h, i));\n        },\n        focusHorizontally: function(h, i) {\n            return (h < i);\n        },\n        convertVectorFromCenterToCSS: function(h, i, j) {\n            var k = g.focusHorizontally(i, j), l;\n            if (k) {\n                l = (h.x / 100);\n            }\n             else l = (h.x / 100);\n        ;\n            var m = g.convertFromCenterToCSS(l, g.getVisible(i, j));\n            if (k) {\n                return {\n                    x: m,\n                    y: 0\n                };\n            }\n             else return {\n                x: 0,\n                y: m\n            }\n        ;\n        },\n        getCropRect: function(h, i, j) {\n            var k = g.focusHorizontally(i, j), l = g.getVisible(i, j);\n            if (k) {\n                var m = (((1 - l)) * h.x);\n                return {\n                    left: m,\n                    top: 0,\n                    width: l,\n                    height: 1\n                };\n            }\n             else {\n                var n = (((1 - l)) * h.y);\n                return {\n                    left: 0,\n                    top: n,\n                    width: 1,\n                    height: l\n                };\n            }\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"Pixelz.react\", [\"arrayContains\",\"copyProperties\",\"cx\",\"invariant\",\"loadImage\",\"React\",\"ReactPropTypes\",\"PixelzFocus\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"copyProperties\"), i = b(\"cx\"), j = b(\"invariant\"), k = b(\"loadImage\"), l = b(\"React\"), m = b(\"ReactPropTypes\"), n = b(\"PixelzFocus\"), o = l.createClass({\n        displayName: \"Pixelz\",\n        propTypes: {\n            width: m.number,\n            height: m.number,\n            resizeMode: m.oneOf([\"contain\",\"cover\",\"stretch\",]),\n            alt: m.string,\n            letterbox: m.bool,\n            borderRadius: m.number,\n            insetBorderColor: m.string,\n            animated: m.bool,\n            upscale: m.bool,\n            cropRect: function(p, q, r) {\n                var s = p[q], t = ((((((\"Invalid prop `\" + q) + \"` supplied to `\") + r) + \"`, expected a rectangle with values normalized \") + \"between 0 and 1\"));\n                j((s.left >= 0));\n                j((s.top >= 0));\n                j((s.width >= 0));\n                j((s.height >= 0));\n                j(((s.left + s.width) <= 1));\n                j(((s.top + s.height) <= 1));\n            },\n            focus: function(p, q, r) {\n                var s = p[q], t = (((((((\"Invalid prop `\" + q) + \"` supplied to `\") + r) + \"`, expected either a {x, y, type} vector where type \") + \"is `css` or `center` or an array of {x, y} vectors. All the vectors \") + \"have with values normalized between 0 and 1\"));\n                if (Array.isArray(s)) {\n                    for (var u = 0; (u < s.length); ++u) {\n                        j(((s[u].x >= 0) && (s[u].x <= 1)));\n                        j(((s[u].y >= 0) && (s[u].y <= 1)));\n                    };\n                }\n                 else {\n                    if (!s.type) {\n                        s.type = \"css\";\n                    };\n                    j(((s.x >= 0) && (s.x <= 1)));\n                    j(((s.y >= 0) && (s.y <= 1)));\n                    j(g([\"center\",\"css\",], s.type));\n                }\n            ;\n            }\n        },\n        getDefaultProps: function() {\n            return {\n                resizeMode: \"cover\",\n                alt: \"\",\n                letterbox: true,\n                upscale: true,\n                cropRect: {\n                    width: 1,\n                    height: 1,\n                    top: 0,\n                    left: 0\n                },\n                focus: {\n                    x: 25908,\n                    y: 25913,\n                    type: \"css\"\n                }\n            };\n        },\n        getInitialState: function() {\n            return {\n                srcDimensions: {\n                }\n            };\n        },\n        getSrcDimensions: function() {\n            var p = this.props.src, q = this.state.srcDimensions[p];\n            if (q) {\n                return q\n            };\n            k(p, function(r, s) {\n                var t = {\n                };\n                t[p] = {\n                    width: r,\n                    height: s\n                };\n                this.setState({\n                    srcDimensions: t\n                });\n            }.bind(this));\n            return null;\n        },\n        getCropSrcDimensions: function() {\n            var p = this.getSrcDimensions();\n            return {\n                width: (p.width * this.props.cropRect.width),\n                height: (p.height * this.props.cropRect.height)\n            };\n        },\n        getUpscaleCropDimensions: function() {\n            var p = this.getCropSrcDimensions(), q = (p.width / p.height), r = (this.props.width / this.props.height);\n            if (((this.props.width && this.props.height) && (this.props.resizeMode === \"stretch\"))) {\n                return {\n                    width: this.props.width,\n                    height: this.props.height\n                }\n            };\n            if ((((!this.props.width && this.props.height)) || ((((this.props.resizeMode === \"contain\")) !== ((q >= r)))))) {\n                return {\n                    width: (this.props.height * q),\n                    height: this.props.height\n                }\n            };\n            if (this.props.width) {\n                return {\n                    width: this.props.width,\n                    height: (this.props.width / q)\n                }\n            };\n            return p;\n        },\n        getCropDimensions: function() {\n            var p = this.getUpscaleCropDimensions(), q = this.getCropSrcDimensions();\n            if (!this.props.upscale) {\n                return {\n                    width: Math.min(p.width, q.width),\n                    height: Math.min(p.height, q.height)\n                }\n            };\n            return p;\n        },\n        getCropAspectRatio: function() {\n            var p = this.getCropDimensions();\n            return (p.width / p.height);\n        },\n        getContainerDimensions: function() {\n            if (((this.props.letterbox && this.props.width) && this.props.height)) {\n                return {\n                    width: this.props.width,\n                    height: this.props.height\n                }\n            };\n            return this.getCropDimensions();\n        },\n        getContainerAspectRatio: function() {\n            var p = this.getContainerDimensions();\n            return (p.width / p.height);\n        },\n        getContainerPosition: function() {\n            return {\n                left: 0,\n                top: 0\n            };\n        },\n        getFocus: function() {\n            var p = this.props.focus;\n            if ((!Array.isArray(p) && (p.type === \"css\"))) {\n                return {\n                    x: p.x,\n                    y: p.y\n                }\n            };\n            var q = this.getContainerAspectRatio(), r = this.getCropAspectRatio(), s = n.getVisible(q, r), t = n.focusHorizontally(q, r), u;\n            if (!Array.isArray(p)) {\n                u = n.convertFromCenterToCSS((t ? p.x : p.y), s);\n            }\n             else {\n                var v = p.map(function(y) {\n                    return (t ? y.x : y.y);\n                });\n                v.sort();\n                var w = n.findBiggestSets(v, s), x = n.getBestSet(v, w, s);\n                u = n.getFocusFromSet(v, x);\n            }\n        ;\n            return {\n                x: (t ? u : 27903),\n                y: (t ? 27910 : u)\n            };\n        },\n        getCropPosition: function() {\n            var p = this.getCropDimensions(), q = this.getContainerDimensions(), r = this.getFocus();\n            return {\n                left: (r.x * ((q.width - p.width))),\n                top: (r.y * ((q.height - p.height)))\n            };\n        },\n        getScaleDimensions: function() {\n            var p = this.getCropDimensions();\n            return {\n                width: (p.width / this.props.cropRect.width),\n                height: (p.height / this.props.cropRect.height)\n            };\n        },\n        getScalePosition: function() {\n            var p = this.getScaleDimensions();\n            return {\n                left: (-p.width * this.props.cropRect.left),\n                top: (-p.height * this.props.cropRect.top)\n            };\n        },\n        getClipCropRectangle: function() {\n            var p = this.getContainerDimensions(), q = this.getCropDimensions(), r = this.getContainerPosition(), s = this.getCropPosition(), t = Math.max(r.left, s.left), u = Math.max(r.top, s.top), v = Math.min((r.top + p.height), (s.top + q.height)), w = Math.min((r.left + p.width), (s.left + q.width));\n            return {\n                left: t,\n                top: u,\n                width: (w - t),\n                height: (v - u)\n            };\n        },\n        getClipCropPosition: function() {\n            var p = this.getClipCropRectangle();\n            return {\n                left: p.left,\n                top: p.top\n            };\n        },\n        getClipCropDimensions: function() {\n            var p = this.getClipCropRectangle();\n            return {\n                width: p.width,\n                height: p.height\n            };\n        },\n        getClipScalePosition: function() {\n            var p = this.getScalePosition(), q = this.getClipCropPosition(), r = this.getCropPosition();\n            return {\n                left: (p.left + ((r.left - q.left))),\n                top: (p.top + ((r.top - q.top)))\n            };\n        },\n        getClipScaleDimensions: function() {\n            return this.getScaleDimensions();\n        },\n        areDimensionsEqual: function(p, q) {\n            return ((p.width === q.width) && (p.height === q.height));\n        },\n        shouldAddAllNodesAndStyles: function() {\n            return this.props.animated;\n        },\n        hasCrop: function() {\n            if (this.shouldAddAllNodesAndStyles()) {\n                return true\n            };\n            var p = this.getContainerDimensions(), q = this.getClipCropDimensions(), r = this.getClipScaleDimensions();\n            if ((this.areDimensionsEqual(p, q) || this.areDimensionsEqual(q, r))) {\n                return false\n            };\n            return true;\n        },\n        hasContainer: function() {\n            if ((this.shouldAddAllNodesAndStyles() || this.hasInsetBorder())) {\n                return true\n            };\n            var p = this.getContainerDimensions(), q = this.getClipScaleDimensions();\n            if (this.areDimensionsEqual(p, q)) {\n                return false\n            };\n            return true;\n        },\n        hasInsetBorder: function() {\n            return (this.shouldAddAllNodesAndStyles() || this.props.insetBorderColor);\n        },\n        applyPositionStyle: function(p, q) {\n            if ((this.shouldAddAllNodesAndStyles() || q.left)) {\n                p.left = Math.round(q.left);\n            };\n            if ((this.shouldAddAllNodesAndStyles() || q.top)) {\n                p.top = Math.round(q.top);\n            };\n        },\n        applyDimensionsStyle: function(p, q) {\n            p.width = Math.round(q.width);\n            p.height = Math.round(q.height);\n        },\n        applyBorderRadiusStyle: function(p) {\n            if ((this.shouldAddAllNodesAndStyles() || this.props.borderRadius)) {\n                p.borderRadius = (this.props.borderRadius || 0);\n            };\n        },\n        getScaleStyle: function() {\n            var p = {\n            }, q = this.getClipCropDimensions(), r = this.getClipScaleDimensions();\n            if ((this.shouldAddAllNodesAndStyles() || !this.areDimensionsEqual(q, r))) {\n                this.applyPositionStyle(p, this.getClipScalePosition());\n            }\n             else this.applyPositionStyle(p, this.getClipCropPosition());\n        ;\n            this.applyDimensionsStyle(p, this.getClipScaleDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getCropStyle: function() {\n            var p = {\n            };\n            this.applyPositionStyle(p, this.getClipCropPosition());\n            this.applyDimensionsStyle(p, this.getClipCropDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getInsetBorderStyle: function() {\n            var p = {\n                borderColor: (this.props.insetBorderColor || \"transparent\")\n            };\n            this.applyPositionStyle(p, this.getClipCropPosition());\n            this.applyDimensionsStyle(p, this.getClipCropDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getContainerStyle: function() {\n            var p = {\n            };\n            this.applyDimensionsStyle(p, this.getContainerDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getScale: function() {\n            var p = this.getScaleStyle(), q = p.width, r = p.height;\n            p = h({\n            }, p);\n            delete p.width;\n            delete p.height;\n            return this.transferPropsTo(l.DOM.img({\n                alt: this.props.alt,\n                className: (((\"-cx-PRIVATE-pixelz__scaledimage\") + ((this.shouldAddAllNodesAndStyles() ? (\" \" + \"-cx-PRIVATE-pixelz__animated\") : \"\")))),\n                src: this.props.src,\n                style: p,\n                width: q,\n                height: r\n            }));\n        },\n        getCrop: function() {\n            var p = this.getScale();\n            if (!this.hasCrop()) {\n                return p\n            };\n            return (l.DOM.div({\n                className: (((\"-cx-PRIVATE-pixelz__croppedimage\") + ((this.shouldAddAllNodesAndStyles() ? (\" \" + \"-cx-PRIVATE-pixelz__animated\") : \"\")))),\n                style: this.getCropStyle()\n            }, p));\n        },\n        getInsetBorder: function() {\n            if (!this.hasInsetBorder()) {\n                return null\n            };\n            return (l.DOM.div({\n                className: (((\"-cx-PRIVATE-pixelz__insetborder\") + ((this.shouldAddAllNodesAndStyles() ? (\" \" + \"-cx-PRIVATE-pixelz__animated\") : \"\")))),\n                style: this.getInsetBorderStyle()\n            }));\n        },\n        getContainer: function() {\n            var p = this.getCrop();\n            if (!this.hasContainer()) {\n                return p\n            };\n            var q = this.getInsetBorder();\n            return (l.DOM.div({\n                className: (((\"-cx-PRIVATE-pixelz__container\") + ((this.shouldAddAllNodesAndStyles() ? (\" \" + \"-cx-PRIVATE-pixelz__animated\") : \"\")))),\n                style: this.getContainerStyle()\n            }, p, q));\n        },\n        render: function() {\n            var p = this.getSrcDimensions();\n            if (!p) {\n                return l.DOM.span(null)\n            };\n            return this.getContainer();\n        }\n    });\n    e.exports = o;\n});\n__d(\"ModalMask\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = null, i = 0, j = {\n        show: function() {\n            i++;\n            if (!h) {\n                h = g.create(\"div\", {\n                    id: \"modalMaskOverlay\"\n                });\n                g.appendContent(document.body, h);\n            }\n        ;\n        },\n        hide: function() {\n            if (i) {\n                i--;\n                if ((!i && h)) {\n                    g.remove(h);\n                    h = null;\n                }\n            ;\n            }\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"WebMessengerPermalinkConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        ARCHIVED_PATH: \"/messages/archived\",\n        BASE_PATH: \"/messages\",\n        OTHER_PATH: \"/messages/other\",\n        SPAM_PATH: \"/messages/spam\",\n        COMPOSE_POSTFIX_PATH: \"/new\",\n        SEARCH_POSTFIX_PATH: \"/search\",\n        TID_POSTFIX_PARTIAL_PATH: \"/conversation-\",\n        overriddenVanities: \"(archived|other|spam|new|search|conversation-.*)\",\n        getURIPathForThreadID: function(i, j) {\n            return ((((j || h.BASE_PATH)) + h.TID_POSTFIX_PARTIAL_PATH) + g.encodeComponent(g.encodeComponent(i)));\n        },\n        getThreadIDFromURI: function(i) {\n            var j = i.getPath().match((((h.BASE_PATH + \"(/[^/]*)*\") + h.TID_POSTFIX_PARTIAL_PATH) + \"([^/]+)\"));\n            if (j) {\n                var k = g.decodeComponent(g.decodeComponent(j[2]));\n                return k;\n            }\n        ;\n        },\n        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((\"^\" + h.overriddenVanities) + \"$\"))) {\n                i = (\".\" + i);\n            };\n            return ((((j || h.BASE_PATH)) + \"/\") + i);\n        },\n        getUserIDOrVanity: function(i) {\n            var j = i.match((h.BASE_PATH + \".*/([^/]+)/?$\")), k = (j && j[1]), l = h.overriddenVanities;\n            if ((!k || k.match(((\"^\" + l) + \"$\")))) {\n                return false;\n            }\n             else if (k.match(((\"^\\\\.\" + l) + \"$\"))) {\n                return k.substr(1);\n            }\n             else return k\n            \n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryErrorInfo\", [\"MercuryErrorType\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryErrorType\"), h = b(\"tx\"), i = {\n        getMessage: function(j) {\n            var k = \"This message failed to send.\";\n            if (i.isConnectionError(j)) {\n                k = \"Unable to connect to Facebook. This message failed to send. \";\n            }\n             else if (j.description) {\n                k = j.description;\n            }\n        ;\n            return k;\n        },\n        isConnectionError: function(j) {\n            if ((j && (j.type == g.TRANSPORT))) {\n                return (((j.code === 1001) || (j.code === 1004)) || (j.code === 1006))\n            };\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"MercuryChannelHandler\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercuryPayloadSource\",\"MessagingReliabilityLogger\",\"MessagingEvent\",\"MessagingTag\",\"MercuryParticipants\",\"PresenceUtil\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryGlobalActionType\"), k = b(\"MercuryPayloadSource\"), l = b(\"MessagingReliabilityLogger\"), m = b(\"MessagingEvent\"), n = b(\"MessagingTag\"), o = b(\"MercuryParticipants\"), p = b(\"PresenceUtil\"), q = b(\"MercuryServerRequests\").get(), r = b(\"MercuryThreadInformer\").get(), s = b(\"copyProperties\");\n    function t(ia, ja) {\n        if ((((ia != h.getArbiterType(\"messaging\")) || !ja.obj) || !ja.obj.message)) {\n            l.addEntry(\"channel_receive\", \"invalid_data\");\n            return;\n        }\n    ;\n        var ka = ja.obj.message, la = {\n            author: ka.mercury_author_id,\n            author_email: ka.mercury_author_email,\n            body: ka.body,\n            subject: ka.subject,\n            has_attachment: ka.has_attachment,\n            attachments: ka.attachments,\n            html_body: ka.html_body,\n            thread_id: ka.tid,\n            message_id: ka.mid,\n            coordinates: ka.mercury_coordinates,\n            spoof_warning: ka.mercury_spoof_warning,\n            source: ka.mercury_source,\n            source_tags: ka.mercury_source_tags,\n            threading_id: ka.threading_id,\n            timestamp: ka.timestamp,\n            timestamp_absolute: ka.timestamp_absolute,\n            timestamp_relative: ka.timestamp_relative,\n            timestamp_time_passed: ka.timestamp_time_passed,\n            action_type: i.USER_GENERATED_MESSAGE,\n            is_unread: ka.is_unread,\n            action_id: ka.action_id,\n            is_forward: false,\n            forward_count: (ka.forward_count || ka.forward),\n            forward_message_ids: ka.forward_msg_ids,\n            location_text: ka.location_text,\n            folder: ja.obj.folder\n        }, ma = [s({\n        }, la),];\n        ma = ma.concat((ka.forward_actions || []));\n        var na = k.CLIENT_CHANNEL_MESSAGE;\n        q.handleUpdateWaitForThread({\n            actions: ma,\n            payload_source: na\n        }, ka.tid);\n        if ((!ka.is_unread && (ka.mercury_author_id === o.user))) {\n            var oa = {\n            };\n            oa[ka.tid] = ja.obj.folder;\n            u(h.getArbiterType(\"messaging\"), {\n                obj: {\n                    event: m.READ,\n                    tids: [ka.tid,],\n                    folder_info: oa,\n                    timestamp: ka.timestamp\n                }\n            });\n        }\n    ;\n        l.addEntry(\"channel_receive\", \"success\", [la.thread_id,la.message_id,p.getSessionID(),]);\n    };\n    function u(ia, ja) {\n        if ((((ia != h.getArbiterType(\"messaging\")) || !ja.obj) || !ja.obj.tids)) {\n            return\n        };\n        var ka = [], la = (ja.obj.event == m.READ);\n        ja.obj.tids.forEach(function(ma) {\n            ka.push({\n                action_type: i.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: ma,\n                mark_as_read: la,\n                timestamp: (ja.obj.timestamp || 0),\n                folder: ja.obj.folder_info[ma]\n            });\n        });\n        q.handleUpdate({\n            actions: ka,\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function v(ia, ja) {\n        if ((((ia != h.getArbiterType(\"messaging\")) || !ja.obj) || !ja.obj.tids)) {\n            return\n        };\n        var ka = [];\n        ja.obj.tids.forEach(function(la) {\n            ka.push({\n                action_type: i.DELETE_THREAD,\n                action_id: null,\n                thread_id: la\n            });\n        });\n        q.handleUpdate({\n            actions: ka,\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function w(ia, ja) {\n        if (((((ia != h.getArbiterType(\"messaging\")) || !ja.obj) || !ja.obj.tids) || !ja.obj.mids)) {\n            return\n        };\n        var ka = ja.obj.tids[0], la = {\n            action_type: i.DELETE_MESSAGES,\n            action_id: null,\n            thread_id: ka,\n            message_ids: ja.obj.mids\n        };\n        q.handleUpdate({\n            actions: [la,],\n            threads: [ja.obj.updated_thread,],\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function x(ia, ja) {\n        if ((((ia != h.getArbiterType(\"messaging\")) || !ja.obj) || !ja.obj.folder)) {\n            return\n        };\n        var ka = {\n            action_type: j.MARK_ALL_READ,\n            action_id: ja.obj.action_id,\n            folder: ja.obj.folder\n        };\n        q.handleUpdate({\n            global_actions: [ka,]\n        });\n    };\n    function y(ia, ja) {\n        if (((ia != h.getArbiterType(\"messaging\")) || !ja.obj.tids)) {\n            return\n        };\n        var ka = k.CLIENT_CHANNEL_MESSAGE;\n        ja.obj.tids.forEach(function(la) {\n            var ma = {\n                action_type: i.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: la,\n                archived: ja.obj.state\n            };\n            q.handleUpdateWaitForThread({\n                actions: [s({\n                }, ma),],\n                payload_source: ka\n            }, la);\n        });\n    };\n    function z(ia, ja) {\n        if (((ia != h.getArbiterType(\"messaging\")) || !ja.obj.tids)) {\n            return\n        };\n        var ka = k.CLIENT_CHANNEL_MESSAGE, la;\n        ja.obj.tids.forEach(function(ma) {\n            if ((ja.obj.event == m.TAG)) {\n                la = ja.obj.tag;\n            }\n             else la = (ja.obj.marked_as_spam ? n.SPAM : n.INBOX);\n        ;\n            var na = {\n                action_type: i.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: ma,\n                new_folder: la\n            };\n            q.handleUpdateWaitForThread({\n                actions: [s({\n                }, na),],\n                payload_source: ka\n            }, ma);\n        });\n    };\n    function aa(ia, ja) {\n        if (((ia != h.getArbiterType(\"messaging\")) || !ja.obj.tag)) {\n            return\n        };\n        switch (ja.obj.tag) {\n          case n.ACTION_ARCHIVED:\n            y(ia, ja);\n            break;\n          case n.INBOX:\n        \n          case n.OTHER:\n            z(ia, ja);\n            break;\n        };\n    };\n    function ba(ia, ja) {\n        if ((((ia != h.getArbiterType(\"inbox\")) || !ja.obj) || !ja.obj.seen_timestamp)) {\n            return\n        };\n        q.handleUpdate({\n            message_counts: [{\n                seen_timestamp: ja.obj.seen_timestamp,\n                folder: n.INBOX\n            },],\n            unseen_thread_ids: [{\n                thread_ids: [],\n                folder: n.INBOX\n            },],\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function ca(ia, ja) {\n        if (((ia != h.getArbiterType(\"mercury\")) || !ja.obj)) {\n            return\n        };\n        r.synchronizeInforms(function() {\n            var ka = ja.obj, la = [];\n            ((ka.actions || [])).forEach(function(ma) {\n                var na = i.USER_GENERATED_MESSAGE;\n                if ((ma.action_type == i.LOG_MESSAGE)) {\n                    var oa = k.CLIENT_CHANNEL_MESSAGE;\n                    q.handleUpdateWaitForThread({\n                        actions: [s({\n                        }, ma),],\n                        payload_source: oa\n                    }, ma.thread_id);\n                }\n                 else if ((ma.action_type != na)) {\n                    la.push(ma);\n                }\n            ;\n            });\n            ka.actions = la;\n            ka.payload_source = k.CLIENT_CHANNEL_MESSAGE;\n            q.handleUpdate(ka);\n        });\n    };\n    function da(ia, ja) {\n        q.handleRoger(ja.obj);\n    };\n    function ea(ia, ja) {\n        if (((((ia != h.getArbiterType(\"messaging\")) || !ja.obj) || (ja.obj.mute_settings === undefined)) || !ja.obj.thread_id)) {\n            return\n        };\n        var ka = i.CHANGE_MUTE_SETTINGS, la = [{\n            action_type: ka,\n            action_id: null,\n            thread_id: ja.obj.thread_id,\n            mute_settings: ja.obj.mute_settings\n        },];\n        q.handleUpdate({\n            actions: la,\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n    function fa(ia, ja) {\n        switch (ja.obj.event) {\n          case m.DELIVER:\n            t(ia, ja);\n            break;\n          case m.READ:\n        \n          case m.UNREAD:\n            u(ia, ja);\n            break;\n          case m.READ_ALL:\n            x(ia, ja);\n            break;\n          case m.DELETE:\n            v(ia, ja);\n            break;\n          case m.DELETE_MESSAGES:\n            w(ia, ja);\n            break;\n          case m.TAG:\n            aa(ia, ja);\n            break;\n          case m.REPORT_SPAM:\n            z(ia, ja);\n            break;\n          case m.READ_RECEIPT:\n            da(ia, ja);\n            break;\n          case m.CHANGE_MUTE_SETTINGS:\n            ea(ia, ja);\n            break;\n        };\n    };\n    var ga = [], ha = {\n        turnOn: function() {\n            if (!ga.length) {\n                var ia = {\n                    mercury: ca,\n                    messaging: fa,\n                    inbox: ba\n                };\n                for (var ja in ia) {\n                    ga.push(g.subscribe(h.getArbiterType(ja), ia[ja]));;\n                };\n            }\n        ;\n        },\n        turnOff: function() {\n            if (ga.length) {\n                ga.forEach(g.unsubscribe);\n                ga = [];\n            }\n        ;\n        }\n    };\n    ha.turnOn();\n    e.exports = ha;\n});\n__d(\"MercuryRoger\", [\"ArbiterMixin\",\"MercuryActionStatus\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"MercuryActionStatus\"), i = b(\"MercuryServerRequests\").get(), j = b(\"copyProperties\"), k = {\n    }, l = {\n        getSeenBy: function(m, n) {\n            if (!m) {\n                return []\n            };\n            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            for (var r in p) {\n                if ((((p[r] > m.timestamp) && (((m.status === undefined) || (m.status === q)))) && ((!n || (r != m.author))))) {\n                    o.push(r);\n                };\n            };\n            return o;\n        },\n        getSeenTimestamp: function(m, n) {\n            var o = k[m];\n            return (o ? o[n] : null);\n        }\n    };\n    j(l, g);\n    i.subscribe(\"update-roger\", function(m, n) {\n        for (var o in n) {\n            if (!k[o]) {\n                k[o] = {\n                };\n            };\n            for (var p in n[o]) {\n                var q = k[o][p], r = n[o][p];\n                if ((!q || (r > q))) {\n                    k[o][p] = r;\n                };\n            };\n        };\n        if (n) {\n            l.inform(\"state-changed\", n);\n        };\n    });\n    e.exports = l;\n});\n__d(\"MercuryDelayedRoger\", [\"ArbiterMixin\",\"LiveTimer\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryMessages\",\"MercuryRoger\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LiveTimer\"), i = b(\"MercuryActionStatus\"), j = b(\"MercuryConfig\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryRoger\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = b(\"setTimeoutAcrossTransitions\"), q = {\n    }, r = {\n    }, s = j[\"roger.seen_delay\"], t = o({\n        getSeenBy: function(x, y) {\n            if (r[x]) {\n                return []\n            };\n            if (!q[x]) {\n                var z = n.getThreadMetaNow(x);\n                if (z) {\n                    q[x] = {\n                        thread_id: x,\n                        author: z.participants[0],\n                        timestamp: z.timestamp\n                    };\n                };\n            }\n        ;\n            return l.getSeenBy(q[x], y);\n        }\n    }, g);\n    function u(x) {\n        var y = false;\n        k.getThreadMessagesRange(x, 0, 1, function(z) {\n            var aa = z[0];\n            if (!aa) {\n                return\n            };\n            var ba = aa.timestamp;\n            if ((aa.action_id || (aa.status == i.SUCCESS))) {\n                ba -= h.getServerTimeOffset();\n            };\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n            var da = (ba + s), ea = (da - Date.now());\n            if ((ea > 0)) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            };\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if ((ca.length || fa.length)) {\n                y = true;\n            };\n        });\n        return y;\n    };\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n    function w(event, x) {\n        var y = {\n        };\n        for (var z in x) {\n            if (u(z)) {\n                y[z] = true;\n            };\n        };\n        for (var aa in y) {\n            t.inform(\"state-changed\", y);\n            break;\n        };\n    };\n    l.subscribe(\"state-changed\", function(x, y) {\n        for (var z in y) {\n            (!r[z] && v(z));;\n        };\n    });\n    m.subscribe(\"messages-received\", w);\n    m.subscribe(\"messages-reordered\", w);\n    m.subscribe(\"messages-updated\", w);\n    e.exports = t;\n});\n__d(\"MercuryFilters\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.UNREAD,], j = {\n        ALL: \"all\",\n        getSupportedFilters: function() {\n            return i.concat();\n        },\n        isSupportedFilter: function(k) {\n            return h(i, k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryOrderedThreadlist\", [\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryFilters\",\"MercuryFolders\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MessagingTag\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"MercuryActionTypeConstants\"), i = b(\"MercuryFilters\"), j = b(\"MercuryFolders\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercurySingletonMixin\"), m = b(\"MessagingTag\"), n = b(\"RangedCallbackManager\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"MercuryThreads\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = g.create(\"ordered_threadlist_model\"), u = i.getSupportedFilters().concat([i.ALL,m.GROUPS,]), v = j.getSupportedFolders();\n    function w(ga, ha, ia, ja) {\n        var ka = [], la = false, ma = false, na = ((ha || [])).filter(function(ua) {\n            var va = (ua.filter || i.ALL);\n            return ((((ua.folder == ia) || ((!ua.folder && (ia == m.INBOX))))) && (va == ja));\n        }), oa = ga._threadlistOrderMap[ia][ja].getAllResources(), pa;\n        na.forEach(function(ua) {\n            ka = ka.concat(ua.thread_ids);\n            if (ua.error) {\n                if ((ua.end > oa.length)) {\n                    ma = ua.error;\n                };\n            }\n             else {\n                var va = (ua.end - ua.start);\n                if ((ua.thread_ids.length < va)) {\n                    la = true;\n                };\n            }\n        ;\n            if ((!pa || (ua.end > pa))) {\n                pa = ua.end;\n            };\n        });\n        aa(ga, ka, ia, ja);\n        if (la) {\n            ga._threadlistOrderMap[ia][ja].setReachedEndOfArray();\n        }\n         else if (ma) {\n            ga._threadlistOrderMap[ia][ja].setError(ma);\n        }\n         else {\n            var qa = ga._threadlistOrderMap[ia][ja].getCurrentArraySize();\n            if ((pa && (qa < pa))) {\n                var ra = {\n                }, sa = oa.concat(ka), ta = sa.filter(function(ua) {\n                    var va = ra[ua];\n                    ra[ua] = true;\n                    return va;\n                });\n                if (ta.length) {\n                    t.warn(\"duplicate_threads\", {\n                        folder: ia,\n                        expected_final_size: pa,\n                        actual_final_size: qa,\n                        duplicate_thread_ids: ta\n                    });\n                    ga._serverRequests.fetchThreadlistInfo(pa, ta.length, ia, ((ja == i.ALL) ? null : ja));\n                }\n            ;\n            }\n        ;\n        }\n        \n    ;\n    };\n    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\n            });\n        });\n    };\n    function y(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = {\n                    to_add: [],\n                    to_remove: [],\n                    to_remove_if_last_after_add: {\n                    }\n                };\n            });\n        });\n        ha.forEach(function(ja) {\n            if (ja.is_forward) {\n                return\n            };\n            var ka = ja.thread_id, la = ba(ga, ka), ma = ca(ga, ka);\n            function na() {\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_add.push(ka);\n                    if ((!ga._threadlistOrderMap[la][pa].hasReachedEndOfArray() && !ga._threadlistOrderMap[la][pa].hasResource(ka))) {\n                        ia[la][pa].to_remove_if_last_after_add[ka] = true;\n                    };\n                });\n            };\n            function oa(pa) {\n                if (r(u, pa)) {\n                    if (r(ma, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                     else ia[la][pa].to_remove.push(ka);\n                \n                };\n            };\n            if (!la) {\n                if (((ja.action_type === h.CHANGE_FOLDER) || (ja.action_type === h.CHANGE_ARCHIVED_STATUS))) {\n                    v.forEach(function(pa) {\n                        if ((pa !== la)) {\n                            u.forEach(function(qa) {\n                                ga._threadlistOrderMap[pa][qa].removeResources([ka,]);\n                            });\n                        };\n                    });\n                };\n                return;\n            }\n        ;\n            switch (ja.action_type) {\n              case h.DELETE_THREAD:\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_remove.push(ka);\n                });\n                break;\n              case h.CHANGE_ARCHIVED_STATUS:\n            \n              case h.CHANGE_FOLDER:\n                na();\n                break;\n              case h.CHANGE_READ_STATUS:\n                oa(m.UNREAD);\n                break;\n              case h.USER_GENERATED_MESSAGE:\n            \n              case h.LOG_MESSAGE:\n                ma.forEach(function(pa) {\n                    if (da(ga, ka, la, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    };\n                });\n                break;\n            };\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                var la = ga._threadlistOrderMap[ja][ka];\n                aa(ga, ia[ja][ka].to_add, ja, ka);\n                for (var ma = (la.getCurrentArraySize() - 1); (ma >= 0); ma--) {\n                    var na = la.getResourceAtIndex(ma);\n                    if (!ia[ja][ka].to_remove_if_last_after_add[na]) {\n                        break;\n                    };\n                    ia[ja][ka].to_remove.push(na);\n                };\n                la.removeResources(ia[ja][ka].to_remove);\n            });\n        });\n    };\n    function z(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = [];\n            });\n        });\n        ha.forEach(function(ja) {\n            var ka = ba(ga, ja.thread_id), la = ca(ga, ja.thread_id);\n            if (ka) {\n                la.forEach(function(ma) {\n                    if (da(ga, ja.thread_id, ka, ma)) {\n                        ia[ka][ma].push(ja.thread_id);\n                    };\n                });\n            };\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                if ((ia[ja][ka].length > 0)) {\n                    aa(ga, ia[ja][ka], ja, ka);\n                };\n            });\n        });\n    };\n    function aa(ga, ha, ia, ja) {\n        ja = (ja || i.ALL);\n        ga._threadlistOrderMap[ia][ja].addResources(ha);\n        v.forEach(function(ka) {\n            if ((ka != ia)) {\n                ga._threadlistOrderMap[ka][ja].removeResources(ha);\n            };\n        });\n    };\n    function ba(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = null;\n        if (!ia) {\n            ja = \"No thread metadata\";\n        }\n         else if (!ia.folder) {\n            ja = \"No thread folder\";\n        }\n    ;\n        if (ja) {\n            var ka = {\n                error: ja,\n                tid: ha\n            };\n            t.warn(\"no_thread_folder\", ka);\n            return null;\n        }\n    ;\n        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        };\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\n    ;\n    };\n    function ca(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = [i.ALL,];\n        if (!ia) {\n            var ka = {\n                error: \"no_thread_metadata\",\n                tid: ha\n            };\n            t.warn(\"no_thread_metadata\", ka);\n            return [];\n        }\n    ;\n        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        };\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        };\n        return ja;\n    };\n    function da(ga, ha, ia, ja) {\n        var ka = ga._threads.getThreadMetaNow(ha);\n        return (((ka && ka.timestamp) && (ba(ga, ha) == ia)) && r(ca(ga, ha), ja));\n    };\n    function ea(ga) {\n        this._fbid = ga;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._threads = q.getForFBID(this._fbid);\n        this._threadlistOrderMap = {\n        };\n        v.forEach(function(ha) {\n            this._threadlistOrderMap[ha] = {\n            };\n            u.forEach(function(ia) {\n                this._threadlistOrderMap[ha][ia] = new n(function(ja) {\n                    return this._threads.getThreadMetaNow(ja).timestamp;\n                }.bind(this), function(ja, ka) {\n                    return (ka - ja);\n                }, this._serverRequests.canLinkExternally.bind(this._serverRequests));\n            }.bind(this));\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-threadlist\", function(ha, ia) {\n            if (!fa(ia)) {\n                return\n            };\n            var ja = ia.ordered_threadlists;\n            if ((ja && ja.length)) {\n                x(this, ja);\n            }\n             else {\n                var ka = ((ia.actions || [])).filter(function(la) {\n                    return la.thread_id;\n                });\n                z(this, (ia.threads || []));\n                y(this, ka);\n            }\n        ;\n            this._threadInformer.updatedThreadlist();\n        }.bind(this));\n    };\n    s(ea.prototype, {\n        getThreadlist: function(ga, ha, ia, ja, ka, la) {\n            return this.getFilteredThreadlist(ga, ha, ia, i.ALL, ja, ka, la);\n        },\n        getFilteredThreadlist: function(ga, ha, ia, ja, ka, la, ma) {\n            var na = this._threadlistOrderMap[ia][ja], oa = na.executeOrEnqueue(ga, ha, ka, la), pa = na.getUnavailableResources(oa), qa = na.getError(ga, ha, la);\n            if ((pa.length || qa)) {\n                if ((na.getCurrentArraySize() < ga)) {\n                    var ra = {\n                        start: ga,\n                        limit: ha,\n                        filter: ja,\n                        resources_size: na.getCurrentArraySize()\n                    };\n                    t.warn(\"range_with_gap\", ra);\n                }\n            ;\n                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((ja == i.ALL) ? null : ja), ma);\n            }\n        ;\n            return oa;\n        },\n        getThreadlistUntilTimestamp: function(ga, ha, ia) {\n            ia = (ia || i.ALL);\n            return this._threadlistOrderMap[ha][ia].getElementsUntil(ga);\n        },\n        unsubscribe: function(ga, ha, ia) {\n            ia = (ia || i.ALL);\n            this._threadlistOrderMap[ha][ia].unsubscribe(ga);\n        }\n    });\n    s(ea, l);\n    function fa(ga) {\n        switch (ga.payload_source) {\n          case k.CLIENT_CHANGE_ARCHIVED_STATUS:\n        \n          case k.CLIENT_CHANGE_READ_STATUS:\n        \n          case k.CLIENT_CHANGE_FOLDER:\n        \n          case k.CLIENT_CHANNEL_MESSAGE:\n        \n          case k.CLIENT_DELETE_MESSAGES:\n        \n          case k.CLIENT_DELETE_THREAD:\n        \n          case k.CLIENT_SEND_MESSAGE:\n        \n          case k.SERVER_SEND_MESSAGE:\n        \n          case k.SERVER_CONFIRM_MESSAGES:\n        \n          case k.SERVER_FETCH_THREADLIST_INFO:\n        \n          case k.SERVER_THREAD_SYNC:\n            return true;\n          case k.SERVER_INITIAL_DATA:\n            return ga.ordered_threadlists;\n          default:\n            return false;\n        };\n    };\n    e.exports = ea;\n});\n__d(\"MercuryUnseenState\", [\"Arbiter\",\"TimestampConverter\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercurySingletonMixin\"), m = b(\"MercuryThreadlistConstants\"), n = b(\"MessagingTag\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"copyProperties\"), r = b(\"createObjectFrom\"), s = m.MAX_UNSEEN_COUNT, t = \"unseen_thread_hash\", u = \"unseen_thread_list\", v = i.create(\"mercury_unseen_state\");\n    function w(ja) {\n        this._fbid = ja;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._initialUnseenCount = 0;\n        this._lastSeenTimestamp = 0;\n        this._maxCount = false;\n        this._unseenResources = new j();\n        this._serverRequests.subscribe(\"update-unseen\", function(ka, la) {\n            ba(this, la);\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(ka, la) {\n            ha(this, la);\n        }.bind(this));\n    };\n    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n            return aa(this);\n        },\n        exceedsMaxCount: function() {\n            return (this._maxCount || ((aa(this) > s)));\n        },\n        markAsSeen: function() {\n            if (((aa(this) > 0) || this._maxCount)) {\n                this._serverRequests.markSeen();\n                ca(this, h.convertActionIDToTimestamp(this._serverRequests.getLastActionID()), []);\n            }\n        ;\n        },\n        markThreadSeen: function(ja, ka) {\n            var la = {\n            };\n            la[ja] = null;\n            ea(this, la, ka);\n        }\n    });\n    q(w, l);\n    function x(ja, ka) {\n        ja._unseenResources.setResource(t, ka);\n        ja._unseenResources.setResource(u, Object.keys(ka));\n    };\n    function y(ja, ka) {\n        var la = ja._unseenResources.executeOrEnqueue(t, ka), ma = ja._unseenResources.getUnavailableResources(la);\n        if (ma.length) {\n            ja._serverRequests.fetchUnseenThreadIDs();\n        };\n    };\n    function z(ja) {\n        return ja._unseenResources.getResource(t);\n    };\n    function aa(ja) {\n        var ka = ja._unseenResources.getResource(u);\n        if (ka) {\n            return ka.length;\n        }\n         else return ja._initialUnseenCount\n    ;\n    };\n    function ba(ja, ka) {\n        var la = ia(ka);\n        if (ka.unseen_thread_ids) {\n            ka.unseen_thread_ids.forEach(function(wa) {\n                if ((wa.folder != n.INBOX)) {\n                    return\n                };\n                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if ((la && la.seen_timestamp)) {\n                    ya = la.seen_timestamp;\n                };\n                ca(ja, ya, xa);\n                if ((la && (la.unseen_count > s))) {\n                    ja._maxCount = true;\n                };\n            });\n        }\n         else if ((la && la.seen_timestamp)) {\n            ja._lastSeenTimestamp = la.seen_timestamp;\n            if ((la.unseen_count > s)) {\n                ja._maxCount = true;\n                x(ja, {\n                });\n            }\n             else {\n                ja._initialUnseenCount = la.unseen_count;\n                if ((ja._initialUnseenCount === 0)) {\n                    x(ja, {\n                    });\n                };\n            }\n        ;\n        }\n         else {\n            if (ja._maxCount) {\n                return\n            };\n            var ma = ka.actions;\n            if ((!ma || !(ma.length))) {\n                return\n            };\n            var na = {\n            }, oa = {\n            };\n            for (var pa = 0; (pa < ma.length); pa++) {\n                var qa = ma[pa];\n                if (qa.is_forward) {\n                    continue;\n                };\n                var ra = qa.action_type, sa = qa.action_id, ta = (qa.thread_id ? qa.thread_id : qa.server_thread_id), ua = ((qa.folder === undefined) || (qa.folder == n.INBOX));\n                if (!ua) {\n                    continue;\n                };\n                if (((ra == k.USER_GENERATED_MESSAGE) || (ra == k.LOG_MESSAGE))) {\n                    var va = h.isGreaterThan(sa, na[ta]);\n                    if ((qa.is_unread && ((!na[ta] || va)))) {\n                        na[ta] = sa;\n                    };\n                }\n                 else if (((ra == k.CHANGE_READ_STATUS) && qa.mark_as_read)) {\n                    oa[ta] = sa;\n                }\n            ;\n            };\n            da(ja, na);\n            ea(ja, oa);\n        }\n        \n    ;\n    };\n    function ca(ja, ka, la) {\n        var ma = z(ja);\n        if ((((ma === undefined) || (ka > ja._lastSeenTimestamp)) || ja._maxCount)) {\n            ja._lastSeenTimestamp = ka;\n            la = (la || []);\n            if ((la.length <= s)) {\n                ja._maxCount = false;\n            };\n            var na = {\n            }, oa = (z(ja) || {\n            });\n            for (var pa in oa) {\n                if ((oa[pa] !== true)) {\n                    var qa = oa[pa];\n                    if (fa(ja, qa)) {\n                        na[pa] = qa;\n                    };\n                }\n            ;\n            };\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    };\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return\n        };\n        var la = {\n        }, ma = false;\n        for (var na in ka) {\n            var oa = ka[na];\n            if (fa(ja, oa)) {\n                la[na] = oa;\n                ma = true;\n            }\n        ;\n        };\n        if (!ma) {\n            return\n        };\n        y(ja, function(pa) {\n            for (var qa in la) {\n                var ra = la[qa];\n                if ((!pa[qa] && fa(ja, ra))) {\n                    pa[qa] = la[qa];\n                };\n            };\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n    function ea(ja, ka, la) {\n        var ma = false;\n        for (var na in ka) {\n            ma = true;\n            break;\n        };\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                for (var qa in ka) {\n                    var ra = ka[qa], sa = h.isGreaterThan(ra, oa[qa]);\n                    if ((oa[qa] && ((!ra || sa)))) {\n                        delete oa[qa];\n                        pa = true;\n                    }\n                ;\n                };\n                if (pa) {\n                    x(ja, oa);\n                    ja._threadInformer.updatedUnseenState();\n                    if ((la && (aa(ja) === 0))) {\n                        ja._serverRequests.markSeen();\n                    };\n                }\n            ;\n            });\n        };\n    };\n    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return (la > ja._lastSeenTimestamp);\n    };\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return\n        };\n        for (var ma in ka) {\n            var na = ka[ma];\n            if (la[ma]) {\n                la[na] = la[ma];\n                delete la[ma];\n            }\n        ;\n        };\n        x(ja, la);\n    };\n    function ia(ja) {\n        var ka = ((ja.message_counts || []));\n        for (var la = 0; (la < ka.length); la++) {\n            if ((ka[la].folder == n.INBOX)) {\n                return ka[la]\n            };\n        };\n        return null;\n    };\n    g.subscribe(i.DUMP_EVENT, function(ja, ka) {\n        ka.messaging = (ka.messaging || {\n        });\n        ka.messaging.unseen = {\n        };\n        ka.messaging.unseen_max_count = {\n        };\n        ka.messaging.unseen_time = {\n        };\n        var la = w._getInstances();\n        for (var ma in la) {\n            ka.messaging.unseen[ma] = q({\n            }, z(la[ma]));\n            ka.messaging.unseen_max_count[ma] = la[ma]._maxCount;\n            ka.messaging.unseen_time[ma] = la[ma]._lastSeenTimestamp;\n        };\n    });\n    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"Event\",\"CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryActionStatus\"), k = b(\"MercuryErrorInfo\"), l = b(\"MessagingTag\"), m = b(\"MercuryStatusTemplates\"), n = b(\"Tooltip\"), o = b(\"URI\"), p = b(\"WebMessengerPermalinkConstants\"), q = b(\"cx\"), r = b(\"tx\"), s = {\n        renderParticipantListWithNoThreadName: function(u, v, w, x, y, z) {\n            var aa = {\n                callback: true,\n                check_length: true,\n                show_unread_count: true\n            };\n            z = (z || {\n            });\n            var ba = {\n            };\n            for (var ca in z) {\n                if (aa[ca]) {\n                    ba[ca] = z[ca];\n                    delete z[ca];\n                }\n            ;\n            };\n            var da = w.map(function(ia) {\n                return x[ia];\n            }), ea = this.renderRawParticipantList(u, da, w.length, z);\n            ea = this.renderRawTitleWithUnreadCount(ea, (ba.show_unread_count ? v.unread_count : 0));\n            var fa = z.abbr_mode, ga = {\n            };\n            for (var ha in z) {\n                ga[ha] = z[ha];;\n            };\n            ga.abbr_mode = true;\n            y.forEach(function(ia) {\n                var ja = ((y.length > 1) ? this._cloneIfDOMElement(ea) : ea);\n                i.setContent(ia, ja);\n                if (((ba.check_length && !fa) && (ia.scrollWidth > ia.clientWidth))) {\n                    var ka = this.renderRawParticipantList(u, da, w.length, ga), la = this.renderRawTitleWithUnreadCount(ka, (ba.show_unread_count ? v.unread_count : 0));\n                    i.setContent(ia, la);\n                }\n            ;\n            }.bind(this));\n            (ba.callback && ba.callback(ea));\n        },\n        renderRawParticipantList: function(u, v, w, x) {\n            var y = {\n                abbr_mode: true,\n                last_separator_uses_and: true,\n                names_renderer: true\n            };\n            x = (x || {\n            });\n            var z = null;\n            if (x.names_renderer) {\n                z = x.names_renderer(v);\n            }\n             else z = v.map(function(ca) {\n                return ca.name;\n            });\n        ;\n            var aa = null;\n            if ((z.length === 0)) {\n                if (!u) {\n                    aa = \"New Message\";\n                }\n                 else aa = \"No Participants\";\n            ;\n            }\n             else if ((z.length == 1)) {\n                aa = z[0];\n            }\n             else if ((z.length == 2)) {\n                var ba = {\n                    participant1: z[0],\n                    participant2: z[1]\n                };\n                if (x.last_separator_uses_and) {\n                    aa = r._(\"{participant1} and {participant2}\", ba);\n                }\n                 else aa = r._(\"{participant1}, {participant2}\", ba);\n            ;\n            }\n             else if (x.last_separator_uses_and) {\n                if (x.abbr_mode) {\n                    aa = r._(\"{participant1} and {others_link}\", {\n                        participant1: z[0],\n                        others_link: this.renderRawParticipantCount(u, {\n                            render_subset: true,\n                            count: (w - 1)\n                        })\n                    });\n                }\n                 else if ((z.length == 3)) {\n                    aa = r._(\"{participant1}, {participant2} and {participant3}\", {\n                        participant1: z[0],\n                        participant2: z[1],\n                        participant3: z[2]\n                    });\n                }\n                 else aa = r._(\"{participant1}, {participant2} and {others_link}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    others_link: this.renderRawParticipantCount(u, {\n                        render_subset: true,\n                        count: (w - 2)\n                    })\n                });\n                \n            ;\n            }\n             else if ((z.length == 3)) {\n                aa = r._(\"{participant1}, {participant2}, {participant3}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    participant3: z[2]\n                });\n            }\n             else aa = r._(\"{participant1}, {participant2}, {participant3}, {others_link}\", {\n                participant1: z[0],\n                participant2: z[1],\n                participant3: z[2],\n                others_link: this.renderRawParticipantCount(u, {\n                    render_subset: true,\n                    count: (w - 3)\n                })\n            });\n            \n            \n            \n            \n        ;\n            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\n            };\n            return aa;\n        },\n        renderRawTitleWithUnreadCount: function(u, v) {\n            var w = u;\n            if ((v && (v > 1))) {\n                w = i.create(\"span\", {\n                }, r._(\"{conversation_title} ({unread_count})\", {\n                    conversation_title: u,\n                    unread_count: v\n                }));\n            };\n            return w;\n        },\n        renderRawParticipantCount: function(u, v) {\n            var w = v.render_subset, x;\n            if (!w) {\n                x = ((v.count > 1) ? r._(\"{num} people\", {\n                    num: v.count\n                }) : \"1 person\");\n            }\n             else x = ((v.count > 1) ? r._(\"{others_count} others\", {\n                others_count: v.count\n            }) : \"1 other\");\n        ;\n            return x;\n        },\n        renderShortNames: function(u) {\n            if ((u.length == 1)) {\n                return [u[0].name,]\n            };\n            return u.map(function(v) {\n                return v.short_name;\n            });\n        },\n        getUserCanonicalTitanURL: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\"), y = u.substr((u.indexOf(\":\") + 1));\n            x.setPath(((t(w) + \"/\") + y));\n            (v && v(x.toString()));\n            return x.toString();\n        },\n        getTitanURLWithServerID: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\");\n            x.setPath(p.getURIPathForThreadID(u, t(w)));\n            (v && v(x.toString()));\n            return x.toString();\n        },\n        renderUserCanonicalTitanLink: function(u, v, w, x) {\n            var y = this.getUserCanonicalTitanURL(u, null, x);\n            v.setAttribute(\"href\", y);\n            (w && w());\n        },\n        renderTitanLinkWithServerID: function(u, v, w, x) {\n            var y = this.getTitanURLWithServerID(u, null, x);\n            v.setAttribute(\"href\", y);\n            (w && w());\n        },\n        renderStatusIndicator: function(u, v, w) {\n            var x;\n            if ((u == j.RESENDING)) {\n                x = this.renderResendIndicator();\n            }\n             else if (((((u !== undefined) && (u != j.UNSENT)) && (u != j.UNCONFIRMED)) && (u != j.SUCCESS))) {\n                x = this.renderErrorIndicator(v, w);\n            }\n        ;\n            return x;\n        },\n        renderResendIndicator: function() {\n            return m[\":fb:mercury:resend-indicator\"].render();\n        },\n        renderErrorIndicator: function(u, v) {\n            if (!u) {\n                return null\n            };\n            var w = m[\":fb:mercury:error-indicator\"].render(), x = u.is_transient, y = k.getMessage(u);\n            if (x) {\n                if (k.isConnectionError(u)) {\n                    y = r._(\"{message} Check your network connection or click to try again.\", {\n                        message: y\n                    });\n                }\n                 else y = r._(\"{message} Click to send again.\", {\n                    message: y\n                });\n            \n            };\n            n.set(w, y, \"above\", \"center\");\n            if ((v && x)) {\n                g.listen(w, \"click\", v);\n                w.setAttribute(\"tabindex\", \"0\");\n                h.addClass(w, \"-cx-PRIVATE-fbMercuryStatus__clickableerror\");\n            }\n        ;\n            return w;\n        },\n        _cloneIfDOMElement: function(u) {\n            if (u.cloneNode) {\n                return u.cloneNode();\n            }\n             else return u\n        ;\n        }\n    };\n    function t(u) {\n        var v = p.BASE_PATH;\n        if ((u && (u != l.INBOX))) {\n            v += (\"/\" + u);\n        };\n        return v;\n    };\n    e.exports = s;\n});\n__d(\"MercurySeenByAll\", [\"CSS\",\"DataStore\",\"DOM\",\"MercuryParticipants\",\"MercuryDelayedRoger\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryThreads\").get(), m = {\n    }, n = {\n        updateOnSeenChange: function(p, q) {\n            m[p.tagName] = true;\n            h.set(p, \"thread-id\", q.thread_id);\n            g.addClass(p, \"seenByListener\");\n            o(p, q);\n        }\n    };\n    function o(p, q) {\n        var r = q.participants.filter(function(t) {\n            return (t !== j.user);\n        }), s = ((q.participants.length > 0) && (q.participants[0] === j.user));\n        g.conditionClass(p, \"repliedLast\", s);\n        g.conditionClass(p, \"seenByAll\", (s && (k.getSeenBy(q.thread_id).length === r.length)));\n    };\n    k.subscribe(\"state-changed\", function(p, q) {\n        for (var r in m) {\n            var s = i.scry(document.body, (r + \".seenByListener\"));\n            for (var t = 0; (t < s.length); t++) {\n                var u = s[t], v = h.get(u, \"thread-id\");\n                if (q[v]) {\n                    l.getThreadMeta(v, function(w) {\n                        o(u, w);\n                    });\n                };\n            };\n        };\n    });\n    e.exports = n;\n});\n__d(\"MercuryThreadMetadataRenderer\", [\"MercuryConfig\",\"CSS\",\"DOM\",\"Emoji\",\"HTML\",\"JSLogger\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessageSourceTags\",\"MercurySingletonMixin\",\"MercuryThreadMetadataRawRenderer\",\"MercuryParticipants\",\"MercuryParticipantsConstants\",\"Pixelz.react\",\"React\",\"MercurySeenByAll\",\"MercuryServerRequests\",\"SplitImage.react\",\"Style\",\"MercuryThreadlistIconTemplates\",\"MercuryThreads\",\"Tooltip\",\"URI\",\"arrayContains\",\"createArrayFrom\",\"copyProperties\",\"cx\",\"formatDate\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Emoji\"), k = b(\"HTML\"), l = b(\"JSLogger\"), m = b(\"MercuryAttachment\"), n = b(\"MercuryAttachmentType\"), o = b(\"MercuryMessageSourceTags\"), p = b(\"MercurySingletonMixin\"), q = b(\"MercuryThreadMetadataRawRenderer\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryParticipantsConstants\"), t = b(\"Pixelz.react\"), u = b(\"React\"), v = b(\"MercurySeenByAll\"), w = b(\"MercuryServerRequests\"), x = b(\"SplitImage.react\"), y = b(\"Style\"), z = b(\"MercuryThreadlistIconTemplates\"), aa = b(\"MercuryThreads\"), ba = b(\"Tooltip\"), ca = b(\"URI\"), da = b(\"arrayContains\"), ea = b(\"createArrayFrom\"), fa = b(\"copyProperties\"), ga = b(\"cx\"), ha = b(\"formatDate\"), ia = b(\"tx\"), ja = l.create(\"wm_timestamp\");\n    function ka(qa) {\n        this._fbid = qa;\n        this._serverRequests = w.getForFBID(qa);\n        this._threads = aa.getForFBID(qa);\n    };\n    fa(ka, p);\n    fa(ka.prototype, {\n        renderTimestamp: function(qa, ra, sa, ta) {\n            if (ta) {\n                if (!ra) {\n                    ja.warn(\"no_title\");\n                    ra = (new Date(ta)).toLocaleDateString();\n                }\n            ;\n                qa.setAttribute(\"title\", ra);\n                qa.setAttribute(\"data-utime\", (ta / 1000));\n                if (!sa) {\n                    ja.warn(\"no_display\");\n                    sa = ha(new Date(ta), (g[\"24h_times\"] ? \"H:i\" : \"g:ia\"));\n                }\n            ;\n                i.setContent(qa, sa);\n                h.show(qa);\n            }\n        ;\n        },\n        renderMessageSourceTags: function(qa, ra, sa, ta) {\n            var ua = \"\", va = \"\", wa = \"\";\n            if (da(sa, o.MESSENGER)) {\n                ua = \"Sent from Messenger\";\n                va = new ca(\"/mobile/messenger\");\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemessenger\";\n            }\n             else if (da(sa, o.MOBILE)) {\n                ua = \"Sent from Mobile\";\n                va = new ca(\"/mobile/\");\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemobile\";\n            }\n             else if (da(sa, o.CHAT)) {\n                ua = \"Sent from chat\";\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourcechat\";\n            }\n             else if (da(sa, o.EMAIL)) {\n                if (ta) {\n                    ua = ia._(\"Sent from {email}\", {\n                        email: ta\n                    });\n                }\n                 else ua = \"Sent from email\";\n            ;\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourceemail\";\n            }\n            \n            \n            \n        ;\n            if (wa) {\n                ba.set(qa, ua);\n                h.addClass(ra, wa);\n                if (va) {\n                    qa.setAttribute(\"href\", va);\n                }\n                 else qa.removeAttribute(\"href\");\n            ;\n            }\n             else h.hide(qa);\n        ;\n        },\n        renderMessageLocation: function(qa, ra, sa) {\n            var ta = ca(\"/ajax/messaging/hovercard/map.php\").setQueryData(sa);\n            qa.setAttribute(\"data-hovercard\", ta);\n            h.removeClass(qa, \"-cx-PRIVATE-webMessengerMessageGroup__nolocation\");\n            h.show(ra);\n        },\n        renderSpoofWarning: function(qa, ra, sa) {\n            if (ra) {\n                h.addClass(qa, \"-cx-PRIVATE-webMessengerMessageGroup__spoofwarning\");\n                ba.set(qa, ia._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: sa.name\n                }));\n            }\n        ;\n        },\n        renderChatSpoofWarning: function(qa, ra, sa) {\n            if (ra) {\n                i.appendContent(qa, ia._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: sa.name\n                }));\n            };\n        },\n        renderCoreThreadlist: function(qa, ra, sa, ta, ua) {\n            ta = (ta || {\n            });\n            this.renderThreadImage(qa, ra.getNode(\"image\"));\n            var va = ra.getNode(\"accessibleName\"), wa = [ra.getNode(\"name\"),];\n            if (va) {\n                wa.push(va);\n            };\n            pa(this, qa, wa, ta);\n            if ((qa.folder && ua)) {\n                oa(ra.getNode(\"folderBadge\"), qa.folder);\n            };\n            var xa = ra.getNode(\"timestamp\");\n            this.renderTimestamp(xa, qa.timestamp_absolute, qa.timestamp_relative, qa.timestamp);\n            this.renderSnippet(qa, ra.getNode(\"snippet\"));\n            ma(ra, qa);\n            sa(ra, qa);\n        },\n        renderAndSeparatedParticipantList: function(qa, ra, sa) {\n            sa = (sa || {\n            });\n            sa.last_separator_uses_and = true;\n            this._threads.getThreadMeta(qa, function(ta) {\n                pa(this, ta, ra, sa);\n            }.bind(this));\n        },\n        renderSnippet: function(qa, ra) {\n            var sa = false, ta = i.create(\"span\");\n            h.addClass(ta, \"MercuryRepliedIndicator\");\n            i.appendContent(ra, ta);\n            v.updateOnSeenChange(ta, qa);\n            var ua = qa.snippet;\n            if (ua) {\n                if (qa.snippet_has_attachment) {\n                    i.appendContent(ra, i.create(\"span\", {\n                        className: \"MercuryAttachmentIndicator\"\n                    }));\n                };\n                if (qa.is_forwarded_snippet) {\n                    i.appendContent(ra, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message:\"));\n                };\n                if ((ua.substr(0, 4) == \"?OTR\")) {\n                    ua = \"[encrypted message]\";\n                }\n                 else ua = ua.replace(/\\r\\n|[\\r\\n]/g, \" \");\n            ;\n                ua = k(j.htmlEmojiAndEmote(ua));\n            }\n             else {\n                if (qa.is_forwarded_snippet) {\n                    i.appendContent(ra, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message\"));\n                };\n                if (((qa.snippet_has_attachment && qa.snippet_attachments) && qa.snippet_attachments.length)) {\n                    sa = true;\n                    ua = i.create(\"span\");\n                    na(this, qa, ua);\n                }\n            ;\n            }\n        ;\n            var va = qa.participants.length;\n            if (qa.is_subscribed) {\n                va--;\n            };\n            if ((((!sa && qa.snippet_sender) && (r.getIDForUser(this._fbid) != qa.snippet_sender)) && (va > 1))) {\n                r.get(qa.snippet_sender, function(wa) {\n                    if (wa.short_name) {\n                        i.appendContent(ra, ia._(\"{name}: {conversation_snippet}\", {\n                            name: wa.short_name,\n                            conversation_snippet: ua\n                        }));\n                    }\n                     else i.appendContent(ra, ua);\n                ;\n                });\n            }\n             else i.appendContent(ra, ua);\n        ;\n        },\n        getTitanURL: function(qa, ra, sa) {\n            if ((qa.substr(0, qa.indexOf(\":\")) == \"user\")) {\n                q.getUserCanonicalTitanURL(qa, ra, sa);\n            }\n             else this._serverRequests.getServerThreadID(qa, function(ta) {\n                q.getTitanURLWithServerID(ta, ra, sa);\n            });\n        ;\n        },\n        renderTitanLink: function(qa, ra, sa, ta) {\n            if ((qa.substr(0, qa.indexOf(\":\")) == \"user\")) {\n                q.renderUserCanonicalTitanLink(qa, ra, sa, ta);\n            }\n             else this._serverRequests.getServerThreadID(qa, function(ua) {\n                q.renderTitanLinkWithServerID(ua, ra, sa, ta);\n            });\n        ;\n        },\n        renderThreadImage: function(qa, ra) {\n            if (qa.image_src) {\n                var sa = t({\n                    height: s.BIG_IMAGE_SIZE,\n                    resizeMode: \"cover\",\n                    src: qa.image_src,\n                    width: s.BIG_IMAGE_SIZE\n                });\n                u.renderComponent(sa, ra);\n                return;\n            }\n        ;\n            var ta = r.getIDForUser(this._fbid), ua = [], va = qa.participants.filter(function(wa) {\n                return (wa != ta);\n            });\n            if (!va.length) {\n                ua = [ta,];\n            }\n             else if ((va.length == 1)) {\n                ua = [va[0],];\n            }\n             else ua = va.slice(0, 3);\n            \n        ;\n            this.renderParticipantImages(ua, ra);\n        },\n        renderParticipantImages: function(qa, ra) {\n            r.getOrderedBigImageMulti(qa, function(sa) {\n                var ta = x({\n                    srcs: sa,\n                    border: true,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                u.renderComponent(ta, ra);\n            });\n        },\n        renderParticipantList: function(qa, ra, sa, ta) {\n            return q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(qa), ra, sa, ta);\n        },\n        renderThreadNameAndParticipantList: function(qa, ra, sa, ta) {\n            var ua = q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(qa), ra, sa, ta), va = this._threads.getThreadMetaNow(qa);\n            if (!va.name) {\n                return ua\n            };\n            return ia._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: va.name,\n                participant_list: ua\n            });\n        },\n        renderParticipantCount: function(qa, ra) {\n            return q.renderRawParticipantCount(this._serverRequests.getServerThreadIDNow(qa), ra);\n        }\n    });\n    function la(qa) {\n        if (!qa.snippet_attachments) {\n            return []\n        };\n        return qa.snippet_attachments.filter(function(ra) {\n            return (ra.attach_type === n.PHOTO);\n        });\n    };\n    function ma(qa, ra) {\n        var sa = la(ra);\n        if ((sa.length === 0)) {\n            return\n        };\n        var ta = sa[0].thumbnail_url;\n        if (!ta) {\n            return\n        };\n        var ua = (((sa.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\"), va = qa.getNode(ua);\n        if (!va) {\n            return\n        };\n        var wa = i.find(va, \"i\");\n        y.set(wa, \"background-image\", ((\"url(\" + ta) + \")\"));\n        h.show(va);\n    };\n    function na(qa, ra, sa) {\n        var ta = (ra.snippet_sender && (r.getIDForUser(qa._fbid) == ra.snippet_sender)), ua = function(za) {\n            if ((!ra.snippet_sender || ta)) {\n                za(null);\n                return;\n            }\n        ;\n            r.get(ra.snippet_sender, function(ab) {\n                za(ab.short_name);\n            });\n        }, va = la(ra), wa = (va.length == ra.snippet_attachments.length), xa = (((ra.snippet_attachments.length === 1) && ra.snippet_attachments[0].metadata) && (ra.snippet_attachments[0].metadata.type == \"fb_voice_message\")), ya = ((ra.snippet_attachments.length === 1) && (ra.snippet_attachments[0].attach_type === n.STICKER));\n        ua(function(za) {\n            var ab = null;\n            if (wa) {\n                var bb = z[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                if ((va.length === 1)) {\n                    ab = (ta ? \"You sent a photo.\" : ia._(\"{name} sent a photo.\", {\n                        name: za\n                    }));\n                }\n                 else ab = (ta ? ia._(\"You sent {num_photos} photos.\", {\n                    num_photos: va.length\n                }) : ia._(\"{name} sent {num_photos} photos.\", {\n                    name: za,\n                    num_photos: va.length\n                }));\n            ;\n                h.addClass(bb, m.getAttachIconClass(va[0].icon_type));\n                i.appendContent(bb, ab);\n                i.appendContent(sa, bb);\n            }\n             else if (xa) {\n                var cb = z[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                ab = (ta ? \"You sent a voice message.\" : ia._(\"{name} sent a voice message.\", {\n                    name: za\n                }));\n                h.addClass(cb, m.getAttachIconClass(ra.snippet_attachments[0].icon_type));\n                i.appendContent(cb, ab);\n                i.appendContent(sa, cb);\n            }\n             else if (ya) {\n                ab = (ta ? \"You sent a sticker.\" : ia._(\"{name} sent a sticker.\", {\n                    name: za\n                }));\n                i.appendContent(sa, ab);\n            }\n             else ra.snippet_attachments.filter(function(db) {\n                return ((db.attach_type == n.FILE) || (db.attach_type == n.PHOTO));\n            }).forEach(function(db) {\n                var eb = z[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                i.appendContent(eb, db.name);\n                h.addClass(eb, m.getAttachIconClass(db.icon_type));\n                i.appendContent(sa, eb);\n            });\n            \n            \n        ;\n        });\n    };\n    function oa(qa, ra) {\n        ea(qa).forEach(function(sa) {\n            i.setContent(sa, ra);\n        });\n    };\n    function pa(qa, ra, sa, ta) {\n        sa = ea(sa);\n        if (ra.name) {\n            var ua = q.renderRawTitleWithUnreadCount(ra.name, (ta.show_unread_count ? ra.unread_count : 0));\n            sa.forEach(function(wa) {\n                i.setContent(wa, ua);\n            });\n            (ta.callback && ta.callback(ua));\n            return;\n        }\n    ;\n        var va = ra.participants;\n        if ((ra.participants.length > 1)) {\n            va = ra.participants.filter(function(wa) {\n                return (wa != r.getIDForUser(qa._fbid));\n            });\n        };\n        r.getMulti(va, function(wa) {\n            q.renderParticipantListWithNoThreadName(qa._serverRequests.getServerThreadIDNow(ra.thread_id), ra, va, wa, sa, ta);\n        });\n    };\n    e.exports = ka;\n});\n__d(\"escapeRegex\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return h.replace(/([.?*+\\^$\\[\\]\\\\(){}|\\-])/g, \"\\\\$1\");\n    };\n    e.exports = g;\n});\n__d(\"MercuryThreadSearchUtils\", [\"escapeRegex\",\"TokenizeUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"escapeRegex\"), h = b(\"TokenizeUtil\"), i = {\n        wordsInString: function(j) {\n            return ((j || \"\")).split(/\\s+/).filter(function(k) {\n                return (k.trim().length > 0);\n            });\n        },\n        anyMatchPredicate: function(j, k) {\n            for (var l = 0; (l < j.length); l++) {\n                if (k(j[l])) {\n                    return true\n                };\n            };\n            return false;\n        },\n        allMatchPredicate: function(j, k) {\n            for (var l = 0; (l < j.length); l++) {\n                if (!k(j[l])) {\n                    return false\n                };\n            };\n            return true;\n        },\n        queryWordMatchesAnyNameWord: function(j, k) {\n            var l = new RegExp((\"\\\\b\" + g(j)), \"i\");\n            return this.anyMatchPredicate(k, function(m) {\n                var n = h.parse(m).flatValue;\n                return l.test(n);\n            });\n        },\n        queryMatchesName: function(j, k) {\n            var l = this.wordsInString(j), m = this.wordsInString(k);\n            return this.allMatchPredicate(l, function(n) {\n                return this.queryWordMatchesAnyNameWord(n, m);\n            }.bind(this));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Dcode\", [], function(a, b, c, d, e, f) {\n    var g, h = {\n    }, i = {\n        _: \"%\",\n        A: \"%2\",\n        B: \"000\",\n        C: \"%7d\",\n        D: \"%7b%22\",\n        E: \"%2c%22\",\n        F: \"%22%3a\",\n        G: \"%2c%22ut%22%3a1\",\n        H: \"%2c%22bls%22%3a\",\n        I: \"%2c%22n%22%3a%22%\",\n        J: \"%22%3a%7b%22i%22%3a0%7d\",\n        K: \"%2c%22pt%22%3a0%2c%22vis%22%3a\",\n        L: \"%2c%22ch%22%3a%7b%22h%22%3a%22\",\n        M: \"%7b%22v%22%3a2%2c%22time%22%3a1\",\n        N: \".channel%22%2c%22sub%22%3a%5b\",\n        O: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b\",\n        P: \"%2c%22ud%22%3a100%2c%22lc%22%3a0\",\n        Q: \"%5d%2c%22f%22%3anull%2c%22uct%22%3a\",\n        R: \".channel%22%2c%22sub%22%3a%5b1%5d\",\n        S: \"%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a\",\n        T: \"%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        U: \"%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        V: \"%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a\",\n        W: \"%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\",\n        X: \"%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1\",\n        Y: \"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        Z: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\"\n    };\n    (function() {\n        var k = [];\n        for (var l in i) {\n            h[i[l]] = l;\n            k.push(i[l]);\n        };\n        k.reverse();\n        g = new RegExp(k.join(\"|\"), \"g\");\n    })();\n    var j = {\n        encode: function(k) {\n            return encodeURIComponent(k).replace(/([_A-Z])|%../g, function(l, m) {\n                return (m ? (\"%\" + m.charCodeAt(0).toString(16)) : l);\n            }).toLowerCase().replace(g, function(l) {\n                return h[l];\n            });\n        },\n        decode: function(k) {\n            return decodeURIComponent(k.replace(/[_A-Z]/g, function(l) {\n                return i[l];\n            }));\n        }\n    };\n    e.exports = j;\n});\n__d(\"Poller\", [\"ArbiterMixin\",\"AsyncRequest\",\"Cookie\",\"Env\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"Cookie\"), j = b(\"Env\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(p) {\n        this._config = k({\n            clearOnQuicklingEvents: true,\n            setupRequest: l,\n            interval: null,\n            maxRequests: Infinity,\n            dontStart: false\n        }, p);\n        if (!this._config.dontStart) {\n            this.start();\n        };\n    };\n    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: function() {\n            if (this._polling) {\n                return this\n            };\n            this._requests = 0;\n            this.request();\n            return this;\n        },\n        stop: function() {\n            this._cancelRequest();\n            return this;\n        },\n        mute: function() {\n            this._muted = true;\n            return this;\n        },\n        resume: function() {\n            if (this._muted) {\n                this._muted = false;\n                if ((!this._handle && this._polling)) {\n                    return this.request()\n                };\n            }\n        ;\n            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done()\n            };\n            if (this._muted) {\n                return this\n            };\n            if ((++this._requests > this._config.maxRequests)) {\n                return this._done()\n            };\n            var p = new h(), q = false;\n            p.setInitialHandler(function() {\n                return !q;\n            });\n            this._cancelRequest = function() {\n                q = true;\n                this._cleanup();\n            }.bind(this);\n            p.setFinallyHandler(n.bind(this));\n            p.setInitialHandler = l;\n            p.setFinallyHandler = l;\n            this._config.setupRequest(p, this);\n            if (this._skip) {\n                this._skip = false;\n                n.bind(this).defer();\n            }\n             else p.send();\n        ;\n            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                clearTimeout(this._handle);\n            };\n            this._handle = null;\n            this._cancelRequest = l;\n            this._polling = false;\n        },\n        _done: function() {\n            this._cleanup();\n            this.inform(\"done\", {\n                sender: this\n            });\n            return this;\n        },\n        _config: null,\n        _requests: 0,\n        _muted: false,\n        _polling: false,\n        _skip: false,\n        _cancelRequest: l\n    });\n    function n() {\n        if (!this._polling) {\n            return\n        };\n        if ((this._requests < this._config.maxRequests)) {\n            var p = this._config.interval;\n            p = ((typeof p === \"function\") ? p(this._requests) : p);\n            this._handle = this.request.bind(this).defer((((p > m.MIN_INTERVAL)) ? p : m.MIN_INTERVAL), this._config.clearOnQuicklingEvents);\n        }\n         else this._done();\n    ;\n    };\n    function o() {\n        return (j.user == i.get(\"c_user\"));\n    };\n    e.exports = m;\n});\n__d(\"SystemEvents\", [\"Arbiter\",\"Env\",\"ErrorUtils\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"ErrorUtils\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = new g(), m = [], n = 1000;\n    setInterval(function() {\n        for (var w = 0; (w < m.length); w++) {\n            m[w]();;\n        };\n    }, n, false);\n    function o() {\n        return (((/c_user=(\\d+)/.test(document.cookie) && RegExp.$1)) || 0);\n    };\n    var p = h.user, q = navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    };\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    };\n    if (j.ie()) {\n        if ((j.ie() >= 8)) {\n            window.attachEvent(\"onload\", function() {\n                document.body.ononline = r;\n                document.body.onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((navigator.onLine ? r : s))();\n        });\n    ;\n    }\n     else if (window.addEventListener) {\n        if (!j.chrome()) {\n            window.addEventListener(\"online\", r, false);\n            window.addEventListener(\"offline\", s, false);\n        }\n    \n    }\n;\n    var t = p;\n    m.push(function() {\n        var w = o();\n        if ((t != w)) {\n            l.inform(l.USER, w);\n            t = w;\n        }\n    ;\n    });\n    var u = Date.now();\n    function v() {\n        var w = Date.now(), x = (w - u), y = ((x < 0) || (x > 10000));\n        u = w;\n        if (y) {\n            l.inform(l.TIME_TRAVEL, x);\n        };\n        return y;\n    };\n    m.push(v);\n    m.push(function() {\n        if ((window.onerror != i.onerror)) {\n            window.onerror = i.onerror;\n        };\n    });\n    k(l, {\n        USER: \"SystemEvents/USER\",\n        ONLINE: \"SystemEvents/ONLINE\",\n        TIME_TRAVEL: \"SystemEvents/TIME_TRAVEL\",\n        isPageOwner: function(w) {\n            return (((w || o())) == p);\n        },\n        isOnline: function() {\n            return (j.chrome() || q);\n        },\n        checkTimeTravel: v\n    });\n    e.exports = l;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return setInterval(h, i, false);\n    };\n    e.exports = g;\n});\n__d(\"PresenceCookieManager\", [\"Cookie\",\"Dcode\",\"ErrorUtils\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"URI\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Dcode\"), i = b(\"ErrorUtils\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"PresenceUtil\"), m = b(\"URI\"), n = b(\"PresenceInitialData\"), o = n.cookieVersion, p = n.dictEncode, q = \"presence\", r = {\n    }, s = null, t = null, u = k.create(\"presence_cookie\");\n    function v() {\n        try {\n            var z = g.get(q);\n            if ((s !== z)) {\n                s = z;\n                t = null;\n                if ((z && (z.charAt(0) == \"E\"))) {\n                    z = h.decode(z.substring(1));\n                };\n                if (z) {\n                    t = JSON.parse(z);\n                };\n            }\n        ;\n            if ((t && ((!t.user || (t.user === j.user))))) {\n                return t\n            };\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n        return null;\n    };\n    function w() {\n        return parseInt((Date.now() / 1000), 10);\n    };\n    var x = {\n        register: function(y, z) {\n            r[y] = z;\n        },\n        store: function() {\n            var y = v();\n            if (((y && y.v) && (o < y.v))) {\n                return\n            };\n            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            for (var aa in r) {\n                z[aa] = i.applyWithGuard(r[aa], r, [(y && y[aa]),], function(ea) {\n                    ea.presence_subcookie = aa;\n                });;\n            };\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = (\"E\" + h.encode(ba));\n            };\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if ((ca > 1024)) {\n                    u.warn(\"big_cookie\", ca);\n                };\n                var da = (m.getRequestURI(false).isSecure() && !!g.get(\"csm\"));\n                g.set(q, ba, null, null, da);\n            }\n        ;\n        },\n        clear: function() {\n            g.clear(q);\n        },\n        getSubCookie: function(y) {\n            var z = v();\n            if (!z) {\n                return null\n            };\n            return z[y];\n        }\n    };\n    e.exports = x;\n});\n__d(\"PresenceState\", [\"Arbiter\",\"ErrorUtils\",\"JSLogger\",\"PresenceCookieManager\",\"copyProperties\",\"debounceAcrossTransitions\",\"setIntervalAcrossTransitions\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"JSLogger\"), j = b(\"PresenceCookieManager\"), k = b(\"copyProperties\"), l = b(\"debounceAcrossTransitions\"), m = b(\"setIntervalAcrossTransitions\"), n = b(\"PresenceInitialData\"), o = (n.cookiePollInterval || 2000), p = [], q = [], r = null, s = null, t = 0, u = null, v = 0, w = [\"sb2\",\"t2\",\"lm2\",\"uct2\",\"tr\",\"tw\",\"at\",\"wml\",], x = i.create(\"presence_state\");\n    function y() {\n        return j.getSubCookie(\"state\");\n    };\n    function z() {\n        t = Date.now();\n        j.store();\n        da(s);\n    };\n    var aa = l(z, 0);\n    function ba(ia) {\n        if (((((typeof ia == \"undefined\") || isNaN(ia)) || (ia == Number.POSITIVE_INFINITY)) || (ia == Number.NEGATIVE_INFINITY))) {\n            ia = 0;\n        };\n        return ia;\n    };\n    function ca(ia) {\n        var ja = {\n        };\n        if (ia) {\n            w.forEach(function(ma) {\n                ja[ma] = ia[ma];\n            });\n            if ((t < ia.ut)) {\n                x.error(\"new_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            };\n        }\n    ;\n        ja.ut = t;\n        for (var ka = 0, la = p.length; (ka < la); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);;\n        };\n        s = ja;\n        return s;\n    };\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        };\n        s = ia;\n        if ((u === null)) {\n            u = ia;\n        };\n        for (var ja = 0, ka = q.length; (ja < ka); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);;\n        };\n        v--;\n    };\n    function ea(ia) {\n        if ((ia && ia.ut)) {\n            if ((t < ia.ut)) {\n                return true;\n            }\n             else if ((ia.ut < t)) {\n                x.error(\"old_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n        \n        };\n        return false;\n    };\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        };\n        return s;\n    };\n    function ga() {\n        var ia = y();\n        if (ea(ia)) {\n            da(ia);\n        };\n    };\n    j.register(\"state\", ca);\n    g.subscribe(i.DUMP_EVENT, function(ia, ja) {\n        ja.presence_state = {\n            initial: k({\n            }, u),\n            state: k({\n            }, s),\n            update_time: t,\n            sync_paused: v,\n            poll_time: o\n        };\n    });\n    (function() {\n        var ia = fa();\n        if (ia) {\n            da(ia);\n        }\n         else {\n            x.debug(\"no_cookie_initial\");\n            da(ca());\n            return;\n        }\n    ;\n    })();\n    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return\n            };\n            if (ia) {\n                z();\n            }\n             else aa();\n        ;\n        },\n        registerStateStorer: function(ia) {\n            p.push(ia);\n        },\n        registerStateLoader: function(ia) {\n            q.push(ia);\n        },\n        get: function() {\n            return fa();\n        },\n        getInitial: function() {\n            return u;\n        },\n        verifyNumber: ba\n    };\n    e.exports = ha;\n});\n__d(\"TypingDetector\", [\"Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"Input\"), j = b(\"Run\"), k = b(\"copyProperties\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\");\n    function n(o) {\n        this._input = o;\n        this._ignoreKeys = {\n        };\n    };\n    n.INACTIVE = 0;\n    n.TYPING = 1;\n    n.QUITTING = 2;\n    k(n.prototype, h, {\n        _timeout: 7000,\n        _currentState: n.INACTIVE,\n        init: function() {\n            this.init = m;\n            this.reset();\n            g.listen(this._input, \"keyup\", this._update.bind(this));\n            j.onUnload(this._onunload.bind(this));\n        },\n        reset: function() {\n            clearTimeout(this._checkTimer);\n            this._checkTimer = null;\n            this._lastKeystrokeAt = null;\n            this._currentState = n.INACTIVE;\n        },\n        setIgnoreKeys: function(o) {\n            this._ignoreKeys = l(o);\n        },\n        _onunload: function() {\n            if ((this._currentState == n.TYPING)) {\n                this._transition(n.QUITTING);\n            };\n        },\n        _update: function(event) {\n            var o = g.getKeyCode(event), p = this._currentState;\n            if (!this._ignoreKeys[o]) {\n                if ((i.getValue(this._input).trim().length === 0)) {\n                    if ((p == n.TYPING)) {\n                        this._transition(n.INACTIVE);\n                    };\n                }\n                 else if ((p == n.TYPING)) {\n                    this._recordKeystroke();\n                }\n                 else if ((p == n.INACTIVE)) {\n                    this._transition(n.TYPING);\n                    this._recordKeystroke();\n                }\n                \n                \n            \n            };\n        },\n        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            };\n        },\n        _checkTyping: function() {\n            var o = (this._lastKeystrokeTime + this._timeout), p = Date.now();\n            if ((p > o)) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((o - p) + 10));\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"URLMatcher\", [], function(a, b, c, d, e, f) {\n    var g = \"!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\", h = \"\\u2000-\\u206f\\u00ab\\u00bb\\uff08\\uff09\", i = \"(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\", j = \"(?:(?:ht|f)tps?)://\", k = ((((\"(?:(?:\" + i) + \"[.]){3}\") + i) + \")\"), l = \"\\\\[(?:(?:[A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})\\\\]\", m = \"(?:\\\\b)www\\\\d{0,3}[.]\", n = (((\"[^\\\\s\" + g) + h) + \"]\"), o = ((((((\"(?:(?:(?:[.:\\\\-_%@]|\" + n) + \")*\") + n) + \")|\") + l) + \")\"), p = \"(?:[.][a-z]{2,4})\", q = \"(?::\\\\d+){0,1}\", r = \"(?=[/?#])\", s = ((((((((((((((((((((((((((\"(?:\" + \"(?:\") + j) + o) + q) + \")|\") + \"(?:\") + k) + q) + \")|\") + \"(?:\") + l) + q) + \")|\") + \"(?:\") + m) + o) + p) + q) + \")|\") + \"(?:\") + o) + p) + q) + r) + \")\") + \")\"), t = \"[/#?]\", u = \"\\\\([^\\\\s()\\u003C\\u003E]+\\\\)\", v = \"[^\\\\s()\\u003C\\u003E?#]+\", w = new RegExp(s, \"im\"), x = \"^\\\\[[0-9]{1,4}:[0-9]{1,4}:[A-Fa-f0-9]{1,4}\\\\]\", y = new RegExp(x, \"im\"), z = (((((((((((\"(?:\" + \"(?:\") + t) + \")\") + \"(?:\") + \"(?:\") + u) + \"|\") + v) + \")*\") + \")*\") + \")*\"), aa = new RegExp((((((((\"(\" + \"(?:\") + s) + \")\") + \"(?:\") + z) + \")\") + \")\"), \"im\"), ba = new RegExp(((((((((((((\"(\" + \"(?:\") + j) + o) + q) + \")|\") + \"(?:\") + m) + o) + p) + q) + \")\") + \")\")), ca = /[\\s'\";]/, da = new RegExp(t, \"im\"), ea = new RegExp(\"[\\\\s!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\\u00ab\\u00bb\\u2000-\\u206f\\uff08\\uff09]\", \"im\"), fa = new RegExp(\"[\\\\s()\\u003C\\u003E?#]\", \"im\"), ga = new RegExp(\"\\\\s()\\u003C\\u003E\"), ha = function(oa) {\n        if ((oa && (oa.indexOf(\"@\") != -1))) {\n            return ((ba.exec(oa)) ? oa : null);\n        }\n         else return oa\n    ;\n    }, ia = function(oa) {\n        return ja(oa, aa);\n    }, ja = function(oa, pa) {\n        var qa = (((pa.exec(oa) || []))[1] || null);\n        return ha(qa);\n    }, ka = function(oa) {\n        return w.exec(oa);\n    }, la = function(oa) {\n        return !ca.test(oa.charAt((oa.length - 1)));\n    }, ma = function(oa) {\n        do {\n            var pa = w.exec(oa);\n            if (!pa) {\n                return null\n            };\n            var qa = false;\n            if ((((pa[0][0] === \"[\") && (pa.index > 0)) && (oa[(pa.index - 1)] === \"@\"))) {\n                var ra = y.exec(pa[0]);\n                if (ra) {\n                    qa = true;\n                    oa = oa.substr((pa.index + ra[0].length));\n                }\n            ;\n            }\n        ;\n        } while (qa);\n        var sa = oa.substr((pa.index + pa[0].length));\n        if (((sa.length === 0) || !(da.test(sa[0])))) {\n            return ha(pa[0])\n        };\n        var ta = 0, ua = 0, va = 1, wa = 0, xa = ua;\n        for (var ya = 1; (ya < sa.length); ya++) {\n            var za = sa[ya];\n            if ((xa === ua)) {\n                if ((za === \"(\")) {\n                    wa = (wa + 1);\n                    xa = va;\n                }\n                 else if ((da.test(za) || !(ea.test(za)))) {\n                    ta = ya;\n                }\n                 else if (fa.test(za)) {\n                    break;\n                }\n                \n            ;\n            }\n             else if ((za === \"(\")) {\n                wa = (wa + 1);\n            }\n             else if ((za === \")\")) {\n                wa = (wa - 1);\n                if ((wa === 0)) {\n                    xa = ua;\n                    ta = ya;\n                }\n            ;\n            }\n             else if (ga.test(za)) {\n                break;\n            }\n            \n            \n        ;\n        };\n        return ha((pa[0] + sa.substring(0, (ta + 1))));\n    }, na = {\n    };\n    na.permissiveMatch = ia;\n    na.matchToPattern = ja;\n    na.matchHost = ka;\n    na.trigger = la;\n    na.match = ma;\n    e.exports = na;\n});");
// 9096
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s1406cdb8f82a4497c9e210b291001f76845e62bf");
// 9097
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"OSd/n\",]);\n}\n;\n;\n__d(\"MercuryMessageSourceTags\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        CHAT: \"source:chat\",\n        MOBILE: \"source:mobile\",\n        MESSENGER: \"source:messenger\",\n        EMAIL: \"source:email\"\n    };\n});\n__d(\"MercuryTimePassed\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        TODAY: 0,\n        WEEK_AGO: 1,\n        CURRENT_YEAR: 3,\n        OTHER_YEAR: 4,\n        MONTH_AGO: 2\n    };\n});\n__d(\"MessagingEvent\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        UNSUBSCRIBE: \"unsubscribe\",\n        DELIVERY_RECEIPT: \"delivery_receipt\",\n        REPORT_SPAM_MESSAGES: \"report_spam_messages\",\n        DELIVER_FAST_PAST: \"deliver_fast_path\",\n        DELETE_MESSAGES: \"delete_messages\",\n        READ_RECEIPT: \"read_receipt\",\n        SENT_PUSH: \"sent_push\",\n        READ: \"read\",\n        CHANGE_MUTE_SETTINGS: \"change_mute_settings\",\n        ERROR: \"error\",\n        UNMARK_SPAM: \"unmark_spam\",\n        UNREAD: \"unread\",\n        DELIVER_LOG: \"deliver_log\",\n        DELIVER: \"deliver\",\n        READ_ALL: \"read_all\",\n        TAG: \"tag\",\n        MORE_THREADS: \"more_threads\",\n        DELETE: \"delete\",\n        REPORT_SPAM: \"report_spam\",\n        SUBSCRIBE: \"subscribe\"\n    };\n});\n__d(\"AvailableListConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ON_AVAILABILITY_CHANGED: \"buddylist/availability-changed\",\n        ON_UPDATE_ERROR: \"buddylist/update-error\",\n        ON_UPDATED: \"buddylist/updated\",\n        ON_CHAT_NOTIFICATION_CHANGED: \"chat-notification-changed\",\n        OFFLINE: 0,\n        IDLE: 1,\n        ACTIVE: 2,\n        MOBILE: 3,\n        LEGACY_OVERLAY_OFFLINE: -1,\n        LEGACY_OVERLAY_ONLINE: 0,\n        LEGACY_OVERLAY_IDLE: 1,\n        legacyStatusMap: {\n            0: 2,\n            1: 1,\n            \"-1\": 0,\n            2: 3\n        },\n        reverseLegacyStatusMap: {\n            0: -1,\n            1: 1,\n            2: 0,\n            3: 2\n        }\n    };\n    a.AvailableListConstants = e.exports = g;\n});\n__d(\"RangedCallbackManager\", [\"CallbackManagerController\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"CallbackManagerController\"), h = b(\"copyProperties\"), i = b(\"createObjectFrom\"), j = function(k, l, m) {\n        this._resources = [];\n        this._reachedEndOfArray = false;\n        this._error = false;\n        this._existingIDs = {\n        };\n        this._controller = new g(this._constructCallbackArg.bind(this));\n        this._getValueHandler = k;\n        this._compareValuesHandler = l;\n        this._skipOnStrictHandler = m;\n    };\n    h(j.prototype, {\n        executeOrEnqueue: function(k, l, m, n) {\n            return this._controller.executeOrEnqueue({\n                start: k,\n                limit: l\n            }, m, {\n                strict: !!n\n            });\n        },\n        unsubscribe: function(k) {\n            this._controller.unsubscribe(k);\n        },\n        getUnavailableResources: function(k) {\n            var l = this._controller.getRequest(k), m = [];\n            if (((l && !this._reachedEndOfArray))) {\n                var n = l.request, o = this._filterForStrictResults(l.options), p = ((n.start + n.limit));\n                for (var q = o.length; ((q < p)); q++) {\n                    m.push(q);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return m;\n        },\n        addResources: function(k) {\n            k.forEach(function(l) {\n                if (!this._existingIDs[l]) {\n                    this._existingIDs[l] = true;\n                    this._resources.push(l);\n                    this._error = null;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.resortResources();\n            this._controller.runPossibleCallbacks();\n        },\n        addResourcesWithoutSorting: function(k, l) {\n            var m = this._resources.slice(0, l);\n            m = m.concat(k);\n            m = m.concat(this._resources.slice(l));\n            this._resources = m;\n            h(this._existingIDs, i(k, true));\n            this._error = null;\n            this._controller.runPossibleCallbacks();\n        },\n        removeResources: function(k) {\n            k.forEach(function(l) {\n                if (this._existingIDs[l]) {\n                    this._existingIDs[l] = false;\n                    var m = this._resources.indexOf(l);\n                    if (((m != -1))) {\n                        this._resources.splice(m, 1);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeAllResources: function() {\n            this._resources = [];\n            this._existingIDs = {\n            };\n        },\n        resortResources: function() {\n            this._resources = this._resources.sort(function(k, l) {\n                return this._compareValuesHandler(this._getValueHandler(k), this._getValueHandler(l));\n            }.bind(this));\n        },\n        setReachedEndOfArray: function() {\n            if (!this._reachedEndOfArray) {\n                this._reachedEndOfArray = true;\n                this._error = null;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        hasReachedEndOfArray: function() {\n            return this._reachedEndOfArray;\n        },\n        setError: function(k) {\n            if (((this._error !== k))) {\n                this._error = k;\n                this._controller.runPossibleCallbacks();\n            }\n        ;\n        ;\n        },\n        getError: function(k, l, m) {\n            var n = this._filterForStrictResults({\n                strict: m\n            });\n            return ((((((k + l)) > n.length)) ? this._error : null));\n        },\n        hasResource: function(k) {\n            return this._existingIDs[k];\n        },\n        getResourceAtIndex: function(k) {\n            return this._resources[k];\n        },\n        getAllResources: function() {\n            return this._resources.concat();\n        },\n        getCurrentArraySize: function() {\n            return this._resources.length;\n        },\n        _filterForStrictResults: function(k) {\n            var l = this._resources;\n            if (((((k && k.strict)) && this._skipOnStrictHandler))) {\n                l = l.filter(this._skipOnStrictHandler);\n            }\n        ;\n        ;\n            return l;\n        },\n        _constructCallbackArg: function(k, l) {\n            var m = this._filterForStrictResults(l);\n            if (((((!this._reachedEndOfArray && !this._error)) && ((((k.start + k.limit)) > m.length))))) {\n                return false;\n            }\n             else {\n                var n = m.slice(k.start, ((k.start + k.limit))), o = ((((((k.start + k.limit)) > m.length)) ? this._error : null));\n                return [n,o,];\n            }\n        ;\n        ;\n        },\n        getElementsUntil: function(k) {\n            var l = [];\n            for (var m = 0; ((m < this._resources.length)); m++) {\n                var n = this._getValueHandler(this._resources[m]);\n                if (((this._compareValuesHandler(n, k) > 0))) {\n                    break;\n                }\n            ;\n            ;\n                l.push(this._resources[m]);\n            };\n        ;\n            return l;\n        }\n    });\n    e.exports = j;\n});\n__d(\"formatDate\", [\"DateFormatConfig\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"DateFormatConfig\"), h = b(\"tx\"), i = [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\",], j = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",], k = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",], l = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function m(o, p) {\n        p = ((p || 2));\n        o = ((\"\" + o));\n        while (((o.length < p))) {\n            o = ((\"0\" + o));\n        ;\n        };\n    ;\n        return o;\n    };\n;\n    function n(o, p, q, r) {\n        if (!p) {\n            return \"\";\n        }\n    ;\n    ;\n        var s = [], t = null, u = null, v = ((q ? \"getUTC\" : \"get\")), w = o[((v + \"JSBNG__Date\"))](), x = o[((v + \"Day\"))](), y = o[((v + \"Month\"))](), z = o[((v + \"FullYear\"))](), aa = o[((v + \"Hours\"))](), ba = o[((v + \"Minutes\"))](), ca = o[((v + \"Seconds\"))](), da = o[((v + \"Milliseconds\"))]();\n        for (var ea = 0; ((ea < p.length)); ea++) {\n            u = p.charAt(ea);\n            if (((u == \"\\\\\"))) {\n                ea++;\n                s.push(p.charAt(ea));\n                continue;\n            }\n        ;\n        ;\n            switch (u) {\n              case \"d\":\n                t = m(w);\n                break;\n              case \"D\":\n                t = i[x];\n                break;\n              case \"j\":\n                t = w;\n                break;\n              case \"l\":\n                t = j[x];\n                break;\n              case \"F\":\n            \n              case \"f\":\n                t = l[y];\n                break;\n              case \"m\":\n                t = m(((y + 1)));\n                break;\n              case \"M\":\n                t = k[y];\n                break;\n              case \"n\":\n                t = ((y + 1));\n                break;\n              case \"Y\":\n                t = z;\n                break;\n              case \"y\":\n                t = ((\"\" + z)).slice(2);\n                break;\n              case \"a\":\n                t = ((((aa < 12)) ? \"am\" : \"pm\"));\n                break;\n              case \"A\":\n                t = ((((aa < 12)) ? \"AM\" : \"PM\"));\n                break;\n              case \"g\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : ((aa % 12))));\n                break;\n              case \"G\":\n                t = aa;\n                break;\n              case \"h\":\n                t = ((((((aa == 0)) || ((aa == 12)))) ? 12 : m(((aa % 12)))));\n                break;\n              case \"H\":\n                t = m(aa);\n                break;\n              case \"i\":\n                t = m(ba);\n                break;\n              case \"s\":\n                t = m(ca);\n                break;\n              case \"S\":\n                if (r) {\n                    t = g.ordinalSuffixes[w];\n                }\n                 else t = m(da, 3);\n            ;\n            ;\n                break;\n              default:\n                t = u;\n            };\n        ;\n            s.push(t);\n        };\n    ;\n        return s.join(\"\");\n    };\n;\n    e.exports = n;\n});\n__d(\"MercuryMessages\", [\"Arbiter\",\"AsyncRequest\",\"Env\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercuryActionStatus\",\"MercuryAssert\",\"MercuryAttachmentType\",\"MercuryConfig\",\"MercuryGenericConstants\",\"MercuryIDs\",\"MercuryLogMessageType\",\"MercuryMessageClientState\",\"MercuryMessageSourceTags\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercurySourceType\",\"MercuryTimePassed\",\"MercuryMessageIDs\",\"MercuryParticipants\",\"PresenceUtil\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"debounce\",\"formatDate\",\"randomInt\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"KeyedCallbackManager\"), l = b(\"MercuryActionTypeConstants\"), m = b(\"MercuryActionStatus\"), n = b(\"MercuryAssert\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryConfig\"), q = b(\"MercuryGenericConstants\"), r = b(\"MercuryIDs\"), s = b(\"MercuryLogMessageType\"), t = b(\"MercuryMessageClientState\"), u = b(\"MercuryMessageSourceTags\"), v = b(\"MercuryPayloadSource\"), w = b(\"MercurySingletonMixin\"), x = b(\"MercurySourceType\"), y = b(\"MercuryTimePassed\"), z = b(\"MercuryMessageIDs\"), aa = b(\"MercuryParticipants\"), ba = b(\"PresenceUtil\"), ca = b(\"RangedCallbackManager\"), da = b(\"MercuryServerRequests\"), ea = b(\"MercuryThreadInformer\"), fa = b(\"MercuryThreads\"), ga = b(\"copyProperties\"), ha = b(\"debounce\"), ia = b(\"formatDate\"), ja = b(\"randomInt\"), ka = b(\"tx\");\n    function la(cb, db) {\n        var eb = db;\n        if (cb._localIdsMap[db]) {\n            eb = cb._localIdsMap[db];\n        }\n    ;\n    ;\n        return cb._messages[eb];\n    };\n;\n    var ma = new k();\n    function na(cb, db) {\n        if (((db.JSBNG__status === undefined))) {\n            db.JSBNG__status = m.UNSENT;\n        }\n    ;\n    ;\n        db.timestamp_absolute = \"Today\";\n        db.message_id = ((db.message_id || cb.generateNewClientMessageID(db.timestamp)));\n        var eb = aa.getIDForUser(cb._fbid);\n        db.specific_to_list = ((db.specific_to_list || []));\n        if (((db.specific_to_list.length && ((db.specific_to_list.indexOf(eb) === -1))))) {\n            db.specific_to_list.push(eb);\n        }\n    ;\n    ;\n        if (!db.thread_id) {\n            if (((db.specific_to_list.length == 1))) {\n                db.thread_id = ((\"user:\" + cb._fbid));\n            }\n             else if (((db.specific_to_list.length == 2))) {\n                var fb = ((((db.specific_to_list[0] == eb)) ? db.specific_to_list[1] : db.specific_to_list[0]));\n                if (((r.tokenize(fb).type == \"email\"))) {\n                    db.thread_id = q.PENDING_THREAD_ID;\n                }\n                 else db.thread_id = cb._threads.getThreadIDForParticipant(fb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            db.thread_id = ((db.thread_id || ((\"root:\" + db.message_id))));\n        }\n    ;\n    ;\n        if (!db.specific_to_list.length) {\n            var gb = cb._serverRequests.tokenizeThreadID(db.thread_id);\n            if (((gb.type == \"user\"))) {\n                db.specific_to_list = [((\"fbid:\" + gb.value)),eb,];\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function oa(cb, db, eb, fb) {\n        var gb = ((ya(eb) ? [u.CHAT,] : [])), hb = JSBNG__Date.now(), ib = ia(new JSBNG__Date(hb), ((p[\"24h_times\"] ? \"H:i\" : \"g:ia\"))), jb = {\n            action_type: db,\n            thread_id: fb,\n            author: aa.getIDForUser(cb._fbid),\n            author_email: null,\n            coordinates: null,\n            timestamp: hb,\n            timestamp_absolute: (new JSBNG__Date(hb)).toLocaleDateString(),\n            timestamp_relative: ib,\n            timestamp_time_passed: y.TODAY,\n            is_unread: false,\n            is_cleared: false,\n            is_forward: false,\n            is_filtered_content: false,\n            spoof_warning: false,\n            source: eb,\n            source_tags: gb\n        };\n        return jb;\n    };\n;\n    function pa(cb) {\n        switch (cb) {\n          case v.UNKNOWN:\n        \n          case v.SERVER_INITIAL_DATA:\n        \n          case v.SERVER_FETCH_THREAD_INFO:\n        \n          case v.SERVER_THREAD_SYNC:\n            return true;\n        };\n    ;\n        return false;\n    };\n;\n    function qa(cb) {\n        return ((cb && ((cb.substr(0, 6) === \"server\"))));\n    };\n;\n    function ra(cb, db) {\n        if (!cb._threadsToMessages[db]) {\n            cb._threadsToMessages[db] = new ca(function(eb) {\n                return la(cb, eb).timestamp;\n            }, function(eb, fb) {\n                return ((fb - eb));\n            });\n        }\n    ;\n    ;\n        return cb._threadsToMessages[db];\n    };\n;\n    g.subscribe(j.DUMP_EVENT, function(cb, db) {\n        var eb = {\n        }, fb = {\n        }, gb = ta._getInstances();\n        {\n            var fin161keys = ((window.top.JSBNG_Replay.forInKeys)((gb))), fin161i = (0);\n            var hb;\n            for (; (fin161i < fin161keys.length); (fin161i++)) {\n                ((hb) = (fin161keys[fin161i]));\n                {\n                    eb[hb] = {\n                    };\n                    {\n                        var fin162keys = ((window.top.JSBNG_Replay.forInKeys)((gb[hb]._messages))), fin162i = (0);\n                        var ib;\n                        for (; (fin162i < fin162keys.length); (fin162i++)) {\n                            ((ib) = (fin162keys[fin162i]));\n                            {\n                                var jb = gb[hb]._messages[ib];\n                                if (((Object.keys(jb).length === 0))) {\n                                    continue;\n                                }\n                            ;\n                            ;\n                                var kb = jb.thread_id;\n                                eb[hb][kb] = ((eb[hb][kb] || {\n                                }));\n                                eb[hb][kb][jb.message_id] = {\n                                    action_type: jb.action_type,\n                                    author: jb.author,\n                                    is_unread: jb.is_unread,\n                                    timestamp: jb.timestamp\n                                };\n                            };\n                        };\n                    };\n                ;\n                    fb[hb] = ga({\n                    }, gb[hb]._localIdsMap);\n                };\n            };\n        };\n    ;\n        db.messaging = ((db.messaging || {\n        }));\n        db.messaging.local_message_ids = fb;\n        db.messaging.messages = eb;\n    });\n    function sa(cb, db, eb) {\n        db.forEach(function(fb) {\n            var gb = ra(cb, fb);\n            gb.setReachedEndOfArray();\n            cb._threadInformer.reorderedMessages(fb, eb);\n        });\n    };\n;\n    function ta(cb) {\n        this._fbid = cb;\n        this._serverRequests = da.getForFBID(this._fbid);\n        this._threadInformer = ea.getForFBID(this._fbid);\n        this._threads = fa.getForFBID(this._fbid);\n        this._failedHistoryFetchThreads = {\n        };\n        this._threadsToMessages = {\n        };\n        this._titanMessagesCount = {\n        };\n        this._localTitanMessagesCount = {\n        };\n        this._messages = {\n        };\n        this._attachmentData = {\n        };\n        this._messagesNeedingAttachmentData = {\n        };\n        this._localIdsMap = {\n        };\n        this._serverRequests.subscribe(\"update-messages\", function(db, eb) {\n            var fb = ((eb.actions || [])).filter(function(hb) {\n                var ib = hb.action_type;\n                return ((((hb.is_forward || hb.thread_id)) && ((((((((((((ib == l.LOG_MESSAGE)) || ((ib == l.USER_GENERATED_MESSAGE)))) || ((ib == l.SEND_MESSAGE)))) || ((ib == l.CLEAR_CHAT)))) || ((ib == l.DELETE_THREAD)))) || ((ib == l.DELETE_MESSAGES))))));\n            }), gb = pa(eb.payload_source);\n            if (qa(eb.payload_source)) {\n                fb.forEach(function(hb) {\n                    if (!hb.is_forward) {\n                        var ib = this._threads.getThreadMetaNow(hb.thread_id);\n                        if (ib) {\n                            hb.is_cleared = ((hb.timestamp < ib.chat_clear_time));\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            this.handleUpdates(fb, gb, eb.payload_source, eb.from_client);\n            if (eb.end_of_history) {\n                sa(this, eb.end_of_history, eb.payload_source);\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    ga(ta.prototype, {\n        getMessagesFromIDs: function(cb) {\n            return ((cb || [])).map(la.curry(this)).filter(function(db) {\n                return db;\n            });\n        },\n        hasLoadedNMessages: function(cb, db) {\n            var eb = ra(this, cb);\n            return ((eb.hasReachedEndOfArray() || ((eb.getCurrentArraySize() >= db))));\n        },\n        hasLoadedExactlyNMessages: function(cb, db) {\n            var eb = ra(this, cb);\n            return ((eb.getCurrentArraySize() == db));\n        },\n        getThreadMessagesRange: function(cb, db, eb, fb, gb, hb) {\n            var ib = ra(this, cb), jb = function(pb) {\n                fb(ua(this, pb));\n            }.bind(this), kb = ib.executeOrEnqueue(db, eb, jb), lb = ib.getUnavailableResources(kb), mb = this._failedHistoryFetchThreads[cb];\n            if (((lb.length && !mb))) {\n                var nb = ((((this._titanMessagesCount[cb] || 0)) - ((this._localTitanMessagesCount[cb] || 0)))), ob = ((lb.length + ((this._localTitanMessagesCount[cb] || 0))));\n                this._serverRequests.fetchThreadMessages(cb, nb, ob, gb, hb);\n            }\n             else this._failedHistoryFetchThreads[cb] = false;\n        ;\n        ;\n            return kb;\n        },\n        getThreadMessagesSinceTimestamp: function(cb, db) {\n            var eb = ra(this, cb), fb = eb.getElementsUntil(db);\n            return ua(this, fb);\n        },\n        hasLoadedAllMessages: function(cb) {\n            return ra(this, cb).hasReachedEndOfArray();\n        },\n        getCurrentlyLoadedMessages: function(cb) {\n            var db = ra(this, cb).getAllResources();\n            return ua(this, db);\n        },\n        unsubscribe: function(cb, db) {\n            n.isThreadID(db);\n            var eb = ra(this, db);\n            eb.unsubscribe(cb);\n        },\n        addAttachmentData: function(cb, db, eb) {\n            var fb = la(this, cb);\n            if (fb) {\n                var gb = fb.attachments.indexOf(db);\n                if (((gb != -1))) {\n                    fb.attachments[gb] = eb;\n                    this._threadInformer.updatedMessage(fb.thread_id, fb.message_id, \"attach\");\n                }\n            ;\n            ;\n            }\n             else {\n                if (!this._attachmentData[cb]) {\n                    this._attachmentData[cb] = [];\n                }\n            ;\n            ;\n                this._attachmentData[cb].push({\n                    attach_key: db,\n                    data: eb\n                });\n            }\n        ;\n        ;\n        },\n        handleUpdates: function(cb, db, eb, fb) {\n            var gb, hb = {\n            }, ib = {\n            };\n            for (var jb = 0; ((jb < cb.length)); jb++) {\n                var kb = cb[jb];\n                if (((kb.is_forward || ((eb == v.SERVER_SEARCH))))) {\n                    if (!this._messages[kb.message_id]) {\n                        this._messages[kb.message_id] = kb;\n                        za(this, kb);\n                    }\n                ;\n                ;\n                    continue;\n                }\n            ;\n            ;\n                if (((kb.client_state === t.SEND_TO_SERVER))) {\n                    this._messages[kb.message_id] = kb;\n                    za(this, kb);\n                    continue;\n                }\n            ;\n            ;\n                var lb = kb.action_type;\n                if (((lb == l.SEND_MESSAGE))) {\n                    var mb = kb.client_message_id;\n                    if (((((mb && this._localIdsMap[mb])) && kb.JSBNG__status))) {\n                        if (((kb.JSBNG__status == m.UNCONFIRMED))) {\n                            if (!ib[kb.thread_id]) {\n                                ib[kb.thread_id] = [];\n                            }\n                        ;\n                        ;\n                            ib[kb.thread_id].push(kb.client_message_id);\n                        }\n                         else if (!hb[kb.thread_id]) {\n                            hb[kb.thread_id] = [];\n                        }\n                        \n                    ;\n                    ;\n                        var nb = la(this, kb.client_message_id), ob = nb.JSBNG__status;\n                        nb.JSBNG__status = kb.JSBNG__status;\n                        if (((((kb.JSBNG__status === m.SUCCESS)) || kb.error_data))) {\n                            nb.error_data = kb.error_data;\n                        }\n                    ;\n                    ;\n                        if (((kb.JSBNG__status == m.SUCCESS))) {\n                            this.updateLocalMessage(kb, eb);\n                            if (((kb.client_thread_id == q.PENDING_THREAD_ID))) {\n                                nb.thread_id = kb.thread_id;\n                                hb[kb.thread_id].push(nb.message_id);\n                                ma.setResource(nb.message_id, nb.thread_id);\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (((((((((((typeof ob != \"undefined\")) || ((kb.JSBNG__status == m.FAILED_UNKNOWN_REASON)))) || ((kb.JSBNG__status == m.UNABLE_TO_CONFIRM)))) || ((kb.JSBNG__status == m.SUCCESS)))) || ((kb.JSBNG__status == m.ERROR))))) {\n                            this._threadInformer.updatedMessage(kb.thread_id, la(this, kb.client_message_id).message_id, eb);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    continue;\n                }\n                 else if (((lb == l.DELETE_THREAD))) {\n                    ra(this, kb.thread_id).removeAllResources();\n                    continue;\n                }\n                 else if (((lb == l.DELETE_MESSAGES))) {\n                    var pb = kb.message_ids.map(function(wb) {\n                        return la(this, wb).message_id;\n                    }.bind(this));\n                    gb = ra(this, kb.thread_id);\n                    gb.removeResources(pb);\n                    this._threadInformer.reorderedMessages(kb.thread_id, eb);\n                    continue;\n                }\n                 else if (((lb == l.LOG_MESSAGE))) {\n                    if (((kb.log_message_type == s.SERVER_ERROR))) {\n                        this._failedHistoryFetchThreads[kb.thread_id] = true;\n                    }\n                ;\n                ;\n                }\n                 else if (((lb == l.CLEAR_CHAT))) {\n                    var qb = ra(this, kb.thread_id).getAllResources();\n                    qb.map(la.curry(this)).forEach(function(wb) {\n                        wb.is_cleared = true;\n                    });\n                    continue;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                var rb = la(this, kb.message_id);\n                if (((((kb.threading_id && this._localIdsMap[kb.threading_id])) || ((rb && !rb.is_forward))))) {\n                    continue;\n                }\n            ;\n            ;\n                if (!hb[kb.thread_id]) {\n                    hb[kb.thread_id] = [];\n                }\n            ;\n            ;\n                hb[kb.thread_id].push(kb.message_id);\n                this._messages[kb.message_id] = kb;\n                za(this, kb);\n                if (((kb.threading_id && ((kb.threading_id != kb.message_id))))) {\n                    z.addServerID(kb.threading_id, kb.message_id);\n                }\n            ;\n            ;\n                if (!db) {\n                    this._threadInformer.receivedMessage(kb);\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin163keys = ((window.top.JSBNG_Replay.forInKeys)((hb))), fin163i = (0);\n                var sb;\n                for (; (fin163i < fin163keys.length); (fin163i++)) {\n                    ((sb) = (fin163keys[fin163i]));\n                    {\n                        gb = ra(this, sb);\n                        var tb = gb.getAllResources(), ub = tb.filter(function(wb) {\n                            var xb = this._messages[wb];\n                            return ((((xb.action_type == l.LOG_MESSAGE)) && ((xb.log_message_type == s.SERVER_ERROR))));\n                        }.bind(this));\n                        gb.removeResources(ub);\n                        va(this, sb, hb[sb]);\n                        if (fb) {\n                            wa(this, sb, hb[sb]);\n                        }\n                    ;\n                    ;\n                        if (db) {\n                            gb.addResources(hb[sb]);\n                            this._threadInformer.reorderedMessages(sb, eb);\n                        }\n                         else gb.addResourcesWithoutSorting(hb[sb].reverse(), 0);\n                    ;\n                    ;\n                        this._threadInformer.updatedThread(sb);\n                    };\n                };\n            };\n        ;\n            var vb = Object.keys(ib);\n            if (vb.length) {\n                this._serverRequests.requestMessageConfirmation(ib);\n            }\n        ;\n        ;\n        },\n        sendMessage: function(cb, db, eb) {\n            db = ((db || Function.prototype));\n            na(this, cb);\n            this._localIdsMap[cb.message_id] = cb.message_id;\n            if (((cb.thread_id == ((\"root:\" + cb.message_id))))) {\n                ra(this, cb.thread_id).setReachedEndOfArray();\n            }\n        ;\n        ;\n            this._serverRequests.sendNewMessage(cb, eb);\n            if (((cb.thread_id == q.PENDING_THREAD_ID))) {\n                this._messages[cb.message_id] = cb;\n                return ma.executeOrEnqueue(cb.message_id, db);\n            }\n             else db(cb.thread_id);\n        ;\n        ;\n        },\n        isFirstMessage: function(cb) {\n            var db = ra(this, cb.thread_id);\n            if (((db.getCurrentArraySize() === 0))) {\n                return false;\n            }\n        ;\n        ;\n            var eb = db.getResourceAtIndex(((db.getCurrentArraySize() - 1))), fb = la(this, eb).message_id, gb = la(this, cb.message_id).message_id;\n            return ((db.hasReachedEndOfArray() && ((fb == gb))));\n        },\n        unsubscribeSend: function(cb) {\n            ma.unsubscribe(cb);\n        },\n        resendMessage: function(cb, db) {\n            var eb = ga({\n            }, cb);\n            eb.JSBNG__status = m.RESENDING;\n            eb.timestamp = JSBNG__Date.now();\n            eb.message_id = cb.message_id;\n            this._messages[cb.message_id] = eb;\n            var fb = ra(this, cb.thread_id);\n            fb.resortResources([cb.message_id,]);\n            this.sendMessage(eb, null, db);\n            this._threadInformer.reorderedMessages(cb.thread_id, v.CLIENT_SEND_MESSAGE);\n        },\n        deleteMessages: function(cb, db) {\n            if (db.length) {\n                var eb = ra(this, cb), fb = ((((eb.getCurrentArraySize() == db.length)) && eb.hasReachedEndOfArray()));\n                this._serverRequests.deleteMessages(cb, db, fb);\n            }\n        ;\n        ;\n        },\n        markMessagesSpam: function(cb, db) {\n            if (db.length) {\n                var eb = ra(this, cb), fb = ((((eb.getCurrentArraySize() == db.length)) && eb.hasReachedEndOfArray()));\n                if (fb) {\n                    this._serverRequests.markThreadSpam(cb);\n                }\n                 else this._serverRequests.markMessagesSpam(cb, db);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        updateLocalMessage: function(cb, db) {\n            var eb = cb.message_id, fb = cb.client_message_id;\n            this._localIdsMap[fb] = eb;\n            this._messages[eb] = this._messages[fb];\n            z.addServerID(fb, eb);\n            this._messages[fb] = {\n            };\n            var gb = la(this, fb);\n            if (cb.timestamp) {\n                gb.timestamp = cb.timestamp;\n            }\n        ;\n        ;\n            if (((cb.attachments && cb.attachments.length))) {\n                gb.raw_attachments = null;\n                gb.attachments = cb.attachments;\n                za(this, gb, eb);\n            }\n        ;\n        ;\n            if (cb.log_message_data) {\n                gb.log_message_data = cb.log_message_data;\n            }\n        ;\n        ;\n            if (xa(gb)) {\n                this._localTitanMessagesCount[gb.thread_id]--;\n            }\n        ;\n        ;\n        },\n        constructUserGeneratedMessageObject: function(cb, db, eb, fb) {\n            var gb = oa(this, l.USER_GENERATED_MESSAGE, db, eb);\n            gb.body = cb;\n            gb.has_attachment = false;\n            gb.html_body = false;\n            gb.attachments = [];\n            gb.specific_to_list = ((fb || []));\n            return gb;\n        },\n        constructLogMessageObject: function(cb, db, eb, fb) {\n            var gb = oa(this, l.LOG_MESSAGE, cb, db);\n            gb.log_message_type = eb;\n            gb.log_message_data = fb;\n            return gb;\n        },\n        generateNewClientMessageID: function(cb) {\n            var db = ((((((((cb + \":\")) + ((ja(0, 4294967295) + 1)))) + \"-\")) + ba.getSessionID()));\n            return ((((\"\\u003C\" + db)) + \"@mail.projektitan.com\\u003E\"));\n        },\n        getNumberLocalMessages: function(cb) {\n            return ((this._localTitanMessagesCount[cb] || 0));\n        }\n    });\n    ga(ta, w, {\n        addAttachmentData: function(cb, db, eb, fb) {\n            fb = ((fb || i.user));\n            ta.getForFBID(fb).addAttachmentData(cb, db, eb);\n        }\n    });\n    function ua(cb, db) {\n        var eb = db.map(la.curry(cb));\n        return eb.reverse();\n    };\n;\n    function va(cb, db, eb) {\n        var fb = eb.filter(function(gb) {\n            return xa(la(cb, gb));\n        });\n        if (!cb._titanMessagesCount[db]) {\n            cb._titanMessagesCount[db] = 0;\n        }\n    ;\n    ;\n        cb._titanMessagesCount[db] += fb.length;\n    };\n;\n    function wa(cb, db, eb) {\n        var fb = eb.filter(function(gb) {\n            return xa(la(cb, gb));\n        });\n        if (!cb._localTitanMessagesCount[db]) {\n            cb._localTitanMessagesCount[db] = 0;\n        }\n    ;\n    ;\n        cb._localTitanMessagesCount[db] += fb.length;\n    };\n;\n    function xa(cb) {\n        var db = cb.action_type;\n        if (((db == l.USER_GENERATED_MESSAGE))) {\n            return true;\n        }\n    ;\n    ;\n        switch (cb.log_message_type) {\n          case s.SUBSCRIBE:\n        \n          case s.UNSUBSCRIBE:\n        \n          case s.SERVER_ERROR:\n        \n          case s.LIVE_LISTEN:\n            return false;\n          default:\n            return true;\n        };\n    ;\n    };\n;\n    function ya(cb) {\n        switch (cb) {\n          case x.CHAT_WEB:\n        \n          case x.CHAT_JABBER:\n        \n          case x.CHAT_IPHONE:\n        \n          case x.CHAT_MEEBO:\n        \n          case x.CHAT_ORCA:\n        \n          case x.CHAT_TEST:\n        \n          case x.CHAT:\n        \n          case x.DESKTOP:\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function za(cb, db, eb) {\n        eb = ((eb || db.message_id));\n        var fb = cb._attachmentData[eb];\n        if (fb) {\n            fb.forEach(function(gb) {\n                var hb = db.attachments.indexOf(gb.attach_key);\n                if (((hb !== -1))) {\n                    db.attachments[hb] = gb.data;\n                }\n            ;\n            ;\n            });\n            delete cb._attachmentData[eb];\n        }\n         else if (((!db.is_forward && ab(cb, db)))) {\n            cb._messagesNeedingAttachmentData[eb] = true;\n            bb(cb);\n        }\n        \n    ;\n    ;\n    };\n;\n    function ab(cb, db) {\n        if (((!db || !db.attachments))) {\n            return false;\n        }\n    ;\n    ;\n        for (var eb = 0; ((eb < db.attachments.length)); eb++) {\n            var fb = db.attachments[eb];\n            if (((((typeof fb === \"string\")) && ((fb.indexOf(o.SHARE) === 0))))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        var gb = ((db.forward_message_ids || []));\n        for (eb = 0; ((eb < gb.length)); eb++) {\n            var hb = la(cb, gb[eb]);\n            if (ab(cb, hb)) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var bb = ha(function(cb) {\n        var db = {\n        };\n        {\n            var fin164keys = ((window.top.JSBNG_Replay.forInKeys)((cb._messagesNeedingAttachmentData))), fin164i = (0);\n            var eb;\n            for (; (fin164i < fin164keys.length); (fin164i++)) {\n                ((eb) = (fin164keys[fin164i]));\n                {\n                    var fb = la(cb, eb);\n                    if (ab(cb, fb)) {\n                        db[eb] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        var gb = Object.keys(db);\n        if (gb.length) {\n            new h(\"/ajax/mercury/attachments/fetch_shares.php\").setData({\n                message_ids: gb\n            }).setAllowCrossPageTransition(true).send();\n        }\n    ;\n    ;\n        cb._messagesNeedingAttachmentData = {\n        };\n    }, 0, this, true);\n    e.exports = ta;\n});\n__d(\"ChatOpenTab\", [\"Arbiter\",\"Banzai\",\"Bootloader\",\"ChatVisibility\",\"JSBNG__Event\",\"MercuryIDs\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Banzai\"), i = b(\"Bootloader\"), j = b(\"ChatVisibility\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryIDs\"), m = b(\"MercuryMessages\").get(), n = b(\"MercuryServerRequests\").get(), o = b(\"MercuryThreads\").get(), p = \"messaging_tracking\";\n    function q(u) {\n        o.getThreadMeta(u, function() {\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        });\n    };\n;\n    function r(u, v, w, x) {\n        k.listen(u, \"click\", function(y) {\n            if (x(v, w)) {\n                return;\n            }\n        ;\n        ;\n            return y.kill();\n        });\n    };\n;\n    function s(u, v, w) {\n        var x = {\n            referrer: ((u || \"\")),\n            message_thread_id: v,\n            message_view: \"chat\",\n            timestamp_send: JSBNG__Date.now()\n        };\n        if (((w !== undefined))) {\n            x.message_target_ids = [w,];\n        }\n    ;\n    ;\n        h.post(p, x, {\n            delay: 0,\n            retry: true\n        });\n    };\n;\n    var t = {\n        openEmptyTab: function(u, v) {\n            if (((!window.Chat || !j.isOnline()))) {\n                return true;\n            }\n        ;\n        ;\n            i.loadModules([\"ChatTabModel\",], function(w) {\n                var x = w.getEmptyTab();\n                if (!x) {\n                    x = ((\"root:\" + m.generateNewClientMessageID(JSBNG__Date.now())));\n                    o.createNewLocalThread(x, []);\n                }\n            ;\n            ;\n                q(x);\n                s(v, x);\n            });\n        },\n        listenOpenEmptyTab: function(u, v) {\n            r(u, null, v, t.openEmptyTab);\n        },\n        openThread: function(u, v) {\n            if (l.isValid(u)) {\n                q(u);\n            }\n             else n.getClientThreadID(u, q);\n        ;\n        ;\n            s(v, u);\n        },\n        listenOpenThread: function(u, v, w) {\n            r(u, v, w, t.openThread);\n        },\n        openUserTab: function(u, v) {\n            var w = o.getCanonicalThreadToUser(u);\n            q(w.thread_id);\n            s(v, w.thread_id, u);\n        },\n        listenOpenUserTab: function(u, v, w) {\n            r(u, v, w, t.openUserTab);\n        }\n    };\n    e.exports = t;\n});\n__d(\"SplitImage.react\", [\"React\",\"JSBNG__Image.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"JSBNG__Image.react\"), i = b(\"cx\"), j = g.createClass({\n        displayName: \"SplitImage\",\n        render: function() {\n            var k = this.props.size;\n            return this.transferPropsTo(g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__root\",\n                style: {\n                    width: k,\n                    height: k\n                }\n            }, this.renderImages()));\n        },\n        renderImages: function() {\n            if (!this.props.srcs) {\n                return null;\n            }\n        ;\n        ;\n            if (!((this.props.srcs instanceof Array))) {\n                return (h({\n                    src: this.props.srcs,\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n            }\n        ;\n        ;\n            switch (this.props.srcs.length) {\n              case 1:\n                return (h({\n                    src: this.props.srcs[0],\n                    height: this.props.size,\n                    width: this.props.size\n                }));\n              case 2:\n                return this.renderTwo();\n              default:\n                return this.renderThree();\n            };\n        ;\n        },\n        renderTwo: function() {\n            var k = Math.floor(((this.props.size / 2))), l = -Math.floor(((k / 2))), m = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? ((\" \" + \"-cx-PRIVATE-splitImage__borderleft\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: m,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            }))));\n        },\n        renderThree: function() {\n            var k = Math.floor(((((this.props.size / 3)) * 2))), l = -Math.floor(((((this.props.size - k)) / 2))), m = Math.floor(((this.props.size / 2))), n = ((this.props.size - k)), o = -Math.floor(((((m - n)) / 2))), p = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? ((\" \" + \"-cx-PRIVATE-splitImage__borderright\")) : \"\")))), q = (((\"-cx-PRIVATE-splitImage__image\") + ((this.props.border ? ((\" \" + \"-cx-PRIVATE-splitImage__borderbottom\")) : \"\"))));\n            return (g.DOM.div(null, g.DOM.div({\n                className: p,\n                style: {\n                    width: k\n                }\n            }, h({\n                src: this.props.srcs[0],\n                width: this.props.size,\n                height: this.props.size,\n                style: {\n                    marginLeft: l\n                }\n            })), g.DOM.div({\n                className: q,\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[1],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            })), g.DOM.div({\n                className: \"-cx-PRIVATE-splitImage__image\",\n                style: {\n                    width: n,\n                    height: m\n                }\n            }, h({\n                src: this.props.srcs[2],\n                width: m,\n                height: m,\n                style: {\n                    marginLeft: o\n                }\n            }))));\n        }\n    });\n    e.exports = j;\n});\n__d(\"loadImage\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = new JSBNG__Image();\n        j.JSBNG__onload = function() {\n            i(j.width, j.height, j);\n        };\n        j.src = h;\n    };\n;\n    e.exports = g;\n});\n__d(\"PixelzFocus\", [], function(a, b, c, d, e, f) {\n    var g = {\n        search: function(h, i) {\n            var j = 0, k = ((h.length - 1));\n            while (((j <= k))) {\n                var l = ((j + Math.floor(((((k - j)) / 2))))), m = h[l];\n                if (((m > i))) {\n                    k = ((l - 1));\n                }\n                 else if (((m < i))) {\n                    j = ((l + 1));\n                }\n                 else return l\n                \n            ;\n            };\n        ;\n            return Math.min(j, k);\n        },\n        forceSpecificPoint: function(h, i, j) {\n            var k = 1e-9, l = ((g.search(h, ((((i - j)) - k))) + 1)), m = g.search(h, ((i + j)));\n            return h.slice(l, ((m + 1)));\n        },\n        findBiggestSets: function(h, i) {\n            var j = [], k = -1;\n            for (var l = 0; ((l < h.length)); ++l) {\n                var m = h[l], n = l, o = g.search(h, ((m + i))), p = ((o - n));\n                if (((p > k))) {\n                    j = [];\n                }\n            ;\n            ;\n                if (((p >= k))) {\n                    k = p;\n                    j.push({\n                        low: n,\n                        high: o\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            return j;\n        },\n        getBestSet: function(h, i, j) {\n            var k = -1, l = null;\n            for (var m = 0; ((m < i.length)); ++m) {\n                var n = i[m], o = h[n.low], p = h[n.high], q = ((o + ((((p - o)) / 2)))), r = Math.min(((o - ((q - j)))), ((((q + j)) - p)));\n                if (((r > k))) {\n                    k = r;\n                    l = n;\n                }\n            ;\n            ;\n            };\n        ;\n            return l;\n        },\n        getFocusFromSet: function(h, i) {\n            var j = h[i.low], k = h[i.high];\n            return ((j + ((((k - j)) / 2))));\n        },\n        clampFocus: function(h, i) {\n            var j = ((i / 2)), k = ((1 - ((i / 2))));\n            if (((h < j))) {\n                return j;\n            }\n        ;\n        ;\n            if (((h > k))) {\n                return k;\n            }\n        ;\n        ;\n            return h;\n        },\n        convertFromCenterToCSS: function(h, i) {\n            if (((Math.abs(((1 - i))) < 41913))) {\n                return 0;\n            }\n        ;\n        ;\n            return ((((h - ((i / 2)))) / ((1 - i))));\n        },\n        convertFromCSSToCenter: function(h, i) {\n            return ((((h * ((1 - i)))) + ((i / 2))));\n        },\n        getVisible: function(h, i) {\n            if (((h < i))) {\n                return ((h / i));\n            }\n        ;\n        ;\n            return ((i / h));\n        },\n        getHidden: function(h, i) {\n            return ((1 - g.getVisible(h, i)));\n        },\n        focusHorizontally: function(h, i) {\n            return ((h < i));\n        },\n        convertVectorFromCenterToCSS: function(h, i, j) {\n            var k = g.focusHorizontally(i, j), l;\n            if (k) {\n                l = ((h.x / 100));\n            }\n             else l = ((h.x / 100));\n        ;\n        ;\n            var m = g.convertFromCenterToCSS(l, g.getVisible(i, j));\n            if (k) {\n                return {\n                    x: m,\n                    y: 0\n                };\n            }\n             else return {\n                x: 0,\n                y: m\n            }\n        ;\n        },\n        getCropRect: function(h, i, j) {\n            var k = g.focusHorizontally(i, j), l = g.getVisible(i, j);\n            if (k) {\n                var m = ((((1 - l)) * h.x));\n                return {\n                    left: m,\n                    JSBNG__top: 0,\n                    width: l,\n                    height: 1\n                };\n            }\n             else {\n                var n = ((((1 - l)) * h.y));\n                return {\n                    left: 0,\n                    JSBNG__top: n,\n                    width: 1,\n                    height: l\n                };\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = g;\n});\n__d(\"Pixelz.react\", [\"arrayContains\",\"copyProperties\",\"cx\",\"invariant\",\"loadImage\",\"React\",\"ReactPropTypes\",\"PixelzFocus\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"copyProperties\"), i = b(\"cx\"), j = b(\"invariant\"), k = b(\"loadImage\"), l = b(\"React\"), m = b(\"ReactPropTypes\"), n = b(\"PixelzFocus\"), o = l.createClass({\n        displayName: \"Pixelz\",\n        propTypes: {\n            width: m.number,\n            height: m.number,\n            resizeMode: m.oneOf([\"contain\",\"cover\",\"stretch\",]),\n            alt: m.string,\n            letterbox: m.bool,\n            borderRadius: m.number,\n            insetBorderColor: m.string,\n            animated: m.bool,\n            upscale: m.bool,\n            cropRect: function(p, q, r) {\n                var s = p[q], t = ((((((((((\"Invalid prop `\" + q)) + \"` supplied to `\")) + r)) + \"`, expected a rectangle with values normalized \")) + \"between 0 and 1\"));\n                j(((s.left >= 0)));\n                j(((s.JSBNG__top >= 0)));\n                j(((s.width >= 0)));\n                j(((s.height >= 0)));\n                j(((((s.left + s.width)) <= 1)));\n                j(((((s.JSBNG__top + s.height)) <= 1)));\n            },\n            JSBNG__focus: function(p, q, r) {\n                var s = p[q], t = ((((((((((((\"Invalid prop `\" + q)) + \"` supplied to `\")) + r)) + \"`, expected either a {x, y, type} vector where type \")) + \"is `css` or `center` or an array of {x, y} vectors. All the vectors \")) + \"have with values normalized between 0 and 1\"));\n                if (Array.isArray(s)) {\n                    for (var u = 0; ((u < s.length)); ++u) {\n                        j(((((s[u].x >= 0)) && ((s[u].x <= 1)))));\n                        j(((((s[u].y >= 0)) && ((s[u].y <= 1)))));\n                    };\n                ;\n                }\n                 else {\n                    if (!s.type) {\n                        s.type = \"css\";\n                    }\n                ;\n                ;\n                    j(((((s.x >= 0)) && ((s.x <= 1)))));\n                    j(((((s.y >= 0)) && ((s.y <= 1)))));\n                    j(g([\"center\",\"css\",], s.type));\n                }\n            ;\n            ;\n            }\n        },\n        getDefaultProps: function() {\n            return {\n                resizeMode: \"cover\",\n                alt: \"\",\n                letterbox: true,\n                upscale: true,\n                cropRect: {\n                    width: 1,\n                    height: 1,\n                    JSBNG__top: 0,\n                    left: 0\n                },\n                JSBNG__focus: {\n                    x: 25908,\n                    y: 25913,\n                    type: \"css\"\n                }\n            };\n        },\n        getInitialState: function() {\n            return {\n                srcDimensions: {\n                }\n            };\n        },\n        getSrcDimensions: function() {\n            var p = this.props.src, q = this.state.srcDimensions[p];\n            if (q) {\n                return q;\n            }\n        ;\n        ;\n            k(p, function(r, s) {\n                var t = {\n                };\n                t[p] = {\n                    width: r,\n                    height: s\n                };\n                this.setState({\n                    srcDimensions: t\n                });\n            }.bind(this));\n            return null;\n        },\n        getCropSrcDimensions: function() {\n            var p = this.getSrcDimensions();\n            return {\n                width: ((p.width * this.props.cropRect.width)),\n                height: ((p.height * this.props.cropRect.height))\n            };\n        },\n        getUpscaleCropDimensions: function() {\n            var p = this.getCropSrcDimensions(), q = ((p.width / p.height)), r = ((this.props.width / this.props.height));\n            if (((((this.props.width && this.props.height)) && ((this.props.resizeMode === \"stretch\"))))) {\n                return {\n                    width: this.props.width,\n                    height: this.props.height\n                };\n            }\n        ;\n        ;\n            if (((((!this.props.width && this.props.height)) || ((((this.props.resizeMode === \"contain\")) !== ((q >= r))))))) {\n                return {\n                    width: ((this.props.height * q)),\n                    height: this.props.height\n                };\n            }\n        ;\n        ;\n            if (this.props.width) {\n                return {\n                    width: this.props.width,\n                    height: ((this.props.width / q))\n                };\n            }\n        ;\n        ;\n            return p;\n        },\n        getCropDimensions: function() {\n            var p = this.getUpscaleCropDimensions(), q = this.getCropSrcDimensions();\n            if (!this.props.upscale) {\n                return {\n                    width: Math.min(p.width, q.width),\n                    height: Math.min(p.height, q.height)\n                };\n            }\n        ;\n        ;\n            return p;\n        },\n        getCropAspectRatio: function() {\n            var p = this.getCropDimensions();\n            return ((p.width / p.height));\n        },\n        getContainerDimensions: function() {\n            if (((((this.props.letterbox && this.props.width)) && this.props.height))) {\n                return {\n                    width: this.props.width,\n                    height: this.props.height\n                };\n            }\n        ;\n        ;\n            return this.getCropDimensions();\n        },\n        getContainerAspectRatio: function() {\n            var p = this.getContainerDimensions();\n            return ((p.width / p.height));\n        },\n        getContainerPosition: function() {\n            return {\n                left: 0,\n                JSBNG__top: 0\n            };\n        },\n        getFocus: function() {\n            var p = this.props.JSBNG__focus;\n            if (((!Array.isArray(p) && ((p.type === \"css\"))))) {\n                return {\n                    x: p.x,\n                    y: p.y\n                };\n            }\n        ;\n        ;\n            var q = this.getContainerAspectRatio(), r = this.getCropAspectRatio(), s = n.getVisible(q, r), t = n.focusHorizontally(q, r), u;\n            if (!Array.isArray(p)) {\n                u = n.convertFromCenterToCSS(((t ? p.x : p.y)), s);\n            }\n             else {\n                var v = p.map(function(y) {\n                    return ((t ? y.x : y.y));\n                });\n                v.sort();\n                var w = n.findBiggestSets(v, s), x = n.getBestSet(v, w, s);\n                u = n.getFocusFromSet(v, x);\n            }\n        ;\n        ;\n            return {\n                x: ((t ? u : 27903)),\n                y: ((t ? 27910 : u))\n            };\n        },\n        getCropPosition: function() {\n            var p = this.getCropDimensions(), q = this.getContainerDimensions(), r = this.getFocus();\n            return {\n                left: ((r.x * ((q.width - p.width)))),\n                JSBNG__top: ((r.y * ((q.height - p.height))))\n            };\n        },\n        getScaleDimensions: function() {\n            var p = this.getCropDimensions();\n            return {\n                width: ((p.width / this.props.cropRect.width)),\n                height: ((p.height / this.props.cropRect.height))\n            };\n        },\n        getScalePosition: function() {\n            var p = this.getScaleDimensions();\n            return {\n                left: ((-p.width * this.props.cropRect.left)),\n                JSBNG__top: ((-p.height * this.props.cropRect.JSBNG__top))\n            };\n        },\n        getClipCropRectangle: function() {\n            var p = this.getContainerDimensions(), q = this.getCropDimensions(), r = this.getContainerPosition(), s = this.getCropPosition(), t = Math.max(r.left, s.left), u = Math.max(r.JSBNG__top, s.JSBNG__top), v = Math.min(((r.JSBNG__top + p.height)), ((s.JSBNG__top + q.height))), w = Math.min(((r.left + p.width)), ((s.left + q.width)));\n            return {\n                left: t,\n                JSBNG__top: u,\n                width: ((w - t)),\n                height: ((v - u))\n            };\n        },\n        getClipCropPosition: function() {\n            var p = this.getClipCropRectangle();\n            return {\n                left: p.left,\n                JSBNG__top: p.JSBNG__top\n            };\n        },\n        getClipCropDimensions: function() {\n            var p = this.getClipCropRectangle();\n            return {\n                width: p.width,\n                height: p.height\n            };\n        },\n        getClipScalePosition: function() {\n            var p = this.getScalePosition(), q = this.getClipCropPosition(), r = this.getCropPosition();\n            return {\n                left: ((p.left + ((r.left - q.left)))),\n                JSBNG__top: ((p.JSBNG__top + ((r.JSBNG__top - q.JSBNG__top))))\n            };\n        },\n        getClipScaleDimensions: function() {\n            return this.getScaleDimensions();\n        },\n        areDimensionsEqual: function(p, q) {\n            return ((((p.width === q.width)) && ((p.height === q.height))));\n        },\n        shouldAddAllNodesAndStyles: function() {\n            return this.props.animated;\n        },\n        hasCrop: function() {\n            if (this.shouldAddAllNodesAndStyles()) {\n                return true;\n            }\n        ;\n        ;\n            var p = this.getContainerDimensions(), q = this.getClipCropDimensions(), r = this.getClipScaleDimensions();\n            if (((this.areDimensionsEqual(p, q) || this.areDimensionsEqual(q, r)))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        hasContainer: function() {\n            if (((this.shouldAddAllNodesAndStyles() || this.hasInsetBorder()))) {\n                return true;\n            }\n        ;\n        ;\n            var p = this.getContainerDimensions(), q = this.getClipScaleDimensions();\n            if (this.areDimensionsEqual(p, q)) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        hasInsetBorder: function() {\n            return ((this.shouldAddAllNodesAndStyles() || this.props.insetBorderColor));\n        },\n        applyPositionStyle: function(p, q) {\n            if (((this.shouldAddAllNodesAndStyles() || q.left))) {\n                p.left = Math.round(q.left);\n            }\n        ;\n        ;\n            if (((this.shouldAddAllNodesAndStyles() || q.JSBNG__top))) {\n                p.JSBNG__top = Math.round(q.JSBNG__top);\n            }\n        ;\n        ;\n        },\n        applyDimensionsStyle: function(p, q) {\n            p.width = Math.round(q.width);\n            p.height = Math.round(q.height);\n        },\n        applyBorderRadiusStyle: function(p) {\n            if (((this.shouldAddAllNodesAndStyles() || this.props.borderRadius))) {\n                p.borderRadius = ((this.props.borderRadius || 0));\n            }\n        ;\n        ;\n        },\n        getScaleStyle: function() {\n            var p = {\n            }, q = this.getClipCropDimensions(), r = this.getClipScaleDimensions();\n            if (((this.shouldAddAllNodesAndStyles() || !this.areDimensionsEqual(q, r)))) {\n                this.applyPositionStyle(p, this.getClipScalePosition());\n            }\n             else this.applyPositionStyle(p, this.getClipCropPosition());\n        ;\n        ;\n            this.applyDimensionsStyle(p, this.getClipScaleDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getCropStyle: function() {\n            var p = {\n            };\n            this.applyPositionStyle(p, this.getClipCropPosition());\n            this.applyDimensionsStyle(p, this.getClipCropDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getInsetBorderStyle: function() {\n            var p = {\n                borderColor: ((this.props.insetBorderColor || \"transparent\"))\n            };\n            this.applyPositionStyle(p, this.getClipCropPosition());\n            this.applyDimensionsStyle(p, this.getClipCropDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getContainerStyle: function() {\n            var p = {\n            };\n            this.applyDimensionsStyle(p, this.getContainerDimensions());\n            this.applyBorderRadiusStyle(p);\n            return p;\n        },\n        getScale: function() {\n            var p = this.getScaleStyle(), q = p.width, r = p.height;\n            p = h({\n            }, p);\n            delete p.width;\n            delete p.height;\n            return this.transferPropsTo(l.DOM.img({\n                alt: this.props.alt,\n                className: (((\"-cx-PRIVATE-pixelz__scaledimage\") + ((this.shouldAddAllNodesAndStyles() ? ((\" \" + \"-cx-PRIVATE-pixelz__animated\")) : \"\")))),\n                src: this.props.src,\n                style: p,\n                width: q,\n                height: r\n            }));\n        },\n        getCrop: function() {\n            var p = this.getScale();\n            if (!this.hasCrop()) {\n                return p;\n            }\n        ;\n        ;\n            return (l.DOM.div({\n                className: (((\"-cx-PRIVATE-pixelz__croppedimage\") + ((this.shouldAddAllNodesAndStyles() ? ((\" \" + \"-cx-PRIVATE-pixelz__animated\")) : \"\")))),\n                style: this.getCropStyle()\n            }, p));\n        },\n        getInsetBorder: function() {\n            if (!this.hasInsetBorder()) {\n                return null;\n            }\n        ;\n        ;\n            return (l.DOM.div({\n                className: (((\"-cx-PRIVATE-pixelz__insetborder\") + ((this.shouldAddAllNodesAndStyles() ? ((\" \" + \"-cx-PRIVATE-pixelz__animated\")) : \"\")))),\n                style: this.getInsetBorderStyle()\n            }));\n        },\n        getContainer: function() {\n            var p = this.getCrop();\n            if (!this.hasContainer()) {\n                return p;\n            }\n        ;\n        ;\n            var q = this.getInsetBorder();\n            return (l.DOM.div({\n                className: (((\"-cx-PRIVATE-pixelz__container\") + ((this.shouldAddAllNodesAndStyles() ? ((\" \" + \"-cx-PRIVATE-pixelz__animated\")) : \"\")))),\n                style: this.getContainerStyle()\n            }, p, q));\n        },\n        render: function() {\n            var p = this.getSrcDimensions();\n            if (!p) {\n                return l.DOM.span(null);\n            }\n        ;\n        ;\n            return this.getContainer();\n        }\n    });\n    e.exports = o;\n});\n__d(\"ModalMask\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = null, i = 0, j = {\n        show: function() {\n            i++;\n            if (!h) {\n                h = g.create(\"div\", {\n                    id: \"modalMaskOverlay\"\n                });\n                g.appendContent(JSBNG__document.body, h);\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (i) {\n                i--;\n                if (((!i && h))) {\n                    g.remove(h);\n                    h = null;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"WebMessengerPermalinkConstants\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        ARCHIVED_PATH: \"/messages/archived\",\n        BASE_PATH: \"/messages\",\n        OTHER_PATH: \"/messages/other\",\n        SPAM_PATH: \"/messages/spam\",\n        COMPOSE_POSTFIX_PATH: \"/new\",\n        SEARCH_POSTFIX_PATH: \"/search\",\n        TID_POSTFIX_PARTIAL_PATH: \"/conversation-\",\n        overriddenVanities: \"(archived|other|spam|new|search|conversation-.*)\",\n        getURIPathForThreadID: function(i, j) {\n            return ((((((j || h.BASE_PATH)) + h.TID_POSTFIX_PARTIAL_PATH)) + g.encodeComponent(g.encodeComponent(i))));\n        },\n        getThreadIDFromURI: function(i) {\n            var j = i.getPath().match(((((((h.BASE_PATH + \"(/[^/]*)*\")) + h.TID_POSTFIX_PARTIAL_PATH)) + \"([^/]+)\")));\n            if (j) {\n                var k = g.decodeComponent(g.decodeComponent(j[2]));\n                return k;\n            }\n        ;\n        ;\n        },\n        getURIPathForIDOrVanity: function(i, j) {\n            if (i.match(((((\"^\" + h.overriddenVanities)) + \"$\")))) {\n                i = ((\".\" + i));\n            }\n        ;\n        ;\n            return ((((((j || h.BASE_PATH)) + \"/\")) + i));\n        },\n        getUserIDOrVanity: function(i) {\n            var j = i.match(((h.BASE_PATH + \".*/([^/]+)/?$\"))), k = ((j && j[1])), l = h.overriddenVanities;\n            if (((!k || k.match(((((\"^\" + l)) + \"$\")))))) {\n                return false;\n            }\n             else if (k.match(((((\"^\\\\.\" + l)) + \"$\")))) {\n                return k.substr(1);\n            }\n             else return k\n            \n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"MercuryErrorInfo\", [\"MercuryErrorType\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryErrorType\"), h = b(\"tx\"), i = {\n        getMessage: function(j) {\n            var k = \"This message failed to send.\";\n            if (i.isConnectionError(j)) {\n                k = \"Unable to connect to Facebook. This message failed to send. \";\n            }\n             else if (j.description) {\n                k = j.description;\n            }\n            \n        ;\n        ;\n            return k;\n        },\n        isConnectionError: function(j) {\n            if (((j && ((j.type == g.TRANSPORT))))) {\n                return ((((((j.code === 1001)) || ((j.code === 1004)))) || ((j.code === 1006))));\n            }\n        ;\n        ;\n            return false;\n        }\n    };\n    e.exports = i;\n});\n__d(\"MercuryChannelHandler\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryGlobalActionType\",\"MercuryPayloadSource\",\"MessagingReliabilityLogger\",\"MessagingEvent\",\"MessagingTag\",\"MercuryParticipants\",\"PresenceUtil\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryGlobalActionType\"), k = b(\"MercuryPayloadSource\"), l = b(\"MessagingReliabilityLogger\"), m = b(\"MessagingEvent\"), n = b(\"MessagingTag\"), o = b(\"MercuryParticipants\"), p = b(\"PresenceUtil\"), q = b(\"MercuryServerRequests\").get(), r = b(\"MercuryThreadInformer\").get(), s = b(\"copyProperties\");\n    function t(ia, ja) {\n        if (((((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj)) || !ja.obj.message))) {\n            l.addEntry(\"channel_receive\", \"invalid_data\");\n            return;\n        }\n    ;\n    ;\n        var ka = ja.obj.message, la = {\n            author: ka.mercury_author_id,\n            author_email: ka.mercury_author_email,\n            body: ka.body,\n            subject: ka.subject,\n            has_attachment: ka.has_attachment,\n            attachments: ka.attachments,\n            html_body: ka.html_body,\n            thread_id: ka.tid,\n            message_id: ka.mid,\n            coordinates: ka.mercury_coordinates,\n            spoof_warning: ka.mercury_spoof_warning,\n            source: ka.mercury_source,\n            source_tags: ka.mercury_source_tags,\n            threading_id: ka.threading_id,\n            timestamp: ka.timestamp,\n            timestamp_absolute: ka.timestamp_absolute,\n            timestamp_relative: ka.timestamp_relative,\n            timestamp_time_passed: ka.timestamp_time_passed,\n            action_type: i.USER_GENERATED_MESSAGE,\n            is_unread: ka.is_unread,\n            action_id: ka.action_id,\n            is_forward: false,\n            forward_count: ((ka.forward_count || ka.JSBNG__forward)),\n            forward_message_ids: ka.forward_msg_ids,\n            location_text: ka.location_text,\n            folder: ja.obj.folder\n        }, ma = [s({\n        }, la),];\n        ma = ma.concat(((ka.forward_actions || [])));\n        var na = k.CLIENT_CHANNEL_MESSAGE;\n        q.handleUpdateWaitForThread({\n            actions: ma,\n            payload_source: na\n        }, ka.tid);\n        if (((!ka.is_unread && ((ka.mercury_author_id === o.user))))) {\n            var oa = {\n            };\n            oa[ka.tid] = ja.obj.folder;\n            u(h.getArbiterType(\"messaging\"), {\n                obj: {\n                    JSBNG__event: m.READ,\n                    tids: [ka.tid,],\n                    folder_info: oa,\n                    timestamp: ka.timestamp\n                }\n            });\n        }\n    ;\n    ;\n        l.addEntry(\"channel_receive\", \"success\", [la.thread_id,la.message_id,p.getSessionID(),]);\n    };\n;\n    function u(ia, ja) {\n        if (((((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj)) || !ja.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var ka = [], la = ((ja.obj.JSBNG__event == m.READ));\n        ja.obj.tids.forEach(function(ma) {\n            ka.push({\n                action_type: i.CHANGE_READ_STATUS,\n                action_id: null,\n                thread_id: ma,\n                mark_as_read: la,\n                timestamp: ((ja.obj.timestamp || 0)),\n                folder: ja.obj.folder_info[ma]\n            });\n        });\n        q.handleUpdate({\n            actions: ka,\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function v(ia, ja) {\n        if (((((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj)) || !ja.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var ka = [];\n        ja.obj.tids.forEach(function(la) {\n            ka.push({\n                action_type: i.DELETE_THREAD,\n                action_id: null,\n                thread_id: la\n            });\n        });\n        q.handleUpdate({\n            actions: ka,\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function w(ia, ja) {\n        if (((((((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj)) || !ja.obj.tids)) || !ja.obj.mids))) {\n            return;\n        }\n    ;\n    ;\n        var ka = ja.obj.tids[0], la = {\n            action_type: i.DELETE_MESSAGES,\n            action_id: null,\n            thread_id: ka,\n            message_ids: ja.obj.mids\n        };\n        q.handleUpdate({\n            actions: [la,],\n            threads: [ja.obj.updated_thread,],\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function x(ia, ja) {\n        if (((((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj)) || !ja.obj.folder))) {\n            return;\n        }\n    ;\n    ;\n        var ka = {\n            action_type: j.MARK_ALL_READ,\n            action_id: ja.obj.action_id,\n            folder: ja.obj.folder\n        };\n        q.handleUpdate({\n            global_actions: [ka,]\n        });\n    };\n;\n    function y(ia, ja) {\n        if (((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var ka = k.CLIENT_CHANNEL_MESSAGE;\n        ja.obj.tids.forEach(function(la) {\n            var ma = {\n                action_type: i.CHANGE_ARCHIVED_STATUS,\n                action_id: null,\n                thread_id: la,\n                archived: ja.obj.state\n            };\n            q.handleUpdateWaitForThread({\n                actions: [s({\n                }, ma),],\n                payload_source: ka\n            }, la);\n        });\n    };\n;\n    function z(ia, ja) {\n        if (((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj.tids))) {\n            return;\n        }\n    ;\n    ;\n        var ka = k.CLIENT_CHANNEL_MESSAGE, la;\n        ja.obj.tids.forEach(function(ma) {\n            if (((ja.obj.JSBNG__event == m.TAG))) {\n                la = ja.obj.tag;\n            }\n             else la = ((ja.obj.marked_as_spam ? n.SPAM : n.INBOX));\n        ;\n        ;\n            var na = {\n                action_type: i.CHANGE_FOLDER,\n                action_id: null,\n                thread_id: ma,\n                new_folder: la\n            };\n            q.handleUpdateWaitForThread({\n                actions: [s({\n                }, na),],\n                payload_source: ka\n            }, ma);\n        });\n    };\n;\n    function aa(ia, ja) {\n        if (((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj.tag))) {\n            return;\n        }\n    ;\n    ;\n        switch (ja.obj.tag) {\n          case n.ACTION_ARCHIVED:\n            y(ia, ja);\n            break;\n          case n.INBOX:\n        \n          case n.OTHER:\n            z(ia, ja);\n            break;\n        };\n    ;\n    };\n;\n    function ba(ia, ja) {\n        if (((((((ia != h.getArbiterType(\"inbox\"))) || !ja.obj)) || !ja.obj.seen_timestamp))) {\n            return;\n        }\n    ;\n    ;\n        q.handleUpdate({\n            message_counts: [{\n                seen_timestamp: ja.obj.seen_timestamp,\n                folder: n.INBOX\n            },],\n            unseen_thread_ids: [{\n                thread_ids: [],\n                folder: n.INBOX\n            },],\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function ca(ia, ja) {\n        if (((((ia != h.getArbiterType(\"mercury\"))) || !ja.obj))) {\n            return;\n        }\n    ;\n    ;\n        r.synchronizeInforms(function() {\n            var ka = ja.obj, la = [];\n            ((ka.actions || [])).forEach(function(ma) {\n                var na = i.USER_GENERATED_MESSAGE;\n                if (((ma.action_type == i.LOG_MESSAGE))) {\n                    var oa = k.CLIENT_CHANNEL_MESSAGE;\n                    q.handleUpdateWaitForThread({\n                        actions: [s({\n                        }, ma),],\n                        payload_source: oa\n                    }, ma.thread_id);\n                }\n                 else if (((ma.action_type != na))) {\n                    la.push(ma);\n                }\n                \n            ;\n            ;\n            });\n            ka.actions = la;\n            ka.payload_source = k.CLIENT_CHANNEL_MESSAGE;\n            q.handleUpdate(ka);\n        });\n    };\n;\n    function da(ia, ja) {\n        q.handleRoger(ja.obj);\n    };\n;\n    function ea(ia, ja) {\n        if (((((((((ia != h.getArbiterType(\"messaging\"))) || !ja.obj)) || ((ja.obj.mute_settings === undefined)))) || !ja.obj.thread_id))) {\n            return;\n        }\n    ;\n    ;\n        var ka = i.CHANGE_MUTE_SETTINGS, la = [{\n            action_type: ka,\n            action_id: null,\n            thread_id: ja.obj.thread_id,\n            mute_settings: ja.obj.mute_settings\n        },];\n        q.handleUpdate({\n            actions: la,\n            payload_source: k.CLIENT_CHANNEL_MESSAGE\n        });\n    };\n;\n    function fa(ia, ja) {\n        switch (ja.obj.JSBNG__event) {\n          case m.DELIVER:\n            t(ia, ja);\n            break;\n          case m.READ:\n        \n          case m.UNREAD:\n            u(ia, ja);\n            break;\n          case m.READ_ALL:\n            x(ia, ja);\n            break;\n          case m.DELETE:\n            v(ia, ja);\n            break;\n          case m.DELETE_MESSAGES:\n            w(ia, ja);\n            break;\n          case m.TAG:\n            aa(ia, ja);\n            break;\n          case m.REPORT_SPAM:\n            z(ia, ja);\n            break;\n          case m.READ_RECEIPT:\n            da(ia, ja);\n            break;\n          case m.CHANGE_MUTE_SETTINGS:\n            ea(ia, ja);\n            break;\n        };\n    ;\n    };\n;\n    var ga = [], ha = {\n        turnOn: function() {\n            if (!ga.length) {\n                var ia = {\n                    mercury: ca,\n                    messaging: fa,\n                    inbox: ba\n                };\n                {\n                    var fin165keys = ((window.top.JSBNG_Replay.forInKeys)((ia))), fin165i = (0);\n                    var ja;\n                    for (; (fin165i < fin165keys.length); (fin165i++)) {\n                        ((ja) = (fin165keys[fin165i]));\n                        {\n                            ga.push(g.subscribe(h.getArbiterType(ja), ia[ja]));\n                        ;\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        turnOff: function() {\n            if (ga.length) {\n                ga.forEach(g.unsubscribe);\n                ga = [];\n            }\n        ;\n        ;\n        }\n    };\n    ha.turnOn();\n    e.exports = ha;\n});\n__d(\"MercuryRoger\", [\"ArbiterMixin\",\"MercuryActionStatus\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"MercuryActionStatus\"), i = b(\"MercuryServerRequests\").get(), j = b(\"copyProperties\"), k = {\n    }, l = {\n        getSeenBy: function(m, n) {\n            if (!m) {\n                return [];\n            }\n        ;\n        ;\n            var o = [], p = k[m.thread_id], q = h.SUCCESS;\n            {\n                var fin166keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin166i = (0);\n                var r;\n                for (; (fin166i < fin166keys.length); (fin166i++)) {\n                    ((r) = (fin166keys[fin166i]));\n                    {\n                        if (((((((p[r] > m.timestamp)) && ((((m.JSBNG__status === undefined)) || ((m.JSBNG__status === q)))))) && ((!n || ((r != m.author))))))) {\n                            o.push(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return o;\n        },\n        getSeenTimestamp: function(m, n) {\n            var o = k[m];\n            return ((o ? o[n] : null));\n        }\n    };\n    j(l, g);\n    i.subscribe(\"update-roger\", function(m, n) {\n        {\n            var fin167keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin167i = (0);\n            var o;\n            for (; (fin167i < fin167keys.length); (fin167i++)) {\n                ((o) = (fin167keys[fin167i]));\n                {\n                    if (!k[o]) {\n                        k[o] = {\n                        };\n                    }\n                ;\n                ;\n                    {\n                        var fin168keys = ((window.top.JSBNG_Replay.forInKeys)((n[o]))), fin168i = (0);\n                        var p;\n                        for (; (fin168i < fin168keys.length); (fin168i++)) {\n                            ((p) = (fin168keys[fin168i]));\n                            {\n                                var q = k[o][p], r = n[o][p];\n                                if (((!q || ((r > q))))) {\n                                    k[o][p] = r;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                };\n            };\n        };\n    ;\n        if (n) {\n            l.inform(\"state-changed\", n);\n        }\n    ;\n    ;\n    });\n    e.exports = l;\n});\n__d(\"MercuryDelayedRoger\", [\"ArbiterMixin\",\"LiveTimer\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryMessages\",\"MercuryRoger\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LiveTimer\"), i = b(\"MercuryActionStatus\"), j = b(\"MercuryConfig\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryRoger\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\"), p = b(\"setTimeoutAcrossTransitions\"), q = {\n    }, r = {\n    }, s = j[\"roger.seen_delay\"], t = o({\n        getSeenBy: function(x, y) {\n            if (r[x]) {\n                return [];\n            }\n        ;\n        ;\n            if (!q[x]) {\n                var z = n.getThreadMetaNow(x);\n                if (z) {\n                    q[x] = {\n                        thread_id: x,\n                        author: z.participants[0],\n                        timestamp: z.timestamp\n                    };\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return l.getSeenBy(q[x], y);\n        }\n    }, g);\n    function u(x) {\n        var y = false;\n        k.getThreadMessagesRange(x, 0, 1, function(z) {\n            var aa = z[0];\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = aa.timestamp;\n            if (((aa.action_id || ((aa.JSBNG__status == i.SUCCESS))))) {\n                ba -= h.getServerTimeOffset();\n            }\n        ;\n        ;\n            var ca = t.getSeenBy(x);\n            if (r[x]) {\n                JSBNG__clearTimeout(r[x]);\n                delete r[x];\n            }\n        ;\n        ;\n            var da = ((ba + s)), ea = ((da - JSBNG__Date.now()));\n            if (((ea > 0))) {\n                r[x] = p(function() {\n                    delete r[x];\n                    v(x);\n                }, ea);\n            }\n        ;\n        ;\n            q[x] = aa;\n            var fa = t.getSeenBy(x);\n            if (((ca.length || fa.length))) {\n                y = true;\n            }\n        ;\n        ;\n        });\n        return y;\n    };\n;\n    function v(x) {\n        var y = {\n        };\n        y[x] = true;\n        t.inform(\"state-changed\", y);\n    };\n;\n    function w(JSBNG__event, x) {\n        var y = {\n        };\n        {\n            var fin169keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin169i = (0);\n            var z;\n            for (; (fin169i < fin169keys.length); (fin169i++)) {\n                ((z) = (fin169keys[fin169i]));\n                {\n                    if (u(z)) {\n                        y[z] = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin170keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin170i = (0);\n            var aa;\n            for (; (fin170i < fin170keys.length); (fin170i++)) {\n                ((aa) = (fin170keys[fin170i]));\n                {\n                    t.inform(\"state-changed\", y);\n                    break;\n                };\n            };\n        };\n    ;\n    };\n;\n    l.subscribe(\"state-changed\", function(x, y) {\n        {\n            var fin171keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin171i = (0);\n            var z;\n            for (; (fin171i < fin171keys.length); (fin171i++)) {\n                ((z) = (fin171keys[fin171i]));\n                {\n                    ((!r[z] && v(z)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    m.subscribe(\"messages-received\", w);\n    m.subscribe(\"messages-reordered\", w);\n    m.subscribe(\"messages-updated\", w);\n    e.exports = t;\n});\n__d(\"MercuryFilters\", [\"MessagingTag\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"MessagingTag\"), h = b(\"arrayContains\"), i = [g.UNREAD,], j = {\n        ALL: \"all\",\n        getSupportedFilters: function() {\n            return i.concat();\n        },\n        isSupportedFilter: function(k) {\n            return h(i, k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryOrderedThreadlist\", [\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryFilters\",\"MercuryFolders\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MessagingTag\",\"RangedCallbackManager\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"arrayContains\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSLogger\"), h = b(\"MercuryActionTypeConstants\"), i = b(\"MercuryFilters\"), j = b(\"MercuryFolders\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercurySingletonMixin\"), m = b(\"MessagingTag\"), n = b(\"RangedCallbackManager\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"MercuryThreads\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = g.create(\"ordered_threadlist_model\"), u = i.getSupportedFilters().concat([i.ALL,m.GROUPS,]), v = j.getSupportedFolders();\n    function w(ga, ha, ia, ja) {\n        var ka = [], la = false, ma = false, na = ((ha || [])).filter(function(ua) {\n            var va = ((ua.filter || i.ALL));\n            return ((((((ua.folder == ia)) || ((!ua.folder && ((ia == m.INBOX)))))) && ((va == ja))));\n        }), oa = ga._threadlistOrderMap[ia][ja].getAllResources(), pa;\n        na.forEach(function(ua) {\n            ka = ka.concat(ua.thread_ids);\n            if (ua.error) {\n                if (((ua.end > oa.length))) {\n                    ma = ua.error;\n                }\n            ;\n            ;\n            }\n             else {\n                var va = ((ua.end - ua.start));\n                if (((ua.thread_ids.length < va))) {\n                    la = true;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((!pa || ((ua.end > pa))))) {\n                pa = ua.end;\n            }\n        ;\n        ;\n        });\n        aa(ga, ka, ia, ja);\n        if (la) {\n            ga._threadlistOrderMap[ia][ja].setReachedEndOfArray();\n        }\n         else if (ma) {\n            ga._threadlistOrderMap[ia][ja].setError(ma);\n        }\n         else {\n            var qa = ga._threadlistOrderMap[ia][ja].getCurrentArraySize();\n            if (((pa && ((qa < pa))))) {\n                var ra = {\n                }, sa = oa.concat(ka), ta = sa.filter(function(ua) {\n                    var va = ra[ua];\n                    ra[ua] = true;\n                    return va;\n                });\n                if (ta.length) {\n                    t.warn(\"duplicate_threads\", {\n                        folder: ia,\n                        expected_final_size: pa,\n                        actual_final_size: qa,\n                        duplicate_thread_ids: ta\n                    });\n                    ga._serverRequests.fetchThreadlistInfo(pa, ta.length, ia, ((((ja == i.ALL)) ? null : ja)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n    };\n;\n    function x(ga, ha) {\n        v.forEach(function(ia) {\n            u.forEach(function(ja) {\n                w(ga, ha, ia, ja);\n            });\n        });\n    };\n;\n    function y(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = {\n                    to_add: [],\n                    to_remove: [],\n                    to_remove_if_last_after_add: {\n                    }\n                };\n            });\n        });\n        ha.forEach(function(ja) {\n            if (ja.is_forward) {\n                return;\n            }\n        ;\n        ;\n            var ka = ja.thread_id, la = ba(ga, ka), ma = ca(ga, ka);\n            function na() {\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_add.push(ka);\n                    if (((!ga._threadlistOrderMap[la][pa].hasReachedEndOfArray() && !ga._threadlistOrderMap[la][pa].hasResource(ka)))) {\n                        ia[la][pa].to_remove_if_last_after_add[ka] = true;\n                    }\n                ;\n                ;\n                });\n            };\n        ;\n            function oa(pa) {\n                if (r(u, pa)) {\n                    if (r(ma, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                     else ia[la][pa].to_remove.push(ka);\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (!la) {\n                if (((((ja.action_type === h.CHANGE_FOLDER)) || ((ja.action_type === h.CHANGE_ARCHIVED_STATUS))))) {\n                    v.forEach(function(pa) {\n                        if (((pa !== la))) {\n                            u.forEach(function(qa) {\n                                ga._threadlistOrderMap[pa][qa].removeResources([ka,]);\n                            });\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            switch (ja.action_type) {\n              case h.DELETE_THREAD:\n                ma.forEach(function(pa) {\n                    ia[la][pa].to_remove.push(ka);\n                });\n                break;\n              case h.CHANGE_ARCHIVED_STATUS:\n            \n              case h.CHANGE_FOLDER:\n                na();\n                break;\n              case h.CHANGE_READ_STATUS:\n                oa(m.UNREAD);\n                break;\n              case h.USER_GENERATED_MESSAGE:\n            \n              case h.LOG_MESSAGE:\n                ma.forEach(function(pa) {\n                    if (da(ga, ka, la, pa)) {\n                        ia[la][pa].to_add.push(ka);\n                    }\n                ;\n                ;\n                });\n                break;\n            };\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                var la = ga._threadlistOrderMap[ja][ka];\n                aa(ga, ia[ja][ka].to_add, ja, ka);\n                for (var ma = ((la.getCurrentArraySize() - 1)); ((ma >= 0)); ma--) {\n                    var na = la.getResourceAtIndex(ma);\n                    if (!ia[ja][ka].to_remove_if_last_after_add[na]) {\n                        break;\n                    }\n                ;\n                ;\n                    ia[ja][ka].to_remove.push(na);\n                };\n            ;\n                la.removeResources(ia[ja][ka].to_remove);\n            });\n        });\n    };\n;\n    function z(ga, ha) {\n        var ia = {\n        };\n        v.forEach(function(ja) {\n            ia[ja] = {\n            };\n            u.forEach(function(ka) {\n                ia[ja][ka] = [];\n            });\n        });\n        ha.forEach(function(ja) {\n            var ka = ba(ga, ja.thread_id), la = ca(ga, ja.thread_id);\n            if (ka) {\n                la.forEach(function(ma) {\n                    if (da(ga, ja.thread_id, ka, ma)) {\n                        ia[ka][ma].push(ja.thread_id);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        });\n        v.forEach(function(ja) {\n            u.forEach(function(ka) {\n                if (((ia[ja][ka].length > 0))) {\n                    aa(ga, ia[ja][ka], ja, ka);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    function aa(ga, ha, ia, ja) {\n        ja = ((ja || i.ALL));\n        ga._threadlistOrderMap[ia][ja].addResources(ha);\n        v.forEach(function(ka) {\n            if (((ka != ia))) {\n                ga._threadlistOrderMap[ka][ja].removeResources(ha);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ba(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = null;\n        if (!ia) {\n            ja = \"No thread metadata\";\n        }\n         else if (!ia.folder) {\n            ja = \"No thread folder\";\n        }\n        \n    ;\n    ;\n        if (ja) {\n            var ka = {\n                error: ja,\n                tid: ha\n            };\n            t.warn(\"no_thread_folder\", ka);\n            return null;\n        }\n    ;\n    ;\n        var la = ia.folder;\n        if (ia.is_archived) {\n            la = m.ACTION_ARCHIVED;\n        }\n    ;\n    ;\n        if (ga._threadlistOrderMap[la]) {\n            return la;\n        }\n         else return null\n    ;\n    };\n;\n    function ca(ga, ha) {\n        var ia = ga._threads.getThreadMetaNow(ha), ja = [i.ALL,];\n        if (!ia) {\n            var ka = {\n                error: \"no_thread_metadata\",\n                tid: ha\n            };\n            t.warn(\"no_thread_metadata\", ka);\n            return [];\n        }\n    ;\n    ;\n        if (ia.unread_count) {\n            ja.push(m.UNREAD);\n        }\n    ;\n    ;\n        if (!ia.is_canonical) {\n            ja.push(m.GROUPS);\n        }\n    ;\n    ;\n        return ja;\n    };\n;\n    function da(ga, ha, ia, ja) {\n        var ka = ga._threads.getThreadMetaNow(ha);\n        return ((((((ka && ka.timestamp)) && ((ba(ga, ha) == ia)))) && r(ca(ga, ha), ja)));\n    };\n;\n    function ea(ga) {\n        this._fbid = ga;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._threads = q.getForFBID(this._fbid);\n        this._threadlistOrderMap = {\n        };\n        v.forEach(function(ha) {\n            this._threadlistOrderMap[ha] = {\n            };\n            u.forEach(function(ia) {\n                this._threadlistOrderMap[ha][ia] = new n(function(ja) {\n                    return this._threads.getThreadMetaNow(ja).timestamp;\n                }.bind(this), function(ja, ka) {\n                    return ((ka - ja));\n                }, this._serverRequests.canLinkExternally.bind(this._serverRequests));\n            }.bind(this));\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-threadlist\", function(ha, ia) {\n            if (!fa(ia)) {\n                return;\n            }\n        ;\n        ;\n            var ja = ia.ordered_threadlists;\n            if (((ja && ja.length))) {\n                x(this, ja);\n            }\n             else {\n                var ka = ((ia.actions || [])).filter(function(la) {\n                    return la.thread_id;\n                });\n                z(this, ((ia.threads || [])));\n                y(this, ka);\n            }\n        ;\n        ;\n            this._threadInformer.updatedThreadlist();\n        }.bind(this));\n    };\n;\n    s(ea.prototype, {\n        getThreadlist: function(ga, ha, ia, ja, ka, la) {\n            return this.getFilteredThreadlist(ga, ha, ia, i.ALL, ja, ka, la);\n        },\n        getFilteredThreadlist: function(ga, ha, ia, ja, ka, la, ma) {\n            var na = this._threadlistOrderMap[ia][ja], oa = na.executeOrEnqueue(ga, ha, ka, la), pa = na.getUnavailableResources(oa), qa = na.getError(ga, ha, la);\n            if (((pa.length || qa))) {\n                if (((na.getCurrentArraySize() < ga))) {\n                    var ra = {\n                        start: ga,\n                        limit: ha,\n                        filter: ja,\n                        resources_size: na.getCurrentArraySize()\n                    };\n                    t.warn(\"range_with_gap\", ra);\n                }\n            ;\n            ;\n                na.setError(false);\n                this._serverRequests.fetchThreadlistInfo(na.getCurrentArraySize(), pa.length, ia, ((((ja == i.ALL)) ? null : ja)), ma);\n            }\n        ;\n        ;\n            return oa;\n        },\n        getThreadlistUntilTimestamp: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            return this._threadlistOrderMap[ha][ia].getElementsUntil(ga);\n        },\n        unsubscribe: function(ga, ha, ia) {\n            ia = ((ia || i.ALL));\n            this._threadlistOrderMap[ha][ia].unsubscribe(ga);\n        }\n    });\n    s(ea, l);\n    function fa(ga) {\n        switch (ga.payload_source) {\n          case k.CLIENT_CHANGE_ARCHIVED_STATUS:\n        \n          case k.CLIENT_CHANGE_READ_STATUS:\n        \n          case k.CLIENT_CHANGE_FOLDER:\n        \n          case k.CLIENT_CHANNEL_MESSAGE:\n        \n          case k.CLIENT_DELETE_MESSAGES:\n        \n          case k.CLIENT_DELETE_THREAD:\n        \n          case k.CLIENT_SEND_MESSAGE:\n        \n          case k.SERVER_SEND_MESSAGE:\n        \n          case k.SERVER_CONFIRM_MESSAGES:\n        \n          case k.SERVER_FETCH_THREADLIST_INFO:\n        \n          case k.SERVER_THREAD_SYNC:\n            return true;\n          case k.SERVER_INITIAL_DATA:\n            return ga.ordered_threadlists;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    e.exports = ea;\n});\n__d(\"MercuryUnseenState\", [\"Arbiter\",\"TimestampConverter\",\"JSLogger\",\"KeyedCallbackManager\",\"MercuryActionTypeConstants\",\"MercurySingletonMixin\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TimestampConverter\"), i = b(\"JSLogger\"), j = b(\"KeyedCallbackManager\"), k = b(\"MercuryActionTypeConstants\"), l = b(\"MercurySingletonMixin\"), m = b(\"MercuryThreadlistConstants\"), n = b(\"MessagingTag\"), o = b(\"MercuryServerRequests\"), p = b(\"MercuryThreadInformer\"), q = b(\"copyProperties\"), r = b(\"createObjectFrom\"), s = m.MAX_UNSEEN_COUNT, t = \"unseen_thread_hash\", u = \"unseen_thread_list\", v = i.create(\"mercury_unseen_state\");\n    function w(ja) {\n        this._fbid = ja;\n        this._serverRequests = o.getForFBID(this._fbid);\n        this._threadInformer = p.getForFBID(this._fbid);\n        this._initialUnseenCount = 0;\n        this._lastSeenTimestamp = 0;\n        this._maxCount = false;\n        this._unseenResources = new j();\n        this._serverRequests.subscribe(\"update-unseen\", function(ka, la) {\n            ba(this, la);\n        }.bind(this));\n        this._serverRequests.subscribe(\"update-thread-ids\", function(ka, la) {\n            ha(this, la);\n        }.bind(this));\n    };\n;\n    q(w.prototype, {\n        getUnseenCount: function() {\n            if (this.exceedsMaxCount()) {\n                v.error(\"unguarded_unseen_count_fetch\", {\n                });\n                return 0;\n            }\n        ;\n        ;\n            return aa(this);\n        },\n        exceedsMaxCount: function() {\n            return ((this._maxCount || ((aa(this) > s))));\n        },\n        markAsSeen: function() {\n            if (((((aa(this) > 0)) || this._maxCount))) {\n                this._serverRequests.markSeen();\n                ca(this, h.convertActionIDToTimestamp(this._serverRequests.getLastActionID()), []);\n            }\n        ;\n        ;\n        },\n        markThreadSeen: function(ja, ka) {\n            var la = {\n            };\n            la[ja] = null;\n            ea(this, la, ka);\n        }\n    });\n    q(w, l);\n    function x(ja, ka) {\n        ja._unseenResources.setResource(t, ka);\n        ja._unseenResources.setResource(u, Object.keys(ka));\n    };\n;\n    function y(ja, ka) {\n        var la = ja._unseenResources.executeOrEnqueue(t, ka), ma = ja._unseenResources.getUnavailableResources(la);\n        if (ma.length) {\n            ja._serverRequests.fetchUnseenThreadIDs();\n        }\n    ;\n    ;\n    };\n;\n    function z(ja) {\n        return ja._unseenResources.getResource(t);\n    };\n;\n    function aa(ja) {\n        var ka = ja._unseenResources.getResource(u);\n        if (ka) {\n            return ka.length;\n        }\n         else return ja._initialUnseenCount\n    ;\n    };\n;\n    function ba(ja, ka) {\n        var la = ia(ka);\n        if (ka.unseen_thread_ids) {\n            ka.unseen_thread_ids.forEach(function(wa) {\n                if (((wa.folder != n.INBOX))) {\n                    return;\n                }\n            ;\n            ;\n                var xa = ga(ja, wa.thread_ids), ya = ja._lastSeenTimestamp;\n                if (((la && la.seen_timestamp))) {\n                    ya = la.seen_timestamp;\n                }\n            ;\n            ;\n                ca(ja, ya, xa);\n                if (((la && ((la.unseen_count > s))))) {\n                    ja._maxCount = true;\n                }\n            ;\n            ;\n            });\n        }\n         else if (((la && la.seen_timestamp))) {\n            ja._lastSeenTimestamp = la.seen_timestamp;\n            if (((la.unseen_count > s))) {\n                ja._maxCount = true;\n                x(ja, {\n                });\n            }\n             else {\n                ja._initialUnseenCount = la.unseen_count;\n                if (((ja._initialUnseenCount === 0))) {\n                    x(ja, {\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else {\n            if (ja._maxCount) {\n                return;\n            }\n        ;\n        ;\n            var ma = ka.actions;\n            if (((!ma || !(ma.length)))) {\n                return;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = {\n            };\n            for (var pa = 0; ((pa < ma.length)); pa++) {\n                var qa = ma[pa];\n                if (qa.is_forward) {\n                    continue;\n                }\n            ;\n            ;\n                var ra = qa.action_type, sa = qa.action_id, ta = ((qa.thread_id ? qa.thread_id : qa.server_thread_id)), ua = ((((qa.folder === undefined)) || ((qa.folder == n.INBOX))));\n                if (!ua) {\n                    continue;\n                }\n            ;\n            ;\n                if (((((ra == k.USER_GENERATED_MESSAGE)) || ((ra == k.LOG_MESSAGE))))) {\n                    var va = h.isGreaterThan(sa, na[ta]);\n                    if (((qa.is_unread && ((!na[ta] || va))))) {\n                        na[ta] = sa;\n                    }\n                ;\n                ;\n                }\n                 else if (((((ra == k.CHANGE_READ_STATUS)) && qa.mark_as_read))) {\n                    oa[ta] = sa;\n                }\n                \n            ;\n            ;\n            };\n        ;\n            da(ja, na);\n            ea(ja, oa);\n        }\n        \n    ;\n    ;\n    };\n;\n    function ca(ja, ka, la) {\n        var ma = z(ja);\n        if (((((((ma === undefined)) || ((ka > ja._lastSeenTimestamp)))) || ja._maxCount))) {\n            ja._lastSeenTimestamp = ka;\n            la = ((la || []));\n            if (((la.length <= s))) {\n                ja._maxCount = false;\n            }\n        ;\n        ;\n            var na = {\n            }, oa = ((z(ja) || {\n            }));\n            {\n                var fin172keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin172i = (0);\n                var pa;\n                for (; (fin172i < fin172keys.length); (fin172i++)) {\n                    ((pa) = (fin172keys[fin172i]));\n                    {\n                        if (((oa[pa] !== true))) {\n                            var qa = oa[pa];\n                            if (fa(ja, qa)) {\n                                na[pa] = qa;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var ra = q(r(la, true), na);\n            x(ja, ra);\n            ja._threadInformer.updatedUnseenState();\n        }\n    ;\n    ;\n    };\n;\n    function da(ja, ka) {\n        if (ja._maxCount) {\n            return;\n        }\n    ;\n    ;\n        var la = {\n        }, ma = false;\n        {\n            var fin173keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin173i = (0);\n            var na;\n            for (; (fin173i < fin173keys.length); (fin173i++)) {\n                ((na) = (fin173keys[fin173i]));\n                {\n                    var oa = ka[na];\n                    if (fa(ja, oa)) {\n                        la[na] = oa;\n                        ma = true;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        if (!ma) {\n            return;\n        }\n    ;\n    ;\n        y(ja, function(pa) {\n            {\n                var fin174keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin174i = (0);\n                var qa;\n                for (; (fin174i < fin174keys.length); (fin174i++)) {\n                    ((qa) = (fin174keys[fin174i]));\n                    {\n                        var ra = la[qa];\n                        if (((!pa[qa] && fa(ja, ra)))) {\n                            pa[qa] = la[qa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            x(ja, pa);\n            ja._threadInformer.updatedUnseenState();\n        });\n    };\n;\n    function ea(ja, ka, la) {\n        var ma = false;\n        {\n            var fin175keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin175i = (0);\n            var na;\n            for (; (fin175i < fin175keys.length); (fin175i++)) {\n                ((na) = (fin175keys[fin175i]));\n                {\n                    ma = true;\n                    break;\n                };\n            };\n        };\n    ;\n        if (ma) {\n            y(ja, function(oa) {\n                var pa = false;\n                {\n                    var fin176keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin176i = (0);\n                    var qa;\n                    for (; (fin176i < fin176keys.length); (fin176i++)) {\n                        ((qa) = (fin176keys[fin176i]));\n                        {\n                            var ra = ka[qa], sa = h.isGreaterThan(ra, oa[qa]);\n                            if (((oa[qa] && ((!ra || sa))))) {\n                                delete oa[qa];\n                                pa = true;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (pa) {\n                    x(ja, oa);\n                    ja._threadInformer.updatedUnseenState();\n                    if (((la && ((aa(ja) === 0))))) {\n                        ja._serverRequests.markSeen();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    ;\n    ;\n    };\n;\n    function fa(ja, ka) {\n        var la = h.convertActionIDToTimestamp(ka);\n        return ((la > ja._lastSeenTimestamp));\n    };\n;\n    function ga(ja, ka) {\n        return ka.map(ja._serverRequests.convertThreadIDIfAvailable.bind(ja._serverRequests));\n    };\n;\n    function ha(ja, ka) {\n        var la = z(ja);\n        if (!la) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin177keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin177i = (0);\n            var ma;\n            for (; (fin177i < fin177keys.length); (fin177i++)) {\n                ((ma) = (fin177keys[fin177i]));\n                {\n                    var na = ka[ma];\n                    if (la[ma]) {\n                        la[na] = la[ma];\n                        delete la[ma];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        x(ja, la);\n    };\n;\n    function ia(ja) {\n        var ka = ((ja.message_counts || []));\n        for (var la = 0; ((la < ka.length)); la++) {\n            if (((ka[la].folder == n.INBOX))) {\n                return ka[la];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    g.subscribe(i.DUMP_EVENT, function(ja, ka) {\n        ka.messaging = ((ka.messaging || {\n        }));\n        ka.messaging.unseen = {\n        };\n        ka.messaging.unseen_max_count = {\n        };\n        ka.messaging.unseen_time = {\n        };\n        var la = w._getInstances();\n        {\n            var fin178keys = ((window.top.JSBNG_Replay.forInKeys)((la))), fin178i = (0);\n            var ma;\n            for (; (fin178i < fin178keys.length); (fin178i++)) {\n                ((ma) = (fin178keys[fin178i]));\n                {\n                    ka.messaging.unseen[ma] = q({\n                    }, z(la[ma]));\n                    ka.messaging.unseen_max_count[ma] = la[ma]._maxCount;\n                    ka.messaging.unseen_time[ma] = la[ma]._lastSeenTimestamp;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = w;\n});\n__d(\"MercuryThreadMetadataRawRenderer\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"DOM\",\"MercuryActionStatus\",\"MercuryErrorInfo\",\"MessagingTag\",\"MercuryStatusTemplates\",\"Tooltip\",\"URI\",\"WebMessengerPermalinkConstants\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"MercuryActionStatus\"), k = b(\"MercuryErrorInfo\"), l = b(\"MessagingTag\"), m = b(\"MercuryStatusTemplates\"), n = b(\"Tooltip\"), o = b(\"URI\"), p = b(\"WebMessengerPermalinkConstants\"), q = b(\"cx\"), r = b(\"tx\"), s = {\n        renderParticipantListWithNoThreadName: function(u, v, w, x, y, z) {\n            var aa = {\n                callback: true,\n                check_length: true,\n                show_unread_count: true\n            };\n            z = ((z || {\n            }));\n            var ba = {\n            };\n            {\n                var fin179keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin179i = (0);\n                var ca;\n                for (; (fin179i < fin179keys.length); (fin179i++)) {\n                    ((ca) = (fin179keys[fin179i]));\n                    {\n                        if (aa[ca]) {\n                            ba[ca] = z[ca];\n                            delete z[ca];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var da = w.map(function(ia) {\n                return x[ia];\n            }), ea = this.renderRawParticipantList(u, da, w.length, z);\n            ea = this.renderRawTitleWithUnreadCount(ea, ((ba.show_unread_count ? v.unread_count : 0)));\n            var fa = z.abbr_mode, ga = {\n            };\n            {\n                var fin180keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin180i = (0);\n                var ha;\n                for (; (fin180i < fin180keys.length); (fin180i++)) {\n                    ((ha) = (fin180keys[fin180i]));\n                    {\n                        ga[ha] = z[ha];\n                    ;\n                    };\n                };\n            };\n        ;\n            ga.abbr_mode = true;\n            y.forEach(function(ia) {\n                var ja = ((((y.length > 1)) ? this._cloneIfDOMElement(ea) : ea));\n                i.setContent(ia, ja);\n                if (((((ba.check_length && !fa)) && ((ia.scrollWidth > ia.clientWidth))))) {\n                    var ka = this.renderRawParticipantList(u, da, w.length, ga), la = this.renderRawTitleWithUnreadCount(ka, ((ba.show_unread_count ? v.unread_count : 0)));\n                    i.setContent(ia, la);\n                }\n            ;\n            ;\n            }.bind(this));\n            ((ba.callback && ba.callback(ea)));\n        },\n        renderRawParticipantList: function(u, v, w, x) {\n            var y = {\n                abbr_mode: true,\n                last_separator_uses_and: true,\n                names_renderer: true\n            };\n            x = ((x || {\n            }));\n            var z = null;\n            if (x.names_renderer) {\n                z = x.names_renderer(v);\n            }\n             else z = v.map(function(ca) {\n                return ca.JSBNG__name;\n            });\n        ;\n        ;\n            var aa = null;\n            if (((z.length === 0))) {\n                if (!u) {\n                    aa = \"New Message\";\n                }\n                 else aa = \"No Participants\";\n            ;\n            ;\n            }\n             else if (((z.length == 1))) {\n                aa = z[0];\n            }\n             else if (((z.length == 2))) {\n                var ba = {\n                    participant1: z[0],\n                    participant2: z[1]\n                };\n                if (x.last_separator_uses_and) {\n                    aa = r._(\"{participant1} and {participant2}\", ba);\n                }\n                 else aa = r._(\"{participant1}, {participant2}\", ba);\n            ;\n            ;\n            }\n             else if (x.last_separator_uses_and) {\n                if (x.abbr_mode) {\n                    aa = r._(\"{participant1} and {others_link}\", {\n                        participant1: z[0],\n                        others_link: this.renderRawParticipantCount(u, {\n                            render_subset: true,\n                            count: ((w - 1))\n                        })\n                    });\n                }\n                 else if (((z.length == 3))) {\n                    aa = r._(\"{participant1}, {participant2} and {participant3}\", {\n                        participant1: z[0],\n                        participant2: z[1],\n                        participant3: z[2]\n                    });\n                }\n                 else aa = r._(\"{participant1}, {participant2} and {others_link}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    others_link: this.renderRawParticipantCount(u, {\n                        render_subset: true,\n                        count: ((w - 2))\n                    })\n                });\n                \n            ;\n            ;\n            }\n             else if (((z.length == 3))) {\n                aa = r._(\"{participant1}, {participant2}, {participant3}\", {\n                    participant1: z[0],\n                    participant2: z[1],\n                    participant3: z[2]\n                });\n            }\n             else aa = r._(\"{participant1}, {participant2}, {participant3}, {others_link}\", {\n                participant1: z[0],\n                participant2: z[1],\n                participant3: z[2],\n                others_link: this.renderRawParticipantCount(u, {\n                    render_subset: true,\n                    count: ((w - 3))\n                })\n            });\n            \n            \n            \n            \n        ;\n        ;\n            if (Array.isArray(aa)) {\n                aa = i.create(\"span\", {\n                }, aa);\n            }\n        ;\n        ;\n            return aa;\n        },\n        renderRawTitleWithUnreadCount: function(u, v) {\n            var w = u;\n            if (((v && ((v > 1))))) {\n                w = i.create(\"span\", {\n                }, r._(\"{conversation_title} ({unread_count})\", {\n                    conversation_title: u,\n                    unread_count: v\n                }));\n            }\n        ;\n        ;\n            return w;\n        },\n        renderRawParticipantCount: function(u, v) {\n            var w = v.render_subset, x;\n            if (!w) {\n                x = ((((v.count > 1)) ? r._(\"{num} people\", {\n                    num: v.count\n                }) : \"1 person\"));\n            }\n             else x = ((((v.count > 1)) ? r._(\"{others_count} others\", {\n                others_count: v.count\n            }) : \"1 other\"));\n        ;\n        ;\n            return x;\n        },\n        renderShortNames: function(u) {\n            if (((u.length == 1))) {\n                return [u[0].JSBNG__name,];\n            }\n        ;\n        ;\n            return u.map(function(v) {\n                return v.short_name;\n            });\n        },\n        getUserCanonicalTitanURL: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\"), y = u.substr(((u.indexOf(\":\") + 1)));\n            x.setPath(((((t(w) + \"/\")) + y)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        getTitanURLWithServerID: function(u, v, w) {\n            var x = new o().setSubdomain(\"www\");\n            x.setPath(p.getURIPathForThreadID(u, t(w)));\n            ((v && v(x.toString())));\n            return x.toString();\n        },\n        renderUserCanonicalTitanLink: function(u, v, w, x) {\n            var y = this.getUserCanonicalTitanURL(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderTitanLinkWithServerID: function(u, v, w, x) {\n            var y = this.getTitanURLWithServerID(u, null, x);\n            v.setAttribute(\"href\", y);\n            ((w && w()));\n        },\n        renderStatusIndicator: function(u, v, w) {\n            var x;\n            if (((u == j.RESENDING))) {\n                x = this.renderResendIndicator();\n            }\n             else if (((((((((u !== undefined)) && ((u != j.UNSENT)))) && ((u != j.UNCONFIRMED)))) && ((u != j.SUCCESS))))) {\n                x = this.renderErrorIndicator(v, w);\n            }\n            \n        ;\n        ;\n            return x;\n        },\n        renderResendIndicator: function() {\n            return m[\":fb:mercury:resend-indicator\"].render();\n        },\n        renderErrorIndicator: function(u, v) {\n            if (!u) {\n                return null;\n            }\n        ;\n        ;\n            var w = m[\":fb:mercury:error-indicator\"].render(), x = u.is_transient, y = k.getMessage(u);\n            if (x) {\n                if (k.isConnectionError(u)) {\n                    y = r._(\"{message} Check your network connection or click to try again.\", {\n                        message: y\n                    });\n                }\n                 else y = r._(\"{message} Click to send again.\", {\n                    message: y\n                });\n            ;\n            }\n        ;\n        ;\n            n.set(w, y, \"above\", \"center\");\n            if (((v && x))) {\n                g.listen(w, \"click\", v);\n                w.setAttribute(\"tabindex\", \"0\");\n                h.addClass(w, \"-cx-PRIVATE-fbMercuryStatus__clickableerror\");\n            }\n        ;\n        ;\n            return w;\n        },\n        _cloneIfDOMElement: function(u) {\n            if (u.cloneNode) {\n                return u.cloneNode();\n            }\n             else return u\n        ;\n        }\n    };\n    function t(u) {\n        var v = p.BASE_PATH;\n        if (((u && ((u != l.INBOX))))) {\n            v += ((\"/\" + u));\n        }\n    ;\n    ;\n        return v;\n    };\n;\n    e.exports = s;\n});\n__d(\"MercurySeenByAll\", [\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"MercuryParticipants\",\"MercuryDelayedRoger\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryThreads\").get(), m = {\n    }, n = {\n        updateOnSeenChange: function(p, q) {\n            m[p.tagName] = true;\n            h.set(p, \"thread-id\", q.thread_id);\n            g.addClass(p, \"seenByListener\");\n            o(p, q);\n        }\n    };\n    function o(p, q) {\n        var r = q.participants.filter(function(t) {\n            return ((t !== j.user));\n        }), s = ((((q.participants.length > 0)) && ((q.participants[0] === j.user))));\n        g.conditionClass(p, \"repliedLast\", s);\n        g.conditionClass(p, \"seenByAll\", ((s && ((k.getSeenBy(q.thread_id).length === r.length)))));\n    };\n;\n    k.subscribe(\"state-changed\", function(p, q) {\n        {\n            var fin181keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin181i = (0);\n            var r;\n            for (; (fin181i < fin181keys.length); (fin181i++)) {\n                ((r) = (fin181keys[fin181i]));\n                {\n                    var s = i.scry(JSBNG__document.body, ((r + \".seenByListener\")));\n                    for (var t = 0; ((t < s.length)); t++) {\n                        var u = s[t], v = h.get(u, \"thread-id\");\n                        if (q[v]) {\n                            l.getThreadMeta(v, function(w) {\n                                o(u, w);\n                            });\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = n;\n});\n__d(\"MercuryThreadMetadataRenderer\", [\"MercuryConfig\",\"JSBNG__CSS\",\"DOM\",\"Emoji\",\"HTML\",\"JSLogger\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessageSourceTags\",\"MercurySingletonMixin\",\"MercuryThreadMetadataRawRenderer\",\"MercuryParticipants\",\"MercuryParticipantsConstants\",\"Pixelz.react\",\"React\",\"MercurySeenByAll\",\"MercuryServerRequests\",\"SplitImage.react\",\"Style\",\"MercuryThreadlistIconTemplates\",\"MercuryThreads\",\"Tooltip\",\"URI\",\"arrayContains\",\"createArrayFrom\",\"copyProperties\",\"cx\",\"formatDate\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"Emoji\"), k = b(\"HTML\"), l = b(\"JSLogger\"), m = b(\"MercuryAttachment\"), n = b(\"MercuryAttachmentType\"), o = b(\"MercuryMessageSourceTags\"), p = b(\"MercurySingletonMixin\"), q = b(\"MercuryThreadMetadataRawRenderer\"), r = b(\"MercuryParticipants\"), s = b(\"MercuryParticipantsConstants\"), t = b(\"Pixelz.react\"), u = b(\"React\"), v = b(\"MercurySeenByAll\"), w = b(\"MercuryServerRequests\"), x = b(\"SplitImage.react\"), y = b(\"Style\"), z = b(\"MercuryThreadlistIconTemplates\"), aa = b(\"MercuryThreads\"), ba = b(\"Tooltip\"), ca = b(\"URI\"), da = b(\"arrayContains\"), ea = b(\"createArrayFrom\"), fa = b(\"copyProperties\"), ga = b(\"cx\"), ha = b(\"formatDate\"), ia = b(\"tx\"), ja = l.create(\"wm_timestamp\");\n    function ka(qa) {\n        this._fbid = qa;\n        this._serverRequests = w.getForFBID(qa);\n        this._threads = aa.getForFBID(qa);\n    };\n;\n    fa(ka, p);\n    fa(ka.prototype, {\n        renderTimestamp: function(qa, ra, sa, ta) {\n            if (ta) {\n                if (!ra) {\n                    ja.warn(\"no_title\");\n                    ra = (new JSBNG__Date(ta)).toLocaleDateString();\n                }\n            ;\n            ;\n                qa.setAttribute(\"title\", ra);\n                qa.setAttribute(\"data-utime\", ((ta / 1000)));\n                if (!sa) {\n                    ja.warn(\"no_display\");\n                    sa = ha(new JSBNG__Date(ta), ((g[\"24h_times\"] ? \"H:i\" : \"g:ia\")));\n                }\n            ;\n            ;\n                i.setContent(qa, sa);\n                h.show(qa);\n            }\n        ;\n        ;\n        },\n        renderMessageSourceTags: function(qa, ra, sa, ta) {\n            var ua = \"\", va = \"\", wa = \"\";\n            if (da(sa, o.MESSENGER)) {\n                ua = \"Sent from Messenger\";\n                va = new ca(\"/mobile/messenger\");\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemessenger\";\n            }\n             else if (da(sa, o.MOBILE)) {\n                ua = \"Sent from Mobile\";\n                va = new ca(\"/mobile/\");\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourcemobile\";\n            }\n             else if (da(sa, o.CHAT)) {\n                ua = \"Sent from chat\";\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourcechat\";\n            }\n             else if (da(sa, o.EMAIL)) {\n                if (ta) {\n                    ua = ia._(\"Sent from {email}\", {\n                        email: ta\n                    });\n                }\n                 else ua = \"Sent from email\";\n            ;\n            ;\n                wa = \"-cx-PRIVATE-webMessengerMessageGroup__sourceemail\";\n            }\n            \n            \n            \n        ;\n        ;\n            if (wa) {\n                ba.set(qa, ua);\n                h.addClass(ra, wa);\n                if (va) {\n                    qa.setAttribute(\"href\", va);\n                }\n                 else qa.removeAttribute(\"href\");\n            ;\n            ;\n            }\n             else h.hide(qa);\n        ;\n        ;\n        },\n        renderMessageLocation: function(qa, ra, sa) {\n            var ta = ca(\"/ajax/messaging/hovercard/map.php\").setQueryData(sa);\n            qa.setAttribute(\"data-hovercard\", ta);\n            h.removeClass(qa, \"-cx-PRIVATE-webMessengerMessageGroup__nolocation\");\n            h.show(ra);\n        },\n        renderSpoofWarning: function(qa, ra, sa) {\n            if (ra) {\n                h.addClass(qa, \"-cx-PRIVATE-webMessengerMessageGroup__spoofwarning\");\n                ba.set(qa, ia._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: sa.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderChatSpoofWarning: function(qa, ra, sa) {\n            if (ra) {\n                i.appendContent(qa, ia._(\"Unable to confirm {name_or_email} as the sender.\", {\n                    name_or_email: sa.JSBNG__name\n                }));\n            }\n        ;\n        ;\n        },\n        renderCoreThreadlist: function(qa, ra, sa, ta, ua) {\n            ta = ((ta || {\n            }));\n            this.renderThreadImage(qa, ra.getNode(\"image\"));\n            var va = ra.getNode(\"accessibleName\"), wa = [ra.getNode(\"JSBNG__name\"),];\n            if (va) {\n                wa.push(va);\n            }\n        ;\n        ;\n            pa(this, qa, wa, ta);\n            if (((qa.folder && ua))) {\n                oa(ra.getNode(\"folderBadge\"), qa.folder);\n            }\n        ;\n        ;\n            var xa = ra.getNode(\"timestamp\");\n            this.renderTimestamp(xa, qa.timestamp_absolute, qa.timestamp_relative, qa.timestamp);\n            this.renderSnippet(qa, ra.getNode(\"snippet\"));\n            ma(ra, qa);\n            sa(ra, qa);\n        },\n        renderAndSeparatedParticipantList: function(qa, ra, sa) {\n            sa = ((sa || {\n            }));\n            sa.last_separator_uses_and = true;\n            this._threads.getThreadMeta(qa, function(ta) {\n                pa(this, ta, ra, sa);\n            }.bind(this));\n        },\n        renderSnippet: function(qa, ra) {\n            var sa = false, ta = i.create(\"span\");\n            h.addClass(ta, \"MercuryRepliedIndicator\");\n            i.appendContent(ra, ta);\n            v.updateOnSeenChange(ta, qa);\n            var ua = qa.snippet;\n            if (ua) {\n                if (qa.snippet_has_attachment) {\n                    i.appendContent(ra, i.create(\"span\", {\n                        className: \"MercuryAttachmentIndicator\"\n                    }));\n                }\n            ;\n            ;\n                if (qa.is_forwarded_snippet) {\n                    i.appendContent(ra, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message:\"));\n                }\n            ;\n            ;\n                if (((ua.substr(0, 4) == \"?OTR\"))) {\n                    ua = \"[encrypted message]\";\n                }\n                 else ua = ua.replace(/\\r\\n|[\\r\\n]/g, \" \");\n            ;\n            ;\n                ua = k(j.htmlEmojiAndEmote(ua));\n            }\n             else {\n                if (qa.is_forwarded_snippet) {\n                    i.appendContent(ra, i.create(\"strong\", {\n                        className: \"-cx-PRIVATE-fbMercuryStatus__forwarded\"\n                    }, \"Forwarded Message\"));\n                }\n            ;\n            ;\n                if (((((qa.snippet_has_attachment && qa.snippet_attachments)) && qa.snippet_attachments.length))) {\n                    sa = true;\n                    ua = i.create(\"span\");\n                    na(this, qa, ua);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var va = qa.participants.length;\n            if (qa.is_subscribed) {\n                va--;\n            }\n        ;\n        ;\n            if (((((((!sa && qa.snippet_sender)) && ((r.getIDForUser(this._fbid) != qa.snippet_sender)))) && ((va > 1))))) {\n                r.get(qa.snippet_sender, function(wa) {\n                    if (wa.short_name) {\n                        i.appendContent(ra, ia._(\"{name}: {conversation_snippet}\", {\n                            JSBNG__name: wa.short_name,\n                            conversation_snippet: ua\n                        }));\n                    }\n                     else i.appendContent(ra, ua);\n                ;\n                ;\n                });\n            }\n             else i.appendContent(ra, ua);\n        ;\n        ;\n        },\n        getTitanURL: function(qa, ra, sa) {\n            if (((qa.substr(0, qa.indexOf(\":\")) == \"user\"))) {\n                q.getUserCanonicalTitanURL(qa, ra, sa);\n            }\n             else this._serverRequests.getServerThreadID(qa, function(ta) {\n                q.getTitanURLWithServerID(ta, ra, sa);\n            });\n        ;\n        ;\n        },\n        renderTitanLink: function(qa, ra, sa, ta) {\n            if (((qa.substr(0, qa.indexOf(\":\")) == \"user\"))) {\n                q.renderUserCanonicalTitanLink(qa, ra, sa, ta);\n            }\n             else this._serverRequests.getServerThreadID(qa, function(ua) {\n                q.renderTitanLinkWithServerID(ua, ra, sa, ta);\n            });\n        ;\n        ;\n        },\n        renderThreadImage: function(qa, ra) {\n            if (qa.image_src) {\n                var sa = t({\n                    height: s.BIG_IMAGE_SIZE,\n                    resizeMode: \"cover\",\n                    src: qa.image_src,\n                    width: s.BIG_IMAGE_SIZE\n                });\n                u.renderComponent(sa, ra);\n                return;\n            }\n        ;\n        ;\n            var ta = r.getIDForUser(this._fbid), ua = [], va = qa.participants.filter(function(wa) {\n                return ((wa != ta));\n            });\n            if (!va.length) {\n                ua = [ta,];\n            }\n             else if (((va.length == 1))) {\n                ua = [va[0],];\n            }\n             else ua = va.slice(0, 3);\n            \n        ;\n        ;\n            this.renderParticipantImages(ua, ra);\n        },\n        renderParticipantImages: function(qa, ra) {\n            r.getOrderedBigImageMulti(qa, function(sa) {\n                var ta = x({\n                    srcs: sa,\n                    border: true,\n                    size: s.BIG_IMAGE_SIZE\n                });\n                u.renderComponent(ta, ra);\n            });\n        },\n        renderParticipantList: function(qa, ra, sa, ta) {\n            return q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(qa), ra, sa, ta);\n        },\n        renderThreadNameAndParticipantList: function(qa, ra, sa, ta) {\n            var ua = q.renderRawParticipantList(this._serverRequests.getServerThreadIDNow(qa), ra, sa, ta), va = this._threads.getThreadMetaNow(qa);\n            if (!va.JSBNG__name) {\n                return ua;\n            }\n        ;\n        ;\n            return ia._(\"{conversation_name} [with {participant_list}]\", {\n                conversation_name: va.JSBNG__name,\n                participant_list: ua\n            });\n        },\n        renderParticipantCount: function(qa, ra) {\n            return q.renderRawParticipantCount(this._serverRequests.getServerThreadIDNow(qa), ra);\n        }\n    });\n    function la(qa) {\n        if (!qa.snippet_attachments) {\n            return [];\n        }\n    ;\n    ;\n        return qa.snippet_attachments.filter(function(ra) {\n            return ((ra.attach_type === n.PHOTO));\n        });\n    };\n;\n    function ma(qa, ra) {\n        var sa = la(ra);\n        if (((sa.length === 0))) {\n            return;\n        }\n    ;\n    ;\n        var ta = sa[0].thumbnail_url;\n        if (!ta) {\n            return;\n        }\n    ;\n    ;\n        var ua = ((((sa.length == 1)) ? \"snippet-thumbnail-single\" : \"snippet-thumbnail-multiple\")), va = qa.getNode(ua);\n        if (!va) {\n            return;\n        }\n    ;\n    ;\n        var wa = i.JSBNG__find(va, \"i\");\n        y.set(wa, \"background-image\", ((((\"url(\" + ta)) + \")\")));\n        h.show(va);\n    };\n;\n    function na(qa, ra, sa) {\n        var ta = ((ra.snippet_sender && ((r.getIDForUser(qa._fbid) == ra.snippet_sender)))), ua = function(za) {\n            if (((!ra.snippet_sender || ta))) {\n                za(null);\n                return;\n            }\n        ;\n        ;\n            r.get(ra.snippet_sender, function(ab) {\n                za(ab.short_name);\n            });\n        }, va = la(ra), wa = ((va.length == ra.snippet_attachments.length)), xa = ((((((ra.snippet_attachments.length === 1)) && ra.snippet_attachments[0].metadata)) && ((ra.snippet_attachments[0].metadata.type == \"fb_voice_message\")))), ya = ((((ra.snippet_attachments.length === 1)) && ((ra.snippet_attachments[0].attach_type === n.STICKER))));\n        ua(function(za) {\n            var ab = null;\n            if (wa) {\n                var bb = z[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                if (((va.length === 1))) {\n                    ab = ((ta ? \"You sent a photo.\" : ia._(\"{name} sent a photo.\", {\n                        JSBNG__name: za\n                    })));\n                }\n                 else ab = ((ta ? ia._(\"You sent {num_photos} photos.\", {\n                    num_photos: va.length\n                }) : ia._(\"{name} sent {num_photos} photos.\", {\n                    JSBNG__name: za,\n                    num_photos: va.length\n                })));\n            ;\n            ;\n                h.addClass(bb, m.getAttachIconClass(va[0].icon_type));\n                i.appendContent(bb, ab);\n                i.appendContent(sa, bb);\n            }\n             else if (xa) {\n                var cb = z[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                ab = ((ta ? \"You sent a voice message.\" : ia._(\"{name} sent a voice message.\", {\n                    JSBNG__name: za\n                })));\n                h.addClass(cb, m.getAttachIconClass(ra.snippet_attachments[0].icon_type));\n                i.appendContent(cb, ab);\n                i.appendContent(sa, cb);\n            }\n             else if (ya) {\n                ab = ((ta ? \"You sent a sticker.\" : ia._(\"{name} sent a sticker.\", {\n                    JSBNG__name: za\n                })));\n                i.appendContent(sa, ab);\n            }\n             else ra.snippet_attachments.filter(function(db) {\n                return ((((db.attach_type == n.FILE)) || ((db.attach_type == n.PHOTO))));\n            }).forEach(function(db) {\n                var eb = z[\":fb:mercury:attachment-icon-text\"].build().getRoot();\n                i.appendContent(eb, db.JSBNG__name);\n                h.addClass(eb, m.getAttachIconClass(db.icon_type));\n                i.appendContent(sa, eb);\n            });\n            \n            \n        ;\n        ;\n        });\n    };\n;\n    function oa(qa, ra) {\n        ea(qa).forEach(function(sa) {\n            i.setContent(sa, ra);\n        });\n    };\n;\n    function pa(qa, ra, sa, ta) {\n        sa = ea(sa);\n        if (ra.JSBNG__name) {\n            var ua = q.renderRawTitleWithUnreadCount(ra.JSBNG__name, ((ta.show_unread_count ? ra.unread_count : 0)));\n            sa.forEach(function(wa) {\n                i.setContent(wa, ua);\n            });\n            ((ta.callback && ta.callback(ua)));\n            return;\n        }\n    ;\n    ;\n        var va = ra.participants;\n        if (((ra.participants.length > 1))) {\n            va = ra.participants.filter(function(wa) {\n                return ((wa != r.getIDForUser(qa._fbid)));\n            });\n        }\n    ;\n    ;\n        r.getMulti(va, function(wa) {\n            q.renderParticipantListWithNoThreadName(qa._serverRequests.getServerThreadIDNow(ra.thread_id), ra, va, wa, sa, ta);\n        });\n    };\n;\n    e.exports = ka;\n});\n__d(\"escapeRegex\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return h.replace(/([.?*+\\^$\\[\\]\\\\(){}|\\-])/g, \"\\\\$1\");\n    };\n;\n    e.exports = g;\n});\n__d(\"MercuryThreadSearchUtils\", [\"escapeRegex\",\"TokenizeUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"escapeRegex\"), h = b(\"TokenizeUtil\"), i = {\n        wordsInString: function(j) {\n            return ((j || \"\")).split(/\\s+/).filter(function(k) {\n                return ((k.trim().length > 0));\n            });\n        },\n        anyMatchPredicate: function(j, k) {\n            for (var l = 0; ((l < j.length)); l++) {\n                if (k(j[l])) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n            return false;\n        },\n        allMatchPredicate: function(j, k) {\n            for (var l = 0; ((l < j.length)); l++) {\n                if (!k(j[l])) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        queryWordMatchesAnyNameWord: function(j, k) {\n            var l = new RegExp(((\"\\\\b\" + g(j))), \"i\");\n            return this.anyMatchPredicate(k, function(m) {\n                var n = h.parse(m).flatValue;\n                return l.test(n);\n            });\n        },\n        queryMatchesName: function(j, k) {\n            var l = this.wordsInString(j), m = this.wordsInString(k);\n            return this.allMatchPredicate(l, function(n) {\n                return this.queryWordMatchesAnyNameWord(n, m);\n            }.bind(this));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Dcode\", [], function(a, b, c, d, e, f) {\n    var g, h = {\n    }, i = {\n        _: \"%\",\n        A: \"%2\",\n        B: \"000\",\n        C: \"%7d\",\n        D: \"%7b%22\",\n        E: \"%2c%22\",\n        F: \"%22%3a\",\n        G: \"%2c%22ut%22%3a1\",\n        H: \"%2c%22bls%22%3a\",\n        I: \"%2c%22n%22%3a%22%\",\n        J: \"%22%3a%7b%22i%22%3a0%7d\",\n        K: \"%2c%22pt%22%3a0%2c%22vis%22%3a\",\n        L: \"%2c%22ch%22%3a%7b%22h%22%3a%22\",\n        M: \"%7b%22v%22%3a2%2c%22time%22%3a1\",\n        N: \".channel%22%2c%22sub%22%3a%5b\",\n        O: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b\",\n        P: \"%2c%22ud%22%3a100%2c%22lc%22%3a0\",\n        Q: \"%5d%2c%22f%22%3anull%2c%22uct%22%3a\",\n        R: \".channel%22%2c%22sub%22%3a%5b1%5d\",\n        S: \"%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a\",\n        T: \"%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        U: \"%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        V: \"%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a\",\n        W: \"%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\",\n        X: \"%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1\",\n        Y: \"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a\",\n        Z: \"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a\"\n    };\n    (function() {\n        var k = [];\n        {\n            var fin182keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin182i = (0);\n            var l;\n            for (; (fin182i < fin182keys.length); (fin182i++)) {\n                ((l) = (fin182keys[fin182i]));\n                {\n                    h[i[l]] = l;\n                    k.push(i[l]);\n                };\n            };\n        };\n    ;\n        k.reverse();\n        g = new RegExp(k.join(\"|\"), \"g\");\n    })();\n    var j = {\n        encode: function(k) {\n            return encodeURIComponent(k).replace(/([_A-Z])|%../g, function(l, m) {\n                return ((m ? ((\"%\" + m.charCodeAt(0).toString(16))) : l));\n            }).toLowerCase().replace(g, function(l) {\n                return h[l];\n            });\n        },\n        decode: function(k) {\n            return decodeURIComponent(k.replace(/[_A-Z]/g, function(l) {\n                return i[l];\n            }));\n        }\n    };\n    e.exports = j;\n});\n__d(\"Poller\", [\"ArbiterMixin\",\"AsyncRequest\",\"Cookie\",\"Env\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"Cookie\"), j = b(\"Env\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(p) {\n        this._config = k({\n            clearOnQuicklingEvents: true,\n            setupRequest: l,\n            interval: null,\n            maxRequests: Infinity,\n            dontStart: false\n        }, p);\n        if (!this._config.dontStart) {\n            this.start();\n        }\n    ;\n    ;\n    };\n;\n    m.MIN_INTERVAL = 2000;\n    k(m.prototype, g, {\n        start: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_361), function() {\n            if (this._polling) {\n                return this;\n            }\n        ;\n        ;\n            this._requests = 0;\n            this.request();\n            return this;\n        })),\n        JSBNG__stop: function() {\n            this._cancelRequest();\n            return this;\n        },\n        mute: function() {\n            this._muted = true;\n            return this;\n        },\n        resume: function() {\n            if (this._muted) {\n                this._muted = false;\n                if (((!this._handle && this._polling))) {\n                    return this.request();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this;\n        },\n        skip: function() {\n            this._skip = true;\n            return this;\n        },\n        reset: function() {\n            return this.JSBNG__stop().start();\n        },\n        request: function() {\n            this._cancelRequest();\n            this._polling = true;\n            if (!o()) {\n                return this._done();\n            }\n        ;\n        ;\n            if (this._muted) {\n                return this;\n            }\n        ;\n        ;\n            if (((++this._requests > this._config.maxRequests))) {\n                return this._done();\n            }\n        ;\n        ;\n            var p = new h(), q = false;\n            p.setInitialHandler(function() {\n                return !q;\n            });\n            this._cancelRequest = function() {\n                q = true;\n                this._cleanup();\n            }.bind(this);\n            p.setFinallyHandler(n.bind(this));\n            p.setInitialHandler = l;\n            p.setFinallyHandler = l;\n            this._config.setupRequest(p, this);\n            if (this._skip) {\n                this._skip = false;\n                n.bind(this).defer();\n            }\n             else p.send();\n        ;\n        ;\n            return this;\n        },\n        isPolling: function() {\n            return this._polling;\n        },\n        isMuted: function() {\n            return this._muted;\n        },\n        JSBNG__setInterval: function(p) {\n            if (p) {\n                this._config.interval = p;\n                this.start();\n            }\n        ;\n        ;\n        },\n        getInterval: function() {\n            return this._config.interval;\n        },\n        _cleanup: function() {\n            if (this._handle) {\n                JSBNG__clearTimeout(this._handle);\n            }\n        ;\n        ;\n            this._handle = null;\n            this._cancelRequest = l;\n            this._polling = false;\n        },\n        _done: function() {\n            this._cleanup();\n            this.inform(\"done\", {\n                sender: this\n            });\n            return this;\n        },\n        _config: null,\n        _requests: 0,\n        _muted: false,\n        _polling: false,\n        _skip: false,\n        _cancelRequest: l\n    });\n    function n() {\n        if (!this._polling) {\n            return;\n        }\n    ;\n    ;\n        if (((this._requests < this._config.maxRequests))) {\n            var p = this._config.interval;\n            p = ((((typeof p === \"function\")) ? p(this._requests) : p));\n            this._handle = this.request.bind(this).defer(((((p > m.MIN_INTERVAL)) ? p : m.MIN_INTERVAL)), this._config.clearOnQuicklingEvents);\n        }\n         else this._done();\n    ;\n    ;\n    };\n;\n    function o() {\n        return ((j.user == i.get(\"c_user\")));\n    };\n;\n    e.exports = m;\n});\n__d(\"SystemEvents\", [\"Arbiter\",\"Env\",\"ErrorUtils\",\"UserAgent\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Env\"), i = b(\"ErrorUtils\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = new g(), m = [], n = 1000;\n    JSBNG__setInterval(((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379), function() {\n        for (var w = 0; ((w < m.length)); w++) {\n            m[w]();\n        ;\n        };\n    ;\n    })), n, false);\n    function o() {\n        return ((((/c_user=(\\d+)/.test(JSBNG__document.cookie) && RegExp.$1)) || 0));\n    };\n;\n    var p = h.user, q = JSBNG__navigator.onLine;\n    function r() {\n        if (!q) {\n            q = true;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    function s() {\n        if (q) {\n            q = false;\n            l.inform(l.ONLINE, q);\n        }\n    ;\n    ;\n    };\n;\n    if (j.ie()) {\n        if (((j.ie() >= 8))) {\n            window.JSBNG__attachEvent(\"JSBNG__onload\", function() {\n                JSBNG__document.body.JSBNG__ononline = r;\n                JSBNG__document.body.JSBNG__onoffline = s;\n            });\n        }\n         else m.push(function() {\n            ((JSBNG__navigator.onLine ? r : s))();\n        });\n    ;\n    ;\n    }\n     else if (window.JSBNG__addEventListener) {\n        if (!j.chrome()) {\n            window.JSBNG__addEventListener(\"online\", r, false);\n            window.JSBNG__addEventListener(\"offline\", s, false);\n        }\n    ;\n    }\n    \n;\n;\n    var t = p;\n    m.push(function() {\n        var w = o();\n        if (((t != w))) {\n            l.inform(l.USER, w);\n            t = w;\n        }\n    ;\n    ;\n    });\n    var u = JSBNG__Date.now();\n    function v() {\n        var w = JSBNG__Date.now(), x = ((w - u)), y = ((((x < 0)) || ((x > 10000))));\n        u = w;\n        if (y) {\n            l.inform(l.TIME_TRAVEL, x);\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    m.push(v);\n    m.push(function() {\n        if (((window.JSBNG__onerror != i.JSBNG__onerror))) {\n            window.JSBNG__onerror = i.JSBNG__onerror;\n        }\n    ;\n    ;\n    });\n    k(l, {\n        USER: \"SystemEvents/USER\",\n        ONLINE: \"SystemEvents/ONLINE\",\n        TIME_TRAVEL: \"SystemEvents/TIME_TRAVEL\",\n        isPageOwner: function(w) {\n            return ((((w || o())) == p));\n        },\n        isOnline: function() {\n            return ((j.chrome() || q));\n        },\n        checkTimeTravel: v\n    });\n    e.exports = l;\n});\n__d(\"setIntervalAcrossTransitions\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        return JSBNG__setInterval(h, i, false);\n    };\n;\n    e.exports = g;\n});\n__d(\"PresenceCookieManager\", [\"Cookie\",\"Dcode\",\"ErrorUtils\",\"Env\",\"JSLogger\",\"PresenceUtil\",\"URI\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"Dcode\"), i = b(\"ErrorUtils\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"PresenceUtil\"), m = b(\"URI\"), n = b(\"PresenceInitialData\"), o = n.cookieVersion, p = n.dictEncode, q = \"presence\", r = {\n    }, s = null, t = null, u = k.create(\"presence_cookie\");\n    function v() {\n        try {\n            var z = g.get(q);\n            if (((s !== z))) {\n                s = z;\n                t = null;\n                if (((z && ((z.charAt(0) == \"E\"))))) {\n                    z = h.decode(z.substring(1));\n                }\n            ;\n            ;\n                if (z) {\n                    t = JSON.parse(z);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((t && ((!t.user || ((t.user === j.user))))))) {\n                return t;\n            }\n        ;\n        ;\n        } catch (y) {\n            u.warn(\"getcookie_error\");\n        };\n    ;\n        return null;\n    };\n;\n    function w() {\n        return parseInt(((JSBNG__Date.now() / 1000)), 10);\n    };\n;\n    var x = {\n        register: function(y, z) {\n            r[y] = z;\n        },\n        store: function() {\n            var y = v();\n            if (((((y && y.v)) && ((o < y.v))))) {\n                return;\n            }\n        ;\n        ;\n            var z = {\n                v: o,\n                time: w(),\n                user: j.user\n            };\n            {\n                var fin183keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin183i = (0);\n                var aa;\n                for (; (fin183i < fin183keys.length); (fin183i++)) {\n                    ((aa) = (fin183keys[fin183i]));\n                    {\n                        z[aa] = i.applyWithGuard(r[aa], r, [((y && y[aa])),], function(ea) {\n                            ea.presence_subcookie = aa;\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            var ba = JSON.stringify(z);\n            if (p) {\n                ba = ((\"E\" + h.encode(ba)));\n            }\n        ;\n        ;\n            if (l.hasUserCookie()) {\n                var ca = ba.length;\n                if (((ca > 1024))) {\n                    u.warn(\"big_cookie\", ca);\n                }\n            ;\n            ;\n                var da = ((m.getRequestURI(false).isSecure() && !!g.get(\"csm\")));\n                g.set(q, ba, null, null, da);\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            g.clear(q);\n        },\n        getSubCookie: function(y) {\n            var z = v();\n            if (!z) {\n                return null;\n            }\n        ;\n        ;\n            return z[y];\n        }\n    };\n    e.exports = x;\n});\n__d(\"PresenceState\", [\"Arbiter\",\"ErrorUtils\",\"JSLogger\",\"PresenceCookieManager\",\"copyProperties\",\"debounceAcrossTransitions\",\"setIntervalAcrossTransitions\",\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ErrorUtils\"), i = b(\"JSLogger\"), j = b(\"PresenceCookieManager\"), k = b(\"copyProperties\"), l = b(\"debounceAcrossTransitions\"), m = b(\"setIntervalAcrossTransitions\"), n = b(\"PresenceInitialData\"), o = ((n.cookiePollInterval || 2000)), p = [], q = [], r = null, s = null, t = 0, u = null, v = 0, w = [\"sb2\",\"t2\",\"lm2\",\"uct2\",\"tr\",\"tw\",\"at\",\"wml\",], x = i.create(\"presence_state\");\n    function y() {\n        return j.getSubCookie(\"state\");\n    };\n;\n    function z() {\n        t = JSBNG__Date.now();\n        j.store();\n        da(s);\n    };\n;\n    var aa = l(z, 0);\n    function ba(ia) {\n        if (((((((((typeof ia == \"undefined\")) || isNaN(ia))) || ((ia == Number.POSITIVE_INFINITY)))) || ((ia == Number.NEGATIVE_INFINITY))))) {\n            ia = 0;\n        }\n    ;\n    ;\n        return ia;\n    };\n;\n    function ca(ia) {\n        var ja = {\n        };\n        if (ia) {\n            w.forEach(function(ma) {\n                ja[ma] = ia[ma];\n            });\n            if (((t < ia.ut))) {\n                x.error(\"new_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ja.ut = t;\n        for (var ka = 0, la = p.length; ((ka < la)); ka++) {\n            h.applyWithGuard(p[ka], null, [ja,]);\n        ;\n        };\n    ;\n        s = ja;\n        return s;\n    };\n;\n    function da(ia) {\n        v++;\n        t = ba(ia.ut);\n        if (!r) {\n            r = m(ga, o);\n        }\n    ;\n    ;\n        s = ia;\n        if (((u === null))) {\n            u = ia;\n        }\n    ;\n    ;\n        for (var ja = 0, ka = q.length; ((ja < ka)); ja++) {\n            h.applyWithGuard(q[ja], null, [ia,]);\n        ;\n        };\n    ;\n        v--;\n    };\n;\n    function ea(ia) {\n        if (((ia && ia.ut))) {\n            if (((t < ia.ut))) {\n                return true;\n            }\n             else if (((ia.ut < t))) {\n                x.error(\"old_cookie\", {\n                    cookie_time: ia.ut,\n                    local_time: t\n                });\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function fa() {\n        var ia = y();\n        if (ea(ia)) {\n            s = ia;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function ga() {\n        var ia = y();\n        if (ea(ia)) {\n            da(ia);\n        }\n    ;\n    ;\n    };\n;\n    j.register(\"state\", ca);\n    g.subscribe(i.DUMP_EVENT, function(ia, ja) {\n        ja.presence_state = {\n            initial: k({\n            }, u),\n            state: k({\n            }, s),\n            update_time: t,\n            sync_paused: v,\n            poll_time: o\n        };\n    });\n    (function() {\n        var ia = fa();\n        if (ia) {\n            da(ia);\n        }\n         else {\n            x.debug(\"no_cookie_initial\");\n            da(ca());\n            return;\n        }\n    ;\n    ;\n    })();\n    var ha = {\n        doSync: function(ia) {\n            if (v) {\n                return;\n            }\n        ;\n        ;\n            if (ia) {\n                z();\n            }\n             else aa();\n        ;\n        ;\n        },\n        registerStateStorer: function(ia) {\n            p.push(ia);\n        },\n        registerStateLoader: function(ia) {\n            q.push(ia);\n        },\n        get: function() {\n            return fa();\n        },\n        getInitial: function() {\n            return u;\n        },\n        verifyNumber: ba\n    };\n    e.exports = ha;\n});\n__d(\"TypingDetector\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"Input\",\"Run\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"Input\"), j = b(\"Run\"), k = b(\"copyProperties\"), l = b(\"createObjectFrom\"), m = b(\"emptyFunction\");\n    function n(o) {\n        this._input = o;\n        this._ignoreKeys = {\n        };\n    };\n;\n    n.INACTIVE = 0;\n    n.TYPING = 1;\n    n.QUITTING = 2;\n    k(n.prototype, h, {\n        _timeout: 7000,\n        _currentState: n.INACTIVE,\n        init: function() {\n            this.init = m;\n            this.reset();\n            g.listen(this._input, \"keyup\", this._update.bind(this));\n            j.onUnload(this._onunload.bind(this));\n        },\n        reset: function() {\n            JSBNG__clearTimeout(this._checkTimer);\n            this._checkTimer = null;\n            this._lastKeystrokeAt = null;\n            this._currentState = n.INACTIVE;\n        },\n        setIgnoreKeys: function(o) {\n            this._ignoreKeys = l(o);\n        },\n        _onunload: function() {\n            if (((this._currentState == n.TYPING))) {\n                this._transition(n.QUITTING);\n            }\n        ;\n        ;\n        },\n        _update: function(JSBNG__event) {\n            var o = g.getKeyCode(JSBNG__event), p = this._currentState;\n            if (!this._ignoreKeys[o]) {\n                if (((i.getValue(this._input).trim().length === 0))) {\n                    if (((p == n.TYPING))) {\n                        this._transition(n.INACTIVE);\n                    }\n                ;\n                ;\n                }\n                 else if (((p == n.TYPING))) {\n                    this._recordKeystroke();\n                }\n                 else if (((p == n.INACTIVE))) {\n                    this._transition(n.TYPING);\n                    this._recordKeystroke();\n                }\n                \n                \n            ;\n            }\n        ;\n        ;\n        },\n        _transition: function(o) {\n            this.reset();\n            this._currentState = o;\n            this.inform(\"change\", o);\n        },\n        _recordKeystroke: function() {\n            this._lastKeystrokeTime = JSBNG__Date.now();\n            if (!this._checkTimer) {\n                this._checkTimer = this._checkTyping.bind(this).defer(this._timeout);\n            }\n        ;\n        ;\n        },\n        _checkTyping: function() {\n            var o = ((this._lastKeystrokeTime + this._timeout)), p = JSBNG__Date.now();\n            if (((p > o))) {\n                this._transition(n.INACTIVE);\n            }\n             else {\n                JSBNG__clearTimeout(this._checkTimer);\n                this._checkTimer = this._checkTyping.bind(this).defer(((((o - p)) + 10)));\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"URLMatcher\", [], function(a, b, c, d, e, f) {\n    var g = \"!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\", h = \"\\u2000-\\u206f\\u00ab\\u00bb\\uff08\\uff09\", i = \"(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\", j = \"(?:(?:ht|f)tps?)://\", k = ((((((((\"(?:(?:\" + i)) + \"[.]){3}\")) + i)) + \")\")), l = \"\\\\[(?:(?:[A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})\\\\]\", m = \"(?:\\\\b)www\\\\d{0,3}[.]\", n = ((((((\"[^\\\\s\" + g)) + h)) + \"]\")), o = ((((((((((((\"(?:(?:(?:[.:\\\\-_%@]|\" + n)) + \")*\")) + n)) + \")|\")) + l)) + \")\")), p = \"(?:[.][a-z]{2,4})\", q = \"(?::\\\\d+){0,1}\", r = \"(?=[/?#])\", s = ((((((((((((((((((((((((((((((((((((((((((((((((((((\"(?:\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + k)) + q)) + \")|\")) + \"(?:\")) + l)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")|\")) + \"(?:\")) + o)) + p)) + q)) + r)) + \")\")) + \")\")), t = \"[/#?]\", u = \"\\\\([^\\\\s()\\u003C\\u003E]+\\\\)\", v = \"[^\\\\s()\\u003C\\u003E?#]+\", w = new RegExp(s, \"im\"), x = \"^\\\\[[0-9]{1,4}:[0-9]{1,4}:[A-Fa-f0-9]{1,4}\\\\]\", y = new RegExp(x, \"im\"), z = ((((((((((((((((((((((\"(?:\" + \"(?:\")) + t)) + \")\")) + \"(?:\")) + \"(?:\")) + u)) + \"|\")) + v)) + \")*\")) + \")*\")) + \")*\")), aa = new RegExp(((((((((((((((\"(\" + \"(?:\")) + s)) + \")\")) + \"(?:\")) + z)) + \")\")) + \")\")), \"im\"), ba = new RegExp(((((((((((((((((((((((((\"(\" + \"(?:\")) + j)) + o)) + q)) + \")|\")) + \"(?:\")) + m)) + o)) + p)) + q)) + \")\")) + \")\"))), ca = /[\\s'\";]/, da = new RegExp(t, \"im\"), ea = new RegExp(\"[\\\\s!\\\"#%&'()*,-./:;\\u003C\\u003E?@[\\\\]^_`{|}\\u00ab\\u00bb\\u2000-\\u206f\\uff08\\uff09]\", \"im\"), fa = new RegExp(\"[\\\\s()\\u003C\\u003E?#]\", \"im\"), ga = new RegExp(\"\\\\s()\\u003C\\u003E\"), ha = function(oa) {\n        if (((oa && ((oa.indexOf(\"@\") != -1))))) {\n            return (((ba.exec(oa)) ? oa : null));\n        }\n         else return oa\n    ;\n    }, ia = function(oa) {\n        return ja(oa, aa);\n    }, ja = function(oa, pa) {\n        var qa = ((((pa.exec(oa) || []))[1] || null));\n        return ha(qa);\n    }, ka = function(oa) {\n        return w.exec(oa);\n    }, la = function(oa) {\n        return !ca.test(oa.charAt(((oa.length - 1))));\n    }, ma = function(oa) {\n        do {\n            var pa = w.exec(oa);\n            if (!pa) {\n                return null;\n            }\n        ;\n        ;\n            var qa = false;\n            if (((((((pa[0][0] === \"[\")) && ((pa.index > 0)))) && ((oa[((pa.index - 1))] === \"@\"))))) {\n                var ra = y.exec(pa[0]);\n                if (ra) {\n                    qa = true;\n                    oa = oa.substr(((pa.index + ra[0].length)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        } while (qa);\n        var sa = oa.substr(((pa.index + pa[0].length)));\n        if (((((sa.length === 0)) || !(da.test(sa[0]))))) {\n            return ha(pa[0]);\n        }\n    ;\n    ;\n        var ta = 0, ua = 0, va = 1, wa = 0, xa = ua;\n        for (var ya = 1; ((ya < sa.length)); ya++) {\n            var za = sa[ya];\n            if (((xa === ua))) {\n                if (((za === \"(\"))) {\n                    wa = ((wa + 1));\n                    xa = va;\n                }\n                 else if (((da.test(za) || !(ea.test(za))))) {\n                    ta = ya;\n                }\n                 else if (fa.test(za)) {\n                    break;\n                }\n                \n                \n            ;\n            ;\n            }\n             else if (((za === \"(\"))) {\n                wa = ((wa + 1));\n            }\n             else if (((za === \")\"))) {\n                wa = ((wa - 1));\n                if (((wa === 0))) {\n                    xa = ua;\n                    ta = ya;\n                }\n            ;\n            ;\n            }\n             else if (ga.test(za)) {\n                break;\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return ha(((pa[0] + sa.substring(0, ((ta + 1))))));\n    }, na = {\n    };\n    na.permissiveMatch = ia;\n    na.matchToPattern = ja;\n    na.matchHost = ka;\n    na.trigger = la;\n    na.match = ma;\n    e.exports = na;\n});");
// 9122
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o120,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yi/r/gZ1fwdeYASl.js",o121);
// undefined
o120 = null;
// undefined
o121 = null;
// 9127
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"+P3v8\",]);\n}\n;\n__d(\"FriendBrowserCheckboxController\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"Event\",\"Form\",\"OnVisible\",\"$\",\"bind\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"Form\"), l = b(\"OnVisible\"), m = b(\"$\"), n = b(\"bind\"), o = b(\"copyProperties\"), p = b(\"ge\");\n    function q() {\n    \n    };\n    o(q, {\n        instances: {\n        },\n        getInstance: function(r) {\n            return this.instances[r];\n        }\n    });\n    o(q.prototype, {\n        init: function(r, s, t, u) {\n            q.instances[r] = this;\n            this._id = r;\n            this._simplified = t;\n            this._infiniteScroll = u;\n            this._form = s;\n            this._contentGrid = i.find(s, \".friendBrowserCheckboxContentGrid\");\n            this._loadingIndicator = i.find(s, \".friendBrowsingCheckboxContentLoadingIndicator\");\n            this._checkboxResults = i.find(s, \".friendBrowserCheckboxResults\");\n            this._contentPager = i.find(s, \".friendBrowserCheckboxContentPager\");\n            this.numGetNewRequests = 0;\n            this.queuedRequests = {\n            };\n            j.listen(this._form, \"submit\", this.onFormSubmit.bind(this));\n        },\n        addTypeahead: function(r, s) {\n            r.subscribe(\"select\", this.onHubSelect.bind(this, r, s));\n            if (this._simplified) {\n                r.subscribe(\"unselect\", this.onHubSelect.bind(this, r, s));\n            };\n        },\n        onFormSubmit: function() {\n            this.getNew(true);\n            return false;\n        },\n        addSelector: function(r) {\n            r.subscribe(\"change\", this.getNew.bind(this, false));\n        },\n        onHubSelect: function(r, s, event, t) {\n            if (this._simplified) {\n                this.getNew(true);\n                return;\n            }\n        ;\n            if (!((((event == \"select\")) && t.selected))) {\n                return\n            };\n            var u = this.buildNewCheckbox(s, t.selected.text, t.selected.uid), v = i.find(this._form, (\".checkboxes_\" + s));\n            i.appendContent(v.firstChild, u);\n            var w = i.scry(r.getElement(), \"input[type=\\\"button\\\"]\");\n            if ((w && w[0])) {\n                w[0].click();\n            };\n            this.getNew(true);\n        },\n        buildNewCheckbox: function(r, s, t) {\n            var u = ((r + \"_ids_\") + t), v = (r + \"_ids[]\"), w = i.create(\"input\", {\n                id: u,\n                type: \"checkbox\",\n                value: t,\n                name: v,\n                checked: true\n            });\n            j.listen(w, \"click\", n(this, \"getNew\", false));\n            var x = i.create(\"td\", null, w);\n            h.addClass(x, \"vTop\");\n            h.addClass(x, \"hLeft\");\n            var y = i.create(\"label\", null, s), z = i.create(\"td\", null, y);\n            h.addClass(z, \"vMid\");\n            h.addClass(z, \"hLeft\");\n            var aa = i.create(\"tr\");\n            aa.appendChild(x);\n            aa.appendChild(z);\n            return aa;\n        },\n        showMore: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (!r) {\n                return false\n            };\n            if (h.hasClass(r, \"async_saving\")) {\n                return false\n            };\n            var s = this.numGetNewRequests, t = k.serialize(this._form);\n            t.show_more = true;\n            var u = new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(v) {\n                this.showMoreHandler(v, s);\n            })).setStatusElement(r).send();\n        },\n        showMoreHandler: function(r, s) {\n            if ((s == this.numGetNewRequests)) {\n                var t = r.payload;\n                i.appendContent(this._contentGrid, t.results);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        },\n        getNew: function(r) {\n            this.numGetNewRequests++;\n            var s = this.numGetNewRequests;\n            h.addClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n            if (p(\"friendBrowserCI\")) {\n                h.addClass(m(\"friendBrowserCI\"), \"friendBrowserCheckboxContentOnload\");\n            };\n            h.show(this._loadingIndicator);\n            var t = k.serialize(this._form);\n            t.used_typeahead = r;\n            new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(u) {\n                this.getNewHandler(u, s);\n            })).send();\n        },\n        getNewHandler: function(r, s) {\n            if ((s == this.numGetNewRequests)) {\n                var t = r.payload;\n                i.setContent(this._contentGrid, t.results);\n                h.removeClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n                if (p(\"friendBrowserCI\")) {\n                    h.hide(m(\"friendBrowserCI\"));\n                };\n                h.hide(this._loadingIndicator);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        },\n        updatePagerAndExtraData: function(r, s) {\n            i.setContent(this._contentPager, r);\n            if (this._infiniteScroll) {\n                this.setupOnVisible();\n            };\n            i.replace(this._form.elements.extra_data, s);\n        },\n        setupOnVisible: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if ((r && (this._id != \"jewel\"))) {\n                (this._onVisible && this._onVisible.remove());\n                this._onVisible = new l(r, n(this, \"showMore\"), false, 1000);\n            }\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"FacebarResultStoreUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        processEntityResult: function(h, i, j, k) {\n            var l = {\n                semantic: i.toString(),\n                structure: [{\n                    type: (\"ent:\" + h),\n                    text: j,\n                    uid: i\n                },],\n                type: ((\"{\" + h) + \"}\"),\n                cost: k,\n                cache_id_length: 0,\n                bolding: []\n            };\n            l.tuid = JSON.stringify({\n                semantic: l.semantic,\n                structure: l.structure\n            });\n            return l;\n        },\n        getRawTextFromStructured: function(h) {\n            var i = \"\";\n            h.forEach(function(j, k) {\n                i += j.getText();\n            });\n            return i;\n        }\n    };\n    e.exports = g;\n});\n__d(\"HashtagParser\", [\"URLMatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"URLMatcher\"), h = 100, i = 30, j = /@\\[([0-9]+):([0-9]+):((?:[^\\\\\\]]*(?:\\\\.)*)*)\\]/g;\n    function k() {\n        var da = ((((((((((((((((\"\\u00c0-\\u00d6\" + \"\\u00d8-\\u00f6\") + \"\\u00f8-\\u00ff\") + \"\\u0100-\\u024f\") + \"\\u0253-\\u0254\") + \"\\u0256-\\u0257\") + \"\\u0259\") + \"\\u025b\") + \"\\u0263\") + \"\\u0268\") + \"\\u026f\") + \"\\u0272\") + \"\\u0289\") + \"\\u028b\") + \"\\u02bb\") + \"\\u0300-\\u036f\") + \"\\u1e00-\\u1eff\"), ea = ((((((((((((((((((((((((((((((((((((((((((((\"\\u0400-\\u04ff\" + \"\\u0500-\\u0527\") + \"\\u2de0-\\u2dff\") + \"\\ua640-\\ua69f\") + \"\\u0591-\\u05bf\") + \"\\u05c1-\\u05c2\") + \"\\u05c4-\\u05c5\") + \"\\u05c7\") + \"\\u05d0-\\u05ea\") + \"\\u05f0-\\u05f4\") + \"\\ufb12-\\ufb28\") + \"\\ufb2a-\\ufb36\") + \"\\ufb38-\\ufb3c\") + \"\\ufb3e\") + \"\\ufb40-\\ufb41\") + \"\\ufb43-\\ufb44\") + \"\\ufb46-\\ufb4f\") + \"\\u0610-\\u061a\") + \"\\u0620-\\u065f\") + \"\\u066e-\\u06d3\") + \"\\u06d5-\\u06dc\") + \"\\u06de-\\u06e8\") + \"\\u06ea-\\u06ef\") + \"\\u06fa-\\u06fc\") + \"\\u06ff\") + \"\\u0750-\\u077f\") + \"\\u08a0\") + \"\\u08a2-\\u08ac\") + \"\\u08e4-\\u08fe\") + \"\\ufb50-\\ufbb1\") + \"\\ufbd3-\\ufd3d\") + \"\\ufd50-\\ufd8f\") + \"\\ufd92-\\ufdc7\") + \"\\ufdf0-\\ufdfb\") + \"\\ufe70-\\ufe74\") + \"\\ufe76-\\ufefc\") + \"\\u200c-\\u200c\") + \"\\u0e01-\\u0e3a\") + \"\\u0e40-\\u0e4e\") + \"\\u1100-\\u11ff\") + \"\\u3130-\\u3185\") + \"\\ua960-\\ua97f\") + \"\\uac00-\\ud7af\") + \"\\ud7b0-\\ud7ff\") + \"\\uffa1-\\uffdc\"), fa = String.fromCharCode, ga = ((((((((((((((((\"\\u30a1-\\u30fa\\u30fc-\\u30fe\" + \"\\uff66-\\uff9f\") + \"\\uff10-\\uff19\\uff21-\\uff3a\") + \"\\uff41-\\uff5a\") + \"\\u3041-\\u3096\\u3099-\\u309e\") + \"\\u3400-\\u4dbf\") + \"\\u4e00-\\u9fff\") + fa(173824)) + \"-\") + fa(177983)) + fa(177984)) + \"-\") + fa(178207)) + fa(194560)) + \"-\") + fa(195103)) + \"\\u3003\\u3005\\u303b\"), ha = ((da + ea) + ga), ia = ((((((((((((((((((((((((((((((((((((((((((((((((((\"A-Za-z\\u00aa\\u00b5\\u00ba\\u00c0-\\u00d6\\u00d8-\\u00f6\" + \"\\u00f8-\\u0241\\u0250-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ee\\u037a\\u0386\") + \"\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03f5\\u03f7-\\u0481\") + \"\\u048a-\\u04ce\\u04d0-\\u04f9\\u0500-\\u050f\\u0531-\\u0556\\u0559\\u0561-\\u0587\") + \"\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0621-\\u063a\\u0640-\\u064a\\u066e-\\u066f\") + \"\\u0671-\\u06d3\\u06d5\\u06e5-\\u06e6\\u06ee-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\") + \"\\u0712-\\u072f\\u074d-\\u076d\\u0780-\\u07a5\\u07b1\\u0904-\\u0939\\u093d\\u0950\") + \"\\u0958-\\u0961\\u097d\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\") + \"\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\") + \"\\u0a05-\\u0a0a\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\") + \"\\u0a35-\\u0a36\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\") + \"\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9\\u0abd\") + \"\\u0ad0\\u0ae0-\\u0ae1\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\") + \"\\u0b32-\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\") + \"\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\") + \"\\u0ba3-\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10\") + \"\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c\") + \"\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\") + \"\\u0ce0-\\u0ce1\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\") + \"\\u0d60-\\u0d61\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\") + \"\\u0e01-\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e46\\u0e81-\\u0e82\\u0e84\\u0e87-\\u0e88\") + \"\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\") + \"\\u0eaa-\\u0eab\\u0ead-\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\") + \"\\u0edc-\\u0edd\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6a\\u0f88-\\u0f8b\\u1000-\\u1021\") + \"\\u1023-\\u1027\\u1029-\\u102a\\u1050-\\u1055\\u10a0-\\u10c5\\u10d0-\\u10fa\\u10fc\") + \"\\u1100-\\u1159\\u115f-\\u11a2\\u11a8-\\u11f9\\u1200-\\u1248\\u124a-\\u124d\") + \"\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\") + \"\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\") + \"\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\") + \"\\u166f-\\u1676\\u1681-\\u169a\\u16a0-\\u16ea\\u1700-\\u170c\\u170e-\\u1711\") + \"\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\") + \"\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\") + \"\\u1980-\\u19a9\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1d00-\\u1dbf\\u1e00-\\u1e9b\") + \"\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\") + \"\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\") + \"\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\") + \"\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u2094\\u2102\\u2107\") + \"\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\") + \"\\u212f-\\u2131\\u2133-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u2c00-\\u2c2e\") + \"\\u2c30-\\u2c5e\\u2c80-\\u2ce4\\u2d00-\\u2d25\\u2d30-\\u2d65\\u2d6f\\u2d80-\\u2d96\") + \"\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\") + \"\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3006\\u3031-\\u3035\") + \"\\u303b-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\") + \"\\u3105-\\u312c\\u3131-\\u318e\\u31a0-\\u31b7\\u31f0-\\u31ff\\u3400-\\u4db5\") + \"\\u4e00-\\u9fbb\\ua000-\\ua48c\\ua800-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\") + \"\\ua80c-\\ua822\\uac00-\\ud7a3\\uf900-\\ufa2d\\ufa30-\\ufa6a\\ufa70-\\ufad9\") + \"\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\") + \"\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\") + \"\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\") + \"\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\") + \"\\uffda-\\uffdc\"), ja = ((((((((((((((((((((\"\\u0300-\\u036f\\u0483-\\u0486\\u0591-\\u05b9\\u05bb-\\u05bd\\u05bf\" + \"\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u0615\\u064b-\\u065e\\u0670\") + \"\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\") + \"\\u07a6-\\u07b0\\u0901-\\u0903\\u093c\\u093e-\\u094d\\u0951-\\u0954\\u0962-\\u0963\") + \"\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\") + \"\\u09e2-\\u09e3\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\") + \"\\u0a70-\\u0a71\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\") + \"\\u0ae2-\\u0ae3\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\") + \"\\u0b56-\\u0b57\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\") + \"\\u0c01-\\u0c03\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\") + \"\\u0c82-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\") + \"\\u0d02-\\u0d03\\u0d3e-\\u0d43\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d82-\\u0d83\") + \"\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2-\\u0df3\\u0e31\\u0e34-\\u0e3a\") + \"\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\") + \"\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f90-\\u0f97\") + \"\\u0f99-\\u0fbc\\u0fc6\\u102c-\\u1032\\u1036-\\u1039\\u1056-\\u1059\\u135f\") + \"\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b6-\\u17d3\\u17dd\") + \"\\u180b-\\u180d\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u19b0-\\u19c0\\u19c8-\\u19c9\") + \"\\u1a17-\\u1a1b\\u1dc0-\\u1dc3\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20eb\\u302a-\\u302f\") + \"\\u3099-\\u309a\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ufb1e\\ufe00-\\ufe0f\") + \"\\ufe20-\\ufe23\"), ka = ((((\"0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef\" + \"\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\") + \"\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\") + \"\\u1040-\\u1049\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\") + \"\\uff10-\\uff19\"), la = ((ia + ja) + ha), ma = (ka + \"_\"), na = (la + ma), oa = ((\"[\" + la) + \"]\"), pa = ((\"[\" + na) + \"]\"), qa = ((\"^|$|[^&\" + na) + \"]\"), ra = \"[#\\\\uFF03]\", sa = (((((((((\"(\" + qa) + \")(\") + ra) + \")(\") + pa) + \"*\") + oa) + pa) + \"*)\");\n        return new RegExp(sa, \"ig\");\n    };\n    function l(da) {\n        var ea = y(da), fa = 0, ga = 0;\n        return n(da).map(function(ha) {\n            while ((fa < ea.length)) {\n                var ia = ea[fa], ja = (ia.offset - ga);\n                if ((ja < ha.offset)) {\n                    ga += (ia.token.length - ia.name.length);\n                    fa++;\n                }\n                 else break;\n            ;\n            };\n            return {\n                marker: ha.marker,\n                tag: ha.hashtag,\n                rawOffset: (ha.offset + ga),\n                offset: ha.offset\n            };\n        });\n    };\n    function m(da) {\n        return o(da, t(da));\n    };\n    function n(da) {\n        var ea = aa(da);\n        return o(ea, p(da, ea));\n    };\n    function o(da, ea) {\n        return r(da).slice(0, i).filter(function(fa) {\n            var ga = v(fa.offset, fa.hashtag.length, ea);\n            return (!ga && (fa.hashtag.length <= h));\n        });\n    };\n    function p(da, ea) {\n        return u(s(da), t(ea));\n    };\n    var q = k();\n    function r(da) {\n        var ea = [];\n        da.replace(q, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                marker: ha,\n                hashtag: ia,\n                offset: (ja + ga.length)\n            });\n        });\n        return ea;\n    };\n    function s(da) {\n        return ba(da).map(function(ea) {\n            return [ea.offset,ea.name.length,];\n        });\n    };\n    function t(da) {\n        var ea = [], fa, ga = 0;\n        while ((fa = g.permissiveMatch(da))) {\n            var ha = da.indexOf(fa);\n            ea.push([(ga + ha),fa.length,]);\n            da = da.substring((ha + fa.length));\n            ga += (ha + fa.length);\n        };\n        return ea;\n    };\n    function u(da, ea) {\n        var fa = [], ga = 0, ha = 0, ia = 0;\n        while (((ga < da.length) && (ha < ea.length))) {\n            if ((da[ga][0] > ea[ha][0])) {\n                fa[ia++] = ea[ha++];\n            }\n             else fa[ia++] = da[ga++];\n        ;\n        };\n        return fa.concat(da.slice(ga), ea.slice(ha));\n    };\n    function v(da, ea, fa) {\n        if (!fa) {\n            return false\n        };\n        var ga = x(fa, da);\n        return (w(da, ea, fa, ga) || w(da, ea, fa, (ga + 1)));\n    };\n    function w(da, ea, fa, ga) {\n        if (!fa[ga]) {\n            return false\n        };\n        var ha = fa[ga][0], ia = fa[ga][1];\n        return !((((((da + ea) - 1) < ha)) || ((da > ((ha + ia) - 1)))));\n    };\n    function x(da, ea) {\n        var fa = 0, ga = (da.length - 1);\n        while ((fa <= ga)) {\n            var ha = Math.floor((((fa + ga)) / 2)), ia = da[ha][0];\n            if ((ia == ea)) {\n                return ha;\n            }\n             else if ((ia < ea)) {\n                fa = (ha + 1);\n            }\n             else ga = (ha - 1);\n            \n        ;\n        };\n        return ga;\n    };\n    function y(da) {\n        var ea = [];\n        da.replace(j, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                token: fa,\n                id: ga,\n                type: ha,\n                name: ia,\n                offset: ja\n            });\n        });\n        return ea;\n    };\n    function z(da) {\n        return (da ? da.replace(/\\\\([^\\\\])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\") : null);\n    };\n    function aa(da) {\n        return da.replace(j, function(ea, fa, ga, ha, ia) {\n            return z(ha);\n        });\n    };\n    function ba(da) {\n        var ea = 0, fa = 0;\n        return y(da).map(function(ga) {\n            var ha = da.indexOf(ga.token, fa);\n            fa = (ha + 1);\n            ha -= ea;\n            var ia = z(ga.name);\n            ea += (ga.token.length - ia.length);\n            if ((ha >= 0)) {\n                return {\n                    id: ga.id,\n                    name: ia,\n                    type: ga.type,\n                    offset: ha\n                }\n            };\n        });\n    };\n    var ca = {\n    };\n    ca.parse = l;\n    ca.parseWithoutMentions = m;\n    e.exports = ca;\n});\n__d(\"HashtagSearchResultUtils\", [\"FacebarResultStoreUtils\",\"HashtagParser\",\"HashtagSearchResultConfig\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarResultStoreUtils\"), h = b(\"HashtagParser\"), i = b(\"HashtagSearchResultConfig\"), j = b(\"URI\"), k = {\n        getHashtagFromQuery: function(l) {\n            var m = h.parse(l);\n            if (((m && (m.length === 1)) && (m[0].offset === 0))) {\n                return m[0].tag\n            };\n            return false;\n        },\n        makeTypeaheadResult: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j((\"/hashtag/\" + l)).toString(),\n                photo: i.image_url,\n                rankType: null,\n                replace_results: (i.boost_result ? true : false),\n                scaled_score: 1,\n                score: 0,\n                text: (\"#\" + l),\n                type: \"hashtag_exact\",\n                uid: (\"hashtag:\" + l)\n            };\n        },\n        makeFacebarEntry: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j((\"/hashtag/\" + l)).toString(),\n                photo: i.image_url,\n                replace_results: (i.boost_result ? true : false),\n                text: (\"#\" + l),\n                type: \"hashtag_exact\",\n                uid: (\"hashtag:\" + l)\n            };\n        },\n        makeFacebarResult: function(l) {\n            var m = g.processEntityResult(\"hashtag_exact\", (\"hashtag:\" + l), (\"#\" + l), i.hashtag_cost);\n            m.parse = {\n                display: [{\n                    type: \"ent:hashtag_exact\",\n                    uid: (\"hashtag:\" + l)\n                },],\n                remTokens: [],\n                suffix: \"\",\n                unmatch: []\n            };\n            return m;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualHelpSearchController\", [\"Event\",\"AsyncRequest\",\"DOM\",\"CSS\",\"Focus\",\"Input\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"CSS\"), k = b(\"Focus\"), l = b(\"Input\"), m = b(\"copyProperties\"), n = 400;\n    function o() {\n        this._token = null;\n        this._timerID = 0;\n        this._lastQuery = null;\n        this.typing_listener = null;\n        this.clear_listener = null;\n        this.async_request = null;\n    };\n    m(o.prototype, {\n        init: function(p, q, r, s, t) {\n            this.loader = p;\n            this.search_box = q;\n            this.topics_area = r;\n            this.results_area = s;\n            this.clear_button = t;\n            this.typing_listener = g.listen(this.search_box, \"keyup\", this.setTimer.bind(this));\n            this.clear_listener = g.listen(this.clear_button, \"click\", this.clearResults.bind(this));\n            k.set(this.search_box);\n        },\n        source: \"contextual_help\",\n        clearResults: function() {\n            this.show(this.topics_area);\n            this._lastQuery = \"\";\n            l.reset(this.search_box);\n            k.set(this.search_box);\n            if ((this.async_request !== null)) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n            j.addClass(this.clear_button, \"hidden_elem\");\n        },\n        update: function() {\n            var p = l.getValue(this.search_box);\n            if ((p === this._lastQuery)) {\n                return\n            };\n            this._lastQuery = p;\n            if ((p === \"\")) {\n                this.clearResults();\n                return;\n            }\n        ;\n            this.show(this.loader);\n            var q = {\n                query: p,\n                width: (this._width || n),\n                source: this.source\n            };\n            this.async_request = new h(\"/help/ajax/search/\").setData(q).setHandler(function(r) {\n                this._update(r);\n            }.bind(this));\n            this.async_request.send();\n        },\n        _update: function(p) {\n            this.async_request = null;\n            var q = p.getPayload().results;\n            i.setContent(this.results_area, q);\n            this.show(this.results_area);\n            if ((l.getValue(this.search_box) === \"\")) {\n                this.clearResults();\n            }\n             else j.removeClass(this.clear_button, \"hidden_elem\");\n        ;\n        },\n        setTimer: function() {\n            if ((this._timerID !== 0)) {\n                clearTimeout(this._timerID);\n            };\n            this._timerID = setTimeout(this.update.bind(this), 300);\n            if ((this.async_request != null)) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        },\n        show: function(p) {\n            var q = [this.loader,this.topics_area,this.results_area,];\n            for (var r = 0; (r < q.length); r++) {\n                j.addClass(q[r], \"hidden_elem\");;\n            };\n            j.removeClass(p, \"hidden_elem\");\n        }\n    });\n    e.exports = o;\n});\n__d(\"RequestsJewel\", [\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Event\",\"FriendBrowserCheckboxController\",\"LinkController\",\"Parent\",\"ScrollableArea\",\"Vector\",\"copyProperties\",\"ge\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"FriendBrowserCheckboxController\"), o = b(\"LinkController\"), p = b(\"Parent\"), q = b(\"ScrollableArea\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"shield\"), v = b(\"tx\");\n    function w() {\n    \n    };\n    s(w, {\n        instance: null,\n        getInstance: function() {\n            return this.instance;\n        }\n    });\n    s(w.prototype, {\n        init: function(x, y, z) {\n            w.instance = this;\n            this.countNew = 0;\n            this.jewel = x;\n            this.jewelFlyoutCase = x.getRoot();\n            this.jewelFlyout = t(\"fbRequestsFlyout\");\n            this.newCountSpan = t(\"newRequestCount\");\n            this.folder = y;\n            this.doNewMarkRead = z;\n            this.openTimestamp = 0;\n            this._requestList = {\n            };\n            this._egoData = {\n            };\n            this._requestCount = 0;\n            this.egoPredictedCount = 0;\n            this.pendingCount = 0;\n            this.shouldLogEgoClick = false;\n            this.shouldClearPredictionAssocOnClick = false;\n            var aa = t(\"requestsMarkReadButton\");\n            if (aa) {\n                m.listen(aa, \"click\", u(this._markRead, this));\n            };\n            this.jewel.subscribe(\"marked-seen\", u(this._markSeenCallback, this));\n            this.jewel.subscribe(\"closed\", u(this._clearNewItems, this));\n            this.jewel.subscribe(\"updated\", this._updateCount.bind(this));\n            this.jewel.subscribe(\"opened\", this._openHandler.bind(this));\n            o.registerHandler(this._handleLink.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_add\"), this._addRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_remove_old\"), this._removeOldRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"friend_requests_seen\"), this._markSeenFromMessage.bind(this));\n            g.subscribe(\"jewel/ego_predicted_count\", function(ba, ca) {\n                this.egoPredictedCount = ca.ego_predicted_count;\n                this.pendingCount = ca.pending_count;\n                this.egoUnseenTimestamp = ca.unseen_timestamp;\n                this.shouldLogEgoClick = ca.should_log_ego_click;\n                this.actionContext = ca.action_context;\n            }.bind(this));\n            m.listen(this.jewelFlyout, \"submit\", function(ba) {\n                var ca = p.byClass(ba.getTarget(), \"objectListItem\");\n                if (ca) {\n                    k.removeClass(ca, \"jewelItemNew\");\n                    k.addClass(ca, \"jewelItemResponded\");\n                    this.pageInCollapsedRequests();\n                }\n            ;\n            }.bind(this));\n            this.setupScroll();\n            return this;\n        },\n        setupScroll: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableAreaWrap\")[0];\n            if (x) {\n                this._scrollableWrap = x;\n                this._lastLinkPosition = 0;\n                this._scrollListener = m.listen(x, \"scroll\", this._handleScroll.bind(this), m.Priority._BUBBLE);\n            }\n        ;\n        },\n        fromDom: function() {\n            l.scry(this.jewelFlyout, \".jewelItemList li.objectListItem\").forEach(function(x) {\n                var y = x.getAttribute(\"id\");\n                if (y) {\n                    var z = t((y + \"_status\")), aa = this._parseIDToInts(y), ba = z.getAttribute(\"data-ego\");\n                    if (aa.requester) {\n                        this._requestList[aa.requester] = y;\n                        if (ba) {\n                            this._egoData[ba] = ba;\n                        };\n                    }\n                ;\n                    ++this._requestCount;\n                }\n            ;\n            }.bind(this));\n            this._conditionShowEmptyMessage();\n        },\n        _parseID: function(x) {\n            var y = x.match(/^(\\d+)_(\\d+)/);\n            return ((y) ? {\n                requester: y[1],\n                type: y[2]\n            } : undefined);\n        },\n        _parseIDToInts: function(x) {\n            var y = (x ? this._parseID(x) : undefined), z;\n            if ((y && y.requester)) {\n                z = parseInt(y.requester, 10);\n                if (isNaN(z)) {\n                    z = undefined;\n                };\n            }\n        ;\n            var aa;\n            if ((y && y.type)) {\n                aa = parseInt(y.type, 10);\n                if (isNaN(aa)) {\n                    aa = undefined;\n                };\n            }\n        ;\n            return {\n                requester: z,\n                type: aa\n            };\n        },\n        _handleLink: function(x, event) {\n            var y = p.byClass(x, \"jewelItemNew\");\n            if (((y && p.byClass(y, \"fbRequestList\")) && p.byClass(y, \"beeperEnabled\"))) {\n                var z = this._parseID(y.id);\n                (z && this._markSeenCallback(z.requester, z.type));\n                g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                });\n                k.removeClass(y, \"jewelItemNew\");\n            }\n        ;\n            return true;\n        },\n        _handleScroll: function() {\n            var x = l.scry(this._scrollableWrap, \".uiMorePager\");\n            if ((!x || ((t(\"fbRequestsJewelManualPager\") && (x.length < 2))))) {\n                return\n            };\n            var y = x.pop();\n            if (y) {\n                var z = r.getElementPosition(y, \"viewport\").y;\n                if ((z > 0)) {\n                    k.addClass(p.byClass(this._scrollableWrap, \"uiScrollableArea\"), \"contentAfter\");\n                };\n                var aa = l.find(y, \"a\");\n                if (!aa) {\n                    return\n                };\n                var ba = r.getElementPosition(aa, \"viewport\").y;\n                if ((ba == this._lastLinkPosition)) {\n                    return\n                };\n                var ca = (r.getElementPosition(this._scrollableWrap, \"viewport\").y + r.getElementDimensions(this._scrollableWrap).y);\n                if ((((ba - 300) < ca) && (ba > 0))) {\n                    this._lastLinkPosition = ba;\n                    var da = aa.getAttribute(\"ajaxify\");\n                    if (da) {\n                        new h(da).setRelativeTo(aa).setStatusElement(p.byClass(aa, \"stat_elem\")).send();\n                    }\n                     else n.getInstance(\"jewel\").showMore();\n                ;\n                }\n            ;\n            }\n        ;\n        },\n        _addRequest: function(x, y) {\n            if (!y) {\n                return\n            };\n            var z = y.obj.from, aa = y.obj.suggester, ba = this._parseIDToInts(this._requestList[z]).type, ca = ((ba === 19) && !aa);\n            if ((!ca && ((ba || this.jewel.isOpen())))) {\n                return\n            };\n            if (t(\"fbRequestsJewelLoading\")) {\n                new h().setURI(\"/ajax/requests/loader/\").send();\n            }\n             else {\n                var da = this._onMarkupCallback.bind(this, z, !!aa), ea = {\n                    from: z\n                };\n                if (aa) {\n                    ea.suggester = aa;\n                };\n                new h().setURI(\"/ajax/friends/jewel/request_markup\").setData(ea).setHandler(da).send();\n            }\n        ;\n        },\n        _onMarkupCallback: function(x, y, z) {\n            var aa = z.getPayload();\n            if (!aa) {\n                return\n            };\n            var ba = this._requestList[x], ca = this._parseIDToInts(ba).type;\n            if (((ca === 19) && !y)) {\n                var da = (ba && t(ba));\n                (da && l.replace(da, aa.markup));\n            }\n             else {\n                var ea = l.scry(this.jewelFlyout, \".fbRequestList .uiList\")[0];\n                if (!ea) {\n                    return\n                };\n                l.prependContent(ea, aa.markup);\n                var fa = {\n                    jewel: \"requests\",\n                    count: ++this.countNew\n                };\n                g.inform(\"jewel/count-updated\", fa);\n                ++this._requestCount;\n                this._conditionShowEmptyMessage();\n            }\n        ;\n            this._requestList[x] = aa.item_id;\n        },\n        _removeOldRequest: function(x, y) {\n            if (((!y || this.jewel.isOpen()) || (t(\"fbRequestsJewelLoading\") !== null))) {\n                return\n            };\n            var z = this._requestList[y.obj.from], aa = (z && t(z));\n            if (aa) {\n                (k.hasClass(aa, \"jewelItemNew\") && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                }));\n                if (!k.hasClass(aa, \"jewelItemResponded\")) {\n                    l.remove(aa);\n                    delete this._requestList[y.obj.from];\n                    --this._requestCount;\n                    this._conditionShowEmptyMessage();\n                }\n            ;\n            }\n        ;\n        },\n        pageInCollapsedRequests: function() {\n            var x = t(\"fbRequestsJewelManualPager\");\n            if (x) {\n                var y = l.scry(x, \".uiMorePagerPrimary\")[0];\n                if ((y.style && (y.style.display != \"none\"))) {\n                    setTimeout(function() {\n                        y.click();\n                    }, 100);\n                };\n            }\n        ;\n        },\n        _markRead: function() {\n            this.jewel.markSeen();\n            this._clearNewItems();\n        },\n        _markSeenCallback: function(x, y) {\n            var z = l.scry(this.jewelFlyout, \"li\");\n            new i(\"/ajax/gigaboxx/endpoint/UpdateLastSeenTime.php\", {\n                folder: this.folder,\n                first_item: z[0].id\n            }).send();\n            new h().setURI(\"/ajax/friends/jewel/predicted_count_logging\").setData({\n                ego_predicted_count: this.egoPredictedCount,\n                pending_count: this.pendingCount,\n                unseen_timestamp: this.egoUnseenTimestamp,\n                action_context: this.actionContext,\n                should_log_ego_click: this.shouldLogEgoClick\n            }).send();\n            var aa = (((typeof x != \"undefined\") && (typeof y != \"undefined\")) ? {\n                requester: x,\n                type: y\n            } : {\n            });\n            (this.doNewMarkRead && new i(\"/ajax/requests/mark_read/\", aa).send());\n        },\n        _markSeenFromMessage: function(x, y) {\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"requests\",\n                count: 0\n            });\n        },\n        _removeRequest: function(x, y) {\n            var z = y.obj.item_id;\n            if (z) {\n                var aa = t(z), ba = (aa && k.hasClass(aa, \"jewelItemNew\"));\n                (aa ? l.remove(aa) : (ba && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })));\n            }\n        ;\n        },\n        _clearNewItems: function(x, y) {\n            l.scry(this.jewel.root, \"li.jewelItemNew\").forEach(function(z) {\n                k.removeClass(z, \"jewelItemNew\");\n            });\n        },\n        _updateCount: function(x, y) {\n            this.countNew = y.count;\n            k.conditionClass(this.jewelFlyout, \"beeperUnread\", (this.countNew > 0));\n            k.conditionClass(this.jewelFlyoutCase, \"showRequests\", (this.countNew > 0));\n            if (this.newCountSpan) {\n                var z = ((this.countNew == 1) ? v._(\"{num} NEW REQUEST\", {\n                    num: this.countNew\n                }) : v._(\"{num} NEW REQUESTS\", {\n                    num: this.countNew\n                }));\n                l.setContent(this.newCountSpan, z);\n            }\n        ;\n        },\n        _conditionShowEmptyMessage: function() {\n            l.scry(this.jewelFlyout, \"li.empty\").forEach(function(x) {\n                k.conditionShow(x, (this._requestCount <= 0));\n            }.bind(this));\n        },\n        _openHandler: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableArea\")[0];\n            if (t(\"fbRequestsJewelLoading\")) {\n                var y = Date.now();\n                if (((this.openTimestamp + 5000) < y)) {\n                    this.openTimestamp = y;\n                    new h().setURI(\"/ajax/requests/loader/\").setData({\n                        log_impressions: true\n                    }).send();\n                }\n            ;\n            }\n             else {\n                var z = Object.keys(this._requestList);\n                if ((z.length > 0)) {\n                    new h().setURI(\"/friends/requests/log_impressions\").setData({\n                        ids: z.join(\",\"),\n                        ref: \"jewel\"\n                    }).send();\n                    var aa = Object.keys(this._egoData);\n                    if ((aa.length > 0)) {\n                        new h().setURI(\"/growth/jewel/impression_logging.php\").setData({\n                            egodata: aa\n                        }).send();\n                    };\n                }\n            ;\n            }\n        ;\n            (x && q.poke(x));\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:RequestsJewel\", [\"RequestsJewel\",], function(a, b, c, d) {\n    a.RequestsJewel = b(\"RequestsJewel\");\n}, 3);\n__d(\"JewelX\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"HTML\",\"Keys\",\"TabIsolation\",\"Toggler\",\"copyProperties\",\"emptyFunction\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"TabIsolation\"), o = b(\"Toggler\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"reportData\"), s = function(t, u) {\n        ((t && u) && this.init(t, u));\n    };\n    p(s, {\n        _instancesByName: {\n        },\n        _resizeListener: null\n    });\n    p(s.prototype, i, {\n        init: function(t, u) {\n            this.name = u.name;\n            this.root = t;\n            this.countNew = 0;\n            this.initialCount = 0;\n            this.escHandler = null;\n            s._instancesByName[this.name] = this;\n            var v = k.find(t, \".jewelFlyout\"), w = new n(v);\n            o.createInstance(v).setSticky(false);\n            o.listen(\"show\", this.root, function(x) {\n                this._logFirstClick();\n                (this.hasNew() && this.markSeen());\n                this.reset();\n                this.inform(\"opened\");\n                h.inform(\"layer_shown\", {\n                    type: \"Jewel\"\n                });\n                w.enable();\n                this.setupEvents();\n            }.bind(this));\n            o.listen(\"hide\", this.root, function(x, y) {\n                (this.hasNew() && this.markSeen());\n                this.reset();\n                this.inform(\"closed\");\n                h.inform(\"layer_hidden\", {\n                    type: \"Jewel\"\n                });\n                w.disable();\n                this.removeEvents();\n            }.bind(this));\n            h.subscribe(\"jewel/count-updated\", function(x, y) {\n                ((y.jewel == this.name) && this.update(y));\n            }.bind(this));\n            h.subscribe(\"jewel/count-initial\", function(x, y) {\n                ((y.jewel == this.name) && this.setInitial(y));\n            }.bind(this));\n            h.subscribe(\"jewel/reset\", function(x, y) {\n                ((y.jewel == this.name) && this.reset());\n            }.bind(this));\n            s._resizeListener = (s._resizeListener || (function() {\n                var x = null;\n                return g.listen(window, \"resize\", function() {\n                    clearTimeout(x);\n                    x = h.inform.bind(h, \"jewel/resize\").defer(100, false);\n                });\n            })());\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        hasNew: function() {\n            return j.hasClass(this.root, \"hasNew\");\n        },\n        isOpen: function() {\n            return j.hasClass(this.root, \"openToggler\");\n        },\n        reset: function() {\n            j.removeClass(this.root, \"hasNew\");\n        },\n        setContent: function(t) {\n            var u = k.find(this.root, \"ul.jewelItemList\");\n            k.setContent(u, l(t));\n        },\n        update: function(t) {\n            this.countNew = t.count;\n            var u = k.find(this.root, \"span.jewelCount span\");\n            k.setContent(u, this.countNew);\n            var v = (isNaN(this.countNew) || (this.countNew > 0));\n            j.conditionClass(this.root, \"hasNew\", v);\n            if (v) {\n                var w = ((\"\" + this.countNew)).length;\n                j.conditionClass(this.root, \"hasCountSmall\", (w === 1));\n                j.conditionClass(this.root, \"hasCountMedium\", (w === 2));\n                j.conditionClass(this.root, \"hasCountLarge\", (w > 2));\n            }\n        ;\n            this.inform(\"updated\", t);\n        },\n        setInitial: function(t) {\n            this.initialCount = t;\n        },\n        setupEvents: function() {\n            this.escHandler = g.listen(document.documentElement, \"keydown\", function(t) {\n                if (((t.keyCode === m.ESC) && this.isOpen())) {\n                    o.hide(this.root);\n                };\n            }.bind(this));\n        },\n        removeEvents: function() {\n            if (this.escHandler) {\n                this.escHandler.remove();\n            };\n        },\n        markSeen: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: this.name,\n                count: 0\n            }, h.BEHAVIOR_STATE);\n            this.inform(\"marked-seen\");\n        },\n        _logFirstClick: function() {\n            this._logFirstClick = q;\n            r(\"jewel_click\", {\n                gt: {\n                    count: this.countNew,\n                    initial: this.initialCount,\n                    jewel: this.name\n                }\n            });\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryJewelCountControl\", [\"Arbiter\",\"DOM\",\"MercuryThreadlistConstants\",\"copyProperties\",\"shield\",\"tx\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"MercuryThreadlistConstants\"), j = b(\"copyProperties\"), k = b(\"shield\"), l = b(\"tx\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreadInformer\").get(), o = b(\"MercuryUnseenState\").get(), p, q, r, s = function(u) {\n        if ((u || r.isOpen())) {\n            o.markAsSeen();\n        };\n    }, t = function(u, v) {\n        p = u;\n        q = h.find(p, \"#mercurymessagesCountValue\");\n        r = v;\n        this.render();\n        m.subscribe(\"model-update-completed\", function(w, x) {\n            s(false);\n        });\n        n.subscribe(\"unseen-updated\", this.render.bind(this));\n        r.subscribe(\"marked-seen\", k(s, this, true));\n    };\n    j(t.prototype, {\n        render: function() {\n            var u = \"\";\n            if (o.exceedsMaxCount()) {\n                u = l._(\"{count}+\", {\n                    count: i.MAX_UNSEEN_COUNT\n                });\n            }\n             else u = o.getUnseenCount().toString();\n        ;\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"mercurymessages\",\n                count: u\n            }, g.BEHAVIOR_STATE);\n        }\n    });\n    e.exports = t;\n});\n__d(\"MercuryJewelThreadlistControl\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryChatUtils\",\"MercuryConfig\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"JSXDOM\",\"MercuryAPIArgsSource\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryOrderedThreadlist\",\"Parent\",\"MercuryJewelTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"Tooltip\",\"MercuryUnreadState\",\"copyProperties\",\"csx\",\"cx\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryChatUtils\"), j = b(\"MercuryConfig\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Event\"), n = b(\"JSLogger\"), o = b(\"JSXDOM\"), p = b(\"MercuryAPIArgsSource\"), q = b(\"MercuryThreadlistConstants\"), r = b(\"MessagingTag\"), s = b(\"MercuryOrderedThreadlist\").get(), t = b(\"Parent\"), u = b(\"MercuryJewelTemplates\"), v = b(\"MercuryThreadInformer\").get(), w = b(\"MercuryThreadMetadataRenderer\").get(), x = b(\"MercuryThreads\").get(), y = b(\"Tooltip\"), z = b(\"MercuryUnreadState\").get(), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"throttle\"), ea = b(\"tx\"), fa = n.create(\"mercury_jewel\");\n    function ga(na, oa) {\n        this._contentArea = (l.scry(na, \".scrollable\")[0] || na);\n        this._contentElement = l.find(this._contentArea, \".jewelContent\");\n        this._loadingElement = l.find(this._contentArea, \".jewelLoading\");\n        this._loadMoreButton = l.find(this._contentArea, \".-cx-PRIVATE-fbMercuryJewel__morebutton\");\n        this._loadMoreLink = l.find(this._contentArea, \"a.-cx-PRIVATE-fbMercuryJewel__morelink\");\n        this._currentFolder = r.INBOX;\n        this._jewelFolderLinks = [];\n        this._jewelFolderLinks[r.INBOX] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxfolder\");\n        this._jewelFolderLinks[r.OTHER] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherfolder\");\n        this._jewelFolderCounts = [];\n        this._jewelFolderCounts[r.INBOX] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxunread\");\n        this._jewelFolderCounts[r.OTHER] = l.find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherunread\");\n        la.bind(this)();\n        m.listen(this._jewelFolderLinks[r.INBOX], \"click\", ka.bind(this, r.INBOX));\n        m.listen(this._jewelFolderLinks[r.OTHER], \"click\", ka.bind(this, r.OTHER));\n        this._curCount = [];\n        this._curCount[r.INBOX] = (q.JEWEL_THREAD_COUNT + 1);\n        this._curCount[r.OTHER] = (q.JEWEL_THREAD_COUNT + 1);\n        this._isFolderLoaded = [];\n        this._isFolderLoaded[r.INBOX] = false;\n        this._isFolderLoaded[r.OTHER] = false;\n        this._folderIsLoading = [];\n        this._folderIsLoading[r.INBOX] = false;\n        this._folderIsLoading[r.OTHER] = false;\n        v.subscribe(\"threadlist-updated\", this.render.bind(this));\n        v.subscribe(\"unread-updated\", la.bind(this));\n        this.render();\n        fa.bump((\"opened_threadlist_\" + this._currentFolder));\n        m.listen(this._contentArea, \"scroll\", da(ha, 50, this));\n        m.listen(this._loadMoreLink, \"click\", this.renderMoreThreads.bind(this));\n    };\n    aa(ga, {\n        EVENT_THREADS_LOADED: \"threads-loaded\",\n        EVENT_THREADS_RENDERED: \"threads-rendered\"\n    });\n    aa(ga.prototype, h);\n    aa(ga.prototype, {\n        render: function() {\n            l.empty(this._contentElement);\n            k.show(this._loadingElement);\n            k.hide(this._loadMoreButton);\n            var na = l.create(\"div\");\n            l.appendContent(this._contentElement, na);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, this._curCount[this._currentFolder], this._currentFolder, this.renderThreads.bind(this, na), true);\n        },\n        renderThreads: function(na, oa) {\n            this.inform(ga.EVENT_THREADS_LOADED);\n            if (oa.length) {\n                oa.forEach(function(pa) {\n                    var qa = u[\":fb:mercury:jewel:threadlist-row\"].build();\n                    x.getThreadMeta(pa, function(ra) {\n                        w.renderCoreThreadlist(ra, qa, this.renderSingleThread.bind(this), {\n                            show_unread_count: true\n                        });\n                    }.bind(this));\n                    l.appendContent(na, qa.getRoot());\n                }.bind(this));\n            }\n             else l.setContent(this._contentElement, this.renderEmptyThreadlist());\n        ;\n            k.hide(this._loadingElement);\n            k.conditionShow(this._loadMoreButton, !this._isFolderLoaded[this._currentFolder]);\n            this.inform(ga.EVENT_THREADS_RENDERED);\n        },\n        renderSingleThread: function(na, oa) {\n            var pa = (oa.unread_count > 0);\n            if (pa) {\n                k.addClass(na.getRoot(), \"jewelItemNew\");\n            };\n            if (j.MessagesJewelToggleReadGK) {\n                var qa = o.div({\n                    className: \"x_div\"\n                }), ra = o.div({\n                    className: \"-cx-PRIVATE-fbReadToggle__active\"\n                }), sa = \"Mark as Unread\";\n                if (pa) {\n                    sa = \"Mark as Read\";\n                };\n                y.set(ra, sa, \"above\", \"right\");\n                m.listen(ra, \"click\", function(event) {\n                    x.changeThreadReadStatus(oa.thread_id, (oa.unread_count > 0));\n                    return false;\n                });\n                qa.appendChild(ra);\n                na.getNode(\"link\").appendChild(qa);\n            }\n        ;\n            if ((j.MessagesJewelOpenInChat && i.canOpenChatTab(oa))) {\n                m.listen(na.getRoot(), \"click\", function(event) {\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: oa.thread_id\n                    });\n                });\n            }\n             else w.renderTitanLink(oa.thread_id, na.getNode(\"link\"), null, this._currentFolder);\n        ;\n            m.listen(na.getRoot(), \"mouseover\", function(event) {\n                var ta = na.getRoot();\n                if (!t.byClass(ta, \"notifNegativeBase\")) {\n                    k.addClass(ta, \"selected\");\n                };\n            });\n            m.listen(na.getRoot(), \"mouseout\", function(event) {\n                k.removeClass(na.getRoot(), \"selected\");\n            });\n        },\n        renderMoreThreads: function() {\n            k.addClass(this._loadMoreButton, \"async_saving\");\n            this._folderIsLoading[this._currentFolder] = true;\n            var na = (this._curCount[this._currentFolder] + q.JEWEL_MORE_COUNT);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, (na + 1), this._currentFolder, ja.bind(this, na, this._currentFolder), true, p.JEWEL);\n        },\n        renderEmptyThreadlist: function() {\n            return l.create(\"li\", {\n                className: \"empty\"\n            }, \"No messages\");\n        }\n    });\n    function ha() {\n        if (((!this._isFolderLoaded[this._currentFolder] && !this._folderIsLoading[this._currentFolder]) && ia.bind(this)())) {\n            this.renderMoreThreads();\n        };\n    };\n    function ia() {\n        return ((this._contentArea.scrollTop + this._contentArea.clientHeight) >= (this._contentArea.scrollHeight - 1));\n    };\n    function ja(na, oa, pa) {\n        this._curCount[oa] = na;\n        if ((!this._isFolderLoaded[oa] && (pa.length < (this._curCount[oa] + 1)))) {\n            this._isFolderLoaded[oa] = true;\n        };\n        this._folderIsLoading[oa] = false;\n        k.removeClass(this._loadMoreButton, \"async_saving\");\n        this.render();\n    };\n    function ka(na) {\n        if ((this._currentFolder != na)) {\n            fa.bump((\"opened_threadlist_\" + na));\n            k.addClass(this._jewelFolderLinks[na], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            k.removeClass(this._jewelFolderLinks[this._currentFolder], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            this._currentFolder = na;\n            this.render();\n        }\n    ;\n    };\n    function la() {\n        ma.bind(this)(r.INBOX);\n        ma.bind(this)(r.OTHER);\n    };\n    function ma(na) {\n        var oa;\n        if (z.exceedsMaxCount(na)) {\n            oa = q.MAX_UNREAD_COUNT;\n        }\n         else oa = z.getUnreadCount(na);\n    ;\n        var pa = this._jewelFolderCounts[na];\n        if ((oa > 0)) {\n            if ((oa == q.MAX_UNREAD_COUNT)) {\n                oa += \"+\";\n            };\n            l.setContent(pa, ea._(\"({unread_count})\", {\n                unread_count: oa\n            }));\n        }\n         else l.setContent(pa, \"\");\n    ;\n    };\n    e.exports = ga;\n});\n__d(\"MercuryJewel\", [\"MercuryChannelHandler\",\"MercuryJewelCountControl\",\"DOM\",\"MercuryJewelThreadlistControl\",\"MercuryServerRequests\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"MercuryChannelHandler\");\n    var g = b(\"MercuryJewelCountControl\"), h = b(\"DOM\"), i = b(\"MercuryJewelThreadlistControl\"), j = b(\"MercuryServerRequests\").get(), k = b(\"userAction\"), l = false;\n    function m(q, r, s, t) {\n        j.handleUpdate(t);\n        var u = new g(r, s), v = h.find(q, \"#MercuryJewelThreadList\");\n        if ((s.getRoot() && s.isOpen())) {\n            n.call(this, v, q);\n        }\n         else s.subscribe(\"opened\", n.bind(this, v, q));\n    ;\n    };\n    e.exports = m;\n    function n(q, r) {\n        this._ua = k(\"messages\").uai(\"click\", \"jewel\");\n        this._listenForLoad = this._listenForRender = true;\n        if (!l) {\n            var s = new i(q, r);\n            s.subscribe(i.EVENT_THREADS_LOADED, o.bind(this));\n            s.subscribe(i.EVENT_THREADS_RENDERED, p.bind(this));\n            l = true;\n        }\n    ;\n    };\n    function o() {\n        if (this._listenForLoad) {\n            this._ua.add_event(\"loaded\");\n            this._listenForLoad = false;\n        }\n    ;\n    };\n    function p() {\n        if (this._listenForRender) {\n            this._ua.add_event(\"rendered\");\n            this._listenForRender = false;\n        }\n    ;\n    };\n});\n__d(\"MessagingEvents\", [\"Arbiter\",\"ChannelConstants\",\"arrayContains\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"isEmpty\"), l = {\n    }, m = new g();\n    function n(o) {\n        if (!k(l)) {\n            return\n        };\n        for (var p in o) {\n            m.inform((\"count/\" + p), o[p]);;\n        };\n    };\n    m.subscribe(\"mark-as-read\", function(o, p) {\n        (((p.tids || p.chat_ids) || [])).forEach(function(q) {\n            q = (\"\" + q);\n            if (!((q in l))) {\n                l[q] = true;\n                var r = function() {\n                    m.unsubscribe(s);\n                    clearTimeout(t);\n                    delete l[q];\n                }, s = m.subscribe(\"read\", function(u, v) {\n                    if ((i(((v.tids || [])), q) || i(((v.chat_ids || [])), q))) {\n                        r();\n                    };\n                }), t = r.defer(60000);\n            }\n        ;\n        });\n    });\n    g.subscribe(h.getArbiterType(\"messaging\"), function(o, p) {\n        var q = j({\n        }, p.obj), event = (q.event || \"\");\n        delete q.type;\n        delete q.event;\n        m.inform(event, q);\n        if ((\"unread_counts\" in q)) {\n            var r = q.unread_counts;\n            n({\n                unread: r.inbox,\n                other_unseen: r.other\n            });\n        }\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"inbox\"), function(o, p) {\n        var q = j(p.obj);\n        delete q.type;\n        n(q);\n    });\n    a.MessagingEvents = e.exports = m;\n}, 3);\n__d(\"TitanLeftNav\", [\"CounterDisplay\",\"MessagingEvents\",], function(a, b, c, d, e, f) {\n    var g = b(\"CounterDisplay\"), h = b(\"MessagingEvents\"), i = {\n        initialize: function() {\n            h.subscribe(\"count/other_unseen\", function(j, k) {\n                g.setCount(\"other_unseen\", k);\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"AccessibleMenu\", [\"Event\",\"CSS\",\"DOM\",\"Keys\",\"TabbableElements\",\"Toggler\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"Toggler\"), m, n, o;\n    function p() {\n        var x = i.scry(m, \"a[rel=\\\"toggle\\\"]\")[0];\n        (x && x.focus());\n        l.getInstance(m).hide();\n    };\n    function q(x) {\n        if (!x) {\n            return false\n        };\n        h.removeClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"false\");\n    };\n    function r(x) {\n        if (!x) {\n            return false\n        };\n        h.addClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"true\");\n        var y = k.find(x);\n        if (y[0]) {\n            y[0].focus();\n        };\n    };\n    function s(x) {\n        var y = i.scry(m, \".selected\")[0], z = (n.indexOf(y) + x), aa = n[z];\n        if (!aa) {\n            return false\n        };\n        q(y);\n        r(aa);\n    };\n    function t(x) {\n        if ((!l.isShown() || (l.getActive() !== m))) {\n            return true\n        };\n        var y = g.getKeyCode(x);\n        switch (y) {\n          case j.TAB:\n            s((x.shiftKey ? -1 : 1));\n            g.prevent(x);\n            break;\n          case j.ESC:\n            p();\n            g.prevent(x);\n            break;\n          case j.UP:\n        \n          case j.DOWN:\n            s(((y === j.UP) ? -1 : 1));\n            g.prevent(x);\n            break;\n        };\n    };\n    function u(x, y) {\n        m = y.getActive();\n        n = i.scry(m, \"[role=\\\"menuitem\\\"]\");\n        if (!o) {\n            o = g.listen(document.documentElement, \"keydown\", t);\n        };\n    };\n    function v() {\n        if ((l.getActive() == m)) {\n            q(i.scry(m, \".selected\")[0]);\n        };\n    };\n    var w = {\n        init: function(x) {\n            l.listen(\"show\", x, u);\n            l.listen(\"hide\", x, v);\n        }\n    };\n    e.exports = w;\n});\n__d(\"UserNoOp\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\"), i = function() {\n    \n    };\n    g(i.prototype, {\n        add_event: h.thatReturnsThis,\n        add_data: h.thatReturnsThis,\n        uai: h.thatReturnsThis,\n        uai_fallback: h.thatReturnsThis\n    });\n    e.exports = i;\n});\n__d(\"NegativeNotif\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Parent\",\"Tooltip\",\"NotifXList\",\"$\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"Event\"), m = b(\"Parent\"), n = b(\"Tooltip\"), o = b(\"NotifXList\"), p = b(\"$\"), q = b(\"clickRefAction\"), r = b(\"copyProperties\"), s = b(\"userAction\");\n    function t(u, v) {\n        r(this, v);\n        this.owner = u;\n        this.xLink = k.find(this.obj, \".notif_x\");\n        this.confirmingMsg = k.find(this.obj, \".confirmingMsg\");\n        this.mainLink = k.find(this.obj, \".notifMainLink\");\n        this.userXClicked = false;\n        this.userUnsubscribed = false;\n        l.listen(this.xLink, \"click\", this.xClick.bind(this));\n        if ((i.hasClass(this.obj, \"first_receipt\") && i.hasClass(p(\"jewelContainer\"), \"notifGentleAppReceipt\"))) {\n            this.gentleFirstReceiptHoverEventHandler = l.listen(this.obj, \"mouseover\", this.gentleFirstReceiptNotifHover.bind(this));\n        };\n    };\n    r(t.prototype, {\n        FADE_AWAY_DURATION: 2500,\n        X_OUT_DURATION: 100,\n        X_OUT_DURATION_SHORT: 2,\n        GENTLE_FRUI_MIN_HOVER_DURATION: 500,\n        GENTLE_FRUI_FADE_DURATION_FAST: 200,\n        GENTLE_FRUI_FADE_DURATION_SLOW: 2500,\n        GENTLE_FRUI_DELAY_FADE_TIME: 60000,\n        xClick: function(event) {\n            this._activateX();\n            var u = this.xLink.getAttribute(\"data-gt\"), v = (u ? {\n                gt: JSON.parse(u)\n            } : {\n            });\n            s(\"xbutton\", this.xLink, event).uai(\"click\");\n            q(\"click\", this.xLink, event, null, v);\n            return false;\n        },\n        gentleFirstReceiptNotifHover: function(event) {\n            event.stop();\n            var u = k.find(this.obj, \".first_receipt_no_button\"), v = j.get(u, \"notif_fr_prompt\");\n            n.set(u, v, \"above\", \"center\");\n            n.show(u);\n            this._gentleFirstReceiptTooltipFadeIn();\n            if (!this.gentleFirstReceiptUnhoverEventHandler) {\n                this.hoverTime = new Date();\n                this.gentleFirstReceiptUnhoverEventHandler = l.listen(document.documentElement, \"mouseover\", this.gentleFirstReceiptNotifUnhover.bind(this));\n            }\n        ;\n            if (!this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler = l.listen(u, \"click\", this.gentleFirstReceiptNoClick.bind(this));\n            };\n        },\n        gentleFirstReceiptNotifUnhover: function(event) {\n            if ((m.byClass(event.getTarget(), \"uiContextualLayer\") || m.byClass(event.getTarget(), \"uiScrollableAreaTrack\"))) {\n                return false\n            };\n            var u = new Date();\n            if ((this.hoverTime && ((u - this.hoverTime) < this.GENTLE_FRUI_MIN_HOVER_DURATION))) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n                this.gentleFirstReceiptUnhoverEventHandler = null;\n                this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n                return;\n            }\n        ;\n            this._removeGentleFirstReceiptListeners();\n            this._gentleFirstReceiptTooltipFadeAway();\n            this._gentleFirstReceiptXButtonFadeAway();\n            var v = this;\n            setTimeout(function() {\n                v._gentleFirstReceiptUIFadeAway();\n            }, this.GENTLE_FRUI_DELAY_FADE_TIME);\n            this._sendFirstReceiptYesToServer();\n        },\n        gentleFirstReceiptNoClick: function(event) {\n            this._removeGentleFirstReceiptListeners();\n        },\n        restore: function() {\n            if (o.newNotifExist(this.id)) {\n                o.resumeInsert(this.id);\n            }\n             else o.removeNotif(this.id);\n        ;\n            this._confirmingMsgFadeAway(this.confirmingMsg);\n            this._notifMainLinkShowUp(this.mainLink);\n            this._buttonShowUp(this.xLink);\n            this._adjustContainer(this.obj);\n        },\n        reset: function() {\n            if ((this.userXClicked && !this.userUnsubscribed)) {\n                this.userXClicked = false;\n                this.restore();\n            }\n        ;\n        },\n        onTurnedOff: function() {\n            this.userUnsubscribed = true;\n            i.hide(this.confirmingMsg);\n            this._notifMainLinkShowUp(k.find(this.obj, \".confirmedMsg\"));\n            this._adjustContainer(this.obj);\n        },\n        onUndid: function() {\n            this.userXClicked = false;\n            this.userUnsubscribed = false;\n            this.restore();\n            i.show(this.confirmingMsg);\n            this._notifMainLinkFadeAway(k.find(this.obj, \".confirmedMsg\"));\n            k.remove(k.find(this.obj, \".confirmedMsg\"));\n        },\n        onMarkedSpam: function() {\n            k.remove(k.find(this.obj, \".confirmedMsg\"));\n            this._fadeAway(k.find(this.obj, \".spamMsg\"));\n        },\n        onFirstReceiptYes: function() {\n            this._hideFirstReceiptDiv();\n            this._fadeAway(k.find(this.obj, \".firstConfirmedMsg\"));\n        },\n        onFirstReceiptNo: function() {\n            this._hideFirstReceiptDiv();\n            i.hide(this.confirmingMsg);\n            this._activateX();\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"turn_off\",\n                notification_id: this.id\n            }).send();\n        },\n        _sendFirstReceiptYesToServer: function() {\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"first_receipt_yes\",\n                notification_id: this.id\n            }).send();\n        },\n        _gentleFirstReceiptTooltipFadeIn: function() {\n            if (this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return\n            };\n            var u = k.find(document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\");\n            new g(u).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = true;\n        },\n        _gentleFirstReceiptTooltipFadeAway: function() {\n            if (!this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return\n            };\n            var u = k.find(document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\"), v = m.byClass(u, \"uiLayer\"), w = v.cloneNode(true);\n            k.insertAfter(v, w);\n            new g(w).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).ondone(function() {\n                k.remove(w);\n            }).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n        },\n        _gentleFirstReceiptXButtonFadeAway: function() {\n            var u = k.find(this.obj, \".first_receipt_no_button\");\n            new g(u).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).hide().go();\n            i.addClass(this.obj, \"show_original_x\");\n        },\n        _gentleFirstReceiptUIFadeAway: function() {\n            var u = this.obj;\n            this.new_label = k.find(this.obj, \".notif_new_label\");\n            new g(this.new_label).to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).ondone(function() {\n                i.removeClass(u, \"first_receipt\");\n            }).go();\n            if (!i.hasClass(this.obj, \"jewelItemNew\")) {\n                new g(this.obj).from(\"backgroundColor\", \"#ECEFF5\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).go();\n            };\n        },\n        _removeGentleFirstReceiptListeners: function() {\n            if (this.gentleFirstReceiptHoverEventHandler) {\n                this.gentleFirstReceiptHoverEventHandler.remove();\n            };\n            if (this.gentleFirstReceiptUnhoverEventHandler) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n            };\n            if (this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler.remove();\n            };\n        },\n        _activateX: function() {\n            i.addClass(this.obj, \"forPushSafety\");\n            this.userXClicked = true;\n            o.userXClick(this.id);\n            this._notifMainLinkFadeAway(this.mainLink);\n            this._buttonFadeAway(this.xLink);\n            if (i.shown(this.confirmingMsg)) {\n                this._confirmingMsgShowUp(this.confirmingMsg);\n            };\n            this._adjustContainer(this.obj);\n        },\n        _hideFirstReceiptDiv: function() {\n            i.removeClass(this.obj, \"first_receipt\");\n            i.hide(k.find(this.obj, \".first_receipt_div\"));\n        },\n        _fadeAway: function(u) {\n            new g(u).from(\"backgroundColor\", \"#FFF9D7\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.FADE_AWAY_DURATION).checkpoint().to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION).go();\n        },\n        _adjustContainer: function(u) {\n            new g(u).by(\"height\", \"0px\").duration(this.X_OUT_DURATION).checkpoint().by(\"height\", \"0px\").duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"height\", \"auto\").duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"4px\").to(\"paddingBottom\", \"4px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _confirmingMsgShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"10px\").to(\"paddingBottom\", \"10px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _confirmingMsgFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _buttonShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _buttonFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        }\n    });\n    e.exports = t;\n});\n__d(\"NotificationCounter\", [\"Arbiter\",\"DocumentTitle\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = {\n        messages: 0,\n        notifications: 0,\n        requests: 0\n    }, k = {\n        init: function(l) {\n            g.subscribe(\"update_title\", this._handleUpdate.bind(this));\n            g.subscribe(\"jewel/count-updated\", this._handleCountUpdate.bind(this));\n        },\n        getCount: function() {\n            var l = 0;\n            for (var m in j) {\n                var n = Number(j[m]);\n                if (((typeof j[m] == \"string\") && isNaN(n))) {\n                    return j[m]\n                };\n                if ((isNaN(n) || (n < 0))) {\n                    i.create(\"jewels\").error(\"bad_count\", {\n                        jewel: m,\n                        count: j[m]\n                    });\n                    continue;\n                }\n            ;\n                l += n;\n            };\n            return l;\n        },\n        updateTitle: function() {\n            var l = this.getCount(), m = h.get();\n            m = (l ? (((\"(\" + l) + \") \") + m) : m);\n            h.set(m, true);\n        },\n        _handleCountUpdate: function(l, m) {\n            j[m.jewel] = m.count;\n            this.updateTitle();\n        },\n        _handleUpdate: function(l, m) {\n            this.updateTitle();\n        }\n    };\n    e.exports = k;\n});\n__d(\"NotificationList\", [\"Animation\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DoublyLinkedListMap\",\"HTML\",\"NotificationURI\",\"Tooltip\",\"Event\",\"$\",\"copyProperties\",\"cx\",\"csx\",\"ge\",\"isEmpty\",\"tx\",\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DoublyLinkedListMap\"), l = b(\"HTML\"), m = b(\"NotificationURI\"), n = b(\"Tooltip\"), o = b(\"Event\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"ge\"), u = b(\"isEmpty\"), v = b(\"tx\"), w = b(\"hasArrayNature\"), x = \"0\", y = \"1\", z = \"2\";\n    function aa(da) {\n        return ((da == y) || (da == z));\n    };\n    function ba(da) {\n        return (da == y);\n    };\n    function ca(da, ea) {\n        this._list = new k();\n        this._filter_func = null;\n        this.unseenCount = 0;\n        this.contentRoot = da;\n        this.noItemsElement = null;\n        this.ITEM_TAG = \"li\";\n        this.ITEM_CLASS = \"notification\";\n        this.NO_ITEMS_ID = \"jewelNoNotifications\";\n        this.NO_ITEMS_CLASS = \"empty\";\n        this.compare = (ea.compare || this.compare);\n        this.shouldBlockAnimation = (ea.shouldBlockAnimation || null);\n        this.unseenVsUnread = (ea.unseenVsUnread || false);\n        this.markReadSignalServer = ea.markReadSignalServer;\n        this.animations = {\n        };\n    };\n    q(ca, {\n        ITEM_UNREAD_CLASS: \"jewelItemNew\",\n        MARK_READ_TYPE: \"mark_read\",\n        UNREAD_COUNT_CHANGE_TYPE: \"unread_count_change\",\n        INSERTION_TYPE: \"insert\",\n        REMOVAL_TYPE: \"remove\",\n        getIdFromDom: function(da) {\n            return da.getAttribute(\"id\").replace(\"notification_\", \"\");\n        },\n        localizeUrls: function(da) {\n            j.scry(da, \"a\").forEach(function(ea) {\n                ea.href = m.localize(ea.href);\n            });\n        }\n    });\n    q(ca.prototype, h, {\n        FADE_DURATION: 250,\n        RESIZE_DURATION: 200,\n        _getField: function(da, ea) {\n            var fa = this._list.get(da);\n            return (fa && fa[ea]);\n        },\n        getDomObj: function(da) {\n            return this._getField(da, \"obj\");\n        },\n        fromDom: function() {\n            var da = ((this.ITEM_TAG + \".\") + this.ITEM_CLASS), ea = j.scry(this.contentRoot, da);\n            for (var fa = 0; (fa < ea.length); ++fa) {\n                var ga = ea[fa], ha = ca.getIdFromDom(ga);\n                this.insert(ha, ga.getAttribute(\"data-notiftime\"), null);\n            };\n        },\n        compare: function(da, ea) {\n            return ((da.time < ea.time) || (((da.time === ea.time) && (da.id < ea.id))));\n        },\n        insert: function(da, ea, fa, ga, ha, ia) {\n            var ja = y, ka = 0, la = this._list.exists(da), ma = (ia && this._list.exists(ia)), na = null, oa;\n            if ((la || ma)) {\n                if (!((ga && fa))) {\n                    return false;\n                }\n                 else {\n                    if (this._filter_func) {\n                        oa = {\n                            notif_id: da,\n                            notif_time: ea,\n                            notif_markup: fa,\n                            replace: ga,\n                            ignoreUnread: ha,\n                            notif_alt_id: ia\n                        };\n                        if (this._filter_func(oa)) {\n                            return false\n                        };\n                    }\n                ;\n                    ja = this._getField(da, \"readness\");\n                    ka = this._getField(da, \"time\");\n                    if ((ka > ea)) {\n                        return false\n                    };\n                    na = (la ? da : ia);\n                    this._remove(na);\n                }\n            \n            };\n            var pa = (((fa && l(fa).getRootNode())) || p((\"notification_\" + da))), qa = Math.max(ea, ka), ra = pa.getAttribute(\"data-readness\");\n            if ((!this.unseenVsUnread && (z == ra))) {\n                ra = x;\n            };\n            oa = {\n                id: da,\n                obj: pa,\n                time: qa,\n                readness: ra,\n                app_id: pa.getAttribute(\"data-appid\")\n            };\n            this._insert(oa);\n            this._setUpReadStateToggle(da, pa);\n            ca.localizeUrls(pa);\n            (this.noItemsElement && i.hide(this.noItemsElement));\n            if (ba(ra)) {\n                ((ha && !aa(ja)) && this.markRead([da,]));\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n            var sa = ((!na || (ka < qa)) || (((ra && !ja) && !ha)));\n            this.inform(ca.INSERTION_TYPE, {\n                id: da,\n                is_new: sa,\n                obj: pa,\n                replaced_id: na,\n                time: qa\n            });\n            return true;\n        },\n        _setReadStateToggleReadness: function(da, ea) {\n            var fa;\n            if (ea) {\n                fa = (this.unseenVsUnread ? \"Mark as Read\" : \"Unread\");\n            }\n             else fa = \"Read\";\n        ;\n            if (!((ea && this.unseenVsUnread))) {\n                i.removeClass(da, \"-cx-PRIVATE-fbReadToggle__active\");\n                i.addClass(da, \"-cx-PRIVATE-fbReadToggle__inactive\");\n            }\n        ;\n            n.set(da, fa, \"above\", \"center\");\n        },\n        _setUpReadStateToggle: function(da, ea) {\n            var fa = this.isUnreadId(da), ga = j.scry(ea, \".-cx-PRIVATE-fbReadToggle__active\")[0];\n            if (!ga) {\n                return\n            };\n            this._setReadStateToggleReadness(ga, fa);\n            var ha = function(event) {\n                if ((this.unseenVsUnread && this.isUnreadId(da))) {\n                    this.markReadSignalServer([da,]);\n                };\n                o.kill(event);\n                return false;\n            };\n            o.listen(ga, \"click\", ha.bind(this));\n        },\n        showNoNotifications: function() {\n            if ((null == this.noItemsElement)) {\n                this.noItemsElement = t(this.NO_ITEMS_ID);\n            };\n            if ((null == this.noItemsElement)) {\n                this.noItemsElement = j.create(this.ITEM_TAG, {\n                    id: this.NO_ITEMS_ID,\n                    className: this.NO_ITEMS_CLASS\n                }, \"No new notifications\");\n                j.appendContent(this.contentRoot, this.noItemsElement);\n            }\n        ;\n            i.show(this.noItemsElement);\n        },\n        _insert: function(da) {\n            this._list.remove(da.id);\n            var ea = null;\n            this._list.find(function(ga) {\n                var ha = this.compare(ga, da);\n                (!ha && (ea = ga.id));\n                return ha;\n            }.bind(this));\n            var fa = this.getDomObj(ea);\n            if (fa) {\n                this._list.insertAfter(da.id, da, ea);\n                j.insertAfter(fa, da.obj);\n            }\n             else {\n                this._list.prepend(da.id, da);\n                j.prependContent(this.contentRoot, da.obj);\n            }\n        ;\n        },\n        _remove: function(da) {\n            var ea = this._getField(da, \"obj\");\n            if (!ea) {\n                return false\n            };\n            this.inform(ca.REMOVAL_TYPE, {\n                id: da\n            });\n            this._list.remove(da);\n            j.remove(ea);\n            (this.isEmpty() && this.showNoNotifications());\n            return true;\n        },\n        getUnreadIds: function() {\n            return this._list.reduce(function(da, ea) {\n                (aa(da.readness) && ea.push(da.id));\n                return ea;\n            }, []);\n        },\n        getUnseenIds: function() {\n            return this._list.reduce(function(da, ea) {\n                (ba(da.readness) && ea.push(da.id));\n                return ea;\n            }, []);\n        },\n        getIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ea.push(da.id);\n                return ea;\n            }, []);\n        },\n        isUnreadId: function(da) {\n            var ea = this.getDomObj(da);\n            return (aa(this._getField(da, \"readness\")) || ((ea && i.hasClass(ea, ca.ITEM_UNREAD_CLASS))));\n        },\n        isUnseenId: function(da) {\n            return ba(this._getField(da, \"readness\"));\n        },\n        markRead: function(da, ea) {\n            da = (da ? da.filter(this.isUnreadId.bind(this)) : this.getUnreadIds());\n            var fa = false;\n            for (var ga = 0; (ga < da.length); ga++) {\n                var ha = this._list.get(da[ga]);\n                if (ha) {\n                    if (this._setReadness(da[ga], x)) {\n                        fa = true;\n                    };\n                    if (ea) {\n                        this._markReadInDom(da[ga], ha.obj);\n                    }\n                     else this.animateMarkRead(ha.obj);\n                ;\n                }\n            ;\n            };\n            if (fa) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        },\n        markSeen: function(da) {\n            if (!w(da)) {\n                return\n            };\n            if (!this.unseenVsUnread) {\n                this.markRead(da);\n                return;\n            }\n        ;\n            da = da.filter(this.isUnseenId.bind(this));\n            var ea = false;\n            for (var fa = 0; (fa < da.length); fa++) {\n                if (this._setReadness(da[fa], z)) {\n                    ea = true;\n                };\n            };\n            if (ea) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        },\n        _setReadness: function(da, ea) {\n            var fa = this._list.get(da);\n            if ((!fa || (fa.readness == ea))) {\n                return false\n            };\n            if (((fa.readness == x) && (ea == z))) {\n                return false\n            };\n            fa.readness = ea;\n            fa.obj.setAttribute(\"data-readness\", ea);\n            return true;\n        },\n        _markReadInDom: function(da, ea) {\n            if (!this.isUnreadId(da)) {\n                return\n            };\n            var fa = p(ea);\n            if (fa) {\n                this.stopAnimation(da);\n                i.removeClass(fa, ca.ITEM_UNREAD_CLASS);\n                var ga = j.scry(fa, \".read_toggle\")[0];\n                (ga && this._setReadStateToggleReadness(ga, false));\n            }\n        ;\n        },\n        animateMarkRead: function(da) {\n            if (!i.hasClass(da, ca.ITEM_UNREAD_CLASS)) {\n                return\n            };\n            var ea = ca.getIdFromDom(da), fa = this._markReadInDom.bind(this, ea, da);\n            if (i.hasClass(da, \"fbJewelBeep\")) {\n                fa();\n                return;\n            }\n        ;\n            if ((this.shouldBlockAnimation && this.shouldBlockAnimation(da))) {\n                return\n            };\n            fa.defer(10000);\n        },\n        stopAnimation: function(da) {\n            ((da in this.animations) && this.animations[da].stop());\n            delete this.animations[da];\n            return true;\n        },\n        insertMany: function(da, ea) {\n            if (((\"object\" == typeof da) && !u(da))) {\n                for (var fa in da) {\n                    var ga = da[fa];\n                    this.insert(fa, ga.time, ga.markup, true, ea, (ga.alt_id || null));\n                };\n                (this.noItemsElement && i.hide(this.noItemsElement));\n            }\n             else (this.isEmpty() && this.showNoNotifications());\n        ;\n        },\n        isEmpty: function() {\n            return this._list.isEmpty();\n        },\n        getEarliestNotifTime: function() {\n            return (this._list.isEmpty() ? 0 : Math.min.apply(null, this.getIds().map(function(da) {\n                return this._getField(da, \"time\");\n            }.bind(this))));\n        },\n        setFilterFn: function(da) {\n            this._filter_func = da;\n        },\n        toggleNotifsSimilarTo: function(da, ea, fa) {\n            var ga = this._getField(da, \"app_id\");\n            if (ga) {\n                var ha = this.getIds();\n                for (var ia = 0; (ia < ha.length); ++ia) {\n                    if ((ga == this._getField(ha[ia], \"app_id\"))) {\n                        var ja = this.getDomObj(ha[ia]);\n                        if ((da != ha[ia])) {\n                            (ea ? this._hideWithAnimation(ja) : this._showWithAnimation(ja));\n                        };\n                        var ka = j.scry(ja, \".first_receipt_div\");\n                        if ((ka.length == 1)) {\n                            if (fa) {\n                                i.hide(ka[0]);\n                                i.removeClass(ja, \"first_receipt\");\n                            }\n                             else {\n                                i.show(ka[0]);\n                                i.addClass(ja, \"first_receipt\");\n                            }\n                        \n                        };\n                    }\n                ;\n                };\n            }\n        ;\n        },\n        _hideWithAnimation: function(da) {\n            new g(da).to(\"opacity\", \"0\").blind().duration(this.FADE_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.RESIZE_DURATION).go();\n        },\n        _showWithAnimation: function(da) {\n            new g(da).to(\"height\", \"auto\").to(\"paddingTop\", \"auto\").to(\"paddingBottom\", \"auto\").blind().show().duration(this.RESIZE_DURATION).checkpoint().to(\"opacity\", \"1\").blind().duration(this.FADE_DURATION).go();\n        }\n    });\n    e.exports = ca;\n});\n__d(\"Notifications\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Env\",\"Event\",\"JSLogger\",\"NegativeNotif\",\"NotificationCounter\",\"NotificationList\",\"NotifXList\",\"Parent\",\"Poller\",\"ScrollableArea\",\"Style\",\"SystemEvents\",\"Toggler\",\"URI\",\"UserActivity\",\"UserNoOp\",\"Vector\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"hasArrayNature\",\"isEmpty\",\"shield\",\"throttle\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncSignal\"), k = b(\"Bootloader\"), l = b(\"ChannelConstants\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Env\"), p = b(\"Event\"), q = b(\"JSLogger\"), r = b(\"NegativeNotif\"), s = b(\"NotificationCounter\"), t = b(\"NotificationList\"), u = b(\"NotifXList\"), v = b(\"Parent\"), w = b(\"Poller\"), x = b(\"ScrollableArea\"), y = b(\"Style\"), z = b(\"SystemEvents\"), aa = b(\"Toggler\"), ba = b(\"URI\"), ca = b(\"UserActivity\"), da = b(\"UserNoOp\"), ea = b(\"Vector\"), fa = b(\"$\"), ga = b(\"copyProperties\"), ha = b(\"emptyFunction\"), ia = b(\"ge\"), ja = b(\"hasArrayNature\"), ka = b(\"isEmpty\"), la = b(\"shield\"), ma = b(\"throttle\"), na = b(\"userAction\");\n    function oa(pa) {\n        this.updateTime = (pa.updateTime || Date.now());\n        this.update_period = (pa.updatePeriod || 60000);\n        this.latest_notif_time = (pa.latestNotif || 0);\n        this.latest_read_notif_time = (pa.latestReadNotif || 0);\n        this.cache_version = (pa.cacheVersion || 0);\n        this.notifReceivedType = (pa.notifReceivedType || \"notification\");\n        this.wrapperID = (pa.wrapperID || \"notificationsWrapper\");\n        this.contentID = (pa.contentID || \"jewelNotifs\");\n        this.shouldLogImpressions = (pa.shouldLogImpressions || false);\n        this.allowDesktopNotifications = (pa.allowDesktopNotifications || false);\n        this.logAutoShutOffImpression = true;\n        this.useInfiniteScroll = (pa.useInfiniteScroll || false);\n        this.unseenVsUnread = (pa.unseenVsUnread || false);\n        this.scrollableAreaNode = null;\n        this.firstReceiptMap = {\n        };\n        this.user = o.user;\n        this.queuedNotifications = [];\n        this.timeElement = \"small.time\";\n        this.ua = new da();\n        this._init();\n    };\n    ga(oa.prototype, {\n        TIME_TRAVEL: \"time_travel\",\n        ONLINE: \"online\",\n        SCROLL_OFF_TINY: \"scroll_off_tiny\",\n        INACTIVE_REFRESH: \"inactive_refresh\",\n        _init: function() {\n            this.cookieName = (\"notifications_\" + this.user);\n            this.updateCheckCount = 0;\n            this.fetchListeners = [];\n            this.currentFetchRequest = null;\n            this.wrapper = ia(this.wrapperID);\n            this.content = ia(this.contentID);\n            this.jewelFlyout = ia(\"fbNotificationsFlyout\");\n            this.footer = n.find(this.jewelFlyout, \".jewelFooter\");\n            this.loadingIndicator = ia((this.contentID + \"_loading_indicator\"));\n            this.NOTIF_JEWEL_REF = \"notif_jewel\";\n            this.notifLogger = q.create(\"notifications\");\n            s.init();\n            this.alertList = new t(this.content, this._getListParams());\n            this._updateCount();\n            ((a.MinNotifications && a.MinNotifications.fetchSent()) && (this.fetch = ha));\n            h.subscribe(l.getArbiterType(this.notifReceivedType), this._handleNotificationMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_read\"), this._handleNotificationsReadMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_seen\"), this._handleNotificationsSeenMsg.bind(this));\n            h.subscribe(\"jewel/resize\", la(this._hideOverflow, this));\n            this.alertList.subscribe(t.UNREAD_COUNT_CHANGE_TYPE, this._updateCount.bind(this));\n            this._poller = new w({\n                interval: this.update_period,\n                setupRequest: this._update.bind(this),\n                clearOnQuicklingEvents: false,\n                dontStart: true\n            });\n            this._poller.start.bind(this._poller).defer(this.update_period, false);\n            if (this.wrapper) {\n                this.countSpan = n.find(this.wrapper, \"span.jewelCount span\");\n            };\n            this.initializeEvents();\n            this.fromDom();\n            if (this.useInfiniteScroll) {\n                this._autoLoadNotifIndex = 1;\n                this._truncate = false;\n                this.alertList.subscribe(t.INSERTION_TYPE, this._handleInsert.bind(this));\n            }\n        ;\n        },\n        _getListParams: function() {\n            return {\n                shouldBlockAnimation: function(pa) {\n                    return this.isNotifJewelOpen();\n                }.bind(this),\n                unseenVsUnread: this.unseenVsUnread,\n                markReadSignalServer: this.markRead.bind(this).curry(true)\n            };\n        },\n        fromDom: function() {\n            this.alertList.fromDom();\n            (((a.MinNotifications && a.MinNotifications.fetched()) && this.alertList.isEmpty()) && this.alertList.showNoNotifications());\n        },\n        initializeEvents: function() {\n            var pa = this.alertList.ITEM_TAG, qa = null;\n            p.listen(this.content, {\n                mouseover: function(event) {\n                    var ta = event.getTarget();\n                    qa = v.byTag(ta, pa);\n                    if ((qa && (ta != qa))) {\n                        if (v.byClass(qa, \"notifNegativeBase\")) {\n                            m.addClass(qa, \"notifHover\");\n                        }\n                         else m.addClass(qa, \"selected\");\n                    \n                    };\n                },\n                mouseout: function(event) {\n                    (qa && m.removeClass(qa, \"selected\"));\n                    (qa && m.removeClass(qa, \"notifHover\"));\n                    qa = null;\n                },\n                mousedown: this.onContentMouseDown.bind(this)\n            });\n            p.listen(this.wrapper, \"mouseover\", this.onMouseOver.bind(this));\n            aa.listen(\"show\", this.wrapper, this.onClick.bind(this));\n            aa.listen(\"hide\", this.wrapper, this.onHide.bind(this));\n            (this.shouldLogImpressions && aa.listen(\"show\", this.wrapper, this._logImpression.bind(this)));\n            var ra = function(ta) {\n                this._poller.request();\n                this.notifLogger.bump(ta);\n            }.bind(this);\n            z.subscribe(z.TIME_TRAVEL, ra.curry(this.TIME_TRAVEL));\n            z.subscribe(z.ONLINE, function(ta, ua) {\n                (ua && ra(this.ONLINE));\n            });\n            var sa = ((1000 * 60) * 60);\n            ca.subscribe(function(ta, ua) {\n                (((ua.idleness > sa)) && ra(this.INACTIVE_REFRESH));\n            }.bind(this));\n            this.negativeNotifs = {\n            };\n            this._initNotifNegativeFeedback();\n            if (this.useInfiniteScroll) {\n                this._setupScroll();\n                this._initializeScrollEvents();\n                this._updateScrollDataStructures.bind(this).defer();\n                this._hideOverflow();\n            }\n        ;\n        },\n        _setupScroll: function() {\n            this._scrollArea = n.scry(this.jewelFlyout, \"div.uiScrollableAreaWrap\")[0];\n            this._morePagerLink = n.find(this.jewelFlyout, \".notifMorePager a\");\n            this._morePager = (v.byClass(this._morePagerLink, \"notifMorePager\") || this._morePagerLink);\n            this._infiniteScrollNotif = null;\n            this.afterFirstFetch = false;\n            this.animate = false;\n            if ((a.MinNotifications && a.MinNotifications.fetched())) {\n                this.afterFirstFetch = true;\n                m.show(this._morePager);\n            }\n        ;\n        },\n        _initializeScrollEvents: function() {\n            p.listen(this._scrollArea, \"scroll\", ma(this._handleScroll.bind(this)));\n            p.listen(this._morePagerLink, \"success\", function(pa) {\n                this.fetchHandler(pa.getData().response);\n            }.bind(this));\n        },\n        _updateScrollDataStructures: function() {\n            var pa = this.alertList.getIds(), qa = Math.max(0, (pa.length - this._autoLoadNotifIndex));\n            this._infiniteScrollNotif = this.alertList.getDomObj(pa[qa]);\n            this._annotateMorePagerURI();\n        },\n        _annotateMorePagerURI: function() {\n            this._morePagerLink.setAttribute(\"ajaxify\", new ba(this._morePagerLink.getAttribute(\"ajaxify\")).addQueryData({\n                earliest_time: this.alertList.getEarliestNotifTime()\n            }));\n        },\n        onContentMouseDown: function(event) {\n            var pa = v.byTag(event.getTarget(), this.alertList.ITEM_TAG), qa = (pa && t.getIdFromDom(pa));\n            if ((qa && this.alertList.isUnreadId(qa))) {\n                this.markRead(true, [qa,]);\n            };\n        },\n        onMouseOver: function(event) {\n            if (m.hasClass(event.getTarget(), \"jewelButton\")) {\n                this.ua = na(\"notifs\", event.target, event, {\n                    mode: \"DEDUP\"\n                }).uai(\"mouseover\", \"jewel\").add_event(\"hover\");\n            };\n            this.fetch();\n        },\n        onClick: function() {\n            ((a.ArbiterMonitor && (this.fetch != ha)) && h.registerCallback(ha, [\"notifs/fetched\",]));\n            this.ua.add_event(\"show\");\n            this.fetch();\n            this.markRead(true);\n            this._hideOverflow();\n            if (this.scrollableAreaNode) {\n                var pa = x.getInstance(this.scrollableAreaNode);\n                (pa && pa.poke());\n            }\n        ;\n        },\n        onHide: function() {\n            this.animate = false;\n            (this.animation && this.animation.stop());\n            this.ua.add_event(\"hide\");\n            this.markRead(true);\n            this._dequeueNotifications();\n        },\n        _dequeueNotifications: function() {\n            this.queuedNotifications.forEach(function(pa) {\n                this._displayNotification(pa.type, pa.data);\n            }, this);\n            this.queuedNotifications.length = 0;\n        },\n        _handleScroll: function() {\n            if (this._checkInfiniteScroll()) {\n                this._autoLoadNotifIndex = 5;\n                this._sendFetchRequest(this._morePager);\n            }\n        ;\n        },\n        _handleInsert: function(pa, qa) {\n            if (qa.is_new) {\n                this._newDataFromInsert = true;\n            };\n            this._updateScrollDataStructures();\n        },\n        _checkInfiniteScroll: function() {\n            if ((this._infiniteScrollNotif && this._scrollArea)) {\n                var pa = ea.getElementPosition(this._infiniteScrollNotif).y, qa = (ea.getElementPosition(this._scrollArea).y + ea.getElementDimensions(this._scrollArea).y);\n                return (pa < qa);\n            }\n        ;\n            return false;\n        },\n        _initNotifNegativeFeedback: function() {\n            u.init(this);\n            this.alertList.setFilterFn(u.filterStoreClicked);\n            aa.listen(\"hide\", fa(this.wrapperID), function() {\n                for (var pa in this.negativeNotifs) {\n                    if (pa) {\n                        ((this.negativeNotifs[pa] instanceof r) && this.negativeNotifs[pa].reset());\n                    };\n                };\n            }.bind(this));\n            h.subscribe(\"notif/negativeCancel\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].restore());\n            }.bind(this));\n            h.subscribe(\"notif/negativeConfirmed\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onTurnedOff());\n                this.alertList.toggleNotifsSimilarTo(qa.id, true, true);\n                this._hideOverflow();\n                this._handleScroll();\n            }.bind(this));\n            h.subscribe(\"notif/negativeUndid\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onUndid());\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n                this._hideOverflow();\n            }.bind(this));\n            h.subscribe(\"notif/negativeMarkedSpam\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onMarkedSpam());\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptYes\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptYes());\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptNo\", function(pa, qa) {\n                (this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptNo());\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            this.alertList.subscribe(t.INSERTION_TYPE, function(pa, qa) {\n                this._updateFirstReceipt(qa);\n                var ra = n.scry(qa.obj, \".notif_x\");\n                if ((ra.length == 1)) {\n                    this.negativeNotifs[qa.id] = new r(this, qa);\n                };\n            }.bind(this));\n        },\n        _sendIDs: function(pa, qa, ra) {\n            var sa = (ra || {\n            });\n            for (var ta = 0; (ta < pa.length); ++ta) {\n                sa[((\"alert_ids[\" + ta) + \"]\")] = pa[ta];;\n            };\n            new j(ba(qa).getQualifiedURI().toString(), sa).send();\n        },\n        _waitForFetch: function(pa) {\n            return (this.currentFetchRequest && this.fetchListeners.push(pa.bind(this)));\n        },\n        _logImpression: function() {\n            var pa = this.alertList.getIds();\n            if (((pa.length === 0) && this._waitForFetch(this._logImpression))) {\n                return\n            };\n            this.logImpressionIds(pa, this.NOTIF_JEWEL_REF);\n        },\n        logImpressionIds: function(pa, qa) {\n            (this.shouldLogImpressions && this._sendIDs(pa, \"/ajax/notifications/impression.php\", {\n                ref: qa\n            }));\n        },\n        markRead: function(pa, qa) {\n            var ra = !ja(qa);\n            qa = (ra ? this.alertList.getUnseenIds() : qa.filter(this.alertList.isUnreadId.bind(this.alertList)));\n            if (qa.length) {\n                (pa && this._sendIDs(qa, \"/ajax/notifications/mark_read.php\", {\n                    seen: (ra ? 1 : 0)\n                }));\n                if ((ia(\"jewelNoticeMessage\") && this.logAutoShutOffImpression)) {\n                    new j(\"/ajax/notifications/auto_shutoff_seen.php\").send();\n                    this.logAutoShutOffImpression = false;\n                }\n            ;\n                var sa = pa;\n                (ra ? this.alertList.markSeen(qa) : this.alertList.markRead(qa, sa));\n            }\n        ;\n            (ra && this._waitForFetch(this.markRead.bind(this, pa)));\n        },\n        markAllRead: function() {\n            var pa = this.alertList.getUnreadIds();\n            this.markRead(true, pa);\n        },\n        _updateErrorHandler: function(pa) {\n        \n        },\n        _updateURI: \"/ajax/presence/update.php\",\n        _update: function(pa) {\n            pa.setHandler(this._handleUpdate.bind(this)).setOption(\"suppressErrorAlerts\", true).setErrorHandler(this._updateErrorHandler.bind(this)).setData({\n                notif_latest: this.latest_notif_time,\n                notif_latest_read: this.latest_read_notif_time\n            }).setURI(this._updateURI).setAllowCrossPageTransition(true);\n        },\n        _handleUpdate: function(pa) {\n            var qa = pa.payload.notifications;\n            if (!qa.no_change) {\n                this.updateTime = pa.payload.time;\n                this.latest_notif_time = qa.latest_notif;\n                this.latest_read_notif_time = qa.latest_read_notif;\n                this._updateDisplay();\n                this.alertList.insertMany(qa.notifications);\n            }\n        ;\n        },\n        _updateDisplay: function() {\n            if (!this.content) {\n                return\n            };\n            this._updateCount();\n        },\n        _updateCount: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: \"notifications\",\n                count: this.alertList.unseenCount\n            }, h.BEHAVIOR_STATE);\n            this._hideOverflow();\n        },\n        fetch: function(pa) {\n            this._sendFetchRequest(pa);\n        },\n        _getFetchQueryData: function() {\n            var pa = {\n                time: this.latest_notif_time,\n                user: this.user,\n                version: this.cache_version,\n                locale: o.locale\n            };\n            if (this.useInfiniteScroll) {\n                pa.earliest_time = this.alertList.getEarliestNotifTime();\n            };\n            return pa;\n        },\n        _sendFetchRequest: function(pa) {\n            if (this.useInfiniteScroll) {\n                this._infiniteScrollNotif = null;\n                this._newDataFromInsert = false;\n                this._truncate = true;\n            }\n        ;\n            var qa = ba(\"/ajax/notifications/get.php\"), ra = (pa || this.loadingIndicator);\n            if (this.currentFetchRequest) {\n                return true\n            };\n            this.ua.add_event(\"fetch\");\n            qa.setQueryData(this._getFetchQueryData());\n            this.currentFetchRequest = new i().setURI(qa).setStatusElement(ra).setMethod(\"GET\").setReadOnly(true).setTimeoutHandler(30000, this.fetchErrorHandler.bind(this)).setHandler(this.fetchHandler.bind(this)).setErrorHandler(this.fetchErrorHandler.bind(this)).setAllowCrossPageTransition(true);\n            (!this.currentFetchRequest.send() && this.fetchErrorHandler());\n            return true;\n        },\n        fetchErrorHandler: function(pa) {\n            this.currentFetchRequest = null;\n            this.ua.add_event(\"fetch_error\");\n            (this.loadingIndicator && m.hide(this.loadingIndicator));\n            (this.useInfiniteScroll && this._updateScrollDataStructures());\n        },\n        fetchHandler: function(pa) {\n            this.ua.add_event(\"fetch_success\");\n            var qa = pa.getPayload();\n            this.alertList.insertMany(qa.notifications, true);\n            (this.loadingIndicator && m.hide(this.loadingIndicator));\n            this.loadingIndicator = null;\n            this.currentFetchRequest = null;\n            this.fetch = ha;\n            if (this.fetchListeners) {\n                for (var ra = 0; (ra < this.fetchListeners.length); ra++) {\n                    this.fetchListeners[ra]();;\n                };\n                this.fetchListeners = [];\n            }\n        ;\n            (a.ArbiterMonitor && h.inform(\"notifs/fetched\", \"\", h.BEHAVIOR_STATE));\n            var sa = qa.generated, ta = Math.round((Date.now() / 1000));\n            if (((ta - sa) > 15)) {\n                sa = ta;\n            };\n            k.loadModules([\"LiveTimer\",], function(ua) {\n                ua.restart(sa);\n                ua.startLoop(0);\n            });\n            if (this.useInfiniteScroll) {\n                if ((ka(qa.notifications) || !this._newDataFromInsert)) {\n                    this._noMoreNotifications();\n                }\n                 else m.show(this._morePager);\n            ;\n                this._updateScrollDataStructures();\n                if ((this.isNotifJewelOpen() && this.afterFirstFetch)) {\n                    this.animate = true;\n                };\n                this.afterFirstFetch = true;\n            }\n        ;\n            this._hideOverflow();\n        },\n        _noMoreNotifications: function() {\n            m.hide(this._morePager);\n            this.useInfiniteScroll = false;\n        },\n        _mergeNotification: function(pa, qa, ra, sa) {\n            var ta = !this.alertList.isUnreadId(pa);\n            this.alertList.insert(pa, qa, ra, true, null, (sa || null));\n            this.latest_notif_time = 0;\n            if (ta) {\n                this._updateCount();\n            };\n            var ua = this.alertList.getDomObj(pa);\n            if (ua) {\n                k.loadModules([\"LiveTimer\",], function(va) {\n                    va.addTimeStamps(ua);\n                });\n            };\n        },\n        _handleNotificationMsg: function(pa, qa) {\n            if (this.isNotifJewelOpen()) {\n                var ra = {\n                    type: pa,\n                    data: qa\n                };\n                this.queuedNotifications.push(ra);\n            }\n             else this._displayNotification(pa, qa);\n        ;\n        },\n        _displayNotification: function(pa, qa) {\n            var ra = qa.obj;\n            if ((typeof this.useDesktopNotifications == \"undefined\")) {\n                this.useDesktopNotifications = ((this.allowDesktopNotifications && window.webkitNotifications) && (window.webkitNotifications.checkPermission() === 0));\n            };\n            if (this.useDesktopNotifications) {\n                k.loadModules([\"DesktopNotifications\",], function(sa) {\n                    sa.addNotification(ra.alert_id);\n                });\n            };\n            if (ra.markup) {\n                this._mergeNotification(ra.alert_id, ra.time, ra.markup, (ra.alt_id || null));\n            }\n             else this._poller.request();\n        ;\n        },\n        _handleNotificationsReadMsg: function(pa, qa) {\n            var ra = qa.obj;\n            this.markRead(false, ra.alert_ids);\n        },\n        _handleNotificationsSeenMsg: function(pa, qa) {\n            if (!this.unseenVsUnread) {\n                this._handleNotificationsReadMsg(pa, qa);\n                return;\n            }\n        ;\n            var ra = qa.obj;\n            this.alertList.markSeen(ra.alert_ids);\n        },\n        _hideOverflow: function() {\n            if (!this.isNotifJewelOpen()) {\n                return\n            };\n            var pa = n.scry(fa(\"fbNotificationsList\"), \".notification\");\n            this.scrollableAreaNode = (this.scrollableAreaNode || n.scry(this.jewelFlyout, \".uiScrollableArea\")[0]);\n            var qa = 20, ra = (m.hasClass(document.documentElement, \"tinyViewport\") && !m.hasClass(document.body, \"fixedBody\"));\n            if ((!pa.length || ra)) {\n                y.set(this.scrollableAreaNode, \"height\", \"100%\");\n                this.notifLogger.rate(this.SCROLL_OFF_TINY, ra);\n                return;\n            }\n        ;\n            var sa = (this.scrollableAreaNode || pa[0]), ta = (((ea.getViewportDimensions().y - ea.getElementPosition(sa, \"viewport\").y) - ea.getElementDimensions(this.footer).y) - 5), ua = ta, va = 0;\n            for (; ((va < pa.length) && (ua > 0)); ++va) {\n                if (m.shown(pa[va])) {\n                    ua -= ea.getElementDimensions(pa[va]).y;\n                };\n            };\n            var wa = 530, xa = Math.min(wa, (ta - Math.max(ua, 0)));\n            if (((ua >= 0) && (xa < wa))) {\n                if (!this.useInfiniteScroll) {\n                    xa = \"100%\";\n                }\n                 else {\n                    if ((this._truncate && (pa.length >= 5))) {\n                        xa -= qa;\n                    };\n                    xa += \"px\";\n                }\n            ;\n            }\n             else xa += \"px\";\n        ;\n            if (((this.useInfiniteScroll && this.animate) && (xa != \"100%\"))) {\n                (this.animation && this.animation.stop());\n                this.animation = new g(this.scrollableAreaNode).to(\"height\", xa).duration(200).go();\n            }\n             else {\n                var ya = x.getInstance(this.scrollableAreaNode);\n                (ya && ya.showScrollbar.bind(ya).defer());\n                y.set(this.scrollableAreaNode, \"height\", xa);\n            }\n        ;\n        },\n        _updateFirstReceipt: function(pa) {\n            var qa = pa.obj.getAttribute(\"data-appid\"), ra = n.scry(pa.obj, \".first_receipt_div\");\n            if ((qa && (ra.length == 1))) {\n                if (this.firstReceiptMap[qa]) {\n                    if (((pa.id != this.firstReceiptMap[qa].id) && (this.firstReceiptMap[qa].time > pa.time))) {\n                        return\n                    };\n                    m.removeClass(this.firstReceiptMap[qa].obj, \"first_receipt\");\n                }\n            ;\n                this.firstReceiptMap[qa] = pa;\n                m.addClass(pa.obj, \"first_receipt\");\n            }\n        ;\n        },\n        isNotifJewelOpen: function() {\n            var pa = aa.getInstance(this.wrapper).getActive();\n            return (((pa === this.wrapper) && m.hasClass(pa, \"openToggler\")));\n        }\n    });\n    e.exports = oa;\n});\n__d(\"legacy:original-notifications-jewel\", [\"Notifications\",], function(a, b, c, d) {\n    a.Notifications = b(\"Notifications\");\n}, 3);\n__d(\"PagesVoiceBar\", [\"$\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"ChannelConstants\",\"DOM\",\"PageTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"ChannelConstants\"), l = b(\"DOM\"), m = b(\"PageTransitions\"), n = \"PagesVoiceBar/toggle\", o = \"PagesVoiceBar/initialized\", p = \"PagesVoiceBar/switchVoice\", q = \"page_transition\", r = \"pages_voice_bar_sync\", s = null, t = null, u = false, v = false;\n    function w() {\n        v = !v;\n        j.conditionClass(document.body, \"hasVoiceBar\", v);\n    };\n    function x(da, ea) {\n        new i(\"/ajax/pages/switch_voice.php\").setData(ea).setHandler(function(fa) {\n            ba();\n        }).send();\n    };\n    function y() {\n        s = null;\n    };\n    function z(da, ea) {\n        if ((ea.obj.profile_id && (ea.obj.profile_id == s))) {\n            ba();\n        };\n    };\n    function aa(da) {\n        h.subscribe(o, da);\n    };\n    function ba() {\n        m.getNextURI().go();\n    };\n    var ca = {\n        initVoiceBar: function() {\n            if (u) {\n                return\n            };\n            t = g(\"pagesVoiceBarContent\");\n            v = j.hasClass(document.body, \"hasVoiceBar\");\n            h.subscribe(n, w);\n            h.subscribe(p, x);\n            h.subscribe(q, y);\n            h.subscribe(k.getArbiterType(r), z);\n            u = true;\n            h.inform(o, null, h.BEHAVIOR_STATE);\n        },\n        update: function(da, ea) {\n            aa(function() {\n                s = ea;\n                l.setContent(t, da);\n            });\n        }\n    };\n    e.exports = ca;\n});\n__d(\"PrivacyLiteFlyout\", [\"Event\",\"function-extensions\",\"$\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Ease\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"Toggler\",\"copyProperties\",\"cx\",\"csx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"$\"), i = b(\"Animation\"), j = b(\"Arbiter\"), k = b(\"ArbiterMixin\"), l = b(\"AsyncRequest\"), m = b(\"CSS\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Style\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"csx\"), w = b(\"ge\"), x = \"PrivacyLiteFlyout/expandingSection\", y = {\n    }, z = {\n    };\n    function aa() {\n        switch (window.location.pathname) {\n          case \"/\":\n        \n          case \"/home.php\":\n        \n          case \"/index.php\":\n            return true;\n          default:\n            return false;\n        };\n    };\n    function ba(ka) {\n        var la = \".-cx-PUBLIC-PrivacyLiteFlyoutNav__label\";\n        return (!p.byClass(ka, \"hasSmurfbar\") && n.scry(h(\"blueBar\"), la).length);\n    };\n    function ca(ka, la, ma) {\n        var na = (la ? 0 : ka.offsetHeight);\n        r.set(ka, \"height\", (na + \"px\"));\n        r.set(ka, \"overflow\", \"hidden\");\n        m.show(ka);\n        var oa = (la ? ka.scrollHeight : 0), pa = n.getID(ka);\n        (y[pa] && y[pa].stop());\n        y[pa] = new i(ka).to(\"height\", oa).ondone(function() {\n            y[pa] = null;\n            r.set(ka, \"height\", \"\");\n            r.set(ka, \"overflow\", \"\");\n            (oa || m.hide(ka));\n            ma();\n        }).duration((Math.abs((oa - na)) * 1.5)).ease(o.sineOut).go();\n    };\n    function da(ka) {\n        return new l().setURI(ka).send();\n    };\n    function ea() {\n        return da(\"/ajax/privacy/privacy_lite/increment_masher_tip_count\");\n    };\n    function fa() {\n        return da(\"/ajax/privacy/privacy_lite/dismiss_masher_tip\");\n    };\n    var ga = null, ha = false, ia = false, ja = t({\n        loadBody: function(ka) {\n            if ((!ha && w(\"fbPrivacyLiteFlyoutLoading\"))) {\n                ha = true;\n                if (!ka) {\n                    ka = false;\n                };\n                new l(\"/ajax/privacy/privacy_lite/loader\").setData({\n                    from_megaphone: ka\n                }).send();\n            }\n        ;\n        },\n        renderBody: function(ka) {\n            var la = w(\"fbPrivacyLiteFlyoutLoading\");\n            if (la) {\n                n.replace(la, ka);\n                ja.inform(\"load\", null, j.BEHAVIOR_STATE);\n            }\n        ;\n        },\n        hideCleanup: function(ka) {\n            j.inform(x);\n            var la = n.scry(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\").forEach(function(ma) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n            });\n        },\n        registerFlyoutToggler: function(ka, la) {\n            ga = la;\n            var ma = s.createInstance(ka);\n            ma.setSticky(false);\n            s.listen([\"show\",\"hide\",], la, function(na) {\n                ja.inform(na);\n                ia = (na === \"show\");\n                if (!ia) {\n                    ja.hideCleanup(ka);\n                    ma.hide();\n                    j.inform(\"layer_hidden\", {\n                        type: \"PrivacyShortcutsFlyout\"\n                    });\n                }\n                 else j.inform(\"layer_shown\", {\n                    type: \"PrivacyShortcutsFlyout\"\n                });\n            ;\n            });\n        },\n        registerFinalReminderFlyout: function(ka) {\n            if ((ia || !aa())) {\n                return\n            };\n            var la = n.find(ka.getRoot(), \".-cx-PRIVATE-PrivacyLiteFinalReminder__okay\"), ma = ka.getContext();\n            if (ba(ma)) {\n                ka.setOffsetY(-5);\n            };\n            ja.subscribe(\"show\", function() {\n                ka.hide();\n            });\n            var na = g.listen(la, \"click\", function() {\n                ka.hide();\n                da(\"/ajax/privacy/privacy_lite/dismiss_rollout_reminder\");\n                na.remove();\n            });\n            da(\"/ajax/privacy/privacy_lite/increment_rollout_reminder\");\n            ka.show();\n        },\n        isFlyoutVisible: function() {\n            return (ga && (s.getActive() === ga));\n        },\n        exists: function() {\n            return !!n.scry(document.body, \".-cx-PUBLIC-PrivacyLiteFlyoutNav__button\")[0];\n        },\n        setFlyoutVisible: function(ka) {\n            (ka ? s.show(ga) : s.hide(ga));\n        },\n        showSection: function(ka) {\n            var la = z[ka], ma = la.chevron, na = la.sublist_container;\n            j.inform(x, ma);\n            if ((ja.inform(\"expand\", ka) !== false)) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.addClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(na, true, function() {\n                    ja.inform(\"expanded\", ka);\n                });\n            }\n        ;\n        },\n        hideSection: function(ka, la, ma) {\n            var na = z[ka], oa = na.chevron, pa = na.sublist_container;\n            if ((ma === oa)) {\n                return\n            };\n            if ((ja.inform(\"collapse\", ka) !== false)) {\n                m.addClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.removeClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(pa, false, function() {\n                    ja.inform(\"collapsed\", ka);\n                });\n            }\n        ;\n        },\n        toggleSection: function(ka) {\n            var la = z[ka].chevron;\n            s.getInstance(la).hide();\n            if (m.hasClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\")) {\n                ja.showSection(ka);\n                new l(\"/ajax/privacy/privacy_lite/log_section_expand\").setData({\n                    section: ka\n                }).send();\n            }\n             else ja.hideSection(ka);\n        ;\n        },\n        registerSection: function(ka, la) {\n            z[ka] = la;\n            j.subscribe(x, ja.hideSection.curry(ka));\n            g.listen(la.section_block, \"click\", ja.toggleSection.curry(ka));\n        },\n        registerInlineHelpOnAudienceChange: function(ka, la, ma) {\n            q.subscribe(\"select\", function(na, oa) {\n                if ((oa.selector != ka)) {\n                    return\n                };\n                m.addClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n                if (ma) {\n                    new l(\"/ajax/privacy/privacy_lite/kill_intro\").send();\n                };\n            });\n        },\n        registerInlineHelpXOutOnClick: function(ka, la) {\n            g.listen(ka, \"click\", m.addClass.curry(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__reallygone\"));\n        },\n        registerBlockUnhideOnFocus: function(ka, la) {\n            g.listen(ka, \"focus\", m.show.curry(la));\n        },\n        registerMessageFilterSettingOnClick: function(ka, la) {\n            var ma = n.find(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__filterradio\");\n            g.listen(ka, \"click\", function() {\n                if (ma.checked) {\n                    new l(\"/ajax/mercury/change_filtering_type.php\").setData({\n                        filtering_type: la,\n                        source: \"privacy_lite\"\n                    }).send();\n                };\n            });\n        },\n        registerGraphSearchPrivacyReminder: function(ka, la) {\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                da(\"/ajax/privacy/privacy_lite/dismiss_gs_privacy_reminder\");\n            });\n        },\n        registerMasher: function(ka, la) {\n            var ma = false;\n            j.subscribe(x, function(na, oa) {\n                var pa = n.scry(p.byTag(oa, \"li\"), \".-cx-PRIVATE-PrivacyLiteFlyoutNav__notice\").length;\n                if ((ma || !pa)) {\n                    return\n                };\n                ma = Boolean(ea());\n            });\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                fa();\n            });\n        }\n    }, k);\n    e.exports = ja;\n});\n__d(\"PrivacyLiteFlyoutHelp\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"ContextualHelpSearchController\",\"CSS\",\"DOM\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ContextualHelpSearchController\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q, r;\n    function s(t, u, v, w, x) {\n        this._width = 315;\n        r = l.find(u, \"input\");\n        var y = l.create(\"div\");\n        this.init(t, r, y, v, w);\n        q = m.byClass(u, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__root\");\n        g.listen(x, \"click\", this._hideSearch.bind(this));\n        h.subscribe(\"PrivacyLiteFlyout/expandingSection\", this._hideSearch.bind(this));\n        var z = l.scry(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchlink\")[0];\n        (z && g.listen(z, \"click\", function() {\n            k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n            r.focus();\n            if (!this.suggestedResults) {\n                new i(\"/ajax/privacy/privacy_lite/help_suggestions\").setHandler(function(aa) {\n                    var ba = aa.getPayload().searchSuggestions, ca = l.find(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchsuggestions\");\n                    l.setContent(ca, ba);\n                    k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__hassearchsuggestions\");\n                }.bind(this)).send();\n            };\n        }.bind(this)));\n    };\n    n(s.prototype, new j(), {\n        source: \"privacy_shortcuts\",\n        _hideSearch: function() {\n            this.clearResults();\n            k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n        },\n        show: function(t) {\n            if ((t === this.topics_area)) {\n                k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                return;\n            }\n             else if ((t === this.loader)) {\n                k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                k.hide(this.results_area);\n            }\n             else k.hide(this.loader);\n            \n        ;\n            k.show(t);\n        }\n    });\n    e.exports = s;\n});\n__d(\"ViewasChromeBar\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Focus\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"ModalMask\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"cx\"), q = b(\"csx\"), r = \"ViewasChromeBar/initialized\", s = null, t = false;\n    function u(x) {\n        h.subscribe(r, x);\n    };\n    function v(x) {\n        j.addClass(x, \"-cx-PRIVATE-ViewasChromeBar__specificselectormode\");\n        var y = k.find(x, \".-cx-PRIVATE-ViewasChromeBar__userselector\");\n        l.set(k.find(y, \".textInput\"));\n    };\n    var w = {\n        initChromeBar: function(x) {\n            if (t) {\n                return\n            };\n            s = x;\n            t = true;\n            h.inform(r, null, h.BEHAVIOR_STATE);\n        },\n        update: function(x, y) {\n            u(function() {\n                k.setContent(s, x);\n                if (y) {\n                    new i(\"/ajax/privacy/glasgow/viewas_bar_flyout_open\").send();\n                };\n            });\n        },\n        registerSpecificModeOnClick: function(x) {\n            g.listen(x, \"click\", v.curry(o.byClass(x, \"-cx-PRIVATE-ViewasChromeBar__text\")));\n        },\n        registerFlyoutModalMask: function() {\n            m.show();\n            n.registerHandler(m.hide, 10);\n        }\n    };\n    e.exports = w;\n});\n__d(\"BingScalingCommon\", [], function(a, b, c, d, e, f) {\n    var g = {\n        integrateWebsuggestions: function(h, i, j, k, l) {\n            var m = [], n = (i ? m : []), o = [], p = 0, q = 0, r = j;\n            k = Math.floor((j * k));\n            for (var s = 0; (s < h.length); s++) {\n                var t = h[s];\n                if (((t.type === \"websuggestion\") && !t.isSeeMore)) {\n                    if (((((r > 0) && (p < k))) || (((p > 0) && (p < l))))) {\n                        n.push(t);\n                        p++;\n                        r--;\n                    }\n                     else if ((r > 0)) {\n                        o.push(t);\n                    }\n                ;\n                }\n                 else {\n                    if (((r <= 0) && !i)) {\n                        continue;\n                    };\n                    m.push(t);\n                    q++;\n                    r--;\n                }\n            ;\n            };\n            if (((r > 0) && (o.length > 0))) {\n                n = n.concat(o.slice(0, r));\n            };\n            if (!i) {\n                return m.concat(n)\n            };\n            return n;\n        }\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchSponsoredUtils\", [], function(a, b, c, d, e, f) {\n    function g(o) {\n        return (o.selected_target_id != o.s_target);\n    };\n    function h(o, p) {\n        return Math.min(p.maxNumberAds, ((p.maxNumberRemovedResults + p.maxNumberResultsAndAds) - o));\n    };\n    function i(o, p) {\n        var q = {\n        };\n        for (var r = (o.length - 1); (r >= 0); --r) {\n            var s = o[r];\n            q[s] = s;\n            if (p.hasOwnProperty(s)) {\n                p[s].forEach(function(t) {\n                    q[t] = s;\n                });\n            };\n        };\n        return q;\n    };\n    function j(o, p, q) {\n        for (var r = p; (r < o.length); r++) {\n            (o[r].setDebugString && o[r].setDebugString(q));;\n        };\n    };\n    function k(o, p) {\n        return (p.indexOf(String(o)) != -1);\n    };\n    function l(o, p, q, r) {\n        if (n.isSelfPromoted(o)) {\n            return false\n        };\n        if (((q + p.length) < r.maxNumberResultsAndAds)) {\n            return false\n        };\n        return true;\n    };\n    function m(o, p, q, r) {\n        var s = o[(o.length - 1)];\n        if (p.hasOwnProperty(s)) {\n            return false\n        };\n        if ((s == q)) {\n            return false\n        };\n        if ((s == r)) {\n            return false\n        };\n        return true;\n    };\n    var n = {\n        isSelfPromoted: function(o) {\n            return (o.uid == o.s_target);\n        },\n        prepareAndSortAds: function(o, p, q) {\n            if (!p) {\n                return []\n            };\n            var r = [], s = o.length, t = {\n            };\n            for (var u = 0; (u < s); u++) {\n                var v = o[u];\n                t[v.uid] = true;\n                if (v.s_categories) {\n                    v.s_categories.forEach(function(z) {\n                        t[z] = true;\n                    });\n                };\n            };\n            for (var w in t) {\n                if (p[w]) {\n                    for (var x in p[w]) {\n                        var y = p[w][x];\n                        if ((q && q.hasOwnProperty(y.uid))) {\n                            continue;\n                        };\n                        r.push(y);\n                    }\n                };\n            };\n            r.sort(function(z, aa) {\n                return (aa.s_value - z.s_value);\n            });\n            return r;\n        },\n        selectAds: function(o, p, q, r, s) {\n            var t = [], u = {\n            }, v = {\n            }, w = {\n            }, x = 0, y = h(o.length, r), z = i(o, p);\n            for (var aa = 0; (aa < q.length); aa++) {\n                if ((t.length >= y)) {\n                    j(q, aa, ((\"filtered: \" + y) + \" ads already selected\"));\n                    break;\n                }\n            ;\n                var ba = q[aa], ca = (z[ba.s_target] || ba.s_target);\n                ba.selected_target_id = ca;\n                if (!k(ca, o)) {\n                    (ba.setDebugString && ba.setDebugString(((((\"filtered: targeted organic \" + ca) + \" does not exist. \") + \"promoted id \") + ba.uid)));\n                    continue;\n                }\n            ;\n                if ((l(ba, o, x, r) && !m(o, v, ca, s))) {\n                    (ba.setDebugString && ba.setDebugString(\"filtered: last organic need but cannot be removed\"));\n                    continue;\n                }\n            ;\n                if ((!n.isSelfPromoted(ba) && (o.indexOf(String(ba.uid)) != -1))) {\n                    (ba.setDebugString && ba.setDebugString((((\"filtered: organic \" + ba.uid) + \" targets another organic \") + ca)));\n                    continue;\n                }\n            ;\n                if (u.hasOwnProperty(ba.s_account)) {\n                    (ba.setDebugString && ba.setDebugString(((\"filtered: ad account \" + ba.s_account) + \" already selected\")));\n                    continue;\n                }\n            ;\n                if (w.hasOwnProperty(ba.uid)) {\n                    (ba.setDebugString && ba.setDebugString(((\"filtered: ad promoted id \" + ba.uid) + \" already selected\")));\n                    continue;\n                }\n            ;\n                (ba.setDebugString && ba.setDebugString(\"selected\"));\n                t.push(ba);\n                u[ba.s_account] = true;\n                v[ca] = true;\n                w[ba.uid] = true;\n                if (!n.isSelfPromoted(ba)) {\n                    ++x;\n                    if (((x + o.length) > r.maxNumberResultsAndAds)) {\n                        o.pop();\n                    };\n                }\n            ;\n            };\n            return t;\n        },\n        hasTopResult: function(o, p, q) {\n            if ((o == null)) {\n                return false\n            };\n            if ((o.type == \"user\")) {\n                return false\n            };\n            if ((o.type == \"grammar\")) {\n                return false\n            };\n            if ((o.score > q.v0)) {\n                return true\n            };\n            if ((o.s_value > q.v3)) {\n                return true\n            };\n            if ((o.s_value > p.s_value)) {\n                return true\n            };\n            var r = (g(p) ? q.v4 : ((o.bootstrapped ? q.v1 : q.v2)));\n            if ((r < p.s_value)) {\n                return false\n            };\n            return true;\n        },\n        setOrganicECPM: function(o, p) {\n            if ((o == null)) {\n                return\n            };\n            for (var q = 0; (q < p.length); q++) {\n                if (o.hasOwnProperty(p[q].uid)) {\n                    p[q].s_value = o[p[q].uid];\n                };\n            };\n            return;\n        },\n        buildResultIndices: function(o) {\n            var p = {\n            }, q = o.length;\n            for (var r = 0; (r < q); r++) {\n                p[o[r].uid] = r;;\n            };\n            return p;\n        },\n        getTopAdPosition: function(o, p, q) {\n            if ((o.length < 1)) {\n                return null\n            };\n            if ((p.length < 1)) {\n                return null\n            };\n            if ((((o[0].type == \"user\")) || ((o[0].type == \"grammar\")))) {\n                for (var r = 1; (r < o.length); ++r) {\n                    if ((o[r].type != o[0].type)) {\n                        return r\n                    };\n                };\n                return o.length;\n            }\n        ;\n            if (n.hasTopResult(o[0], p[0], q)) {\n                return 1\n            };\n            return 0;\n        }\n    };\n    e.exports = n;\n});\n__d(\"TypeaheadSearchSponsored\", [\"Event\",\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"TypeaheadSearchSponsoredUtils\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"URI\"), l = b(\"copyProperties\"), m = b(\"TypeaheadSearchSponsoredUtils\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n    o.prototype.enable = function() {\n        this._data = this._typeahead.getData();\n        this._dataSubscriptions = [this._data.subscribe(\"beginFetchHandler\", function(p, q) {\n            var r = q.response.getPayload();\n            if (r.s_entries) {\n                this._sponsoredEntries = (this._sponsoredEntries || {\n                });\n                var s = r.s_entries.length;\n                for (var t = 0; (t < s); t++) {\n                    var u = new o.Ad();\n                    l(u, r.s_entries[t]);\n                    var v = u.s_target;\n                    if (!this._sponsoredEntries[v]) {\n                        this._sponsoredEntries[v] = {\n                        };\n                    };\n                    this._sponsoredEntries[v][u.uid] = u;\n                };\n                if (r.s_bootstrap_id) {\n                    this._sBootstrapID = r.s_bootstrap_id;\n                };\n                if (r.organic_s_value) {\n                    this._organicECPM = l(this._organicECPM, r.organic_s_value);\n                };\n            }\n        ;\n        }.bind(this)),];\n        if (o.auctionOptions.bootstrap) {\n            this._dataSubscriptions.push(this._data.subscribe(\"onload\", function(p, q) {\n                var r = l(this.bootstrapData, {\n                    no_cache: 1,\n                    options: [\"sponsored\",]\n                });\n                this.fetch(this.bootstrapEndpoint, r, {\n                    type: \"sponsored\"\n                });\n            }.bind(this._data)));\n        };\n        this._view = this._typeahead.getView();\n        this._viewSubscriptions = [this._view.subscribe(\"finalResultsReordering\", function(p, q) {\n            o.query = q.value;\n            m.setOrganicECPM(this._organicECPM, q.results);\n            var r = o.getOriginalOrganics(q.results);\n            o.setAuctionOptions({\n                maxNumberResultsAndAds: Math.max(q.results.length, (((this._data && this._data._maxResults)) || o.auctionOptions.maxNumberResultsAndAds))\n            });\n            var s = this.runAuction(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities, o.auctionOptions), t = m.prepareAndSortAds(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities), u = t.map(function(y) {\n                return y.s_token;\n            }), v = [];\n            for (var w = 0; (w < s.length); w++) {\n                var x = s[w];\n                if (x.s_token) {\n                    v.push({\n                        position: w,\n                        is_self: x.is_self\n                    });\n                };\n            };\n            this._view.inform(\"recordAfterReorder\", {\n                organic: r,\n                tokens: u,\n                position_data: v,\n                s_bootstrap_id: this._sBootstrapID,\n                options: o.auctionOptions,\n                variant: o.auctionOptions.rerankingStrategy\n            });\n            q.results = s;\n            this._data.inform(\"recordAuctionState\", {\n                organic: r,\n                auctionOptions: o.auctionOptions,\n                event_data: q\n            });\n        }.bind(this)),this._view.subscribe(\"highlight\", function(p, q) {\n            if (this._view.content) {\n                j.scry(this._view.content, \"a.report\").forEach(i.hide);\n            };\n            if (((!q.element || !q.selected) || !q.selected.s_token)) {\n                return\n            };\n            var r = j.scry(q.element, \"a.report\");\n            if (r.length) {\n                i.show(r[0]);\n            }\n             else j.appendContent(q.element, this._createHideAdLink(q.selected));\n        ;\n        }.bind(this)),];\n        this._globalSubscriptions = [h.subscribe(\"TypeaheadSearchSponsored/hideAdResult\", function(p, q) {\n            this._hiddenSponsoredEntities = (this._hiddenSponsoredEntities || {\n            });\n            this._hiddenSponsoredEntities[q.uid] = true;\n            this._hideReasonDialog = q.reason_dialog;\n            this._forceRefreshResults();\n        }.bind(this)),h.subscribe(\"TypeaheadSearchSponsored/undoHideAdResult\", function(p, q) {\n            if (this._hiddenSponsoredEntities) {\n                delete this._hiddenSponsoredEntities[q.uid];\n            };\n            if (this._hideReasonDialog) {\n                this._hideReasonDialog.hide();\n                this._hideReasonDialog = null;\n            }\n        ;\n            this._forceRefreshResults();\n        }.bind(this)),];\n    };\n    o.prototype.disable = function() {\n        this._dataSubscriptions.forEach(this._data.unsubscribe.bind(this._data));\n        this._dataSubscriptions = null;\n        this._viewSubscriptions.forEach(this._view.unsubscribe.bind(this._view));\n        this._viewSubscriptions = null;\n        this._globalSubscriptions.forEach(h.unsubscribe.bind(h));\n        this._globalSubscriptions = null;\n        this._data = null;\n        this._view = null;\n        this._sponsoredEntries = null;\n    };\n    o.prototype.runAuction = function(p, q, r, s) {\n        if ((p.length === 0)) {\n            return p\n        };\n        p = o.initResults(p);\n        if (!q) {\n            return p\n        };\n        var t = m.prepareAndSortAds(p, q, r);\n        if (this._typeahead) {\n            var u = this._typeahead.getData();\n            u.inform(\"recordAuctionState\", {\n                sorted_ads: t\n            });\n        }\n    ;\n        var v = {\n        }, w = p.map(function(ba) {\n            if (ba.s_categories) {\n                v[ba.uid] = ba.s_categories;\n            };\n            return String(ba.uid);\n        }), x = m.selectAds(w, v, t, s);\n        if ((x.length === 0)) {\n            return p\n        };\n        if (m.hasTopResult(p[0], x[0], s)) {\n            o.setTopResult(p);\n        };\n        var y = 0;\n        for (var z = 0; (z < x.length); ++z) {\n            if (!m.isSelfPromoted(x[z])) {\n                y++;\n            };\n        };\n        p.length = Math.min(p.length, (s.maxNumberResultsAndAds - y));\n        var aa = o.rerankAds(p, x, s);\n        return aa;\n    };\n    o.prototype._forceRefreshResults = function() {\n        if ((this._data && this._data.value)) {\n            this._data.respond(this._data.value, this._data.buildUids(this._data.value));\n        };\n    };\n    o.prototype._createHideAdLink = function(p) {\n        var q = new k(\"/ajax/emu/end.php\").addQueryData({\n            eid: p.s_token,\n            f: 0,\n            ui: (\"typeahead_\" + p.s_token.replace(\".\", \"_\")),\n            en: \"fad_hide\",\n            ed: \"true\",\n            a: 1\n        }).toString(), r = {\n            className: \"report\",\n            rel: \"dialog-post\",\n            href: \"#\",\n            ajaxify: q,\n            title: \"Hide the ad\"\n        }, s = j.create(\"a\", r);\n        g.listen(s, \"mouseover\", function(event) {\n            this._view.index = -1;\n            this._view.highlight(-1, false);\n            event.kill();\n        }.bind(this));\n        return s;\n    };\n    o.auctionOptions = {\n    };\n    o.query = null;\n    o.getOriginalOrganics = function(p) {\n        return p.map(function(q) {\n            return {\n                uid: q.uid,\n                text: q.text,\n                type: o.getRealType(q),\n                source: (q.bootstrapped ? 1 : 0),\n                index: q.index,\n                s_value: (q.s_value || 0),\n                s_categories: (q.s_categories || []),\n                score: q.score\n            };\n        });\n    };\n    o.setTopResult = function(p) {\n        p[0].renderTypeOverride = true;\n        p[0].orig_render_type = p[0].render_type;\n        p[0].render_type = \"tophit\";\n    };\n    o.finalizeAd = function(p, q, r) {\n        var s = \"Sponsored\";\n        p.rankType = ((p.rankType || p.render_type) || p.type);\n        if (m.isSelfPromoted(p)) {\n            q.s_token = p.s_token;\n            q.message = p.s_message;\n            if ((r.rerankingStrategy === 0)) {\n                q.subtextOverride = (q.subtext ? ((q.subtext + \" \\u00b7 \") + s) : s);\n            };\n            if (p.path) {\n                q.pathOverride = true;\n                q.orig_path = q.path;\n                q.path = p.path;\n            }\n        ;\n            q.is_self = true;\n        }\n         else {\n            p.message = p.s_message;\n            p.subtextOverride = null;\n            if ((r.rerankingStrategy === 0)) {\n                p.subtextOverride = (p.subtext ? ((p.subtext + \" \\u00b7 \") + s) : s);\n            };\n            if (r.debug) {\n                if ((!p.subtextOverride && p.subtext)) {\n                    p.subtextOverride = p.subtext;\n                };\n                if (p.subtextOverride) {\n                    p.subtextOverride += ((\" \\u00b7 (Debug: \" + q.text) + \")\");\n                }\n                 else p.subtextOverride = ((\"(Debug: \" + q.text) + \")\");\n            ;\n            }\n        ;\n            p.type = q.type;\n            p.render_type = q.render_type;\n            p.is_self = false;\n        }\n    ;\n    };\n    o.promoteSelfPromotedResultToTop = function(p, q, r, s) {\n        var t = p[q];\n        if ((q < r)) {\n            var u = \"Sponsored\";\n            t.subtextOverride = (t.subtext ? ((t.subtext + \" \\u00b7 \") + u) : u);\n            return;\n        }\n    ;\n        if ((q > r)) {\n            p.splice(r, 0, p.splice(q, 1)[0]);\n        };\n        t = p[r];\n        t.renderTypeOverride = true;\n        t.orig_render_type = t.render_type;\n        t.render_type = \"ownsection\";\n    };\n    o.insertAdToTop = function(p, q, r, s) {\n        p.splice(r, 0, q);\n        q.render_type = \"ownsection\";\n    };\n    o.rerankMethod5 = function(p, q, r) {\n        if ((r.rerankingStrategy != 5)) {\n            return\n        };\n        var s = m.getTopAdPosition(p, q, r), t = m.buildResultIndices(p);\n        for (var u = (q.length - 1); (u >= 0); u--) {\n            var v = q[u], w = t[v.selected_target_id], x = p[w];\n            o.finalizeAd(v, x, r);\n            if (m.isSelfPromoted(v)) {\n                o.promoteSelfPromotedResultToTop(p, w, s, r);\n            }\n             else o.insertAdToTop(p, v, s, r);\n        ;\n            t = m.buildResultIndices(p);\n        };\n    };\n    o.rerankAds = function(p, q, r) {\n        switch (r.rerankingStrategy) {\n          case 5:\n            o.rerankMethod5(p, q, r);\n            break;\n          default:\n            break;\n        };\n        p.length = Math.min(p.length, r.maxNumberResultsAndAds);\n        return p;\n    };\n    o.initResults = function(p) {\n        var q = p.length;\n        for (var r = 0; (r < q); r++) {\n            var s = p[r];\n            s.is_self = null;\n            s.s_token = null;\n            s.message = null;\n            s.subtextOverride = null;\n            if (s.pathOverride) {\n                s.path = s.orig_path;\n                s.pathOverride = false;\n            }\n        ;\n            if (s.renderTypeOverride) {\n                s.render_type = s.orig_render_type;\n                s.renderTypeOverride = false;\n            }\n        ;\n            s.rankType = ((s.rankType || s.render_type) || s.type);\n        };\n        return p;\n    };\n    o.setAuctionOptions = function(p) {\n        l(o.auctionOptions, p);\n    };\n    o.getRealType = function(p) {\n        if (p.renderTypeOverride) {\n            return (p.orig_render_type || p.type)\n        };\n        return (p.render_type || p.type);\n    };\n    o.hideAdResult = function(p, q) {\n        h.inform(\"TypeaheadSearchSponsored/hideAdResult\", {\n            uid: p,\n            reason_dialog: q\n        });\n    };\n    o.undoHideAdResult = function(p) {\n        h.inform(\"TypeaheadSearchSponsored/undoHideAdResult\", {\n            uid: p\n        });\n    };\n    o.Ad = function() {\n    \n    };\n    l(o.prototype, {\n        _dataSubscriptions: null,\n        _viewSubscriptions: null,\n        _globalSubscriptions: null,\n        _data: null,\n        _view: null,\n        _sponsoredEntries: null,\n        _hiddenSponsoredEntities: null,\n        _hideReasonDialog: null,\n        _sBootstrapID: null,\n        _organicECPM: null\n    });\n    e.exports = o;\n});\n__d(\"SearchDataSource\", [\"Event\",\"Arbiter\",\"AsyncResponse\",\"DataSource\",\"HashtagSearchResultUtils\",\"copyProperties\",\"createArrayFrom\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncResponse\"), j = b(\"DataSource\"), k = b(\"HashtagSearchResultUtils\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"BingScalingCommon\");\n    for (var o in j) {\n        if ((j.hasOwnProperty(o) && (o !== \"_metaprototype\"))) {\n            q[o] = j[o];\n        };\n    };\n    var p = ((j === null) ? null : j.prototype);\n    q.prototype = Object.create(p);\n    q.prototype.constructor = q;\n    q.__superConstructor__ = j;\n    function q(r) {\n        this._token = (r.token || \"\");\n        this._lazyonload = ((r.lazyonload === false) ? false : true);\n        this._extraTypes = r.extraTypes;\n        this._buckets = r.buckets;\n        this._noMultiFetch = (r.noMultiFetch || false);\n        this._maxWebSuggToCountFetchMore = (r.maxWebSuggToCountFetchMore || 0);\n        var s = (r.maxResults || 8);\n        j.call(this, r);\n        this._numResults = {\n            min: 3,\n            max: s\n        };\n        this.recordingRoute = (r.recordingRoute || \"non_banzai\");\n        this._enabledHashtag = (r.enabledHashtag || false);\n        this.logBackendQueriesWindow = (r.logBackendQueriesWindow || 25);\n        this._minWebSugg = (r.minWebSugg || 2);\n        this._queryToWebSuggState = {\n        };\n        this._genTime = r.genTime;\n    };\n    q.prototype.init = function() {\n        p.init.call(this);\n        this._leanPayload = null;\n        this._bootstrapRequestsPending = 0;\n        this._criticalOnly = true;\n        this._updateMaxResults();\n        g.listen(window, \"resize\", this._updateMaxResults.bind(this));\n        this.complexChars = new RegExp(\"[\\uff66-\\uffdd\\u4e00-\\u9fcc\\u3400-\\u4dbf]\");\n    };\n    q.prototype.dirty = function() {\n        p.dirty.call(this);\n        this._fetchOnUseRequests = [];\n    };\n    q.prototype.asyncErrorHandler = function(r) {\n        if (((window.Dialog && (window.Dialog.getCurrent() == null)) && (r.getError() == 1400003))) {\n            i.verboseErrorHandler(r);\n        };\n    };\n    q.prototype.fetch = function(r, s, t) {\n        t = (t || {\n        });\n        t.fetch_start = Date.now();\n        p.fetch.call(this, r, s, t);\n    };\n    q.prototype.fetchHandler = function(r, s) {\n        var t = r.getPayload(), u = l({\n            fetch_end: Date.now()\n        }, s), v = (u.value ? h.BEHAVIOR_EVENT : h.BEHAVIOR_PERSISTENT);\n        this.inform(\"beginFetchHandler\", {\n            response: r\n        });\n        if ((s.type == \"lean\")) {\n            this._leanPayload = t;\n            this._processLean();\n        }\n         else {\n            if (t.coeff2_ts) {\n                u.coeff2_ts = t.coeff2_ts;\n            };\n            var w = {\n                limit: ((typeof t.webSuggLimit !== \"undefined\") ? t.webSuggLimit : 6),\n                showOnTop: ((typeof t.webSuggOnTop !== \"undefined\") ? t.webSuggOnTop : false)\n            };\n            this._queryToWebSuggState[s.value] = w;\n            p.fetchHandler.call(this, r, s);\n            if ((s.bootstrap && !r.getRequest().getData().no_cache)) {\n                u.browserCacheHit = ((t.timestamp < this._genTime));\n            };\n            if (((s.bootstrap && !t.no_data) && (this._bootstrapRequestsPending > 0))) {\n                s.bootstrap = false;\n                --this._bootstrapRequestsPending;\n                (!this._bootstrapRequestsPending && this._bootstrapPostProcess());\n            }\n        ;\n            if (((t.no_data || t.stale) || (t.token !== this._token))) {\n                var x = l({\n                }, r.getRequest().getData());\n                if (x.lazy) {\n                    delete x.lazy;\n                    x.token = this._token;\n                    this._fetchOnUse(x, s);\n                }\n            ;\n            }\n        ;\n        }\n    ;\n        this.inform(\"endpointStats\", u, v);\n    };\n    q.prototype.respond = function(r, s, t) {\n        this.inform(\"respondValidUids\", s);\n        this.inform(\"reorderResults\", s);\n        var u = this.buildData(s, r);\n        u.forEach(function(v, w) {\n            v.origIndex = w;\n        });\n        this.inform(\"respond\", {\n            value: r,\n            results: u,\n            isAsync: !!t\n        });\n        return u;\n    };\n    q.prototype.buildData = function(r, s) {\n        if ((!r || (r.length === 0))) {\n            return []\n        };\n        var t = this.getWebSuggState(s), u = t.showOnTop, v = n.integrateWebsuggestions(r.map(this.getEntry.bind(this)), Boolean(u), this._maxResults, t.limit);\n        v.length = Math.min(v.length, this._maxResults);\n        return v;\n    };\n    q.prototype.getWebSuggState = function(r) {\n        while (r) {\n            var s = this._queryToWebSuggState[r];\n            if ((typeof s !== \"undefined\")) {\n                return s\n            };\n            r = r.slice(0, (r.length - 1));\n        };\n        return {\n            limit: 0,\n            showOnTop: false\n        };\n    };\n    q.prototype._isQueryTooShort = function(r) {\n        return ((r.length < this._minQueryLength) && !((this.complexChars && this.complexChars.test(r))));\n    };\n    q.prototype.shouldFetchMoreResults = function(r) {\n        var s = 0, t = 0;\n        r.forEach(function(u) {\n            if (((u.type !== \"websuggestion\") || (t++ < this._maxWebSuggToCountFetchMore))) {\n                s++;\n            };\n        }.bind(this));\n        return (s < this._maxResults);\n    };\n    q.prototype._bootstrapPostProcess = function() {\n        var r = {\n            time: Date.now()\n        };\n        this.inform(\"bootstrapped\", r, h.BEHAVIOR_PERSISTENT);\n        this._processLean();\n    };\n    q.prototype._processLean = function() {\n        if (this._leanPayload) {\n            var r, s = this._leanPayload.entries;\n            for (var t in s) {\n                r = this.getEntry(t);\n                (r && (r.index = s[t]));\n            };\n            this.setExclusions(this._leanPayload.blocked);\n            this._leanPayload = null;\n        }\n    ;\n    };\n    q.prototype._updateMaxResults = function() {\n        var r = (window.innerHeight || document.documentElement.clientHeight);\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, Math.ceil((2 + ((((r - 370)) / 56)))))));\n    };\n    q.prototype._bootstrapFetch = function(r, s) {\n        var t = l(s, this.bootstrapData);\n        if ((this._criticalOnly && this._lazyonload)) {\n            t.lazy = 1;\n        };\n        this.fetch(this.bootstrapEndpoint, t, {\n            bootstrap: true,\n            type: r\n        });\n        ++this._bootstrapRequestsPending;\n    };\n    q.prototype._fetchOnUse = function(r, s) {\n        for (var t in this.bootstrapData) {\n            (!r.hasOwnProperty(t) && (r[t] = this.bootstrapData[t]));;\n        };\n        if (this._criticalOnly) {\n            this._fetchOnUseRequests.push({\n                args: r,\n                ctx: s\n            });\n        }\n         else this.fetch(this.bootstrapEndpoint, r, s);\n    ;\n    };\n    q.prototype._fetchLean = function() {\n        var r = {\n            no_cache: 1\n        };\n        r.options = m(r.options);\n        r.options.push(\"lean\");\n        this._fetchOnUse(r, {\n            type: \"lean\"\n        });\n    };\n    q.prototype.bootstrap = function(r) {\n        if (!r) {\n            this._criticalOnly = false;\n            this._flushFetchOnUseRequests();\n        }\n    ;\n        if (this._bootstrapped) {\n            return\n        };\n        var s = {\n            filter: [\"event\",],\n            no_cache: 1\n        };\n        this._fetchOnUse(s, {\n            type: \"event\"\n        });\n        var t = [\"app\",\"page\",\"group\",\"friendlist\",];\n        t = t.concat((this._extraTypes || []));\n        if (this._noMultiFetch) {\n            t.push(\"user\");\n            this._bootstrapFetch(\"user\", {\n                filter: t\n            });\n        }\n         else {\n            this._bootstrapFetch(\"other\", {\n                filter: t\n            });\n            if (this._buckets) {\n                for (var u = 0; (u < this._buckets.length); ++u) {\n                    var v = {\n                        filter: [\"user\",],\n                        buckets: this._buckets[u]\n                    };\n                    this._bootstrapFetch(\"user\", v);\n                };\n            }\n             else this._bootstrapFetch(\"user\", {\n                filter: [\"user\",]\n            });\n        ;\n        }\n    ;\n        this._fetchLean();\n        this._bootstrapped = true;\n    };\n    q.prototype._flushFetchOnUseRequests = function() {\n        var r = this._fetchOnUseRequests.length;\n        for (var s = 0; (s < r); ++s) {\n            var t = this._fetchOnUseRequests[s];\n            this.fetch(this.bootstrapEndpoint, t.args, t.ctx);\n        };\n        if ((r > 0)) {\n            this.inform(\"extra_bootstrap\", {\n                time: Date.now()\n            }, h.BEHAVIOR_PERSISTENT);\n        };\n        this._fetchOnUseRequests = [];\n    };\n    q.prototype.onLoad = function(r, s) {\n        this.inform(\"onload\", {\n            time: Date.now()\n        }, h.BEHAVIOR_PERSISTENT);\n        if (r) {\n            this.bootstrap.bind(this, s).defer();\n        };\n    };\n    q.prototype.mergeUids = function(r, s, t, u) {\n        var v = this.getDynamicHashtagResult(u);\n        if (((u && v) && (s.indexOf(v) <= 0))) {\n            s.unshift(v);\n        };\n        var w = (t[0] ? this.getEntry(t[0]) : null), x = (s[0] ? this.getEntry(s[0]) : null), y = (((w && w.replace_results)) ? w : null);\n        y = ((((!y && x) && x.replace_results)) ? x : y);\n        var z = p.mergeUids.call(this, r, s, t, u);\n        if (y) {\n            this.inform(\"backend_topreplace\", {\n            });\n            return this.deduplicateByKey([y.uid,].concat(z));\n        }\n    ;\n        return z;\n    };\n    q.prototype.getTextToIndexFromFields = function(r, s) {\n        var t = [], u = (r.tokenVersion === \"v2\");\n        for (var v = 0; (v < s.length); ++v) {\n            if ((u && (((s[v] === \"text\") || (s[v] === \"alias\"))))) {\n                continue;\n            };\n            var w = r[s[v]];\n            if (w) {\n                t.push((w.join ? w.join(\" \") : w));\n            };\n        };\n        return t.join(\" \");\n    };\n    q.prototype.getDynamicHashtagResult = function(r) {\n        if ((!r || !this._enabledHashtag)) {\n            return\n        };\n        var s = k.getHashtagFromQuery(r);\n        if (!s) {\n            return\n        };\n        var t = (\"hashtag:\" + s), u = this.getEntry(t);\n        if (!u) {\n            this.processEntries([k.makeTypeaheadResult(s),], r);\n        };\n        return t;\n    };\n    e.exports = q;\n});\n__d(\"SearchTypeaheadRecorder\", [\"Event\",\"AsyncRequest\",\"Banzai\",\"Keys\",\"TokenizeUtil\",\"Vector\",\"ge\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"Banzai\"), j = b(\"Keys\"), k = b(\"TokenizeUtil\"), l = b(\"Vector\"), m = b(\"ge\"), n = b(\"clickRefAction\"), o = b(\"copyProperties\"), p = b(\"userAction\");\n    function q(s) {\n        this.init(s);\n        this.initEvents();\n    };\n    q.prototype.init = function(s) {\n        this.core = s.getCore();\n        this.data = s.getData();\n        this.view = s.getView();\n        this.element = this.core.getElement();\n        this.initTime = Date.now();\n        this._onloadTime = 0;\n        this._extraRecorder = [];\n        var t = m(\"search_first_focus\");\n        this.initStartTime = (t && t.value);\n        this.bootstrapStats = {\n            bootstrapped: 0\n        };\n        this._reset();\n    };\n    q.prototype._reset = function() {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n        this._reorderInfo = null;\n        var s = Math.random().toString();\n        this.data.setQueryData({\n            sid: s\n        });\n        this.view.setSid(s);\n        this.recordStat(\"sid\", s);\n        this.recordStat(\"keypressed\", 0);\n    };\n    q.prototype.initEvents = function() {\n        this.core.subscribe(\"focus\", function(event) {\n            if (!this.stats.session_start_time) {\n                this.recordStat(\"session_start_time\", Date.now());\n            };\n        }.bind(this));\n        this.core.subscribe(\"blur\", function(event) {\n            var s = Date.now();\n            for (var t in this._inflightRequests) {\n                var u = this._inflightRequests[t], v = (s - u);\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", v);\n            };\n            this.recordStat(\"session_end_time\", s);\n            this.submit();\n        }.bind(this));\n        this.view.subscribe(\"select\", function(s, t) {\n            this.recordSelectInfo(t);\n        }.bind(this));\n        this.view.subscribe(\"render\", function(s, t) {\n            this.recordRender(t);\n        }.bind(this));\n        this.view.subscribe(\"recordAfterReorder\", function(s, t) {\n            this._reorderInfo = o(this._reorderInfo, t);\n        }.bind(this));\n        this.data.subscribe(\"activity\", function(s, t) {\n            this.recordStat(\"pending_request\", t.activity);\n        }.bind(this));\n        this.data.subscribe(\"respondValidUids\", function(s, t) {\n            this.validUids = t.slice(0);\n        }.bind(this));\n        this.data.subscribe(\"beforeQuery\", function(s, t) {\n            if (!t.value) {\n                this.query = \"\";\n                this.results = [];\n                return;\n            }\n        ;\n            if (!this.stats.first_query_time) {\n                this.recordStat(\"first_query_time\", Date.now());\n            };\n            this.query = t.value;\n            this.recordCountStat(\"num_queries\");\n        }.bind(this));\n        this.data.subscribe(\"queryEndpoint\", function(s, t) {\n            this.recordCountStat(\"num_search_ajax_requests\");\n            this.recordAvgStat(\"endpoint_query_length\", t.value.length);\n            this._inflightRequests[t.value] = Date.now();\n        }.bind(this));\n        this.data.subscribe(\"onload\", function(s, t) {\n            this._onloadTime = t.time;\n        }.bind(this));\n        this.data.subscribe(\"bootstrapped\", function(s, t) {\n            this.bootstrapStats.endTime = t.time;\n            this.bootstrapStats.bootstrapped = 1;\n        }.bind(this));\n        this.core.subscribe(\"recordFunction\", function(s, t) {\n            this._extraRecorder.push(t);\n        }.bind(this));\n        this.data.subscribe(\"endpointStats\", function(s, t) {\n            var u = (t.fetch_end - t.fetch_start);\n            if (t.value) {\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", u);\n            }\n             else this.bootstrapStats[t.type] = u;\n        ;\n            if (t.coeff2_ts) {\n                this.bootstrapStats.coeff2_ts = t.coeff2_ts;\n            };\n            if ((typeof t.browserCacheHit != \"undefined\")) {\n                this.recordCountStat((t.browserCacheHit ? \"bootstrap_cachehits\" : \"bootstrap_cachemisses\"));\n            };\n            if (this._inflightRequests[t.value]) {\n                delete this._inflightRequests[t.value];\n            };\n        }.bind(this));\n        this.data.subscribe(\"query\", function(s, t) {\n            this.recordAvgStat(\"num_results_from_cache\", t.results.length);\n        }.bind(this));\n        this.data.subscribe(\"backend_topreplace\", function(s, t) {\n            if ((false === this._topreplace)) {\n                this.recordStat(\"backend_topreplace\", 1);\n                this._topreplace = true;\n            }\n        ;\n        }.bind(this));\n        g.listen(this.element, \"keydown\", function(event) {\n            this.recordStat(\"keypressed\", 1);\n            if ((g.getKeyCode(event) == j.BACKSPACE)) {\n                if ((!this._backspacing && this.query)) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.query);\n                }\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"beforeFetch\", function(s, t) {\n            var u = t.request.data.value;\n            if (!u) {\n                return\n            };\n            this.backendQueries.push(u);\n        }.bind(this));\n    };\n    q.prototype.recordStat = function(s, t) {\n        this.stats[s] = t;\n    };\n    q.prototype.recordCountStat = function(s) {\n        var t = this.stats[s];\n        this.stats[s] = (t ? (t + 1) : 1);\n    };\n    q.prototype.recordAvgStat = function(s, t) {\n        if (this.avgStats[s]) {\n            this.avgStats[s][0] += t;\n            ++this.avgStats[s][1];\n        }\n         else this.avgStats[s] = [t,1,];\n    ;\n    };\n    q.prototype.recordAppendStat = function(s, t) {\n        if (!this.appendStats.hasOwnProperty(s)) {\n            this.appendStats[s] = [];\n        };\n        this.appendStats[s].push(t);\n    };\n    q.prototype.recordRender = function(s) {\n        this.results = s.filter(function(u) {\n            return ((((u.uid != \"search\") && (u.type != \"disabled_result\")) && (u.type != \"header\")));\n        }).map(function(u) {\n            return o(null, u);\n        });\n        var t = l.getViewportDimensions();\n        this.recordStat(\"window_size_width\", t.x);\n        this.recordStat(\"window_size_height\", t.y);\n        if (((this.results.length > 0) && !this.stats.first_result_time)) {\n            this.recordStat(\"first_result_time\", Date.now());\n        };\n    };\n    q.prototype.recordSelectInfo = function(s) {\n        var t = s.selected, u = s.index;\n        if ((t.groupIndex !== undefined)) {\n            u = ((s.index - t.groupIndex) - 1);\n        };\n        var v = {\n            href: t.path\n        }, w = (t.dataGT ? {\n            gt: JSON.parse(t.dataGT)\n        } : {\n        });\n        n(\"click\", v, null, null, w);\n        p(\"search\").uai(\"click\");\n        if ((t.uid == \"search\")) {\n            this.recordStat(\"selected_search\", 1);\n        }\n         else if ((t.uid == \"invite\")) {\n            this.recordStat(\"selected_invite\", 1);\n        }\n         else {\n            var x = ((t.rankType || t.render_type) || t.type), y = (((x == \"friend\") ? \"user\" : x));\n            this.recordStat((\"selected_\" + y), 1);\n            this.recordStat(\"selected_position\", u);\n            this.recordStat(\"selected_type\", x);\n            this.recordStat(\"selected_name_length\", t.text.length);\n            this.recordStat(\"selected_id\", t.uid);\n            this.recordStat(\"selected_degree\", (t.bootstrapped ? 1 : 2));\n            var z = k.parse(this.data.getTextToIndex(t)).tokens, aa = r(z, this.query);\n            if (aa) {\n                this.recordStat(\"matched_terms\", aa);\n            };\n        }\n        \n    ;\n        var ba = {\n        };\n        this._extraRecorder.forEach(function(ca) {\n            ca(s, this.results, ba);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(ba));\n        if ((t.type === \"websuggestion\")) {\n            this.recordStat(\"selected_memcached_websuggestion\", t.fromMemcache);\n            this.recordStat(\"selected_websuggestion_source\", t.websuggestion_source);\n        }\n    ;\n        this.recordStat(\"selected_with_mouse\", (s.clicked ? 1 : 0));\n    };\n    q.prototype._dataToSubmit = function() {\n        this.recordStat(\"candidate_results\", this.buildResults());\n        this.recordStat(\"query\", this.query);\n        this.recordStat(\"init_time\", this.initTime);\n        if (this.initStartTime) {\n            this.recordStat(\"init_start_time\", this.initStartTime);\n            this.recordStat(\"onload_time\", this._onloadTime);\n            this.initStartTime = 0;\n        }\n    ;\n        this.recordStat(\"bootstrapped\", this.bootstrapStats.bootstrapped);\n        if (this.bootstrapStats.endTime) {\n            this.recordStat(\"bootstrapped_time\", this.bootstrapStats.endTime);\n            this.recordStat(\"user_bootstrap_ms\", this.bootstrapStats.user);\n            this.recordStat(\"other_bootstrap_ms\", this.bootstrapStats.other);\n            this.bootstrapStats.endTime = 0;\n        }\n    ;\n        this.recordStat(\"coeff2_ts\", this.bootstrapStats.coeff2_ts);\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if ((this.backendQueries.length > 0)) {\n            if ((this.backendQueries.length > this.data.logBackendQueriesWindow)) {\n                this.backendQueries = this.backendQueries.slice((this.backendQueries.length - this.data.logBackendQueriesWindow));\n            };\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n        if (this._reorderInfo) {\n            var s = this._reorderInfo;\n            s.organic.forEach(function(x) {\n                delete x.text;\n            });\n            this.recordStat(\"s_count\", s.position_data.length);\n            this.recordStat(\"s_bootstrap_id\", s.s_bootstrap_id);\n            this.recordStat(\"s_organic_results\", JSON.stringify(s.organic));\n            this.recordStat(\"s_candidate_tokens\", JSON.stringify(s.tokens));\n            this.recordStat(\"s_positions\", JSON.stringify(s.position_data));\n            this.recordStat(\"s_options\", JSON.stringify(s.options));\n            this.recordStat(\"s_variant\", JSON.stringify(s.variant));\n        }\n    ;\n        var t = this.stats;\n        for (var u in this.avgStats) {\n            var v = this.avgStats[u];\n            t[u] = (v[0] / v[1]);\n        };\n        for (var w in this.appendStats) {\n            t[w] = JSON.stringify(this.appendStats[w]);;\n        };\n        return t;\n    };\n    q.prototype.buildResults = function() {\n        var s = ((this.results || [])).map(function(t, u) {\n            var v = k.parse(this.data.getTextToIndex(t)).tokens, w = ((t.rankType || t.render_type) || t.type), x = (t.bootstrapped ? 1 : 0), y = (t.s_token || \"\"), z = (r(v, this.query) || this.query), aa = t.index_rank, ba = t.match_type, ca = t.l_type, da = t.vertical_type, ea = t.prefix_match, fa = t.prefix_length;\n            if ((typeof t.groupIndex == \"number\")) {\n                return [t.groupIndex,t.indexInGroup,t.uid,w,x,y,z,aa,ba,ea,fa,t.origIndex,ca,da,]\n            };\n            return [0,u,t.uid,w,x,y,z,aa,ba,ea,fa,t.origIndex,ca,da,];\n        }.bind(this));\n        return JSON.stringify(s);\n    };\n    q.prototype.submit = function() {\n        var s = this._dataToSubmit();\n        switch (this.data.recordingRoute) {\n          case \"double_recording\":\n            if ((Math.random() > 105176)) {\n                s.recorded_first = \"legacy\";\n                setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n            }\n             else {\n                s.recorded_first = \"banzai\";\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n                setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n            }\n        ;\n            break;\n          case \"random_recording\":\n            if ((Math.random() > 105500)) {\n                this.submitThroughAsyncRequest(s);\n            }\n             else i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n        ;\n            break;\n          case \"banzai_basic\":\n            i.post(this._banzaiRoute, s);\n            break;\n          case \"banzai_vital\":\n            i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n            break;\n          default:\n            this.submitThroughAsyncRequest(s);\n        };\n        this._reset();\n    };\n    q.prototype.submitThroughAsyncRequest = function(s) {\n        if ((Object.keys(s).length > 0)) {\n            new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                stats: s\n            }).setOption(\"handleErrorAfterUnload\", true).setErrorHandler(function(t) {\n                s.retry = true;\n                new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                    stats: s\n                }).setOption(\"asynchronous\", false).send();\n            }.bind(this)).send();\n        };\n    };\n    var r = function(s, t) {\n        var u = k.parse(t);\n        if ((u.flatValue[(u.flatValue.length - 1)] === \" \")) {\n            return u.flatValue\n        };\n        var v = u.tokens[(u.tokens.length - 1)], w = {\n        };\n        s.forEach(function(ba) {\n            w[ba] = (((w[ba] || 0)) + 1);\n        });\n        var x = {\n        }, y = u.tokens.slice(0, (u.tokens.length - 1));\n        y.forEach(function(ba) {\n            x[ba] = (((x[ba] || 0)) + 1);\n        });\n        for (var z = 0; (z < s.length); ++z) {\n            var aa = s[z];\n            if (((aa.indexOf(v) === 0) && (((w[aa] - ((x[aa] || 0))) > 0)))) {\n                y.push(aa);\n                return y.join(\" \");\n            }\n        ;\n        };\n        return undefined;\n    };\n    o(q.prototype, {\n        _endPoint: \"/ajax/typeahead/record_metrics.php\",\n        _banzaiRoute: \"search\"\n    });\n    e.exports = q;\n});\n__d(\"LayerSlowlyFadeOnShow\", [\"Class\",\"LayerFadeOnShow\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LayerFadeOnShow\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n    g.extend(j, h);\n    j.prototype._getDuration = i.thatReturns(500);\n    e.exports = j;\n});");
// 9128
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s5f7fb1571d9ddaabf0918a66ba121ad96869441c");
// 9129
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"+P3v8\",]);\n}\n;\n;\n__d(\"FriendBrowserCheckboxController\", [\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"Form\",\"OnVisible\",\"$\",\"bind\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"Form\"), l = b(\"OnVisible\"), m = b(\"$\"), n = b(\"bind\"), o = b(\"copyProperties\"), p = b(\"ge\");\n    function q() {\n    \n    };\n;\n    o(q, {\n        instances: {\n        },\n        getInstance: function(r) {\n            return this.instances[r];\n        }\n    });\n    o(q.prototype, {\n        init: function(r, s, t, u) {\n            q.instances[r] = this;\n            this._id = r;\n            this._simplified = t;\n            this._infiniteScroll = u;\n            this._form = s;\n            this._contentGrid = i.JSBNG__find(s, \".friendBrowserCheckboxContentGrid\");\n            this._loadingIndicator = i.JSBNG__find(s, \".friendBrowsingCheckboxContentLoadingIndicator\");\n            this._checkboxResults = i.JSBNG__find(s, \".friendBrowserCheckboxResults\");\n            this._contentPager = i.JSBNG__find(s, \".friendBrowserCheckboxContentPager\");\n            this.numGetNewRequests = 0;\n            this.queuedRequests = {\n            };\n            j.listen(this._form, \"submit\", this.onFormSubmit.bind(this));\n        },\n        addTypeahead: function(r, s) {\n            r.subscribe(\"select\", this.onHubSelect.bind(this, r, s));\n            if (this._simplified) {\n                r.subscribe(\"unselect\", this.onHubSelect.bind(this, r, s));\n            }\n        ;\n        ;\n        },\n        onFormSubmit: function() {\n            this.getNew(true);\n            return false;\n        },\n        addSelector: function(r) {\n            r.subscribe(\"change\", this.getNew.bind(this, false));\n        },\n        onHubSelect: function(r, s, JSBNG__event, t) {\n            if (this._simplified) {\n                this.getNew(true);\n                return;\n            }\n        ;\n        ;\n            if (!((((JSBNG__event == \"select\")) && t.selected))) {\n                return;\n            }\n        ;\n        ;\n            var u = this.buildNewCheckbox(s, t.selected.text, t.selected.uid), v = i.JSBNG__find(this._form, ((\".checkboxes_\" + s)));\n            i.appendContent(v.firstChild, u);\n            var w = i.scry(r.getElement(), \"input[type=\\\"button\\\"]\");\n            if (((w && w[0]))) {\n                w[0].click();\n            }\n        ;\n        ;\n            this.getNew(true);\n        },\n        buildNewCheckbox: function(r, s, t) {\n            var u = ((((r + \"_ids_\")) + t)), v = ((r + \"_ids[]\")), w = i.create(\"input\", {\n                id: u,\n                type: \"checkbox\",\n                value: t,\n                JSBNG__name: v,\n                checked: true\n            });\n            j.listen(w, \"click\", n(this, \"getNew\", false));\n            var x = i.create(\"td\", null, w);\n            h.addClass(x, \"vTop\");\n            h.addClass(x, \"hLeft\");\n            var y = i.create(\"label\", null, s), z = i.create(\"td\", null, y);\n            h.addClass(z, \"vMid\");\n            h.addClass(z, \"hLeft\");\n            var aa = i.create(\"tr\");\n            aa.appendChild(x);\n            aa.appendChild(z);\n            return aa;\n        },\n        showMore: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (!r) {\n                return false;\n            }\n        ;\n        ;\n            if (h.hasClass(r, \"async_saving\")) {\n                return false;\n            }\n        ;\n        ;\n            var s = this.numGetNewRequests, t = k.serialize(this._form);\n            t.show_more = true;\n            var u = new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(v) {\n                this.showMoreHandler(v, s);\n            })).setStatusElement(r).send();\n        },\n        showMoreHandler: function(r, s) {\n            if (((s == this.numGetNewRequests))) {\n                var t = r.payload;\n                i.appendContent(this._contentGrid, t.results);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        ;\n        },\n        getNew: function(r) {\n            this.numGetNewRequests++;\n            var s = this.numGetNewRequests;\n            h.addClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n            if (p(\"friendBrowserCI\")) {\n                h.addClass(m(\"friendBrowserCI\"), \"friendBrowserCheckboxContentOnload\");\n            }\n        ;\n        ;\n            h.show(this._loadingIndicator);\n            var t = k.serialize(this._form);\n            t.used_typeahead = r;\n            new g().setURI(\"/ajax/growth/friend_browser/checkbox.php\").setData(t).setHandler(n(this, function(u) {\n                this.getNewHandler(u, s);\n            })).send();\n        },\n        getNewHandler: function(r, s) {\n            if (((s == this.numGetNewRequests))) {\n                var t = r.payload;\n                i.setContent(this._contentGrid, t.results);\n                h.removeClass(this._checkboxResults, \"friendBrowserCheckboxContentOnload\");\n                if (p(\"friendBrowserCI\")) {\n                    h.hide(m(\"friendBrowserCI\"));\n                }\n            ;\n            ;\n                h.hide(this._loadingIndicator);\n                this.updatePagerAndExtraData(t.pager, t.extra_data);\n            }\n        ;\n        ;\n        },\n        updatePagerAndExtraData: function(r, s) {\n            i.setContent(this._contentPager, r);\n            if (this._infiniteScroll) {\n                this.setupOnVisible();\n            }\n        ;\n        ;\n            i.replace(this._form.elements.extra_data, s);\n        },\n        setupOnVisible: function() {\n            var r = i.scry(this._contentPager, \".friendBrowserMorePager\")[0];\n            if (((r && ((this._id != \"jewel\"))))) {\n                ((this._onVisible && this._onVisible.remove()));\n                this._onVisible = new l(r, n(this, \"showMore\"), false, 1000);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = q;\n});\n__d(\"FacebarResultStoreUtils\", [], function(a, b, c, d, e, f) {\n    var g = {\n        processEntityResult: function(h, i, j, k) {\n            var l = {\n                semantic: i.toString(),\n                structure: [{\n                    type: ((\"ent:\" + h)),\n                    text: j,\n                    uid: i\n                },],\n                type: ((((\"{\" + h)) + \"}\")),\n                cost: k,\n                cache_id_length: 0,\n                bolding: []\n            };\n            l.tuid = JSON.stringify({\n                semantic: l.semantic,\n                structure: l.structure\n            });\n            return l;\n        },\n        getRawTextFromStructured: function(h) {\n            var i = \"\";\n            h.forEach(function(j, k) {\n                i += j.getText();\n            });\n            return i;\n        }\n    };\n    e.exports = g;\n});\n__d(\"HashtagParser\", [\"URLMatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"URLMatcher\"), h = 100, i = 30, j = /@\\[([0-9]+):([0-9]+):((?:[^\\\\\\]]*(?:\\\\.)*)*)\\]/g;\n    function k() {\n        var da = ((((((((((((((((((((((((((((((((\"\\u00c0-\\u00d6\" + \"\\u00d8-\\u00f6\")) + \"\\u00f8-\\u00ff\")) + \"\\u0100-\\u024f\")) + \"\\u0253-\\u0254\")) + \"\\u0256-\\u0257\")) + \"\\u0259\")) + \"\\u025b\")) + \"\\u0263\")) + \"\\u0268\")) + \"\\u026f\")) + \"\\u0272\")) + \"\\u0289\")) + \"\\u028b\")) + \"\\u02bb\")) + \"\\u0300-\\u036f\")) + \"\\u1e00-\\u1eff\")), ea = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\"\\u0400-\\u04ff\" + \"\\u0500-\\u0527\")) + \"\\u2de0-\\u2dff\")) + \"\\ua640-\\ua69f\")) + \"\\u0591-\\u05bf\")) + \"\\u05c1-\\u05c2\")) + \"\\u05c4-\\u05c5\")) + \"\\u05c7\")) + \"\\u05d0-\\u05ea\")) + \"\\u05f0-\\u05f4\")) + \"\\ufb12-\\ufb28\")) + \"\\ufb2a-\\ufb36\")) + \"\\ufb38-\\ufb3c\")) + \"\\ufb3e\")) + \"\\ufb40-\\ufb41\")) + \"\\ufb43-\\ufb44\")) + \"\\ufb46-\\ufb4f\")) + \"\\u0610-\\u061a\")) + \"\\u0620-\\u065f\")) + \"\\u066e-\\u06d3\")) + \"\\u06d5-\\u06dc\")) + \"\\u06de-\\u06e8\")) + \"\\u06ea-\\u06ef\")) + \"\\u06fa-\\u06fc\")) + \"\\u06ff\")) + \"\\u0750-\\u077f\")) + \"\\u08a0\")) + \"\\u08a2-\\u08ac\")) + \"\\u08e4-\\u08fe\")) + \"\\ufb50-\\ufbb1\")) + \"\\ufbd3-\\ufd3d\")) + \"\\ufd50-\\ufd8f\")) + \"\\ufd92-\\ufdc7\")) + \"\\ufdf0-\\ufdfb\")) + \"\\ufe70-\\ufe74\")) + \"\\ufe76-\\ufefc\")) + \"\\u200c-\\u200c\")) + \"\\u0e01-\\u0e3a\")) + \"\\u0e40-\\u0e4e\")) + \"\\u1100-\\u11ff\")) + \"\\u3130-\\u3185\")) + \"\\ua960-\\ua97f\")) + \"\\uac00-\\ud7af\")) + \"\\ud7b0-\\ud7ff\")) + \"\\uffa1-\\uffdc\")), fa = String.fromCharCode, ga = ((((((((((((((((((((((((((((((((\"\\u30a1-\\u30fa\\u30fc-\\u30fe\" + \"\\uff66-\\uff9f\")) + \"\\uff10-\\uff19\\uff21-\\uff3a\")) + \"\\uff41-\\uff5a\")) + \"\\u3041-\\u3096\\u3099-\\u309e\")) + \"\\u3400-\\u4dbf\")) + \"\\u4e00-\\u9fff\")) + fa(173824))) + \"-\")) + fa(177983))) + fa(177984))) + \"-\")) + fa(178207))) + fa(194560))) + \"-\")) + fa(195103))) + \"\\u3003\\u3005\\u303b\")), ha = ((((da + ea)) + ga)), ia = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\"A-Za-z\\u00aa\\u00b5\\u00ba\\u00c0-\\u00d6\\u00d8-\\u00f6\" + \"\\u00f8-\\u0241\\u0250-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ee\\u037a\\u0386\")) + \"\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03ce\\u03d0-\\u03f5\\u03f7-\\u0481\")) + \"\\u048a-\\u04ce\\u04d0-\\u04f9\\u0500-\\u050f\\u0531-\\u0556\\u0559\\u0561-\\u0587\")) + \"\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0621-\\u063a\\u0640-\\u064a\\u066e-\\u066f\")) + \"\\u0671-\\u06d3\\u06d5\\u06e5-\\u06e6\\u06ee-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\")) + \"\\u0712-\\u072f\\u074d-\\u076d\\u0780-\\u07a5\\u07b1\\u0904-\\u0939\\u093d\\u0950\")) + \"\\u0958-\\u0961\\u097d\\u0985-\\u098c\\u098f-\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\")) + \"\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc-\\u09dd\\u09df-\\u09e1\\u09f0-\\u09f1\")) + \"\\u0a05-\\u0a0a\\u0a0f-\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32-\\u0a33\")) + \"\\u0a35-\\u0a36\\u0a38-\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\")) + \"\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2-\\u0ab3\\u0ab5-\\u0ab9\\u0abd\")) + \"\\u0ad0\\u0ae0-\\u0ae1\\u0b05-\\u0b0c\\u0b0f-\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\")) + \"\\u0b32-\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c-\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\")) + \"\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99-\\u0b9a\\u0b9c\\u0b9e-\\u0b9f\")) + \"\\u0ba3-\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0c05-\\u0c0c\\u0c0e-\\u0c10\")) + \"\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c60-\\u0c61\\u0c85-\\u0c8c\")) + \"\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\")) + \"\\u0ce0-\\u0ce1\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d28\\u0d2a-\\u0d39\")) + \"\\u0d60-\\u0d61\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\")) + \"\\u0e01-\\u0e30\\u0e32-\\u0e33\\u0e40-\\u0e46\\u0e81-\\u0e82\\u0e84\\u0e87-\\u0e88\")) + \"\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\")) + \"\\u0eaa-\\u0eab\\u0ead-\\u0eb0\\u0eb2-\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\")) + \"\\u0edc-\\u0edd\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6a\\u0f88-\\u0f8b\\u1000-\\u1021\")) + \"\\u1023-\\u1027\\u1029-\\u102a\\u1050-\\u1055\\u10a0-\\u10c5\\u10d0-\\u10fa\\u10fc\")) + \"\\u1100-\\u1159\\u115f-\\u11a2\\u11a8-\\u11f9\\u1200-\\u1248\\u124a-\\u124d\")) + \"\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\")) + \"\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\")) + \"\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\")) + \"\\u166f-\\u1676\\u1681-\\u169a\\u16a0-\\u16ea\\u1700-\\u170c\\u170e-\\u1711\")) + \"\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\")) + \"\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\")) + \"\\u1980-\\u19a9\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1d00-\\u1dbf\\u1e00-\\u1e9b\")) + \"\\u1ea0-\\u1ef9\\u1f00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\")) + \"\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\")) + \"\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\")) + \"\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u2094\\u2102\\u2107\")) + \"\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\")) + \"\\u212f-\\u2131\\u2133-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u2c00-\\u2c2e\")) + \"\\u2c30-\\u2c5e\\u2c80-\\u2ce4\\u2d00-\\u2d25\\u2d30-\\u2d65\\u2d6f\\u2d80-\\u2d96\")) + \"\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\")) + \"\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3006\\u3031-\\u3035\")) + \"\\u303b-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\")) + \"\\u3105-\\u312c\\u3131-\\u318e\\u31a0-\\u31b7\\u31f0-\\u31ff\\u3400-\\u4db5\")) + \"\\u4e00-\\u9fbb\\ua000-\\ua48c\\ua800-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\")) + \"\\ua80c-\\ua822\\uac00-\\ud7a3\\uf900-\\ufa2d\\ufa30-\\ufa6a\\ufa70-\\ufad9\")) + \"\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\")) + \"\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\")) + \"\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\")) + \"\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\")) + \"\\uffda-\\uffdc\")), ja = ((((((((((((((((((((((((((((((((((((((((\"\\u0300-\\u036f\\u0483-\\u0486\\u0591-\\u05b9\\u05bb-\\u05bd\\u05bf\" + \"\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u0610-\\u0615\\u064b-\\u065e\\u0670\")) + \"\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7-\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\")) + \"\\u07a6-\\u07b0\\u0901-\\u0903\\u093c\\u093e-\\u094d\\u0951-\\u0954\\u0962-\\u0963\")) + \"\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7-\\u09c8\\u09cb-\\u09cd\\u09d7\")) + \"\\u09e2-\\u09e3\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47-\\u0a48\\u0a4b-\\u0a4d\")) + \"\\u0a70-\\u0a71\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\")) + \"\\u0ae2-\\u0ae3\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b43\\u0b47-\\u0b48\\u0b4b-\\u0b4d\")) + \"\\u0b56-\\u0b57\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\")) + \"\\u0c01-\\u0c03\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55-\\u0c56\")) + \"\\u0c82-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5-\\u0cd6\")) + \"\\u0d02-\\u0d03\\u0d3e-\\u0d43\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d82-\\u0d83\")) + \"\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2-\\u0df3\\u0e31\\u0e34-\\u0e3a\")) + \"\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb-\\u0ebc\\u0ec8-\\u0ecd\\u0f18-\\u0f19\")) + \"\\u0f35\\u0f37\\u0f39\\u0f3e-\\u0f3f\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f90-\\u0f97\")) + \"\\u0f99-\\u0fbc\\u0fc6\\u102c-\\u1032\\u1036-\\u1039\\u1056-\\u1059\\u135f\")) + \"\\u1712-\\u1714\\u1732-\\u1734\\u1752-\\u1753\\u1772-\\u1773\\u17b6-\\u17d3\\u17dd\")) + \"\\u180b-\\u180d\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u19b0-\\u19c0\\u19c8-\\u19c9\")) + \"\\u1a17-\\u1a1b\\u1dc0-\\u1dc3\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20eb\\u302a-\\u302f\")) + \"\\u3099-\\u309a\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ufb1e\\ufe00-\\ufe0f\")) + \"\\ufe20-\\ufe23\")), ka = ((((((((\"0-9\\u0660-\\u0669\\u06f0-\\u06f9\\u0966-\\u096f\\u09e6-\\u09ef\" + \"\\u0a66-\\u0a6f\\u0ae6-\\u0aef\\u0b66-\\u0b6f\\u0be6-\\u0bef\\u0c66-\\u0c6f\")) + \"\\u0ce6-\\u0cef\\u0d66-\\u0d6f\\u0e50-\\u0e59\\u0ed0-\\u0ed9\\u0f20-\\u0f29\")) + \"\\u1040-\\u1049\\u17e0-\\u17e9\\u1810-\\u1819\\u1946-\\u194f\\u19d0-\\u19d9\")) + \"\\uff10-\\uff19\")), la = ((((ia + ja)) + ha)), ma = ((ka + \"_\")), na = ((la + ma)), oa = ((((\"[\" + la)) + \"]\")), pa = ((((\"[\" + na)) + \"]\")), qa = ((((\"^|$|[^&\" + na)) + \"]\")), ra = \"[#\\\\uFF03]\", sa = ((((((((((((((((((\"(\" + qa)) + \")(\")) + ra)) + \")(\")) + pa)) + \"*\")) + oa)) + pa)) + \"*)\"));\n        return new RegExp(sa, \"ig\");\n    };\n;\n    function l(da) {\n        var ea = y(da), fa = 0, ga = 0;\n        return n(da).map(function(ha) {\n            while (((fa < ea.length))) {\n                var ia = ea[fa], ja = ((ia.offset - ga));\n                if (((ja < ha.offset))) {\n                    ga += ((ia.token.length - ia.JSBNG__name.length));\n                    fa++;\n                }\n                 else break;\n            ;\n            ;\n            };\n        ;\n            return {\n                marker: ha.marker,\n                tag: ha.hashtag,\n                rawOffset: ((ha.offset + ga)),\n                offset: ha.offset\n            };\n        });\n    };\n;\n    function m(da) {\n        return o(da, t(da));\n    };\n;\n    function n(da) {\n        var ea = aa(da);\n        return o(ea, p(da, ea));\n    };\n;\n    function o(da, ea) {\n        return r(da).slice(0, i).filter(function(fa) {\n            var ga = v(fa.offset, fa.hashtag.length, ea);\n            return ((!ga && ((fa.hashtag.length <= h))));\n        });\n    };\n;\n    function p(da, ea) {\n        return u(s(da), t(ea));\n    };\n;\n    var q = k();\n    function r(da) {\n        var ea = [];\n        da.replace(q, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                marker: ha,\n                hashtag: ia,\n                offset: ((ja + ga.length))\n            });\n        });\n        return ea;\n    };\n;\n    function s(da) {\n        return ba(da).map(function(ea) {\n            return [ea.offset,ea.JSBNG__name.length,];\n        });\n    };\n;\n    function t(da) {\n        var ea = [], fa, ga = 0;\n        while ((fa = g.permissiveMatch(da))) {\n            var ha = da.indexOf(fa);\n            ea.push([((ga + ha)),fa.length,]);\n            da = da.substring(((ha + fa.length)));\n            ga += ((ha + fa.length));\n        };\n    ;\n        return ea;\n    };\n;\n    function u(da, ea) {\n        var fa = [], ga = 0, ha = 0, ia = 0;\n        while (((((ga < da.length)) && ((ha < ea.length))))) {\n            if (((da[ga][0] > ea[ha][0]))) {\n                fa[ia++] = ea[ha++];\n            }\n             else fa[ia++] = da[ga++];\n        ;\n        ;\n        };\n    ;\n        return fa.concat(da.slice(ga), ea.slice(ha));\n    };\n;\n    function v(da, ea, fa) {\n        if (!fa) {\n            return false;\n        }\n    ;\n    ;\n        var ga = x(fa, da);\n        return ((w(da, ea, fa, ga) || w(da, ea, fa, ((ga + 1)))));\n    };\n;\n    function w(da, ea, fa, ga) {\n        if (!fa[ga]) {\n            return false;\n        }\n    ;\n    ;\n        var ha = fa[ga][0], ia = fa[ga][1];\n        return !((((((((da + ea)) - 1)) < ha)) || ((da > ((((ha + ia)) - 1))))));\n    };\n;\n    function x(da, ea) {\n        var fa = 0, ga = ((da.length - 1));\n        while (((fa <= ga))) {\n            var ha = Math.floor(((((fa + ga)) / 2))), ia = da[ha][0];\n            if (((ia == ea))) {\n                return ha;\n            }\n             else if (((ia < ea))) {\n                fa = ((ha + 1));\n            }\n             else ga = ((ha - 1));\n            \n        ;\n        ;\n        };\n    ;\n        return ga;\n    };\n;\n    function y(da) {\n        var ea = [];\n        da.replace(j, function(fa, ga, ha, ia, ja) {\n            ea.push({\n                token: fa,\n                id: ga,\n                type: ha,\n                JSBNG__name: ia,\n                offset: ja\n            });\n        });\n        return ea;\n    };\n;\n    function z(da) {\n        return ((da ? da.replace(/\\\\([^\\\\])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\") : null));\n    };\n;\n    function aa(da) {\n        return da.replace(j, function(ea, fa, ga, ha, ia) {\n            return z(ha);\n        });\n    };\n;\n    function ba(da) {\n        var ea = 0, fa = 0;\n        return y(da).map(function(ga) {\n            var ha = da.indexOf(ga.token, fa);\n            fa = ((ha + 1));\n            ha -= ea;\n            var ia = z(ga.JSBNG__name);\n            ea += ((ga.token.length - ia.length));\n            if (((ha >= 0))) {\n                return {\n                    id: ga.id,\n                    JSBNG__name: ia,\n                    type: ga.type,\n                    offset: ha\n                };\n            }\n        ;\n        ;\n        });\n    };\n;\n    var ca = {\n    };\n    ca.parse = l;\n    ca.parseWithoutMentions = m;\n    e.exports = ca;\n});\n__d(\"HashtagSearchResultUtils\", [\"FacebarResultStoreUtils\",\"HashtagParser\",\"HashtagSearchResultConfig\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarResultStoreUtils\"), h = b(\"HashtagParser\"), i = b(\"HashtagSearchResultConfig\"), j = b(\"URI\"), k = {\n        getHashtagFromQuery: function(l) {\n            var m = h.parse(l);\n            if (((((m && ((m.length === 1)))) && ((m[0].offset === 0))))) {\n                return m[0].tag;\n            }\n        ;\n        ;\n            return false;\n        },\n        makeTypeaheadResult: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j(((\"/hashtag/\" + l))).toString(),\n                photo: i.image_url,\n                rankType: null,\n                replace_results: ((i.boost_result ? true : false)),\n                scaled_score: 1,\n                score: 0,\n                text: ((\"#\" + l)),\n                type: \"hashtag_exact\",\n                uid: ((\"hashtag:\" + l))\n            };\n        },\n        makeFacebarEntry: function(l) {\n            return {\n                category: \"Hashtag\",\n                path: j(((\"/hashtag/\" + l))).toString(),\n                photo: i.image_url,\n                replace_results: ((i.boost_result ? true : false)),\n                text: ((\"#\" + l)),\n                type: \"hashtag_exact\",\n                uid: ((\"hashtag:\" + l))\n            };\n        },\n        makeFacebarResult: function(l) {\n            var m = g.processEntityResult(\"hashtag_exact\", ((\"hashtag:\" + l)), ((\"#\" + l)), i.hashtag_cost);\n            m.parse = {\n                display: [{\n                    type: \"ent:hashtag_exact\",\n                    uid: ((\"hashtag:\" + l))\n                },],\n                remTokens: [],\n                suffix: \"\",\n                unmatch: []\n            };\n            return m;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ContextualHelpSearchController\", [\"JSBNG__Event\",\"AsyncRequest\",\"DOM\",\"JSBNG__CSS\",\"Focus\",\"Input\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"JSBNG__CSS\"), k = b(\"Focus\"), l = b(\"Input\"), m = b(\"copyProperties\"), n = 400;\n    function o() {\n        this._token = null;\n        this._timerID = 0;\n        this._lastQuery = null;\n        this.typing_listener = null;\n        this.clear_listener = null;\n        this.async_request = null;\n    };\n;\n    m(o.prototype, {\n        init: function(p, q, r, s, t) {\n            this.loader = p;\n            this.search_box = q;\n            this.topics_area = r;\n            this.results_area = s;\n            this.clear_button = t;\n            this.typing_listener = g.listen(this.search_box, \"keyup\", this.setTimer.bind(this));\n            this.clear_listener = g.listen(this.clear_button, \"click\", this.clearResults.bind(this));\n            k.set(this.search_box);\n        },\n        source: \"contextual_help\",\n        clearResults: function() {\n            this.show(this.topics_area);\n            this._lastQuery = \"\";\n            l.reset(this.search_box);\n            k.set(this.search_box);\n            if (((this.async_request !== null))) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        ;\n            j.addClass(this.clear_button, \"hidden_elem\");\n        },\n        update: function() {\n            var p = l.getValue(this.search_box);\n            if (((p === this._lastQuery))) {\n                return;\n            }\n        ;\n        ;\n            this._lastQuery = p;\n            if (((p === \"\"))) {\n                this.clearResults();\n                return;\n            }\n        ;\n        ;\n            this.show(this.loader);\n            var q = {\n                query: p,\n                width: ((this._width || n)),\n                source: this.source\n            };\n            this.async_request = new h(\"/help/ajax/search/\").setData(q).setHandler(function(r) {\n                this._update(r);\n            }.bind(this));\n            this.async_request.send();\n        },\n        _update: function(p) {\n            this.async_request = null;\n            var q = p.getPayload().results;\n            i.setContent(this.results_area, q);\n            this.show(this.results_area);\n            if (((l.getValue(this.search_box) === \"\"))) {\n                this.clearResults();\n            }\n             else j.removeClass(this.clear_button, \"hidden_elem\");\n        ;\n        ;\n        },\n        setTimer: function() {\n            if (((this._timerID !== 0))) {\n                JSBNG__clearTimeout(this._timerID);\n            }\n        ;\n        ;\n            this._timerID = JSBNG__setTimeout(this.update.bind(this), 300);\n            if (((this.async_request != null))) {\n                this.async_request.abort();\n                this.async_request = null;\n            }\n        ;\n        ;\n        },\n        show: function(p) {\n            var q = [this.loader,this.topics_area,this.results_area,];\n            for (var r = 0; ((r < q.length)); r++) {\n                j.addClass(q[r], \"hidden_elem\");\n            ;\n            };\n        ;\n            j.removeClass(p, \"hidden_elem\");\n        }\n    });\n    e.exports = o;\n});\n__d(\"RequestsJewel\", [\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"ChannelConstants\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"FriendBrowserCheckboxController\",\"LinkController\",\"Parent\",\"ScrollableArea\",\"Vector\",\"copyProperties\",\"ge\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"JSBNG__CSS\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"FriendBrowserCheckboxController\"), o = b(\"LinkController\"), p = b(\"Parent\"), q = b(\"ScrollableArea\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"ge\"), u = b(\"shield\"), v = b(\"tx\");\n    function w() {\n    \n    };\n;\n    s(w, {\n        instance: null,\n        getInstance: function() {\n            return this.instance;\n        }\n    });\n    s(w.prototype, {\n        init: function(x, y, z) {\n            w.instance = this;\n            this.countNew = 0;\n            this.jewel = x;\n            this.jewelFlyoutCase = x.getRoot();\n            this.jewelFlyout = t(\"fbRequestsFlyout\");\n            this.newCountSpan = t(\"newRequestCount\");\n            this.folder = y;\n            this.doNewMarkRead = z;\n            this.openTimestamp = 0;\n            this._requestList = {\n            };\n            this._egoData = {\n            };\n            this._requestCount = 0;\n            this.egoPredictedCount = 0;\n            this.pendingCount = 0;\n            this.shouldLogEgoClick = false;\n            this.shouldClearPredictionAssocOnClick = false;\n            var aa = t(\"requestsMarkReadButton\");\n            if (aa) {\n                m.listen(aa, \"click\", u(this._markRead, this));\n            }\n        ;\n        ;\n            this.jewel.subscribe(\"marked-seen\", u(this._markSeenCallback, this));\n            this.jewel.subscribe(\"JSBNG__closed\", u(this._clearNewItems, this));\n            this.jewel.subscribe(\"updated\", this._updateCount.bind(this));\n            this.jewel.subscribe(\"opened\", this._openHandler.bind(this));\n            o.registerHandler(this._handleLink.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_add\"), this._addRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"jewel_requests_remove_old\"), this._removeOldRequest.bind(this));\n            g.subscribe(j.getArbiterType(\"friend_requests_seen\"), this._markSeenFromMessage.bind(this));\n            g.subscribe(\"jewel/ego_predicted_count\", function(ba, ca) {\n                this.egoPredictedCount = ca.ego_predicted_count;\n                this.pendingCount = ca.pending_count;\n                this.egoUnseenTimestamp = ca.unseen_timestamp;\n                this.shouldLogEgoClick = ca.should_log_ego_click;\n                this.actionContext = ca.action_context;\n            }.bind(this));\n            m.listen(this.jewelFlyout, \"submit\", function(ba) {\n                var ca = p.byClass(ba.getTarget(), \"objectListItem\");\n                if (ca) {\n                    k.removeClass(ca, \"jewelItemNew\");\n                    k.addClass(ca, \"jewelItemResponded\");\n                    this.pageInCollapsedRequests();\n                }\n            ;\n            ;\n            }.bind(this));\n            this.setupScroll();\n            return this;\n        },\n        setupScroll: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableAreaWrap\")[0];\n            if (x) {\n                this._scrollableWrap = x;\n                this._lastLinkPosition = 0;\n                this._scrollListener = m.listen(x, \"JSBNG__scroll\", this._handleScroll.bind(this), m.Priority._BUBBLE);\n            }\n        ;\n        ;\n        },\n        fromDom: function() {\n            l.scry(this.jewelFlyout, \".jewelItemList li.objectListItem\").forEach(function(x) {\n                var y = x.getAttribute(\"id\");\n                if (y) {\n                    var z = t(((y + \"_status\"))), aa = this._parseIDToInts(y), ba = z.getAttribute(\"data-ego\");\n                    if (aa.requester) {\n                        this._requestList[aa.requester] = y;\n                        if (ba) {\n                            this._egoData[ba] = ba;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ++this._requestCount;\n                }\n            ;\n            ;\n            }.bind(this));\n            this._conditionShowEmptyMessage();\n        },\n        _parseID: function(x) {\n            var y = x.match(/^(\\d+)_(\\d+)/);\n            return (((y) ? {\n                requester: y[1],\n                type: y[2]\n            } : undefined));\n        },\n        _parseIDToInts: function(x) {\n            var y = ((x ? this._parseID(x) : undefined)), z;\n            if (((y && y.requester))) {\n                z = parseInt(y.requester, 10);\n                if (isNaN(z)) {\n                    z = undefined;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var aa;\n            if (((y && y.type))) {\n                aa = parseInt(y.type, 10);\n                if (isNaN(aa)) {\n                    aa = undefined;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return {\n                requester: z,\n                type: aa\n            };\n        },\n        _handleLink: function(x, JSBNG__event) {\n            var y = p.byClass(x, \"jewelItemNew\");\n            if (((((y && p.byClass(y, \"fbRequestList\"))) && p.byClass(y, \"beeperEnabled\")))) {\n                var z = this._parseID(y.id);\n                ((z && this._markSeenCallback(z.requester, z.type)));\n                g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                });\n                k.removeClass(y, \"jewelItemNew\");\n            }\n        ;\n        ;\n            return true;\n        },\n        _handleScroll: function() {\n            var x = l.scry(this._scrollableWrap, \".uiMorePager\");\n            if (((!x || ((t(\"fbRequestsJewelManualPager\") && ((x.length < 2))))))) {\n                return;\n            }\n        ;\n        ;\n            var y = x.pop();\n            if (y) {\n                var z = r.getElementPosition(y, \"viewport\").y;\n                if (((z > 0))) {\n                    k.addClass(p.byClass(this._scrollableWrap, \"uiScrollableArea\"), \"contentAfter\");\n                }\n            ;\n            ;\n                var aa = l.JSBNG__find(y, \"a\");\n                if (!aa) {\n                    return;\n                }\n            ;\n            ;\n                var ba = r.getElementPosition(aa, \"viewport\").y;\n                if (((ba == this._lastLinkPosition))) {\n                    return;\n                }\n            ;\n            ;\n                var ca = ((r.getElementPosition(this._scrollableWrap, \"viewport\").y + r.getElementDimensions(this._scrollableWrap).y));\n                if (((((((ba - 300)) < ca)) && ((ba > 0))))) {\n                    this._lastLinkPosition = ba;\n                    var da = aa.getAttribute(\"ajaxify\");\n                    if (da) {\n                        new h(da).setRelativeTo(aa).setStatusElement(p.byClass(aa, \"stat_elem\")).send();\n                    }\n                     else n.getInstance(\"jewel\").showMore();\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _addRequest: function(x, y) {\n            if (!y) {\n                return;\n            }\n        ;\n        ;\n            var z = y.obj.from, aa = y.obj.suggester, ba = this._parseIDToInts(this._requestList[z]).type, ca = ((((ba === 19)) && !aa));\n            if (((!ca && ((ba || this.jewel.isOpen()))))) {\n                return;\n            }\n        ;\n        ;\n            if (t(\"fbRequestsJewelLoading\")) {\n                new h().setURI(\"/ajax/requests/loader/\").send();\n            }\n             else {\n                var da = this._onMarkupCallback.bind(this, z, !!aa), ea = {\n                    from: z\n                };\n                if (aa) {\n                    ea.suggester = aa;\n                }\n            ;\n            ;\n                new h().setURI(\"/ajax/friends/jewel/request_markup\").setData(ea).setHandler(da).send();\n            }\n        ;\n        ;\n        },\n        _onMarkupCallback: function(x, y, z) {\n            var aa = z.getPayload();\n            if (!aa) {\n                return;\n            }\n        ;\n        ;\n            var ba = this._requestList[x], ca = this._parseIDToInts(ba).type;\n            if (((((ca === 19)) && !y))) {\n                var da = ((ba && t(ba)));\n                ((da && l.replace(da, aa.markup)));\n            }\n             else {\n                var ea = l.scry(this.jewelFlyout, \".fbRequestList .uiList\")[0];\n                if (!ea) {\n                    return;\n                }\n            ;\n            ;\n                l.prependContent(ea, aa.markup);\n                var fa = {\n                    jewel: \"requests\",\n                    count: ++this.countNew\n                };\n                g.inform(\"jewel/count-updated\", fa);\n                ++this._requestCount;\n                this._conditionShowEmptyMessage();\n            }\n        ;\n        ;\n            this._requestList[x] = aa.item_id;\n        },\n        _removeOldRequest: function(x, y) {\n            if (((((!y || this.jewel.isOpen())) || ((t(\"fbRequestsJewelLoading\") !== null))))) {\n                return;\n            }\n        ;\n        ;\n            var z = this._requestList[y.obj.from], aa = ((z && t(z)));\n            if (aa) {\n                ((k.hasClass(aa, \"jewelItemNew\") && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })));\n                if (!k.hasClass(aa, \"jewelItemResponded\")) {\n                    l.remove(aa);\n                    delete this._requestList[y.obj.from];\n                    --this._requestCount;\n                    this._conditionShowEmptyMessage();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        pageInCollapsedRequests: function() {\n            var x = t(\"fbRequestsJewelManualPager\");\n            if (x) {\n                var y = l.scry(x, \".uiMorePagerPrimary\")[0];\n                if (((y.style && ((y.style.display != \"none\"))))) {\n                    JSBNG__setTimeout(function() {\n                        y.click();\n                    }, 100);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _markRead: function() {\n            this.jewel.markSeen();\n            this._clearNewItems();\n        },\n        _markSeenCallback: function(x, y) {\n            var z = l.scry(this.jewelFlyout, \"li\");\n            new i(\"/ajax/gigaboxx/endpoint/UpdateLastSeenTime.php\", {\n                folder: this.folder,\n                first_item: z[0].id\n            }).send();\n            new h().setURI(\"/ajax/friends/jewel/predicted_count_logging\").setData({\n                ego_predicted_count: this.egoPredictedCount,\n                pending_count: this.pendingCount,\n                unseen_timestamp: this.egoUnseenTimestamp,\n                action_context: this.actionContext,\n                should_log_ego_click: this.shouldLogEgoClick\n            }).send();\n            var aa = ((((((typeof x != \"undefined\")) && ((typeof y != \"undefined\")))) ? {\n                requester: x,\n                type: y\n            } : {\n            }));\n            ((this.doNewMarkRead && new i(\"/ajax/requests/mark_read/\", aa).send()));\n        },\n        _markSeenFromMessage: function(x, y) {\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"requests\",\n                count: 0\n            });\n        },\n        _removeRequest: function(x, y) {\n            var z = y.obj.item_id;\n            if (z) {\n                var aa = t(z), ba = ((aa && k.hasClass(aa, \"jewelItemNew\")));\n                ((aa ? l.remove(aa) : ((ba && g.inform(\"jewel/count-updated\", {\n                    jewel: \"requests\",\n                    count: --this.countNew\n                })))));\n            }\n        ;\n        ;\n        },\n        _clearNewItems: function(x, y) {\n            l.scry(this.jewel.root, \"li.jewelItemNew\").forEach(function(z) {\n                k.removeClass(z, \"jewelItemNew\");\n            });\n        },\n        _updateCount: function(x, y) {\n            this.countNew = y.count;\n            k.conditionClass(this.jewelFlyout, \"beeperUnread\", ((this.countNew > 0)));\n            k.conditionClass(this.jewelFlyoutCase, \"showRequests\", ((this.countNew > 0)));\n            if (this.newCountSpan) {\n                var z = ((((this.countNew == 1)) ? v._(\"{num} NEW REQUEST\", {\n                    num: this.countNew\n                }) : v._(\"{num} NEW REQUESTS\", {\n                    num: this.countNew\n                })));\n                l.setContent(this.newCountSpan, z);\n            }\n        ;\n        ;\n        },\n        _conditionShowEmptyMessage: function() {\n            l.scry(this.jewelFlyout, \"li.empty\").forEach(function(x) {\n                k.conditionShow(x, ((this._requestCount <= 0)));\n            }.bind(this));\n        },\n        _openHandler: function() {\n            var x = l.scry(this.jewelFlyout, \".uiScrollableArea\")[0];\n            if (t(\"fbRequestsJewelLoading\")) {\n                var y = JSBNG__Date.now();\n                if (((((this.openTimestamp + 5000)) < y))) {\n                    this.openTimestamp = y;\n                    new h().setURI(\"/ajax/requests/loader/\").setData({\n                        log_impressions: true\n                    }).send();\n                }\n            ;\n            ;\n            }\n             else {\n                var z = Object.keys(this._requestList);\n                if (((z.length > 0))) {\n                    new h().setURI(\"/friends/requests/log_impressions\").setData({\n                        ids: z.join(\",\"),\n                        ref: \"jewel\"\n                    }).send();\n                    var aa = Object.keys(this._egoData);\n                    if (((aa.length > 0))) {\n                        new h().setURI(\"/growth/jewel/impression_logging.php\").setData({\n                            egodata: aa\n                        }).send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((x && q.poke(x)));\n        }\n    });\n    e.exports = w;\n});\n__d(\"legacy:RequestsJewel\", [\"RequestsJewel\",], function(a, b, c, d) {\n    a.RequestsJewel = b(\"RequestsJewel\");\n}, 3);\n__d(\"JewelX\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"JSBNG__CSS\",\"DOM\",\"HTML\",\"Keys\",\"TabIsolation\",\"Toggler\",\"copyProperties\",\"emptyFunction\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"HTML\"), m = b(\"Keys\"), n = b(\"TabIsolation\"), o = b(\"Toggler\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"reportData\"), s = function(t, u) {\n        ((((t && u)) && this.init(t, u)));\n    };\n    p(s, {\n        _instancesByName: {\n        },\n        _resizeListener: null\n    });\n    p(s.prototype, i, {\n        init: function(t, u) {\n            this.JSBNG__name = u.JSBNG__name;\n            this.root = t;\n            this.countNew = 0;\n            this.initialCount = 0;\n            this.escHandler = null;\n            s._instancesByName[this.JSBNG__name] = this;\n            var v = k.JSBNG__find(t, \".jewelFlyout\"), w = new n(v);\n            o.createInstance(v).setSticky(false);\n            o.listen(\"show\", this.root, function(x) {\n                this._logFirstClick();\n                ((this.hasNew() && this.markSeen()));\n                this.reset();\n                this.inform(\"opened\");\n                h.inform(\"layer_shown\", {\n                    type: \"Jewel\"\n                });\n                w.enable();\n                this.setupEvents();\n            }.bind(this));\n            o.listen(\"hide\", this.root, function(x, y) {\n                ((this.hasNew() && this.markSeen()));\n                this.reset();\n                this.inform(\"JSBNG__closed\");\n                h.inform(\"layer_hidden\", {\n                    type: \"Jewel\"\n                });\n                w.disable();\n                this.removeEvents();\n            }.bind(this));\n            h.subscribe(\"jewel/count-updated\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.update(y)));\n            }.bind(this));\n            h.subscribe(\"jewel/count-initial\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.setInitial(y)));\n            }.bind(this));\n            h.subscribe(\"jewel/reset\", function(x, y) {\n                ((((y.jewel == this.JSBNG__name)) && this.reset()));\n            }.bind(this));\n            s._resizeListener = ((s._resizeListener || (function() {\n                var x = null;\n                return g.listen(window, \"resize\", function() {\n                    JSBNG__clearTimeout(x);\n                    x = h.inform.bind(h, \"jewel/resize\").defer(100, false);\n                });\n            })()));\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        hasNew: function() {\n            return j.hasClass(this.root, \"hasNew\");\n        },\n        isOpen: function() {\n            return j.hasClass(this.root, \"openToggler\");\n        },\n        reset: function() {\n            j.removeClass(this.root, \"hasNew\");\n        },\n        setContent: function(t) {\n            var u = k.JSBNG__find(this.root, \"ul.jewelItemList\");\n            k.setContent(u, l(t));\n        },\n        update: function(t) {\n            this.countNew = t.count;\n            var u = k.JSBNG__find(this.root, \"span.jewelCount span\");\n            k.setContent(u, this.countNew);\n            var v = ((isNaN(this.countNew) || ((this.countNew > 0))));\n            j.conditionClass(this.root, \"hasNew\", v);\n            if (v) {\n                var w = ((\"\" + this.countNew)).length;\n                j.conditionClass(this.root, \"hasCountSmall\", ((w === 1)));\n                j.conditionClass(this.root, \"hasCountMedium\", ((w === 2)));\n                j.conditionClass(this.root, \"hasCountLarge\", ((w > 2)));\n            }\n        ;\n        ;\n            this.inform(\"updated\", t);\n        },\n        setInitial: function(t) {\n            this.initialCount = t;\n        },\n        setupEvents: function() {\n            this.escHandler = g.listen(JSBNG__document.documentElement, \"keydown\", function(t) {\n                if (((((t.keyCode === m.ESC)) && this.isOpen()))) {\n                    o.hide(this.root);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        removeEvents: function() {\n            if (this.escHandler) {\n                this.escHandler.remove();\n            }\n        ;\n        ;\n        },\n        markSeen: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: this.JSBNG__name,\n                count: 0\n            }, h.BEHAVIOR_STATE);\n            this.inform(\"marked-seen\");\n        },\n        _logFirstClick: function() {\n            this._logFirstClick = q;\n            r(\"jewel_click\", {\n                gt: {\n                    count: this.countNew,\n                    initial: this.initialCount,\n                    jewel: this.JSBNG__name\n                }\n            });\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryJewelCountControl\", [\"Arbiter\",\"DOM\",\"MercuryThreadlistConstants\",\"copyProperties\",\"shield\",\"tx\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DOM\"), i = b(\"MercuryThreadlistConstants\"), j = b(\"copyProperties\"), k = b(\"shield\"), l = b(\"tx\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreadInformer\").get(), o = b(\"MercuryUnseenState\").get(), p, q, r, s = function(u) {\n        if (((u || r.isOpen()))) {\n            o.markAsSeen();\n        }\n    ;\n    ;\n    }, t = function(u, v) {\n        p = u;\n        q = h.JSBNG__find(p, \"#mercurymessagesCountValue\");\n        r = v;\n        this.render();\n        m.subscribe(\"model-update-completed\", function(w, x) {\n            s(false);\n        });\n        n.subscribe(\"unseen-updated\", this.render.bind(this));\n        r.subscribe(\"marked-seen\", k(s, this, true));\n    };\n    j(t.prototype, {\n        render: function() {\n            var u = \"\";\n            if (o.exceedsMaxCount()) {\n                u = l._(\"{count}+\", {\n                    count: i.MAX_UNSEEN_COUNT\n                });\n            }\n             else u = o.getUnseenCount().toString();\n        ;\n        ;\n            g.inform(\"jewel/count-updated\", {\n                jewel: \"mercurymessages\",\n                count: u\n            }, g.BEHAVIOR_STATE);\n        }\n    });\n    e.exports = t;\n});\n__d(\"MercuryJewelThreadlistControl\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryChatUtils\",\"MercuryConfig\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"JSXDOM\",\"MercuryAPIArgsSource\",\"MercuryThreadlistConstants\",\"MessagingTag\",\"MercuryOrderedThreadlist\",\"Parent\",\"MercuryJewelTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"Tooltip\",\"MercuryUnreadState\",\"copyProperties\",\"csx\",\"cx\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryChatUtils\"), j = b(\"MercuryConfig\"), k = b(\"JSBNG__CSS\"), l = b(\"DOM\"), m = b(\"JSBNG__Event\"), n = b(\"JSLogger\"), o = b(\"JSXDOM\"), p = b(\"MercuryAPIArgsSource\"), q = b(\"MercuryThreadlistConstants\"), r = b(\"MessagingTag\"), s = b(\"MercuryOrderedThreadlist\").get(), t = b(\"Parent\"), u = b(\"MercuryJewelTemplates\"), v = b(\"MercuryThreadInformer\").get(), w = b(\"MercuryThreadMetadataRenderer\").get(), x = b(\"MercuryThreads\").get(), y = b(\"Tooltip\"), z = b(\"MercuryUnreadState\").get(), aa = b(\"copyProperties\"), ba = b(\"csx\"), ca = b(\"cx\"), da = b(\"throttle\"), ea = b(\"tx\"), fa = n.create(\"mercury_jewel\");\n    function ga(na, oa) {\n        this._contentArea = ((l.scry(na, \".scrollable\")[0] || na));\n        this._contentElement = l.JSBNG__find(this._contentArea, \".jewelContent\");\n        this._loadingElement = l.JSBNG__find(this._contentArea, \".jewelLoading\");\n        this._loadMoreButton = l.JSBNG__find(this._contentArea, \".-cx-PRIVATE-fbMercuryJewel__morebutton\");\n        this._loadMoreLink = l.JSBNG__find(this._contentArea, \"a.-cx-PRIVATE-fbMercuryJewel__morelink\");\n        this._currentFolder = r.INBOX;\n        this._jewelFolderLinks = [];\n        this._jewelFolderLinks[r.INBOX] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxfolder\");\n        this._jewelFolderLinks[r.OTHER] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherfolder\");\n        this._jewelFolderCounts = [];\n        this._jewelFolderCounts[r.INBOX] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__inboxunread\");\n        this._jewelFolderCounts[r.OTHER] = l.JSBNG__find(oa, \".-cx-PRIVATE-fbMercuryJewel__otherunread\");\n        la.bind(this)();\n        m.listen(this._jewelFolderLinks[r.INBOX], \"click\", ka.bind(this, r.INBOX));\n        m.listen(this._jewelFolderLinks[r.OTHER], \"click\", ka.bind(this, r.OTHER));\n        this._curCount = [];\n        this._curCount[r.INBOX] = ((q.JEWEL_THREAD_COUNT + 1));\n        this._curCount[r.OTHER] = ((q.JEWEL_THREAD_COUNT + 1));\n        this._isFolderLoaded = [];\n        this._isFolderLoaded[r.INBOX] = false;\n        this._isFolderLoaded[r.OTHER] = false;\n        this._folderIsLoading = [];\n        this._folderIsLoading[r.INBOX] = false;\n        this._folderIsLoading[r.OTHER] = false;\n        v.subscribe(\"threadlist-updated\", this.render.bind(this));\n        v.subscribe(\"unread-updated\", la.bind(this));\n        this.render();\n        fa.bump(((\"opened_threadlist_\" + this._currentFolder)));\n        m.listen(this._contentArea, \"JSBNG__scroll\", da(ha, 50, this));\n        m.listen(this._loadMoreLink, \"click\", this.renderMoreThreads.bind(this));\n    };\n;\n    aa(ga, {\n        EVENT_THREADS_LOADED: \"threads-loaded\",\n        EVENT_THREADS_RENDERED: \"threads-rendered\"\n    });\n    aa(ga.prototype, h);\n    aa(ga.prototype, {\n        render: function() {\n            l.empty(this._contentElement);\n            k.show(this._loadingElement);\n            k.hide(this._loadMoreButton);\n            var na = l.create(\"div\");\n            l.appendContent(this._contentElement, na);\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, this._curCount[this._currentFolder], this._currentFolder, this.renderThreads.bind(this, na), true);\n        },\n        renderThreads: function(na, oa) {\n            this.inform(ga.EVENT_THREADS_LOADED);\n            if (oa.length) {\n                oa.forEach(function(pa) {\n                    var qa = u[\":fb:mercury:jewel:threadlist-row\"].build();\n                    x.getThreadMeta(pa, function(ra) {\n                        w.renderCoreThreadlist(ra, qa, this.renderSingleThread.bind(this), {\n                            show_unread_count: true\n                        });\n                    }.bind(this));\n                    l.appendContent(na, qa.getRoot());\n                }.bind(this));\n            }\n             else l.setContent(this._contentElement, this.renderEmptyThreadlist());\n        ;\n        ;\n            k.hide(this._loadingElement);\n            k.conditionShow(this._loadMoreButton, !this._isFolderLoaded[this._currentFolder]);\n            this.inform(ga.EVENT_THREADS_RENDERED);\n        },\n        renderSingleThread: function(na, oa) {\n            var pa = ((oa.unread_count > 0));\n            if (pa) {\n                k.addClass(na.getRoot(), \"jewelItemNew\");\n            }\n        ;\n        ;\n            if (j.MessagesJewelToggleReadGK) {\n                var qa = o.div({\n                    className: \"x_div\"\n                }), ra = o.div({\n                    className: \"-cx-PRIVATE-fbReadToggle__active\"\n                }), sa = \"Mark as Unread\";\n                if (pa) {\n                    sa = \"Mark as Read\";\n                }\n            ;\n            ;\n                y.set(ra, sa, \"above\", \"right\");\n                m.listen(ra, \"click\", function(JSBNG__event) {\n                    x.changeThreadReadStatus(oa.thread_id, ((oa.unread_count > 0)));\n                    return false;\n                });\n                qa.appendChild(ra);\n                na.getNode(\"link\").appendChild(qa);\n            }\n        ;\n        ;\n            if (((j.MessagesJewelOpenInChat && i.canOpenChatTab(oa)))) {\n                m.listen(na.getRoot(), \"click\", function(JSBNG__event) {\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: oa.thread_id\n                    });\n                });\n            }\n             else w.renderTitanLink(oa.thread_id, na.getNode(\"link\"), null, this._currentFolder);\n        ;\n        ;\n            m.listen(na.getRoot(), \"mouseover\", function(JSBNG__event) {\n                var ta = na.getRoot();\n                if (!t.byClass(ta, \"notifNegativeBase\")) {\n                    k.addClass(ta, \"selected\");\n                }\n            ;\n            ;\n            });\n            m.listen(na.getRoot(), \"mouseout\", function(JSBNG__event) {\n                k.removeClass(na.getRoot(), \"selected\");\n            });\n        },\n        renderMoreThreads: function() {\n            k.addClass(this._loadMoreButton, \"async_saving\");\n            this._folderIsLoading[this._currentFolder] = true;\n            var na = ((this._curCount[this._currentFolder] + q.JEWEL_MORE_COUNT));\n            s.getThreadlist(q.RECENT_THREAD_OFFSET, ((na + 1)), this._currentFolder, ja.bind(this, na, this._currentFolder), true, p.JEWEL);\n        },\n        renderEmptyThreadlist: function() {\n            return l.create(\"li\", {\n                className: \"empty\"\n            }, \"No messages\");\n        }\n    });\n    function ha() {\n        if (((((!this._isFolderLoaded[this._currentFolder] && !this._folderIsLoading[this._currentFolder])) && ia.bind(this)()))) {\n            this.renderMoreThreads();\n        }\n    ;\n    ;\n    };\n;\n    function ia() {\n        return ((((this._contentArea.scrollTop + this._contentArea.clientHeight)) >= ((this._contentArea.scrollHeight - 1))));\n    };\n;\n    function ja(na, oa, pa) {\n        this._curCount[oa] = na;\n        if (((!this._isFolderLoaded[oa] && ((pa.length < ((this._curCount[oa] + 1))))))) {\n            this._isFolderLoaded[oa] = true;\n        }\n    ;\n    ;\n        this._folderIsLoading[oa] = false;\n        k.removeClass(this._loadMoreButton, \"async_saving\");\n        this.render();\n    };\n;\n    function ka(na) {\n        if (((this._currentFolder != na))) {\n            fa.bump(((\"opened_threadlist_\" + na)));\n            k.addClass(this._jewelFolderLinks[na], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            k.removeClass(this._jewelFolderLinks[this._currentFolder], \"-cx-PRIVATE-fbMercuryJewel__selectedfolder\");\n            this._currentFolder = na;\n            this.render();\n        }\n    ;\n    ;\n    };\n;\n    function la() {\n        ma.bind(this)(r.INBOX);\n        ma.bind(this)(r.OTHER);\n    };\n;\n    function ma(na) {\n        var oa;\n        if (z.exceedsMaxCount(na)) {\n            oa = q.MAX_UNREAD_COUNT;\n        }\n         else oa = z.getUnreadCount(na);\n    ;\n    ;\n        var pa = this._jewelFolderCounts[na];\n        if (((oa > 0))) {\n            if (((oa == q.MAX_UNREAD_COUNT))) {\n                oa += \"+\";\n            }\n        ;\n        ;\n            l.setContent(pa, ea._(\"({unread_count})\", {\n                unread_count: oa\n            }));\n        }\n         else l.setContent(pa, \"\");\n    ;\n    ;\n    };\n;\n    e.exports = ga;\n});\n__d(\"MercuryJewel\", [\"MercuryChannelHandler\",\"MercuryJewelCountControl\",\"DOM\",\"MercuryJewelThreadlistControl\",\"MercuryServerRequests\",\"userAction\",], function(a, b, c, d, e, f) {\n    b(\"MercuryChannelHandler\");\n    var g = b(\"MercuryJewelCountControl\"), h = b(\"DOM\"), i = b(\"MercuryJewelThreadlistControl\"), j = b(\"MercuryServerRequests\").get(), k = b(\"userAction\"), l = false;\n    function m(q, r, s, t) {\n        j.handleUpdate(t);\n        var u = new g(r, s), v = h.JSBNG__find(q, \"#MercuryJewelThreadList\");\n        if (((s.getRoot() && s.isOpen()))) {\n            n.call(this, v, q);\n        }\n         else s.subscribe(\"opened\", n.bind(this, v, q));\n    ;\n    ;\n    };\n;\n    e.exports = m;\n    function n(q, r) {\n        this._ua = k(\"messages\").uai(\"click\", \"jewel\");\n        this._listenForLoad = this._listenForRender = true;\n        if (!l) {\n            var s = new i(q, r);\n            s.subscribe(i.EVENT_THREADS_LOADED, o.bind(this));\n            s.subscribe(i.EVENT_THREADS_RENDERED, p.bind(this));\n            l = true;\n        }\n    ;\n    ;\n    };\n;\n    function o() {\n        if (this._listenForLoad) {\n            this._ua.add_event(\"loaded\");\n            this._listenForLoad = false;\n        }\n    ;\n    ;\n    };\n;\n    function p() {\n        if (this._listenForRender) {\n            this._ua.add_event(\"rendered\");\n            this._listenForRender = false;\n        }\n    ;\n    ;\n    };\n;\n});\n__d(\"MessagingEvents\", [\"Arbiter\",\"ChannelConstants\",\"arrayContains\",\"copyProperties\",\"isEmpty\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"isEmpty\"), l = {\n    }, m = new g();\n    function n(o) {\n        if (!k(l)) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin184keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin184i = (0);\n            var p;\n            for (; (fin184i < fin184keys.length); (fin184i++)) {\n                ((p) = (fin184keys[fin184i]));\n                {\n                    m.inform(((\"count/\" + p)), o[p]);\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    m.subscribe(\"mark-as-read\", function(o, p) {\n        ((((p.tids || p.chat_ids)) || [])).forEach(function(q) {\n            q = ((\"\" + q));\n            if (!((q in l))) {\n                l[q] = true;\n                var r = function() {\n                    m.unsubscribe(s);\n                    JSBNG__clearTimeout(t);\n                    delete l[q];\n                }, s = m.subscribe(\"read\", function(u, v) {\n                    if (((i(((v.tids || [])), q) || i(((v.chat_ids || [])), q)))) {\n                        r();\n                    }\n                ;\n                ;\n                }), t = r.defer(60000);\n            }\n        ;\n        ;\n        });\n    });\n    g.subscribe(h.getArbiterType(\"messaging\"), function(o, p) {\n        var q = j({\n        }, p.obj), JSBNG__event = ((q.JSBNG__event || \"\"));\n        delete q.type;\n        delete q.JSBNG__event;\n        m.inform(JSBNG__event, q);\n        if (((\"unread_counts\" in q))) {\n            var r = q.unread_counts;\n            n({\n                unread: r.inbox,\n                other_unseen: r.other\n            });\n        }\n    ;\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"inbox\"), function(o, p) {\n        var q = j(p.obj);\n        delete q.type;\n        n(q);\n    });\n    a.MessagingEvents = e.exports = m;\n}, 3);\n__d(\"TitanLeftNav\", [\"CounterDisplay\",\"MessagingEvents\",], function(a, b, c, d, e, f) {\n    var g = b(\"CounterDisplay\"), h = b(\"MessagingEvents\"), i = {\n        initialize: function() {\n            h.subscribe(\"count/other_unseen\", function(j, k) {\n                g.setCount(\"other_unseen\", k);\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"AccessibleMenu\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"DOM\",\"Keys\",\"TabbableElements\",\"Toggler\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"Keys\"), k = b(\"TabbableElements\"), l = b(\"Toggler\"), m, n, o;\n    function p() {\n        var x = i.scry(m, \"a[rel=\\\"toggle\\\"]\")[0];\n        ((x && x.JSBNG__focus()));\n        l.getInstance(m).hide();\n    };\n;\n    function q(x) {\n        if (!x) {\n            return false;\n        }\n    ;\n    ;\n        h.removeClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"false\");\n    };\n;\n    function r(x) {\n        if (!x) {\n            return false;\n        }\n    ;\n    ;\n        h.addClass(x, \"selected\");\n        x.setAttribute(\"aria-selected\", \"true\");\n        var y = k.JSBNG__find(x);\n        if (y[0]) {\n            y[0].JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function s(x) {\n        var y = i.scry(m, \".selected\")[0], z = ((n.indexOf(y) + x)), aa = n[z];\n        if (!aa) {\n            return false;\n        }\n    ;\n    ;\n        q(y);\n        r(aa);\n    };\n;\n    function t(x) {\n        if (((!l.isShown() || ((l.getActive() !== m))))) {\n            return true;\n        }\n    ;\n    ;\n        var y = g.getKeyCode(x);\n        switch (y) {\n          case j.TAB:\n            s(((x.shiftKey ? -1 : 1)));\n            g.prevent(x);\n            break;\n          case j.ESC:\n            p();\n            g.prevent(x);\n            break;\n          case j.UP:\n        \n          case j.DOWN:\n            s(((((y === j.UP)) ? -1 : 1)));\n            g.prevent(x);\n            break;\n        };\n    ;\n    };\n;\n    function u(x, y) {\n        m = y.getActive();\n        n = i.scry(m, \"[role=\\\"menuitem\\\"]\");\n        if (!o) {\n            o = g.listen(JSBNG__document.documentElement, \"keydown\", t);\n        }\n    ;\n    ;\n    };\n;\n    function v() {\n        if (((l.getActive() == m))) {\n            q(i.scry(m, \".selected\")[0]);\n        }\n    ;\n    ;\n    };\n;\n    var w = {\n        init: function(x) {\n            l.listen(\"show\", x, u);\n            l.listen(\"hide\", x, v);\n        }\n    };\n    e.exports = w;\n});\n__d(\"UserNoOp\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\"), i = function() {\n    \n    };\n    g(i.prototype, {\n        add_event: h.thatReturnsThis,\n        add_data: h.thatReturnsThis,\n        uai: h.thatReturnsThis,\n        uai_fallback: h.thatReturnsThis\n    });\n    e.exports = i;\n});\n__d(\"NegativeNotif\", [\"Animation\",\"AsyncRequest\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Parent\",\"Tooltip\",\"NotifXList\",\"$\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"Parent\"), n = b(\"Tooltip\"), o = b(\"NotifXList\"), p = b(\"$\"), q = b(\"clickRefAction\"), r = b(\"copyProperties\"), s = b(\"userAction\");\n    function t(u, v) {\n        r(this, v);\n        this.owner = u;\n        this.xLink = k.JSBNG__find(this.obj, \".notif_x\");\n        this.confirmingMsg = k.JSBNG__find(this.obj, \".confirmingMsg\");\n        this.mainLink = k.JSBNG__find(this.obj, \".notifMainLink\");\n        this.userXClicked = false;\n        this.userUnsubscribed = false;\n        l.listen(this.xLink, \"click\", this.xClick.bind(this));\n        if (((i.hasClass(this.obj, \"first_receipt\") && i.hasClass(p(\"jewelContainer\"), \"notifGentleAppReceipt\")))) {\n            this.gentleFirstReceiptHoverEventHandler = l.listen(this.obj, \"mouseover\", this.gentleFirstReceiptNotifHover.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    r(t.prototype, {\n        FADE_AWAY_DURATION: 2500,\n        X_OUT_DURATION: 100,\n        X_OUT_DURATION_SHORT: 2,\n        GENTLE_FRUI_MIN_HOVER_DURATION: 500,\n        GENTLE_FRUI_FADE_DURATION_FAST: 200,\n        GENTLE_FRUI_FADE_DURATION_SLOW: 2500,\n        GENTLE_FRUI_DELAY_FADE_TIME: 60000,\n        xClick: function(JSBNG__event) {\n            this._activateX();\n            var u = this.xLink.getAttribute(\"data-gt\"), v = ((u ? {\n                gt: JSON.parse(u)\n            } : {\n            }));\n            s(\"xbutton\", this.xLink, JSBNG__event).uai(\"click\");\n            q(\"click\", this.xLink, JSBNG__event, null, v);\n            return false;\n        },\n        gentleFirstReceiptNotifHover: function(JSBNG__event) {\n            JSBNG__event.JSBNG__stop();\n            var u = k.JSBNG__find(this.obj, \".first_receipt_no_button\"), v = j.get(u, \"notif_fr_prompt\");\n            n.set(u, v, \"above\", \"center\");\n            n.show(u);\n            this._gentleFirstReceiptTooltipFadeIn();\n            if (!this.gentleFirstReceiptUnhoverEventHandler) {\n                this.hoverTime = new JSBNG__Date();\n                this.gentleFirstReceiptUnhoverEventHandler = l.listen(JSBNG__document.documentElement, \"mouseover\", this.gentleFirstReceiptNotifUnhover.bind(this));\n            }\n        ;\n        ;\n            if (!this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler = l.listen(u, \"click\", this.gentleFirstReceiptNoClick.bind(this));\n            }\n        ;\n        ;\n        },\n        gentleFirstReceiptNotifUnhover: function(JSBNG__event) {\n            if (((m.byClass(JSBNG__event.getTarget(), \"uiContextualLayer\") || m.byClass(JSBNG__event.getTarget(), \"uiScrollableAreaTrack\")))) {\n                return false;\n            }\n        ;\n        ;\n            var u = new JSBNG__Date();\n            if (((this.hoverTime && ((((u - this.hoverTime)) < this.GENTLE_FRUI_MIN_HOVER_DURATION))))) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n                this.gentleFirstReceiptUnhoverEventHandler = null;\n                this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n                return;\n            }\n        ;\n        ;\n            this._removeGentleFirstReceiptListeners();\n            this._gentleFirstReceiptTooltipFadeAway();\n            this._gentleFirstReceiptXButtonFadeAway();\n            var v = this;\n            JSBNG__setTimeout(function() {\n                v._gentleFirstReceiptUIFadeAway();\n            }, this.GENTLE_FRUI_DELAY_FADE_TIME);\n            this._sendFirstReceiptYesToServer();\n        },\n        gentleFirstReceiptNoClick: function(JSBNG__event) {\n            this._removeGentleFirstReceiptListeners();\n        },\n        restore: function() {\n            if (o.newNotifExist(this.id)) {\n                o.resumeInsert(this.id);\n            }\n             else o.removeNotif(this.id);\n        ;\n        ;\n            this._confirmingMsgFadeAway(this.confirmingMsg);\n            this._notifMainLinkShowUp(this.mainLink);\n            this._buttonShowUp(this.xLink);\n            this._adjustContainer(this.obj);\n        },\n        reset: function() {\n            if (((this.userXClicked && !this.userUnsubscribed))) {\n                this.userXClicked = false;\n                this.restore();\n            }\n        ;\n        ;\n        },\n        onTurnedOff: function() {\n            this.userUnsubscribed = true;\n            i.hide(this.confirmingMsg);\n            this._notifMainLinkShowUp(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            this._adjustContainer(this.obj);\n        },\n        onUndid: function() {\n            this.userXClicked = false;\n            this.userUnsubscribed = false;\n            this.restore();\n            i.show(this.confirmingMsg);\n            this._notifMainLinkFadeAway(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            k.remove(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n        },\n        onMarkedSpam: function() {\n            k.remove(k.JSBNG__find(this.obj, \".confirmedMsg\"));\n            this._fadeAway(k.JSBNG__find(this.obj, \".spamMsg\"));\n        },\n        onFirstReceiptYes: function() {\n            this._hideFirstReceiptDiv();\n            this._fadeAway(k.JSBNG__find(this.obj, \".firstConfirmedMsg\"));\n        },\n        onFirstReceiptNo: function() {\n            this._hideFirstReceiptDiv();\n            i.hide(this.confirmingMsg);\n            this._activateX();\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"turn_off\",\n                notification_id: this.id\n            }).send();\n        },\n        _sendFirstReceiptYesToServer: function() {\n            new h().setURI(\"/ajax/notifications/negative_req.php\").setData({\n                request_type: \"first_receipt_yes\",\n                notification_id: this.id\n            }).send();\n        },\n        _gentleFirstReceiptTooltipFadeIn: function() {\n            if (this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return;\n            }\n        ;\n        ;\n            var u = k.JSBNG__find(JSBNG__document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\");\n            new g(u).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = true;\n        },\n        _gentleFirstReceiptTooltipFadeAway: function() {\n            if (!this._gentleFirstReceiptTooltipAlreadyFadedIn) {\n                return;\n            }\n        ;\n        ;\n            var u = k.JSBNG__find(JSBNG__document.documentElement, \".uiLayer .uiContextualLayer .uiTooltipX\"), v = m.byClass(u, \"uiLayer\"), w = v.cloneNode(true);\n            k.insertAfter(v, w);\n            new g(w).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).ondone(function() {\n                k.remove(w);\n            }).go();\n            this._gentleFirstReceiptTooltipAlreadyFadedIn = false;\n        },\n        _gentleFirstReceiptXButtonFadeAway: function() {\n            var u = k.JSBNG__find(this.obj, \".first_receipt_no_button\");\n            new g(u).from(\"opacity\", \"1\").to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_FAST).hide().go();\n            i.addClass(this.obj, \"show_original_x\");\n        },\n        _gentleFirstReceiptUIFadeAway: function() {\n            var u = this.obj;\n            this.new_label = k.JSBNG__find(this.obj, \".notif_new_label\");\n            new g(this.new_label).to(\"opacity\", \"0\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).ondone(function() {\n                i.removeClass(u, \"first_receipt\");\n            }).go();\n            if (!i.hasClass(this.obj, \"jewelItemNew\")) {\n                new g(this.obj).from(\"backgroundColor\", \"#ECEFF5\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.GENTLE_FRUI_FADE_DURATION_SLOW).go();\n            }\n        ;\n        ;\n        },\n        _removeGentleFirstReceiptListeners: function() {\n            if (this.gentleFirstReceiptHoverEventHandler) {\n                this.gentleFirstReceiptHoverEventHandler.remove();\n            }\n        ;\n        ;\n            if (this.gentleFirstReceiptUnhoverEventHandler) {\n                this.gentleFirstReceiptUnhoverEventHandler.remove();\n            }\n        ;\n        ;\n            if (this.gentleFirstReceiptNoClickEventHandler) {\n                this.gentleFirstReceiptNoClickEventHandler.remove();\n            }\n        ;\n        ;\n        },\n        _activateX: function() {\n            i.addClass(this.obj, \"forPushSafety\");\n            this.userXClicked = true;\n            o.userXClick(this.id);\n            this._notifMainLinkFadeAway(this.mainLink);\n            this._buttonFadeAway(this.xLink);\n            if (i.shown(this.confirmingMsg)) {\n                this._confirmingMsgShowUp(this.confirmingMsg);\n            }\n        ;\n        ;\n            this._adjustContainer(this.obj);\n        },\n        _hideFirstReceiptDiv: function() {\n            i.removeClass(this.obj, \"first_receipt\");\n            i.hide(k.JSBNG__find(this.obj, \".first_receipt_div\"));\n        },\n        _fadeAway: function(u) {\n            new g(u).from(\"backgroundColor\", \"#FFF9D7\").to(\"backgroundColor\", \"#FFFFFF\").duration(this.FADE_AWAY_DURATION).checkpoint().to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION).go();\n        },\n        _adjustContainer: function(u) {\n            new g(u).by(\"height\", \"0px\").duration(this.X_OUT_DURATION).checkpoint().by(\"height\", \"0px\").duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"height\", \"auto\").duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"4px\").to(\"paddingBottom\", \"4px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _confirmingMsgShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"auto\").to(\"paddingTop\", \"10px\").to(\"paddingBottom\", \"10px\").blind().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _notifMainLinkFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _confirmingMsgFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().duration(this.X_OUT_DURATION_SHORT).go();\n        },\n        _buttonShowUp: function(u) {\n            new g(u).duration(this.X_OUT_DURATION).checkpoint().show().duration(this.X_OUT_DURATION_SHORT).checkpoint().to(\"opacity\", \"1\").blind().duration(this.X_OUT_DURATION).go();\n        },\n        _buttonFadeAway: function(u) {\n            new g(u).to(\"opacity\", \"0\").blind().duration(this.X_OUT_DURATION).checkpoint().hide().duration(this.X_OUT_DURATION_SHORT).go();\n        }\n    });\n    e.exports = t;\n});\n__d(\"NotificationCounter\", [\"Arbiter\",\"DocumentTitle\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = {\n        messages: 0,\n        notifications: 0,\n        requests: 0\n    }, k = {\n        init: function(l) {\n            g.subscribe(\"update_title\", this._handleUpdate.bind(this));\n            g.subscribe(\"jewel/count-updated\", this._handleCountUpdate.bind(this));\n        },\n        getCount: function() {\n            var l = 0;\n            {\n                var fin185keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin185i = (0);\n                var m;\n                for (; (fin185i < fin185keys.length); (fin185i++)) {\n                    ((m) = (fin185keys[fin185i]));\n                    {\n                        var n = Number(j[m]);\n                        if (((((typeof j[m] == \"string\")) && isNaN(n)))) {\n                            return j[m];\n                        }\n                    ;\n                    ;\n                        if (((isNaN(n) || ((n < 0))))) {\n                            i.create(\"jewels\").error(\"bad_count\", {\n                                jewel: m,\n                                count: j[m]\n                            });\n                            continue;\n                        }\n                    ;\n                    ;\n                        l += n;\n                    };\n                };\n            };\n        ;\n            return l;\n        },\n        updateTitle: function() {\n            var l = this.getCount(), m = h.get();\n            m = ((l ? ((((((\"(\" + l)) + \") \")) + m)) : m));\n            h.set(m, true);\n        },\n        _handleCountUpdate: function(l, m) {\n            j[m.jewel] = m.count;\n            this.updateTitle();\n        },\n        _handleUpdate: function(l, m) {\n            this.updateTitle();\n        }\n    };\n    e.exports = k;\n});\n__d(\"NotificationList\", [\"Animation\",\"ArbiterMixin\",\"JSBNG__CSS\",\"DOM\",\"DoublyLinkedListMap\",\"HTML\",\"NotificationURI\",\"Tooltip\",\"JSBNG__Event\",\"$\",\"copyProperties\",\"cx\",\"csx\",\"ge\",\"isEmpty\",\"tx\",\"hasArrayNature\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"DoublyLinkedListMap\"), l = b(\"HTML\"), m = b(\"NotificationURI\"), n = b(\"Tooltip\"), o = b(\"JSBNG__Event\"), p = b(\"$\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"ge\"), u = b(\"isEmpty\"), v = b(\"tx\"), w = b(\"hasArrayNature\"), x = \"0\", y = \"1\", z = \"2\";\n    function aa(da) {\n        return ((((da == y)) || ((da == z))));\n    };\n;\n    function ba(da) {\n        return ((da == y));\n    };\n;\n    function ca(da, ea) {\n        this._list = new k();\n        this._filter_func = null;\n        this.unseenCount = 0;\n        this.contentRoot = da;\n        this.noItemsElement = null;\n        this.ITEM_TAG = \"li\";\n        this.ITEM_CLASS = \"notification\";\n        this.NO_ITEMS_ID = \"jewelNoNotifications\";\n        this.NO_ITEMS_CLASS = \"empty\";\n        this.compare = ((ea.compare || this.compare));\n        this.shouldBlockAnimation = ((ea.shouldBlockAnimation || null));\n        this.unseenVsUnread = ((ea.unseenVsUnread || false));\n        this.markReadSignalServer = ea.markReadSignalServer;\n        this.animations = {\n        };\n    };\n;\n    q(ca, {\n        ITEM_UNREAD_CLASS: \"jewelItemNew\",\n        MARK_READ_TYPE: \"mark_read\",\n        UNREAD_COUNT_CHANGE_TYPE: \"unread_count_change\",\n        INSERTION_TYPE: \"insert\",\n        REMOVAL_TYPE: \"remove\",\n        getIdFromDom: function(da) {\n            return da.getAttribute(\"id\").replace(\"notification_\", \"\");\n        },\n        localizeUrls: function(da) {\n            j.scry(da, \"a\").forEach(function(ea) {\n                ea.href = m.localize(ea.href);\n            });\n        }\n    });\n    q(ca.prototype, h, {\n        FADE_DURATION: 250,\n        RESIZE_DURATION: 200,\n        _getField: function(da, ea) {\n            var fa = this._list.get(da);\n            return ((fa && fa[ea]));\n        },\n        getDomObj: function(da) {\n            return this._getField(da, \"obj\");\n        },\n        fromDom: function() {\n            var da = ((((this.ITEM_TAG + \".\")) + this.ITEM_CLASS)), ea = j.scry(this.contentRoot, da);\n            for (var fa = 0; ((fa < ea.length)); ++fa) {\n                var ga = ea[fa], ha = ca.getIdFromDom(ga);\n                this.insert(ha, ga.getAttribute(\"data-notiftime\"), null);\n            };\n        ;\n        },\n        compare: function(da, ea) {\n            return ((((da.time < ea.time)) || ((((da.time === ea.time)) && ((da.id < ea.id))))));\n        },\n        insert: function(da, ea, fa, ga, ha, ia) {\n            var ja = y, ka = 0, la = this._list.exists(da), ma = ((ia && this._list.exists(ia))), na = null, oa;\n            if (((la || ma))) {\n                if (!((ga && fa))) {\n                    return false;\n                }\n                 else {\n                    if (this._filter_func) {\n                        oa = {\n                            notif_id: da,\n                            notif_time: ea,\n                            notif_markup: fa,\n                            replace: ga,\n                            ignoreUnread: ha,\n                            notif_alt_id: ia\n                        };\n                        if (this._filter_func(oa)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ja = this._getField(da, \"readness\");\n                    ka = this._getField(da, \"time\");\n                    if (((ka > ea))) {\n                        return false;\n                    }\n                ;\n                ;\n                    na = ((la ? da : ia));\n                    this._remove(na);\n                }\n            ;\n            }\n        ;\n        ;\n            var pa = ((((fa && l(fa).getRootNode())) || p(((\"notification_\" + da))))), qa = Math.max(ea, ka), ra = pa.getAttribute(\"data-readness\");\n            if (((!this.unseenVsUnread && ((z == ra))))) {\n                ra = x;\n            }\n        ;\n        ;\n            oa = {\n                id: da,\n                obj: pa,\n                time: qa,\n                readness: ra,\n                app_id: pa.getAttribute(\"data-appid\")\n            };\n            this._insert(oa);\n            this._setUpReadStateToggle(da, pa);\n            ca.localizeUrls(pa);\n            ((this.noItemsElement && i.hide(this.noItemsElement)));\n            if (ba(ra)) {\n                ((((ha && !aa(ja))) && this.markRead([da,])));\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n            var sa = ((((!na || ((ka < qa)))) || ((((ra && !ja)) && !ha))));\n            this.inform(ca.INSERTION_TYPE, {\n                id: da,\n                is_new: sa,\n                obj: pa,\n                replaced_id: na,\n                time: qa\n            });\n            return true;\n        },\n        _setReadStateToggleReadness: function(da, ea) {\n            var fa;\n            if (ea) {\n                fa = ((this.unseenVsUnread ? \"Mark as Read\" : \"Unread\"));\n            }\n             else fa = \"Read\";\n        ;\n        ;\n            if (!((ea && this.unseenVsUnread))) {\n                i.removeClass(da, \"-cx-PRIVATE-fbReadToggle__active\");\n                i.addClass(da, \"-cx-PRIVATE-fbReadToggle__inactive\");\n            }\n        ;\n        ;\n            n.set(da, fa, \"above\", \"center\");\n        },\n        _setUpReadStateToggle: function(da, ea) {\n            var fa = this.isUnreadId(da), ga = j.scry(ea, \".-cx-PRIVATE-fbReadToggle__active\")[0];\n            if (!ga) {\n                return;\n            }\n        ;\n        ;\n            this._setReadStateToggleReadness(ga, fa);\n            var ha = function(JSBNG__event) {\n                if (((this.unseenVsUnread && this.isUnreadId(da)))) {\n                    this.markReadSignalServer([da,]);\n                }\n            ;\n            ;\n                o.kill(JSBNG__event);\n                return false;\n            };\n            o.listen(ga, \"click\", ha.bind(this));\n        },\n        showNoNotifications: function() {\n            if (((null == this.noItemsElement))) {\n                this.noItemsElement = t(this.NO_ITEMS_ID);\n            }\n        ;\n        ;\n            if (((null == this.noItemsElement))) {\n                this.noItemsElement = j.create(this.ITEM_TAG, {\n                    id: this.NO_ITEMS_ID,\n                    className: this.NO_ITEMS_CLASS\n                }, \"No new notifications\");\n                j.appendContent(this.contentRoot, this.noItemsElement);\n            }\n        ;\n        ;\n            i.show(this.noItemsElement);\n        },\n        _insert: function(da) {\n            this._list.remove(da.id);\n            var ea = null;\n            this._list.JSBNG__find(function(ga) {\n                var ha = this.compare(ga, da);\n                ((!ha && (ea = ga.id)));\n                return ha;\n            }.bind(this));\n            var fa = this.getDomObj(ea);\n            if (fa) {\n                this._list.insertAfter(da.id, da, ea);\n                j.insertAfter(fa, da.obj);\n            }\n             else {\n                this._list.prepend(da.id, da);\n                j.prependContent(this.contentRoot, da.obj);\n            }\n        ;\n        ;\n        },\n        _remove: function(da) {\n            var ea = this._getField(da, \"obj\");\n            if (!ea) {\n                return false;\n            }\n        ;\n        ;\n            this.inform(ca.REMOVAL_TYPE, {\n                id: da\n            });\n            this._list.remove(da);\n            j.remove(ea);\n            ((this.isEmpty() && this.showNoNotifications()));\n            return true;\n        },\n        getUnreadIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ((aa(da.readness) && ea.push(da.id)));\n                return ea;\n            }, []);\n        },\n        getUnseenIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ((ba(da.readness) && ea.push(da.id)));\n                return ea;\n            }, []);\n        },\n        getIds: function() {\n            return this._list.reduce(function(da, ea) {\n                ea.push(da.id);\n                return ea;\n            }, []);\n        },\n        isUnreadId: function(da) {\n            var ea = this.getDomObj(da);\n            return ((aa(this._getField(da, \"readness\")) || ((ea && i.hasClass(ea, ca.ITEM_UNREAD_CLASS)))));\n        },\n        isUnseenId: function(da) {\n            return ba(this._getField(da, \"readness\"));\n        },\n        markRead: function(da, ea) {\n            da = ((da ? da.filter(this.isUnreadId.bind(this)) : this.getUnreadIds()));\n            var fa = false;\n            for (var ga = 0; ((ga < da.length)); ga++) {\n                var ha = this._list.get(da[ga]);\n                if (ha) {\n                    if (this._setReadness(da[ga], x)) {\n                        fa = true;\n                    }\n                ;\n                ;\n                    if (ea) {\n                        this._markReadInDom(da[ga], ha.obj);\n                    }\n                     else this.animateMarkRead(ha.obj);\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            if (fa) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n        },\n        markSeen: function(da) {\n            if (!w(da)) {\n                return;\n            }\n        ;\n        ;\n            if (!this.unseenVsUnread) {\n                this.markRead(da);\n                return;\n            }\n        ;\n        ;\n            da = da.filter(this.isUnseenId.bind(this));\n            var ea = false;\n            for (var fa = 0; ((fa < da.length)); fa++) {\n                if (this._setReadness(da[fa], z)) {\n                    ea = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (ea) {\n                this.unseenCount = this.getUnseenIds().length;\n                this.inform(ca.UNREAD_COUNT_CHANGE_TYPE);\n            }\n        ;\n        ;\n        },\n        _setReadness: function(da, ea) {\n            var fa = this._list.get(da);\n            if (((!fa || ((fa.readness == ea))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((((fa.readness == x)) && ((ea == z))))) {\n                return false;\n            }\n        ;\n        ;\n            fa.readness = ea;\n            fa.obj.setAttribute(\"data-readness\", ea);\n            return true;\n        },\n        _markReadInDom: function(da, ea) {\n            if (!this.isUnreadId(da)) {\n                return;\n            }\n        ;\n        ;\n            var fa = p(ea);\n            if (fa) {\n                this.stopAnimation(da);\n                i.removeClass(fa, ca.ITEM_UNREAD_CLASS);\n                var ga = j.scry(fa, \".read_toggle\")[0];\n                ((ga && this._setReadStateToggleReadness(ga, false)));\n            }\n        ;\n        ;\n        },\n        animateMarkRead: function(da) {\n            if (!i.hasClass(da, ca.ITEM_UNREAD_CLASS)) {\n                return;\n            }\n        ;\n        ;\n            var ea = ca.getIdFromDom(da), fa = this._markReadInDom.bind(this, ea, da);\n            if (i.hasClass(da, \"fbJewelBeep\")) {\n                fa();\n                return;\n            }\n        ;\n        ;\n            if (((this.shouldBlockAnimation && this.shouldBlockAnimation(da)))) {\n                return;\n            }\n        ;\n        ;\n            fa.defer(10000);\n        },\n        stopAnimation: function(da) {\n            ((((da in this.animations)) && this.animations[da].JSBNG__stop()));\n            delete this.animations[da];\n            return true;\n        },\n        insertMany: function(da, ea) {\n            if (((((\"object\" == typeof da)) && !u(da)))) {\n                {\n                    var fin186keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin186i = (0);\n                    var fa;\n                    for (; (fin186i < fin186keys.length); (fin186i++)) {\n                        ((fa) = (fin186keys[fin186i]));\n                        {\n                            var ga = da[fa];\n                            this.insert(fa, ga.time, ga.markup, true, ea, ((ga.alt_id || null)));\n                        };\n                    };\n                };\n            ;\n                ((this.noItemsElement && i.hide(this.noItemsElement)));\n            }\n             else ((this.isEmpty() && this.showNoNotifications()));\n        ;\n        ;\n        },\n        isEmpty: function() {\n            return this._list.isEmpty();\n        },\n        getEarliestNotifTime: function() {\n            return ((this._list.isEmpty() ? 0 : Math.min.apply(null, this.getIds().map(function(da) {\n                return this._getField(da, \"time\");\n            }.bind(this)))));\n        },\n        setFilterFn: function(da) {\n            this._filter_func = da;\n        },\n        toggleNotifsSimilarTo: function(da, ea, fa) {\n            var ga = this._getField(da, \"app_id\");\n            if (ga) {\n                var ha = this.getIds();\n                for (var ia = 0; ((ia < ha.length)); ++ia) {\n                    if (((ga == this._getField(ha[ia], \"app_id\")))) {\n                        var ja = this.getDomObj(ha[ia]);\n                        if (((da != ha[ia]))) {\n                            ((ea ? this._hideWithAnimation(ja) : this._showWithAnimation(ja)));\n                        }\n                    ;\n                    ;\n                        var ka = j.scry(ja, \".first_receipt_div\");\n                        if (((ka.length == 1))) {\n                            if (fa) {\n                                i.hide(ka[0]);\n                                i.removeClass(ja, \"first_receipt\");\n                            }\n                             else {\n                                i.show(ka[0]);\n                                i.addClass(ja, \"first_receipt\");\n                            }\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        _hideWithAnimation: function(da) {\n            new g(da).to(\"opacity\", \"0\").blind().duration(this.FADE_DURATION).checkpoint().to(\"height\", \"0px\").to(\"paddingTop\", \"0px\").to(\"paddingBottom\", \"0px\").blind().hide().duration(this.RESIZE_DURATION).go();\n        },\n        _showWithAnimation: function(da) {\n            new g(da).to(\"height\", \"auto\").to(\"paddingTop\", \"auto\").to(\"paddingBottom\", \"auto\").blind().show().duration(this.RESIZE_DURATION).checkpoint().to(\"opacity\", \"1\").blind().duration(this.FADE_DURATION).go();\n        }\n    });\n    e.exports = ca;\n});\n__d(\"Notifications\", [\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncSignal\",\"Bootloader\",\"ChannelConstants\",\"JSBNG__CSS\",\"DOM\",\"Env\",\"JSBNG__Event\",\"JSLogger\",\"NegativeNotif\",\"NotificationCounter\",\"NotificationList\",\"NotifXList\",\"Parent\",\"Poller\",\"ScrollableArea\",\"Style\",\"SystemEvents\",\"Toggler\",\"URI\",\"UserActivity\",\"UserNoOp\",\"Vector\",\"$\",\"copyProperties\",\"emptyFunction\",\"ge\",\"hasArrayNature\",\"isEmpty\",\"shield\",\"throttle\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"AsyncSignal\"), k = b(\"Bootloader\"), l = b(\"ChannelConstants\"), m = b(\"JSBNG__CSS\"), n = b(\"DOM\"), o = b(\"Env\"), p = b(\"JSBNG__Event\"), q = b(\"JSLogger\"), r = b(\"NegativeNotif\"), s = b(\"NotificationCounter\"), t = b(\"NotificationList\"), u = b(\"NotifXList\"), v = b(\"Parent\"), w = b(\"Poller\"), x = b(\"ScrollableArea\"), y = b(\"Style\"), z = b(\"SystemEvents\"), aa = b(\"Toggler\"), ba = b(\"URI\"), ca = b(\"UserActivity\"), da = b(\"UserNoOp\"), ea = b(\"Vector\"), fa = b(\"$\"), ga = b(\"copyProperties\"), ha = b(\"emptyFunction\"), ia = b(\"ge\"), ja = b(\"hasArrayNature\"), ka = b(\"isEmpty\"), la = b(\"shield\"), ma = b(\"throttle\"), na = b(\"userAction\");\n    function oa(pa) {\n        this.updateTime = ((pa.updateTime || JSBNG__Date.now()));\n        this.update_period = ((pa.updatePeriod || 60000));\n        this.latest_notif_time = ((pa.latestNotif || 0));\n        this.latest_read_notif_time = ((pa.latestReadNotif || 0));\n        this.cache_version = ((pa.cacheVersion || 0));\n        this.notifReceivedType = ((pa.notifReceivedType || \"notification\"));\n        this.wrapperID = ((pa.wrapperID || \"notificationsWrapper\"));\n        this.contentID = ((pa.contentID || \"jewelNotifs\"));\n        this.shouldLogImpressions = ((pa.shouldLogImpressions || false));\n        this.allowDesktopNotifications = ((pa.allowDesktopNotifications || false));\n        this.logAutoShutOffImpression = true;\n        this.useInfiniteScroll = ((pa.useInfiniteScroll || false));\n        this.unseenVsUnread = ((pa.unseenVsUnread || false));\n        this.scrollableAreaNode = null;\n        this.firstReceiptMap = {\n        };\n        this.user = o.user;\n        this.queuedNotifications = [];\n        this.timeElement = \"small.time\";\n        this.ua = new da();\n        this._init();\n    };\n;\n    ga(oa.prototype, {\n        TIME_TRAVEL: \"time_travel\",\n        ONLINE: \"online\",\n        SCROLL_OFF_TINY: \"scroll_off_tiny\",\n        INACTIVE_REFRESH: \"inactive_refresh\",\n        _init: function() {\n            this.cookieName = ((\"notifications_\" + this.user));\n            this.updateCheckCount = 0;\n            this.fetchListeners = [];\n            this.currentFetchRequest = null;\n            this.wrapper = ia(this.wrapperID);\n            this.JSBNG__content = ia(this.contentID);\n            this.jewelFlyout = ia(\"fbNotificationsFlyout\");\n            this.footer = n.JSBNG__find(this.jewelFlyout, \".jewelFooter\");\n            this.loadingIndicator = ia(((this.contentID + \"_loading_indicator\")));\n            this.NOTIF_JEWEL_REF = \"notif_jewel\";\n            this.notifLogger = q.create(\"notifications\");\n            s.init();\n            this.alertList = new t(this.JSBNG__content, this._getListParams());\n            this._updateCount();\n            ((((a.MinNotifications && a.MinNotifications.fetchSent())) && (this.fetch = ha)));\n            h.subscribe(l.getArbiterType(this.notifReceivedType), this._handleNotificationMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_read\"), this._handleNotificationsReadMsg.bind(this));\n            h.subscribe(l.getArbiterType(\"notifications_seen\"), this._handleNotificationsSeenMsg.bind(this));\n            h.subscribe(\"jewel/resize\", la(this._hideOverflow, this));\n            this.alertList.subscribe(t.UNREAD_COUNT_CHANGE_TYPE, this._updateCount.bind(this));\n            this._poller = new w({\n                interval: this.update_period,\n                setupRequest: this._update.bind(this),\n                clearOnQuicklingEvents: false,\n                dontStart: true\n            });\n            this._poller.start.bind(this._poller).defer(this.update_period, false);\n            if (this.wrapper) {\n                this.countSpan = n.JSBNG__find(this.wrapper, \"span.jewelCount span\");\n            }\n        ;\n        ;\n            this.initializeEvents();\n            this.fromDom();\n            if (this.useInfiniteScroll) {\n                this._autoLoadNotifIndex = 1;\n                this._truncate = false;\n                this.alertList.subscribe(t.INSERTION_TYPE, this._handleInsert.bind(this));\n            }\n        ;\n        ;\n        },\n        _getListParams: function() {\n            return {\n                shouldBlockAnimation: function(pa) {\n                    return this.isNotifJewelOpen();\n                }.bind(this),\n                unseenVsUnread: this.unseenVsUnread,\n                markReadSignalServer: this.markRead.bind(this).curry(true)\n            };\n        },\n        fromDom: function() {\n            this.alertList.fromDom();\n            ((((((a.MinNotifications && a.MinNotifications.fetched())) && this.alertList.isEmpty())) && this.alertList.showNoNotifications()));\n        },\n        initializeEvents: function() {\n            var pa = this.alertList.ITEM_TAG, qa = null;\n            p.listen(this.JSBNG__content, {\n                mouseover: function(JSBNG__event) {\n                    var ta = JSBNG__event.getTarget();\n                    qa = v.byTag(ta, pa);\n                    if (((qa && ((ta != qa))))) {\n                        if (v.byClass(qa, \"notifNegativeBase\")) {\n                            m.addClass(qa, \"notifHover\");\n                        }\n                         else m.addClass(qa, \"selected\");\n                    ;\n                    }\n                ;\n                ;\n                },\n                mouseout: function(JSBNG__event) {\n                    ((qa && m.removeClass(qa, \"selected\")));\n                    ((qa && m.removeClass(qa, \"notifHover\")));\n                    qa = null;\n                },\n                mousedown: this.onContentMouseDown.bind(this)\n            });\n            p.listen(this.wrapper, \"mouseover\", this.onMouseOver.bind(this));\n            aa.listen(\"show\", this.wrapper, this.onClick.bind(this));\n            aa.listen(\"hide\", this.wrapper, this.onHide.bind(this));\n            ((this.shouldLogImpressions && aa.listen(\"show\", this.wrapper, this._logImpression.bind(this))));\n            var ra = function(ta) {\n                this._poller.request();\n                this.notifLogger.bump(ta);\n            }.bind(this);\n            z.subscribe(z.TIME_TRAVEL, ra.curry(this.TIME_TRAVEL));\n            z.subscribe(z.ONLINE, function(ta, ua) {\n                ((ua && ra(this.ONLINE)));\n            });\n            var sa = ((((1000 * 60)) * 60));\n            ca.subscribe(function(ta, ua) {\n                ((((ua.idleness > sa)) && ra(this.INACTIVE_REFRESH)));\n            }.bind(this));\n            this.negativeNotifs = {\n            };\n            this._initNotifNegativeFeedback();\n            if (this.useInfiniteScroll) {\n                this._setupScroll();\n                this._initializeScrollEvents();\n                this._updateScrollDataStructures.bind(this).defer();\n                this._hideOverflow();\n            }\n        ;\n        ;\n        },\n        _setupScroll: function() {\n            this._scrollArea = n.scry(this.jewelFlyout, \"div.uiScrollableAreaWrap\")[0];\n            this._morePagerLink = n.JSBNG__find(this.jewelFlyout, \".notifMorePager a\");\n            this._morePager = ((v.byClass(this._morePagerLink, \"notifMorePager\") || this._morePagerLink));\n            this._infiniteScrollNotif = null;\n            this.afterFirstFetch = false;\n            this.animate = false;\n            if (((a.MinNotifications && a.MinNotifications.fetched()))) {\n                this.afterFirstFetch = true;\n                m.show(this._morePager);\n            }\n        ;\n        ;\n        },\n        _initializeScrollEvents: function() {\n            p.listen(this._scrollArea, \"JSBNG__scroll\", ma(this._handleScroll.bind(this)));\n            p.listen(this._morePagerLink, \"success\", function(pa) {\n                this.fetchHandler(pa.getData().response);\n            }.bind(this));\n        },\n        _updateScrollDataStructures: ((window.top.JSBNG_Replay.push)((window.top.JSBNG_Replay.s5f7fb1571d9ddaabf0918a66ba121ad96869441c_256), function() {\n            var pa = this.alertList.getIds(), qa = Math.max(0, ((pa.length - this._autoLoadNotifIndex)));\n            this._infiniteScrollNotif = this.alertList.getDomObj(pa[qa]);\n            this._annotateMorePagerURI();\n        })),\n        _annotateMorePagerURI: function() {\n            this._morePagerLink.setAttribute(\"ajaxify\", new ba(this._morePagerLink.getAttribute(\"ajaxify\")).addQueryData({\n                earliest_time: this.alertList.getEarliestNotifTime()\n            }));\n        },\n        onContentMouseDown: function(JSBNG__event) {\n            var pa = v.byTag(JSBNG__event.getTarget(), this.alertList.ITEM_TAG), qa = ((pa && t.getIdFromDom(pa)));\n            if (((qa && this.alertList.isUnreadId(qa)))) {\n                this.markRead(true, [qa,]);\n            }\n        ;\n        ;\n        },\n        onMouseOver: function(JSBNG__event) {\n            if (m.hasClass(JSBNG__event.getTarget(), \"jewelButton\")) {\n                this.ua = na(\"notifs\", JSBNG__event.target, JSBNG__event, {\n                    mode: \"DEDUP\"\n                }).uai(\"mouseover\", \"jewel\").add_event(\"hover\");\n            }\n        ;\n        ;\n            this.fetch();\n        },\n        onClick: function() {\n            ((((a.ArbiterMonitor && ((this.fetch != ha)))) && h.registerCallback(ha, [\"notifs/fetched\",])));\n            this.ua.add_event(\"show\");\n            this.fetch();\n            this.markRead(true);\n            this._hideOverflow();\n            if (this.scrollableAreaNode) {\n                var pa = x.getInstance(this.scrollableAreaNode);\n                ((pa && pa.poke()));\n            }\n        ;\n        ;\n        },\n        onHide: function() {\n            this.animate = false;\n            ((this.animation && this.animation.JSBNG__stop()));\n            this.ua.add_event(\"hide\");\n            this.markRead(true);\n            this._dequeueNotifications();\n        },\n        _dequeueNotifications: function() {\n            this.queuedNotifications.forEach(function(pa) {\n                this._displayNotification(pa.type, pa.data);\n            }, this);\n            this.queuedNotifications.length = 0;\n        },\n        _handleScroll: function() {\n            if (this._checkInfiniteScroll()) {\n                this._autoLoadNotifIndex = 5;\n                this._sendFetchRequest(this._morePager);\n            }\n        ;\n        ;\n        },\n        _handleInsert: function(pa, qa) {\n            if (qa.is_new) {\n                this._newDataFromInsert = true;\n            }\n        ;\n        ;\n            this._updateScrollDataStructures();\n        },\n        _checkInfiniteScroll: function() {\n            if (((this._infiniteScrollNotif && this._scrollArea))) {\n                var pa = ea.getElementPosition(this._infiniteScrollNotif).y, qa = ((ea.getElementPosition(this._scrollArea).y + ea.getElementDimensions(this._scrollArea).y));\n                return ((pa < qa));\n            }\n        ;\n        ;\n            return false;\n        },\n        _initNotifNegativeFeedback: function() {\n            u.init(this);\n            this.alertList.setFilterFn(u.filterStoreClicked);\n            aa.listen(\"hide\", fa(this.wrapperID), function() {\n                {\n                    var fin187keys = ((window.top.JSBNG_Replay.forInKeys)((this.negativeNotifs))), fin187i = (0);\n                    var pa;\n                    for (; (fin187i < fin187keys.length); (fin187i++)) {\n                        ((pa) = (fin187keys[fin187i]));\n                        {\n                            if (pa) {\n                                ((((this.negativeNotifs[pa] instanceof r)) && this.negativeNotifs[pa].reset()));\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            }.bind(this));\n            h.subscribe(\"notif/negativeCancel\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].restore()));\n            }.bind(this));\n            h.subscribe(\"notif/negativeConfirmed\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onTurnedOff()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, true, true);\n                this._hideOverflow();\n                this._handleScroll();\n            }.bind(this));\n            h.subscribe(\"notif/negativeUndid\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onUndid()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n                this._hideOverflow();\n            }.bind(this));\n            h.subscribe(\"notif/negativeMarkedSpam\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onMarkedSpam()));\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptYes\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptYes()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            h.subscribe(\"notif/negativeFirstReceiptNo\", function(pa, qa) {\n                ((this.negativeNotifs[qa.id] && this.negativeNotifs[qa.id].onFirstReceiptNo()));\n                this.alertList.toggleNotifsSimilarTo(qa.id, false, true);\n            }.bind(this));\n            this.alertList.subscribe(t.INSERTION_TYPE, function(pa, qa) {\n                this._updateFirstReceipt(qa);\n                var ra = n.scry(qa.obj, \".notif_x\");\n                if (((ra.length == 1))) {\n                    this.negativeNotifs[qa.id] = new r(this, qa);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _sendIDs: function(pa, qa, ra) {\n            var sa = ((ra || {\n            }));\n            for (var ta = 0; ((ta < pa.length)); ++ta) {\n                sa[((((\"alert_ids[\" + ta)) + \"]\"))] = pa[ta];\n            ;\n            };\n        ;\n            new j(ba(qa).getQualifiedURI().toString(), sa).send();\n        },\n        _waitForFetch: function(pa) {\n            return ((this.currentFetchRequest && this.fetchListeners.push(pa.bind(this))));\n        },\n        _logImpression: function() {\n            var pa = this.alertList.getIds();\n            if (((((pa.length === 0)) && this._waitForFetch(this._logImpression)))) {\n                return;\n            }\n        ;\n        ;\n            this.logImpressionIds(pa, this.NOTIF_JEWEL_REF);\n        },\n        logImpressionIds: function(pa, qa) {\n            ((this.shouldLogImpressions && this._sendIDs(pa, \"/ajax/notifications/impression.php\", {\n                ref: qa\n            })));\n        },\n        markRead: function(pa, qa) {\n            var ra = !ja(qa);\n            qa = ((ra ? this.alertList.getUnseenIds() : qa.filter(this.alertList.isUnreadId.bind(this.alertList))));\n            if (qa.length) {\n                ((pa && this._sendIDs(qa, \"/ajax/notifications/mark_read.php\", {\n                    seen: ((ra ? 1 : 0))\n                })));\n                if (((ia(\"jewelNoticeMessage\") && this.logAutoShutOffImpression))) {\n                    new j(\"/ajax/notifications/auto_shutoff_seen.php\").send();\n                    this.logAutoShutOffImpression = false;\n                }\n            ;\n            ;\n                var sa = pa;\n                ((ra ? this.alertList.markSeen(qa) : this.alertList.markRead(qa, sa)));\n            }\n        ;\n        ;\n            ((ra && this._waitForFetch(this.markRead.bind(this, pa))));\n        },\n        markAllRead: function() {\n            var pa = this.alertList.getUnreadIds();\n            this.markRead(true, pa);\n        },\n        _updateErrorHandler: function(pa) {\n        \n        },\n        _updateURI: \"/ajax/presence/update.php\",\n        _update: function(pa) {\n            pa.setHandler(this._handleUpdate.bind(this)).setOption(\"suppressErrorAlerts\", true).setErrorHandler(this._updateErrorHandler.bind(this)).setData({\n                notif_latest: this.latest_notif_time,\n                notif_latest_read: this.latest_read_notif_time\n            }).setURI(this._updateURI).setAllowCrossPageTransition(true);\n        },\n        _handleUpdate: function(pa) {\n            var qa = pa.payload.notifications;\n            if (!qa.no_change) {\n                this.updateTime = pa.payload.time;\n                this.latest_notif_time = qa.latest_notif;\n                this.latest_read_notif_time = qa.latest_read_notif;\n                this._updateDisplay();\n                this.alertList.insertMany(qa.notifications);\n            }\n        ;\n        ;\n        },\n        _updateDisplay: function() {\n            if (!this.JSBNG__content) {\n                return;\n            }\n        ;\n        ;\n            this._updateCount();\n        },\n        _updateCount: function() {\n            h.inform(\"jewel/count-updated\", {\n                jewel: \"notifications\",\n                count: this.alertList.unseenCount\n            }, h.BEHAVIOR_STATE);\n            this._hideOverflow();\n        },\n        fetch: function(pa) {\n            this._sendFetchRequest(pa);\n        },\n        _getFetchQueryData: function() {\n            var pa = {\n                time: this.latest_notif_time,\n                user: this.user,\n                version: this.cache_version,\n                locale: o.locale\n            };\n            if (this.useInfiniteScroll) {\n                pa.earliest_time = this.alertList.getEarliestNotifTime();\n            }\n        ;\n        ;\n            return pa;\n        },\n        _sendFetchRequest: function(pa) {\n            if (this.useInfiniteScroll) {\n                this._infiniteScrollNotif = null;\n                this._newDataFromInsert = false;\n                this._truncate = true;\n            }\n        ;\n        ;\n            var qa = ba(\"/ajax/notifications/get.php\"), ra = ((pa || this.loadingIndicator));\n            if (this.currentFetchRequest) {\n                return true;\n            }\n        ;\n        ;\n            this.ua.add_event(\"fetch\");\n            qa.setQueryData(this._getFetchQueryData());\n            this.currentFetchRequest = new i().setURI(qa).setStatusElement(ra).setMethod(\"GET\").setReadOnly(true).setTimeoutHandler(30000, this.fetchErrorHandler.bind(this)).setHandler(this.fetchHandler.bind(this)).setErrorHandler(this.fetchErrorHandler.bind(this)).setAllowCrossPageTransition(true);\n            ((!this.currentFetchRequest.send() && this.fetchErrorHandler()));\n            return true;\n        },\n        fetchErrorHandler: function(pa) {\n            this.currentFetchRequest = null;\n            this.ua.add_event(\"fetch_error\");\n            ((this.loadingIndicator && m.hide(this.loadingIndicator)));\n            ((this.useInfiniteScroll && this._updateScrollDataStructures()));\n        },\n        fetchHandler: function(pa) {\n            this.ua.add_event(\"fetch_success\");\n            var qa = pa.getPayload();\n            this.alertList.insertMany(qa.notifications, true);\n            ((this.loadingIndicator && m.hide(this.loadingIndicator)));\n            this.loadingIndicator = null;\n            this.currentFetchRequest = null;\n            this.fetch = ha;\n            if (this.fetchListeners) {\n                for (var ra = 0; ((ra < this.fetchListeners.length)); ra++) {\n                    this.fetchListeners[ra]();\n                ;\n                };\n            ;\n                this.fetchListeners = [];\n            }\n        ;\n        ;\n            ((a.ArbiterMonitor && h.inform(\"notifs/fetched\", \"\", h.BEHAVIOR_STATE)));\n            var sa = qa.generated, ta = Math.round(((JSBNG__Date.now() / 1000)));\n            if (((((ta - sa)) > 15))) {\n                sa = ta;\n            }\n        ;\n        ;\n            k.loadModules([\"LiveTimer\",], function(ua) {\n                ua.restart(sa);\n                ua.startLoop(0);\n            });\n            if (this.useInfiniteScroll) {\n                if (((ka(qa.notifications) || !this._newDataFromInsert))) {\n                    this._noMoreNotifications();\n                }\n                 else m.show(this._morePager);\n            ;\n            ;\n                this._updateScrollDataStructures();\n                if (((this.isNotifJewelOpen() && this.afterFirstFetch))) {\n                    this.animate = true;\n                }\n            ;\n            ;\n                this.afterFirstFetch = true;\n            }\n        ;\n        ;\n            this._hideOverflow();\n        },\n        _noMoreNotifications: function() {\n            m.hide(this._morePager);\n            this.useInfiniteScroll = false;\n        },\n        _mergeNotification: function(pa, qa, ra, sa) {\n            var ta = !this.alertList.isUnreadId(pa);\n            this.alertList.insert(pa, qa, ra, true, null, ((sa || null)));\n            this.latest_notif_time = 0;\n            if (ta) {\n                this._updateCount();\n            }\n        ;\n        ;\n            var ua = this.alertList.getDomObj(pa);\n            if (ua) {\n                k.loadModules([\"LiveTimer\",], function(va) {\n                    va.addTimeStamps(ua);\n                });\n            }\n        ;\n        ;\n        },\n        _handleNotificationMsg: function(pa, qa) {\n            if (this.isNotifJewelOpen()) {\n                var ra = {\n                    type: pa,\n                    data: qa\n                };\n                this.queuedNotifications.push(ra);\n            }\n             else this._displayNotification(pa, qa);\n        ;\n        ;\n        },\n        _displayNotification: function(pa, qa) {\n            var ra = qa.obj;\n            if (((typeof this.useDesktopNotifications == \"undefined\"))) {\n                this.useDesktopNotifications = ((((this.allowDesktopNotifications && window.JSBNG__webkitNotifications)) && ((window.JSBNG__webkitNotifications.checkPermission() === 0))));\n            }\n        ;\n        ;\n            if (this.useDesktopNotifications) {\n                k.loadModules([\"DesktopNotifications\",], function(sa) {\n                    sa.addNotification(ra.alert_id);\n                });\n            }\n        ;\n        ;\n            if (ra.markup) {\n                this._mergeNotification(ra.alert_id, ra.time, ra.markup, ((ra.alt_id || null)));\n            }\n             else this._poller.request();\n        ;\n        ;\n        },\n        _handleNotificationsReadMsg: function(pa, qa) {\n            var ra = qa.obj;\n            this.markRead(false, ra.alert_ids);\n        },\n        _handleNotificationsSeenMsg: function(pa, qa) {\n            if (!this.unseenVsUnread) {\n                this._handleNotificationsReadMsg(pa, qa);\n                return;\n            }\n        ;\n        ;\n            var ra = qa.obj;\n            this.alertList.markSeen(ra.alert_ids);\n        },\n        _hideOverflow: function() {\n            if (!this.isNotifJewelOpen()) {\n                return;\n            }\n        ;\n        ;\n            var pa = n.scry(fa(\"fbNotificationsList\"), \".notification\");\n            this.scrollableAreaNode = ((this.scrollableAreaNode || n.scry(this.jewelFlyout, \".uiScrollableArea\")[0]));\n            var qa = 20, ra = ((m.hasClass(JSBNG__document.documentElement, \"tinyViewport\") && !m.hasClass(JSBNG__document.body, \"fixedBody\")));\n            if (((!pa.length || ra))) {\n                y.set(this.scrollableAreaNode, \"height\", \"100%\");\n                this.notifLogger.rate(this.SCROLL_OFF_TINY, ra);\n                return;\n            }\n        ;\n        ;\n            var sa = ((this.scrollableAreaNode || pa[0])), ta = ((((((ea.getViewportDimensions().y - ea.getElementPosition(sa, \"viewport\").y)) - ea.getElementDimensions(this.footer).y)) - 5)), ua = ta, va = 0;\n            for (; ((((va < pa.length)) && ((ua > 0)))); ++va) {\n                if (m.shown(pa[va])) {\n                    ua -= ea.getElementDimensions(pa[va]).y;\n                }\n            ;\n            ;\n            };\n        ;\n            var wa = 530, xa = Math.min(wa, ((ta - Math.max(ua, 0))));\n            if (((((ua >= 0)) && ((xa < wa))))) {\n                if (!this.useInfiniteScroll) {\n                    xa = \"100%\";\n                }\n                 else {\n                    if (((this._truncate && ((pa.length >= 5))))) {\n                        xa -= qa;\n                    }\n                ;\n                ;\n                    xa += \"px\";\n                }\n            ;\n            ;\n            }\n             else xa += \"px\";\n        ;\n        ;\n            if (((((this.useInfiniteScroll && this.animate)) && ((xa != \"100%\"))))) {\n                ((this.animation && this.animation.JSBNG__stop()));\n                this.animation = new g(this.scrollableAreaNode).to(\"height\", xa).duration(200).go();\n            }\n             else {\n                var ya = x.getInstance(this.scrollableAreaNode);\n                ((ya && ya.showScrollbar.bind(ya).defer()));\n                y.set(this.scrollableAreaNode, \"height\", xa);\n            }\n        ;\n        ;\n        },\n        _updateFirstReceipt: function(pa) {\n            var qa = pa.obj.getAttribute(\"data-appid\"), ra = n.scry(pa.obj, \".first_receipt_div\");\n            if (((qa && ((ra.length == 1))))) {\n                if (this.firstReceiptMap[qa]) {\n                    if (((((pa.id != this.firstReceiptMap[qa].id)) && ((this.firstReceiptMap[qa].time > pa.time))))) {\n                        return;\n                    }\n                ;\n                ;\n                    m.removeClass(this.firstReceiptMap[qa].obj, \"first_receipt\");\n                }\n            ;\n            ;\n                this.firstReceiptMap[qa] = pa;\n                m.addClass(pa.obj, \"first_receipt\");\n            }\n        ;\n        ;\n        },\n        isNotifJewelOpen: function() {\n            var pa = aa.getInstance(this.wrapper).getActive();\n            return ((((pa === this.wrapper)) && m.hasClass(pa, \"openToggler\")));\n        }\n    });\n    e.exports = oa;\n});\n__d(\"legacy:original-notifications-jewel\", [\"Notifications\",], function(a, b, c, d) {\n    a.Notifications = b(\"Notifications\");\n}, 3);\n__d(\"PagesVoiceBar\", [\"$\",\"Arbiter\",\"AsyncRequest\",\"JSBNG__CSS\",\"ChannelConstants\",\"DOM\",\"PageTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"JSBNG__CSS\"), k = b(\"ChannelConstants\"), l = b(\"DOM\"), m = b(\"PageTransitions\"), n = \"PagesVoiceBar/toggle\", o = \"PagesVoiceBar/initialized\", p = \"PagesVoiceBar/switchVoice\", q = \"page_transition\", r = \"pages_voice_bar_sync\", s = null, t = null, u = false, v = false;\n    function w() {\n        v = !v;\n        j.conditionClass(JSBNG__document.body, \"hasVoiceBar\", v);\n    };\n;\n    function x(da, ea) {\n        new i(\"/ajax/pages/switch_voice.php\").setData(ea).setHandler(function(fa) {\n            ba();\n        }).send();\n    };\n;\n    function y() {\n        s = null;\n    };\n;\n    function z(da, ea) {\n        if (((ea.obj.profile_id && ((ea.obj.profile_id == s))))) {\n            ba();\n        }\n    ;\n    ;\n    };\n;\n    function aa(da) {\n        h.subscribe(o, da);\n    };\n;\n    function ba() {\n        m.getNextURI().go();\n    };\n;\n    var ca = {\n        initVoiceBar: function() {\n            if (u) {\n                return;\n            }\n        ;\n        ;\n            t = g(\"pagesVoiceBarContent\");\n            v = j.hasClass(JSBNG__document.body, \"hasVoiceBar\");\n            h.subscribe(n, w);\n            h.subscribe(p, x);\n            h.subscribe(q, y);\n            h.subscribe(k.getArbiterType(r), z);\n            u = true;\n            h.inform(o, null, h.BEHAVIOR_STATE);\n        },\n        update: function(da, ea) {\n            aa(function() {\n                s = ea;\n                l.setContent(t, da);\n            });\n        }\n    };\n    e.exports = ca;\n});\n__d(\"PrivacyLiteFlyout\", [\"JSBNG__Event\",\"function-extensions\",\"$\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"Ease\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"Toggler\",\"copyProperties\",\"cx\",\"csx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"$\"), i = b(\"Animation\"), j = b(\"Arbiter\"), k = b(\"ArbiterMixin\"), l = b(\"AsyncRequest\"), m = b(\"JSBNG__CSS\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"Parent\"), q = b(\"SelectorDeprecated\"), r = b(\"Style\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"csx\"), w = b(\"ge\"), x = \"PrivacyLiteFlyout/expandingSection\", y = {\n    }, z = {\n    };\n    function aa() {\n        switch (window.JSBNG__location.pathname) {\n          case \"/\":\n        \n          case \"/home.php\":\n        \n          case \"/index.php\":\n            return true;\n          default:\n            return false;\n        };\n    ;\n    };\n;\n    function ba(ka) {\n        var la = \".-cx-PUBLIC-PrivacyLiteFlyoutNav__label\";\n        return ((!p.byClass(ka, \"hasSmurfbar\") && n.scry(h(\"blueBar\"), la).length));\n    };\n;\n    function ca(ka, la, ma) {\n        var na = ((la ? 0 : ka.offsetHeight));\n        r.set(ka, \"height\", ((na + \"px\")));\n        r.set(ka, \"overflow\", \"hidden\");\n        m.show(ka);\n        var oa = ((la ? ka.scrollHeight : 0)), pa = n.getID(ka);\n        ((y[pa] && y[pa].JSBNG__stop()));\n        y[pa] = new i(ka).to(\"height\", oa).ondone(function() {\n            y[pa] = null;\n            r.set(ka, \"height\", \"\");\n            r.set(ka, \"overflow\", \"\");\n            ((oa || m.hide(ka)));\n            ma();\n        }).duration(((Math.abs(((oa - na))) * 1.5))).ease(o.sineOut).go();\n    };\n;\n    function da(ka) {\n        return new l().setURI(ka).send();\n    };\n;\n    function ea() {\n        return da(\"/ajax/privacy/privacy_lite/increment_masher_tip_count\");\n    };\n;\n    function fa() {\n        return da(\"/ajax/privacy/privacy_lite/dismiss_masher_tip\");\n    };\n;\n    var ga = null, ha = false, ia = false, ja = t({\n        loadBody: function(ka) {\n            if (((!ha && w(\"fbPrivacyLiteFlyoutLoading\")))) {\n                ha = true;\n                if (!ka) {\n                    ka = false;\n                }\n            ;\n            ;\n                new l(\"/ajax/privacy/privacy_lite/loader\").setData({\n                    from_megaphone: ka\n                }).send();\n            }\n        ;\n        ;\n        },\n        renderBody: function(ka) {\n            var la = w(\"fbPrivacyLiteFlyoutLoading\");\n            if (la) {\n                n.replace(la, ka);\n                ja.inform(\"load\", null, j.BEHAVIOR_STATE);\n            }\n        ;\n        ;\n        },\n        hideCleanup: function(ka) {\n            j.inform(x);\n            var la = n.scry(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\").forEach(function(ma) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n            });\n        },\n        registerFlyoutToggler: function(ka, la) {\n            ga = la;\n            var ma = s.createInstance(ka);\n            ma.setSticky(false);\n            s.listen([\"show\",\"hide\",], la, function(na) {\n                ja.inform(na);\n                ia = ((na === \"show\"));\n                if (!ia) {\n                    ja.hideCleanup(ka);\n                    ma.hide();\n                    j.inform(\"layer_hidden\", {\n                        type: \"PrivacyShortcutsFlyout\"\n                    });\n                }\n                 else j.inform(\"layer_shown\", {\n                    type: \"PrivacyShortcutsFlyout\"\n                });\n            ;\n            ;\n            });\n        },\n        registerFinalReminderFlyout: function(ka) {\n            if (((ia || !aa()))) {\n                return;\n            }\n        ;\n        ;\n            var la = n.JSBNG__find(ka.getRoot(), \".-cx-PRIVATE-PrivacyLiteFinalReminder__okay\"), ma = ka.getContext();\n            if (ba(ma)) {\n                ka.setOffsetY(-5);\n            }\n        ;\n        ;\n            ja.subscribe(\"show\", function() {\n                ka.hide();\n            });\n            var na = g.listen(la, \"click\", function() {\n                ka.hide();\n                da(\"/ajax/privacy/privacy_lite/dismiss_rollout_reminder\");\n                na.remove();\n            });\n            da(\"/ajax/privacy/privacy_lite/increment_rollout_reminder\");\n            ka.show();\n        },\n        isFlyoutVisible: function() {\n            return ((ga && ((s.getActive() === ga))));\n        },\n        exists: function() {\n            return !!n.scry(JSBNG__document.body, \".-cx-PUBLIC-PrivacyLiteFlyoutNav__button\")[0];\n        },\n        setFlyoutVisible: function(ka) {\n            ((ka ? s.show(ga) : s.hide(ga)));\n        },\n        showSection: function(ka) {\n            var la = z[ka], ma = la.chevron, na = la.sublist_container;\n            j.inform(x, ma);\n            if (((ja.inform(\"expand\", ka) !== false))) {\n                m.removeClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.addClass(ma, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(na, true, function() {\n                    ja.inform(\"expanded\", ka);\n                });\n            }\n        ;\n        ;\n        },\n        hideSection: function(ka, la, ma) {\n            var na = z[ka], oa = na.chevron, pa = na.sublist_container;\n            if (((ma === oa))) {\n                return;\n            }\n        ;\n        ;\n            if (((ja.inform(\"collapse\", ka) !== false))) {\n                m.addClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\");\n                m.removeClass(oa, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevroncollapse\");\n                ca(pa, false, function() {\n                    ja.inform(\"collapsed\", ka);\n                });\n            }\n        ;\n        ;\n        },\n        toggleSection: function(ka) {\n            var la = z[ka].chevron;\n            s.getInstance(la).hide();\n            if (m.hasClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__chevronexpand\")) {\n                ja.showSection(ka);\n                new l(\"/ajax/privacy/privacy_lite/log_section_expand\").setData({\n                    section: ka\n                }).send();\n            }\n             else ja.hideSection(ka);\n        ;\n        ;\n        },\n        registerSection: function(ka, la) {\n            z[ka] = la;\n            j.subscribe(x, ja.hideSection.curry(ka));\n            g.listen(la.section_block, \"click\", ja.toggleSection.curry(ka));\n        },\n        registerInlineHelpOnAudienceChange: function(ka, la, ma) {\n            q.subscribe(\"select\", function(na, oa) {\n                if (((oa.selector != ka))) {\n                    return;\n                }\n            ;\n            ;\n                m.addClass(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__changedcomposer\");\n                if (ma) {\n                    new l(\"/ajax/privacy/privacy_lite/kill_intro\").send();\n                }\n            ;\n            ;\n            });\n        },\n        registerInlineHelpXOutOnClick: function(ka, la) {\n            g.listen(ka, \"click\", m.addClass.curry(la, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__reallygone\"));\n        },\n        registerBlockUnhideOnFocus: function(ka, la) {\n            g.listen(ka, \"JSBNG__focus\", m.show.curry(la));\n        },\n        registerMessageFilterSettingOnClick: function(ka, la) {\n            var ma = n.JSBNG__find(ka, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__filterradio\");\n            g.listen(ka, \"click\", function() {\n                if (ma.checked) {\n                    new l(\"/ajax/mercury/change_filtering_type.php\").setData({\n                        filtering_type: la,\n                        source: \"privacy_lite\"\n                    }).send();\n                }\n            ;\n            ;\n            });\n        },\n        registerGraphSearchPrivacyReminder: function(ka, la) {\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                da(\"/ajax/privacy/privacy_lite/dismiss_gs_privacy_reminder\");\n            });\n        },\n        registerMasher: function(ka, la) {\n            var ma = false;\n            j.subscribe(x, function(na, oa) {\n                var pa = n.scry(p.byTag(oa, \"li\"), \".-cx-PRIVATE-PrivacyLiteFlyoutNav__notice\").length;\n                if (((ma || !pa))) {\n                    return;\n                }\n            ;\n            ;\n                ma = Boolean(ea());\n            });\n            g.listen(la, \"click\", function() {\n                n.remove(ka);\n                fa();\n            });\n        }\n    }, k);\n    e.exports = ja;\n});\n__d(\"PrivacyLiteFlyoutHelp\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"ContextualHelpSearchController\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"ContextualHelpSearchController\"), k = b(\"JSBNG__CSS\"), l = b(\"DOM\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q, r;\n    function s(t, u, v, w, x) {\n        this._width = 315;\n        r = l.JSBNG__find(u, \"input\");\n        var y = l.create(\"div\");\n        this.init(t, r, y, v, w);\n        q = m.byClass(u, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__root\");\n        g.listen(x, \"click\", this._hideSearch.bind(this));\n        h.subscribe(\"PrivacyLiteFlyout/expandingSection\", this._hideSearch.bind(this));\n        var z = l.scry(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchlink\")[0];\n        ((z && g.listen(z, \"click\", function() {\n            k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n            r.JSBNG__focus();\n            if (!this.suggestedResults) {\n                new i(\"/ajax/privacy/privacy_lite/help_suggestions\").setHandler(function(aa) {\n                    var ba = aa.getPayload().searchSuggestions, ca = l.JSBNG__find(q, \".-cx-PRIVATE-PrivacyLiteFlyoutNav__searchsuggestions\");\n                    l.setContent(ca, ba);\n                    k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__hassearchsuggestions\");\n                }.bind(this)).send();\n            }\n        ;\n        ;\n        }.bind(this))));\n    };\n;\n    n(s.prototype, new j(), {\n        source: \"privacy_shortcuts\",\n        _hideSearch: function() {\n            this.clearResults();\n            k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__searchenabled\");\n        },\n        show: function(t) {\n            if (((t === this.topics_area))) {\n                k.removeClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                return;\n            }\n             else if (((t === this.loader))) {\n                k.addClass(q, \"-cx-PRIVATE-PrivacyLiteFlyoutNav__helpenabled\");\n                k.hide(this.results_area);\n            }\n             else k.hide(this.loader);\n            \n        ;\n        ;\n            k.show(t);\n        }\n    });\n    e.exports = s;\n});\n__d(\"ViewasChromeBar\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"Focus\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Focus\"), m = b(\"ModalMask\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"cx\"), q = b(\"csx\"), r = \"ViewasChromeBar/initialized\", s = null, t = false;\n    function u(x) {\n        h.subscribe(r, x);\n    };\n;\n    function v(x) {\n        j.addClass(x, \"-cx-PRIVATE-ViewasChromeBar__specificselectormode\");\n        var y = k.JSBNG__find(x, \".-cx-PRIVATE-ViewasChromeBar__userselector\");\n        l.set(k.JSBNG__find(y, \".textInput\"));\n    };\n;\n    var w = {\n        initChromeBar: function(x) {\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            s = x;\n            t = true;\n            h.inform(r, null, h.BEHAVIOR_STATE);\n        },\n        update: function(x, y) {\n            u(function() {\n                k.setContent(s, x);\n                if (y) {\n                    new i(\"/ajax/privacy/glasgow/viewas_bar_flyout_open\").send();\n                }\n            ;\n            ;\n            });\n        },\n        registerSpecificModeOnClick: function(x) {\n            g.listen(x, \"click\", v.curry(o.byClass(x, \"-cx-PRIVATE-ViewasChromeBar__text\")));\n        },\n        registerFlyoutModalMask: function() {\n            m.show();\n            n.registerHandler(m.hide, 10);\n        }\n    };\n    e.exports = w;\n});\n__d(\"BingScalingCommon\", [], function(a, b, c, d, e, f) {\n    var g = {\n        integrateWebsuggestions: function(h, i, j, k, l) {\n            var m = [], n = ((i ? m : [])), o = [], p = 0, q = 0, r = j;\n            k = Math.floor(((j * k)));\n            for (var s = 0; ((s < h.length)); s++) {\n                var t = h[s];\n                if (((((t.type === \"websuggestion\")) && !t.isSeeMore))) {\n                    if (((((((r > 0)) && ((p < k)))) || ((((p > 0)) && ((p < l))))))) {\n                        n.push(t);\n                        p++;\n                        r--;\n                    }\n                     else if (((r > 0))) {\n                        o.push(t);\n                    }\n                    \n                ;\n                ;\n                }\n                 else {\n                    if (((((r <= 0)) && !i))) {\n                        continue;\n                    }\n                ;\n                ;\n                    m.push(t);\n                    q++;\n                    r--;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((((r > 0)) && ((o.length > 0))))) {\n                n = n.concat(o.slice(0, r));\n            }\n        ;\n        ;\n            if (!i) {\n                return m.concat(n);\n            }\n        ;\n        ;\n            return n;\n        }\n    };\n    e.exports = g;\n});\n__d(\"TypeaheadSearchSponsoredUtils\", [], function(a, b, c, d, e, f) {\n    function g(o) {\n        return ((o.selected_target_id != o.s_target));\n    };\n;\n    function h(o, p) {\n        return Math.min(p.maxNumberAds, ((((p.maxNumberRemovedResults + p.maxNumberResultsAndAds)) - o)));\n    };\n;\n    function i(o, p) {\n        var q = {\n        };\n        for (var r = ((o.length - 1)); ((r >= 0)); --r) {\n            var s = o[r];\n            q[s] = s;\n            if (p.hasOwnProperty(s)) {\n                p[s].forEach(function(t) {\n                    q[t] = s;\n                });\n            }\n        ;\n        ;\n        };\n    ;\n        return q;\n    };\n;\n    function j(o, p, q) {\n        for (var r = p; ((r < o.length)); r++) {\n            ((o[r].setDebugString && o[r].setDebugString(q)));\n        ;\n        };\n    ;\n    };\n;\n    function k(o, p) {\n        return ((p.indexOf(String(o)) != -1));\n    };\n;\n    function l(o, p, q, r) {\n        if (n.isSelfPromoted(o)) {\n            return false;\n        }\n    ;\n    ;\n        if (((((q + p.length)) < r.maxNumberResultsAndAds))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function m(o, p, q, r) {\n        var s = o[((o.length - 1))];\n        if (p.hasOwnProperty(s)) {\n            return false;\n        }\n    ;\n    ;\n        if (((s == q))) {\n            return false;\n        }\n    ;\n    ;\n        if (((s == r))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    var n = {\n        isSelfPromoted: function(o) {\n            return ((o.uid == o.s_target));\n        },\n        prepareAndSortAds: function(o, p, q) {\n            if (!p) {\n                return [];\n            }\n        ;\n        ;\n            var r = [], s = o.length, t = {\n            };\n            for (var u = 0; ((u < s)); u++) {\n                var v = o[u];\n                t[v.uid] = true;\n                if (v.s_categories) {\n                    v.s_categories.forEach(function(z) {\n                        t[z] = true;\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            {\n                var fin188keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin188i = (0);\n                var w;\n                for (; (fin188i < fin188keys.length); (fin188i++)) {\n                    ((w) = (fin188keys[fin188i]));\n                    {\n                        if (p[w]) {\n                            {\n                                var fin189keys = ((window.top.JSBNG_Replay.forInKeys)((p[w]))), fin189i = (0);\n                                var x;\n                                for (; (fin189i < fin189keys.length); (fin189i++)) {\n                                    ((x) = (fin189keys[fin189i]));\n                                    {\n                                        var y = p[w][x];\n                                        if (((q && q.hasOwnProperty(y.uid)))) {\n                                            continue;\n                                        }\n                                    ;\n                                    ;\n                                        r.push(y);\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            r.sort(function(z, aa) {\n                return ((aa.s_value - z.s_value));\n            });\n            return r;\n        },\n        selectAds: function(o, p, q, r, s) {\n            var t = [], u = {\n            }, v = {\n            }, w = {\n            }, x = 0, y = h(o.length, r), z = i(o, p);\n            for (var aa = 0; ((aa < q.length)); aa++) {\n                if (((t.length >= y))) {\n                    j(q, aa, ((((\"filtered: \" + y)) + \" ads already selected\")));\n                    break;\n                }\n            ;\n            ;\n                var ba = q[aa], ca = ((z[ba.s_target] || ba.s_target));\n                ba.selected_target_id = ca;\n                if (!k(ca, o)) {\n                    ((ba.setDebugString && ba.setDebugString(((((((((\"filtered: targeted organic \" + ca)) + \" does not exist. \")) + \"promoted id \")) + ba.uid)))));\n                    continue;\n                }\n            ;\n            ;\n                if (((l(ba, o, x, r) && !m(o, v, ca, s)))) {\n                    ((ba.setDebugString && ba.setDebugString(\"filtered: last organic need but cannot be removed\")));\n                    continue;\n                }\n            ;\n            ;\n                if (((!n.isSelfPromoted(ba) && ((o.indexOf(String(ba.uid)) != -1))))) {\n                    ((ba.setDebugString && ba.setDebugString(((((((\"filtered: organic \" + ba.uid)) + \" targets another organic \")) + ca)))));\n                    continue;\n                }\n            ;\n            ;\n                if (u.hasOwnProperty(ba.s_account)) {\n                    ((ba.setDebugString && ba.setDebugString(((((\"filtered: ad account \" + ba.s_account)) + \" already selected\")))));\n                    continue;\n                }\n            ;\n            ;\n                if (w.hasOwnProperty(ba.uid)) {\n                    ((ba.setDebugString && ba.setDebugString(((((\"filtered: ad promoted id \" + ba.uid)) + \" already selected\")))));\n                    continue;\n                }\n            ;\n            ;\n                ((ba.setDebugString && ba.setDebugString(\"selected\")));\n                t.push(ba);\n                u[ba.s_account] = true;\n                v[ca] = true;\n                w[ba.uid] = true;\n                if (!n.isSelfPromoted(ba)) {\n                    ++x;\n                    if (((((x + o.length)) > r.maxNumberResultsAndAds))) {\n                        o.pop();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return t;\n        },\n        hasTopResult: function(o, p, q) {\n            if (((o == null))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.type == \"user\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.type == \"grammar\"))) {\n                return false;\n            }\n        ;\n        ;\n            if (((o.score > q.v0))) {\n                return true;\n            }\n        ;\n        ;\n            if (((o.s_value > q.v3))) {\n                return true;\n            }\n        ;\n        ;\n            if (((o.s_value > p.s_value))) {\n                return true;\n            }\n        ;\n        ;\n            var r = ((g(p) ? q.v4 : ((o.bootstrapped ? q.v1 : q.v2))));\n            if (((r < p.s_value))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        setOrganicECPM: function(o, p) {\n            if (((o == null))) {\n                return;\n            }\n        ;\n        ;\n            for (var q = 0; ((q < p.length)); q++) {\n                if (o.hasOwnProperty(p[q].uid)) {\n                    p[q].s_value = o[p[q].uid];\n                }\n            ;\n            ;\n            };\n        ;\n            return;\n        },\n        buildResultIndices: function(o) {\n            var p = {\n            }, q = o.length;\n            for (var r = 0; ((r < q)); r++) {\n                p[o[r].uid] = r;\n            ;\n            };\n        ;\n            return p;\n        },\n        getTopAdPosition: function(o, p, q) {\n            if (((o.length < 1))) {\n                return null;\n            }\n        ;\n        ;\n            if (((p.length < 1))) {\n                return null;\n            }\n        ;\n        ;\n            if (((((o[0].type == \"user\")) || ((o[0].type == \"grammar\"))))) {\n                for (var r = 1; ((r < o.length)); ++r) {\n                    if (((o[r].type != o[0].type))) {\n                        return r;\n                    }\n                ;\n                ;\n                };\n            ;\n                return o.length;\n            }\n        ;\n        ;\n            if (n.hasTopResult(o[0], p[0], q)) {\n                return 1;\n            }\n        ;\n        ;\n            return 0;\n        }\n    };\n    e.exports = n;\n});\n__d(\"TypeaheadSearchSponsored\", [\"JSBNG__Event\",\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"URI\",\"copyProperties\",\"TypeaheadSearchSponsoredUtils\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"URI\"), l = b(\"copyProperties\"), m = b(\"TypeaheadSearchSponsoredUtils\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n;\n    o.prototype.enable = function() {\n        this._data = this._typeahead.getData();\n        this._dataSubscriptions = [this._data.subscribe(\"beginFetchHandler\", function(p, q) {\n            var r = q.response.getPayload();\n            if (r.s_entries) {\n                this._sponsoredEntries = ((this._sponsoredEntries || {\n                }));\n                var s = r.s_entries.length;\n                for (var t = 0; ((t < s)); t++) {\n                    var u = new o.Ad();\n                    l(u, r.s_entries[t]);\n                    var v = u.s_target;\n                    if (!this._sponsoredEntries[v]) {\n                        this._sponsoredEntries[v] = {\n                        };\n                    }\n                ;\n                ;\n                    this._sponsoredEntries[v][u.uid] = u;\n                };\n            ;\n                if (r.s_bootstrap_id) {\n                    this._sBootstrapID = r.s_bootstrap_id;\n                }\n            ;\n            ;\n                if (r.organic_s_value) {\n                    this._organicECPM = l(this._organicECPM, r.organic_s_value);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this)),];\n        if (o.auctionOptions.bootstrap) {\n            this._dataSubscriptions.push(this._data.subscribe(\"JSBNG__onload\", function(p, q) {\n                var r = l(this.bootstrapData, {\n                    no_cache: 1,\n                    options: [\"sponsored\",]\n                });\n                this.fetch(this.bootstrapEndpoint, r, {\n                    type: \"sponsored\"\n                });\n            }.bind(this._data)));\n        }\n    ;\n    ;\n        this._view = this._typeahead.getView();\n        this._viewSubscriptions = [this._view.subscribe(\"finalResultsReordering\", function(p, q) {\n            o.query = q.value;\n            m.setOrganicECPM(this._organicECPM, q.results);\n            var r = o.getOriginalOrganics(q.results);\n            o.setAuctionOptions({\n                maxNumberResultsAndAds: Math.max(q.results.length, ((((this._data && this._data._maxResults)) || o.auctionOptions.maxNumberResultsAndAds)))\n            });\n            var s = this.runAuction(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities, o.auctionOptions), t = m.prepareAndSortAds(q.results, this._sponsoredEntries, this._hiddenSponsoredEntities), u = t.map(function(y) {\n                return y.s_token;\n            }), v = [];\n            for (var w = 0; ((w < s.length)); w++) {\n                var x = s[w];\n                if (x.s_token) {\n                    v.push({\n                        position: w,\n                        is_self: x.is_self\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            this._view.inform(\"recordAfterReorder\", {\n                organic: r,\n                tokens: u,\n                position_data: v,\n                s_bootstrap_id: this._sBootstrapID,\n                options: o.auctionOptions,\n                variant: o.auctionOptions.rerankingStrategy\n            });\n            q.results = s;\n            this._data.inform(\"recordAuctionState\", {\n                organic: r,\n                auctionOptions: o.auctionOptions,\n                event_data: q\n            });\n        }.bind(this)),this._view.subscribe(\"highlight\", function(p, q) {\n            if (this._view.JSBNG__content) {\n                j.scry(this._view.JSBNG__content, \"a.report\").forEach(i.hide);\n            }\n        ;\n        ;\n            if (((((!q.element || !q.selected)) || !q.selected.s_token))) {\n                return;\n            }\n        ;\n        ;\n            var r = j.scry(q.element, \"a.report\");\n            if (r.length) {\n                i.show(r[0]);\n            }\n             else j.appendContent(q.element, this._createHideAdLink(q.selected));\n        ;\n        ;\n        }.bind(this)),];\n        this._globalSubscriptions = [h.subscribe(\"TypeaheadSearchSponsored/hideAdResult\", function(p, q) {\n            this._hiddenSponsoredEntities = ((this._hiddenSponsoredEntities || {\n            }));\n            this._hiddenSponsoredEntities[q.uid] = true;\n            this._hideReasonDialog = q.reason_dialog;\n            this._forceRefreshResults();\n        }.bind(this)),h.subscribe(\"TypeaheadSearchSponsored/undoHideAdResult\", function(p, q) {\n            if (this._hiddenSponsoredEntities) {\n                delete this._hiddenSponsoredEntities[q.uid];\n            }\n        ;\n        ;\n            if (this._hideReasonDialog) {\n                this._hideReasonDialog.hide();\n                this._hideReasonDialog = null;\n            }\n        ;\n        ;\n            this._forceRefreshResults();\n        }.bind(this)),];\n    };\n    o.prototype.disable = function() {\n        this._dataSubscriptions.forEach(this._data.unsubscribe.bind(this._data));\n        this._dataSubscriptions = null;\n        this._viewSubscriptions.forEach(this._view.unsubscribe.bind(this._view));\n        this._viewSubscriptions = null;\n        this._globalSubscriptions.forEach(h.unsubscribe.bind(h));\n        this._globalSubscriptions = null;\n        this._data = null;\n        this._view = null;\n        this._sponsoredEntries = null;\n    };\n    o.prototype.runAuction = function(p, q, r, s) {\n        if (((p.length === 0))) {\n            return p;\n        }\n    ;\n    ;\n        p = o.initResults(p);\n        if (!q) {\n            return p;\n        }\n    ;\n    ;\n        var t = m.prepareAndSortAds(p, q, r);\n        if (this._typeahead) {\n            var u = this._typeahead.getData();\n            u.inform(\"recordAuctionState\", {\n                sorted_ads: t\n            });\n        }\n    ;\n    ;\n        var v = {\n        }, w = p.map(function(ba) {\n            if (ba.s_categories) {\n                v[ba.uid] = ba.s_categories;\n            }\n        ;\n        ;\n            return String(ba.uid);\n        }), x = m.selectAds(w, v, t, s);\n        if (((x.length === 0))) {\n            return p;\n        }\n    ;\n    ;\n        if (m.hasTopResult(p[0], x[0], s)) {\n            o.setTopResult(p);\n        }\n    ;\n    ;\n        var y = 0;\n        for (var z = 0; ((z < x.length)); ++z) {\n            if (!m.isSelfPromoted(x[z])) {\n                y++;\n            }\n        ;\n        ;\n        };\n    ;\n        p.length = Math.min(p.length, ((s.maxNumberResultsAndAds - y)));\n        var aa = o.rerankAds(p, x, s);\n        return aa;\n    };\n    o.prototype._forceRefreshResults = function() {\n        if (((this._data && this._data.value))) {\n            this._data.respond(this._data.value, this._data.buildUids(this._data.value));\n        }\n    ;\n    ;\n    };\n    o.prototype._createHideAdLink = function(p) {\n        var q = new k(\"/ajax/emu/end.php\").addQueryData({\n            eid: p.s_token,\n            f: 0,\n            ui: ((\"typeahead_\" + p.s_token.replace(\".\", \"_\"))),\n            en: \"fad_hide\",\n            ed: \"true\",\n            a: 1\n        }).toString(), r = {\n            className: \"report\",\n            rel: \"dialog-post\",\n            href: \"#\",\n            ajaxify: q,\n            title: \"Hide the ad\"\n        }, s = j.create(\"a\", r);\n        g.listen(s, \"mouseover\", function(JSBNG__event) {\n            this._view.index = -1;\n            this._view.highlight(-1, false);\n            JSBNG__event.kill();\n        }.bind(this));\n        return s;\n    };\n    o.auctionOptions = {\n    };\n    o.query = null;\n    o.getOriginalOrganics = function(p) {\n        return p.map(function(q) {\n            return {\n                uid: q.uid,\n                text: q.text,\n                type: o.getRealType(q),\n                source: ((q.bootstrapped ? 1 : 0)),\n                index: q.index,\n                s_value: ((q.s_value || 0)),\n                s_categories: ((q.s_categories || [])),\n                score: q.score\n            };\n        });\n    };\n    o.setTopResult = function(p) {\n        p[0].renderTypeOverride = true;\n        p[0].orig_render_type = p[0].render_type;\n        p[0].render_type = \"tophit\";\n    };\n    o.finalizeAd = function(p, q, r) {\n        var s = \"Sponsored\";\n        p.rankType = ((((p.rankType || p.render_type)) || p.type));\n        if (m.isSelfPromoted(p)) {\n            q.s_token = p.s_token;\n            q.message = p.s_message;\n            if (((r.rerankingStrategy === 0))) {\n                q.subtextOverride = ((q.subtext ? ((((q.subtext + \" \\u00b7 \")) + s)) : s));\n            }\n        ;\n        ;\n            if (p.path) {\n                q.pathOverride = true;\n                q.orig_path = q.path;\n                q.path = p.path;\n            }\n        ;\n        ;\n            q.is_self = true;\n        }\n         else {\n            p.message = p.s_message;\n            p.subtextOverride = null;\n            if (((r.rerankingStrategy === 0))) {\n                p.subtextOverride = ((p.subtext ? ((((p.subtext + \" \\u00b7 \")) + s)) : s));\n            }\n        ;\n        ;\n            if (r.debug) {\n                if (((!p.subtextOverride && p.subtext))) {\n                    p.subtextOverride = p.subtext;\n                }\n            ;\n            ;\n                if (p.subtextOverride) {\n                    p.subtextOverride += ((((\" \\u00b7 (Debug: \" + q.text)) + \")\"));\n                }\n                 else p.subtextOverride = ((((\"(Debug: \" + q.text)) + \")\"));\n            ;\n            ;\n            }\n        ;\n        ;\n            p.type = q.type;\n            p.render_type = q.render_type;\n            p.is_self = false;\n        }\n    ;\n    ;\n    };\n    o.promoteSelfPromotedResultToTop = function(p, q, r, s) {\n        var t = p[q];\n        if (((q < r))) {\n            var u = \"Sponsored\";\n            t.subtextOverride = ((t.subtext ? ((((t.subtext + \" \\u00b7 \")) + u)) : u));\n            return;\n        }\n    ;\n    ;\n        if (((q > r))) {\n            p.splice(r, 0, p.splice(q, 1)[0]);\n        }\n    ;\n    ;\n        t = p[r];\n        t.renderTypeOverride = true;\n        t.orig_render_type = t.render_type;\n        t.render_type = \"ownsection\";\n    };\n    o.insertAdToTop = function(p, q, r, s) {\n        p.splice(r, 0, q);\n        q.render_type = \"ownsection\";\n    };\n    o.rerankMethod5 = function(p, q, r) {\n        if (((r.rerankingStrategy != 5))) {\n            return;\n        }\n    ;\n    ;\n        var s = m.getTopAdPosition(p, q, r), t = m.buildResultIndices(p);\n        for (var u = ((q.length - 1)); ((u >= 0)); u--) {\n            var v = q[u], w = t[v.selected_target_id], x = p[w];\n            o.finalizeAd(v, x, r);\n            if (m.isSelfPromoted(v)) {\n                o.promoteSelfPromotedResultToTop(p, w, s, r);\n            }\n             else o.insertAdToTop(p, v, s, r);\n        ;\n        ;\n            t = m.buildResultIndices(p);\n        };\n    ;\n    };\n    o.rerankAds = function(p, q, r) {\n        switch (r.rerankingStrategy) {\n          case 5:\n            o.rerankMethod5(p, q, r);\n            break;\n          default:\n            break;\n        };\n    ;\n        p.length = Math.min(p.length, r.maxNumberResultsAndAds);\n        return p;\n    };\n    o.initResults = function(p) {\n        var q = p.length;\n        for (var r = 0; ((r < q)); r++) {\n            var s = p[r];\n            s.is_self = null;\n            s.s_token = null;\n            s.message = null;\n            s.subtextOverride = null;\n            if (s.pathOverride) {\n                s.path = s.orig_path;\n                s.pathOverride = false;\n            }\n        ;\n        ;\n            if (s.renderTypeOverride) {\n                s.render_type = s.orig_render_type;\n                s.renderTypeOverride = false;\n            }\n        ;\n        ;\n            s.rankType = ((((s.rankType || s.render_type)) || s.type));\n        };\n    ;\n        return p;\n    };\n    o.setAuctionOptions = function(p) {\n        l(o.auctionOptions, p);\n    };\n    o.getRealType = function(p) {\n        if (p.renderTypeOverride) {\n            return ((p.orig_render_type || p.type));\n        }\n    ;\n    ;\n        return ((p.render_type || p.type));\n    };\n    o.hideAdResult = function(p, q) {\n        h.inform(\"TypeaheadSearchSponsored/hideAdResult\", {\n            uid: p,\n            reason_dialog: q\n        });\n    };\n    o.undoHideAdResult = function(p) {\n        h.inform(\"TypeaheadSearchSponsored/undoHideAdResult\", {\n            uid: p\n        });\n    };\n    o.Ad = function() {\n    \n    };\n    l(o.prototype, {\n        _dataSubscriptions: null,\n        _viewSubscriptions: null,\n        _globalSubscriptions: null,\n        _data: null,\n        _view: null,\n        _sponsoredEntries: null,\n        _hiddenSponsoredEntities: null,\n        _hideReasonDialog: null,\n        _sBootstrapID: null,\n        _organicECPM: null\n    });\n    e.exports = o;\n});\n__d(\"SearchDataSource\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncResponse\",\"DataSource\",\"HashtagSearchResultUtils\",\"copyProperties\",\"createArrayFrom\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncResponse\"), j = b(\"DataSource\"), k = b(\"HashtagSearchResultUtils\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\"), n = b(\"BingScalingCommon\");\n    {\n        var fin190keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin190i = (0);\n        var o;\n        for (; (fin190i < fin190keys.length); (fin190i++)) {\n            ((o) = (fin190keys[fin190i]));\n            {\n                if (((j.hasOwnProperty(o) && ((o !== \"_metaprototype\"))))) {\n                    q[o] = j[o];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var p = ((((j === null)) ? null : j.prototype));\n    q.prototype = Object.create(p);\n    q.prototype.constructor = q;\n    q.__superConstructor__ = j;\n    function q(r) {\n        this._token = ((r.token || \"\"));\n        this._lazyonload = ((((r.lazyonload === false)) ? false : true));\n        this._extraTypes = r.extraTypes;\n        this._buckets = r.buckets;\n        this._noMultiFetch = ((r.noMultiFetch || false));\n        this._maxWebSuggToCountFetchMore = ((r.maxWebSuggToCountFetchMore || 0));\n        var s = ((r.maxResults || 8));\n        j.call(this, r);\n        this._numResults = {\n            min: 3,\n            max: s\n        };\n        this.recordingRoute = ((r.recordingRoute || \"non_banzai\"));\n        this._enabledHashtag = ((r.enabledHashtag || false));\n        this.logBackendQueriesWindow = ((r.logBackendQueriesWindow || 25));\n        this._minWebSugg = ((r.minWebSugg || 2));\n        this._queryToWebSuggState = {\n        };\n        this._genTime = r.genTime;\n    };\n;\n    q.prototype.init = function() {\n        p.init.call(this);\n        this._leanPayload = null;\n        this._bootstrapRequestsPending = 0;\n        this._criticalOnly = true;\n        this._updateMaxResults();\n        g.listen(window, \"resize\", this._updateMaxResults.bind(this));\n        this.complexChars = new RegExp(\"[\\uff66-\\uffdd\\u4e00-\\u9fcc\\u3400-\\u4dbf]\");\n    };\n    q.prototype.dirty = function() {\n        p.dirty.call(this);\n        this._fetchOnUseRequests = [];\n    };\n    q.prototype.asyncErrorHandler = function(r) {\n        if (((((window.Dialog && ((window.Dialog.getCurrent() == null)))) && ((r.getError() == 1400003))))) {\n            i.verboseErrorHandler(r);\n        }\n    ;\n    ;\n    };\n    q.prototype.fetch = function(r, s, t) {\n        t = ((t || {\n        }));\n        t.fetch_start = JSBNG__Date.now();\n        p.fetch.call(this, r, s, t);\n    };\n    q.prototype.fetchHandler = function(r, s) {\n        var t = r.getPayload(), u = l({\n            fetch_end: JSBNG__Date.now()\n        }, s), v = ((u.value ? h.BEHAVIOR_EVENT : h.BEHAVIOR_PERSISTENT));\n        this.inform(\"beginFetchHandler\", {\n            response: r\n        });\n        if (((s.type == \"lean\"))) {\n            this._leanPayload = t;\n            this._processLean();\n        }\n         else {\n            if (t.coeff2_ts) {\n                u.coeff2_ts = t.coeff2_ts;\n            }\n        ;\n        ;\n            var w = {\n                limit: ((((typeof t.webSuggLimit !== \"undefined\")) ? t.webSuggLimit : 6)),\n                showOnTop: ((((typeof t.webSuggOnTop !== \"undefined\")) ? t.webSuggOnTop : false))\n            };\n            this._queryToWebSuggState[s.value] = w;\n            p.fetchHandler.call(this, r, s);\n            if (((s.bootstrap && !r.getRequest().getData().no_cache))) {\n                u.browserCacheHit = ((t.timestamp < this._genTime));\n            }\n        ;\n        ;\n            if (((((s.bootstrap && !t.no_data)) && ((this._bootstrapRequestsPending > 0))))) {\n                s.bootstrap = false;\n                --this._bootstrapRequestsPending;\n                ((!this._bootstrapRequestsPending && this._bootstrapPostProcess()));\n            }\n        ;\n        ;\n            if (((((t.no_data || t.stale)) || ((t.token !== this._token))))) {\n                var x = l({\n                }, r.getRequest().getData());\n                if (x.lazy) {\n                    delete x.lazy;\n                    x.token = this._token;\n                    this._fetchOnUse(x, s);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this.inform(\"endpointStats\", u, v);\n    };\n    q.prototype.respond = function(r, s, t) {\n        this.inform(\"respondValidUids\", s);\n        this.inform(\"reorderResults\", s);\n        var u = this.buildData(s, r);\n        u.forEach(function(v, w) {\n            v.origIndex = w;\n        });\n        this.inform(\"respond\", {\n            value: r,\n            results: u,\n            isAsync: !!t\n        });\n        return u;\n    };\n    q.prototype.buildData = function(r, s) {\n        if (((!r || ((r.length === 0))))) {\n            return [];\n        }\n    ;\n    ;\n        var t = this.getWebSuggState(s), u = t.showOnTop, v = n.integrateWebsuggestions(r.map(this.getEntry.bind(this)), Boolean(u), this._maxResults, t.limit);\n        v.length = Math.min(v.length, this._maxResults);\n        return v;\n    };\n    q.prototype.getWebSuggState = function(r) {\n        while (r) {\n            var s = this._queryToWebSuggState[r];\n            if (((typeof s !== \"undefined\"))) {\n                return s;\n            }\n        ;\n        ;\n            r = r.slice(0, ((r.length - 1)));\n        };\n    ;\n        return {\n            limit: 0,\n            showOnTop: false\n        };\n    };\n    q.prototype._isQueryTooShort = function(r) {\n        return ((((r.length < this._minQueryLength)) && !((this.complexChars && this.complexChars.test(r)))));\n    };\n    q.prototype.shouldFetchMoreResults = function(r) {\n        var s = 0, t = 0;\n        r.forEach(function(u) {\n            if (((((u.type !== \"websuggestion\")) || ((t++ < this._maxWebSuggToCountFetchMore))))) {\n                s++;\n            }\n        ;\n        ;\n        }.bind(this));\n        return ((s < this._maxResults));\n    };\n    q.prototype._bootstrapPostProcess = function() {\n        var r = {\n            time: JSBNG__Date.now()\n        };\n        this.inform(\"bootstrapped\", r, h.BEHAVIOR_PERSISTENT);\n        this._processLean();\n    };\n    q.prototype._processLean = function() {\n        if (this._leanPayload) {\n            var r, s = this._leanPayload.entries;\n            {\n                var fin191keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin191i = (0);\n                var t;\n                for (; (fin191i < fin191keys.length); (fin191i++)) {\n                    ((t) = (fin191keys[fin191i]));\n                    {\n                        r = this.getEntry(t);\n                        ((r && (r.index = s[t])));\n                    };\n                };\n            };\n        ;\n            this.setExclusions(this._leanPayload.blocked);\n            this._leanPayload = null;\n        }\n    ;\n    ;\n    };\n    q.prototype._updateMaxResults = function() {\n        var r = ((window.JSBNG__innerHeight || JSBNG__document.documentElement.clientHeight));\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, Math.ceil(((2 + ((((r - 370)) / 56))))))));\n    };\n    q.prototype._bootstrapFetch = function(r, s) {\n        var t = l(s, this.bootstrapData);\n        if (((this._criticalOnly && this._lazyonload))) {\n            t.lazy = 1;\n        }\n    ;\n    ;\n        this.fetch(this.bootstrapEndpoint, t, {\n            bootstrap: true,\n            type: r\n        });\n        ++this._bootstrapRequestsPending;\n    };\n    q.prototype._fetchOnUse = function(r, s) {\n        {\n            var fin192keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapData))), fin192i = (0);\n            var t;\n            for (; (fin192i < fin192keys.length); (fin192i++)) {\n                ((t) = (fin192keys[fin192i]));\n                {\n                    ((!r.hasOwnProperty(t) && (r[t] = this.bootstrapData[t])));\n                ;\n                };\n            };\n        };\n    ;\n        if (this._criticalOnly) {\n            this._fetchOnUseRequests.push({\n                args: r,\n                ctx: s\n            });\n        }\n         else this.fetch(this.bootstrapEndpoint, r, s);\n    ;\n    ;\n    };\n    q.prototype._fetchLean = function() {\n        var r = {\n            no_cache: 1\n        };\n        r.options = m(r.options);\n        r.options.push(\"lean\");\n        this._fetchOnUse(r, {\n            type: \"lean\"\n        });\n    };\n    q.prototype.bootstrap = function(r) {\n        if (!r) {\n            this._criticalOnly = false;\n            this._flushFetchOnUseRequests();\n        }\n    ;\n    ;\n        if (this._bootstrapped) {\n            return;\n        }\n    ;\n    ;\n        var s = {\n            filter: [\"JSBNG__event\",],\n            no_cache: 1\n        };\n        this._fetchOnUse(s, {\n            type: \"JSBNG__event\"\n        });\n        var t = [\"app\",\"page\",\"group\",\"friendlist\",];\n        t = t.concat(((this._extraTypes || [])));\n        if (this._noMultiFetch) {\n            t.push(\"user\");\n            this._bootstrapFetch(\"user\", {\n                filter: t\n            });\n        }\n         else {\n            this._bootstrapFetch(\"other\", {\n                filter: t\n            });\n            if (this._buckets) {\n                for (var u = 0; ((u < this._buckets.length)); ++u) {\n                    var v = {\n                        filter: [\"user\",],\n                        buckets: this._buckets[u]\n                    };\n                    this._bootstrapFetch(\"user\", v);\n                };\n            ;\n            }\n             else this._bootstrapFetch(\"user\", {\n                filter: [\"user\",]\n            });\n        ;\n        ;\n        }\n    ;\n    ;\n        this._fetchLean();\n        this._bootstrapped = true;\n    };\n    q.prototype._flushFetchOnUseRequests = function() {\n        var r = this._fetchOnUseRequests.length;\n        for (var s = 0; ((s < r)); ++s) {\n            var t = this._fetchOnUseRequests[s];\n            this.fetch(this.bootstrapEndpoint, t.args, t.ctx);\n        };\n    ;\n        if (((r > 0))) {\n            this.inform(\"extra_bootstrap\", {\n                time: JSBNG__Date.now()\n            }, h.BEHAVIOR_PERSISTENT);\n        }\n    ;\n    ;\n        this._fetchOnUseRequests = [];\n    };\n    q.prototype.onLoad = function(r, s) {\n        this.inform(\"JSBNG__onload\", {\n            time: JSBNG__Date.now()\n        }, h.BEHAVIOR_PERSISTENT);\n        if (r) {\n            this.bootstrap.bind(this, s).defer();\n        }\n    ;\n    ;\n    };\n    q.prototype.mergeUids = function(r, s, t, u) {\n        var v = this.getDynamicHashtagResult(u);\n        if (((((u && v)) && ((s.indexOf(v) <= 0))))) {\n            s.unshift(v);\n        }\n    ;\n    ;\n        var w = ((t[0] ? this.getEntry(t[0]) : null)), x = ((s[0] ? this.getEntry(s[0]) : null)), y = ((((w && w.replace_results)) ? w : null));\n        y = ((((((!y && x)) && x.replace_results)) ? x : y));\n        var z = p.mergeUids.call(this, r, s, t, u);\n        if (y) {\n            this.inform(\"backend_topreplace\", {\n            });\n            return this.deduplicateByKey([y.uid,].concat(z));\n        }\n    ;\n    ;\n        return z;\n    };\n    q.prototype.getTextToIndexFromFields = function(r, s) {\n        var t = [], u = ((r.tokenVersion === \"v2\"));\n        for (var v = 0; ((v < s.length)); ++v) {\n            if (((u && ((((s[v] === \"text\")) || ((s[v] === \"alias\"))))))) {\n                continue;\n            }\n        ;\n        ;\n            var w = r[s[v]];\n            if (w) {\n                t.push(((w.join ? w.join(\" \") : w)));\n            }\n        ;\n        ;\n        };\n    ;\n        return t.join(\" \");\n    };\n    q.prototype.getDynamicHashtagResult = function(r) {\n        if (((!r || !this._enabledHashtag))) {\n            return;\n        }\n    ;\n    ;\n        var s = k.getHashtagFromQuery(r);\n        if (!s) {\n            return;\n        }\n    ;\n    ;\n        var t = ((\"hashtag:\" + s)), u = this.getEntry(t);\n        if (!u) {\n            this.processEntries([k.makeTypeaheadResult(s),], r);\n        }\n    ;\n    ;\n        return t;\n    };\n    e.exports = q;\n});\n__d(\"SearchTypeaheadRecorder\", [\"JSBNG__Event\",\"AsyncRequest\",\"Banzai\",\"Keys\",\"TokenizeUtil\",\"Vector\",\"ge\",\"clickRefAction\",\"copyProperties\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Banzai\"), j = b(\"Keys\"), k = b(\"TokenizeUtil\"), l = b(\"Vector\"), m = b(\"ge\"), n = b(\"clickRefAction\"), o = b(\"copyProperties\"), p = b(\"userAction\");\n    function q(s) {\n        this.init(s);\n        this.initEvents();\n    };\n;\n    q.prototype.init = function(s) {\n        this.core = s.getCore();\n        this.data = s.getData();\n        this.view = s.getView();\n        this.element = this.core.getElement();\n        this.initTime = JSBNG__Date.now();\n        this._onloadTime = 0;\n        this._extraRecorder = [];\n        var t = m(\"search_first_focus\");\n        this.initStartTime = ((t && t.value));\n        this.bootstrapStats = {\n            bootstrapped: 0\n        };\n        this._reset();\n    };\n    q.prototype._reset = function() {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n        this._reorderInfo = null;\n        var s = Math.JSBNG__random().toString();\n        this.data.setQueryData({\n            sid: s\n        });\n        this.view.setSid(s);\n        this.recordStat(\"sid\", s);\n        this.recordStat(\"keypressed\", 0);\n    };\n    q.prototype.initEvents = function() {\n        this.core.subscribe(\"JSBNG__focus\", function(JSBNG__event) {\n            if (!this.stats.session_start_time) {\n                this.recordStat(\"session_start_time\", JSBNG__Date.now());\n            }\n        ;\n        ;\n        }.bind(this));\n        this.core.subscribe(\"JSBNG__blur\", function(JSBNG__event) {\n            var s = JSBNG__Date.now();\n            {\n                var fin193keys = ((window.top.JSBNG_Replay.forInKeys)((this._inflightRequests))), fin193i = (0);\n                var t;\n                for (; (fin193i < fin193keys.length); (fin193i++)) {\n                    ((t) = (fin193keys[fin193i]));\n                    {\n                        var u = this._inflightRequests[t], v = ((s - u));\n                        this.recordAvgStat(\"search_endpoint_ms_from_js\", v);\n                    };\n                };\n            };\n        ;\n            this.recordStat(\"session_end_time\", s);\n            this.submit();\n        }.bind(this));\n        this.view.subscribe(\"select\", function(s, t) {\n            this.recordSelectInfo(t);\n        }.bind(this));\n        this.view.subscribe(\"render\", function(s, t) {\n            this.recordRender(t);\n        }.bind(this));\n        this.view.subscribe(\"recordAfterReorder\", function(s, t) {\n            this._reorderInfo = o(this._reorderInfo, t);\n        }.bind(this));\n        this.data.subscribe(\"activity\", function(s, t) {\n            this.recordStat(\"pending_request\", t.activity);\n        }.bind(this));\n        this.data.subscribe(\"respondValidUids\", function(s, t) {\n            this.validUids = t.slice(0);\n        }.bind(this));\n        this.data.subscribe(\"beforeQuery\", function(s, t) {\n            if (!t.value) {\n                this.query = \"\";\n                this.results = [];\n                return;\n            }\n        ;\n        ;\n            if (!this.stats.first_query_time) {\n                this.recordStat(\"first_query_time\", JSBNG__Date.now());\n            }\n        ;\n        ;\n            this.query = t.value;\n            this.recordCountStat(\"num_queries\");\n        }.bind(this));\n        this.data.subscribe(\"queryEndpoint\", function(s, t) {\n            this.recordCountStat(\"num_search_ajax_requests\");\n            this.recordAvgStat(\"endpoint_query_length\", t.value.length);\n            this._inflightRequests[t.value] = JSBNG__Date.now();\n        }.bind(this));\n        this.data.subscribe(\"JSBNG__onload\", function(s, t) {\n            this._onloadTime = t.time;\n        }.bind(this));\n        this.data.subscribe(\"bootstrapped\", function(s, t) {\n            this.bootstrapStats.endTime = t.time;\n            this.bootstrapStats.bootstrapped = 1;\n        }.bind(this));\n        this.core.subscribe(\"recordFunction\", function(s, t) {\n            this._extraRecorder.push(t);\n        }.bind(this));\n        this.data.subscribe(\"endpointStats\", function(s, t) {\n            var u = ((t.fetch_end - t.fetch_start));\n            if (t.value) {\n                this.recordAvgStat(\"search_endpoint_ms_from_js\", u);\n            }\n             else this.bootstrapStats[t.type] = u;\n        ;\n        ;\n            if (t.coeff2_ts) {\n                this.bootstrapStats.coeff2_ts = t.coeff2_ts;\n            }\n        ;\n        ;\n            if (((typeof t.browserCacheHit != \"undefined\"))) {\n                this.recordCountStat(((t.browserCacheHit ? \"bootstrap_cachehits\" : \"bootstrap_cachemisses\")));\n            }\n        ;\n        ;\n            if (this._inflightRequests[t.value]) {\n                delete this._inflightRequests[t.value];\n            }\n        ;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"query\", function(s, t) {\n            this.recordAvgStat(\"num_results_from_cache\", t.results.length);\n        }.bind(this));\n        this.data.subscribe(\"backend_topreplace\", function(s, t) {\n            if (((false === this._topreplace))) {\n                this.recordStat(\"backend_topreplace\", 1);\n                this._topreplace = true;\n            }\n        ;\n        ;\n        }.bind(this));\n        g.listen(this.element, \"keydown\", function(JSBNG__event) {\n            this.recordStat(\"keypressed\", 1);\n            if (((g.getKeyCode(JSBNG__event) == j.BACKSPACE))) {\n                if (((!this._backspacing && this.query))) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.query);\n                }\n            ;\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        ;\n        }.bind(this));\n        this.data.subscribe(\"beforeFetch\", function(s, t) {\n            var u = t.request.data.value;\n            if (!u) {\n                return;\n            }\n        ;\n        ;\n            this.backendQueries.push(u);\n        }.bind(this));\n    };\n    q.prototype.recordStat = function(s, t) {\n        this.stats[s] = t;\n    };\n    q.prototype.recordCountStat = function(s) {\n        var t = this.stats[s];\n        this.stats[s] = ((t ? ((t + 1)) : 1));\n    };\n    q.prototype.recordAvgStat = function(s, t) {\n        if (this.avgStats[s]) {\n            this.avgStats[s][0] += t;\n            ++this.avgStats[s][1];\n        }\n         else this.avgStats[s] = [t,1,];\n    ;\n    ;\n    };\n    q.prototype.recordAppendStat = function(s, t) {\n        if (!this.appendStats.hasOwnProperty(s)) {\n            this.appendStats[s] = [];\n        }\n    ;\n    ;\n        this.appendStats[s].push(t);\n    };\n    q.prototype.recordRender = function(s) {\n        this.results = s.filter(function(u) {\n            return ((((((u.uid != \"search\")) && ((u.type != \"disabled_result\")))) && ((u.type != \"header\"))));\n        }).map(function(u) {\n            return o(null, u);\n        });\n        var t = l.getViewportDimensions();\n        this.recordStat(\"window_size_width\", t.x);\n        this.recordStat(\"window_size_height\", t.y);\n        if (((((this.results.length > 0)) && !this.stats.first_result_time))) {\n            this.recordStat(\"first_result_time\", JSBNG__Date.now());\n        }\n    ;\n    ;\n    };\n    q.prototype.recordSelectInfo = function(s) {\n        var t = s.selected, u = s.index;\n        if (((t.groupIndex !== undefined))) {\n            u = ((((s.index - t.groupIndex)) - 1));\n        }\n    ;\n    ;\n        var v = {\n            href: t.path\n        }, w = ((t.dataGT ? {\n            gt: JSON.parse(t.dataGT)\n        } : {\n        }));\n        n(\"click\", v, null, null, w);\n        p(\"search\").uai(\"click\");\n        if (((t.uid == \"search\"))) {\n            this.recordStat(\"selected_search\", 1);\n        }\n         else if (((t.uid == \"invite\"))) {\n            this.recordStat(\"selected_invite\", 1);\n        }\n         else {\n            var x = ((((t.rankType || t.render_type)) || t.type)), y = ((((x == \"friend\")) ? \"user\" : x));\n            this.recordStat(((\"selected_\" + y)), 1);\n            this.recordStat(\"selected_position\", u);\n            this.recordStat(\"selected_type\", x);\n            this.recordStat(\"selected_name_length\", t.text.length);\n            this.recordStat(\"selected_id\", t.uid);\n            this.recordStat(\"selected_degree\", ((t.bootstrapped ? 1 : 2)));\n            var z = k.parse(this.data.getTextToIndex(t)).tokens, aa = r(z, this.query);\n            if (aa) {\n                this.recordStat(\"matched_terms\", aa);\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        var ba = {\n        };\n        this._extraRecorder.forEach(function(ca) {\n            ca(s, this.results, ba);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(ba));\n        if (((t.type === \"websuggestion\"))) {\n            this.recordStat(\"selected_memcached_websuggestion\", t.fromMemcache);\n            this.recordStat(\"selected_websuggestion_source\", t.websuggestion_source);\n        }\n    ;\n    ;\n        this.recordStat(\"selected_with_mouse\", ((s.clicked ? 1 : 0)));\n    };\n    q.prototype._dataToSubmit = function() {\n        this.recordStat(\"candidate_results\", this.buildResults());\n        this.recordStat(\"query\", this.query);\n        this.recordStat(\"init_time\", this.initTime);\n        if (this.initStartTime) {\n            this.recordStat(\"init_start_time\", this.initStartTime);\n            this.recordStat(\"onload_time\", this._onloadTime);\n            this.initStartTime = 0;\n        }\n    ;\n    ;\n        this.recordStat(\"bootstrapped\", this.bootstrapStats.bootstrapped);\n        if (this.bootstrapStats.endTime) {\n            this.recordStat(\"bootstrapped_time\", this.bootstrapStats.endTime);\n            this.recordStat(\"user_bootstrap_ms\", this.bootstrapStats.user);\n            this.recordStat(\"other_bootstrap_ms\", this.bootstrapStats.other);\n            this.bootstrapStats.endTime = 0;\n        }\n    ;\n    ;\n        this.recordStat(\"coeff2_ts\", this.bootstrapStats.coeff2_ts);\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if (((this.backendQueries.length > 0))) {\n            if (((this.backendQueries.length > this.data.logBackendQueriesWindow))) {\n                this.backendQueries = this.backendQueries.slice(((this.backendQueries.length - this.data.logBackendQueriesWindow)));\n            }\n        ;\n        ;\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n    ;\n        if (this._reorderInfo) {\n            var s = this._reorderInfo;\n            s.organic.forEach(function(x) {\n                delete x.text;\n            });\n            this.recordStat(\"s_count\", s.position_data.length);\n            this.recordStat(\"s_bootstrap_id\", s.s_bootstrap_id);\n            this.recordStat(\"s_organic_results\", JSON.stringify(s.organic));\n            this.recordStat(\"s_candidate_tokens\", JSON.stringify(s.tokens));\n            this.recordStat(\"s_positions\", JSON.stringify(s.position_data));\n            this.recordStat(\"s_options\", JSON.stringify(s.options));\n            this.recordStat(\"s_variant\", JSON.stringify(s.variant));\n        }\n    ;\n    ;\n        var t = this.stats;\n        {\n            var fin194keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin194i = (0);\n            var u;\n            for (; (fin194i < fin194keys.length); (fin194i++)) {\n                ((u) = (fin194keys[fin194i]));\n                {\n                    var v = this.avgStats[u];\n                    t[u] = ((v[0] / v[1]));\n                };\n            };\n        };\n    ;\n        {\n            var fin195keys = ((window.top.JSBNG_Replay.forInKeys)((this.appendStats))), fin195i = (0);\n            var w;\n            for (; (fin195i < fin195keys.length); (fin195i++)) {\n                ((w) = (fin195keys[fin195i]));\n                {\n                    t[w] = JSON.stringify(this.appendStats[w]);\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n    q.prototype.buildResults = function() {\n        var s = ((this.results || [])).map(function(t, u) {\n            var v = k.parse(this.data.getTextToIndex(t)).tokens, w = ((((t.rankType || t.render_type)) || t.type)), x = ((t.bootstrapped ? 1 : 0)), y = ((t.s_token || \"\")), z = ((r(v, this.query) || this.query)), aa = t.index_rank, ba = t.match_type, ca = t.l_type, da = t.vertical_type, ea = t.prefix_match, fa = t.prefix_length;\n            if (((typeof t.groupIndex == \"number\"))) {\n                return [t.groupIndex,t.indexInGroup,t.uid,w,x,y,z,aa,ba,ea,fa,t.origIndex,ca,da,];\n            }\n        ;\n        ;\n            return [0,u,t.uid,w,x,y,z,aa,ba,ea,fa,t.origIndex,ca,da,];\n        }.bind(this));\n        return JSON.stringify(s);\n    };\n    q.prototype.submit = function() {\n        var s = this._dataToSubmit();\n        switch (this.data.recordingRoute) {\n          case \"double_recording\":\n            if (((Math.JSBNG__random() > 105176))) {\n                s.recorded_first = \"legacy\";\n                JSBNG__setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n            }\n             else {\n                s.recorded_first = \"banzai\";\n                i.post(this._banzaiRoute, s, {\n                    delay: 0,\n                    retry: true\n                });\n                JSBNG__setTimeout(this.submitThroughAsyncRequest.bind(this, s), 0);\n            }\n        ;\n        ;\n            break;\n          case \"random_recording\":\n            if (((Math.JSBNG__random() > 105500))) {\n                this.submitThroughAsyncRequest(s);\n            }\n             else i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n        ;\n        ;\n            break;\n          case \"banzai_basic\":\n            i.post(this._banzaiRoute, s);\n            break;\n          case \"banzai_vital\":\n            i.post(this._banzaiRoute, s, {\n                delay: 0,\n                retry: true\n            });\n            break;\n          default:\n            this.submitThroughAsyncRequest(s);\n        };\n    ;\n        this._reset();\n    };\n    q.prototype.submitThroughAsyncRequest = function(s) {\n        if (((Object.keys(s).length > 0))) {\n            new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                stats: s\n            }).setOption(\"handleErrorAfterUnload\", true).setErrorHandler(function(t) {\n                s.retry = true;\n                new h().setURI(this._endPoint).setMethod(\"POST\").setData({\n                    stats: s\n                }).setOption(\"asynchronous\", false).send();\n            }.bind(this)).send();\n        }\n    ;\n    ;\n    };\n    var r = function(s, t) {\n        var u = k.parse(t);\n        if (((u.flatValue[((u.flatValue.length - 1))] === \" \"))) {\n            return u.flatValue;\n        }\n    ;\n    ;\n        var v = u.tokens[((u.tokens.length - 1))], w = {\n        };\n        s.forEach(function(ba) {\n            w[ba] = ((((w[ba] || 0)) + 1));\n        });\n        var x = {\n        }, y = u.tokens.slice(0, ((u.tokens.length - 1)));\n        y.forEach(function(ba) {\n            x[ba] = ((((x[ba] || 0)) + 1));\n        });\n        for (var z = 0; ((z < s.length)); ++z) {\n            var aa = s[z];\n            if (((((aa.indexOf(v) === 0)) && ((((w[aa] - ((x[aa] || 0)))) > 0))))) {\n                y.push(aa);\n                return y.join(\" \");\n            }\n        ;\n        ;\n        };\n    ;\n        return undefined;\n    };\n    o(q.prototype, {\n        _endPoint: \"/ajax/typeahead/record_metrics.php\",\n        _banzaiRoute: \"search\"\n    });\n    e.exports = q;\n});\n__d(\"LayerSlowlyFadeOnShow\", [\"Class\",\"LayerFadeOnShow\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LayerFadeOnShow\"), i = b(\"emptyFunction\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n;\n    g.extend(j, h);\n    j.prototype._getDuration = i.thatReturns(500);\n    e.exports = j;\n});");
// 9404
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o126,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yI/r/KWNdF_J3cUf.js",o128);
// undefined
o126 = null;
// undefined
o128 = null;
// 9409
JSBNG_Replay.sb400e2fc5b4578cec05af7646f5430d8d67f9e1b_61[0](false);
// 9419
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"mBpeN\",]);\n}\n;\n__d(\"Button.react\", [\"AbstractButton.react\",\"ReactPropTypes\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AbstractButton.react\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = i.createClass({\n        displayName: \"Button\",\n        propTypes: {\n            use: h.oneOf([\"special\",\"confirm\",\"default\",]),\n            size: h.oneOf([\"medium\",\"large\",]),\n            suppressed: h.bool\n        },\n        render: function() {\n            var l = (this.props.use || \"default\"), m = (this.props.size || \"medium\"), n = (((((((\"-cx-PRIVATE-uiButton__root\") + (((l === \"special\") ? (\" \" + \"-cx-PRIVATE-uiButton__special\") : \"\"))) + (((l === \"confirm\") ? (\" \" + \"-cx-PRIVATE-uiButton__confirm\") : \"\"))) + (((m === \"large\") ? (\" \" + \"-cx-PRIVATE-uiButton__large\") : \"\"))) + ((this.props.suppressed ? (\" \" + \"-cx-PRIVATE-uiButton__suppressed\") : \"\"))) + (((l !== \"default\") ? (\" \" + \"selected\") : \"\"))));\n            return this.transferPropsTo(g({\n                className: n\n            }));\n        }\n    });\n    e.exports = k;\n});\n__d(\"Grid.react\", [\"ReactPropTypes\",\"React\",\"cx\",\"flattenChildren\",\"getObjectValues\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactPropTypes\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"flattenChildren\"), k = b(\"getObjectValues\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"Grid\",\n        propTypes: {\n            cols: g.number.isRequired,\n            fixed: g.bool,\n            alignv: g.oneOf([\"top\",\"middle\",\"bottom\",]),\n            alignh: g.oneOf([\"left\",\"center\",\"right\",]),\n            spacing: g.string\n        },\n        render: function() {\n            var p = k(j(this.props.children)), q = p.length, r = [], s = [], t = 0;\n            p.forEach(function(u, v) {\n                u.props.alignv = this.props.alignv;\n                u.props.alignh = this.props.alignh;\n                o(u, ((this.props.fixed ? \"uiGridFixed\" : \"\")));\n                if (this.props.spacing) {\n                    o(u, this.props.spacing);\n                };\n                s.push(u);\n                t += Math.max((u.props.colSpan || 0), 1);\n                if ((((t % this.props.cols) === 0) || ((v + 1) === q))) {\n                    if ((this.props.fixed && (t < this.props.cols))) {\n                        for (var w = t; (w < this.props.cols); w++) {\n                            s.push(n(null));;\n                        };\n                        t = this.props.cols;\n                    }\n                ;\n                    if ((t === this.props.cols)) {\n                        o(s[(s.length - 1)], \"-cx-PRIVATE-uiGrid__rightcol\");\n                    };\n                    r.push(h.DOM.tr({\n                        className: \"-cx-PRIVATE-uiGrid__row\",\n                        key: v\n                    }, s));\n                    s = [];\n                    t = 0;\n                }\n            ;\n            }.bind(this));\n            return (h.DOM.table({\n                className: \"uiGrid -cx-PRIVATE-uiGrid__root\",\n                cellSpacing: \"0\",\n                cellPadding: \"0\"\n            }, h.DOM.tbody(null, r)));\n        }\n    }), n = h.createClass({\n        displayName: \"GridItem\",\n        propTypes: {\n            alignv: g.oneOf([\"top\",\"middle\",\"bottom\",]),\n            alignh: g.oneOf([\"left\",\"center\",\"right\",])\n        },\n        render: function() {\n            var p = ((((((((\"-cx-PRIVATE-uiGrid__cell\") + (((this.props.alignv === \"top\") ? (\" \" + \"vTop\") : \"\"))) + (((this.props.alignv === \"middle\") ? (\" \" + \"vMid\") : \"\"))) + (((this.props.alignv === \"bottom\") ? (\" \" + \"vBot\") : \"\"))) + (((this.props.alignh === \"left\") ? (\" \" + \"hLeft\") : \"\"))) + (((this.props.alignh === \"center\") ? (\" \" + \"hCent\") : \"\"))) + (((this.props.alignh === \"right\") ? (\" \" + \"hRght\") : \"\"))));\n            return this.transferPropsTo(h.DOM.td({\n                className: p\n            }, this.props.children));\n        }\n    }), o = function(p, q) {\n        p.props.className = l(p.props.className, q);\n    };\n    m.GridItem = n;\n    e.exports = m;\n});\n__d(\"mixin\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n, o, p, q, r) {\n        var s = function() {\n        \n        }, t = [h,i,j,k,l,m,n,o,p,q,], u = 0, v;\n        while (t[u]) {\n            v = t[u];\n            for (var w in v) {\n                if (v.hasOwnProperty(w)) {\n                    s.prototype[w] = v[w];\n                };\n            };\n            u += 1;\n        };\n        return s;\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerDetailViewSheetControl\", [\"DOM\",\"WebMessengerStateManager\",\"MercurySheetView\",\"WebMessengerTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"WebMessengerJoinStatusTabSheet\",\"WebMessengerThreadIsMutedTabSheet\",\"WebMessengerSubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"WebMessengerStateManager\"), i = b(\"MercurySheetView\"), j = b(\"WebMessengerTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreadMuter\"), m = b(\"MercuryThreads\").get(), n = b(\"WebMessengerJoinStatusTabSheet\"), o = b(\"WebMessengerThreadIsMutedTabSheet\"), p = b(\"WebMessengerSubscriptionsHandler\");\n    function q(r) {\n        this._template = j[\":fb:web-messenger:tab-sheet-container\"].build();\n        this._rootElement = this._template.getNode(\"sheet\");\n        this._threadID = h.getCurrentStateData().thread_id;\n        this._sheetView = new i(this._threadID, this._rootElement, r);\n        this._threadIsMutedTabSheet = new o(this._rootElement, this._sheetView);\n        this._userJoinStatusSheet = new n(this._rootElement, this._sheetView);\n        this._muteSetting = undefined;\n        g.setContent(r, this._template.getRoot());\n        this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", function() {\n            l.showMuteChangeDialog(0, this._threadID);\n        }.bind(this));\n        p.addSubscriptions(k.subscribe(\"threads-updated\", function(s, t) {\n            if ((this._threadID && t[this._threadID])) {\n                this.updateTabSheet(false);\n            };\n        }.bind(this)));\n        this.updateTabSheet(true);\n    };\n    q.prototype.updateView = function() {\n        var r = h.getCurrentStateData().thread_id;\n        if ((this._threadID != r)) {\n            this._threadID = r;\n            this.updateTabSheet(true);\n        }\n    ;\n    };\n    q.prototype.updateTabSheet = function(r) {\n        if (!this._threadID) {\n            return\n        };\n        m.getThreadMeta(this._threadID, function(s) {\n            var t = l.getThreadMuteSettingForUser(s);\n            if (((t != this._muteSetting) || r)) {\n                if (t) {\n                    this._threadIsMutedTabSheet.open();\n                }\n                 else this._threadIsMutedTabSheet.close();\n            ;\n                this._muteSetting = t;\n            }\n        ;\n        }.bind(this));\n    };\n    q.prototype.openUserJoinStatusSheet = function(r) {\n        this._userJoinStatusSheet.addToQueue(r);\n    };\n    q.prototype.destroy = function() {\n        (this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe());\n    };\n    e.exports = q;\n});\n__d(\"WebMessengerActionsMenuItem\", [\"Event\",\"CSS\",\"WebMessengerStateManager\",\"WebMessengerTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"WebMessengerStateManager\"), j = b(\"WebMessengerTemplates\");\n    function k(l, m, n) {\n        var o = j[\":fb:web-messenger:actions-menu-item\"].build();\n        o.setNodeContent(\"title\", l);\n        this.node = o.getRoot();\n        this.showFn = n;\n        g.listen(this.node, \"click\", function() {\n            var p = i.getCurrentStateData().thread_id;\n            (p && m(p));\n        });\n    };\n    k.prototype.getNode = function() {\n        return this.node;\n    };\n    k.prototype.updateShown = function(l) {\n        var m = (this.showFn ? this.showFn(l) : true);\n        h.conditionShow(this.node, m);\n        return m;\n    };\n    e.exports = k;\n});\n__d(\"WebMessengerTabbedFolderControl\", [\"Event\",\"CSS\",\"WebMessengerTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"WebMessengerTemplates\");\n    function j(k, l, m) {\n        this._template = i[\":fb:web-messenger:master-view:tab-bar:folder\"].build();\n        this._template.setNodeContent(\"folderLabel\", k);\n        this._listener = g.listen(this._template.getNode(\"link\"), \"click\", m);\n        l.push(this._template.getRoot());\n    };\n    j.prototype.getCountBadge = function() {\n        return this._template.getNode(\"count\");\n    };\n    j.prototype.setSelected = function(k) {\n        h.conditionClass(this._template.getRoot(), \"selectedFolder\", k);\n    };\n    j.prototype.getElement = function() {\n        this._template.getRoot();\n    };\n    j.prototype.destroy = function() {\n        this._listener.remove();\n    };\n    e.exports = j;\n});\n__d(\"WebMessengerUnseenMessageNoticeRenderer\", [\"JSXDOM\",\"ContextualLayer\",\"LayerFadeOnHide\",\"cx\",\"tx\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"ContextualLayer\"), i = b(\"LayerFadeOnHide\"), j = b(\"cx\"), k = b(\"tx\"), l = b(\"Event\"), m = {\n        renderNoticeTooltip: function(o, p) {\n            var q = g.div({\n                className: \"-cx-PRIVATE-webMessengerNoticeTooltip__uitooltipx\"\n            }, n(o), g.i({\n                className: \"-cx-PRIVATE-webMessengerNoticeTooltip__arrow\"\n            })), r = new h((p || {\n            }), q).enableBehavior(i);\n            return r;\n        }\n    };\n    function n(o) {\n        var p = g.div({\n            className: \"-cx-PRIVATE-webMessengerNoticeTooltip__tooltipcontent\"\n        }, \"You have new messages\");\n        l.listen(p, \"click\", o);\n        return p;\n    };\n    e.exports = m;\n});\n__d(\"MessagingConst\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        APP_ID: 313785040330,\n        XD_MESSAGE: {\n            SANDBOX_READY: \"sandbox_ready\",\n            SET_CONTENT: \"set_content\",\n            HTML_SIZE: \"html_size\",\n            REFRESH_SIZE: \"refresh_size\"\n        },\n        SHINGLE_SCROLL_TRIGGER: 5,\n        EVENTS: {\n            MESSAGE_SENT: \"messaging/message_sent\"\n        },\n        initConstants: function(i) {\n            g(h, i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"MessagingXD\", [\"Event\",\"DOM\",\"MercuryConstants\",\"MessagingConst\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"MercuryConstants\"), j = b(\"MessagingConst\"), k = b(\"URI\"), l = b(\"copyProperties\");\n    function m(n) {\n        this._listeners = [g.listen(window, \"message\", this._onPostMessage.bind(this)),];\n        this._iframes = {\n        };\n        this._contentWindows = {\n        };\n        this._messageHandler = n;\n    };\n    l(m.prototype, {\n        unload: function() {\n            this._listeners.forEach(function(n) {\n                n.remove();\n            });\n        },\n        createIframe: function(n, o, p) {\n            var q = new k(p);\n            this._iframes[o] = h.create(\"iframe\", {\n                name: o,\n                frameBorder: 0,\n                src: q.toString()\n            });\n            h.appendContent(n, this._iframes[o]);\n            this._contentWindows[o] = this._iframes[o].contentWindow;\n            return this._iframes[o];\n        },\n        sendMessage: function(n, o) {\n            var p = Array.prototype.slice.apply(arguments);\n            p[0] = j.APP_ID;\n            var q = (this._iframes[n].contentWindow || this._contentWindows[n]);\n            q.postMessage(p.join(\",\"), i.Sandbox.ORIGIN);\n        },\n        _onPostMessage: function(event) {\n            if (((event.origin !== i.Sandbox.ORIGIN) || !event.data.split)) {\n                return\n            };\n            var n = event.data.split(\",\"), o = unescape(n[1]);\n            this._contentWindows[o] = event.source;\n            this._messageHandler(o, n);\n        }\n    });\n    e.exports = m;\n});\n__d(\"HTMLEmailRenderer\", [\"CSS\",\"MessagingConst\",\"MessagingXD\",\"copyProperties\",\"emptyFunction\",\"tx\",\"MercuryConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"MessagingConst\"), i = b(\"MessagingXD\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"tx\"), m = b(\"MercuryConstants\");\n    function n(o, p) {\n        this._resizeContent = (o.resizeContent || k);\n        this._richMap = {\n        };\n        this._useFBStyle = p;\n        this._xdc = new i(this.onXDMessage.bind(this));\n        this._maxWidth = 0;\n    };\n    j(n.prototype, {\n        onXDMessage: function(o, p) {\n            if ((p[0] != h.APP_ID.toString())) {\n                return\n            };\n            if ((this._richMap && this._richMap[o])) {\n                if ((p[2] == h.XD_MESSAGE.SANDBOX_READY)) {\n                    return this.setIframeContent(o);\n                }\n                 else if ((p[2] == h.XD_MESSAGE.HTML_SIZE)) {\n                    return this._resizeContent(o, parseInt(p[3], 10), parseInt(p[4], 10), (p[5] == \"true\"), (p[6] == \"true\"))\n                }\n            \n            };\n        },\n        setIframeContent: function(o, p) {\n            this._xdc.sendMessage(o, h.XD_MESSAGE.SET_CONTENT, escape(this._richMap[o]), (this._useFBStyle ? \"useFBStyle\" : \"\"), (p ? \"forceDialogOnWide\" : \"\"), escape(\"Show Hidden Text\"), escape(\"Hide\"), this._maxWidth);\n        },\n        makeRich: function(o, p, q, r) {\n            var s = this._xdc.createIframe(p, o, m.Sandbox.PAGE_URL);\n            g.addClass(s, \"xdIframe\");\n            this._richMap[o] = q;\n            this._maxWidth = (r || 0);\n        },\n        updateRichMap: function(o, p) {\n            this._richMap[o] = p;\n        },\n        unload: function() {\n            this._xdc.unload();\n        }\n    });\n    e.exports = n;\n});\n__d(\"PhotosUploadID\", [], function(a, b, c, d, e, f) {\n    var g = 1024, h = {\n        getNewID: function() {\n            return g++;\n        }\n    };\n    e.exports = h;\n});\n__d(\"ProgressBar\", [\"CSS\",\"DOM\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\");\n    function l(o, p, q) {\n        this._root = o;\n        this._min = (p || 0);\n        this._max = (q || 100);\n        this._meter = h.find(o, \"div.fill\");\n        this._initialPosition = 0;\n        this._position = 0;\n        this._initialVelocity = 0;\n        this._velocity = 0;\n        this._acceleration = 0;\n        this.useAcceleration = true;\n        this._loopInterval = 30;\n        this._targetPosition = 0;\n        this._targetTime = 0;\n        this._startTime = null;\n        this._timeout = null;\n        this._onComplete = k;\n    };\n    j(l.prototype, {\n        getRoot: function() {\n            return this._root;\n        },\n        setPosition: function(o) {\n            o = this._normalizePosition(o);\n            this._initialPosition = o;\n            this._position = o;\n            this._updateMeter();\n            this.stop();\n            return this;\n        },\n        changeLabel: function(o) {\n            var p = h.scry(this._root, \"span.label\");\n            p.forEach(function(q) {\n                h.setContent(q, o);\n            });\n            return this;\n        },\n        setCompleteHandler: function(o) {\n            this._onComplete = (o || k);\n            return this;\n        },\n        setTarget: function(o, p) {\n            clearTimeout(this._timeout);\n            this._targetPosition = o;\n            var q = this._normalizePosition(o);\n            this._targetTime = p;\n            this._initialVelocity = this._velocity;\n            this._initialPosition = this._position;\n            if (this.useAcceleration) {\n                this._acceleration = ((2 * (((q - this._initialPosition) - (this._initialVelocity * p)))) / ((p * p)));\n            }\n             else {\n                this._acceleration = 0;\n                this._velocity = this._initialVelocity = (((q - this._initialPosition)) / p);\n            }\n        ;\n            if ((this._position >= q)) {\n                this._onComplete();\n            }\n             else this._start();\n        ;\n            return this;\n        },\n        setNoAcceleration: function(o) {\n            this.useAcceleration = !o;\n            return this;\n        },\n        stop: function() {\n            this._velocity = 0;\n            this._initialVelocity = 0;\n            this._acceleration = 0;\n            clearTimeout(this._timeout);\n            return this;\n        },\n        _start: function() {\n            this._startTime = Date.now();\n            this._timeout = setTimeout(this._loop.bind(this), this._loopInterval);\n            return this;\n        },\n        _loop: function() {\n            var o = (Date.now() - this._startTime);\n            this._position = ((((((11366 * this._acceleration) * o) * o)) + ((this._initialVelocity * o))) + this._initialPosition);\n            var p = this._velocity;\n            this._velocity = ((this._acceleration * o) + this._initialVelocity);\n            var q = ((p < 0) !== (this._velocity < 0));\n            this._updateMeter();\n            if (((this._position > this._normalizePosition(this._targetPosition)) || q)) {\n                this._velocity = this._initialVelocity = 0;\n                this._acceleration = 0;\n                this.setPosition(this._targetPosition);\n                this._onComplete();\n            }\n             else this._timeout = setTimeout(this._loop.bind(this), this._loopInterval);\n        ;\n        },\n        _updateMeter: function() {\n            var o = Math.min(Math.max(this._position, 0), 1);\n            g.conditionClass(this._meter, \"empty\", (o <= 0));\n            g.conditionClass(this._meter, \"full\", (o >= 1));\n            i.set(this._meter, \"width\", ((o * 100) + \"%\"));\n        },\n        _normalizePosition: function(o) {\n            return Math.min(Math.max((((o - this._min)) / ((this._max - this._min))), 0), 1);\n        }\n    });\n    function m(o, p) {\n        o.setPosition(p);\n    };\n    function n(o, p, q) {\n        o.setTarget(p, q);\n    };\n    e.exports = l;\n    e.exports.setTarget = n;\n    e.exports.setPosition = m;\n});\n__d(\"FreeformTokenizerBehavior\", [\"Input\",\"Keys\",\"Event\",\"function-extensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Input\"), h = b(\"Keys\"), i = b(\"Event\");\n    b(\"function-extensions\");\n    function j(k, l) {\n        var m = (l.tokenize_on_blur !== false), n = (l.tokenize_on_paste !== false), o = (l.matcher && new RegExp(l.matcher, \"i\")), p = (l.paste_split && new RegExp(l.paste_split)), q = (l.select_on_comma !== false), r = (l.never_submit === true);\n        function s(event) {\n            var t = g.getValue(k.getInput()).trim();\n            if (((p && event) && (event.type == \"paste\"))) {\n                t = t.split(p);\n            }\n             else t = [t,];\n        ;\n            var u = false;\n            for (var v = 0; (v < t.length); v++) {\n                var w = t[v].trim();\n                if ((w && ((!o || o.test(w))))) {\n                    var x = {\n                        uid: w,\n                        text: w,\n                        freeform: true\n                    };\n                    k.addToken(k.createToken(x));\n                    u = true;\n                }\n            ;\n            };\n            if ((event && u)) {\n                k.getTypeahead().getCore().afterSelect();\n                event.kill();\n            }\n        ;\n        };\n        k.subscribe(\"keydown\", function(t, u) {\n            var event = u.event, v = i.getKeyCode(event);\n            if ((((q && (v == h.COMMA))) || (v == h.RETURN))) {\n                var w = k.getTypeahead().getView();\n                if (w.getSelection()) {\n                    w.select();\n                    event.kill();\n                }\n                 else s(event);\n            ;\n            }\n        ;\n            if (((v == h.RETURN) && r)) {\n                event.kill();\n            };\n        });\n        k.subscribe(\"paste\", function(t, u) {\n            if (n) {\n                s.bind(null, u.event).defer(20);\n            };\n        });\n        k.subscribe(\"blur\", function(t, u) {\n            if (m) {\n                s();\n            };\n            k.getTypeahead().getCore().reset();\n        });\n    };\n    e.exports = j;\n});\n__d(\"VaultEditableGrid\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"$\",\"copyProperties\",\"csx\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"ge\"), p = b(\"removeFromArray\"), q = {\n    };\n    function r(s, t) {\n        q[s.id] = this;\n        this._grid = s;\n        this._gridID = s.id;\n        this._dialogEndpoint = t;\n        this._selectedVaultImageIDs = [];\n        h.subscribe((\"multi-upload/image-removed/\" + this._gridID), function(u, v) {\n            p(this._selectedVaultImageIDs, v);\n        }.bind(this));\n        h.subscribe((\"multi-upload/composer-reset/\" + this._gridID), this.removeImages.bind(this));\n        h.inform((\"fbVaultEditableGrid/created/\" + s.id), this, h.BEHAVIOR_PERSISTENT);\n        h.subscribe((\"multi-upload/images-upload-start/\" + this._gridID), this._scrollToRight.bind(this));\n    };\n    m(r, {\n        VAULT_IMAGE: \"vault_image\",\n        getInstance: function(s) {\n            return q[s];\n        },\n        registerDialogWithGrid: function(s, t, u) {\n            h.subscribe([(\"multi-upload/images-upload-start/\" + s),(\"multi-upload/video-added/\" + s),], u.hide.bind(u));\n            h.subscribe((\"fbVaultEditableGrid/created/\" + s), function(v, w) {\n                w._registerDialogWithGrid(t, u);\n            });\n        },\n        onImagesSelected: function(s, t, u) {\n            q[s]._onImagesSelected(t, u);\n        }\n    });\n    m(r.prototype, {\n        getRoot: function() {\n            var s = o(this._gridID);\n            if (s) {\n                return s;\n            }\n             else return this._grid\n        ;\n        },\n        _registerDialogWithGrid: function(s, t) {\n            this._dialog = t;\n            var u = this.getMoreLink();\n            (u && g.listen(u, \"click\", function() {\n                t.show();\n                return false;\n            }));\n            t.subscribe(\"aftershow\", function() {\n                var v = [];\n                k.scry(l(this._gridID), \"input[type=\\\"hidden\\\"]\").forEach(function(x) {\n                    if ((x.name.match(\"composer_vault_images\") || x.name.match(\"composer_unpublished_photo\"))) {\n                        v.push(x.value);\n                    };\n                });\n                var w = s.getGrid();\n                w.bulkChange(function() {\n                    var x = w.getSelectionSet();\n                    x.clear();\n                    x.addAll(v);\n                });\n            }.bind(this));\n        },\n        getID: function() {\n            return this._gridID;\n        },\n        _onImagesSelected: function(s, t) {\n            var u = k.find(this.getRoot(), \".-cx-PRIVATE-fbMultiUploadInput__prependtarget\");\n            this.removeImages();\n            this._selectedVaultImageIDs = t;\n            s.forEach(function(v) {\n                k.insertBefore(u, v);\n            });\n            h.inform((\"multi-upload/images-added/\" + this._gridID), {\n                fbids: t\n            });\n            this._scrollToRight();\n        },\n        removeImages: function() {\n            k.scry(this.getRoot(), \".fbVaultGridItem\").forEach(function(s) {\n                if (!j.hasClass(s, \"fbVaultEditableGridMoreLink\")) {\n                    k.remove(s);\n                };\n            });\n            this._selectedVaultImageIDs = [];\n            h.inform((\"multi-upload/all-images-removed/\" + this._gridID));\n        },\n        _scrollToRight: function() {\n            var s = this.getRoot(), t = k.find(s, \".fbScrollableAreaWrap\");\n            t.scrollLeft = Math.max(0, (k.find(s, \".fbScrollableAreaBody\").offsetWidth - t.offsetWidth));\n        },\n        showDialog: function(s, t) {\n            if (this._dialog) {\n                this._dialog.show();\n            }\n             else i.bootstrap(this._dialogEndpoint, s);\n        ;\n        },\n        getMoreLink: function() {\n            return k.scry(this.getRoot(), \".fbVaultEditableGridMoreLink\")[0];\n        }\n    });\n    e.exports = r;\n});\n__d(\"VaultBoxURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        PHOTOS_SYNCED: \"photos_synced\",\n        isVaultBoxURI: function(i) {\n            var j = new RegExp(((\"/\" + h.PHOTOS_SYNCED) + \"/?$\"));\n            return (i.getPath().match(j) && i.getQueryData().hasOwnProperty(\"view_image\"));\n        },\n        isVaultArchiveURI: function(i) {\n            var j = new RegExp(((\"/\" + h.PHOTOS_SYNCED) + \"/?$\"));\n            return i.getPath().match(j);\n        },\n        getSyncedTabURI: function() {\n            return new g((\"/me/\" + h.PHOTOS_SYNCED)).getQualifiedURI();\n        }\n    };\n    e.exports = h;\n});");
// 9420
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sdea9fc4f8fec3bb09f65a70a645ea68309728bc2");
// 9421
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"mBpeN\",]);\n}\n;\n;\n__d(\"Button.react\", [\"AbstractButton.react\",\"ReactPropTypes\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AbstractButton.react\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = i.createClass({\n        displayName: \"Button\",\n        propTypes: {\n            use: h.oneOf([\"special\",\"JSBNG__confirm\",\"default\",]),\n            size: h.oneOf([\"medium\",\"large\",]),\n            suppressed: h.bool\n        },\n        render: function() {\n            var l = ((this.props.use || \"default\")), m = ((this.props.size || \"medium\")), n = (((((((((((\"-cx-PRIVATE-uiButton__root\") + ((((l === \"special\")) ? ((\" \" + \"-cx-PRIVATE-uiButton__special\")) : \"\")))) + ((((l === \"JSBNG__confirm\")) ? ((\" \" + \"-cx-PRIVATE-uiButton__confirm\")) : \"\")))) + ((((m === \"large\")) ? ((\" \" + \"-cx-PRIVATE-uiButton__large\")) : \"\")))) + ((this.props.suppressed ? ((\" \" + \"-cx-PRIVATE-uiButton__suppressed\")) : \"\")))) + ((((l !== \"default\")) ? ((\" \" + \"selected\")) : \"\"))));\n            return this.transferPropsTo(g({\n                className: n\n            }));\n        }\n    });\n    e.exports = k;\n});\n__d(\"Grid.react\", [\"ReactPropTypes\",\"React\",\"cx\",\"flattenChildren\",\"getObjectValues\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"ReactPropTypes\"), h = b(\"React\"), i = b(\"cx\"), j = b(\"flattenChildren\"), k = b(\"getObjectValues\"), l = b(\"joinClasses\"), m = h.createClass({\n        displayName: \"Grid\",\n        propTypes: {\n            cols: g.number.isRequired,\n            fixed: g.bool,\n            alignv: g.oneOf([\"JSBNG__top\",\"middle\",\"bottom\",]),\n            alignh: g.oneOf([\"left\",\"center\",\"right\",]),\n            spacing: g.string\n        },\n        render: function() {\n            var p = k(j(this.props.children)), q = p.length, r = [], s = [], t = 0;\n            p.forEach(function(u, v) {\n                u.props.alignv = this.props.alignv;\n                u.props.alignh = this.props.alignh;\n                o(u, ((this.props.fixed ? \"uiGridFixed\" : \"\")));\n                if (this.props.spacing) {\n                    o(u, this.props.spacing);\n                }\n            ;\n            ;\n                s.push(u);\n                t += Math.max(((u.props.colSpan || 0)), 1);\n                if (((((((t % this.props.cols)) === 0)) || ((((v + 1)) === q))))) {\n                    if (((this.props.fixed && ((t < this.props.cols))))) {\n                        for (var w = t; ((w < this.props.cols)); w++) {\n                            s.push(n(null));\n                        ;\n                        };\n                    ;\n                        t = this.props.cols;\n                    }\n                ;\n                ;\n                    if (((t === this.props.cols))) {\n                        o(s[((s.length - 1))], \"-cx-PRIVATE-uiGrid__rightcol\");\n                    }\n                ;\n                ;\n                    r.push(h.DOM.tr({\n                        className: \"-cx-PRIVATE-uiGrid__row\",\n                        key: v\n                    }, s));\n                    s = [];\n                    t = 0;\n                }\n            ;\n            ;\n            }.bind(this));\n            return (h.DOM.table({\n                className: \"uiGrid -cx-PRIVATE-uiGrid__root\",\n                cellSpacing: \"0\",\n                cellPadding: \"0\"\n            }, h.DOM.tbody(null, r)));\n        }\n    }), n = h.createClass({\n        displayName: \"GridItem\",\n        propTypes: {\n            alignv: g.oneOf([\"JSBNG__top\",\"middle\",\"bottom\",]),\n            alignh: g.oneOf([\"left\",\"center\",\"right\",])\n        },\n        render: function() {\n            var p = (((((((((((((\"-cx-PRIVATE-uiGrid__cell\") + ((((this.props.alignv === \"JSBNG__top\")) ? ((\" \" + \"vTop\")) : \"\")))) + ((((this.props.alignv === \"middle\")) ? ((\" \" + \"vMid\")) : \"\")))) + ((((this.props.alignv === \"bottom\")) ? ((\" \" + \"vBot\")) : \"\")))) + ((((this.props.alignh === \"left\")) ? ((\" \" + \"hLeft\")) : \"\")))) + ((((this.props.alignh === \"center\")) ? ((\" \" + \"hCent\")) : \"\")))) + ((((this.props.alignh === \"right\")) ? ((\" \" + \"hRght\")) : \"\"))));\n            return this.transferPropsTo(h.DOM.td({\n                className: p\n            }, this.props.children));\n        }\n    }), o = function(p, q) {\n        p.props.className = l(p.props.className, q);\n    };\n    m.GridItem = n;\n    e.exports = m;\n});\n__d(\"mixin\", [], function(a, b, c, d, e, f) {\n    function g(h, i, j, k, l, m, n, o, p, q, r) {\n        var s = function() {\n        \n        }, t = [h,i,j,k,l,m,n,o,p,q,], u = 0, v;\n        while (t[u]) {\n            v = t[u];\n            {\n                var fin196keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin196i = (0);\n                var w;\n                for (; (fin196i < fin196keys.length); (fin196i++)) {\n                    ((w) = (fin196keys[fin196i]));\n                    {\n                        if (v.hasOwnProperty(w)) {\n                            s.prototype[w] = v[w];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            u += 1;\n        };\n    ;\n        return s;\n    };\n;\n    e.exports = g;\n});\n__d(\"WebMessengerDetailViewSheetControl\", [\"DOM\",\"WebMessengerStateManager\",\"MercurySheetView\",\"WebMessengerTemplates\",\"MercuryThreadInformer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"WebMessengerJoinStatusTabSheet\",\"WebMessengerThreadIsMutedTabSheet\",\"WebMessengerSubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"WebMessengerStateManager\"), i = b(\"MercurySheetView\"), j = b(\"WebMessengerTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreadMuter\"), m = b(\"MercuryThreads\").get(), n = b(\"WebMessengerJoinStatusTabSheet\"), o = b(\"WebMessengerThreadIsMutedTabSheet\"), p = b(\"WebMessengerSubscriptionsHandler\");\n    function q(r) {\n        this._template = j[\":fb:web-messenger:tab-sheet-container\"].build();\n        this._rootElement = this._template.getNode(\"sheet\");\n        this._threadID = h.getCurrentStateData().thread_id;\n        this._sheetView = new i(this._threadID, this._rootElement, r);\n        this._threadIsMutedTabSheet = new o(this._rootElement, this._sheetView);\n        this._userJoinStatusSheet = new n(this._rootElement, this._sheetView);\n        this._muteSetting = undefined;\n        g.setContent(r, this._template.getRoot());\n        this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", function() {\n            l.showMuteChangeDialog(0, this._threadID);\n        }.bind(this));\n        p.addSubscriptions(k.subscribe(\"threads-updated\", function(s, t) {\n            if (((this._threadID && t[this._threadID]))) {\n                this.updateTabSheet(false);\n            }\n        ;\n        ;\n        }.bind(this)));\n        this.updateTabSheet(true);\n    };\n;\n    q.prototype.updateView = function() {\n        var r = h.getCurrentStateData().thread_id;\n        if (((this._threadID != r))) {\n            this._threadID = r;\n            this.updateTabSheet(true);\n        }\n    ;\n    ;\n    };\n    q.prototype.updateTabSheet = function(r) {\n        if (!this._threadID) {\n            return;\n        }\n    ;\n    ;\n        m.getThreadMeta(this._threadID, function(s) {\n            var t = l.getThreadMuteSettingForUser(s);\n            if (((((t != this._muteSetting)) || r))) {\n                if (t) {\n                    this._threadIsMutedTabSheet.open();\n                }\n                 else this._threadIsMutedTabSheet.close();\n            ;\n            ;\n                this._muteSetting = t;\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n    q.prototype.openUserJoinStatusSheet = function(r) {\n        this._userJoinStatusSheet.addToQueue(r);\n    };\n    q.prototype.destroy = function() {\n        ((this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe()));\n    };\n    e.exports = q;\n});\n__d(\"WebMessengerActionsMenuItem\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"WebMessengerStateManager\",\"WebMessengerTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"WebMessengerStateManager\"), j = b(\"WebMessengerTemplates\");\n    function k(l, m, n) {\n        var o = j[\":fb:web-messenger:actions-menu-item\"].build();\n        o.setNodeContent(\"title\", l);\n        this.node = o.getRoot();\n        this.showFn = n;\n        g.listen(this.node, \"click\", function() {\n            var p = i.getCurrentStateData().thread_id;\n            ((p && m(p)));\n        });\n    };\n;\n    k.prototype.getNode = function() {\n        return this.node;\n    };\n    k.prototype.updateShown = function(l) {\n        var m = ((this.showFn ? this.showFn(l) : true));\n        h.conditionShow(this.node, m);\n        return m;\n    };\n    e.exports = k;\n});\n__d(\"WebMessengerTabbedFolderControl\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"WebMessengerTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"WebMessengerTemplates\");\n    function j(k, l, m) {\n        this._template = i[\":fb:web-messenger:master-view:tab-bar:folder\"].build();\n        this._template.setNodeContent(\"folderLabel\", k);\n        this._listener = g.listen(this._template.getNode(\"link\"), \"click\", m);\n        l.push(this._template.getRoot());\n    };\n;\n    j.prototype.getCountBadge = function() {\n        return this._template.getNode(\"count\");\n    };\n    j.prototype.setSelected = function(k) {\n        h.conditionClass(this._template.getRoot(), \"selectedFolder\", k);\n    };\n    j.prototype.getElement = function() {\n        this._template.getRoot();\n    };\n    j.prototype.destroy = function() {\n        this._listener.remove();\n    };\n    e.exports = j;\n});\n__d(\"WebMessengerUnseenMessageNoticeRenderer\", [\"JSXDOM\",\"ContextualLayer\",\"LayerFadeOnHide\",\"cx\",\"tx\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"ContextualLayer\"), i = b(\"LayerFadeOnHide\"), j = b(\"cx\"), k = b(\"tx\"), l = b(\"JSBNG__Event\"), m = {\n        renderNoticeTooltip: function(o, p) {\n            var q = g.div({\n                className: \"-cx-PRIVATE-webMessengerNoticeTooltip__uitooltipx\"\n            }, n(o), g.i({\n                className: \"-cx-PRIVATE-webMessengerNoticeTooltip__arrow\"\n            })), r = new h(((p || {\n            })), q).enableBehavior(i);\n            return r;\n        }\n    };\n    function n(o) {\n        var p = g.div({\n            className: \"-cx-PRIVATE-webMessengerNoticeTooltip__tooltipcontent\"\n        }, \"You have new messages\");\n        l.listen(p, \"click\", o);\n        return p;\n    };\n;\n    e.exports = m;\n});\n__d(\"MessagingConst\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        APP_ID: 313785040330,\n        XD_MESSAGE: {\n            SANDBOX_READY: \"sandbox_ready\",\n            SET_CONTENT: \"set_content\",\n            HTML_SIZE: \"html_size\",\n            REFRESH_SIZE: \"refresh_size\"\n        },\n        SHINGLE_SCROLL_TRIGGER: 5,\n        EVENTS: {\n            MESSAGE_SENT: \"messaging/message_sent\"\n        },\n        initConstants: function(i) {\n            g(h, i);\n        }\n    };\n    e.exports = h;\n});\n__d(\"MessagingXD\", [\"JSBNG__Event\",\"DOM\",\"MercuryConstants\",\"MessagingConst\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"MercuryConstants\"), j = b(\"MessagingConst\"), k = b(\"URI\"), l = b(\"copyProperties\");\n    function m(n) {\n        this._listeners = [g.listen(window, \"message\", this._onPostMessage.bind(this)),];\n        this._iframes = {\n        };\n        this._contentWindows = {\n        };\n        this._messageHandler = n;\n    };\n;\n    l(m.prototype, {\n        unload: function() {\n            this._listeners.forEach(function(n) {\n                n.remove();\n            });\n        },\n        createIframe: function(n, o, p) {\n            var q = new k(p);\n            this._iframes[o] = h.create(\"div\", {\n                JSBNG__name: o,\n                frameBorder: 0,\n                src: q.toString()\n            });\n            h.appendContent(n, this._iframes[o]);\n            this._contentWindows[o] = this._iframes[o].contentWindow;\n            return this._iframes[o];\n        },\n        sendMessage: function(n, o) {\n            var p = Array.prototype.slice.apply(arguments);\n            p[0] = j.APP_ID;\n            var q = ((this._iframes[n].contentWindow || this._contentWindows[n]));\n            q.JSBNG__postMessage(p.join(\",\"), i.Sandbox.ORIGIN);\n        },\n        _onPostMessage: function(JSBNG__event) {\n            if (((((JSBNG__event.origin !== i.Sandbox.ORIGIN)) || !JSBNG__event.data.split))) {\n                return;\n            }\n        ;\n        ;\n            var n = JSBNG__event.data.split(\",\"), o = unescape(n[1]);\n            this._contentWindows[o] = JSBNG__event.source;\n            this._messageHandler(o, n);\n        }\n    });\n    e.exports = m;\n});\n__d(\"HTMLEmailRenderer\", [\"JSBNG__CSS\",\"MessagingConst\",\"MessagingXD\",\"copyProperties\",\"emptyFunction\",\"tx\",\"MercuryConstants\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"MessagingConst\"), i = b(\"MessagingXD\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"tx\"), m = b(\"MercuryConstants\");\n    function n(o, p) {\n        this._resizeContent = ((o.resizeContent || k));\n        this._richMap = {\n        };\n        this._useFBStyle = p;\n        this._xdc = new i(this.onXDMessage.bind(this));\n        this._maxWidth = 0;\n    };\n;\n    j(n.prototype, {\n        onXDMessage: function(o, p) {\n            if (((p[0] != h.APP_ID.toString()))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._richMap && this._richMap[o]))) {\n                if (((p[2] == h.XD_MESSAGE.SANDBOX_READY))) {\n                    return this.setIframeContent(o);\n                }\n                 else if (((p[2] == h.XD_MESSAGE.HTML_SIZE))) {\n                    return this._resizeContent(o, parseInt(p[3], 10), parseInt(p[4], 10), ((p[5] == \"true\")), ((p[6] == \"true\")));\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        setIframeContent: function(o, p) {\n            this._xdc.sendMessage(o, h.XD_MESSAGE.SET_CONTENT, escape(this._richMap[o]), ((this._useFBStyle ? \"useFBStyle\" : \"\")), ((p ? \"forceDialogOnWide\" : \"\")), escape(\"Show Hidden Text\"), escape(\"Hide\"), this._maxWidth);\n        },\n        makeRich: function(o, p, q, r) {\n            var s = this._xdc.createIframe(p, o, m.Sandbox.PAGE_URL);\n            g.addClass(s, \"xdIframe\");\n            this._richMap[o] = q;\n            this._maxWidth = ((r || 0));\n        },\n        updateRichMap: function(o, p) {\n            this._richMap[o] = p;\n        },\n        unload: function() {\n            this._xdc.unload();\n        }\n    });\n    e.exports = n;\n});\n__d(\"PhotosUploadID\", [], function(a, b, c, d, e, f) {\n    var g = 1024, h = {\n        getNewID: function() {\n            return g++;\n        }\n    };\n    e.exports = h;\n});\n__d(\"ProgressBar\", [\"JSBNG__CSS\",\"DOM\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\");\n    function l(o, p, q) {\n        this._root = o;\n        this._min = ((p || 0));\n        this._max = ((q || 100));\n        this._meter = h.JSBNG__find(o, \"div.fill\");\n        this._initialPosition = 0;\n        this._position = 0;\n        this._initialVelocity = 0;\n        this._velocity = 0;\n        this._acceleration = 0;\n        this.useAcceleration = true;\n        this._loopInterval = 30;\n        this._targetPosition = 0;\n        this._targetTime = 0;\n        this._startTime = null;\n        this._timeout = null;\n        this._onComplete = k;\n    };\n;\n    j(l.prototype, {\n        getRoot: function() {\n            return this._root;\n        },\n        setPosition: function(o) {\n            o = this._normalizePosition(o);\n            this._initialPosition = o;\n            this._position = o;\n            this._updateMeter();\n            this.JSBNG__stop();\n            return this;\n        },\n        changeLabel: function(o) {\n            var p = h.scry(this._root, \"span.label\");\n            p.forEach(function(q) {\n                h.setContent(q, o);\n            });\n            return this;\n        },\n        setCompleteHandler: function(o) {\n            this._onComplete = ((o || k));\n            return this;\n        },\n        setTarget: function(o, p) {\n            JSBNG__clearTimeout(this._timeout);\n            this._targetPosition = o;\n            var q = this._normalizePosition(o);\n            this._targetTime = p;\n            this._initialVelocity = this._velocity;\n            this._initialPosition = this._position;\n            if (this.useAcceleration) {\n                this._acceleration = ((((2 * ((((q - this._initialPosition)) - ((this._initialVelocity * p)))))) / ((p * p))));\n            }\n             else {\n                this._acceleration = 0;\n                this._velocity = this._initialVelocity = ((((q - this._initialPosition)) / p));\n            }\n        ;\n        ;\n            if (((this._position >= q))) {\n                this._onComplete();\n            }\n             else this._start();\n        ;\n        ;\n            return this;\n        },\n        setNoAcceleration: function(o) {\n            this.useAcceleration = !o;\n            return this;\n        },\n        JSBNG__stop: function() {\n            this._velocity = 0;\n            this._initialVelocity = 0;\n            this._acceleration = 0;\n            JSBNG__clearTimeout(this._timeout);\n            return this;\n        },\n        _start: function() {\n            this._startTime = JSBNG__Date.now();\n            this._timeout = JSBNG__setTimeout(this._loop.bind(this), this._loopInterval);\n            return this;\n        },\n        _loop: function() {\n            var o = ((JSBNG__Date.now() - this._startTime));\n            this._position = ((((((((((11366 * this._acceleration)) * o)) * o)) + ((this._initialVelocity * o)))) + this._initialPosition));\n            var p = this._velocity;\n            this._velocity = ((((this._acceleration * o)) + this._initialVelocity));\n            var q = ((((p < 0)) !== ((this._velocity < 0))));\n            this._updateMeter();\n            if (((((this._position > this._normalizePosition(this._targetPosition))) || q))) {\n                this._velocity = this._initialVelocity = 0;\n                this._acceleration = 0;\n                this.setPosition(this._targetPosition);\n                this._onComplete();\n            }\n             else this._timeout = JSBNG__setTimeout(this._loop.bind(this), this._loopInterval);\n        ;\n        ;\n        },\n        _updateMeter: function() {\n            var o = Math.min(Math.max(this._position, 0), 1);\n            g.conditionClass(this._meter, \"empty\", ((o <= 0)));\n            g.conditionClass(this._meter, \"full\", ((o >= 1)));\n            i.set(this._meter, \"width\", ((((o * 100)) + \"%\")));\n        },\n        _normalizePosition: function(o) {\n            return Math.min(Math.max(((((o - this._min)) / ((this._max - this._min)))), 0), 1);\n        }\n    });\n    function m(o, p) {\n        o.setPosition(p);\n    };\n;\n    function n(o, p, q) {\n        o.setTarget(p, q);\n    };\n;\n    e.exports = l;\n    e.exports.setTarget = n;\n    e.exports.setPosition = m;\n});\n__d(\"FreeformTokenizerBehavior\", [\"Input\",\"Keys\",\"JSBNG__Event\",\"function-extensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Input\"), h = b(\"Keys\"), i = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    function j(k, l) {\n        var m = ((l.tokenize_on_blur !== false)), n = ((l.tokenize_on_paste !== false)), o = ((l.matcher && new RegExp(l.matcher, \"i\"))), p = ((l.paste_split && new RegExp(l.paste_split))), q = ((l.select_on_comma !== false)), r = ((l.never_submit === true));\n        function s(JSBNG__event) {\n            var t = g.getValue(k.getInput()).trim();\n            if (((((p && JSBNG__event)) && ((JSBNG__event.type == \"paste\"))))) {\n                t = t.split(p);\n            }\n             else t = [t,];\n        ;\n        ;\n            var u = false;\n            for (var v = 0; ((v < t.length)); v++) {\n                var w = t[v].trim();\n                if (((w && ((!o || o.test(w)))))) {\n                    var x = {\n                        uid: w,\n                        text: w,\n                        freeform: true\n                    };\n                    k.addToken(k.createToken(x));\n                    u = true;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((JSBNG__event && u))) {\n                k.getTypeahead().getCore().afterSelect();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        };\n    ;\n        k.subscribe(\"keydown\", function(t, u) {\n            var JSBNG__event = u.JSBNG__event, v = i.getKeyCode(JSBNG__event);\n            if (((((q && ((v == h.COMMA)))) || ((v == h.RETURN))))) {\n                var w = k.getTypeahead().getView();\n                if (w.JSBNG__getSelection()) {\n                    w.select();\n                    JSBNG__event.kill();\n                }\n                 else s(JSBNG__event);\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((v == h.RETURN)) && r))) {\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        });\n        k.subscribe(\"paste\", function(t, u) {\n            if (n) {\n                s.bind(null, u.JSBNG__event).defer(20);\n            }\n        ;\n        ;\n        });\n        k.subscribe(\"JSBNG__blur\", function(t, u) {\n            if (m) {\n                s();\n            }\n        ;\n        ;\n            k.getTypeahead().getCore().reset();\n        });\n    };\n;\n    e.exports = j;\n});\n__d(\"VaultEditableGrid\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"$\",\"copyProperties\",\"csx\",\"ge\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"$\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"ge\"), p = b(\"removeFromArray\"), q = {\n    };\n    function r(s, t) {\n        q[s.id] = this;\n        this._grid = s;\n        this._gridID = s.id;\n        this._dialogEndpoint = t;\n        this._selectedVaultImageIDs = [];\n        h.subscribe(((\"multi-upload/image-removed/\" + this._gridID)), function(u, v) {\n            p(this._selectedVaultImageIDs, v);\n        }.bind(this));\n        h.subscribe(((\"multi-upload/composer-reset/\" + this._gridID)), this.removeImages.bind(this));\n        h.inform(((\"fbVaultEditableGrid/created/\" + s.id)), this, h.BEHAVIOR_PERSISTENT);\n        h.subscribe(((\"multi-upload/images-upload-start/\" + this._gridID)), this._scrollToRight.bind(this));\n    };\n;\n    m(r, {\n        VAULT_IMAGE: \"vault_image\",\n        getInstance: function(s) {\n            return q[s];\n        },\n        registerDialogWithGrid: function(s, t, u) {\n            h.subscribe([((\"multi-upload/images-upload-start/\" + s)),((\"multi-upload/video-added/\" + s)),], u.hide.bind(u));\n            h.subscribe(((\"fbVaultEditableGrid/created/\" + s)), function(v, w) {\n                w._registerDialogWithGrid(t, u);\n            });\n        },\n        onImagesSelected: function(s, t, u) {\n            q[s]._onImagesSelected(t, u);\n        }\n    });\n    m(r.prototype, {\n        getRoot: function() {\n            var s = o(this._gridID);\n            if (s) {\n                return s;\n            }\n             else return this._grid\n        ;\n        },\n        _registerDialogWithGrid: function(s, t) {\n            this._dialog = t;\n            var u = this.getMoreLink();\n            ((u && g.listen(u, \"click\", function() {\n                t.show();\n                return false;\n            })));\n            t.subscribe(\"aftershow\", function() {\n                var v = [];\n                k.scry(l(this._gridID), \"input[type=\\\"hidden\\\"]\").forEach(function(x) {\n                    if (((x.JSBNG__name.match(\"composer_vault_images\") || x.JSBNG__name.match(\"composer_unpublished_photo\")))) {\n                        v.push(x.value);\n                    }\n                ;\n                ;\n                });\n                var w = s.getGrid();\n                w.bulkChange(function() {\n                    var x = w.getSelectionSet();\n                    x.clear();\n                    x.addAll(v);\n                });\n            }.bind(this));\n        },\n        getID: function() {\n            return this._gridID;\n        },\n        _onImagesSelected: function(s, t) {\n            var u = k.JSBNG__find(this.getRoot(), \".-cx-PRIVATE-fbMultiUploadInput__prependtarget\");\n            this.removeImages();\n            this._selectedVaultImageIDs = t;\n            s.forEach(function(v) {\n                k.insertBefore(u, v);\n            });\n            h.inform(((\"multi-upload/images-added/\" + this._gridID)), {\n                fbids: t\n            });\n            this._scrollToRight();\n        },\n        removeImages: function() {\n            k.scry(this.getRoot(), \".fbVaultGridItem\").forEach(function(s) {\n                if (!j.hasClass(s, \"fbVaultEditableGridMoreLink\")) {\n                    k.remove(s);\n                }\n            ;\n            ;\n            });\n            this._selectedVaultImageIDs = [];\n            h.inform(((\"multi-upload/all-images-removed/\" + this._gridID)));\n        },\n        _scrollToRight: function() {\n            var s = this.getRoot(), t = k.JSBNG__find(s, \".fbScrollableAreaWrap\");\n            t.scrollLeft = Math.max(0, ((k.JSBNG__find(s, \".fbScrollableAreaBody\").offsetWidth - t.offsetWidth)));\n        },\n        showDialog: function(s, t) {\n            if (this._dialog) {\n                this._dialog.show();\n            }\n             else i.bootstrap(this._dialogEndpoint, s);\n        ;\n        ;\n        },\n        getMoreLink: function() {\n            return k.scry(this.getRoot(), \".fbVaultEditableGridMoreLink\")[0];\n        }\n    });\n    e.exports = r;\n});\n__d(\"VaultBoxURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        PHOTOS_SYNCED: \"photos_synced\",\n        isVaultBoxURI: function(i) {\n            var j = new RegExp(((((\"/\" + h.PHOTOS_SYNCED)) + \"/?$\")));\n            return ((i.getPath().match(j) && i.getQueryData().hasOwnProperty(\"view_image\")));\n        },\n        isVaultArchiveURI: function(i) {\n            var j = new RegExp(((((\"/\" + h.PHOTOS_SYNCED)) + \"/?$\")));\n            return i.getPath().match(j);\n        },\n        getSyncedTabURI: function() {\n            return new g(((\"/me/\" + h.PHOTOS_SYNCED))).getQualifiedURI();\n        }\n    };\n    e.exports = h;\n});");
// 9424
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o129,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yx/r/TabxUMg74t0.js",o130);
// undefined
o129 = null;
// undefined
o130 = null;
// 9429
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"C6rJk\",]);\n}\n;\n__d(\"NotifXList\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = null;\n    function i(p) {\n        if (!p) {\n            throw new Error(\"You have to init NotifXList with a non-null owner\")\n        };\n        h = p;\n    };\n    function j(p) {\n        g[p] = null;\n    };\n    function k(p, q) {\n        if (!q) {\n            throw new Error(\"You have to add a non-null data to xList\")\n        };\n        g[p] = q;\n    };\n    function l(p) {\n        var q = ((undefined !== g[p.notif_id])), r = ((p.notif_alt_id && (undefined !== g[p.notif_alt_id])));\n        if ((q || r)) {\n            k((q ? p.notif_id : p.notif_alt_id), p);\n            return true;\n        }\n    ;\n        return false;\n    };\n    function m(p) {\n        return (null != g[p]);\n    };\n    function n(p) {\n        if (m(p)) {\n            var q = g[p];\n            o(p);\n            h.alertList.insert(q.notif_id, q.notif_time, q.notif_markup, q.replace, q.ignoreUnread, q.notif_alt_id);\n        }\n    ;\n    };\n    function o(p) {\n        delete g[p];\n    };\n    e.exports = {\n        init: i,\n        userXClick: j,\n        filterStoreClicked: l,\n        newNotifExist: m,\n        resumeInsert: n,\n        removeNotif: o\n    };\n});");
// 9430
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sd0e0e320aa683436cafcda743d8b77745ad99691");
// 9431
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"C6rJk\",]);\n}\n;\n;\n__d(\"NotifXList\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = null;\n    function i(p) {\n        if (!p) {\n            throw new Error(\"You have to init NotifXList with a non-null owner\");\n        }\n    ;\n    ;\n        h = p;\n    };\n;\n    function j(p) {\n        g[p] = null;\n    };\n;\n    function k(p, q) {\n        if (!q) {\n            throw new Error(\"You have to add a non-null data to xList\");\n        }\n    ;\n    ;\n        g[p] = q;\n    };\n;\n    function l(p) {\n        var q = ((undefined !== g[p.notif_id])), r = ((p.notif_alt_id && ((undefined !== g[p.notif_alt_id]))));\n        if (((q || r))) {\n            k(((q ? p.notif_id : p.notif_alt_id)), p);\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function m(p) {\n        return ((null != g[p]));\n    };\n;\n    function n(p) {\n        if (m(p)) {\n            var q = g[p];\n            o(p);\n            h.alertList.insert(q.notif_id, q.notif_time, q.notif_markup, q.replace, q.ignoreUnread, q.notif_alt_id);\n        }\n    ;\n    ;\n    };\n;\n    function o(p) {\n        delete g[p];\n    };\n;\n    e.exports = {\n        init: i,\n        userXClick: j,\n        filterStoreClicked: l,\n        newNotifExist: m,\n        resumeInsert: n,\n        removeNotif: o\n    };\n});");
// 9444
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o131,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yk/r/mvmvxDKTeL4.js",o132);
// undefined
o131 = null;
// undefined
o132 = null;
// 9551
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"97Zhe\",]);\n}\n;\n__d(\"legacy:nux-wizard-page\", [\"NUXWizard\",], function(a, b, c, d) {\n    a.NUXWizard = b(\"NUXWizard\");\n}, 3);\n__d(\"PrivacyLiteNUXController\", [\"AsyncRequest\",\"CSS\",\"Event\",\"LayerSlowlyFadeOnShow\",\"Locale\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"PrivacyLiteFlyout\",\"Toggler\",\"$\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"Event\"), j = b(\"LayerSlowlyFadeOnShow\"), k = b(\"Locale\"), l = b(\"ModalMask\"), m = b(\"PageTransitions\"), n = b(\"Parent\"), o = b(\"PrivacyLiteFlyout\"), p = b(\"Toggler\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"cx\"), t = \"-cx-PUBLIC-fbPrivacyLiteMegaphone__openedfrommegaphone\", u = \"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide\", v = [], w = {\n        bootload: function() {\n        \n        },\n        init: function(y) {\n            if (!w.initialized) {\n                r(this, {\n                    dialog: y.dialog,\n                    sectionID: y.sectionID,\n                    subsectionID: y.subsectionID,\n                    initialized: true,\n                    tourStarted: false\n                });\n            };\n            if (y.showOnExpand) {\n                w._attachFlyoutListener();\n            }\n             else w._detachFlyoutListener();\n        ;\n        },\n        startTourFromAnywhere: function() {\n            w._startTour(false);\n        },\n        startTourFromMegaphone: function() {\n            w._startTour(true);\n        },\n        _startTour: function(y) {\n            if (w.tourStarted) {\n                return\n            };\n            w.tourStarted = true;\n            w._detachFlyoutListener();\n            new g(\"/ajax/privacy/privacy_lite/log_nux_imp\").setData({\n                from_megaphone: y\n            }).send();\n            l.show();\n            h.conditionClass(w.dialog.getRoot(), t, y);\n            if (!y) {\n                w._maskListener = i.listen(q(\"modalMaskOverlay\"), \"click\", w._cleanup);\n            };\n            p.setSticky(true);\n            setTimeout(w._showFlyout);\n            m.registerHandler(function() {\n                w._cleanup();\n                o.setFlyoutVisible(false);\n            }, 10);\n        },\n        _showFlyout: function() {\n            o.loadBody(true);\n            o.setFlyoutVisible(true);\n            w._initDialog();\n            x(\"load\", w._showTour);\n        },\n        _showTour: function() {\n            o.showSection(w.sectionID);\n            x(\"expanded\", function(y, z) {\n                if ((z === w.sectionID)) {\n                    w.dialog.setContext(q(w.subsectionID)).setOffsetY(20).show();\n                };\n            });\n            x([\"collapse\",\"hide\",], w._cleanup);\n        },\n        _initDialog: function() {\n            var y = w.dialog.getRoot(), z = w.dialog.getContent();\n            h.addClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogroot\");\n            h.conditionClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__rtl\", k.isRTL());\n            h.addClass(z, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogcontent\");\n            w.dialog.enableBehavior(j);\n            i.listen(y, \"click\", function(event) {\n                if (n.byClass(event.getTarget(), u)) {\n                    w._cleanup();\n                };\n            });\n        },\n        _attachFlyoutListener: function() {\n            if (!w.flyoutSubscription) {\n                if (o.isFlyoutVisible()) {\n                    w.startTourFromAnywhere();\n                }\n                 else w.flyoutSubscription = o.subscribe(\"show\", w.startTourFromAnywhere);\n            \n            };\n        },\n        _detachFlyoutListener: function() {\n            if (w.flyoutSubscription) {\n                w.flyoutSubscription.unsubscribe();\n                w.flyoutSubscription = null;\n            }\n        ;\n        },\n        _cleanup: function() {\n            if (!w.tourStarted) {\n                return\n            };\n            w.tourStarted = false;\n            p.setSticky(false);\n            l.hide();\n            w.dialog.hide();\n            while (v.length) {\n                v.pop().unsubscribe();;\n            };\n            if (w._maskListener) {\n                w._maskListener.remove();\n                w._maskListener = null;\n            }\n        ;\n        }\n    };\n    function x(y, z) {\n        v.push(o.subscribe(y, z));\n    };\n    e.exports = w;\n});");
// 9552
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s171ec31bc1d340c3d58a1c58fca7c8978eaa0d26");
// 9553
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"97Zhe\",]);\n}\n;\n;\n__d(\"legacy:nux-wizard-page\", [\"NUXWizard\",], function(a, b, c, d) {\n    a.NUXWizard = b(\"NUXWizard\");\n}, 3);\n__d(\"PrivacyLiteNUXController\", [\"AsyncRequest\",\"JSBNG__CSS\",\"JSBNG__Event\",\"LayerSlowlyFadeOnShow\",\"Locale\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"PrivacyLiteFlyout\",\"Toggler\",\"$\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__CSS\"), i = b(\"JSBNG__Event\"), j = b(\"LayerSlowlyFadeOnShow\"), k = b(\"Locale\"), l = b(\"ModalMask\"), m = b(\"PageTransitions\"), n = b(\"Parent\"), o = b(\"PrivacyLiteFlyout\"), p = b(\"Toggler\"), q = b(\"$\"), r = b(\"copyProperties\"), s = b(\"cx\"), t = \"-cx-PUBLIC-fbPrivacyLiteMegaphone__openedfrommegaphone\", u = \"-cx-PRIVATE-fbPrivacyLiteMegaphone__sigilhide\", v = [], w = {\n        bootload: function() {\n        \n        },\n        init: function(y) {\n            if (!w.initialized) {\n                r(this, {\n                    dialog: y.dialog,\n                    sectionID: y.sectionID,\n                    subsectionID: y.subsectionID,\n                    initialized: true,\n                    tourStarted: false\n                });\n            }\n        ;\n        ;\n            if (y.showOnExpand) {\n                w._attachFlyoutListener();\n            }\n             else w._detachFlyoutListener();\n        ;\n        ;\n        },\n        startTourFromAnywhere: function() {\n            w._startTour(false);\n        },\n        startTourFromMegaphone: function() {\n            w._startTour(true);\n        },\n        _startTour: function(y) {\n            if (w.tourStarted) {\n                return;\n            }\n        ;\n        ;\n            w.tourStarted = true;\n            w._detachFlyoutListener();\n            new g(\"/ajax/privacy/privacy_lite/log_nux_imp\").setData({\n                from_megaphone: y\n            }).send();\n            l.show();\n            h.conditionClass(w.dialog.getRoot(), t, y);\n            if (!y) {\n                w._maskListener = i.listen(q(\"modalMaskOverlay\"), \"click\", w._cleanup);\n            }\n        ;\n        ;\n            p.setSticky(true);\n            JSBNG__setTimeout(w._showFlyout);\n            m.registerHandler(function() {\n                w._cleanup();\n                o.setFlyoutVisible(false);\n            }, 10);\n        },\n        _showFlyout: function() {\n            o.loadBody(true);\n            o.setFlyoutVisible(true);\n            w._initDialog();\n            x(\"load\", w._showTour);\n        },\n        _showTour: function() {\n            o.showSection(w.sectionID);\n            x(\"expanded\", function(y, z) {\n                if (((z === w.sectionID))) {\n                    w.dialog.setContext(q(w.subsectionID)).setOffsetY(20).show();\n                }\n            ;\n            ;\n            });\n            x([\"collapse\",\"hide\",], w._cleanup);\n        },\n        _initDialog: function() {\n            var y = w.dialog.getRoot(), z = w.dialog.getContent();\n            h.addClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogroot\");\n            h.conditionClass(y, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__rtl\", k.isRTL());\n            h.addClass(z, \"-cx-PRIVATE-fbPrivacyLiteMegaphone__dialogcontent\");\n            w.dialog.enableBehavior(j);\n            i.listen(y, \"click\", function(JSBNG__event) {\n                if (n.byClass(JSBNG__event.getTarget(), u)) {\n                    w._cleanup();\n                }\n            ;\n            ;\n            });\n        },\n        _attachFlyoutListener: function() {\n            if (!w.flyoutSubscription) {\n                if (o.isFlyoutVisible()) {\n                    w.startTourFromAnywhere();\n                }\n                 else w.flyoutSubscription = o.subscribe(\"show\", w.startTourFromAnywhere);\n            ;\n            }\n        ;\n        ;\n        },\n        _detachFlyoutListener: function() {\n            if (w.flyoutSubscription) {\n                w.flyoutSubscription.unsubscribe();\n                w.flyoutSubscription = null;\n            }\n        ;\n        ;\n        },\n        _cleanup: function() {\n            if (!w.tourStarted) {\n                return;\n            }\n        ;\n        ;\n            w.tourStarted = false;\n            p.setSticky(false);\n            l.hide();\n            w.dialog.hide();\n            while (v.length) {\n                v.pop().unsubscribe();\n            ;\n            };\n        ;\n            if (w._maskListener) {\n                w._maskListener.remove();\n                w._maskListener = null;\n            }\n        ;\n        ;\n        }\n    };\n    function x(y, z) {\n        v.push(o.subscribe(y, z));\n    };\n;\n    e.exports = w;\n});");
// 9560
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o133,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yJ/r/wz04JJfiB2n.js",o134);
// undefined
o133 = null;
// undefined
o134 = null;
// 9565
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"G3fzU\",]);\n}\n;\n__d(\"concatMap\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = -1, k = i.length, l = [], m;\n        while ((++j < k)) {\n            m = h(i[j], j, i);\n            (Array.isArray(m) ? Array.prototype.push.apply(l, m) : Array.prototype.push.call(l, m));\n        };\n        return l;\n    };\n    e.exports = g;\n});\n__d(\"NodeHighlighter\", [\"concatMap\",\"createArrayFrom\",\"escapeRegex\",\"TokenizeUtil\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"concatMap\"), h = b(\"createArrayFrom\"), i = b(\"escapeRegex\"), j = b(\"TokenizeUtil\"), k = b(\"DOM\");\n    function l(o, p) {\n        var q = k.getText(o).split(p), r = q.map(function(s) {\n            if (p.test(s)) {\n                return m(s)\n            };\n            return (s || \"\");\n        });\n        return ((q.length > 1) ? r : null);\n    };\n    function m(o) {\n        return k.create(\"span\", {\n            class: \"highlightNode\"\n        }, o);\n    };\n    var n = {\n        getTextNodes: function(o) {\n            if ((this.isLeafNode(o) || this.isStopNode(o))) {\n                return o;\n            }\n             else if (this.isDiscardNode(o)) {\n                return []\n            }\n        ;\n            return g(this.getTextNodes.bind(this), h(o.childNodes));\n        },\n        getHighlightCandidates: function() {\n            return [];\n        },\n        isLeafNode: function(o) {\n            return k.isTextNode(o);\n        },\n        isStopNode: function(o) {\n            return false;\n        },\n        isDiscardNode: function(o) {\n            return false;\n        },\n        createSegmentedRegex: function(o) {\n            var p = j.getPunctuation();\n            return ((((((\"(^|\\\\s|\" + p) + \")(\") + o.map(String).map(i).join(\"|\")) + \")(?=(?:$|\\\\s|\") + p) + \"))\");\n        },\n        createNonSegmentedRegex: function(o) {\n            return ((\"(\" + o.map(String).join(\"|\")) + \")\");\n        },\n        createRegex: function(o) {\n            var p = /[\\u0E00-\\u109F\\u2000-\\uFFFF]/, q = [], r = [];\n            o.forEach(function(t) {\n                if (p.test(t)) {\n                    r.push(t);\n                }\n                 else q.push(t);\n            ;\n            });\n            var s = \"\";\n            if (q.length) {\n                s += this.createSegmentedRegex(q);\n                s += ((r.length) ? \"|\" : \"\");\n            }\n        ;\n            if (r.length) {\n                s += this.createNonSegmentedRegex(r);\n            };\n            return new RegExp(s, \"i\");\n        },\n        highlight: function(o, p) {\n            if (((!p || (p.length === 0)) || !o)) {\n                return\n            };\n            var q = g(function(s) {\n                return g(this.getTextNodes.bind(this), k.scry(o, s));\n            }.bind(this), this.getHighlightCandidates()), r = this.createRegex(p);\n            q.forEach(function(s) {\n                var t = l(s, r);\n                if (t) {\n                    if (this.isStopNode(s)) {\n                        k.setContent(s, t);\n                    }\n                     else k.replace(s, t);\n                \n                };\n            }.bind(this));\n        }\n    };\n    e.exports = n;\n});\n__d(\"BrowseFacebarHighlighter\", [\"copyProperties\",\"CSS\",\"csx\",\"escapeRegex\",\"NodeHighlighter\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"CSS\"), i = b(\"csx\"), j = b(\"escapeRegex\"), k = b(\"NodeHighlighter\"), l = {\n    };\n    g(l, k, {\n        getHighlightCandidates: function() {\n            return [\".-cx-PUBLIC-fbFacebarTypeaheadItem__labeltitle\",];\n        },\n        isDiscardNode: function(m) {\n            return h.hasClass(m, \"DefaultText\");\n        },\n        createSegmentedRegex: function(m) {\n            return ((\"(^|\\\\s|\\\\b)(\" + m.map(String).map(j).join(\"|\")) + \")\");\n        }\n    });\n    e.exports = l;\n});\n__d(\"BrowseNUXBootstrap\", [\"Arbiter\",\"AsyncRequest\",\"invariant\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"invariant\"), j = b(\"Run\"), k = null, l = null, m = null, n = {\n        registerFacebar: function(o) {\n            i(!k);\n            k = o;\n            j.onLoad(function() {\n                new h(\"/ajax/browse/nux.php\").setAllowCrossPageTransition(true).send();\n            });\n        },\n        registerStory: function(o) {\n            l = o;\n            g.inform(\"BrowseNUX/story\", {\n            }, g.BEHAVIOR_STATE);\n        },\n        registerTypeaheadUnit: function(o) {\n            m = o;\n            g.inform(\"BrowseNUX/typeaheadUnit\", {\n            }, g.BEHAVIOR_STATE);\n        },\n        getFacebarData: function() {\n            return k;\n        },\n        getStoryData: function() {\n            return l;\n        },\n        getTypeaheadUnitData: function() {\n            return m;\n        }\n    };\n    e.exports = n;\n});\n__d(\"BrowseNUXCheckpoint\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\");\n    function i(l, m) {\n        new g(\"/ajax/browse/nux_checkpoint.php\").setData(l).setFinallyHandler((m || h)).send();\n    };\n    var j = null, k = {\n        SHOW_MEGAPHONE: 0,\n        RESULTS_VIEW: 1,\n        COMPLETED: 2,\n        init: function(l) {\n            j = l;\n        },\n        getStep: function() {\n            return j;\n        },\n        setStep: function(l, m) {\n            j = l;\n            i({\n                nextStep: l\n            }, m);\n        },\n        setFinished: function(l) {\n            j = k.COMPLETED;\n            i({\n                finished: true\n            }, l);\n        }\n    };\n    e.exports = k;\n});\n__d(\"BrowseNUXMegaphone\", [\"Event\",\"function-extensions\",\"Animation\",\"ArbiterMixin\",\"BrowseNUXBootstrap\",\"CSS\",\"cx\",\"DOM\",\"Ease\",\"MegaphoneHelper\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Animation\"), i = b(\"ArbiterMixin\"), j = b(\"BrowseNUXBootstrap\"), k = b(\"CSS\"), l = b(\"cx\"), m = b(\"DOM\"), n = b(\"Ease\"), o = b(\"MegaphoneHelper\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"csx\");\n    function u(v) {\n        this.megaphone = v;\n        this.contentArea = null;\n        this.className = null;\n        this.startButton = m.find(this.megaphone, \"a.-cx-PRIVATE-fbBrowseNUXMegaphone__button\");\n        this.hideLink = m.find(this.megaphone, \"a.-cx-PRIVATE-fbBrowseNUXMegaphone__hidelink\");\n        g.listen(this.startButton, \"click\", this._handleStart.bind(this));\n        g.listen(this.hideLink, \"click\", this._handleHide.bind(this));\n    };\n    s(u.prototype, i, {\n        _attachListener: function() {\n            var v = 1, w = function() {\n                var x = this._getScrollOpacity();\n                if ((x !== v)) {\n                    p.set(this.megaphone, \"opacity\", ((x === 1) ? \"\" : x));\n                    k.conditionShow(this.megaphone, (x > 0));\n                    v = x;\n                }\n            ;\n            }.bind(this);\n            this.listener = g.listen(window, \"scroll\", w);\n            w();\n        },\n        _removeListener: function() {\n            if (this.listener) {\n                this.listener.remove();\n                this.listener = null;\n            }\n        ;\n        },\n        _getScrollOpacity: function() {\n            var v = q.getElementPosition(r(\"globalContainer\"), \"viewport\"), w = Math.max(0, Math.min(1, (((v.y + 70)) / 40)));\n            return n.circOut(w);\n        },\n        _handleStart: function() {\n            this.inform(\"start\");\n        },\n        _handleHide: function() {\n            var v = j.getStoryData();\n            o.hideStory(v.id, v.location);\n            this.inform(\"hide\");\n            this.hide();\n        },\n        setClass: function(v) {\n            (this.className && k.removeClass(this.megaphone, this.className));\n            k.addClass(this.megaphone, v);\n            this.className = v;\n        },\n        show: function(v) {\n            if (this.shown) {\n                return\n            };\n            this.shown = true;\n            this.contentArea = v;\n            var w = 5, x = (r(\"blueBarHolder\").offsetHeight - w);\n            p.set(this.megaphone, \"top\", (x + \"px\"));\n            p.set(this.megaphone, \"opacity\", 0);\n            m.appendContent(r(\"pageHead\"), this.megaphone);\n            k.show(this.megaphone);\n            var y = (((this.megaphone.offsetHeight || 90)) - w);\n            if (k.hasClass(document.body, \"-cx-PUBLIC-fbBrowseLayout__fullwidth\")) {\n                y = 0;\n            };\n            new h(v).to(\"marginTop\", y).duration(500).ease(n.sineOut).go();\n            var z = this._getScrollOpacity();\n            if (z) {\n                new h(this.megaphone).duration(250).checkpoint().to(\"opacity\", z).duration(250).ease(n.makePowerIn(2)).ondone(function() {\n                    if ((z === 1)) {\n                        p.set(this.megaphone, \"opacity\", \"\");\n                    };\n                    this._attachListener();\n                }.bind(this)).go();\n            }\n             else {\n                this._attachListener();\n                k.hide(this.megaphone);\n            }\n        ;\n        },\n        hide: function() {\n            if (!this.shown) {\n                return\n            };\n            this.shown = false;\n            this._removeListener();\n            new h(this.megaphone).to(\"opacity\", 0).duration(250).ease(n.makePowerOut(2)).go();\n            new h(this.contentArea).to(\"marginTop\", 0).duration(500).ease(n.sineIn).ondone(m.remove.curry(this.megaphone)).go();\n        }\n    });\n    e.exports = u;\n});\n__d(\"TextSelection\", [], function(a, b, c, d, e, f) {\n    var g = window.getSelection, h = document.selection, i = {\n        getSelection: function() {\n            if (g) {\n                return (g() + \"\");\n            }\n             else if (h) {\n                return h.createRange().text\n            }\n        ;\n            return null;\n        },\n        clearSelection: function() {\n            if (g) {\n                g().removeAllRanges();\n            }\n             else if (h) {\n                h.empty();\n            }\n        ;\n        },\n        selectAllInNode: function(j) {\n            var k = document.body.createTextRange;\n            if (k) {\n                var l = k();\n                l.moveToElementText(j);\n                l.select();\n            }\n             else if (g) {\n                var m = g(), n = document.createRange();\n                n.selectNodeContents(j);\n                m.removeAllRanges();\n                m.addRange(n);\n            }\n            \n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"BrowseNUXTourDialog\", [\"Event\",\"Animation\",\"CSS\",\"DOMQuery\",\"LayerSlowlyFadeOnShow\",\"TextSelection\",\"UserAgent\",\"copyProperties\",\"csx\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"LayerSlowlyFadeOnShow\"), l = b(\"TextSelection\"), m = b(\"UserAgent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = b(\"emptyFunction\");\n    function r(s, t) {\n        this.dialog = s;\n        this.typeahead = t;\n        this.dialog.enableBehavior(k);\n        this._closeButtonHandler = null;\n        i.addClass(this.dialog.getRoot(), \"-cx-PRIVATE-fbBrowseNUXTourDialog__root\");\n        i.addClass(this.dialog.getContent(), \"-cx-PRIVATE-fbBrowseNUXTourDialog__content\");\n        this.subscription = this.dialog.subscribe(\"beforehide\", q.thatReturnsFalse);\n    };\n    n(r.prototype, {\n        showWithContext: function(s, t) {\n            this.resultIndex = t;\n            this.dialog.setContext(s).show();\n            l.clearSelection();\n        },\n        getButton: function() {\n            return j.find(this.dialog.getRoot(), \"a.-cx-PRIVATE-fbBrowseNUX__nextbutton\");\n        },\n        getCloseButton: function() {\n            return j.find(this.dialog.getRoot(), \"a.-cx-PRIVATE-fbBrowseNUX__closebutton\");\n        },\n        activateCloseButton: function(s) {\n            var t = this.getCloseButton();\n            this._closeButtonHandler = g.listen(t, \"click\", function(event) {\n                this.reset();\n                s(event);\n            }.bind(this));\n            i.show(t);\n        },\n        showButton: function() {\n            var s = this.getButton();\n            i.removeClass(s, \"invisible_elem\");\n            new h(s).to(\"opacity\", 1).go();\n        },\n        setNextHandler: function(s) {\n            var t = g.listen(this.getButton(), \"click\", function(event) {\n                t.remove();\n                this.reset();\n                s(event);\n            }.bind(this));\n        },\n        reset: function() {\n            this.subscription.unsubscribe();\n            (this._closeButtonHandler && this._closeButtonHandler.remove());\n            this.dialog.hide();\n        }\n    });\n    e.exports = r;\n});\n__d(\"AutoTypewriter\", [], function(a, b, c, d, e, f) {\n    var g = [null,null,], h = {\n        request: function(i, j, k) {\n            k = (k || 200);\n            var l = false, m = 1, n = g.length;\n            (function o() {\n                if (l) {\n                    return\n                };\n                var p = j.substr(0, m);\n                if ((p === j)) {\n                    i(p, true);\n                    g[n] = null;\n                }\n                 else {\n                    i(p, false);\n                    m++;\n                    setTimeout(o, k);\n                }\n            ;\n            })();\n            g[n] = function() {\n                l = true;\n            };\n            return n;\n        },\n        cancel: function(i) {\n            if (!g[i]) {\n                return false\n            };\n            g[i]();\n            g[i] = null;\n            return true;\n        }\n    };\n    e.exports = h;\n});\n__d(\"BrowseNUXTypewriter\", [\"Arbiter\",\"AutoTypewriter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AutoTypewriter\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.structuredInput = k;\n    };\n    i(j.prototype, {\n        setValue: function(k, l) {\n            this._type(k, function(m, n) {\n                g.inform(\"BrowseNUX/typing\");\n                this.structuredInput.setText(m);\n                this.structuredInput.togglePlaceholder();\n                this.structuredInput.moveSelectionToEnd();\n            }.bind(this), l);\n        },\n        prependFragment: function(k, l) {\n            var m = this.structuredInput, n = m.getStructure();\n            this._type(k.text, function(o) {\n                g.inform(\"BrowseNUX/typing\");\n                k.text = o;\n                m.setStructure([k,].concat(n));\n                m.setSelection({\n                    offset: o.length,\n                    length: 0\n                });\n            }, l);\n        },\n        abort: function() {\n            if (this._token) {\n                h.cancel(this._token);\n                this._cleanup();\n            }\n        ;\n        },\n        _type: function(k, l, m) {\n            this.abort();\n            var n = this.structuredInput;\n            this._wasEnabled = n.getEnabled();\n            n.setEnabled(true);\n            n.focus();\n            this._token = h.request(function(o, p) {\n                l(o);\n                if (p) {\n                    this._cleanup();\n                    (m && m());\n                }\n            ;\n            }.bind(this), k, 100);\n        },\n        _cleanup: function() {\n            this.structuredInput.setEnabled(this._wasEnabled);\n            delete this._token;\n            delete this._wasEnabled;\n        }\n    });\n    e.exports = j;\n});\n__d(\"FacebarSemanticQuery\", [\"URI\",\"copyProperties\",\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"copyProperties\"), i = b(\"Env\"), j = \"str\";\n    function k(t) {\n        var u = {\n            me: i.user\n        };\n        return h(u, t.semantic_map);\n    };\n    function l(t, u) {\n        var v = k(t);\n        if ((typeof v[u] !== \"undefined\")) {\n            return String(v[u])\n        };\n        return u;\n    };\n    function m(t) {\n        return new g(\"/profile.php\").addQueryData({\n            id: t\n        });\n    };\n    function n(t, u) {\n        var v, w = q(u), x = {\n        };\n        for (var y = 0; (y < w.length); ++y) {\n            if ((w[y].indexOf(\"path(\") === 0)) {\n                v = g(q(w[y])[0]);\n            }\n             else {\n                var z = w[y].substring(6, w[y].indexOf(\"(\")).split(\"_\"), aa = q(w[y]);\n                for (var ba = 0; (ba < z.length); ++ba) {\n                    x[z[ba]] = l(t, aa[ba]);;\n                };\n            }\n        ;\n        };\n        v.addQueryData(x);\n        return v;\n    };\n    function o(t, u) {\n        var v = [u,], w = [], x = t.browse_functions, y = t.search_path;\n        while ((v.length > 0)) {\n            var z = v.pop();\n            if (!p(z)) {\n                w.push(z);\n                continue;\n            }\n        ;\n            var aa = z.substring(0, z.indexOf(\"(\")), ba = aa, ca = q(z);\n            if (!x[aa]) {\n                w = [];\n                break;\n            }\n        ;\n            var da = x[aa].minNumParams, ea = x[aa].maxNumParams;\n            if ((v.length > 0)) {\n                if (x[aa].numParamsUnbounded) {\n                    if ((w.length > 0)) {\n                        aa += (\"-\" + ca.length);\n                    };\n                }\n                 else if (((((ca.length != 1) && (ca.length > da))) || (((ca.length === 0) && (da != ea))))) {\n                    aa += (\"-\" + ca.length);\n                }\n            \n            };\n            v.push(aa);\n            for (var fa = 0; (fa < ca.length); fa++) {\n                if ((ca[fa].length === 0)) {\n                    continue;\n                };\n                if (x[ba].allowsFreeText) {\n                    v.push(((j + \"/\") + encodeURIComponent(ca[fa])));\n                }\n                 else v.push(ca[fa]);\n            ;\n            };\n        };\n        return g((y + w.join(\"/\")));\n    };\n    function p(t) {\n        return (/^[a-z\\-]+\\(.*\\)$/).test(t);\n    };\n    function q(t) {\n        if ((!p(t) && (t.indexOf(\"param_\") !== 0))) {\n            return [t,]\n        };\n        var u = t.substring((t.indexOf(\"(\") + 1), (t.length - 1));\n        if ((u.length === 0)) {\n            return []\n        };\n        return r(u);\n    };\n    function r(t) {\n        var u = [], v = 0, w = 0;\n        for (var x = 0; (x < t.length); ++x) {\n            if (((t[x] == \",\") && (w === 0))) {\n                u.push(t.substring(v, x));\n                v = (x + 1);\n            }\n             else if ((t[x] == \"(\")) {\n                w++;\n            }\n             else if ((t[x] == \")\")) {\n                w--;\n            }\n            \n        ;\n        };\n        u.push(t.substring(v, t.length));\n        return u;\n    };\n    function s(t, u) {\n        this.facebarConfig = t;\n        this.unmapped = ((u || \"\")).trim();\n        this.mapped = l(t, this.unmapped);\n        this.position = null;\n    };\n    s.prototype.isEntity = function() {\n        return (/^\\d+$/).test(this.mapped);\n    };\n    s.prototype.isURI = function() {\n        return (this.mapped.indexOf(\"uri(\") === 0);\n    };\n    s.prototype.isImplemented = function() {\n        return (this.mapped && (this.mapped.indexOf(\"*\") == -1));\n    };\n    s.prototype.getUnimplemented = function() {\n        return ((this.mapped.match(/\\*[\\w\\-]+\\(/g) || [])).map(function(t) {\n            return t.substr(1, (t.length - 2));\n        });\n    };\n    s.prototype.getURI = function() {\n        if (this.isEntity()) {\n            return m(this.mapped);\n        }\n         else if (this.isURI()) {\n            return n(this.facebarConfig, this.mapped);\n        }\n         else return o(this.facebarConfig, this.unmapped)\n        \n    ;\n    };\n    e.exports = s;\n});\n__d(\"FacebarURI\", [\"URI\",\"Env\",\"FacebarSemanticQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"Env\"), i = b(\"FacebarSemanticQuery\"), j = {\n        getSearchRawPrefix: function() {\n            return \"search\";\n        },\n        getSearchPath: function() {\n            return ((\"/\" + this.getSearchRawPrefix()) + \"/\");\n        },\n        getURI: function(k, l) {\n            var m = null, n = (!l.song && l.path);\n            if (n) {\n                m = new g(n);\n                if ((l.type == \"user\")) {\n                    m.addQueryData({\n                        fref: \"ts\"\n                    });\n                };\n            }\n             else {\n                var o = new i(k, l.semantic);\n                if ((o && o.isImplemented())) {\n                    m = o.getURI();\n                };\n            }\n        ;\n            return (m && j.getQualifiedURI(m));\n        },\n        getQualifiedURI: function(k) {\n            var l = new g(k);\n            if (!l.getDomain()) {\n                var m = g(h.www_base);\n                l.setProtocol(m.getProtocol()).setDomain(m.getDomain()).setPort(m.getPort());\n            }\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"BrowseNUXController\", [\"Event\",\"function-extensions\",\"Arbiter\",\"BrowseLogger\",\"BrowseNUXBootstrap\",\"BrowseNUXCheckpoint\",\"BrowseNUXMegaphone\",\"BrowseNUXTourDialog\",\"BrowseNUXTypewriter\",\"CSS\",\"DOM\",\"DOMScroll\",\"FacebarStructuredText\",\"FacebarURI\",\"KeyEventController\",\"LayerSlowlyFadeOnShow\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"Run\",\"SubscriptionsHandler\",\"URI\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"emptyFunction\",\"ge\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"BrowseLogger\"), j = b(\"BrowseNUXBootstrap\"), k = b(\"BrowseNUXCheckpoint\"), l = b(\"BrowseNUXMegaphone\"), m = b(\"BrowseNUXTourDialog\"), n = b(\"BrowseNUXTypewriter\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"DOMScroll\"), r = b(\"FacebarStructuredText\"), s = b(\"FacebarURI\"), t = b(\"KeyEventController\"), u = b(\"LayerSlowlyFadeOnShow\"), v = b(\"ModalMask\"), w = b(\"PageTransitions\"), x = b(\"Parent\"), y = b(\"Run\"), z = b(\"SubscriptionsHandler\"), aa = b(\"URI\"), ba = b(\"Vector\"), ca = b(\"copyProperties\"), da = b(\"csx\"), ea = b(\"cx\"), fa = b(\"emptyFunction\"), ga = b(\"ge\"), ha = b(\"startsWith\"), ia = {\n        init: function(ma) {\n            ca(ia, {\n                bootstrap: j.getFacebarData(),\n                megaphone: new l(ma.megaphone),\n                fragments: ma.fragments,\n                resultURI: ma.resultURI,\n                buttons: ma.buttons,\n                dialogs: ma.dialogs,\n                endDialog: ma.endDialog\n            });\n            k.init(ma.nextStep);\n            h.inform(\"BrowseNUX/initialized\");\n            ia.initMegaphoneHandler();\n        },\n        initMegaphoneHandler: function() {\n            var ma = function() {\n                return (k.getStep() == k.SHOW_MEGAPHONE);\n            };\n            h.subscribe(\"BrowseNUX/story\", function() {\n                if (ma()) {\n                    ia.showStoryMegaphone();\n                    h.inform(\"BrowseNUX/starting\");\n                }\n            ;\n            });\n            h.subscribe(\"BrowseNUX/typeaheadUnit\", function() {\n                if (ma()) {\n                    ia.showViewMegaphone();\n                    h.inform(\"BrowseNUX/starting\");\n                }\n            ;\n            });\n        },\n        startAtNextStep: function() {\n            var ma = w.getNextURI().getPath();\n            switch (k.getStep()) {\n              case k.SHOW_MEGAPHONE:\n                break;\n              case k.RESULTS_VIEW:\n                if (ha(ma, s.getSearchPath())) {\n                    setTimeout(function() {\n                        ia.showEndDialog();\n                        h.inform(\"BrowseNUX/starting\");\n                    }, 2000);\n                }\n                 else i.logNUXStep(\"abandon\");\n            ;\n                break;\n              default:\n                return;\n            };\n            y.onAfterLoad(function() {\n                w.setCompletionCallback(ia.startAtNextStep);\n            });\n        },\n        toggleSponsoredResults: function(ma) {\n            var na = ia.bootstrap, oa = na.typeahead, pa = na.FacebarTypeaheadSponsoredResults;\n            if (pa) {\n                if (ma) {\n                    oa.enableBehavior(pa);\n                }\n                 else oa.disableBehavior(pa);\n            \n            };\n        },\n        showMegaphone: function(ma) {\n            var na = false, oa = ma.subscribe(\"start\", function() {\n                na = true;\n                ma.hide();\n                ia.showSearchBarTour();\n            }), pa = ma.subscribe(\"hide\", function() {\n                na = true;\n                i.logNUXStep(\"hide\");\n            });\n            i.logNUXStep(\"show_megaphone\");\n            ia.prefetchResults();\n            ka(function() {\n                (na || i.logNUXStep(\"ignore\"));\n                oa.unsubscribe();\n                pa.unsubscribe();\n            });\n        },\n        showViewMegaphone: function() {\n            var ma = j.getTypeaheadUnitData();\n            ia.showMegaphone(ma);\n        },\n        showStoryMegaphone: function() {\n            var ma = (ga(\"contentArea\") || ga(\"content\"));\n            if (ma) {\n                var na = ia.megaphone, oa = j.getStoryData();\n                na.setClass(oa.className);\n                na.show(ma);\n                ia.showMegaphone(na);\n            }\n        ;\n        },\n        prefetchResults: function() {\n            var ma = ia.bootstrap.typeahead.getData(), na = ia.fragments;\n            ma.query(r.fromStruct([na.page,]));\n            ma.query(r.fromStruct([na.edge,na.page,]));\n        },\n        showSearchBarTour: function(ma) {\n            var na = ia.dialogs;\n            i.logNUXStep(\"start\");\n            var oa = ia.bootstrap.input, pa = ia.bootstrap.typeahead, qa = la(pa);\n            ia.toggleSponsoredResults(false);\n            t.registerKey(\"BACKSPACE\", fa.thatReturnsFalse);\n            oa.setEnabled(false);\n            v.show();\n            var ra = new m(na.search, pa), sa = new n(oa), ta = ia.fragments.page, ua = ta.text.toLowerCase(), va = function() {\n                ra.showWithContext(oa.getRoot(), 0);\n            }, wa = function() {\n                oa.focus();\n                sa.setValue(ua, function() {\n                    setTimeout(function() {\n                        oa.setStructure([ta,]);\n                        oa.moveSelectionToEnd();\n                        ja(pa, function() {\n                            ra.showButton();\n                        });\n                    }, 1000);\n                });\n            };\n            setTimeout(va, 0);\n            setTimeout(wa, 2000);\n            var xa = new m(na.phrase, pa), ya = ia.fragments.edge;\n            na.phrase.setOffsetY(-10);\n            ra.setNextHandler(function() {\n                i.logNUXStep(\"phrase\");\n                sa.prependFragment(ya, function() {\n                    ja(pa, function() {\n                        var ab = pa.getView().getItems()[0];\n                        if (ab) {\n                            var bb = p.find(ab, \"span.-cx-PUBLIC-fbFacebarTypeaheadItem__label\");\n                            xa.showWithContext(bb, 1);\n                        }\n                         else xa.showWithContext(oa.getRoot(), 0);\n                    ;\n                        setTimeout(xa.showButton.bind(xa), 2000);\n                    });\n                });\n            });\n            xa.setNextHandler(function() {\n                i.logNUXStep(\"personalized\");\n                k.setStep(k.RESULTS_VIEW, function() {\n                    qa.release();\n                    w.go(aa(ia.resultURI).addQueryData({\n                        view: \"list\"\n                    }));\n                });\n            });\n            o.addClass(document.body, \"-cx-PUBLIC-fbBrowseNUX__shown\");\n            function za() {\n                ia.toggleSponsoredResults(true);\n                sa.abort();\n                qa.release();\n                ra.reset();\n                xa.reset();\n                v.hide();\n                oa.setEnabled(true);\n                o.removeClass(document.body, \"-cx-PUBLIC-fbBrowseNUX__shown\");\n            };\n            if (ma) {\n                ra.activateCloseButton(za);\n                xa.activateCloseButton(za);\n            }\n        ;\n            ka(za);\n        },\n        showEndDialog: function() {\n            var ma = ia.bootstrap.input, na = ia.bootstrap.typeahead, oa = ia.endDialog;\n            oa.enableBehavior(u);\n            oa.show();\n            i.logNUXStep(\"end_dialog\");\n            k.setFinished();\n            h.inform(\"BrowseNUX/finished\");\n            var pa = function(sa) {\n                ma.setStructure([]);\n                ma.togglePlaceholder();\n                ma.focus();\n                if (o.hasClass(document.documentElement, \"tinyViewport\")) {\n                    var ta = new ba(0, 0, \"document\");\n                    q.scrollTo(ta, true, false, false, sa);\n                }\n                 else if (sa) {\n                    sa();\n                }\n            ;\n            }, qa = oa.subscribe(\"button\", function(sa, ta) {\n                oa.hide();\n                switch (ta.getAttribute(\"data-action\")) {\n                  case \"replay\":\n                    ia.showSearchBarTour(true);\n                    i.logNUXStep(\"replay\");\n                    break;\n                  case \"search\":\n                    pa();\n                    i.logNUXStep(\"search\");\n                    break;\n                  case \"cancel\":\n                    i.logNUXStep(\"cancel\");\n                    break;\n                };\n            }), ra = g.listen(oa.getRoot(), \"click\", function(event) {\n                var sa = event.getTarget();\n                if (sa) {\n                    var ta;\n                    if (sa.getAttribute(\"data-action\")) {\n                        ta = sa.getAttribute(\"data-action\");\n                    }\n                     else ta = sa.parentNode.getAttribute(\"data-action\");\n                ;\n                    if (ta) {\n                        i.logNUXStep(ta);\n                    };\n                }\n            ;\n                var ua = x.byClass(sa, \"-cx-PRIVATE-fbBrowseNUX__dialogsample\");\n                if ((!ua || event.isDefaultRequested())) {\n                    return\n                };\n                oa.hide();\n                pa(function() {\n                    var va = (ua.getAttribute(\"data-query\") + \" \"), wa = new n(ma), xa = la(na);\n                    setTimeout(function() {\n                        wa.setValue(va, function() {\n                            ja(na, function() {\n                                xa.release();\n                                w.go(ua.getAttribute(\"href\"));\n                            });\n                        });\n                    }, 1000);\n                });\n                return false;\n            });\n            ka(function() {\n                ra.remove();\n                qa.unsubscribe();\n            });\n        }\n    };\n    function ja(ma, na) {\n        var oa = new h();\n        oa.registerCallback(na, [\"timeout\",\"render\",]);\n        setTimeout(oa.inform.bind(oa, \"timeout\"), 2000);\n        var pa = setTimeout(ra, 6000), qa = ma.subscribe(\"render\", ra);\n        function ra() {\n            qa.unsubscribe();\n            clearTimeout(pa);\n            oa.inform(\"render\");\n        };\n        ka(qa.unsubscribe.bind(qa));\n    };\n    function ka(ma) {\n        w.registerHandler(ma, 10);\n    };\n    function la(ma) {\n        var na = new z(\"FacebarTypeaheadLock\");\n        na.addSubscriptions(g.listen(ia.bootstrap.input.getRichInput(), \"keydown\", fa.thatReturnsFalse), ma.getCore().subscribe(\"close\", fa.thatReturnsFalse), ma.getView().subscribe([\"beforeHighlight\",\"beforeSelect\",], fa.thatReturnsFalse));\n        return na;\n    };\n    e.exports = ia;\n});\n__d(\"FacebarResultStore\", [\"copyProperties\",\"concatMap\",\"FacebarResultStoreUtils\",\"TokenizeUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"concatMap\"), i = b(\"FacebarResultStoreUtils\"), j = b(\"TokenizeUtil\"), k = \"unimplemented\";\n    function l(m, n, o, p) {\n        this.facebarConfig = m;\n        this.facebarConfig.grammar_stop_words_penalty = (this.facebarConfig.grammar_stop_words_penalty || 2);\n        this.facebarConfig.grammar_stop_words = (this.facebarConfig.grammar_stop_words || {\n        });\n        this.facebarConfig.options = p;\n        this.tokenize = n;\n        this.getEntry = o;\n        this.typeaheadTypeMap = this.facebarConfig.mapped_types;\n        this.facebarConfig.typeahead_types.forEach(function(q) {\n            this.typeaheadTypeMap[q] = q;\n        }.bind(this));\n        this.resetCaches();\n        this.cacheEnabled(true);\n    };\n    l.prototype.transformStructured = function(m) {\n        var n = [], o = [], p = \"\", q = \"\";\n        m.forEach(function(t, u) {\n            if (t.isType(\"text\")) {\n                p += t.getText();\n                q = (((q == null)) ? null : (q + t.getText()));\n            }\n             else {\n                var v = p.match(/\\\"/g);\n                if ((v && (v.length % 2))) {\n                    p = (p.replace(/\\s+$/, \"\") + \"\\\"\");\n                };\n                if (p.length) {\n                    Array.prototype.push.apply(n, this.tokenize(p));\n                    o.push(p);\n                    p = \"\";\n                }\n            ;\n                n.push(t.toStruct());\n                o.push({\n                    uid: String(t.getUID()),\n                    type: this._getFBObjectType(t.getTypePart(1)),\n                    text: t.getText()\n                });\n                q = null;\n            }\n        ;\n        }.bind(this));\n        if (p.length) {\n            if ((p[(p.length - 1)] == \"'\")) {\n                p = p.substr(0, (p.length - 1));\n            };\n            Array.prototype.push.apply(n, this.tokenize(p));\n            o.push(p);\n            if ((p[(p.length - 1)] == \" \")) {\n                n.push(\"\");\n            };\n        }\n    ;\n        var r = JSON.stringify(o), s = r.replace(/\\]$/, \"\").replace(/\\\"$/, \"\");\n        s = s.replace(/\\s{2,}/g, \" \");\n        return {\n            tokens: n,\n            text_form: r,\n            is_empty: !!r.match(/^\\[(\\\"\\s*\\\")?\\]$/),\n            raw_text: q,\n            cache_id: s\n        };\n    };\n    l.prototype.resetCaches = function() {\n        this.bootstrapCache = {\n        };\n        this.queryCache = {\n            \"\": {\n                tokens: [],\n                results: []\n            }\n        };\n    };\n    l.prototype.setNullState = function(m) {\n        this.facebarConfig.null_state = m.map(this._extractStructure.bind(this));\n    };\n    l.prototype.addEntryToNullState = function(m) {\n        if (this.facebarConfig.null_state) {\n            var n = (this.facebarConfig.entity_cost + m.grammar_costs[((\"{\" + m.type) + \"}\")]), o = i.processEntityResult(m.type, m.uid, m.text, n);\n            this.facebarConfig.null_state.unshift(o);\n        }\n    ;\n    };\n    l.prototype.setSortFunction = function(m) {\n        this._sortFunction = m;\n    };\n    l.prototype.addBootstrap = function(m) {\n        var n = this.bootstrapCache;\n        m.forEach(function(o) {\n            var p = this.getEntry(o);\n            p.bootstrapped = true;\n            var q = this.tokenize(p.textToIndex, true);\n            if (p.tokens) {\n                Array.prototype.push.apply(q, p.tokens.split(\" \"));\n            };\n            q.forEach(function(r) {\n                if (!n.hasOwnProperty(r)) {\n                    n[r] = {\n                    };\n                };\n                n[r][o] = true;\n            });\n        }, this);\n    };\n    l.prototype.addNullStateToQueryCache = function(m) {\n        this.saveResults(this.facebarConfig.null_state, m, true);\n    };\n    l.prototype.getResults = function(m) {\n        if (((m.tokens.length === 0) || (((m.tokens.length == 1) && (m.tokens[0] === \"\"))))) {\n            return {\n                results: (this.facebarConfig.null_state || []),\n                null_state: true\n            }\n        };\n        var n = this._getBestQueryCache(m.cache_id), o = n.results, p = {\n        }, q = this._getBootstrapMatchByType(m.tokens, p), r = this._addMatchingBootstrapResults(m.tokens, (q[0] || {\n        }));\n        Array.prototype.push.apply(r, h(this._getResultsFromCache.bind(this, q, m.tokens), o));\n        var s = {\n        }, t = [], u = false, v = 0;\n        r.sort(this._sortFunction).forEach(function(w) {\n            w.semantic = w.semantic.toLowerCase();\n            if (!w.termMatches) {\n                w.termMatches = p[parseInt(w.semantic, 10)];\n            };\n            var x = l.getUniqueSemantic(w.semantic);\n            if (!x) {\n                return\n            };\n            if (s[x]) {\n                if (w.isJSBootstrapMatch) {\n                    s[x].isJSBootstrapMatch = true;\n                    s[x].bootstrapCost = w.bootstrapCost;\n                }\n                 else if (((s[x].isJSBootstrapMatch && (w.backendCost !== undefined)) && (s[x].backendCost === undefined))) {\n                    s[x].backendCost = w.backendCost;\n                }\n            ;\n                if (!!w.tags) {\n                    s[x].tags = w.tags;\n                };\n                return;\n            }\n        ;\n            if ((u && w.blankFilled)) {\n                return\n            };\n            if ((w.type.indexOf(\"browse_type\") >= 0)) {\n                v += 1;\n                if (((this.facebarConfig.maxGrammarResults !== undefined) && (v > this.facebarConfig.maxGrammarResults))) {\n                    return\n                };\n            }\n        ;\n            u = (u || !!w.blankFilled);\n            s[x] = w;\n            t.push(w);\n        }.bind(this));\n        return {\n            results: t,\n            webSuggOnTop: n.webSuggOnTop,\n            webSuggLimit: n.webSuggLimit,\n            webSuggLimitSeeMore: n.webSuggLimitSeeMore\n        };\n    };\n    l.prototype.cacheEnabled = function(m) {\n        this._enableCache = m;\n    };\n    l.prototype.saveResults = function(m, n, o, p) {\n        m = m.map(this._processBackendResult.bind(this));\n        var q = [];\n        if (this._enableCache) {\n            var r = {\n            }, s = {\n            };\n            m.forEach(function(u) {\n                s[u.semantic] = true;\n                ((u.parse && u.parse.disambiguation) && u.parse.disambiguation.forEach(function(v) {\n                    r[v] = true;\n                }));\n            });\n            var t = this._getBestQueryCache(n.cache_id);\n            t.results.forEach(function(u) {\n                if ((u.type === \"websuggestion\")) {\n                    return\n                };\n                if ((u.semanticForest in r)) {\n                    return\n                };\n                var v = this._getDifferenceArrayTokens(u.tokens, n.tokens), w = this._getNumTokensMatching(v, u);\n                w = this._tryMatchingFinalInsertedEntity(v, w, u);\n                if (((w > 0) && (w == v.length))) {\n                    u.cacheOnlyResult = !s[u.semantic];\n                    q.push(u);\n                }\n            ;\n            }.bind(this));\n        }\n    ;\n        m.forEach(function(u) {\n            u.tokens = n.tokens;\n            u.cache_id_length = n.cache_id.length;\n            q.push(u);\n        });\n        if ((this.queryCache[n.cache_id] === undefined)) {\n            this.queryCache[n.cache_id] = {\n            };\n        };\n        g(this.queryCache[n.cache_id], {\n            tokens: n.tokens,\n            results: q,\n            incomplete: o\n        });\n        g(this.queryCache[n.cache_id], p);\n    };\n    l.prototype.alreadyKnown = function(m) {\n        return (!!this.queryCache[m] && !this.queryCache[m].incomplete);\n    };\n    l.prototype.stripBrackets = function(m) {\n        return m.replace(/^[\\[\\{]/, \"\").replace(/[\\]\\}]$/, \"\");\n    };\n    l.prototype._extractStructure = function(m) {\n        function n(q, r, s) {\n            return {\n                type: q,\n                text: r,\n                uid: (s || null)\n            };\n        };\n        function o(q, r) {\n            q.split(\" \").forEach(function(s) {\n                if ((s !== \"\")) {\n                    if (r) {\n                        m.chunks.push(m.structure.length);\n                    };\n                    m.structure.push(n(\"text\", s));\n                }\n            ;\n                m.structure.push(n(\"text\", \" \"));\n            });\n            m.structure.pop();\n        };\n        function p(q) {\n            var r = ((((m.structure.length === 0) && (m.type != \"websuggestion\"))) ? (q.charAt(0).toUpperCase() + q.substr(1)) : q);\n            return r;\n        };\n        m.structure = [];\n        m.chunks = [];\n        m.parse.display.forEach(function(q) {\n            if ((typeof q === \"string\")) {\n                o(p(q), true);\n            }\n             else if (q.uid) {\n                var r = this.getEntry(q.uid, q.fetchType);\n                m.chunks.push(m.structure.length);\n                if (r.grammar_like) {\n                    o(p(r.text), false);\n                }\n                 else {\n                    var s = q.type;\n                    if (q.fetchType) {\n                        s += (\":\" + q.fetchType);\n                    };\n                    m.structure.push(n(s, r.text, q.uid));\n                }\n            ;\n            }\n             else {\n                m.chunks.push(m.structure.length);\n                m.blankType = q.type.replace(/^blank:/, \"\");\n                m.structure.push(n(q.type, \"\"));\n            }\n            \n        ;\n        }.bind(this));\n        return m;\n    };\n    l.prototype._getDifferenceArrayTokens = function(m, n) {\n        if (!m.length) {\n            return [\"\",].concat(n)\n        };\n        var o = (m.length - 1), p = m[o];\n        if ((p === \"\")) {\n            p = m[--o];\n        };\n        return [((typeof (p) == \"string\") ? n[o].substr(p.length) : \"\"),].concat(n.slice((o + 1)));\n    };\n    l.prototype._processBackendResult = function(m) {\n        m.semantic = m.semantic.toString();\n        m.backendCost = m.cost;\n        this._extractStructure(m);\n        if (m.type.match(/^\\{.*\\}$/)) {\n            m.useExtendedIndex = true;\n        };\n        if (m.semantic.match(/\\[.*\\]/)) {\n            var n = m.parse, o = n.pos;\n            if ((o === undefined)) {\n                m.semantic = m.semantic.replace(/\\[(.*)\\]/g, \"$1\");\n            }\n             else {\n                var p = n.remTokens[(n.remTokens.length - 1)];\n                if ((n.remTokens.length && m.structure[m.chunks[p]].uid)) {\n                    o = n.remTokens[(n.remTokens.length - 1)];\n                    m.completed = true;\n                }\n            ;\n                var q = m.structure[m.chunks[o]].uid;\n                if ((q === null)) {\n                    m.semantic = m.semantic.replace(/\\[(\\d*)\\]/g, \"$1\");\n                }\n                 else {\n                    var r = new RegExp(((\"\\\\[\" + q) + \"\\\\]\"), \"g\");\n                    m.unsubstituted_semantic = m.semantic;\n                    m.semantic = m.semantic.replace(r, q);\n                    if (((n && n.disambiguation) && (n.disambiguation.length > 0))) {\n                        n.disambiguation = n.disambiguation.filter(function(s) {\n                            return (s.indexOf(((\"[\" + q) + \"]\")) !== -1);\n                        });\n                        n.unsubstituted_disambiguation = n.disambiguation.splice(0);\n                        n.disambiguation = n.disambiguation.map(function(s) {\n                            return s.replace(r, q);\n                        });\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        }\n    ;\n        m.semantic = m.semantic.replace(/\\[(.*)\\]/g, \"$1\");\n        m.tuid = JSON.stringify({\n            semantic: m.semantic,\n            structure: m.structure\n        });\n        return m;\n    };\n    l.prototype._sortFunction = function(m, n) {\n        return (((m.cost || 0)) - ((n.cost || 0)));\n    };\n    l.prototype._getResultsFromCache = function(m, n, o) {\n        var p = this._getDifferenceArrayTokens(o.tokens, n), q = [], r = this._getNumTokensMatching(p, o), s = this._tryMatchingFinalInsertedEntity(p, r, o);\n        if (((s > 0) && (s == p.length))) {\n            q.push(o);\n        };\n        o.bolding = this._computeBolding(o, p, 0);\n        Array.prototype.push.apply(q, this._trySubstitutingBootstrapResult(m[(n.length - p.length)], o, p));\n        if ((r <= 0)) {\n            return q\n        };\n        var t = p.slice(r);\n        r += (n.length - p.length);\n        var u = {\n        };\n        if ((r == n.length)) {\n            --r;\n            if ((r < 0)) {\n                return q\n            };\n            if ((n[r] !== \"\")) {\n                u = this._computeBolding(o, p, 1);\n            };\n        }\n    ;\n        if (((r == (n.length - 1)) && (n[r] === \"\"))) {\n            --r;\n            if ((r < 0)) {\n                return q\n            };\n            u = this._computeBolding(o, p, 1);\n        }\n    ;\n        var v = function(w, x) {\n            x.bolding = w;\n            return x;\n        }.bind(null, u);\n        Array.prototype.push.apply(q, this._tryMatchingFinalBootstrapResult(m[r], t, o).map(v));\n        return q;\n    };\n    l.prototype._addMatchingBootstrapResults = function(m, n) {\n        return h(function(o) {\n            var p = n[o];\n            if ((p === undefined)) {\n                return []\n            };\n            var q = [];\n            p.forEach(function(r) {\n                var s = this.getEntry(r, o);\n                if (!this._isTitleTermMatch(m, s)) {\n                    return\n                };\n                var t = (this._isExactNameMatch(m, s) ? 0 : this.facebarConfig.non_title_term_match_penalty), u = this._isNonGrammarTermMatch(m, s), v = (((s.grammar_costs[((\"{\" + o) + \"}\")] + t) + this.facebarConfig.entity_cost) + (this.facebarConfig.grammar_stop_words_penalty * !u)), w = i.processEntityResult(o, r, s.text, v);\n                w.bootstrapCost = v;\n                w.isJSBootstrapMatch = true;\n                q.push(w);\n            }.bind(this));\n            return q;\n        }.bind(this), this.facebarConfig.bootstrap_types);\n    };\n    l.prototype._isTitleTermMatch = function(m, n) {\n        var o = (m[0] || {\n        });\n        if ((typeof (o) == \"object\")) {\n            return false\n        };\n        var p = n.titleToIndex;\n        return ((m.length === 1) ? j.isPrefixMatch(o, p) : j.isExactMatch(o, p));\n    };\n    l.prototype._isExactNameMatch = function(m, n) {\n        var o = (m[0] || {\n        });\n        if ((typeof (o) == \"object\")) {\n            return 0\n        };\n        var p = n.text;\n        if (((m.length === 1) ? j.isPrefixMatch(o, p) : j.isExactMatch(o, p))) {\n            return true\n        };\n        return (((m.length == 1) && (n.alias !== undefined)) && j.isExactMatch(o, n.alias));\n    };\n    l.prototype._isNonGrammarTermMatch = function(m, n) {\n        var o = j.parse(n.titleToIndex.toLowerCase()), p = o.tokens.filter(function(s) {\n            return ((s !== \"\") && !this.facebarConfig.grammar_stop_words[s]);\n        }.bind(this));\n        p = p.join(\" \");\n        for (var q = 0; (q < m.length); ++q) {\n            if ((typeof (m[q]) == \"object\")) {\n                return true\n            };\n            var r = ((q === (m.length - 1)) ? j.isPrefixMatch(m[q], p) : j.isQueryMatch(m[q], p));\n            if (r) {\n                return true\n            };\n        };\n        return false;\n    };\n    l.prototype._getBootstrapMatchByType = function(m, n) {\n        if ((m.length === 0)) {\n            return []\n        };\n        var o = m.map(function() {\n            return {\n            };\n        }), p = ((m[(m.length - 1)] === \"\")), q = {\n        }, r, s = ((p ? (m.length - 1) : m.length));\n        if ((s && m[(s - 1)].uid)) {\n            this._pushBootstrapEntryAtPosition(o, (s - 1), m[(s - 1)].uid);\n            return o;\n        }\n    ;\n        for (var t in this.bootstrapCache) {\n            if (((s && (t.indexOf(m[(s - 1)]) === 0)) && ((!p || (t === m[(s - 1)]))))) {\n                for (r in this.bootstrapCache[t]) {\n                    if (!q[r]) {\n                        q[r] = 1;\n                        this._addMatchedTerm(r, t, n);\n                        this._pushBootstrapEntryAtPosition(o, (s - 1), r);\n                    }\n                ;\n                }\n            };\n        };\n        for (var u = (s - 2); (u >= 0); u--) {\n            if ((typeof (m[u]) == \"object\")) {\n                break;\n            };\n            if ((m[u].length && (m[u][0] == \"\\\"\"))) {\n                break;\n            };\n            for (r in this.bootstrapCache[m[u]]) {\n                if (!q[r]) {\n                    q[r] = 0;\n                };\n                if (((q[r] + u) == (s - 1))) {\n                    ++q[r];\n                    this._addMatchedTerm(r, m[u], n);\n                    this._pushBootstrapEntryAtPosition(o, u, r);\n                }\n            ;\n            };\n        };\n        return o;\n    };\n    l.prototype._addMatchedTerm = function(m, n, o) {\n        (o[m] = (o[m] || [])).push(n);\n        return o;\n    };\n    l.prototype._pushBootstrapEntryAtPosition = function(m, n, o) {\n        var p = this.getEntry(o);\n        if (!p) {\n            return\n        };\n        for (var q in p.grammar_costs) {\n            var r = this.stripBrackets(q);\n            if ((m[n][r] === undefined)) {\n                m[n][r] = [];\n            };\n            m[n][r].push(o);\n        };\n    };\n    l.prototype._getNumTokensMatching = function(m, n) {\n        var o = 0, p = n.parse, q = m.length, r = null, s = null;\n        if ((p.pos !== undefined)) {\n            var t = n.structure[n.chunks[p.pos]];\n            r = t.uid;\n            s = t.type.split(\":\")[2];\n        }\n    ;\n        n.outputTokensUsed = [];\n        n.termMatches = [];\n        if (r) {\n            o = this._prefixMatchEntity(m, p, r, n.outputTokensUsed, s, !!n.useExtendedIndex, n.termMatches);\n            if (((o === 0) || (o === q))) {\n                return o\n            };\n        }\n         else if (((p.suffix && (q == 1)) && (p.suffix.indexOf(m[0]) === 0))) {\n            return q;\n        }\n         else if ((p.suffix == m[0])) {\n            ++o;\n        }\n         else return 0\n        \n        \n    ;\n        var u = [];\n        for (var v = 0; (v < p.remTokens.length); v++) {\n            if ((((typeof (m[o]) != \"string\") || (n.chunks.length < p.remTokens[v])) || n.structure[n.chunks[p.remTokens[v]]].uid)) {\n                break;\n            };\n            var w = n.structure[n.chunks[p.remTokens[v]]].text;\n            u.push(w.toLowerCase());\n        };\n        o = this._greedyMatchText(u, m, o, p.remTokens, n.outputTokensUsed);\n        if (((o == (q - 1)) && (m[o] === \"\"))) {\n            return q\n        };\n        return o;\n    };\n    l.prototype._prefixMatchEntity = function(m, n, o, p, q, r, s) {\n        if ((n.entTokens.length === 0)) {\n            if ((m[0] !== \"\")) {\n                return 0\n            };\n            if (((n.possessive && (m.length > 1)) && (m[1] == \"'s\"))) {\n                p.push([(n.pos + 1),]);\n                return 2;\n            }\n             else return 1\n        ;\n        }\n    ;\n        var t = false, u = this.getEntry(o, q);\n        if (((typeof (q) !== \"undefined\") && (q !== u.fetchType))) {\n            return 0\n        };\n        var v = this.tokenize((r ? u.textToIndex : u.text), true), w = [];\n        for (var x = 0; (x < ((m.length + n.entTokens.length) - 1)); x++) {\n            if ((x < (n.entTokens.length - 1))) {\n                w.push(n.entTokens[x]);\n            }\n             else if ((x == (n.entTokens.length - 1))) {\n                w.push((n.entTokens[x] + m[0]));\n            }\n             else w.push(m[((x - n.entTokens.length) + 1)]);\n            \n        ;\n        };\n        var y = (-n.entTokens.length + 1);\n        for (var z = 0; (z < w.length); ++z) {\n            var aa = w[z];\n            if ((typeof (aa) != \"string\")) {\n                break;\n            };\n            if ((aa === \"\")) {\n                y++;\n                continue;\n            }\n        ;\n            var ba = false;\n            for (var ca = 0; (ca < v.length); ca++) {\n                if (((v[ca] == aa) || (((z === (w.length - 1)) && (v[ca].indexOf(aa) === 0))))) {\n                    if (s) {\n                        s.push(v[ca]);\n                    };\n                    v[ca] = \"\";\n                    ba = true;\n                    ++y;\n                    break;\n                }\n            ;\n            };\n            if (ba) {\n                continue;\n            };\n            if (((!n.possessive || (aa.length <= 2)) || (aa.substr((aa.length - 2)) != \"'s\"))) {\n                break;\n            };\n            var da = aa.substr(0, (aa.length - 2));\n            for (ca = 0; (ca < v.length); ca++) {\n                if ((v[ca] == da)) {\n                    ++y;\n                    if (p) {\n                        t = true;\n                    };\n                    break;\n                }\n            ;\n            };\n            break;\n        };\n        if ((y > 0)) {\n            if (t) {\n                p.push([(n.pos + 1),]);\n            };\n            return y;\n        }\n    ;\n        if ((p === undefined)) {\n            return 0\n        };\n        var ea = m[0], fa = ea;\n        if (((n.possessive && (ea.length >= 2)) && (ea.substr((ea.length - 2)) == \"'s\"))) {\n            fa = ea.substr(0, (ea.length - 2));\n        };\n        if ((((((m.length == 1) && (n.suffix.indexOf(ea) === 0))) || (n.suffix == fa)) || (n.suffix == ea))) {\n            if (((fa != ea) && (n.suffix == fa))) {\n                p.push([(n.pos + 1),]);\n            };\n            return 1;\n        }\n    ;\n        return 0;\n    };\n    l.prototype._tryMatchingFinalInsertedEntity = function(m, n, o) {\n        if ((!o.completed || (n < 0))) {\n            return n\n        };\n        var p = o.parse, q = p.remTokens[(p.remTokens.length - 1)], r = o.structure[o.chunks[q]], s = this.getEntry(r.uid, r.type), t = this.tokenize(s.text, true);\n        n = this._greedyMatchText(t, m, n);\n        if (((n == (m.length - 1)) && (m[n] === \"\"))) {\n            return m.length\n        };\n        return n;\n    };\n    l.prototype._greedyMatchText = function(m, n, o, p, q) {\n        for (var r = 0; (r < m.length); r++) {\n            var s = m[r];\n            if ((s == n[o])) {\n                if ((q !== undefined)) {\n                    q.push(p[r]);\n                };\n                ++o;\n                continue;\n            }\n        ;\n            if (((o === (n.length - 1)) && (s.indexOf(n[o]) === 0))) {\n                if ((q !== undefined)) {\n                    if ((s == n[o])) {\n                        q.push([p[r],]);\n                    }\n                     else q.push([p[r],n[o].length,]);\n                \n                };\n                return n.length;\n            }\n        ;\n        };\n        return o;\n    };\n    l.prototype._createMapOverFinalBootstrapUids = function(m, n, o, p, q, r) {\n        return function(s) {\n            var t = this.getEntry(s, q);\n            if (((t === undefined) || (r(s, t) === false))) {\n                return\n            };\n            var u = {\n            };\n            g(u, m);\n            if (!u.iconClass) {\n                u.photo = t.photo;\n            };\n            u.cost = (((m.cost + l.EPSILON) + t.grammar_costs[((\"{\" + q) + \"}\")]) - o.grammar_costs[((\"{\" + q) + \"}\")]);\n            u.cache_id_length = Infinity;\n            u.structure = m.structure.slice(0);\n            u.structure[m.chunks[p]] = {\n                type: n.type,\n                text: t.text,\n                uid: s\n            };\n            u.blankFilled = true;\n            var v = new RegExp(((\"\\\\[\" + n.uid) + \"\\\\]\"), \"g\");\n            u.semantic = m.unsubstituted_semantic.replace(v, s);\n            if (((u.parse && u.parse.disambiguation) && (u.parse.disambiguation.length > 0))) {\n                u.parse.disambiguation = u.parse.unsubstituted_disambiguation.map(function(w) {\n                    return w.replace(v, s);\n                });\n            };\n            u.tuid = JSON.stringify({\n                semantic: u.semantic,\n                structure: u.structure\n            });\n            return u;\n        }.bind(this);\n    };\n    l.prototype._tryMatchingFinalBootstrapResult = function(m, n, o) {\n        if (!o.completed) {\n            return []\n        };\n        var p = o.parse, q = p.remTokens[(p.remTokens.length - 1)], r = o.structure[o.chunks[q]], s = r.type.substr(4).replace(\":blank\", \"\"), t = this.getEntry(r.uid, s), u = m[s];\n        if ((((u === undefined) || (t === undefined)) || (t.grammar_costs === undefined))) {\n            return []\n        };\n        return u.map(this._createMapOverFinalBootstrapUids(o, r, t, q, s, function(v, w) {\n            return (n.length == this._greedyMatchText(this.tokenize(w.text), n, 0));\n        }.bind(this))).filter(function(v) {\n            return !!v;\n        });\n    };\n    l.prototype._trySubstitutingBootstrapResult = function(m, n, o) {\n        if ((((n.unsubstituted_semantic === undefined) || n.completed) || (n.type === k))) {\n            return []\n        };\n        var p = n.parse.pos, q = n.structure[n.chunks[n.parse.pos]], r = q.type.substr(4), s = m[r];\n        if ((s === undefined)) {\n            return []\n        };\n        var t = this.getEntry(q.uid);\n        if ((!t || (t.grammar_costs === undefined))) {\n            return []\n        };\n        return s.map(this._createMapOverFinalBootstrapUids(n, q, t, p, r, function(u) {\n            return (this._prefixMatchEntity(o, n.parse, u) === o.length);\n        }.bind(this))).filter(function(u) {\n            return !!u;\n        });\n    };\n    l.prototype._computeBolding = function(m, n, o) {\n        var p = {\n        };\n        if ((m.parse.pos !== undefined)) {\n            var q = m.structure[m.chunks[m.parse.pos]];\n            if (!q.uid) {\n                p[m.chunks[m.parse.pos]] = ((q.text.length - m.parse.suffix.length) + n[0].length);\n            };\n        }\n    ;\n        m.parse.unmatch.forEach(function(t) {\n            if ((typeof (t) == \"object\")) {\n                p[m.chunks[t[0]]] = (m.structure[m.chunks[t[0]]].text.length - t[1].length);\n            }\n             else p[m.chunks[t]] = 0;\n        ;\n        });\n        m.parse.remTokens.forEach(function(t) {\n            p[m.chunks[t]] = 0;\n        });\n        for (var r = 0; (r < (m.outputTokensUsed.length - o)); r++) {\n            var s = m.outputTokensUsed[r];\n            if ((s.length == 1)) {\n                delete p[m.chunks[s[0]]];\n            }\n             else p[m.chunks[s[0]]] = s[1];\n        ;\n        };\n        return p;\n    };\n    l.prototype._getBestQueryCache = function(m) {\n        for (var n = m.length; (n >= 0); n--) {\n            var o = this.queryCache[m.slice(0, n)];\n            if (o) {\n                return o\n            };\n        };\n    };\n    l.prototype._getFBObjectType = function(m) {\n        if (this.typeaheadTypeMap[m]) {\n            return this.typeaheadTypeMap[m];\n        }\n         else return \"page\"\n    ;\n    };\n    l.EPSILON = 0.00001;\n    l.getUniqueSemantic = function(m) {\n        var n = [], o = [], p = [];\n        m = ((\"(\" + m) + \")\");\n        var q = m, r = false;\n        m.replace(/[\\(\\),]/g, function(s, t) {\n            var u;\n            switch (s) {\n              case \",\":\n                var v = (p.length - 1);\n                u = q.substr(p[v], (t - p[v]));\n                n[v].push(u);\n                p[v] = (t + 1);\n                break;\n              case \"(\":\n                p.push((t + 1));\n                n.push([]);\n                o.push((t + 1));\n                break;\n              case \")\":\n                if ((p.length === 0)) {\n                    throw (m + \" is not a valid semantic string\")\n                };\n                var w = p.pop();\n                u = q.substr(w, (t - w));\n                var x = n.pop();\n                x.push(u);\n                var y = x.sort();\n                for (var z = 1; (z < y.length); z++) {\n                    if ((y[z] == y[(z - 1)])) {\n                        r = true;\n                    };\n                };\n                var aa = y.join(\",\");\n                q = ((q.substr(0, o.pop()) + aa) + q.substr(t));\n                break;\n            };\n            return s;\n        });\n        if (r) {\n            return \"\"\n        };\n        return q.replace(/\\((.*)\\)/, \"$1\");\n    };\n    e.exports = l;\n});\n__d(\"FacebarTokenizer\", [\"TokenizeUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"TokenizeUtil\"), h = \"[^\\\"]\", i = [\"\\\\s's\",\"'s\",((\"\\\"\" + h) + \"*\\\"?\"),], j = [[/\\s+$/,\"\",],[/\\\"\\s+/,\"\\\"\",],[/\\s+\\\"/,\"\\\"\",],[/\\\"\\\"/,\"\",],[/^\\\"$/,\"\",],[/\\s+/,\" \",],], k = {\n        tokenize: function(l, m) {\n            var n = [], o = 0;\n            l = l.replace(/\\s/g, \" \").toLowerCase();\n            l.replace(new RegExp(i.join(\"|\"), \"g\"), function(q, r) {\n                if ((r > o)) {\n                    var s = l.substr(o, (r - o));\n                    Array.prototype.push.apply(n, g.parse(s).tokens.slice(0));\n                }\n            ;\n                var t = q;\n                for (var u = 0; (u < j.length); u++) {\n                    var v = j[u];\n                    t = t.replace(v[0], v[1]);\n                };\n                if ((n.length && (t == \"'s\"))) {\n                    n[(n.length - 1)] += t;\n                }\n                 else if ((t !== \"\")) {\n                    n.push(t);\n                }\n            ;\n                if (m) {\n                    Array.prototype.push.apply(n, g.parse(q).tokens);\n                };\n                o = (r + q.length);\n            });\n            if ((o < l.length)) {\n                var p = l.substr(o, (l.length - o));\n                Array.prototype.push.apply(n, g.parse(p).tokens.slice(0));\n            }\n        ;\n            return n;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ResultsBucketizer\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        this.$ResultsBucketizer0 = h;\n        this.$ResultsBucketizer1 = i;\n    };\n    g.trimResults = function(h, i, j) {\n        var k = [];\n        h.forEach(function(l, m) {\n            if ((l.indexBeforeBuckets > i)) {\n                k.push({\n                    index: m,\n                    originalIndex: l.indexBeforeBuckets\n                });\n            };\n        });\n        k.sort(function(l, m) {\n            return (l.originalIndex - m.originalIndex);\n        }).slice(j).sort(function(l, m) {\n            return (m.index - l.index);\n        }).forEach(function(l) {\n            h.splice(l.index, 1);\n        });\n    };\n    g.mergeBuckets = function(h, i) {\n        var j = [];\n        for (var k in i) {\n            if (!i[k].rule.hidden) {\n                j.push(i[k]);\n            };\n        };\n        j.sort(function(l, m) {\n            var n = (((l.rule.position || 0)) - ((m.rule.position || 0)));\n            if ((n !== 0)) {\n                return n\n            };\n            return (l.results[0].indexBeforeBuckets - m.results[0].indexBeforeBuckets);\n        });\n        h.length = 0;\n        j.forEach(function(l, m) {\n            if (((l.rule.maxPromotions !== undefined) && (m < (j.length - 1)))) {\n                g.trimResults(l.results, j[(m + 1)].results[0].indexBeforeBuckets, l.rule.maxPromotions);\n            };\n            Array.prototype.push.apply(h, l.results);\n        }.bind(this));\n    };\n    g.prototype.$ResultsBucketizer2 = function(h, i) {\n        if ((i.propertyName === undefined)) {\n            return (i.bucketName || \"default\")\n        };\n        var j = this.$ResultsBucketizer1(h, i.propertyName);\n        if (((j === undefined) || (((i.propertyValue !== undefined) && (j.toString() !== i.propertyValue))))) {\n            return false\n        };\n        return (i.bucketName || (((i.propertyName + \".\") + j.toString())));\n    };\n    g.prototype.$ResultsBucketizer3 = function(h, i) {\n        var j = {\n        }, k = this.$ResultsBucketizer2.bind(this);\n        h.forEach(function(l, m) {\n            i.some(function(n) {\n                var o = k(l, n);\n                if ((o === false)) {\n                    return false\n                };\n                if ((j[o] === undefined)) {\n                    j[o] = {\n                        results: [],\n                        rule: n\n                    };\n                };\n                if ((!!n.maxResults && (j[o].results.length >= n.maxResults))) {\n                    return false\n                };\n                l.bucketLineage.push({\n                    bucketName: o,\n                    bucketIndex: j[o].results.length\n                });\n                j[o].results.push(l);\n                return true;\n            });\n        });\n        return j;\n    };\n    g.prototype.$ResultsBucketizer4 = function(h, i) {\n        var j = this.$ResultsBucketizer0[i];\n        if (!j) {\n            return {\n            }\n        };\n        var k = this.$ResultsBucketizer3(h, j);\n        for (var l in k) {\n            var m = k[l].rule.subBucketRules;\n            if (!!m) {\n                this.$ResultsBucketizer4(k[l].results, m);\n            };\n        };\n        g.mergeBuckets(h, k);\n        return k;\n    };\n    g.prototype.bucketize = function(h) {\n        h.forEach(function(i, j) {\n            i.bucketLineage = [];\n            i.indexBeforeBuckets = j;\n        });\n        return this.$ResultsBucketizer4(h, \"main\");\n    };\n    e.exports = g;\n});\n__d(\"FacebarTypeaheadTypeNamedX\", [], function(a, b, c, d, e, f) {\n    var g = {\n        browse_type_user: \"user\",\n        browse_type_page: \"page\",\n        browse_type_place: \"place\",\n        browse_type_group: \"group\",\n        browse_type_application: \"app\"\n    }, h = 1, i = 3;\n    function j() {\n    \n    };\n    j.addTypeNamedX = function(k, l, m, n) {\n        var o = new j(), p = o.buildTypeNamedXBuckets((((l.entities || {\n        })).results || []), (((l[\"isSeeMore.true\"] || {\n        })).results || []), n), q = p[0], r = p[1];\n        q.forEach(function(t, u) {\n            t.bucketLineage.push({\n                bucketName: \"promotedFromSeeMore\",\n                bucketIndex: u\n            });\n        });\n        var s = o.replaceResults(k, q);\n        s.forEach(function(t, u) {\n            t.bucketLineage.push({\n                bucketName: \"demotedToSeeMore\",\n                bucketIndex: u\n            });\n        });\n        s.push.apply(s, r);\n        r = s;\n        if (m) {\n            k.push.apply(k, r);\n        };\n    };\n    j.prototype.buildTypeNamedXBuckets = function(k, l, m) {\n        var n = {\n        };\n        k.forEach(function(v, w) {\n            var x = (v.render_type || v.type);\n            if ((n[x] === undefined)) {\n                n[x] = {\n                    index: w,\n                    matchCount: 0\n                };\n            };\n            if ((v.text.toLowerCase().indexOf(m.toLowerCase()) >= 0)) {\n                n[x].matchCount++;\n            };\n        });\n        var o = [], p = [], q, r;\n        l.forEach(function(v) {\n            if ((v.results_set_type == \"browse_type_story\")) {\n                if ((v.isPostsAboutEnt === true)) {\n                    r = v;\n                }\n                 else q = v;\n            ;\n            }\n             else {\n                var w = g[v.results_set_type];\n                if (((n[w] !== undefined) && (n[w].matchCount >= h))) {\n                    o.push([v,n[w].index,]);\n                }\n                 else p.push(v);\n            ;\n            }\n        ;\n        });\n        o.sort(function(v, w) {\n            return (v[1] - w[1]);\n        });\n        var s = o.map(function(v) {\n            return v[0];\n        });\n        if ((r !== undefined)) {\n            s.unshift(r);\n        };\n        if ((q !== undefined)) {\n            s.unshift(q);\n        };\n        var t = s.slice(0, i), u = s.slice(i);\n        return [t,u.concat(u, p),];\n    };\n    j.prototype.replaceResults = function(k, l) {\n        var m = [];\n        for (var n = 0; (n < l.length); n++) {\n            var o = 0, p = -1;\n            k.forEach(function(s, t) {\n                if (((k[t].cost !== undefined) && (k[t].cost > o))) {\n                    p = t;\n                    o = k[t].cost;\n                }\n            ;\n            });\n            if ((p >= 0)) {\n                m.push(k[p]);\n                k.splice(p, 1);\n            }\n        ;\n        };\n        var q = k.length;\n        while (((q > 0) && ((k[(q - 1)].type == \"websuggestion\")))) {\n            q--;;\n        };\n        for (var r = 0; (r < l.length); r++) {\n            k.splice(q, 0, l[r]);\n            q++;\n        };\n        return m;\n    };\n    e.exports = j;\n});\n__d(\"FacebarDataSource\", [\"Arbiter\",\"AsyncRequest\",\"FacebarResultStore\",\"FacebarStructuredText\",\"FacebarTokenizer\",\"FacebarURI\",\"SearchDataSource\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"throttle\",\"FacebarTypeNamedXTokenOptions\",\"ResultsBucketizer\",\"ResultsBucketizerConfig\",\"FacebarTypeaheadTypeNamedX\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"FacebarResultStore\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarTokenizer\"), l = b(\"FacebarURI\"), m = b(\"SearchDataSource\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"throttle\"), r = b(\"FacebarTypeNamedXTokenOptions\"), s = b(\"ResultsBucketizer\"), t = b(\"ResultsBucketizerConfig\"), u = b(\"FacebarTypeaheadTypeNamedX\"), v = b(\"BingScalingCommon\"), w = 100, x = 250;\n    for (var y in m) {\n        if ((m.hasOwnProperty(y) && (y !== \"_metaprototype\"))) {\n            aa[y] = m[y];\n        };\n    };\n    var z = ((m === null) ? null : m.prototype);\n    aa.prototype = Object.create(z);\n    aa.prototype.constructor = aa;\n    aa.__superConstructor__ = m;\n    function aa(ba) {\n        m.call(this, ba);\n        this.filterOutWebSuggestion = true;\n        this.bootstrap_saved = [];\n        this.null_state = null;\n        this._initialQueryData = null;\n        this._curQueryId = -1;\n        this._seeMore = false;\n        this._waitingQueries = 0;\n        this.mixGrammarAndEntity = ((ba.mixGrammarAndEntity !== undefined) ? ba.mixGrammarAndEntity : true);\n        this.grammarVersion = (ba.grammarVersion || \"\");\n        if (!ba.grammarOptions) {\n            ba.grammarOptions = {\n            };\n        };\n        this.recordingRoute = (ba.grammarOptions.recordingRoute || \"banzai_vital\");\n        this._maxGrammarResults = ba.grammarOptions.maxGrammarResults;\n        this._allowGrammar = (ba.allowGrammar !== false);\n        this._webSearchLockedInMode = (ba.webSearchLockedInMode !== false);\n        this.nullStateEndpoint = (ba.nullStateEndpoint || \"/ajax/browse/null_state.php\");\n        this.setNullStateData((ba.nullStateData || {\n        }), true);\n        this._minWebSugg = (ba.minWebSugg || 1);\n        this._minQueryLength = (ba.minQueryLength || -1);\n        this.allowWebSuggOnTop = (ba.allowWebSuggOnTop || false);\n        this._maxWebSuggToCountFetchMore = (ba.maxWebSuggToCountFetchMore || 0);\n        this._fixProcessLean = (ba.grammarOptions.fixProcessLean || false);\n        if ((ba.throttled === \"0\")) {\n            this.executeQueryThrottled = this.executeQuery;\n            this.sendRemoteQueryThrottled = this.sendRemoteQuery;\n        }\n         else {\n            this.executeQueryThrottled = q(this.executeQuery, w, this);\n            this.sendRemoteQueryThrottled = q(this.sendRemoteQuery, x, this);\n        }\n    ;\n        this.resultStoreOptions = (ba.grammarOptions || {\n        });\n        this.resultStoreOptions.useNewExactNameMatch = ((ba.grammarOptions.useNewExactNameMatch === \"true\"));\n        this._bypassBucketizer = false;\n        this._resultsBucketizer = new s(t.rules, function(da, ea) {\n            switch (ea) {\n              case \"isSeeMore\":\n                return da.isSeeMore;\n              case \"objectType\":\n                return da.type;\n              case \"resultSetType\":\n                return da.results_set_type;\n              case \"renderType\":\n                return (da.render_type || da.type);\n              case \"cacheOnlyResult\":\n                return da.cacheOnlyResult;\n              case \"bootstrapped\":\n                return da.bootstrapped;\n              default:\n                return (!!da.tags ? da.tags[ea] : undefined);\n            };\n        });\n        var ca = new h().setURI(\"/ajax/typeahead/search/facebar/config.php\").setData({\n            version: this.grammarVersion\n        }).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true).setHandler(function(da) {\n            this.facebarConfig = da.payload;\n            this.createResultStore();\n            if (this.null_state) {\n                this.setNullState(this.null_state);\n                this.null_state = null;\n            }\n        ;\n            this.inform(\"ready\", true);\n        }.bind(this)).setFinallyHandler(this.activityEnd.bind(this));\n        this.activityStart();\n        ca.send();\n        this.fetchNullState();\n    };\n    aa.prototype.createResultStore = function() {\n        this.facebarConfig.maxGrammarResults = this._maxGrammarResults;\n        this.resultStore = new i(this.facebarConfig, k.tokenize, this.getEntry.bind(this), this.resultStoreOptions);\n        this.addEntries(this.bootstrap_saved);\n        if (this._fixProcessLean) {\n            this._processLean();\n        };\n        this.bootstrap_saved = [];\n        this.subscribe(\"enableCache\", function(ba, ca) {\n            this.resultStore.cacheEnabled(ca);\n        }.bind(this));\n        this.subscribe(\"setSortFunction\", function(ba, ca) {\n            this.resultStore.setSortFunction(ca);\n        }.bind(this));\n    };\n    aa.prototype.dirty = function() {\n        this.bootstrap_saved = [];\n        this._nullStateFetched = false;\n        if (this.resultStore) {\n            this.resultStore.resetCaches();\n        };\n        z.dirty.call(this);\n    };\n    aa.prototype.addEntries = function(ba) {\n        if (this.resultStore) {\n            this.resultStore.addBootstrap(this.processEntries(ba));\n        }\n         else Array.prototype.push.apply(this.bootstrap_saved, ba);\n    ;\n    };\n    aa.prototype._processLean = function() {\n        if (this._fixProcessLean) {\n            if ((this._leanPayload && this.resultStore)) {\n                var ba, ca = this._leanPayload.entries;\n                for (var da in ca) {\n                    ba = this.getEntry(da);\n                    if (!ba) {\n                        continue;\n                    };\n                    for (var ea in ca[da]) {\n                        if (!ba.grammar_costs) {\n                            ba.grammar_costs = {\n                            };\n                        };\n                        ba.grammar_costs[((\"{\" + ea) + \"}\")] = ca[da][ea];\n                    };\n                };\n                this.setExclusions(this._leanPayload.blocked);\n                this._leanPayload = null;\n            }\n        ;\n        }\n         else z._processLean.call(this);\n    ;\n    };\n    aa.prototype.setNullStateData = function(ba, ca) {\n        if (ca) {\n            this.nullStateData = {\n                grammar_version: this.grammarVersion\n            };\n        };\n        p(this.nullStateData, ba);\n        return this;\n    };\n    aa.prototype.setNullState = function(ba) {\n        if (this.resultStore) {\n            this.processEntries(ba.entities);\n            this.resultStore.setNullState(ba.queries);\n            this.resultStore.addNullStateToQueryCache(this.getRawStructure(j.fromString(\"\")));\n            this.inform(\"ready\", true);\n        }\n    ;\n    };\n    aa.prototype.allowGrammar = function() {\n        return this._allowGrammar;\n    };\n    aa.prototype.isWebSearchLockedInModeEnabled = function() {\n        return this._webSearchLockedInMode;\n    };\n    aa.prototype.fetchNullState = function() {\n        if ((this._nullStateFetched || !this._allowGrammar)) {\n            return\n        };\n        var ba = new h().setURI(this.nullStateEndpoint).setData(this.nullStateData).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true).setHandler(function(ca) {\n            if (this.resultStore) {\n                this.setNullState(ca.payload);\n            }\n             else this.null_state = ca.payload;\n        ;\n            this._nullStateFetched = true;\n        }.bind(this)).setFinallyHandler(this.activityEnd.bind(this));\n        this.activityStart();\n        ba.send();\n    };\n    aa.prototype.toTypeaheadEntryUid = function(ba) {\n        var ca, da = j.fromStruct(ba.structure), ea = da.getFragment(0);\n        if (((da.getCount() == 1) && ea.isType(\"ent\"))) {\n            var fa = ea.getType().split(\":\")[2];\n            ca = this.getEntry(ea.getUID(), fa);\n            ca.type = this.resultStore.stripBrackets(ba.type);\n        }\n         else {\n            ca = this.getEntry(ba.tuid);\n            if (!ca) {\n                var fa, ga, ha;\n                if ((ba.type === \"websuggestion\")) {\n                    fa = ba.type;\n                    ha = ba.iconClass;\n                }\n                 else {\n                    fa = \"grammar\";\n                    ga = ba.type;\n                    ha = ba.iconClass;\n                }\n            ;\n                ca = {\n                    dynamic_cost: ba.dynamic_cost,\n                    extra_uri_params: ba.extra_uri_params,\n                    icon_class: ha,\n                    memcache: ba.fromMemcache,\n                    photo: ba.photo,\n                    results_set_type: ga,\n                    tuid: ba.tuid,\n                    type: fa,\n                    uid: ba.tuid,\n                    tags: ba.tags,\n                    websuggestion_source: ba.websuggestion_source\n                };\n                this.processEntries([ca,]);\n                ca = this.getEntry(ba.tuid);\n            }\n        ;\n        }\n    ;\n        if (((ca.type === \"websuggestion\") || ba.isRedirect)) {\n            ca.path = ba.path;\n        };\n        ca.error_info = ba.errorInfo;\n        ca.logInfo = ba.logInfo;\n        ca.structure = da;\n        ca.text = ca.structure.toString();\n        ca.queryTypeText = ba.queryTypeText;\n        ca.semantic = ba.semantic;\n        ca.tree = ba.tree;\n        ca.cost = ba.cost;\n        ca.isSeeMore = !!ba.isSeeMore;\n        ca.isNullState = !!ba.isNullState;\n        ca.entityInfo = ba.entityInfo;\n        ca.cacheOnlyResult = (ba.cacheOnlyResult || false);\n        ca.uri = (ca.uri || l.getURI(this.facebarConfig, ca));\n        ca.semanticForest = ba.semanticForest;\n        ca.entityTypes = ba.entityTypes;\n        ca.parse = ba.parse;\n        ca.tags = ba.tags;\n        ca.isPostsAboutEnt = (ba.isPostsAboutEnt || false);\n        ca.removable = true;\n        if (ba.isJSBootstrapMatch) {\n            ca.isJSBootstrapMatch = ba.isJSBootstrapMatch;\n            ca.backendCost = ba.backendCost;\n            ca.bootstrapCost = ba.bootstrapCost;\n        }\n    ;\n        this._replaceCategoryWithTermMatches(ca, ba);\n        if (((ba.parse && ba.parse.disambiguation) && (ba.parse.disambiguation.length > 0))) {\n            ca.disambiguation_paths = [];\n            for (var ia = 0; (ia < ba.parse.disambiguation.length); ia++) {\n                var ja = {\n                };\n                ja.semantic = ba.parse.disambiguation[ia];\n                var ka = l.getURI(this.facebarConfig, ja);\n                if (ka) {\n                    ka.path = ka.path.replace(((\"/^/\" + l.getSearchRawPrefix()) + \"//\"), \"\");\n                    ca.disambiguation_paths.push(ka.path);\n                }\n            ;\n            };\n        }\n    ;\n        return ca.tuid;\n    };\n    aa.prototype._replaceCategoryWithTermMatches = function(ba, ca) {\n        if ((((ba.type !== \"user\") || !ba.term_to_subtitle) || !ca.termMatches)) {\n            return\n        };\n        var da = [];\n        ca.termMatches.forEach(function(fa) {\n            if (ba.term_to_subtitle[fa]) {\n                da.push(ba.term_to_subtitle[fa]);\n            };\n        }.bind(this));\n        if ((ba.category === undefined)) {\n            ba.category = \"\";\n        };\n        var ea = ba.category.split(\" \\u00b7 \");\n        ea.unshift.apply(ea, da);\n        ea = ea.filter(function(fa, ga, ha) {\n            return (ga == ha.indexOf(fa));\n        });\n        ba.category = ea.splice(0, 2).join(\" \\u00b7 \");\n    };\n    aa.prototype.getRawStructure = function(ba) {\n        if ((typeof ba == \"string\")) {\n            ba = j.fromString(ba);\n        };\n        if (this.resultStore) {\n            return this.resultStore.transformStructured(ba.toArray())\n        };\n    };\n    aa.prototype.isSeeMore = function() {\n        return this._seeMore;\n    };\n    aa.prototype.saveResult = function(ba) {\n        this._initialQueryData = ba.uid;\n    };\n    aa.prototype.buildUids = function(ba, ca, da) {\n        if ((!ba || !this.resultStore)) {\n            return []\n        };\n        if ((typeof ba == \"string\")) {\n            ba = j.fromString(ba);\n        };\n        var ea = this.getRawStructure(ba), fa = this.resultStore.getResults(ea), ga = fa.results;\n        if ((typeof ga === \"undefined\")) {\n            return []\n        };\n        var ha = fa.webSuggOnTop;\n        if ((typeof ha === \"undefined\")) {\n            ha = false;\n        };\n        var ia = (fa.webSuggLimit || 0), ja = (fa.null_state === true), ka = (this.filterOutWebSuggestion && !ja), la = 0;\n        ga = ga.filter(function(qa, ra) {\n            if ((!this._allowGrammar && (qa.type == \"grammar\"))) {\n                return false\n            };\n            if ((qa.type != \"websuggestion\")) {\n                return ((qa.semantic != \"\\u003Cblank\\u003E\") && (((qa.type != \"unimplemented\") || (la++ === 0))));\n            }\n             else return !ka\n        ;\n        }.bind(this));\n        var ma = ga.slice(), na = [], oa = [], pa = [];\n        ga.forEach(function(qa) {\n            if ((qa.forcedPosition > 0)) {\n                pa.push(qa);\n            }\n             else if (qa.isSeeMore) {\n                na.push(qa);\n            }\n             else oa.push(qa);\n            \n        ;\n        });\n        if (ja) {\n            ga = this.orderNullState(ga, this.getMaxResults());\n        }\n         else {\n            ga = v.integrateWebsuggestions(oa, Boolean(ha), this.getMaxResults(), ia, this._minWebSugg);\n            ga.length = Math.min(ga.length, this.getMaxResults());\n        }\n    ;\n        this.inform(\"decorateSeeMoreSuggestions\", {\n            structured: ba,\n            allResults: ma,\n            selectedResults: ga,\n            seeMoreResults: na\n        });\n        if ((pa.length > 0)) {\n            pa.sort(function(qa, ra) {\n                return (qa.forcedPosition - ra.forcedPosition);\n            });\n            pa.forEach(function(qa) {\n                ga.splice(qa.forcedPosition, 0, qa);\n            });\n        }\n    ;\n        if ((na.length > 0)) {\n            ga.push.apply(ga, na);\n        };\n        return ga.map(this.toTypeaheadEntryUid.bind(this));\n    };\n    aa.prototype.orderNullState = function(ba, ca) {\n        var da = {\n            top: [],\n            bottom: [],\n            middle: []\n        }, ea = function(ha) {\n            var ia = ha.null_state_position;\n            return (da.hasOwnProperty(ia) ? ia : \"middle\");\n        }, fa = function(ha, ia) {\n            return (ha.original_cost - ia.original_cost);\n        };\n        (ba && ba.forEach(function(ha) {\n            da[ea(ha)].push(ha);\n        }.bind(this)));\n        for (var ga in da) {\n            da[ga] = da[ga].sort(fa).slice(0, ca);\n            ca -= da[ga].length;\n        };\n        return [].concat(da.top, da.middle, da.bottom);\n    };\n    aa.prototype.handleResponse = function(ba, ca) {\n        if (!(ba.payload.errors)) {\n            this.processEntries(ba.payload.entities);\n            this.filterOutWebSuggestion = true;\n            for (var da = 0; (da < ba.payload.results.length); da++) {\n                if ((ba.payload.results[da].type == \"websuggestion\")) {\n                    this.filterOutWebSuggestion = false;\n                    break;\n                }\n            ;\n            };\n            var ea = {\n            };\n            [\"webSuggOnTop\",\"webSuggLimit\",\"webSuggLimitSeeMore\",].forEach(function(fa) {\n                if (ba.payload.hasOwnProperty(fa)) {\n                    ea[fa] = ba.payload[fa];\n                };\n            });\n            this.resultStore.saveResults(ba.payload.results, ca, ba.payload.incomplete, ea);\n        }\n    ;\n    };\n    aa.prototype.processEntries = function(ba) {\n        return ba.map(function(ca, da) {\n            var ea = (ca.uid = (ca.uid + \"\"));\n            ca.textToIndex = this.getTextToIndex(ca);\n            ca.titleToIndex = this.getTitleTerms(ca);\n            ea = this.getUID(ea, ca.fetchType);\n            var fa = this.getEntry(ea);\n            if (!fa) {\n                this.setEntry(ea, {\n                });\n                fa = this.getEntry(ea);\n            }\n        ;\n            p(fa, ca);\n            fa.tokenVersion = ca.tokenVersion;\n            fa.tuid = ea;\n            ((fa.index === undefined) && (fa.index = da));\n            return ea;\n        }.bind(this));\n    };\n    aa.prototype.getUID = function(ba, ca) {\n        ba = (ba + \"\");\n        if ((ca !== undefined)) {\n            ca = /([^:]+:)?([^:]+)(:.*)?/.exec(ca)[2];\n            return JSON.stringify([ba,ca,]);\n        }\n    ;\n        return ba;\n    };\n    aa.prototype.getEntry = function(ba, ca) {\n        if ((ca !== undefined)) {\n            var da = z.getEntry.call(this, this.getUID(ba, ca));\n            if (da) {\n                return da\n            };\n        }\n    ;\n        return z.getEntry.call(this, ba);\n    };\n    aa.prototype.getEntryForFragment = function(ba) {\n        return this.getEntry(ba.getUID(), ba.getTypePart(2));\n    };\n    aa.prototype.getMaxResults = function() {\n        return this._numResults.max;\n    };\n    aa.prototype.query = function(ba, ca, da, ea) {\n        this.executeQueryThrottled(ba, ea, this._initialQueryData);\n        this._initialQueryData = null;\n    };\n    aa.prototype.executeQuery = function(ba, ca, da) {\n        this._seeMore = (ca === true);\n        this._curQueryId++;\n        this.setQueryData({\n            qid: this._curQueryId,\n            see_more: this._seeMore,\n            max_results: ((this.getMaxResults() + r.additionalResultsToFetch))\n        });\n        this.inform(\"beforeQuery\", {\n            value: ba,\n            queryId: this.curQueryId\n        });\n        var ea = this.buildUids(ba, []);\n        if (da) {\n            ea = ea.filter(function(ga) {\n                return (ga !== da);\n            });\n            ea.unshift(da);\n        }\n    ;\n        this.value = ba;\n        this.inform(\"query\", {\n            value: ba,\n            results: ea,\n            see_more: this._seeMore,\n            queryId: this._curQueryId\n        });\n        if (this.resultStore) {\n            var fa = this.getRawStructure(ba);\n            if (this.shouldFetchMore(fa, ea)) {\n                this.sendRemoteQueryThrottled(fa, ba);\n            };\n            this.respond(ba, ea, false);\n        }\n    ;\n    };\n    aa.prototype.shouldFetchMore = function(ba, ca) {\n        if (ba.is_empty) {\n            return false\n        };\n        if (this._seeMore) {\n            return true\n        };\n        if (this.resultStore.alreadyKnown(ba.cache_id)) {\n            return false\n        };\n        if ((ba.raw_text && this._isQueryTooShort(ba.raw_text))) {\n            return false\n        };\n        if ((ca.length < this.getMaxResults())) {\n            return true\n        };\n        return (this.countValidResults(ca) < this.getMaxResults());\n    };\n    aa.prototype.countValidResults = function(ba) {\n        var ca = 0, da = 0;\n        ba.forEach(function(ea) {\n            var fa = this.getEntry(ea);\n            if ((fa && !fa.isNullState)) {\n                if ((fa.type === \"websuggestion\")) {\n                    ca++;\n                }\n                 else da++;\n            \n            };\n        }.bind(this));\n        return (da + Math.min(this._maxWebSuggToCountFetchMore, ca));\n    };\n    aa.prototype.sendRemoteQuery = function(ba, ca) {\n        var da = new h().setURI(this.queryEndpoint).setData(this.getQueryData(ba.text_form)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true).setHandler(function(ea, fa) {\n            fa.queryId = ea;\n            this.inform(\"response_received\", fa);\n            this.handleResponse(fa, ba);\n            this.respond(ca, this.buildUids(ca), true, (fa.payload && ((!fa.payload.results || (fa.payload.results.length === 0)))));\n            this.inform(\"backend_response\", fa);\n        }.bind(this, this._curQueryId)).setFinallyHandler(this.activityEnd.bind(this));\n        this.inform(\"sending_request\", da);\n        this.activityStart();\n        da.send();\n    };\n    aa.prototype.activityStart = function() {\n        if (!this._waitingQueries) {\n            this.inform(\"activity\", {\n                activity: true,\n                seeMore: this._seeMore\n            }, g.BEHAVIOR_STATE);\n        };\n        this._waitingQueries++;\n    };\n    aa.prototype.activityEnd = function() {\n        this._waitingQueries--;\n        if (!this._waitingQueries) {\n            this.inform(\"activity\", {\n                activity: false,\n                seeMore: this._seeMore\n            }, g.BEHAVIOR_STATE);\n        };\n    };\n    aa.prototype._bucketizeResults = function(ba, ca) {\n        var da = this._resultsBucketizer.bucketize(ca);\n        u.addTypeNamedX(ca, da, this.isSeeMore(), ba.toString());\n    };\n    aa.prototype.setBypassBucketizer = function(ba) {\n        this._bypassBucketizer = ba;\n    };\n    aa.prototype.respond = function(ba, ca, da, ea) {\n        this.inform(\"reorderResults\", ca);\n        this.inform(\"respondValidUids\", ca);\n        var fa = ca.map(this.getEntry.bind(this));\n        if (((!!ba && (((ba instanceof j) && !ba.isEmptyOrWhitespace()))) && !this._bypassBucketizer)) {\n            this._bucketizeResults(ba, fa);\n        };\n        this.inform(\"respond\", {\n            value: ba,\n            results: fa,\n            isAsync: !!da,\n            isEmptyResults: ea,\n            isScrollable: this.isSeeMore()\n        });\n        return fa;\n    };\n    aa.prototype._updateMaxResults = function() {\n        var ba = n.getViewportDimensions().y, ca = (o.getTop() || 42), da = 56, ea = 48;\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, (Math.floor((((((ba - ca) - ea) - 25)) / da)) - 1))));\n    };\n    aa.prototype.getCurQueryId = function() {\n        return this._curQueryId;\n    };\n    p(aa.prototype, {\n        events: [\"query\",\"respond\",\"bootstrapped\",\"activity\",\"ready\",]\n    });\n    e.exports = aa;\n});\n__d(\"FacebarFragmentRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(m, n, o) {\n        var p = m.structure.getFragment(n), q = null, r = (m.bolding && m.bolding[n]);\n        if ((typeof r == \"number\")) {\n            q = [r,(p.getLength() - r),];\n        }\n         else if (r) {\n            q = r;\n        }\n    ;\n        var s = [p.getText(),];\n        if (m.verified) {\n            s.push(g(\"medium\", \"verified\"));\n        };\n        if ((q && q.length)) {\n            return h.create(\"span\", {\n            }, j(p.getText(), q, o));\n        }\n         else return h.create(\"span\", {\n            className: ((m.bolding && o.unchanged) || \"\")\n        }, s)\n    ;\n    };\n    function j(m, n, o) {\n        var p = [], q = false, r = 0;\n        n.forEach(function(s) {\n            var t = m.substr(r, s), u = (q ? o.changed : o.unchanged);\n            if ((s && u)) {\n                p.push(h.create(\"span\", {\n                    className: u\n                }, t));\n            }\n             else p.push(t);\n        ;\n            r += s;\n            q = !q;\n        });\n        return p;\n    };\n    function k(m, n) {\n        var o = {\n        };\n        m.forEach(function(p, q) {\n            if ((p.type.lastIndexOf(\"ent:\", 0) === 0)) {\n                o[q] = l(n, p);\n            };\n        });\n        return o;\n    };\n    function l(m, n) {\n        var o = false, p = [];\n        m.tokens.forEach(function(t) {\n            if ((typeof t == \"object\")) {\n                if ((t.uid == n.getUID())) {\n                    o = true;\n                };\n            }\n             else {\n                p.push(t);\n                if (((t.length > 2) && (t.substr((t.length - 2)) == \"'s\"))) {\n                    p.push(t.substr(0, (t.length - 2)));\n                };\n            }\n        ;\n        });\n        if (o) {\n            return\n        };\n        var q = n.getText().split(\" \"), r = \"\", s = [];\n        q.forEach(function(t, u) {\n            var v = 0;\n            p.forEach(function(w) {\n                if (((w.length > v) && (t.toLowerCase().indexOf(w) === 0))) {\n                    v = w.length;\n                };\n            });\n            r += t.substr(0, v);\n            if ((v != t.length)) {\n                s.push(r.length);\n                s.push((t.length - v));\n                r = \"\";\n            }\n        ;\n            if ((u < (q.length - 1))) {\n                r += \" \";\n            };\n        });\n        s.push(r.length);\n        return s;\n    };\n    e.exports = {\n        renderFragment: i,\n        computeEntBolding: k\n    };\n});\n__d(\"FacebarTypeaheadItem\", [\"BrowseFacebarHighlighter\",\"CSS\",\"cx\",\"DOM\",\"FacebarFragmentRenderer\",\"FacebarRender\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowseFacebarHighlighter\"), h = b(\"CSS\"), i = b(\"cx\"), j = b(\"DOM\"), k = b(\"FacebarFragmentRenderer\"), l = b(\"FacebarRender\"), m = b(\"fbt\"), n = \"-cx-PUBLIC-fbFacebarTypeaheadItem__label\", o = \"-cx-PUBLIC-fbFacebarTypeaheadItem__labeltitle\", p = k.renderFragment;\n    function q(s) {\n        var t = s.getTypePart(0);\n        return (t ? ((\"fragment\" + t.charAt(0).toUpperCase()) + t.substr(1)) : \"fragment\");\n    };\n    function r(s) {\n        this._result = s;\n        this._aux = null;\n        this._debug = null;\n        this._renderEducation = true;\n        this._classes = ((s.classNames || \"\")).split(\" \");\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__root\");\n        this.addClass(\"-cx-PRIVATE-fbHighlightNodeDecorator__highlight\");\n        this._shouldVAlign = true;\n        this._messageButton = null;\n    };\n    r.prototype.setVAlign = function(s) {\n        this._shouldVAlign = s;\n        return this;\n    };\n    r.prototype.shouldVAlign = function() {\n        return this._shouldVAlign;\n    };\n    r.prototype.addClass = function(s) {\n        this._classes.push(s);\n    };\n    r.prototype.setAux = function(s) {\n        this._aux = s;\n        return this;\n    };\n    r.prototype.setShouldRenderEducation = function(s) {\n        this._renderEducation = s;\n        return this;\n    };\n    r.prototype.setDebug = function(s) {\n        this._debug = s;\n        return this;\n    };\n    r.prototype.setMessageButton = function(s) {\n        this._messageButton = s;\n        return this;\n    };\n    r.prototype.cacheable = function() {\n        return (this._debug === null);\n    };\n    r.prototype.renderText = function() {\n        return this._result.structure.toArray().map(function(s, t) {\n            var u = p(this._result, t, {\n            });\n            return h.addClass(u, q(s));\n        }.bind(this));\n    };\n    r.prototype.renderAux = function() {\n        return (this._aux ? [this._aux,] : []);\n    };\n    r.prototype.renderSubtext = function() {\n        return [];\n    };\n    r.prototype.renderIcon = function() {\n        return [];\n    };\n    r.prototype.renderEduContent = function() {\n        if (!this._renderEducation) {\n            return []\n        };\n        var s = j.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__usereducationkeytext\"\n        }, \"Tab\"), t = m._(\"Use {tab} key to select\", [m.param(\"tab\", s),]);\n        return j.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__usereducationtext\"\n        }, l.children(t));\n    };\n    r.prototype.highlight = function(s) {\n        if ((!this._result.original_query || !h.hasClass(s, \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\"))) {\n            return\n        };\n        var t = this._result.original_query.toString().trim(), u = t.split(\" \"), v = ((u.length > 1) ? [t,].concat(u) : [t,]);\n        v = v.filter(function(w) {\n            return ((w !== \"\"));\n        });\n        if (h.hasClass(s, \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\")) {\n            g.highlight(s, v);\n        };\n    };\n    r.prototype.render = function() {\n        var s = this.renderAux(), t = this.renderIcon(), u = this.renderText(), v = this.renderEduContent(), w = this.renderSubtext(), x = this._debug, y = this._messageButton, z = l.span(o, l.children(u, w));\n        h.conditionClass(z, \"-cx-PUBLIC-fbFacebarTypeaheadItem__valign\", (this.shouldVAlign() && w));\n        var aa = l.span(n, [z,v,y,]);\n        h.conditionClass(aa, \"-cx-PRIVATE-fbFacebarTypeaheadItem__hasmessagebutton\", y);\n        var ba = j.create(\"a\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__link\",\n            href: this._result.uri,\n            rel: \"ignore\"\n        }, j.create(\"span\", {\n            className: \"-cx-PUBLIC-fbFacebarTypeaheadItem__maincontent\"\n        }, l.children(t, aa, x))), ca = j.create(\"span\", {\n            className: \"-cx-PUBLIC-fbFacebarTypeaheadItem__auxcontent\"\n        }, l.children(s, this._aux));\n        if (t) {\n            this._classes.push(\"-cx-PRIVATE-fbFacebarTypeaheadItem__hasicon\");\n        };\n        var da = j.create(\"li\", {\n            className: this._classes.join(\" \")\n        }, [ba,ca,]);\n        da.setAttribute(\"aria-label\", this._result.structure.toString());\n        return da;\n    };\n    e.exports = r;\n});\n__d(\"FacebarTypeaheadToken\", [\"cx\",\"FacebarRender\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"FacebarRender\"), i = ((\" \" + \"\\u00b7\") + \" \"), j = \"-cx-PUBLIC-fbFacebarTypeaheadToken__root\", k = \"-cx-PUBLIC-fbFacebarTypeaheadToken__inner\", l = \"-cx-PUBLIC-fbFacebarTypeaheadToken__subtext\";\n    function m(n, o) {\n        this._text = n;\n        this._limit = null;\n        this._innerClass = (o ? o : k);\n        this._showLeadingMiddot = false;\n        this._separateMainText = true;\n    };\n    m.prototype.setLimit = function(n) {\n        this._limit = n;\n        return this;\n    };\n    m.prototype.setLeadingMiddot = function(n) {\n        this._showLeadingMiddot = n;\n        return this;\n    };\n    m.prototype.separateMainText = function(n) {\n        this._separateMainText = n;\n        return this;\n    };\n    m.prototype.getText = function() {\n        return this._text;\n    };\n    m.prototype.render = function() {\n        var n = this.getText();\n        if (n.length) {\n            (this._limit && n.splice(this._limit));\n            n.forEach(function(r, s) {\n                if (((s !== 0) || this._showLeadingMiddot)) {\n                    n[s] = [i,r,];\n                };\n            }.bind(this));\n            var o = (this._separateMainText ? n.shift() : null), p = (n.length ? h.span(l, n) : null), q = h.span(j, h.span(this._innerClass, [o,p,]));\n            return q;\n        }\n    ;\n    };\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadEntityToken\", [\"FacebarTypeaheadToken\",\"DOM\",\"HTML\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarTypeaheadToken\"), h = b(\"DOM\"), i = b(\"HTML\"), j = \"\\u00b7\";\n    for (var k in g) {\n        if ((g.hasOwnProperty(k) && (k !== \"_metaprototype\"))) {\n            m[k] = g[k];\n        };\n    };\n    var l = ((g === null) ? null : g.prototype);\n    m.prototype = Object.create(l);\n    m.prototype.constructor = m;\n    m.__superConstructor__ = g;\n    function m(n) {\n        g.call(this);\n        this._entity = n;\n        this._default = {\n        };\n    };\n    m.prototype.setDefaultText = function(n, o) {\n        this._default[n] = o;\n        return this;\n    };\n    m.prototype.getText = function() {\n        var n = [], o = {\n        }, p = function(r) {\n            r = r.trim();\n            if (!o[r]) {\n                n.push(r);\n                o[r] = 1;\n            }\n        ;\n        }, q = function(r) {\n            if ((typeof r == \"object\")) {\n                r = h.getText(i(r).getRootNode());\n            };\n            (r && r.split(j).map(p));\n        };\n        (this._entity.category ? q(this._entity.category) : n.push(this._default[this._entity.type]));\n        q(this._entity.subtext);\n        return n;\n    };\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadEntityItem\", [\"CSS\",\"cx\",\"DOM\",\"FacebarTypeaheadItem\",\"FacebarTypeaheadEntityToken\",\"fbt\",\"TypeaheadFacepile\",\"FacebarRender\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\"), i = b(\"DOM\"), j = b(\"FacebarTypeaheadItem\"), k = b(\"FacebarTypeaheadEntityToken\"), l = b(\"fbt\"), m = b(\"TypeaheadFacepile\"), n = b(\"FacebarRender\");\n    for (var o in j) {\n        if ((j.hasOwnProperty(o) && (o !== \"_metaprototype\"))) {\n            q[o] = j[o];\n        };\n    };\n    var p = ((j === null) ? null : j.prototype);\n    q.prototype = Object.create(p);\n    q.prototype.constructor = q;\n    q.__superConstructor__ = j;\n    function q(r) {\n        j.call(this, r);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\");\n    };\n    q.prototype.renderSubtext = function() {\n        var r = n.span(\"DefaultText\", \"Timeline\");\n        return new k(this._result).setDefaultText(\"user\", r).render();\n    };\n    q.prototype.renderIcon = function() {\n        var r = (this._result.photos || this._result.photo);\n        if (!r) {\n            return null\n        };\n        if ((r instanceof Array)) {\n            r = m.render(r);\n            g.addClass(r, \"-cx-PRIVATE-fbFacebarTypeaheadItem__entitysplitpics\");\n            return r;\n        }\n         else return i.create(\"img\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityicon\",\n            alt: \"\",\n            src: r\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"FacebarDisambiguationDialog\", [\"Event\",\"BrowseLogger\",\"CSS\",\"cx\",\"Dialog\",\"DOM\",\"FacebarStructuredText\",\"FacebarTypeaheadEntityItem\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"BrowseLogger\"), i = b(\"CSS\"), j = b(\"cx\"), k = b(\"Dialog\"), l = b(\"DOM\"), m = b(\"FacebarStructuredText\"), n = b(\"FacebarTypeaheadEntityItem\"), o = b(\"tx\"), p = 650;\n    function q(r, s, t, u, v) {\n        this._sets = r;\n        this._path = s;\n        this._ondone = t;\n        this._oncancel = u;\n        this._selection = [];\n        this._typeaheadSID = v;\n    };\n    q.prototype.show = function() {\n        new k().setTitle(\"Which of these did you mean?\").setBody(this._createBody()).setContentWidth(p).setModal(true).setButtons([k.CONFIRM,k.CANCEL,]).setHandler(this._handleDone.bind(this)).setCancelHandler(this._handleCancel.bind(this)).show();\n        this._sets.forEach(function(r) {\n            var s = [];\n            r.forEach(function(u) {\n                s.push(u.uid);\n            });\n            var t = r[0];\n            h.logDisambiguationImpression(t.text, t.type, this._path, s.join(\",\"), this._typeaheadSID);\n        }.bind(this));\n    };\n    q.prototype._createBody = function() {\n        var r = [];\n        this._sets.forEach(function(s, t) {\n            (r.length && r.push(l.create(\"li\", {\n                className: \"-cx-PRIVATE-fbFacebarDisambiguationDialog__divider\"\n            })));\n            s.forEach(function(u) {\n                var v = this._createItem(u, t);\n                (this._selection[t] || this._selectItem(v));\n                r.push(v.root);\n            }.bind(this));\n        }.bind(this));\n        return l.create(\"ul\", {\n            className: \"viewList disambiguationList\"\n        }, r);\n    };\n    q.prototype._createItem = function(r, s) {\n        var t = {\n            uri: null,\n            subtext: r.subtext,\n            category: r.category,\n            photo: r.photo,\n            type: r.type,\n            structure: m.fromStruct([{\n                text: r.text,\n                type: (\"ent:\" + r.type),\n                uid: r.uid\n            },])\n        }, u = l.create(\"div\", {\n            className: \"-cx-PRIVATE-fbFacebarDisambiguationDialog__check\"\n        }), v = new n(t).setAux(i.hide(u)).setShouldRenderEducation(false).render(), w = {\n            setId: s,\n            result: r,\n            root: v,\n            check: u\n        };\n        i.addClass(v, \"-cx-PRIVATE-fbFacebarDisambiguationDialog__item\");\n        g.listen(v, \"mouseover\", this._toggleHover.bind(this, w, true));\n        g.listen(v, \"mouseout\", this._toggleHover.bind(this, w, false));\n        g.listen(v, \"click\", function(event) {\n            this._selectItem(w);\n            return event.kill();\n        }.bind(this));\n        return w;\n    };\n    q.prototype._toggleHover = function(r, s) {\n        i.conditionClass(r.root, \"selected\", s);\n    };\n    q.prototype._toggleCheck = function(r, s) {\n        i.conditionShow(r.check, s);\n    };\n    q.prototype._selectItem = function(r) {\n        var s = this._selection[r.setId];\n        this._selection[r.setId] = r;\n        (s && this._toggleCheck(s, false));\n        this._toggleCheck(r, true);\n    };\n    q.prototype._handleDone = function(r) {\n        this._ondone(((r == k.CONFIRM) ? this._selection.map(function(s) {\n            var t = s.result;\n            h.logDisambiguationClick(t.text, t.type, this._path, t.index, t.uid, this._typeaheadSID);\n            return t;\n        }.bind(this)) : null));\n    };\n    q.prototype._handleCancel = function() {\n        this._oncancel();\n    };\n    e.exports = q;\n});\n__d(\"FacebarTypeahead\", [\"Arbiter\",\"Typeahead\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Typeahead\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    for (var k in h) {\n        if ((h.hasOwnProperty(k) && (k !== \"_metaprototype\"))) {\n            m[k] = h[k];\n        };\n    };\n    var l = ((h === null) ? null : h.prototype);\n    m.prototype = Object.create(l);\n    m.prototype.constructor = m;\n    m.__superConstructor__ = h;\n    function m(n, o, p, q, r, s) {\n        h.call(this, n, o, p, q);\n        this.getCore();\n        this.proxyEvents();\n        this.initBehaviors((r || []));\n        var t = this.core.subscribe(\"focus\", function() {\n            if (s) {\n                s.init(this);\n            };\n            this.core.unsubscribe(t);\n            this.data.bootstrap(false);\n            this.core.input.focus();\n        }.bind(this));\n        this.data.bootstrap(true);\n        this.inform(\"init\", this, g.BEHAVIOR_PERSISTENT);\n        g.inform(\"Facebar/init\", this, g.BEHAVIOR_PERSISTENT);\n    };\n    m.prototype.proxyEvents = function() {\n        var n, o = [], p = null, q = (function() {\n            while (n = o.shift()) {\n                this.inform(n[0], n[1]);;\n            };\n            p = null;\n        }).bind(this);\n        [this.data,this.view,this.core,].forEach(function(r) {\n            r.subscribe(r.events, function(s, t) {\n                o.push([s,t,]);\n                p = (p || q.defer());\n            }.bind(this));\n        }, this);\n    };\n    i(m.prototype, {\n        init: j\n    });\n    e.exports = m;\n});\n__d(\"StructuredInputDOM\", [\"createArrayFrom\",\"CSS\",\"cx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"CSS\"), i = b(\"cx\"), j = b(\"DOM\"), k = {\n        ENTITY_CLASS: \"-cx-PUBLIC-uiStructuredInput__entity\",\n        encodeText: function(l) {\n            return l.replace(/ /g, \"\\u00a0\");\n        },\n        decodeText: function(l) {\n            return l.replace(/\\u00a0/g, \" \");\n        },\n        createIconNode: function(l) {\n            if ((l && (typeof l == \"object\"))) {\n                var m = j.create(\"i\", {\n                    className: l.className,\n                    style: (l.uri && {\n                        backgroundImage: ((\"url(\\\"\" + l.uri) + \"\\\")\")\n                    })\n                });\n                m.setAttribute(\"data-select\", \"ignore\");\n                return m;\n            }\n        ;\n        },\n        createTextNode: function(l) {\n            return j.create(\"span\", {\n                \"data-si\": true\n            }, k.encodeText((l || \"\")));\n        },\n        createEntityNode: function(l, m) {\n            var n = k.encodeText(l.text), o = k.createIconNode(m.icon), p = j.create(\"span\", {\n            }, (o ? [o,n,] : n)), q = ((m.className || \"\")).split(/\\s+/);\n            q.push(k.ENTITY_CLASS);\n            q.forEach(h.addClass.bind(h, p));\n            var r = {\n                si: true,\n                uid: l.uid,\n                type: l.type,\n                text: n,\n                fulltext: n,\n                group: m.group,\n                select: m.select,\n                icon: JSON.stringify((m.icon || null))\n            };\n            for (var s in r) {\n                if ((r[s] != null)) {\n                    p.setAttribute((\"data-\" + s), r[s]);\n                };\n            };\n            return p;\n        },\n        convertToTextNode: function(l) {\n            l.className = \"\";\n            l.setAttribute(\"data-type\", \"text\");\n            l.removeAttribute(\"data-group\");\n            l.removeAttribute(\"data-select\");\n            l.removeAttribute(\"data-icon\");\n            l.removeAttribute(\"data-uid\");\n            for (var m = l.firstChild; m; m = m.nextSibling) {\n                if (!j.isTextNode(m)) {\n                    j.remove(m);\n                };\n            };\n        },\n        isEntityNode: function(l) {\n            return (j.isElementNode(l) && h.hasClass(l, k.ENTITY_CLASS));\n        },\n        containsOnlyText: function(l, m) {\n            m = g(m);\n            for (var n = l.firstChild; n; n = n.nextSibling) {\n                if (!((j.isTextNode(n) || (l.nodeName in m)))) {\n                    return false\n                };\n            };\n            return true;\n        },\n        getText: function(l) {\n            return j.getText(l).replace(/ /g, \"\\u00a0\");\n        },\n        getDecodedText: function(l) {\n            return k.decodeText(j.getText(l));\n        },\n        getLength: function(l) {\n            return j.getText(l).length;\n        },\n        getMarker: function(l, m, n) {\n            var o = l.firstChild;\n            while (o) {\n                var p = k.getLength(o);\n                if (((p > m) || !o.nextSibling)) {\n                    if ((j.isTextNode(o) || !n)) {\n                        return {\n                            node: o,\n                            offset: Math.min(m, p)\n                        };\n                    }\n                     else return k.getMarker(o, m)\n                ;\n                }\n                 else m -= p;\n            ;\n                o = o.nextSibling;\n            };\n        }\n    };\n    e.exports = k;\n});\n__d(\"StructuredInputUtil\", [\"StructuredInputDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"StructuredInputDOM\");\n    function h(n, o, p) {\n        var q = n.substr(0, o).lastIndexOf(p);\n        return ((q !== -1) ? (q + 1) : 0);\n    };\n    function i(n, o, p) {\n        var q = n.indexOf(p, o);\n        return ((q !== -1) ? q : n.length);\n    };\n    function j(n, o, p) {\n        return ((((o === 0) || (o === n.length)) || (n.substr(o, p.length) == p)));\n    };\n    function k(n, o, p, q) {\n        switch (o) {\n          case \"none\":\n            return p;\n          case \"all\":\n            return (q ? n.length : 0);\n          case \"word\":\n            if (j(n, p, \"\\u00a0\")) {\n                return p;\n            }\n             else if (q) {\n                return i(n, p, \"\\u00a0\");\n            }\n             else return h(n, p, \"\\u00a0\")\n            \n        ;\n        };\n    };\n    function l(n, o) {\n        return ((o && g.isEntityNode(n)) && !g.isEntityNode(o));\n    };\n    var m = {\n        getMarkerAtOffset: function(n, o) {\n            var p = n.firstChild, q = 0, r = 0;\n            while (p) {\n                q += r;\n                r = g.getLength(p);\n                if (((q + r) > o)) {\n                    break;\n                }\n                 else p = p.nextSibling;\n            ;\n            };\n            return {\n                node: (p || n.lastChild),\n                offset: (o - q)\n            };\n        },\n        validateEntityText: function(n) {\n            var o = g.getText(n), p = n.getAttribute(\"data-fulltext\"), q = n.getAttribute(\"data-group\");\n            if ((q == \"hashtag\")) {\n                var r = o.match(/#[^\\s]+/);\n                p = (r && r[0]);\n            }\n        ;\n            var s = o.indexOf(p), t = {\n                prefix: null,\n                entity: null,\n                suffix: null\n            };\n            switch (q) {\n              case \"none\":\n                t.entity = o;\n                break;\n              case \"hashtag\":\n            \n              case \"all\":\n                if ((s != -1)) {\n                    t.prefix = o.substr(0, s);\n                    t.entity = o.substr(s, p.length);\n                    t.suffix = o.substr((s + p.length));\n                }\n                 else t.suffix = o;\n            ;\n                break;\n              case \"word\":\n                if ((s != -1)) {\n                    t.prefix = o.substr(0, s);\n                    o = o.substr(s);\n                }\n            ;\n                var u = 0, v = 0;\n                while ((u < p.length)) {\n                    v = i(p, (u + 1), \"\\u00a0\");\n                    if ((o.substr(0, v) != p.substr(0, v))) {\n                        break;\n                    }\n                     else u = v;\n                ;\n                };\n                t.entity = (o.substr(0, u) || null);\n                t.suffix = (o.substr(u) || null);\n            };\n            return t;\n        },\n        getGrouping: function(n, o) {\n            var p = n.getAttribute(\"data-group\"), q = n.getAttribute(\"data-select\");\n            if ((o == \"select\")) {\n                return ((q == \"group\") ? p : \"none\");\n            }\n             else return p\n        ;\n        },\n        snapMarkerToText: function(n, o) {\n            var p = n.node;\n            if (g.isEntityNode(p)) {\n                var q = n.offset, r = m.getGrouping(p, o);\n                if ((r != \"none\")) {\n                    if ((q === 0)) {\n                        var s = p.previousSibling;\n                        if (l(p, s)) {\n                            return {\n                                node: s,\n                                offset: g.getLength(s)\n                            }\n                        };\n                    }\n                     else if ((q == g.getLength(p))) {\n                        var t = p.nextSibling;\n                        if (l(p, t)) {\n                            return {\n                                node: t,\n                                offset: 0\n                            }\n                        };\n                    }\n                    \n                \n                };\n            }\n        ;\n            return n;\n        },\n        nextMarkerBoundary: function(n, o, p) {\n            var q = n.node;\n            if ((g.isEntityNode(q) && ((!o || (n.offset !== 0))))) {\n                var r = m.getGrouping(q, p);\n                if ((r != \"none\")) {\n                    return {\n                        node: n.node,\n                        offset: k(g.getText(q), r, n.offset, o)\n                    }\n                };\n            }\n        ;\n            return n;\n        }\n    };\n    e.exports = m;\n});\n__d(\"StructuredInputCleaner\", [\"DOM\",\"createArrayFrom\",\"copyProperties\",\"StructuredInputUtil\",\"StructuredInputDOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"createArrayFrom\"), i = b(\"copyProperties\"), j = b(\"StructuredInputUtil\"), k = b(\"StructuredInputDOM\"), l = b(\"UserAgent\");\n    function m(n, o) {\n        this._node = n;\n        this._wrapText = o;\n    };\n    m.prototype._cleanEntityNode = function(n) {\n        var o = n.getAttribute(\"data-text\"), p = k.getText(n);\n        n.style.cssText = \"\";\n        if (((o == p) && k.containsOnlyText(n, {\n            I: true\n        }))) {\n            return null\n        };\n        var q = [], r = j.validateEntityText(n), s = k.createIconNode(JSON.parse(n.getAttribute(\"data-icon\")));\n        if ((!r.entity && ((((r.suffix && !r.prefix)) || ((r.prefix && !r.suffix)))))) {\n            k.convertToTextNode(n);\n            n.setAttribute(\"data-text\", p);\n            return null;\n        }\n    ;\n        if (r.prefix) {\n            q.push(this._createTextNode(r.prefix));\n        };\n        if (r.entity) {\n            g.setContent(n, (s ? [s,r.entity,] : r.entity));\n            n.setAttribute(\"data-text\", r.entity);\n            q.push(n);\n        }\n    ;\n        if (r.suffix) {\n            q.push(this._createTextNode(r.suffix));\n        };\n        return q;\n    };\n    m.prototype._removeSpecialNodes = function() {\n        var n = h(this._node.getElementsByTagName(\"script\")), o = h(this._node.getElementsByTagName(\"style\"));\n        n.forEach(g.remove);\n        o.forEach(g.remove);\n    };\n    m.prototype._collapseNodes = function() {\n        for (var n, o = this._node.firstChild; o; o = n) {\n            n = o.nextSibling;\n            if (((!g.isTextNode(o) && !k.isEntityNode(o)) && !k.containsOnlyText(o))) {\n                for (var p = o.lastChild; p; p = o.lastChild) {\n                    this._node.insertBefore(p, n);\n                    n = p;\n                }\n            };\n        };\n    };\n    m.prototype._createTextNode = function(n) {\n        if (this._wrapText) {\n            return k.createTextNode(n);\n        }\n         else return document.createTextNode(n)\n    ;\n    };\n    m.prototype.replaceNodes = function(n, o) {\n        if ((o == null)) {\n            return\n        };\n        var p = (n.length ? n[(n.length - 1)].nextSibling : null);\n        n.forEach(g.remove);\n        o.forEach(function(q) {\n            this._node.insertBefore(q, p);\n        }.bind(this));\n    };\n    m.prototype.clean = function() {\n        this._removeSpecialNodes();\n        this._collapseNodes();\n        var n = [], o = function() {\n            if (n.length) {\n                this.replaceNodes(n, this._cleanTextNodes(n));\n                n.length = 0;\n            }\n        ;\n        }.bind(this);\n        h(this._node.childNodes).forEach(function(p) {\n            if (k.isEntityNode(p)) {\n                this.replaceNodes([p,], this._cleanEntityNode(p));\n                o(n);\n            }\n             else n.push(p);\n        ;\n        }.bind(this));\n        o();\n        if ((!this._node.firstChild && l.firefox())) {\n            this._node.appendChild(this._createTextNode());\n        };\n    };\n    m.prototype.endOnText = function() {\n        var n = function(o, p) {\n            if (k.isEntityNode(o)) {\n                this._node.insertBefore(this._createTextNode(), (p ? o : null));\n            };\n        }.bind(this);\n        n(this._node.firstChild, true);\n        n(this._node.lastChild, false);\n    };\n    i(m.prototype, {\n        _cleanTextNodes: (function() {\n            var n = function(p) {\n                return (((p.nodeName === \"BR\") || ((p.nodeName === \"SPAN\") && o(p))));\n            }, o = function(p) {\n                return ((p.getAttribute(\"data-si\") && k.containsOnlyText(p)) && (k.getLength(p) > 0));\n            };\n            return function(p) {\n                if (((p.length != 1) || !n(p[0]))) {\n                    var q = p.map(k.getText).join(\"\").replace(/\\s+/g, \" \");\n                    return (q ? [this._createTextNode(q),] : []);\n                }\n                 else {\n                    p[0].style.cssText = \"\";\n                    return;\n                }\n            ;\n            };\n        })()\n    });\n    e.exports = m;\n});\n__d(\"DOMSelection\", [], function(a, b, c, d, e, f) {\n    (function() {\n        var g = this, h = {\n            isPreceding: function(n, o) {\n                return (o.compareDocumentPosition(n) & 2);\n            },\n            contains: function(n, o) {\n                if ((n.compareDocumentPosition != null)) {\n                    return (n.compareDocumentPosition(o) & 16);\n                }\n                 else return n.contains(o)\n            ;\n            },\n            isCursorPreceding: function(n, o, p, q) {\n                if ((n === p)) {\n                    return (o <= q)\n                };\n                if ((h.isText(n) && h.isText(p))) {\n                    return h.isPreceding(n, p)\n                };\n                if ((h.isText(n) && !h.isText(p))) {\n                    return !h.isCursorPreceding(p, q, n, o)\n                };\n                if (!h.contains(n, p)) {\n                    return h.isPreceding(n, p)\n                };\n                if ((n.childNodes.length <= o)) {\n                    return false\n                };\n                if ((n.childNodes[o] === p)) {\n                    return (0 <= q)\n                };\n                return h.isPreceding(n.childNodes[o], p);\n            },\n            isText: function(n) {\n                return (((n != null) ? (n.nodeType == 3) : false));\n            },\n            getChildIndex: function(n) {\n                var o = 0;\n                while (n = n.previousSibling) {\n                    o++;;\n                };\n                return o;\n            }\n        }, i = g.Selection = (function() {\n            function n(o) {\n                this.win = o;\n            };\n            n.prototype.hasSelection = function() {\n                return n.hasSelection(this.win);\n            };\n            n.prototype.isBidirectional = function() {\n                return n.isBidirectional(this.win);\n            };\n            n.prototype.getOrigin = function() {\n                return n.getOrigin(this.win);\n            };\n            n.prototype.getFocus = function() {\n                return n.getFocus(this.win);\n            };\n            n.prototype.getStart = function() {\n                return n.getStart(this.win);\n            };\n            n.prototype.getEnd = function() {\n                return n.getEnd(this.win);\n            };\n            n.prototype.trySelection = function(o, p, q, r) {\n                return n.trySelection(this.win, o, p, q, r);\n            };\n            n.prototype.setSelection = function(o, p, q, r) {\n                return n.setSelection(this.win, o, p, q, r);\n            };\n            n.prototype.clearSelection = function() {\n                return n.clearSelection(this.win);\n            };\n            return n;\n        })();\n        function j() {\n            if ((g.document.selection && /MSIE 9\\./.test(navigator.userAgent))) {\n                return false;\n            }\n             else return !!g.getSelection\n        ;\n        };\n        if (j()) {\n            i.supported = true;\n            i.hasSelection = function(n) {\n                var o;\n                return (((o = n.getSelection()) && ((o.focusNode != null))) && ((o.anchorNode != null)));\n            };\n            i.isBidirectional = function(n) {\n                return true;\n            };\n            i.getOrigin = function(n) {\n                var o;\n                if (!(((o = n.getSelection()) && ((o.anchorNode != null))))) {\n                    return null\n                };\n                return [o.anchorNode,o.anchorOffset,];\n            };\n            i.getFocus = function(n) {\n                var o;\n                if (!(((o = n.getSelection()) && ((o.focusNode != null))))) {\n                    return null\n                };\n                return [o.focusNode,o.focusOffset,];\n            };\n            i.getStart = function(n) {\n                var o, p, q, r, s, t;\n                if (!i.hasSelection(n)) {\n                    return null\n                };\n                s = i.getOrigin(n), o = s[0], q = s[1];\n                t = i.getFocus(n), p = t[0], r = t[1];\n                if (h.isCursorPreceding(o, q, p, r)) {\n                    return [o,q,]\n                };\n                return [p,r,];\n            };\n            i.getEnd = function(n) {\n                var o, p, q, r, s, t;\n                if (!i.hasSelection(n)) {\n                    return null\n                };\n                s = i.getOrigin(n), o = s[0], q = s[1];\n                t = i.getFocus(n), p = t[0], r = t[1];\n                if (h.isCursorPreceding(o, q, p, r)) {\n                    return [p,r,]\n                };\n                return [o,q,];\n            };\n            var k = function(n, o, p, q, s, t) {\n                var u = o.getSelection();\n                if (!u) {\n                    return\n                };\n                if ((s == null)) {\n                    s = p;\n                };\n                if ((t == null)) {\n                    t = q;\n                };\n                if ((u.collapse && u.extend)) {\n                    u.collapse(p, q);\n                    u.extend(s, t);\n                }\n                 else {\n                    r = o.document.createRange();\n                    r.setStart(p, q);\n                    r.setEnd(s, t);\n                    if (((n || !i.hasSelection(o)) || (((((r.endContainer === s) && (r.endOffset === t)) && (r.startContainer === p)) && (r.startOffset === q))))) {\n                        try {\n                            u.removeAllRanges();\n                        } catch (v) {\n                        \n                        };\n                        u.addRange(r);\n                    }\n                ;\n                }\n            ;\n            };\n            i.setSelection = k.bind(i, true);\n            i.trySelection = k.bind(i, false);\n            i.clearSelection = function(n) {\n                try {\n                    var p = n.getSelection();\n                    if (!p) {\n                        return\n                    };\n                    p.removeAllRanges();\n                } catch (o) {\n                \n                };\n            };\n            i.getText = function(n) {\n                var o = n.getSelection();\n                if (!o) {\n                    return\n                };\n                return o.toString();\n            };\n        }\n         else if (g.document.selection) {\n            var l = function(n, o, p) {\n                var q, r, s, t, u;\n                r = n.createElement(\"a\");\n                q = o.duplicate();\n                q.collapse(p);\n                u = q.parentElement();\n                while (true) {\n                    u.insertBefore(r, r.previousSibling);\n                    q.moveToElementText(r);\n                    if (!(((q.compareEndPoints(((p ? \"StartToStart\" : \"StartToEnd\")), o) > 0) && ((r.previousSibling != null))))) {\n                        break;\n                    };\n                };\n                if (((q.compareEndPoints(((p ? \"StartToStart\" : \"StartToEnd\")), o) === -1) && r.nextSibling)) {\n                    q.setEndPoint(((p ? \"EndToStart\" : \"EndToEnd\")), o);\n                    s = r.nextSibling;\n                    t = q.text.length;\n                }\n                 else {\n                    s = r.parentNode;\n                    t = h.getChildIndex(r);\n                }\n            ;\n                r.parentNode.removeChild(r);\n                return [s,t,];\n            }, m = function(n, o, p, q, r) {\n                var s, t, u, v, w;\n                w = 0;\n                s = (h.isText(q) ? q : q.childNodes[r]);\n                t = (h.isText(q) ? q.parentNode : q);\n                if (h.isText(q)) {\n                    w = r;\n                };\n                v = n.createElement(\"a\");\n                t.insertBefore(v, (s || null));\n                u = n.body.createTextRange();\n                u.moveToElementText(v);\n                v.parentNode.removeChild(v);\n                o.setEndPoint(((p ? \"StartToStart\" : \"EndToEnd\")), u);\n                return o[(p ? \"moveStart\" : \"moveEnd\")](\"character\", w);\n            };\n            i.supported = true;\n            i.hasSelection = function(n) {\n                var o;\n                if (!n.document.selection) {\n                    return false\n                };\n                o = n.document.selection.createRange();\n                return (o && (o.parentElement().document === n.document));\n            };\n            i.getStart = function(n) {\n                var o;\n                if (!i.hasSelection(n)) {\n                    return null\n                };\n                o = n.document.selection.createRange();\n                return l(n.document, o, true);\n            };\n            i.getEnd = function(n) {\n                var o;\n                if (!i.hasSelection(n)) {\n                    return null\n                };\n                o = n.document.selection.createRange();\n                return l(n.document, o, false);\n            };\n            i.isBidirectional = function(n) {\n                return false;\n            };\n            i.getOrigin = function(n) {\n                return i.getStart(n);\n            };\n            i.getFocus = function(n) {\n                return i.getEnd(n);\n            };\n            var k = function(n, o, p, q, r, s) {\n                if ((r == null)) {\n                    r = p;\n                };\n                if ((s == null)) {\n                    s = q;\n                };\n                var t = o.document.body.createTextRange();\n                m(o.document, t, false, r, s);\n                m(o.document, t, true, p, q);\n                return t.select();\n            };\n            i.setSelection = k.bind(i, true);\n            i.trySelection = k.bind(i, false);\n            i.clearSelection = function(n) {\n                return n.document.selection.empty();\n            };\n            i.getText = function(n) {\n                if (!i.hasSelection(n)) {\n                    return null\n                };\n                var o = n.document.selection.createRange();\n                return (o && o.text);\n            };\n        }\n         else i.supported = false;\n        \n    ;\n    }).call(this);\n    e.exports = Selection;\n});\n__d(\"StructuredInputSelection\", [\"DOMSelection\",\"Vector\",\"StructuredInputUtil\",\"StructuredInputDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMSelection\"), h = b(\"Vector\"), i = b(\"StructuredInputUtil\"), j = b(\"StructuredInputDOM\");\n    function k(m) {\n        var n = m.ownerDocument;\n        this.window = (n.defaultView || n.parentWindow);\n        this.root = m;\n        this.selection = false;\n        this.start = new l(this, []);\n        this.end = new l(this, []);\n        this.update();\n    };\n    k.prototype.isSupported = function() {\n        return !!((g && g.hasSelection));\n    };\n    k.prototype.update = function() {\n        this.selection = false;\n        if ((this.isSupported() && (this.root == document.activeElement))) {\n            if (g.hasSelection(this.window)) {\n                var m = g.getStart(this.window), n = g.getEnd(this.window), o = g.getFocus(this.window);\n                this.start = this.makeMarker(m);\n                this.end = this.makeMarker(n);\n                this.backward = ((m[0] == o[0]) && (m[1] == o[1]));\n                this.selection = (this.start.node && this.end.node);\n            }\n        \n        };\n    };\n    k.prototype.makeMarker = function(m) {\n        if ((m[0] === this.root)) {\n            return new l(this, [this.root.childNodes[m[1]],0,]);\n        }\n         else return new l(this, m)\n    ;\n    };\n    k.prototype.getFocus = function() {\n        return (this.backward ? this.start : this.end);\n    };\n    k.prototype.getOrigin = function() {\n        return (this.backward ? this.end : this.start);\n    };\n    k.prototype.move = function(m) {\n        if (this.selection) {\n            this.start.move(m);\n            this.start.snap();\n            this.end.setPosition(this.start);\n            return this.apply();\n        }\n    ;\n    };\n    k.prototype.expand = function(m) {\n        if (this.selection) {\n            if (g.isBidirectional()) {\n                this.start.move(!m);\n                this.start.snap();\n                this.end.move(m);\n                this.end.snap();\n            }\n        ;\n            return this.apply();\n        }\n    ;\n    };\n    k.prototype.getText = function() {\n        if ((this.selection && this.isSupported())) {\n            var m = g.getText(this.window);\n            return m;\n        }\n    ;\n    };\n    k.prototype.getOffset = function() {\n        if (this.selection) {\n            return this.start.rootOffset\n        };\n    };\n    k.prototype.getLength = function() {\n        return ((this.getText() || \"\")).length;\n    };\n    k.prototype.setPosition = function(m, n) {\n        this.backward = false;\n        this.selection = true;\n        this.start.setPosition(i.getMarkerAtOffset(this.root, m));\n        this.start.snap();\n        if ((n > 0)) {\n            this.end.setPosition(i.getMarkerAtOffset(this.root, (m + n)));\n            this.end.snap();\n        }\n         else this.end.setPosition(this.start);\n    ;\n        return this.apply();\n    };\n    k.prototype.hasRange = function() {\n        return (this.selection && (((this.start.node != this.end.node) || (this.start.offset != this.end.offset))));\n    };\n    k.prototype.scrollToFocus = function() {\n        var m = 5, n = this.getFocus();\n        if (n.node) {\n            var o = h.getElementDimensions(this.root).x, p = this.root.scrollLeft, q = (n.node.offsetLeft + n.node.offsetWidth);\n            if (((q - p) < m)) {\n                this.root.scrollLeft = (q - m);\n            }\n             else if (((q - p) > (o - m))) {\n                this.root.scrollLeft = ((q - o) + m);\n            }\n        ;\n        }\n    ;\n    };\n    k.prototype.apply = function() {\n        if ((this.start.hasChanged() || this.end.hasChanged())) {\n            var m = this.getOrigin().getMarker(true), n = this.getFocus().getMarker(true);\n            this.selection = ((((this.selection && m) && m.node) && n) && n.node);\n            if ((this.selection && this.isSupported())) {\n                this.start.changed = false;\n                this.end.changed = false;\n                g.trySelection(this.window, m.node, m.offset, n.node, n.offset);\n                return true;\n            }\n        ;\n        }\n    ;\n    };\n    function l(m, n) {\n        this.selection = m;\n        this.node = n[0];\n        this.offset = n[1];\n        this.rootOffset = this.getRootOffset(n[0], n[1]);\n        this.sibling = (this.node && this.node.previousSibling);\n        this.changed = false;\n    };\n    l.prototype.hasChanged = function() {\n        return (this.changed || !this.isNodeValid());\n    };\n    l.prototype.isNodeValid = function() {\n        if ((j.getLength(this.node) > this.offset)) {\n            var m = this.node;\n            while (m = m.parentNode) {\n                if ((m == this.selection.root)) {\n                    return true\n                };\n            };\n        }\n    ;\n    };\n    l.prototype.getMarker = function(m) {\n        if ((this.isNodeValid() && ((((m && !this.node.firstChild)) || ((!m && (this.node.parentNode == this.selection.root))))))) {\n            return this;\n        }\n         else return j.getMarker(this.selection.root, this.rootOffset, m)\n    ;\n    };\n    l.prototype.move = function(m) {\n        (this.node && this.setPosition(i.nextMarkerBoundary(this.getMarker(false), m, \"select\")));\n    };\n    l.prototype.snap = function() {\n        (this.node && this.setPosition(i.snapMarkerToText(this.getMarker(false), \"select\")));\n    };\n    l.prototype.setPosition = function(m) {\n        if (((m.offset != this.offset) || (m.node != this.node))) {\n            this.changed = true;\n            this.node = m.node;\n            this.offset = m.offset;\n            this.rootOffset = this.getRootOffset(this.node, this.offset);\n        }\n    ;\n    };\n    l.prototype.getRootOffset = function(m, n) {\n        var o = 0, p = 5;\n        while ((m && (o++ < p))) {\n            if ((m === this.selection.root)) {\n                return n;\n            }\n             else {\n                var q = m;\n                while (q = q.previousSibling) {\n                    n += j.getLength(q);;\n                };\n                m = m.parentNode;\n            }\n        ;\n        };\n    };\n    e.exports = k;\n});\n__d(\"StructuredInput\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"cx\",\"csx\",\"DataStore\",\"DOM\",\"Input\",\"InputSelection\",\"Keys\",\"Parent\",\"requestAnimationFrame\",\"StructuredInputCleaner\",\"StructuredInputDOM\",\"StructuredInputSelection\",\"StructuredInputUtil\",\"Style\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"CSS\"), k = b(\"cx\"), l = b(\"csx\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Input\"), p = b(\"InputSelection\"), q = b(\"Keys\"), r = b(\"Parent\"), s = b(\"requestAnimationFrame\"), t = b(\"StructuredInputCleaner\"), u = b(\"StructuredInputDOM\"), v = b(\"StructuredInputSelection\"), w = b(\"StructuredInputUtil\"), x = b(\"Style\"), y = b(\"UserAgent\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"createObjectFrom\"), ca = b(\"emptyFunction\"), da = 229, ea = ba([q.UP,q.DOWN,q.LEFT,q.RIGHT,]), fa = ba([q.BACKSPACE,q.DELETE,]), ga = ba([q.SPACE,q.RETURN,]), ha = ba(\"IUB\".split(\"\").map(function(qa) {\n        return qa.charCodeAt(0);\n    })), ia = y.firefox(), ja = y.ie(), ka = y.webkit(), la = b(\"mixin\"), ma = la(i);\n    for (var na in ma) {\n        if ((ma.hasOwnProperty(na) && (na !== \"_metaprototype\"))) {\n            pa[na] = ma[na];\n        };\n    };\n    var oa = ((ma === null) ? null : ma.prototype);\n    pa.prototype = Object.create(oa);\n    pa.prototype.constructor = pa;\n    pa.__superConstructor__ = ma;\n    function pa(qa) {\n        m.set(qa, \"StructuredInput\", this);\n        this._root = qa;\n        this._richInput = n.find(qa, \".-cx-PUBLIC-uiStructuredInput__rich\");\n        this._textInput = n.find(qa, \".-cx-PUBLIC-uiStructuredInput__text\");\n        this._placeholderText = n.scry(qa, \".-cx-PUBLIC-uiStructuredInput__placeholder\")[0];\n        this._hintText = n.find(qa, \".-cx-PUBLIC-uiStructuredInput__hint\");\n        this._contentWidth = null;\n        this._richWidth = null;\n        this._hintNodes = [];\n        this.init();\n    };\n    pa.prototype.init = function() {\n        this.init = ca;\n        this._initSelection();\n        this._initCleaner();\n        this._initInputs();\n        this._initEvents();\n        this._scheduledCleanInput = false;\n        this._richChanged = false;\n        this._textChanged = false;\n        this._selectionChanged = false;\n        this._selectionIgnore = false;\n        this._imeMode = false;\n        this.cleanInput();\n        this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n    };\n    pa.prototype._initInputs = function() {\n        this._richInput.contentEditable = true;\n        this._richInput.spellcheck = false;\n        this._richInput.tabIndex = 0;\n        this._textInput.tabIndex = -1;\n        this._multiline = (this._textInput.nodeName == \"TEXTAREA\");\n        if (!j.shown(this._richInput)) {\n            var qa = p.get(this._textInput);\n            n.setContent(this._richInput, u.encodeText(o.getValue(this._textInput)));\n            j.hide(this._textInput);\n            j.show(this._richInput);\n            this.cleanInput();\n            this.setSelection({\n                offset: qa.start,\n                length: (qa.end - qa.start)\n            });\n        }\n    ;\n        this.togglePlaceholder();\n        this._toggleHint();\n    };\n    pa.prototype._initEvents = function() {\n        var qa = null;\n        g.listen(this._richInput, \"keydown\", function(ra) {\n            qa = ra.keyCode;\n            if ((ra.ctrlKey && (ra.keyCode in ha))) {\n                return ra.kill();\n            }\n             else if ((ra.keyCode in ea)) {\n                this._selectionChanged = true;\n                this.scheduleCleanInput(false);\n            }\n             else if ((ra.keyCode in fa)) {\n                this._richChanged = true;\n                this.scheduleCleanInput(true);\n                if ((ra.keyCode === q.BACKSPACE)) {\n                    if (this._deleteTrailingChunk()) {\n                        return ra.kill()\n                    }\n                };\n            }\n             else if ((ra.keyCode == da)) {\n                this._imeMode = true;\n                j.hide(this._placeholderText);\n            }\n            \n            \n            \n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"keyup\", function(ra) {\n            if ((((this._imeMode || (ra.keyCode != qa))) && (ra.keyCode in ga))) {\n                this._imeMode = false;\n                this._richChanged = true;\n                this.scheduleCleanInput();\n                return ra.kill();\n            }\n             else if (this._imeMode) {\n                this._textChanged = true;\n                this.cleanInput();\n            }\n            \n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"keypress\", function(ra) {\n            if ((ra.keyCode == q.RETURN)) {\n                (this._multiline && this._insertText(\"\\u000a\"));\n                return ra.kill();\n            }\n             else if ((!this._selectionChanged && this._selectionIsText())) {\n                this._textChanged = true;\n                this.scheduleCleanInput(false);\n            }\n             else {\n                this._richChanged = true;\n                this.scheduleCleanInput(true);\n            }\n            \n        ;\n        }.bind(this));\n        g.listen(document, \"selectionchange\", function() {\n            if (this._selectionIgnore) {\n                this._selectionIgnore = false;\n            }\n             else this._selectionChanged = true;\n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"mousedown\", function() {\n            this._selectionChanged = true;\n            this._selectionLength = 0;\n            this._selectionOffset = 0;\n        }.bind(this));\n        g.listen(this._richInput, \"mouseup\", function() {\n            this._selectionChanged = true;\n            s(this.cleanInput.bind(this));\n        }.bind(this));\n        g.listen(this._richInput, \"cut\", function() {\n            this._richChanged = true;\n            this.scheduleCleanInput(false);\n        }.bind(this));\n        g.listen(this._richInput, \"paste\", function(ra) {\n            if (this._insertClipboard(((ra && ra.clipboardData) || window.clipboardData))) {\n                return ra.kill();\n            }\n             else {\n                this._richChanged = true;\n                this.scheduleCleanInput(true);\n            }\n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"drop\", function(ra) {\n            this.focus();\n            this.selectAll();\n            this._insertClipboard((ra && ra.dataTransfer));\n            return ra.kill();\n        }.bind(this));\n        g.listen(this._richInput, \"dragover\", function(ra) {\n            ra.dataTransfer.dropEffect = \"move\";\n            ra.dataTransfer.effectAllowed = \"move\";\n            return ra.kill();\n        });\n        g.listen(this._richInput, \"focus\", function(ra) {\n            this._toggleHint();\n            this.inform(\"focus\");\n        }.bind(this));\n        g.listen(this._richInput, \"blur\", function(ra) {\n            j.hide(this._hintText);\n            this._imeMode = false;\n            this._richChanged = true;\n            this.scheduleCleanInput(false);\n            this.inform(\"blur\");\n        }.bind(this));\n    };\n    pa.prototype._initCleaner = function() {\n        this._cleaner = new t(this._richInput, true);\n    };\n    pa.prototype._initSelection = function() {\n        this._selection = new v(this._richInput);\n        this._selectionLength = 0;\n        this._selectionOffset = 0;\n    };\n    pa.prototype._insertClipboard = function(qa) {\n        if ((qa && qa.getData)) {\n            var ra = (qa.types && aa(qa.types));\n            if (!ra) {\n                this._insertText(qa.getData(\"Text\"));\n            }\n             else if ((ra.indexOf(\"text/html\") != -1)) {\n                this._insertHTML(qa.getData(\"text/html\"));\n            }\n             else if ((ra.indexOf(\"text/plain\") != -1)) {\n                this._insertText(qa.getData(\"text/plain\"));\n            }\n            \n        ;\n            return true;\n        }\n         else return false\n    ;\n    };\n    pa.prototype._deleteTrailingChunk = function(qa) {\n        var ra = this.getSelection();\n        if (((ra.length > 0) || (ra.offset === 0))) {\n            return false\n        };\n        var sa = (this.getSelection().offset - 1), ta = w.getMarkerAtOffset(this._richInput, sa);\n        if (((ta && u.isEntityNode(ta.node)) && (w.getGrouping(ta.node, \"select\") !== \"none\"))) {\n            n.remove(ta.node);\n            return true;\n        }\n    ;\n        return false;\n    };\n    pa.prototype._selectionIsText = function() {\n        var qa = this._selection.start.node, ra = this._selection.end.node;\n        return (((qa && (qa === ra)) && !u.isEntityNode(qa)) && !u.isEntityNode(qa.parentNode));\n    };\n    pa.prototype._insertText = function(qa) {\n        if (qa) {\n            var ra = n.create(\"div\", {\n            }, qa);\n            return this._insertNodes(ra);\n        }\n    ;\n    };\n    pa.prototype._insertNodes = function(qa) {\n        if (document.selection) {\n            document.selection.createRange().pasteHTML(qa.innerHTML);\n        }\n         else document.execCommand(\"insertHTML\", false, qa.innerHTML);\n    ;\n        this._richChanged = true;\n        this.cleanInput();\n    };\n    pa.prototype.togglePlaceholder = function(qa) {\n        if (!this._placeholderText) {\n            return\n        };\n        var ra = (u.getLength(this._richInput) === 0);\n        if ((qa && ra)) {\n            j.show(this._placeholderText);\n        }\n         else j.conditionShow(this._placeholderText, (ra && !this._imeMode));\n    ;\n    };\n    pa.prototype._toggleHint = function() {\n        var qa = aa(this._hintNodes), ra = null, sa = \"\", ta = u.getText(this._richInput).toLowerCase();\n        if (!this.hasFocus()) {\n            return\n        };\n        if (this._contentOverflows()) {\n            j.hide(this._hintText);\n            return;\n        }\n    ;\n        while ((qa.length && (sa.length < ta.length))) {\n            ra = qa.shift();\n            sa += u.getText(ra);\n        };\n        if ((ta.length && (sa.substr(0, ta.length).toLowerCase() == ta.toLowerCase()))) {\n            n.setContent(this._hintText, aa(this._richInput.cloneNode(true).childNodes));\n            var ua = u.createTextNode(sa.substr(ta.length));\n            qa.unshift(ua);\n            n.appendContent(this._hintText, n.create(\"span\", {\n                className: \"-cx-PUBLIC-uiStructuredInput__hintsuffix\"\n            }, qa));\n            j.show(this._hintText);\n            j.hide(this._placeholderText);\n        }\n         else j.hide(this._hintText);\n    ;\n    };\n    pa.prototype._contentOverflows = function() {\n        if ((this._richWidth === null)) {\n            this._richWidth = this._richInput.clientWidth;\n        };\n        if ((this._contentWidth === null)) {\n            var qa = this._richInput.lastChild;\n            this._contentWidth = (n.isElementNode(qa) ? (qa.offsetLeft + qa.offsetWidth) : 0);\n        }\n    ;\n        return (this._contentWidth > this._richWidth);\n    };\n    pa.prototype._forceTop = function() {\n        if (!this._multiline) {\n            this._richInput.scrollTop = 0;\n        };\n        this._root.scrollTop = 0;\n    };\n    pa.prototype._createStructureNodes = function(qa) {\n        return qa.map(function(ra) {\n            return ((ra.uid || ((ra.type && (ra.type != \"text\")))) ? u.createEntityNode(ra, (ra.display || {\n            })) : u.createTextNode(ra.text));\n        }.bind(this));\n    };\n    pa.prototype._suppressInput = function() {\n        if ((ia || ja)) {\n            if (this._richClean) {\n                return\n            };\n            this._richClean = this._richInput.cloneNode(true);\n            this._richClean.contentEditable = false;\n            this._root.insertBefore(this._richClean, this._richInput.nextSibling);\n            this._richClean.scrollLeft = this._richInput.scrollLeft;\n            x.set(this._richInput, \"padding\", 0);\n            x.set(this._richInput, \"height\", 0);\n        }\n    ;\n    };\n    pa.prototype._revealInput = function() {\n        if (!this._richClean) {\n            return\n        };\n        x.set(this._richInput, \"height\", \"\");\n        x.set(this._richInput, \"padding\", \"\");\n        this._root.removeChild(this._richClean);\n        this.focus();\n        this._richClean = null;\n    };\n    pa.prototype._cleanInput = function() {\n        var qa;\n        if ((this._textChanged && !this._richChanged)) {\n            this._selection.update();\n            qa = \"change\";\n        }\n         else if ((this._richChanged || this._selectionChanged)) {\n            this._selection.update();\n            if (this._richChanged) {\n                this._contentWidth = null;\n                this._cleaner.clean();\n                this._cleaner.endOnText();\n                this._selection.apply();\n                qa = \"change\";\n            }\n        ;\n            if (this._selectionChanged) {\n                this._cleanSelection();\n                if ((this._selectionLength || !this._richChanged)) {\n                    qa = \"select\";\n                };\n            }\n        ;\n        }\n        \n    ;\n        this._revealInput();\n        this._forceTop();\n        if ((this._richChanged || this._textChanged)) {\n            this.togglePlaceholder();\n            this._toggleHint();\n        }\n    ;\n        this._selectionIgnore = true;\n        this._selectionChanged = false;\n        this._richChanged = false;\n        this._textChanged = false;\n        (qa && this.inform(qa));\n    };\n    pa.prototype._cleanSelection = function() {\n        var qa = this._selection.getLength(), ra = this._selection.getOffset();\n        if (qa) {\n            this._selection.expand((qa >= this._selectionLength));\n            qa = this._selection.getLength();\n            ra = this._selection.getOffset();\n        }\n    ;\n        this._selectionLength = qa;\n        this._selectionOffset = ra;\n    };\n    pa.prototype.cleanInput = function() {\n        (this._scheduledCleanInput || this._cleanInput());\n    };\n    pa.prototype.scheduleCleanInput = function(qa) {\n        (qa && this._suppressInput());\n        if (!this._scheduledCleanInput) {\n            this._scheduledCleanInput = true;\n            s(function() {\n                this._cleanInput();\n                this._scheduledCleanInput = false;\n            }.bind(this));\n        }\n    ;\n    };\n    pa.prototype.setEnabled = function(qa) {\n        this._textInput.disabled = !qa;\n        this._richInput.contentEditable = qa;\n    };\n    pa.prototype.getRoot = function() {\n        return this._root;\n    };\n    pa.prototype.getRichInput = function() {\n        return this._richInput;\n    };\n    pa.prototype.getEnabled = function() {\n        return !this._textInput.disabled;\n    };\n    pa.prototype.getText = function() {\n        return u.getDecodedText(this._richInput);\n    };\n    pa.prototype.setText = function(qa) {\n        n.setContent(this._richInput, u.createTextNode(qa));\n        this._richChanged = false;\n        this._selectionChanged = false;\n        this.inform(\"change\");\n    };\n    pa.prototype.setHint = function(qa) {\n        this._hintNodes = this._createStructureNodes(qa);\n        this._toggleHint();\n    };\n    pa.prototype.getStructure = function() {\n        var qa = [];\n        aa(this._richInput.childNodes).forEach(function(ra) {\n            var sa = !n.isTextNode(ra), ta = u.getDecodedText(ra);\n            (ta.length && qa.push({\n                text: ta,\n                uid: (sa ? ra.getAttribute(\"data-uid\") : null),\n                type: (((sa && ra.getAttribute(\"data-type\"))) || \"text\")\n            }));\n        }.bind(this));\n        return qa;\n    };\n    pa.prototype.setStructure = function(qa) {\n        n.setContent(this._richInput, this._createStructureNodes(qa));\n        this._cleaner.endOnText();\n        this._cleaner.clean();\n        this.togglePlaceholder();\n        this._toggleHint();\n        this._richChanged = false;\n        this._selectionChanged = false;\n        this.inform(\"change\");\n    };\n    pa.prototype.getContentDimensions = function() {\n        var qa = this._richInput.lastChild;\n        return {\n            width: (qa ? (qa.offsetLeft + qa.offsetWidth) : 0),\n            height: (qa ? (qa.offsetTop + qa.offsetHeight) : 0)\n        };\n    };\n    pa.prototype.getSelection = function() {\n        return {\n            offset: this._selection.getOffset(),\n            length: this._selection.getLength()\n        };\n    };\n    pa.prototype.setSelection = function(qa) {\n        if (this.hasFocus()) {\n            this._selection.update();\n            this._selection.setPosition(qa.offset, qa.length);\n            this._selection.scrollToFocus();\n            this._selectionChanged = false;\n            this.inform(\"select\");\n        }\n    ;\n    };\n    pa.prototype.moveSelectionToEnd = function() {\n        this.setSelection({\n            length: 0,\n            offset: u.getLength(this._richInput)\n        });\n    };\n    pa.prototype.isSelectionAtEnd = function() {\n        var qa = this.getSelection().offset, ra = u.getLength(this._richInput);\n        return (qa >= ra);\n    };\n    pa.prototype.selectAll = function() {\n        this.setSelection({\n            offset: 0,\n            length: u.getLength(this._richInput)\n        });\n    };\n    pa.prototype.hasFocus = function() {\n        return n.contains(this._root, document.activeElement);\n    };\n    pa.prototype.focus = function() {\n        this._richInput.focus();\n    };\n    pa.prototype.blur = function() {\n        var qa = n.create(\"input\", {\n            type: \"text\",\n            tabIndex: -1,\n            style: {\n                position: \"absolute\",\n                top: 0,\n                left: \"-100px\",\n                width: \"1px\",\n                height: \"1px\"\n            }\n        });\n        n.appendContent(this._root, qa);\n        var ra = function() {\n            if ((this.hasFocus() || ((ka && (document.activeElement === document.body))))) {\n                qa.focus();\n                qa.blur();\n            }\n        ;\n        };\n        this.blur = ra;\n        this.blur();\n    };\n    pa.getInstance = function(qa) {\n        var ra = r.byClass(qa, \"-cx-PRIVATE-uiStructuredInput__root\");\n        return (ra ? m.get(ra, \"StructuredInput\") : null);\n    };\n    z(pa.prototype, {\n        _insertHTML: (function() {\n            var qa = n.create(\"div\"), ra = new t(qa, false);\n            return function(sa) {\n                if (sa) {\n                    qa.innerHTML = sa;\n                    ra.clean();\n                    return this._insertNodes(qa);\n                }\n            ;\n            };\n        })()\n    });\n    e.exports = pa;\n});\n__d(\"FacebarTypeaheadWebSearch\", [\"startsWith\",\"FacebarStructuredFragment\",\"FacebarStructuredText\",], function(a, b, c, d, e, f) {\n    var g = b(\"startsWith\"), h = b(\"FacebarStructuredFragment\"), i = b(\"FacebarStructuredText\"), j = new h({\n        type: \"ent:websuggestion\",\n        text: \"Web Search: \",\n        uid: null\n    }), k = j.getText().toLowerCase().trim();\n    function l(o, p) {\n        if ((!o || (o.type !== \"websuggestion\"))) {\n            return\n        };\n        var q = p.getValue().toArray();\n        q.forEach(function(r) {\n            if (((r.isType(\"ent\") && !r.isType(\"ent\", \"user\")) && r.getUID())) {\n                if (o.extra_uri_params) {\n                    o.extra_uri_params.qh = r.getUID();\n                    return;\n                }\n            \n            };\n        });\n    };\n    function m(o) {\n        return (o.getType() === j.getType());\n    };\n    function n(o) {\n        this._core = o.getCore();\n        this._view = o.getView();\n        this._input = this._core.input;\n        this._isEnabled = false;\n    };\n    n.prototype.enable = function() {\n        this._isEnabled = true;\n        this.changeListener = this._input.subscribe(\"change\", this._changeWebSearch.bind(this));\n        this.lockListener = this._input.subscribe(\"shortcut\", this._lockWebSearch.bind(this));\n        this.beforeSelectListener = this._view.subscribe(\"beforeSelect\", this._beforeSelect.bind(this));\n        this.beforeRenderListener = this._view.subscribe(\"beforeRender\", this._beforeRender.bind(this));\n    };\n    n.prototype._changeWebSearch = function() {\n        var o = this._input.getValue(), p = o.toArray(), q = p[0];\n        if ((q && (q.getType() === \"text\"))) {\n            if (g(q.getText().toLowerCase(), k)) {\n                p.splice(0, 1, j, new h({\n                    text: q.getText().substr(k.length).replace(/^ /, \"\")\n                }));\n                this._replaceFragments(p);\n            }\n             else if (((p.length > 1) && p.some(m))) {\n                this._replaceFragments([new h({\n                    text: o.toString()\n                }),]);\n            }\n        \n        };\n    };\n    n.prototype._replaceFragments = function(o) {\n        this._input.storeSelection();\n        this._input.setValue(new i(o));\n        this._input.restoreSelection();\n    };\n    n.prototype._beforeSelect = function(o, p) {\n        l(p.selected, this._input);\n        return true;\n    };\n    n.prototype._beforeRender = function(o, p) {\n        var q = this._input.getValue().toArray()[0], r = (q && m(q));\n        p.results.forEach(function(s) {\n            if ((s.type === \"websuggestion\")) {\n                s.isLockedWebSearchMode = r;\n            };\n        });\n        return true;\n    };\n    n.prototype._lockWebSearch = function(o, p) {\n        if (p.shift) {\n            var q = this._input.getValue().toArray()[0];\n            if ((!q || !m(q))) {\n                this._input.setValue(new i([j,]));\n            };\n        }\n    ;\n    };\n    n.prototype.disable = function() {\n        this.beforeSelectListener.unsubscribe();\n        this.changeListener.unsubscribe();\n        this.lockListener.unsubscribe();\n        this.beforeRenderListener.unsubscribe();\n        this._isEnabled = false;\n    };\n    n.addPrefix = function(o) {\n        if (!m(o.getFragment(0))) {\n            var p = [j,].concat(o.toArray());\n            return new i(p);\n        }\n         else return o\n    ;\n    };\n    e.exports = n;\n});\n__d(\"FacebarTypeaheadCore\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"Animation\",\"arrayContains\",\"Base64\",\"copyProperties\",\"csx\",\"CSS\",\"DOM\",\"FacebarStructuredText\",\"FacebarTypeaheadInput\",\"FacebarTypeaheadWebSearch\",\"invariant\",\"Keys\",\"startsWith\",\"Style\",\"URI\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Animation\"), k = b(\"arrayContains\"), l = b(\"Base64\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"FacebarStructuredText\"), r = b(\"FacebarTypeaheadInput\"), s = b(\"FacebarTypeaheadWebSearch\"), t = b(\"invariant\"), u = b(\"Keys\"), v = b(\"startsWith\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"mixin\"), z = y(i);\n    for (var aa in z) {\n        if ((z.hasOwnProperty(aa) && (aa !== \"_metaprototype\"))) {\n            ca[aa] = z[aa];\n        };\n    };\n    var ba = ((z === null) ? null : z.prototype);\n    ca.prototype = Object.create(ba);\n    ca.prototype.constructor = ca;\n    ca.__superConstructor__ = z;\n    function ca(da) {\n        m(this, da);\n    };\n    ca.prototype.init = function(da, ea, fa) {\n        this.init = function() {\n        \n        };\n        this.data = da;\n        this.view = ea;\n        this.root = fa;\n        this.windowFocused = true;\n        this.isFocused = false;\n        this.keepOpen = false;\n        this.hoverAnimation = null;\n        this.stickyQuery = null;\n        this.settedQuery = null;\n        this.selectedQuery = null;\n        this.currentQuery = null;\n        this._prefillTextInInputField = this.data.allowGrammar();\n        this._webSearchLockedInMode = this.data.isWebSearchLockedInModeEnabled();\n        this.initSubcomponents();\n        this.initEvents();\n        this.checkValue();\n    };\n    ca.prototype.initSubcomponents = function() {\n        var da = p.find(this.root, \".-cx-PUBLIC-fbFacebar__input\");\n        this.input = new r(da);\n        this.view.setInputElement(this.input.getRawInputElement());\n    };\n    ca.prototype.initEvents = function() {\n        g.listen(this.root, \"keydown\", this.keydown.bind(this));\n        g.listen(this.root.parentNode, \"mousedown\", this.mousedown.bind(this));\n        g.listen(this.view.getElement(), \"mousedown\", this.mousedown.bind(this));\n        g.listen(document.body, \"mouseup\", this.mouseup.bind(this));\n        g.listen(window, \"focus\", this.focusWindow.bind(this));\n        g.listen(window, \"blur\", this.blurWindow.bind(this));\n        this.view.subscribe(\"select\", this.selectView.bind(this));\n        this.view.subscribe(\"highlight\", this.highlightView.bind(this));\n        this.view.subscribe(\"render\", this.highlightView.bind(this));\n        this.view.subscribe(\"hideHelp\", this.performQuery.bind(this));\n        this.input.subscribe(\"focus\", this.focusInput.bind(this));\n        this.input.subscribe(\"blur\", this.blurInput.bind(this));\n        this.input.subscribe(\"change\", this.changeInput.bind(this));\n        this.data.subscribe(\"activity\", this.typeaheadActivity.bind(this));\n        this.data.subscribe(\"respond\", this.completeData.bind(this));\n        this.data.subscribe(\"ready\", this.typeaheadReady.bind(this));\n        this.initFocus.bind(this).defer();\n    };\n    ca.prototype.initFocus = function() {\n        if (p.contains(this.input.root, document.activeElement)) {\n            this.isFocused = true;\n            this._newSession();\n            this.open();\n        }\n    ;\n    };\n    ca.prototype.cleanQuery = function(da) {\n        da = (m({\n        }, da) || {\n        });\n        if (!da.structure) {\n            da.structure = new q();\n        };\n        if (!this._prefillTextInInputField) {\n            da.structure = q.fromString(da.structure.toString());\n        };\n        t((da.structure instanceof q));\n        if ((((da.type == \"websuggestion\") && this._prefillTextInInputField) && this._webSearchLockedInMode)) {\n            da.structure = s.addPrefix(da.structure);\n        };\n        return da;\n    };\n    ca.prototype.setPageQuery = function(da) {\n        da = this.cleanQuery(da);\n        var ea = this.input.getValue(), fa = da.structure, ga = (!fa.isEmptyOrWhitespace() && ((ea.isEmptyOrWhitespace() || (ea.toString().trim() == fa.toString().trim()))));\n        return this.selectQuery(da, ga);\n    };\n    ca.prototype.selectQuery = function(da, ea) {\n        ea = (ea !== false);\n        da = this.cleanQuery(da);\n        if ((ea || !this.selectedQuery)) {\n            if ((ea || this.getValue().isEmptyOrWhitespace())) {\n                this.setQuery(da);\n            };\n            this.selectedQuery = da;\n        }\n    ;\n        return da;\n    };\n    ca.prototype.completeSelection = function() {\n        var da = this.view.getSelection();\n        if ((da && !da.search)) {\n            this.data.saveResult(da);\n            this.setQuery(da);\n            return true;\n        }\n    ;\n    };\n    ca.prototype.setQuery = function(da, ea) {\n        da = this.cleanQuery(da);\n        this.input.setValue(da.structure);\n        this.settedQuery = da;\n        this.stickyQuery = ((ea === false) ? this.stickyQuery : da);\n        this.checkValue();\n    };\n    ca.prototype.checkValue = function() {\n        if (((!this.view.visible || !this.dataSourceReady) || ((this.value && (this.value.getHash() == this.input.getValue().getHash()))))) {\n            return\n        };\n        this.value = this.nextQuery = this.getValue();\n        this.performQuery();\n    };\n    ca.prototype.performQuery = function() {\n        this.data.query(this.nextQuery);\n        this.currentQuery = this.nextQuery;\n    };\n    ca.prototype.expandView = function() {\n        this.data.query(this.currentQuery, false, [], true);\n        this.input.restoreSelection();\n    };\n    ca.prototype.collapseView = function() {\n        this.requery();\n    };\n    ca.prototype.requery = function() {\n        if (this.currentQuery) {\n            this.data.query(this.currentQuery);\n        };\n    };\n    ca.prototype.executeQuery = function(da) {\n        da = this.cleanQuery(da);\n        var ea = this.inform(\"execute\", da), fa = this.getSessionID();\n        this.close();\n        if (this._prefillTextInInputField) {\n            this.selectQuery(da);\n        }\n         else this.selectQuery();\n    ;\n        if (!ea) {\n            this._navigateToQuery(da, fa);\n        };\n    };\n    ca.prototype.getSearchType = function() {\n        return \"facebar\";\n    };\n    ca.prototype._newSession = function() {\n        this._sessionID = Math.random().toString();\n        this.inform(\"session\", this._sessionID, h.BEHAVIOR_STATE);\n    };\n    ca.prototype._closeSession = function() {\n        this.inform(\"session\", null, h.BEHAVIOR_STATE);\n    };\n    ca.prototype.getSessionID = function() {\n        return this._sessionID;\n    };\n    ca.prototype._navigateToQuery = function(da, ea) {\n        var fa = this.data.facebarConfig;\n        if (da.uri) {\n            da.uri.addQueryData(da.extra_uri_params);\n            da.uri.addQueryData({\n                ref: \"br_tf\"\n            });\n            if ((da.structure && (((da.type == \"websuggestion\") || (((da.type == \"grammar\") && ((!fa || v(da.uri.getPath(), fa.search_path))))))))) {\n                var ga = this.data.getRawStructure(da.structure).text_form, ha = l.encode(ga).replace(/\\=+$/, \"\"), ia = {\n                    sid: ea,\n                    qs: ha,\n                    gv: this.data.getQueryData().grammar_version\n                }, ja = l.encode(JSON.stringify(ia)).replace(/\\=+$/, \"\");\n                da.uri.addQueryData({\n                    ref: ja\n                });\n            }\n        ;\n            da.uri.go();\n            return;\n        }\n    ;\n    };\n    ca.prototype.reset = function() {\n        this.selectQuery();\n        this.inform(\"reset\");\n    };\n    ca.prototype.animateInputValue = function(da, ea, fa) {\n        (this.hoverAnimation && this.hoverAnimation.stop());\n        var ga = new j(ea).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(function() {\n            this.input.setValue(fa);\n            this.hoverAnimation = ha.go();\n        }.bind(this)), ha = new j(da).from(\"opacity\", 0).to(\"opacity\", 1).duration(150).ondone(function() {\n            this.hoverAnimation = null;\n            w.set(ea, \"opacity\", \"\");\n            w.set(da, \"opacity\", \"\");\n        }.bind(this));\n        w.set(da, \"opacity\", 0);\n        this.hoverAnimation = ga.go();\n    };\n    ca.prototype.open = function() {\n        o.addClass(document.body, \"facebarOpened\");\n        this.inform(\"open\");\n        this.view.show();\n        this.input.focus();\n        this.checkValue();\n        if (!this.isFocused) {\n            this.isFocused = true;\n            this._newSession();\n            this.inform(\"focus\");\n        }\n    ;\n    };\n    ca.prototype.close = function() {\n        this._closeSession();\n        if ((this.inform(\"close\") === false)) {\n            return\n        };\n        if ((((!this.value || this.value.isEmptyOrWhitespace())) && this.selectedQuery)) {\n            this.input.setValue(this.selectedQuery.structure);\n        }\n         else if (this.stickyQuery) {\n            this.input.setValue(this.stickyQuery.structure);\n        }\n    ;\n        this.input.blur();\n        this.view.hide();\n        this.view.setAutoSelect(false);\n        this.inform(\"session\", null, h.BEHAVIOR_STATE);\n        if (this.isFocused) {\n            o.addClass(document.body, \"facebarClosing\");\n            o.removeClass(document.body, \"facebarOpened\");\n            o.removeClass.curry(document.body, \"facebarClosing\").defer(355);\n            this.isFocused = false;\n            this.inform.bind(this, \"blur\").defer();\n        }\n    ;\n    };\n    ca.prototype.getElement = function() {\n        return this.root;\n    };\n    ca.prototype.getValue = function() {\n        return this.input.getValue();\n    };\n    ca.prototype.getText = function() {\n        return this.getValue().toString();\n    };\n    ca.prototype.keydown = function(event) {\n        var da = true, ea = g.getKeyCode(event);\n        switch (ea) {\n          case u.ESC:\n            this.close();\n            break;\n          case u.RIGHT:\n            da = (this.input.isSelectionAtEnd() && this.completeSelection());\n            break;\n          case u.TAB:\n            if ((event.getModifiers().shift || ((!this.completeSelection() && !this.loading)))) {\n                this.view.setAutoSelect(false);\n                this.view.hide();\n                da = false;\n            }\n        ;\n            break;\n          case u.UP:\n            this.view.prev();\n            break;\n          case u.DOWN:\n            this.view.next();\n            break;\n          case u.RETURN:\n            this.view.select();\n            break;\n          case u.PAGE_UP:\n            this.view.first();\n            break;\n          default:\n            if (((ea >= \"0\".charCodeAt(0)) && (ea <= \"z\".charCodeAt(0)))) {\n                this.view.setAutoSelect(true);\n            };\n            this.stickyQuery = null;\n            da = false;\n            break;\n        };\n        this.input.storeSelection();\n        if (da) {\n            return event.kill()\n        };\n    };\n    ca.prototype.mousedown = function() {\n        this.view.setAutoSelect(true);\n        this.input.storeSelection();\n        this.keepOpen = true;\n    };\n    ca.prototype.mouseup = function(da) {\n        if (this.keepOpen) {\n            this.open();\n        };\n        this.keepOpen = false;\n    };\n    ca.prototype.focusWindow = function() {\n        this.windowFocused = true;\n    };\n    ca.prototype.blurWindow = function() {\n        this.windowFocused = false;\n    };\n    ca.prototype.selectView = function(da, ea) {\n        if ((!ea || !ea.selected)) {\n            return\n        };\n        ea.selected.see_more = this.data.isSeeMore();\n        this.inform(\"select\", ea);\n        var fa = this.cleanQuery(ea.selected);\n        this.executeQuery(fa);\n    };\n    ca.prototype.highlightView = function() {\n        var da = this.view.getSelection();\n        (da && this.input.setHint(da.structure));\n    };\n    ca.prototype.blurInput = function() {\n        setTimeout((function() {\n            if ((this.windowFocused || (x.getRequestURI().getSubdomain() == \"apps\"))) {\n                this.input.togglePlaceholder();\n                if (!this.keepOpen) {\n                    this.close();\n                };\n            }\n        ;\n        }).bind(this), 0);\n    };\n    ca.prototype.changeInput = function() {\n        this.inform(\"change\");\n        this.checkValue();\n        this.inform(\"change_end\");\n    };\n    ca.prototype.focusInput = function() {\n        this.open();\n        this.input.togglePlaceholder(false);\n    };\n    ca.prototype.typeaheadReady = function() {\n        this.dataSourceReady = true;\n        this.checkValue();\n    };\n    ca.prototype.updateData = function() {\n        this.view.setLoading(this.loading);\n    };\n    ca.prototype.completeData = function(da, ea) {\n        if ((ea.forceDisplay || ((this.value && this.value.matches(ea.value))))) {\n            this.view.render(ea.value, ea.results, ea.isAsync, (((ea.results.length === 0)) && ea.isEmptyResults), ea.isScrollable);\n        };\n    };\n    ca.prototype.typeaheadActivity = function(da, ea) {\n        this.fetching = ea.activity;\n        if ((this.loading != this.fetching)) {\n            this.loading = this.fetching;\n            this.updateData();\n        }\n    ;\n    };\n    ca.prototype.getNameTextFromSelected = function() {\n        var da = (this.settedQuery && this.settedQuery.semantic), ea = (this.data.facebarConfig && this.data.facebarConfig.name_functions), fa = ((da && ea) && da.match(/[a-z-]+\\([^()]+\\)/g));\n        if (fa) {\n            for (var ga = 0; (ga < fa.length); ga++) {\n                var ha = fa[ga].match(/([a-z-]+)\\(([^()]+)\\)/);\n                if ((ha && k(ea, ha[1]))) {\n                    return ha[2]\n                };\n            }\n        };\n        return this.value.toString();\n    };\n    m(ca.prototype, {\n        events: [\"session\",\"focus\",\"select\",\"change\",\"execute\",\"blur\",],\n        dataSourceReady: false\n    });\n    e.exports = ca;\n});\n__d(\"FacebarTypeaheadHighlighter\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this.$FacebarTypeaheadHighlighter0 = h.getCore();\n        this.$FacebarTypeaheadHighlighter1 = this.$FacebarTypeaheadHighlighter0.view;\n    };\n    g.prototype.enable = function() {\n        this.$FacebarTypeaheadHighlighter2 = this.$FacebarTypeaheadHighlighter1.subscribe(\"filter\", this.$FacebarTypeaheadHighlighter3.bind(this));\n    };\n    g.prototype.disable = function() {\n        this.$FacebarTypeaheadHighlighter2.unsubscribe();\n    };\n    g.prototype.$FacebarTypeaheadHighlighter3 = function(h, event) {\n        var i = event.results, j = event.value;\n        i.forEach(function(k) {\n            k.original_query = j;\n        });\n    };\n    e.exports = g;\n});\n__d(\"FacebarTypeaheadRecorder\", [\"clickRefAction\",\"copyProperties\",\"Env\",\"Event\",\"Keys\",\"ScubaSample\",\"SearchTypeaheadRecorder\",\"URI\",\"userAction\",\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"clickRefAction\"), h = b(\"copyProperties\"), i = b(\"Env\"), j = b(\"Event\"), k = b(\"Keys\"), l = b(\"ScubaSample\"), m = b(\"SearchTypeaheadRecorder\"), n = b(\"URI\"), o = b(\"userAction\"), p = b(\"Arbiter\");\n    for (var q in m) {\n        if ((m.hasOwnProperty(q) && (q !== \"_metaprototype\"))) {\n            s[q] = m[q];\n        };\n    };\n    var r = ((m === null) ? null : m.prototype);\n    s.prototype = Object.create(r);\n    s.prototype.constructor = s;\n    s.__superConstructor__ = m;\n    function s(t) {\n        this.typeahead = t;\n        m.call(this, t);\n        this.userText = \"\";\n        this.queryTimes = [];\n        this._sessionDisabled = false;\n    };\n    s.prototype.initEvents = function() {\n        this.typeahead.getCore().subscribe(\"session\", function(t, u) {\n            if ((u === null)) {\n                this.sessionEnd();\n            }\n             else this.sessionStart(u);\n        ;\n        }.bind(this));\n        this.typeahead.getCore().subscribe(\"select\", function(t, u) {\n            this.recordSelectInfo(u);\n        }.bind(this));\n        this.typeahead.getCore().input.subscribe(\"shortcut\", function(t, u) {\n            this.recordShortcut(u);\n        }.bind(this));\n        this.typeahead.getCore().subscribe(\"quickSelectRedirect\", function(t, u) {\n            this.recordQuickSelectInfo(u);\n        }.bind(this));\n        this.typeahead.getView().subscribe(\"render\", function(t, u) {\n            this.recordRender(u);\n        }.bind(this));\n        this.typeahead.data.subscribe(\"query\", function(t, u) {\n            if (!u.value.isEmpty()) {\n                this.recordCountStat(\"num_queries\");\n            };\n            if (u.see_more) {\n                this.recordStat(\"clicked_see_more\", 1);\n            };\n            this.recordAvgStat(\"num_results_from_cache\", u.results.length);\n            this.queryTimes[(u.queryId - this.startQueryId)] = {\n                send: Date.now()\n            };\n        }.bind(this));\n        this.typeahead.data.subscribe(\"sending_request\", function(t, u) {\n            var v = u.data.value;\n            if (!v) {\n                return\n            };\n            this.backendQueries.push(v);\n        }.bind(this));\n        this.typeahead.subscribe(\"navigation\", function(t, u) {\n            if ((u && u.structure)) {\n                this.recordStat(\"navigation_input\", JSON.stringify(u.structure.toStruct()));\n                this.recordStat(\"navigation_text\", u.structure.toString());\n            }\n        ;\n        }.bind(this));\n        this.typeahead.data.subscribe(\"response_received\", function(t, u, v) {\n            if ((u.queryId >= this.startQueryId)) {\n                var w = this.queryTimes[(u.queryId - this.startQueryId)];\n                w.recv = (Date.now() - w.send);\n            }\n        ;\n        }.bind(this));\n        this.typeahead.data.subscribe(\"backend_response\", function(t, u) {\n            if ((u.queryId >= this.startQueryId)) {\n                var v = this.queryTimes[(u.queryId - this.startQueryId)];\n                v.render = (Date.now() - v.send);\n                if (u.payload.incomplete) {\n                    v.incomplete = true;\n                };\n                v.backendInfo = u.payload.info;\n                if (this.core.scubaInfo) {\n                    this.logToScuba(u, v, this.core.scubaInfo);\n                };\n            }\n        ;\n        }.bind(this));\n        p.subscribe(\"BrowseNUX/typing\", this.disableThisSession.bind(this));\n        p.subscribe(\"TestConsole/typing\", this.disableThisSession.bind(this));\n        this.typeahead.getCore().subscribe(\"change\", function(t, u) {\n            this.userInput(this.core.getText());\n        }.bind(this));\n        this.typeahead.subscribe(\"clear\", function() {\n            this.recordAppendStat(\"before_clear_queries\", this.userText);\n        }.bind(this));\n        j.listen(this.element, \"keydown\", function(event) {\n            this.recordStat(\"keypressed\", 1);\n            if ((j.getKeyCode(event) == k.BACKSPACE)) {\n                if (!this._backspacing) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.core.getText());\n                }\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        }.bind(this));\n        this.typeahead.subscribe(\"record_after_reorder\", function(t, u) {\n            this._reorderInfo = u;\n            this._reorderInfo.s_organic_results = this._reorderInfo.s_organic_results.map(this.buildTypeaheadRecord.bind(this));\n        }.bind(this));\n        this.typeahead.subscribe(\"filter\", function(t, u) {\n            this._unsupportedGrammarInfo = this.buildUnsupportedGrammarInfo(u);\n        }.bind(this));\n        this.typeahead.getCore().subscribe(\"recordFunction\", function(t, u) {\n            this._extraRecorder.push(u);\n        }.bind(this));\n    };\n    s.prototype._reset = function(t) {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n    };\n    s.prototype.sessionStart = function(t) {\n        this._sessionEnded = false;\n        this.data.setQueryData({\n            sid: t\n        });\n        this.recordStat(\"sid\", t);\n        if (!this.stats.session_start_time) {\n            this.recordStat(\"session_start_time\", Date.now());\n        };\n        this.startQueryId = (this.data.getCurQueryId() + 1);\n        this.recordStat(\"keypressed\", 0);\n        this.queryTimes = [];\n    };\n    s.prototype.sessionEnd = function() {\n        if ((this._sessionEnded || this._sessionDisabled)) {\n            if (this._sessionDisabled) {\n                this.reset();\n                this._sessionDisabled = false;\n                this._sessionEnded = true;\n            }\n        ;\n            return;\n        }\n    ;\n        this._sessionEnded = true;\n        this.recordStat(\"session_end_time\", Date.now());\n        this.recordStat(\"grammar_version\", this.data.getQueryData().grammar_version);\n        this.submit();\n    };\n    s.prototype.disableThisSession = function() {\n        this._sessionDisabled = true;\n    };\n    s.prototype.userInput = function(t) {\n        this.userText = t;\n    };\n    s.prototype.buildUnsupportedGrammarInfo = function(t) {\n        var u = (t.results ? t.results[0] : null);\n        if ((!u || (u.results_set_type !== \"unimplemented\"))) {\n            return null\n        };\n        return {\n            unsupported_grammar: {\n                category: (u.error_info.category || \"unknown\"),\n                edge: u.error_info.blamed_edge\n            }\n        };\n    };\n    s.prototype.buildTypeaheadRecord = function(t, u) {\n        var v = ((t.rankType || t.render_type) || t.type), w = 0, x = u;\n        if ((typeof t.groupIndex == \"number\")) {\n            w = t.groupIndex;\n            x = t.indexInGroup;\n        }\n    ;\n        var y = {\n            group_index: w,\n            index_in_group: x,\n            cost: t.cost,\n            s_value: (t.s_value || 0),\n            semantic: t.semantic,\n            text: t.structure.toString(),\n            cache_only: ((t.cacheOnlyResult ? 1 : 0)),\n            parse: t.parse,\n            semantic_forest: t.semanticForest,\n            normalized_input: t.entityTypes,\n            category: t.category,\n            type: v,\n            source: t.bootstrapped,\n            grammar_results_type: ((t.results_set_type || \"\")).replace(/[\\[\\{](.*)[\\]\\}]/, \"$1\"),\n            result_from_memcache: t.memcache,\n            websuggestion_source: t.websuggestion_source,\n            dynamic_cost: t.dynamic_cost,\n            is_js_bootstrap_match: t.isJSBootstrapMatch,\n            backend_cost: t.backendCost,\n            bootstrap_cost: t.bootstrapCost,\n            match_type: t.match_type,\n            l_type: t.l_type,\n            vertical_type: t.vertical_type,\n            prefix_match: t.prefix_match,\n            prefix_length: t.prefix_length,\n            index_before_buckets: t.indexBeforeBuckets,\n            bucket_lineage: t.bucketLineage\n        };\n        if (t.logInfo) {\n            y.backend_log_info = t.logInfo;\n        };\n        if (t.s_token) {\n            y.s_token = t.s_token;\n        };\n        if (t.s_categories) {\n            y.s_categories = t.s_categories;\n        };\n        return y;\n    };\n    s.prototype.buildListTypeaheadRecords = function() {\n        var t = [];\n        (this.results && this.results.forEach(function(u, v) {\n            if ((u.uid !== \"search\")) {\n                t.push(this.buildTypeaheadRecord(u, v));\n            };\n        }.bind(this)));\n        return t;\n    };\n    s.prototype.recordShortcut = function(t) {\n        this.recordStat(\"shortcut\", 1);\n        this.recordStat(\"shortcut_with_shift\", t.shift);\n    };\n    s.prototype.recordStats = function(t, u) {\n        for (var v in u) {\n            this.recordStat(((t + \"_\") + v), u[v]);;\n        };\n    };\n    s.prototype.getTypeaheadIndex = function(t, u) {\n        var v = ((typeof t.groupIndex == \"number\") ? (t.groupIndex + 1) : 0);\n        return (u - v);\n    };\n    s.prototype.recordQuickSelectInfo = function(t) {\n        var u = {\n            input_query: t.input_query,\n            semantic: t.semantic,\n            type: t.type,\n            position: t.position,\n            with_mouse: t.with_mouse,\n            text: t.text,\n            quick_select: 1\n        };\n        this.recordStats(\"selected\", u);\n        this.recordStat(\"quick_select\", 1);\n    };\n    s.prototype.recordSelectInfo = function(t) {\n        var u = t.selected, v = this.getTypeaheadIndex(u, t.index), w = {\n        };\n        if ((u.uid == \"search\")) {\n            w.selected_search = 1;\n        }\n         else {\n            w = this.buildTypeaheadRecord(u);\n            var x = (((w.type == \"friend\") ? \"user\" : w.type));\n            w.position = v;\n            w[x] = 1;\n        }\n    ;\n        w.with_mouse = (t.clicked ? 1 : 0);\n        w.quick_select = 0;\n        w.see_more = (u.see_more ? 1 : 0);\n        w.input_query = this.userText;\n        w.input_fragments = JSON.stringify(this.core.currentQuery.toStruct());\n        var y = (u.dataGT ? {\n            gt: JSON.parse(u.dataGT)\n        } : {\n        }), z = {\n            href: u.path\n        };\n        g(\"click\", z, null, null, y);\n        o(\"search\").uai(\"click\");\n        this.recordStats(\"selected\", w);\n        this.recordAppendStat(\"selection_history\", {\n            selected: w,\n            candidate_results: this.buildListTypeaheadRecords(),\n            timestamp: Date.now()\n        });\n        var aa = {\n        };\n        this._extraRecorder.forEach(function(ba) {\n            ba(t, this.results, aa);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(aa));\n        this.recordStat(\"selected_with_mouse\", (t.clicked ? 1 : 0));\n    };\n    s.prototype._dataToSubmit = function() {\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if ((this.stats && this.stats.selected_input_query)) {\n            this.recordStat(\"input_query\", this.stats.selected_input_query);\n        }\n         else this.recordStat(\"input_query\", this.userText);\n    ;\n        this.recordStat(\"uri\", n().toString());\n        if (!this.stats.shortcut) {\n            this.recordStat(\"shortcut\", 0);\n            this.recordStat(\"shortcut_with_shift\", false);\n        }\n    ;\n        var t = this.stats;\n        for (var u in this.avgStats) {\n            var v = this.avgStats[u];\n            t[u] = (v[0] / v[1]);\n        };\n        var w = {\n            candidate_results: this.buildListTypeaheadRecords(),\n            timestamp: Date.now(),\n            input_query: this.userText\n        };\n        if (this._reorderInfo) {\n            h(w, this._reorderInfo);\n        };\n        if (this._unsupportedGrammarInfo) {\n            h(w, this._unsupportedGrammarInfo);\n        };\n        this.recordAppendStat(\"suggestions_at_end_of_session\", w);\n        this.recordAppendStat(\"query_times\", this.queryTimes);\n        if ((this.backendQueries.length > 0)) {\n            if ((this.backendQueries.length > this.data.logBackendQueriesWindow)) {\n                this.backendQueries = this.backendQueries.slice((this.backendQueries.length - this.data.logBackendQueriesWindow));\n            };\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n        for (var x in this.appendStats) {\n            t[x] = JSON.stringify(this.appendStats[x]);;\n        };\n        return t;\n    };\n    s.prototype.getDataToSubmit = function() {\n        return this._dataToSubmit();\n    };\n    s.prototype.reset = function() {\n        return this._reset();\n    };\n    s.prototype.submit = function() {\n        if (!this._sessionDisabled) {\n            r.submit.call(this);\n        };\n        this.view.inform(\"feedback\");\n        this._reset();\n    };\n    s.prototype.logToScuba = function(t, u, v) {\n        if (this._sessionDisabled) {\n            return\n        };\n        var w = new l(\"search_facebar_js\", null, {\n            addBrowserFields: true\n        });\n        w.addInteger(\"sample_rate\", v.sample_rate);\n        w.addNormal(\"site\", v.site);\n        w.addDenorm(\"query\", t.request.uri.query_s);\n        var x = t.payload;\n        (x.entities && w.addInteger(\"num_entities\", x.entities.length));\n        (x.results && w.addInteger(\"num_results\", x.results.length));\n        if (x.times) {\n            w.addInteger(\"time_bootstrap\", x.times.bootstrap);\n            w.addInteger(\"time_php_end_to_end\", x.times.end_to_end);\n            w.addInteger(\"time_fetchers\", x.times.fetchers);\n            w.addInteger(\"time_grammar\", x.times.grammar);\n        }\n    ;\n        w.addInteger(\"incomplete\", (u.incomplete ? 1 : 0));\n        w.addInteger(\"time_render\", (u.render - u.recv));\n        w.addInteger(\"time_js_async\", u.recv);\n        w.addInteger(\"query_id\", u.queryId);\n        w.addInteger(\"user_id\", i.user);\n        w.addInteger(\"session_id\", this.typeahead.getCore().getSessionID());\n        w.flush();\n    };\n    h(s.prototype, {\n        _endPoint: \"/ajax/typeahead/search/record_metrics.php\",\n        _sessionEnded: true,\n        _extraRecorder: [],\n        _banzaiRoute: \"facebar\"\n    });\n    e.exports = s;\n});\n__d(\"FacebarTypeaheadView\", [\"Animation\",\"Arbiter\",\"ContextualLayer\",\"copyProperties\",\"CSS\",\"csx\",\"cx\",\"DOM\",\"Ease\",\"Event\",\"FacebarStructuredText\",\"fbt\",\"Parent\",\"ScrollableArea\",\"Style\",\"throttle\",\"TypeaheadView\",\"Vector\",\"ViewportBounds\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ContextualLayer\"), j = b(\"copyProperties\"), k = b(\"CSS\"), l = b(\"csx\"), m = b(\"cx\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"Event\"), q = b(\"FacebarStructuredText\"), r = b(\"fbt\"), s = b(\"Parent\"), t = b(\"ScrollableArea\"), u = b(\"Style\"), v = b(\"throttle\"), w = b(\"TypeaheadView\"), x = b(\"Vector\"), y = b(\"ViewportBounds\"), z = 981, aa = 500, ba = \"unimplemented\";\n    for (var ca in w) {\n        if ((w.hasOwnProperty(ca) && (ca !== \"_metaprototype\"))) {\n            ea[ca] = w[ca];\n        };\n    };\n    var da = ((w === null) ? null : w.prototype);\n    ea.prototype = Object.create(da);\n    ea.prototype.constructor = ea;\n    ea.__superConstructor__ = w;\n    function ea(fa, ga) {\n        w.call(this, fa, ga);\n        this.sid = \"\";\n        this.index = -1;\n        this.animation = null;\n        this.warningShown = false;\n        this.autoSelect = false;\n        this.minResults = (ga.minResults || 3);\n        this.maxResults = ga.maxResults;\n        this.animateHeightThrottled = v(this.animateHeight, 50, this);\n        this.animateCount = -1;\n        this.animateWidth = -1;\n        this.loading = false;\n    };\n    ea.prototype.init = function() {\n        this.initializeElements();\n        da.init.call(this);\n    };\n    ea.prototype.initializeElements = function() {\n        var fa = this.element;\n        this.content = n.find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__content\");\n        this.throbber = n.find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__throbber\");\n        this.warningNode = n.find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__warning\");\n        this.scroller = n.find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__scroller\");\n        this.scrollableArea = t.getInstance(this.scroller);\n        this.footer = this.createFooter();\n    };\n    ea.prototype.initializeLayer = function() {\n        var fa = n.scry(document.body, \"#blueBar\")[0], ga, ha, ia;\n        if ((fa && n.contains(fa, this.element))) {\n            ga = fa;\n            ia = \"-cx-PUBLIC-fbFacebarTypeaheadView__layer\";\n            ha = \"100%\";\n        }\n         else {\n            ga = this.element.parentNode;\n            ia = \"\";\n            ha = (z + \"px\");\n        }\n    ;\n        this.wrapper = n.create(\"div\");\n        n.appendContent(this.wrapper, this.element);\n        this.layer = new i({\n            context: ga,\n            position: \"below\",\n            alignment: this.alignment,\n            causalElement: this.causalElement\n        }, this.wrapper);\n        this.layer.show();\n        this.layer.hide();\n        k.addClass(this.layer.getRoot(), ia);\n        u.set(this.layer.getContentRoot(), \"width\", ha);\n    };\n    ea.prototype.initializeEvents = function() {\n        p.listen(this.content, {\n            click: this.click.bind(this),\n            mouseover: this.mouseover.bind(this)\n        });\n    };\n    ea.prototype.setInputElement = function(fa) {\n        this.setAccessibilityControlElement(fa);\n        this.causalElement = fa;\n        this.initializeLayer();\n    };\n    ea.prototype.setAutoSelect = function(fa) {\n        this.autoSelect = fa;\n        if (((this.index === -1) && fa)) {\n            this.first();\n        };\n    };\n    ea.prototype.click = function(event) {\n        if ((!event.isMiddleClick() && !event.getModifiers().any)) {\n            var fa = s.byTag(event.getTarget(), \"a\");\n            if ((!fa || k.hasClass(fa, \"-cx-PRIVATE-fbFacebarTypeaheadItem__link\"))) {\n                this.select(true);\n                return event.kill();\n            }\n        ;\n        }\n    ;\n    };\n    ea.prototype.show = function() {\n        if (!this.visible) {\n            this.inform(\"beforeShow\", this.layer);\n            var fa = da.show.call(this);\n            this.first();\n            this.layer.show();\n            this.layer.updatePosition();\n            this.recalculateScrollableArea();\n            this.animateCount = -1;\n            this.animateHeight();\n            this.inform(\"show\");\n            h.inform(\"layer_shown\", {\n                type: \"FacebarTypeahead\"\n            });\n            return fa;\n        }\n    ;\n    };\n    ea.prototype.hide = function() {\n        if (this.visible) {\n            this.layer.hide();\n            da.hide.call(this);\n            u.set(this.scroller, \"height\", \"0px\");\n            this.inform(\"hide\");\n            h.inform(\"layer_hidden\", {\n                type: \"FacebarTypeahead\"\n            });\n        }\n    ;\n        return this;\n    };\n    ea.prototype.select = function(fa) {\n        var ga = this.results[this.index];\n        if (!ga) {\n            this.inform(\"quickSelect\");\n            return;\n        }\n    ;\n        var ha = this.inform(\"beforeSelect\", {\n            index: this.index,\n            selected: ga\n        });\n        if (((ha !== false) && this.isIndexFooter(this.index))) {\n            ha = false;\n        };\n        if ((ha !== false)) {\n            da.select.call(this, fa);\n        };\n    };\n    ea.prototype.buildResults = function(fa) {\n        this.list = k.addClass(da.buildResults.call(this, fa), \"-cx-PRIVATE-fbFacebarTypeaheadView__list\");\n        return this.list;\n    };\n    ea.prototype.animateHeight = function() {\n        if ((this.items.length == this.animateCount)) {\n            var fa = x.getViewportDimensions().x;\n            if ((this.animateWidth != fa)) {\n                this.animateWidth = fa;\n                this.recalculateScrollableArea();\n            }\n        ;\n            return;\n        }\n    ;\n        if ((this.list && k.shown(this.list))) {\n            this.animateCount = this.items.length;\n            var ga = Math.min(x.getElementDimensions(this.list).y, this.calculateMaxAllowableHeight());\n            (this.animation && this.animation.stop());\n            this.animation = new g(this.scroller).to(\"height\", ga).duration(aa).ease(o.makePowerOut(5)).ondone(this.recalculateScrollableArea.bind(this)).go();\n        }\n    ;\n    };\n    ea.prototype.calculateMaxAllowableHeight = function() {\n        var fa = x.getViewportDimensions().y, ga = (y.getTop() || 48), ha = 56, ia = (Math.max(this.minResults, (Math.floor(((((fa - ga) - 25)) / ha)) - 1)) + 1);\n        return ((ia * ha) + ((ha / 4)));\n    };\n    ea.prototype.render = function(fa, ga, ha, ia, ja) {\n        this.inform(\"filter\", {\n            results: ga,\n            value: fa,\n            isScrollable: ja\n        });\n        if (this.loading) {\n            ga.push({\n                uid: \"search\",\n                node: this.footer,\n                structure: new q(),\n                search: true\n            });\n        };\n        var ka = ga[0];\n        if (ia) {\n            this.showWarning(r._(\"There are no results for '{query}'\", [r.param(\"query\", fa.toString()),]));\n        }\n         else if ((ka && (ka.results_set_type === ba))) {\n            if (!ka.error_info.suppress) {\n                this.showWarning((ka.error_info.errorMessage || \"This search isn't currently supported.\"));\n            };\n        }\n         else this.hideWarning();\n        \n    ;\n        if ((this.inform(\"removeUnimplementedGrammar\") !== false)) {\n            ga = ga.filter(function(la) {\n                return (la.results_set_type !== ba);\n            }.bind(this));\n        };\n        da.render.call(this, fa, ga, ha);\n        this.renderFooter();\n        this.animateHeightThrottled();\n    };\n    ea.prototype.showWarning = function(fa) {\n        k.show(this.warningNode);\n        n.setContent(this.warningNode, fa);\n        this.warningShown = true;\n        this.highlight(-1, false);\n    };\n    ea.prototype.hideWarning = function() {\n        k.hide(this.warningNode);\n        this.warningShown = false;\n        this.highlight(this.index, false);\n    };\n    ea.prototype.recalculateScrollableArea = function() {\n        u.set(this.scroller, \"width\", (x.getElementDimensions(this.element).x + \"px\"));\n        this.scrollableArea.resize();\n        this.scrollableArea.poke();\n    };\n    ea.prototype.setLoading = function(fa) {\n        this.loading = fa;\n        this.renderFooter();\n    };\n    ea.prototype.scrollTo = function(fa) {\n        (fa && this.scrollableArea.scrollIntoView(fa, true));\n    };\n    ea.prototype.renderFooter = function() {\n        k.conditionShow(this.throbber, this.loading);\n        k.conditionShow(this.footer, this.loading);\n        if (this.loading) {\n            this.inform(\"showingFooter\");\n        }\n         else this.inform(\"hidingFooter\");\n    ;\n    };\n    ea.prototype.isIndexFooter = function(fa) {\n        var ga = this.results[fa];\n        return (ga && (ga.node == this.footer));\n    };\n    ea.prototype.first = function() {\n        this.index = (this.autoSelect ? 0 : -1);\n        this.highlight(this.index);\n    };\n    ea.prototype.prev = function() {\n        if ((this.index <= 0)) {\n            this.index = this.items.length;\n        };\n        if (this.isIndexFooter((this.index - 1))) {\n            this.index -= 1;\n        };\n        da.prev.call(this);\n    };\n    ea.prototype.next = function() {\n        if (((this.index + 1) >= this.items.length)) {\n            this.index = -1;\n        };\n        if (this.isIndexFooter((this.index + 1))) {\n            this.index = -1;\n        };\n        da.next.call(this);\n    };\n    ea.prototype.highlight = function(fa, ga) {\n        ga = ((ga !== false) && ((this.index != fa)));\n        if ((!ga || (this.inform(\"beforeHighlight\") !== false))) {\n            var ha = ((this.warningShown || !this.autoSelect) ? -1 : 0);\n            da.highlight.call(this, Math.max(ha, fa), ga);\n        }\n    ;\n    };\n    ea.prototype.createFooter = function() {\n        return n.create(\"li\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadView__footer hidden_elem\"\n        }, this.throbber);\n    };\n    j(ea.prototype, {\n        events: [\"highlight\",\"render\",\"filter\",]\n    });\n    e.exports = ea;\n});\n__d(\"FacebarTypeaheadViewMegaphone\", [\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"CSS\",\"Event\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"Event\"), l = b(\"mixin\"), m = l(h);\n    for (var n in m) {\n        if ((m.hasOwnProperty(n) && (n !== \"_metaprototype\"))) {\n            p[n] = m[n];\n        };\n    };\n    var o = ((m === null) ? null : m.prototype);\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = m;\n    function p(q, r, s) {\n        this.root = q;\n        this.tourButton = r;\n        this.closeButton = s;\n        this.nuxReady = false;\n        this.core = null;\n        k.listen(this.tourButton, \"click\", this.$FacebarTypeaheadViewMegaphone0.bind(this));\n        k.listen(this.closeButton, \"click\", this.$FacebarTypeaheadViewMegaphone1.bind(this));\n        g.subscribe(\"Facebar/init\", this.$FacebarTypeaheadViewMegaphone2.bind(this));\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone2 = function(q, r) {\n        r.view.subscribe(\"render\", this.$FacebarTypeaheadViewMegaphone4.bind(this));\n        r.view.subscribe(\"show\", this.$FacebarTypeaheadViewMegaphone4.bind(this));\n        g.subscribe(\"BrowseNUX/initialized\", this.$FacebarTypeaheadViewMegaphone5.bind(this));\n        this.core = r.core;\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone5 = function() {\n        this.nuxReady = true;\n        this.$FacebarTypeaheadViewMegaphone4();\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone4 = function() {\n        if (this.nuxReady) {\n            j.conditionShow(this.root, this.core.getValue().isEmpty());\n        };\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone0 = function() {\n        this.inform(\"start\");\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone1 = function() {\n        new i().setURI(\"/ajax/browse/nux_hide.php\").setMethod(\"POST\").send();\n        this.hide();\n        this.inform(\"hide\");\n    };\n    p.prototype.hide = function() {\n        j.hide(this.root);\n    };\n    e.exports = p;\n});\n__d(\"FacebarTypeaheadDecorateEntities\", [\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(n) {\n        var o = [];\n        n.forEach(function(p) {\n            if (p.isType(\"ent\")) {\n                o.push(p.getUID());\n            };\n        });\n        return o;\n    };\n    function k(n, o) {\n        var p = null;\n        n.structure.forEach(function(q) {\n            if ((q.isType(\"ent\") && !g(o, q.getUID()))) {\n                p = q;\n            };\n        });\n        return p;\n    };\n    function l(n, o, p) {\n        n.forEach(function(q) {\n            var r = k(q, o);\n            q.decoration = {\n                entity: (r && p.getEntryForFragment(r))\n            };\n        });\n    };\n    function m(n) {\n        this._typeahead = n;\n    };\n    m.prototype.enable = function() {\n        this._typeahead.view.subscribe(\"filter\", function(n, o) {\n            l(o.results, j(this._typeahead.core.getValue()), this._typeahead.data);\n        }.bind(this));\n    };\n    h(m.prototype, {\n        disable: i\n    });\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadDecorateMessageButton\", [\"cx\",\"ChatOpenTab\",\"DOM\",\"React\",\"XUIButton.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"ChatOpenTab\"), i = b(\"DOM\"), j = b(\"React\"), k = b(\"XUIButton.react\");\n    function l(m) {\n        this.$FacebarTypeaheadDecorateMessageButton0 = m;\n        this.$FacebarTypeaheadDecorateMessageButton1 = null;\n    };\n    l.prototype.enable = function() {\n        this.$FacebarTypeaheadDecorateMessageButton1 = this.$FacebarTypeaheadDecorateMessageButton0.view.subscribe(\"renderingItem\", this.$FacebarTypeaheadDecorateMessageButton2.bind(this));\n    };\n    l.prototype.$FacebarTypeaheadDecorateMessageButton2 = function(m, event) {\n        event.item.setShouldRenderEducation(false);\n        var n = event.result;\n        if (((n.type !== \"user\") && (n.type !== \"{user}\"))) {\n            return\n        };\n        var o = i.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__typeaheadmessagebutton\"\n        }), p = function() {\n            h.openUserTab(n.uid, \"search\");\n        };\n        j.renderComponent(k({\n            label: \"Message\",\n            onMouseDown: p\n        }), o);\n        event.item.setMessageButton(o);\n    };\n    l.prototype.disable = function() {\n        (this.$FacebarTypeaheadDecorateMessageButton1 && this.$FacebarTypeaheadDecorateMessageButton1.unsubscribe());\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadDisambiguateResults\", [\"FacebarDisambiguationDialog\",\"FacebarStructuredFragment\",\"FacebarStructuredText\",\"URI\",\"copyProperties\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarDisambiguationDialog\"), h = b(\"FacebarStructuredFragment\"), i = b(\"FacebarStructuredText\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"getObjectValues\");\n    function n(w, x) {\n        var y = {\n        };\n        w.forEach(function(ba) {\n            if ((ba.type == \"grammar\")) {\n                var ca = x(ba.structure).toLowerCase();\n                y[ca] = (y[ca] || []);\n                y[ca].push(ba);\n            }\n        ;\n        });\n        var z = [];\n        for (var aa in y) {\n            if ((y[aa].length > 1)) {\n                z.push(y[aa]);\n            };\n        };\n        return z;\n    };\n    function o(w) {\n        var x = [];\n        w.toArray().forEach(function(y, z) {\n            if (y.isType(\"ent\")) {\n                x.push(z);\n            };\n        });\n        return x;\n    };\n    function p(w, x, y) {\n        var z = {\n        }, aa = {\n        }, ba = {\n        };\n        x.forEach(function(da) {\n            var ea = w[0].structure.getFragment(da), fa = ea.getHash();\n            aa[fa] = (aa[fa] || []);\n            ba[da] = aa[fa];\n            w.forEach(function(ga) {\n                var ha = ga.structure.getFragment(da), ia = (ha && ha.getUID());\n                if ((ia && !z.hasOwnProperty(ia))) {\n                    aa[fa].push(y.getEntryForFragment(ha));\n                    z[ia] = true;\n                }\n            ;\n            });\n        });\n        for (var ca in ba) {\n            if ((ba[ca].length <= 1)) {\n                delete ba[ca];\n            };\n        };\n        return ba;\n    };\n    function q(w, x) {\n        var y = {\n        }, z = [];\n        w.forEach(function(aa) {\n            var ba = aa.structure.getFragment(x).getUID();\n            if (!y.hasOwnProperty(ba)) {\n                y[ba] = z.length;\n                z.push([]);\n            }\n        ;\n            z[y[ba]].push(aa);\n        });\n        return z;\n    };\n    function r(w, x, y) {\n        var z = w.shift();\n        z.ambiguity.entities = x;\n        y.push.apply(y, w);\n        return z;\n    };\n    function s(w, x) {\n        var y = [], z = [], aa = false;\n        w.forEach(function(ca) {\n            ca.ambiguity = {\n                fragment: null,\n                entities: null,\n                text: null\n            };\n        });\n        n(w, function(ca) {\n            return ca.getHash();\n        }).forEach(function(ca) {\n            var da = ca[0].structure, ea = o(da), fa = p(ca, ea, x);\n            if (aa) {\n                r(ca, fa, y);\n                return;\n            }\n        ;\n            var ga = ea.pop();\n            if ((typeof ga == \"number\")) {\n                var ha = q(ca, ga);\n                aa = (ha.length > 1);\n                if (aa) {\n                    delete fa[ga];\n                };\n                ha.forEach(function(ia) {\n                    var ja = r(ia, fa, y);\n                    if (aa) {\n                        var ka = ja.structure.getFragment(ga).getUID();\n                        ja.ambiguity.entity = x.getEntry(ka);\n                        z.push(ja);\n                    }\n                ;\n                });\n            }\n        ;\n        });\n        y.forEach(function(ca) {\n            var da = w.indexOf(ca);\n            ((da != -1) && w.splice(da, 1));\n        });\n        n(w, function(ca) {\n            return ca.toString();\n        }).forEach(function(ca) {\n            ca.forEach(function(da) {\n                if (!da.ambiguity.entities) {\n                    da.ambiguity.text = da.queryTypeText;\n                };\n            });\n        });\n        var ba = w.indexOf(z[0]);\n        z.slice(1).forEach(function(ca) {\n            var da = w.indexOf(ca);\n            if (((da != -1) && (da != ++ba))) {\n                w.splice(da, 1);\n                w.splice(ba, 0, ca);\n            }\n        ;\n        });\n    };\n    function t(w, x) {\n        var y = ((w && w.ambiguity) && w.ambiguity.entities), z = (y && Object.keys(y).map(Number)), aa = x.core.input;\n        if ((!z || (z.length === 0))) {\n            return false\n        };\n        var ba = function(ea) {\n            x.core.executeQuery(u(w, z, ea));\n        }, ca = function() {\n            aa.focus();\n            aa.input.moveSelectionToEnd();\n        }, da = new g(m(y), w.uri.getPath(), ba, ca, x.getCore().getSessionID());\n        aa.blur();\n        da.show();\n        return true;\n    };\n    function u(w, x, y) {\n        var z = w.structure.toArray(), aa = j(w.uri), ba = aa.getPath().split(\"/\");\n        x.forEach(function(ca) {\n            var da = z[ca], ea = y.shift(), fa = ba.indexOf(String(da.getUID()));\n            if ((fa != -1)) {\n                ba[fa] = ea.uid;\n            };\n            z[ca] = new h({\n                uid: ea.uid,\n                text: ea.text,\n                type: (\"ent:\" + ea.type)\n            });\n        });\n        return {\n            uri: aa.setPath(ba.join(\"/\")),\n            structure: new i(z)\n        };\n    };\n    function v(w) {\n        this._typeahead = w;\n    };\n    v.prototype.enable = function() {\n        this._typeahead.view.subscribe(\"filter\", function(w, x) {\n            s(x.results, this._typeahead.data);\n        }.bind(this));\n        this._typeahead.view.subscribe(\"beforeSelect\", function(w, x) {\n            return !t(x.selected, this._typeahead);\n        }.bind(this));\n    };\n    k(v.prototype, {\n        disable: l\n    });\n    e.exports = v;\n});\n__d(\"FacebarTypeaheadHashtagResult\", [\"HashtagSearchResultUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"HashtagSearchResultUtils\");\n    function h(i) {\n        this.$FacebarTypeaheadHashtagResult0 = i.getData();\n    };\n    h.prototype.enable = function() {\n        this.$FacebarTypeaheadHashtagResult1 = this.$FacebarTypeaheadHashtagResult0.subscribe(\"beforeQuery\", this.$FacebarTypeaheadHashtagResult2.bind(this));\n    };\n    h.prototype.$FacebarTypeaheadHashtagResult2 = function(i, j) {\n        if ((!j || !j.value)) {\n            return\n        };\n        var k = this.$FacebarTypeaheadHashtagResult0.getRawStructure(j.value);\n        if (((!k || k.is_empty) || !k.raw_text)) {\n            return\n        };\n        var l = g.getHashtagFromQuery(k.raw_text);\n        if (!l) {\n            return\n        };\n        var m = (\"hashtag:\" + l), n = this.$FacebarTypeaheadHashtagResult0.getEntry(m);\n        if (!n) {\n            this.$FacebarTypeaheadHashtagResult0.processEntries([g.makeFacebarEntry(l),]);\n            this.$FacebarTypeaheadHashtagResult0.resultStore.saveResults([g.makeFacebarResult(l),], k, true);\n        }\n    ;\n        return;\n    };\n    h.prototype.disable = function() {\n        (this.$FacebarTypeaheadHashtagResult1 && this.$FacebarTypeaheadHashtagResult0.unsubscribe(this.$FacebarTypeaheadHashtagResult1));\n    };\n    e.exports = h;\n});\n__d(\"FacebarTypeaheadMagGo\", [\"csx\",\"DOM\",\"Event\",\"$\",\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"csx\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"$\"), k = b(\"SubscriptionsHandler\");\n    function l(m) {\n        this._core = m.getCore();\n        this._view = this._core.view;\n        this._handler = new k();\n        this._selected = null;\n    };\n    l.prototype.enable = function() {\n        var m = h.find(j(\"blueBar\"), \".-cx-PUBLIC-fbFacebar__icon\");\n        this._handler.addSubscriptions(i.listen(m, \"click\", this._runQuery.bind(this)), this._view.subscribe(\"highlight\", this._highlight.bind(this)), this._view.subscribe(\"render\", this._render.bind(this)), this._core.subscribe(\"close\", this._close.bind(this)));\n    };\n    l.prototype.disable = function() {\n        this._handler.release();\n    };\n    l.prototype._highlight = function(m, n) {\n        this._selected = n.selected;\n    };\n    l.prototype._render = function(m, n) {\n        this._selected = this._view.results[this._view.index];\n    };\n    l.prototype._runQuery = function() {\n        if (this._selected) {\n            return this._core.selectView(null, {\n                selected: this._selected\n            })\n        };\n    };\n    l.prototype._close = function() {\n        this._selected = null;\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadMagPPS\", [\"csx\",\"DOM\",\"Event\",\"FacebarStructuredText\",\"FacebarURI\",\"FacebarResultStoreUtils\",\"$\",\"SubscriptionsHandler\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"csx\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarURI\"), l = b(\"FacebarResultStoreUtils\"), m = b(\"$\"), n = b(\"SubscriptionsHandler\"), o = b(\"URI\");\n    function p(q) {\n        this._core = q.getCore();\n        this._data = q.getData();\n        this._view = this._core.view;\n        this._input = this._core.input;\n        this._handler = new n();\n    };\n    p.prototype.enable = function() {\n        var q = h.find(m(\"blueBar\"), \".-cx-PUBLIC-fbFacebar__icon\");\n        this._handler.addSubscriptions(i.listen(q, \"click\", this._runQuery.bind(this)));\n    };\n    p.prototype.disable = function() {\n        this._handler.release();\n    };\n    p.prototype._runQuery = function() {\n        var q = this._input.getValue(), r = this._data.getRawStructure(q);\n        if ((!r || r.is_empty)) {\n            return\n        };\n        var s;\n        if (!r.raw_text) {\n            s = l.getRawTextFromStructured(q.toArray());\n        }\n         else s = r.raw_text;\n    ;\n        var t = o(this._view.seeMoreSerpEndpoint).addQueryData(\"q\", s).addQueryData(\"sid\", this._core.getSessionID());\n        t = k.getQualifiedURI(t);\n        var u = ((((((((\"uri(\" + \"path(\") + this._view.seeMoreSerpEndpoint) + \")\") + \",param_q(\") + s) + \")\") + \",param_source(mag_glass)\") + \")\");\n        return this._core.selectView(null, {\n            selected: {\n                uid: \"see_more_serp\",\n                node: this._moreBar,\n                structure: new j(),\n                search: true,\n                uri: t,\n                type: \"see_more_serp\",\n                text: s,\n                selected: true,\n                semantic: u\n            }\n        });\n    };\n    e.exports = p;\n});\n__d(\"FacebarTypeaheadNarrowDrawer\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        this.$FacebarTypeaheadNarrowDrawer0 = j;\n        this.$FacebarTypeaheadNarrowDrawer1 = null;\n    };\n    i.prototype.enable = function() {\n        this.$FacebarTypeaheadNarrowDrawer1 = this.$FacebarTypeaheadNarrowDrawer0.view.subscribe(\"beforeShow\", this.$FacebarTypeaheadNarrowDrawer2.bind(this));\n    };\n    i.prototype.$FacebarTypeaheadNarrowDrawer2 = function(j, k) {\n        g.removeClass(k.getRoot(), \"-cx-PUBLIC-fbFacebarTypeaheadView__layer\");\n        g.addClass(k.getContentRoot(), \"-cx-PUBLIC-fbFacebarTypeaheadView__narrowlayer\");\n        k.setContext(this.$FacebarTypeaheadNarrowDrawer0.element.offsetParent);\n    };\n    i.prototype.disable = function() {\n        (this.$FacebarTypeaheadNarrowDrawer1 && this.$FacebarTypeaheadNarrowDrawer1.unsubscribe());\n    };\n    e.exports = i;\n});\n__d(\"FacebarTypeaheadNavigation\", [\"Arbiter\",\"FacebarNavigation\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FacebarNavigation\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this._core = l.core;\n        this._preserveQuery = false;\n        this._typeahead = l;\n    };\n    k.prototype.enable = function() {\n        h.registerBehavior(this);\n        this._core.subscribe(\"execute\", this.executedUserQuery.bind(this));\n        this._core.subscribe(\"change\", this.changeUserQuery.bind(this));\n    };\n    k.prototype.executedUserQuery = function(l, m) {\n        this._preserveQuery = true;\n    };\n    k.prototype.changeUserQuery = function() {\n        this._navigatedQuery = false;\n    };\n    k.prototype.pageTransition = function() {\n        if (!this._preserveQuery) {\n            this._core.close();\n            this._core.reset();\n        }\n         else this._preserveQuery = false;\n    ;\n    };\n    k.prototype.setPageQuery = function(l) {\n        l = this._core.setPageQuery(l);\n        this._typeahead.inform(\"navigation\", l, g.BEHAVIOR_PERSISTENT);\n    };\n    i(k.prototype, {\n        disable: j\n    });\n    e.exports = k;\n});\n__d(\"FacebarTypeaheadQuickSelect\", [\"FacebarStructuredText\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarStructuredText\"), h = b(\"URI\"), i = \"/search/web/direct_search.php\";\n    function j(k) {\n        this._core = k.getCore();\n        this._view = k.getView();\n        this._input = this._core.input;\n        this._beforeSelectListener = null;\n        this._quickSelectListener = null;\n    };\n    j.prototype.enable = function() {\n        this._beforeSelectListener = this._view.subscribe(\"beforeSelect\", this._quickSelect.bind(this));\n        this._quickSelectListener = this._view.subscribe(\"quickSelect\", this._quickSelect.bind(this));\n    };\n    j.prototype._quickSelect = function(k, l) {\n        if (((l && l.selected) && (l.selected.uid !== \"search\"))) {\n            return true\n        };\n        var m = this._input.getValue().toArray(), n = new g(m), o = n.toString();\n        if (!o) {\n            return true\n        };\n        var p = h(i).addQueryData(\"q\", o), q = {\n            input_query: o,\n            type: \"quickselect\",\n            text: o,\n            position: 0,\n            with_mouse: 0,\n            semantic: ((\"uri(path(\" + p.toString()) + \"))\"),\n            extra_uri_params: {\n                source: \"quickselect\",\n                sid: this._core.getSessionID()\n            },\n            uri: p\n        };\n        this._core.inform(\"quickSelectRedirect\", q);\n        this._core.executeQuery(q);\n        return false;\n    };\n    j.prototype.disable = function() {\n        (this._beforeSelectListener && this._view.unsubscribe(this._beforeSelectListener));\n        (this._quickSelectListener && this._view.unsubscribe(this._quickSelectListener));\n    };\n    e.exports = j;\n});\n__d(\"FacebarTypeaheadRecorderBasic\", [\"Arbiter\",\"FacebarTypeaheadRecorder\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FacebarTypeaheadRecorder\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._typeahead = k;\n    };\n    j.prototype.enable = function() {\n        var k = this._typeahead;\n        this._subscription = k.subscribe(\"init\", function(l, m) {\n            var n = new h(k);\n            k.inform(\"recorder\", n, g.BEHAVIOR_PERSISTENT);\n        });\n    };\n    j.prototype.disable = function() {\n        this._typeahead.unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    i(j.prototype, {\n        _subscription: null\n    });\n    e.exports = j;\n});\n__d(\"FacebarTypeaheadSeeMore\", [\"CSS\",\"cx\",\"DOM\",\"FacebarStructuredText\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\"), i = b(\"DOM\"), j = b(\"FacebarStructuredText\"), k = b(\"fbt\");\n    function l(m) {\n        this._core = m.getCore();\n        this._view = this._core.view;\n        this._moreBar = null;\n        this._isOpen = false;\n    };\n    l.prototype.enable = function() {\n        this._subscriptions = [this._core.subscribe(\"close\", this._close.bind(this)),this._view.subscribe(\"filter\", this._buildSeeMore.bind(this)),this._view.subscribe(\"beforeSelect\", this._beforeSelect.bind(this)),this._view.subscribe(\"next\", this._scrollView.bind(this)),this._view.subscribe(\"prev\", this._scrollView.bind(this)),this._view.subscribe(\"showingFooter\", this._footerShow.bind(this)),this._view.subscribe(\"hidingFooter\", this._footerHide.bind(this)),];\n    };\n    l.prototype.disable = function() {\n        while (this._subscriptions.length) {\n            this._subscriptions.pop().unsubscribe();;\n        };\n    };\n    l.prototype._beforeSelect = function(m, event) {\n        if ((!event.selected || (event.selected.node !== this._moreBar))) {\n            return true\n        };\n        this._view.first();\n        this._core.expandView();\n        return false;\n    };\n    l.prototype._buildSeeMore = function(m, event) {\n        var n = event.results;\n        if ((((n.length === 0) || event.isScrollable) || (event.value.toString().trim() == \"\"))) {\n            return\n        };\n        if ((n.length < this._view.maxResults)) {\n            var o = n.some(function(q) {\n                return (q.type !== \"websuggestion\");\n            });\n            if (!o) {\n                return\n            };\n        }\n         else if ((n.length > (this._view.maxResults + 1))) {\n            this._isOpen = true;\n            return;\n        }\n        \n    ;\n        var p = \"See More\";\n        this._isOpen = false;\n        this._moreBar = i.create(\"li\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadView__seemore calltoaction\"\n        }, p);\n        this._moreBar.setAttribute(\"aria-label\", p);\n        n.push({\n            uid: \"search\",\n            node: this._moreBar,\n            structure: new j(),\n            search: true\n        });\n    };\n    l.prototype._close = function() {\n        if (this._isOpen) {\n            this._core.collapseView();\n            this._isOpen = false;\n        }\n    ;\n        return true;\n    };\n    l.prototype._footerHide = function() {\n        if (this._moreBar) {\n            g.show(this._moreBar);\n            this._view.animateCount = -1;\n            this._view.animateHeightThrottled();\n        }\n    ;\n        return true;\n    };\n    l.prototype._footerShow = function() {\n        (this._moreBar && g.hide(this._moreBar));\n        return true;\n    };\n    l.prototype._scrollView = function(m, n) {\n        if (this._isOpen) {\n            this._view.scrollTo(n);\n        };\n        return true;\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadSeeMoreSerp\", [\"CSS\",\"cx\",\"DOM\",\"FacebarStructuredText\",\"FacebarURI\",\"fbt\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\"), i = b(\"DOM\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarURI\"), l = b(\"fbt\"), m = b(\"URI\");\n    function n(o) {\n        this._core = o.getCore();\n        this._view = this._core.view;\n        this._moreBar = null;\n    };\n    n.prototype.enable = function() {\n        this._subscriptions = [this._view.subscribe(\"filter\", this._buildSeeMore.bind(this)),this._view.subscribe(\"showingFooter\", this._footerShow.bind(this)),this._view.subscribe(\"hidingFooter\", this._footerHide.bind(this)),];\n    };\n    n.prototype.disable = function() {\n        while (this._subscriptions.length) {\n            this._subscriptions.pop().unsubscribe();;\n        };\n    };\n    n.prototype._buildSeeMore = function(o, event) {\n        var p = event.results, q = event.value.toString().trim();\n        if ((((p.length === 0) || event.isScrollable) || (q === \"\"))) {\n            return\n        };\n        var r = l._(\"See more results for \\\"{query}\\\"\", [l.param(\"query\", q),]);\n        this._moreBar = i.create(\"li\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadView__seemoreserp calltoaction\"\n        }, [i.create(\"span\", {\n            className: \"text\"\n        }, [i.create(\"span\", {\n            className: \"seeMore\"\n        }, [r,]),]),]);\n        var s = m(this._view.seeMoreSerpEndpoint).addQueryData(\"q\", q).addQueryData(\"sid\", this._core.getSessionID());\n        s = k.getQualifiedURI(s);\n        var t = ((((((((\"uri(\" + \"path(\") + this._view.seeMoreSerpEndpoint) + \")\") + \",param_q(\") + q) + \")\") + \",param_source(typeahead_footer)\") + \")\");\n        this._moreBar.setAttribute(\"aria-label\", r);\n        p.push({\n            uid: \"see_more_serp\",\n            node: this._moreBar,\n            structure: new j(),\n            search: true,\n            uri: s,\n            type: \"see_more_serp\",\n            text: q,\n            semantic: t\n        });\n    };\n    n.prototype._footerHide = function() {\n        if (this._moreBar) {\n            g.show(this._moreBar);\n            this._view.animateCount = -1;\n            this._view.animateHeightThrottled();\n        }\n    ;\n        return true;\n    };\n    n.prototype._footerShow = function() {\n        (this._moreBar && g.hide(this._moreBar));\n        return true;\n    };\n    e.exports = n;\n});\n__d(\"FacebarTypeaheadSelectAll\", [\"requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"requestAnimationFrame\");\n    function h(i) {\n        this._core = i.getCore();\n        this._listener = null;\n    };\n    h.prototype.enable = function() {\n        var i = this._core.input;\n        this._listener = this._core.subscribe(\"focus\", function() {\n            g(function() {\n                i.selectInput();\n            }.bind(this));\n        }.bind(this));\n    };\n    h.prototype.disable = function() {\n        (this._listener && this._core.unsubscribe(this._listener));\n    };\n    e.exports = h;\n});\n__d(\"FacebarTypeaheadShortcut\", [\"KeyEventController\",\"Run\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyEventController\"), h = b(\"Run\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this._input = l.core.input;\n        this._view = l.view;\n        this._listener = null;\n    };\n    k.prototype.enable = function() {\n        this._registerListener();\n    };\n    k.prototype._registerListener = function() {\n        g.registerKey(\"SLASH\", this._handleKeydown.bind(this));\n        h.onLeave(function() {\n            this._registerListener.bind(this).defer();\n        }.bind(this));\n    };\n    k.prototype._handleKeydown = function(l) {\n        this._view.setAutoSelect(true);\n        this._input.focus();\n        this._input.inform(\"shortcut\", {\n            shift: l.getModifiers().shift\n        });\n        return false;\n    };\n    i(k.prototype, {\n        disable: j\n    });\n    e.exports = k;\n});\n__d(\"FacebarTypeaheadSizeAdjuster\", [\"copyProperties\",\"createArrayFrom\",\"clip\",\"emptyFunction\",\"foldl\",\"Style\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"clip\"), j = b(\"emptyFunction\"), k = b(\"foldl\"), l = b(\"Style\"), m = b(\"Vector\"), n = 12, o = 20, p = 50, q = 200, r = 5;\n    function s(u) {\n        return m.getElementDimensions(u).x;\n    };\n    function t(u) {\n        this._core = u.getCore();\n        this._view = this._core.view;\n        this._input = this._core.input;\n        this._cachedSizes = {\n        };\n        this._appliedSize = null;\n        this._defaultSize = this.getDefaultFontSize();\n        this._calculatedSize = this._defaultSize;\n        this._containerWidth = this.getContainerWidth();\n    };\n    t.prototype.enable = function() {\n        this._input.subscribe(\"change\", this.adjustFontSize.bind(this));\n        this.adjustFontSize();\n    };\n    t.prototype.getContainerWidth = function() {\n        return m.getElementDimensions(this._input.getElement()).x;\n    };\n    t.prototype.getDefaultFontSize = function() {\n        var u = l.get(this._input.getElement(), \"font-size\"), v = /^([\\d\\.]+)px$/.exec(u), w = (v && Number(v[1]));\n        return Math.max(n, Math.min(o, w));\n    };\n    t.prototype.calculateFontSize = function() {\n        var u = this.getTextWidth(), v = this._calculatedSize;\n        if ((u > (this._containerWidth - p))) {\n            v--;\n        }\n         else if ((u < (this._containerWidth - q))) {\n            v++;\n        }\n    ;\n        this._calculatedSize = i(v, n, this._defaultSize);\n        return this._calculatedSize;\n    };\n    t.prototype.getTextWidth = function() {\n        var u = (this._calculatedSize + this.getValueKey());\n        if (!this._cachedSizes.hasOwnProperty(u)) {\n            this._cachedSizes[u] = this.measureTextWidth();\n        };\n        return this._cachedSizes[u];\n    };\n    t.prototype.getValueKey = function() {\n        var u = this._core.getValue().getHash(), v = (r * Math.floor((u.length / r)));\n        return u.substr(0, v);\n    };\n    t.prototype.measureTextWidth = function() {\n        var u = this._input.getRawInputElement().childNodes;\n        return k(function(v, w) {\n            return (v + s(w));\n        }, h(u), 0);\n    };\n    t.prototype.adjustFontSize = function() {\n        for (var u = 0; (u < 10); u++) {\n            var v = this.calculateFontSize();\n            if ((v != this._appliedSize)) {\n                this._appliedSize = v;\n                l.set(this._input.getElement(), \"font-size\", (v + \"px\"));\n                l.set(this._view.content, \"font-size\", (v + \"px\"));\n            }\n             else break;\n        ;\n        };\n    };\n    g(t.prototype, {\n        disable: j\n    });\n    e.exports = t;\n});\n__d(\"FacebarTypeaheadTourItem\", [\"cx\",\"DOM\",\"FacebarTypeaheadItem\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"FacebarTypeaheadItem\");\n    for (var j in i) {\n        if ((i.hasOwnProperty(j) && (j !== \"_metaprototype\"))) {\n            l[j] = i[j];\n        };\n    };\n    var k = ((i === null) ? null : i.prototype);\n    l.prototype = Object.create(k);\n    l.prototype.constructor = l;\n    l.__superConstructor__ = i;\n    function l(m) {\n        i.call(this, m);\n    };\n    l.prototype.renderIcon = function() {\n        return h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__iconwrapper\"\n        }, h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__touricon\"\n        }));\n    };\n    l.prototype.renderSubtext = function() {\n        this.setVAlign(false);\n        return k.renderSubtext.call(this);\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadTour\", [\"Arbiter\",\"AsyncRequest\",\"BrowseNUXController\",\"FacebarStructuredText\",\"FacebarTypeaheadTourItem\",\"copyProperties\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BrowseNUXController\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarTypeaheadTourItem\"), l = b(\"copyProperties\"), m = b(\"fbt\");\n    function n(o) {\n        this._core = o.getCore();\n        this._view = this._core.view;\n        this._moreBar = null;\n        this._events = [];\n        this._subscriptions = [];\n        this._item = {\n            uid: \"tour\",\n            uri: \"#\",\n            structure: j.fromString(\"Take the tour\")\n        };\n    };\n    n.prototype.enable = function() {\n        this._subscriptions = [g.subscribe(\"BrowseNUX/initialized\", this._initEvents.bind(this)),g.subscribe(\"BrowseNUX/starting\", this._removeEvents.bind(this)),g.subscribe(\"BrowseNUX/finished\", this._initEvents.bind(this)),];\n    };\n    n.prototype.disable = function() {\n        while (this._subscriptions.length) {\n            this._subscriptions.pop().unsubscribe();;\n        };\n    };\n    n.prototype._initEvents = function() {\n        this._events = [this._view.subscribe(\"filter\", this._addTour.bind(this)),this._view.subscribe(\"beforeSelect\", this._beforeSelect.bind(this)),];\n        this._core.requery();\n    };\n    n.prototype._removeEvents = function() {\n        while (this._events.length) {\n            this._events.pop().unsubscribe();;\n        };\n        this._core.requery();\n    };\n    n.prototype._isNullState = function() {\n        return this._core.input.getValue().isEmpty();\n    };\n    n.prototype._addTour = function(o, event) {\n        var p = event.results;\n        if (((p.length === 0) || !this._isNullState())) {\n            return\n        };\n        var q = new k(this._item);\n        q.setShouldRenderEducation(false);\n        this._moreBar = q.render();\n        var r = p.length;\n        while ((--r >= 0)) {\n            if ((p[r].removable === true)) {\n                break;\n            };\n        };\n        p.splice((r + 1), 0, l(this._item, {\n            node: this._moreBar\n        }));\n    };\n    n.prototype._beforeSelect = function(o, event) {\n        if ((event.selected.node === this._moreBar)) {\n            i.showSearchBarTour();\n            return false;\n        }\n    ;\n        new h(\"/ajax/browse/nux_addquery.php\").send();\n        return true;\n    };\n    e.exports = n;\n});\n__d(\"FacebarTypeaheadTrigger\", [\"copyProperties\",\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Arbiter\");\n    function i(j) {\n        this._typeahead = j;\n        this._core = j.getCore();\n        this._subscription = null;\n    };\n    i.prototype.enable = function() {\n        this._subscription = h.subscribe(\"FacebarTrigger/select\", this._activateTrigger.bind(this));\n    };\n    i.prototype.disable = function() {\n        h.unsubscribe(this._subscription);\n    };\n    i.prototype._activateTrigger = function(j, k) {\n        var l = g({\n            type: \"grammar\",\n            uri: null,\n            structure: null\n        }, k);\n        if (!l.uri) {\n            this._core.open();\n            this._core.setQuery(l, false);\n        }\n         else this._core.executeQuery(l);\n    ;\n    };\n    e.exports = i;\n});\n__d(\"FacebarTypeaheadGrammarItem\", [\"cx\",\"DOM\",\"FacebarTypeaheadItem\",\"FacebarTypeaheadToken\",\"FacebarTypeaheadEntityToken\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"FacebarTypeaheadItem\"), j = b(\"FacebarTypeaheadToken\"), k = b(\"FacebarTypeaheadEntityToken\"), l = b(\"fbt\");\n    for (var m in i) {\n        if ((i.hasOwnProperty(m) && (m !== \"_metaprototype\"))) {\n            o[m] = i[m];\n        };\n    };\n    var n = ((i === null) ? null : i.prototype);\n    o.prototype = Object.create(n);\n    o.prototype.constructor = o;\n    o.__superConstructor__ = i;\n    function o(p) {\n        i.call(this, p);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__queryitem\");\n    };\n    o.prototype.renderIcon = function() {\n        if (this._result.photo) {\n            return h.create(\"img\", {\n                className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityicon\",\n                alt: \"\",\n                src: this._result.photo\n            })\n        };\n        return h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__iconwrapper\"\n        }, h.create(\"span\", {\n            className: this._result.icon_class\n        }));\n    };\n    o.prototype.renderSubtext = function() {\n        var p = this._result.decoration, q = this._result.ambiguity, r = (q && q.text), s = (((p && p.entity)) || ((q && q.entity)));\n        if (r) {\n            return new j([r,]).render();\n        }\n         else if (s) {\n            this.setVAlign(false);\n            return new k(s).setDefaultText(\"user\", \"Person\").setLeadingMiddot(true).setLimit(2).render();\n        }\n        \n    ;\n    };\n    e.exports = o;\n});\n__d(\"FacebarTypeaheadKeywordItem\", [\"cx\",\"FacebarTypeaheadGrammarItem\",\"FacebarTypeaheadToken\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"FacebarTypeaheadGrammarItem\"), i = b(\"FacebarTypeaheadToken\"), j = \"-cx-PUBLIC-fbFacebarTypeaheadToken__subtext\";\n    for (var k in h) {\n        if ((h.hasOwnProperty(k) && (k !== \"_metaprototype\"))) {\n            m[k] = h[k];\n        };\n    };\n    var l = ((h === null) ? null : h.prototype);\n    m.prototype = Object.create(l);\n    m.prototype.constructor = m;\n    m.__superConstructor__ = h;\n    function m(n) {\n        h.call(this, n);\n    };\n    m.prototype.renderSubtext = function() {\n        var n = new i([\"Search\",], j);\n        return n.render();\n    };\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadSponsoredEntityItem\", [\"AsyncRequest\",\"Bootloader\",\"CSS\",\"cx\",\"DOM\",\"emptyFunction\",\"Event\",\"HTML\",\"FacebarTypeaheadEntityItem\",\"FacebarTypeaheadToken\",\"tx\",\"TypeaheadSearchSponsored\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"cx\"), k = b(\"DOM\"), l = b(\"emptyFunction\"), m = b(\"Event\"), n = b(\"HTML\"), o = b(\"FacebarTypeaheadEntityItem\"), p = b(\"FacebarTypeaheadToken\"), q = b(\"tx\"), r = b(\"TypeaheadSearchSponsored\"), s = \"\\u00b7\";\n    for (var t in o) {\n        if ((o.hasOwnProperty(t) && (t !== \"_metaprototype\"))) {\n            v[t] = o[t];\n        };\n    };\n    var u = ((o === null) ? null : o.prototype);\n    v.prototype = Object.create(u);\n    v.prototype.constructor = v;\n    v.__superConstructor__ = o;\n    function v(w) {\n        o.call(this, w);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\");\n    };\n    v.prototype.renderSubtext = function() {\n        var w = this._result, x = w.category;\n        if (w.category.__html) {\n            x = k.getText(n(x).getRootNode());\n        };\n        var y = [];\n        y.push(q._(\"Sponsored {category}\", {\n            category: x\n        }));\n        y.push(this.getHideLink());\n        return new p(y).render();\n    };\n    v.prototype.render = function() {\n        var w = u.render.call(this);\n        i.addClass(w, \"-cx-PRIVATE-fbFacebarTypeaheadToken__sponsored\");\n        return w;\n    };\n    v.prototype.getHideLink = function() {\n        var w = k.create(\"a\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__report\",\n            href: \"#\",\n            title: \"Hide the ad\"\n        }, \"\\u2715\");\n        m.listen(w, \"click\", this.hideSponsoredResult.bind(this));\n        return w;\n    };\n    v.prototype.renderText = function() {\n        var w = u.renderText.call(this);\n        w.push(this.getSponsoredMessage());\n        return w;\n    };\n    v.prototype.getSponsoredMessage = function() {\n        if (this._result.s_message) {\n            return k.create(\"span\", {\n                className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__sponsoredmessage\"\n            }, [((\" \" + s) + \" \"),this._result.s_message,])\n        };\n        return [];\n    };\n    v.prototype.hideSponsoredResult = function(event) {\n        r.hideAdResult(this._result.uid);\n        h.loadModules([\"AdsHidePoll\",\"Dialog\",], function(w, x) {\n            var y = new x().setModal(true).setTitle(\"Ad was hidden\").setButtons(x.CLOSE);\n            new w(y.getBody(), this._result.s_token).setShowTitle(false).setUndoHandler(function() {\n                r.undoHideAdResult(this._result.uid);\n                y.hide();\n            }.bind(this)).renderAsync(function() {\n                y.show();\n            });\n        }.bind(this));\n        new g(\"/ajax/ads/hide\").setData({\n            action: \"hide\",\n            impression: this._result.s_token\n        }).setMethod(\"post\").setHandler(l).send();\n    };\n    e.exports = v;\n});\n__d(\"FacebarTypeaheadWebSuggestionItem\", [\"cx\",\"DOM\",\"FacebarTypeaheadItem\",\"FacebarTypeaheadToken\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"FacebarTypeaheadItem\"), j = b(\"FacebarTypeaheadToken\"), k = {\n        EXACT_MATCH: 1,\n        BING: 2,\n        BING_POPULAR: 3,\n        WEBSUGGESTIONS_AS_KEYWORDS: 4\n    }, l = \"-cx-PUBLIC-fbFacebarTypeaheadToken__websuggestioninner\";\n    for (var m in i) {\n        if ((i.hasOwnProperty(m) && (m !== \"_metaprototype\"))) {\n            o[m] = i[m];\n        };\n    };\n    var n = ((i === null) ? null : i.prototype);\n    o.prototype = Object.create(n);\n    o.prototype.constructor = o;\n    o.__superConstructor__ = i;\n    function o(p) {\n        i.call(this, p);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__queryitem\");\n    };\n    o.prototype.renderIcon = function() {\n        return h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__iconwrapper\"\n        }, h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__webicon\"\n        }));\n    };\n    o.prototype.renderSubtext = function() {\n        if (this._result.isLockedWebSearchMode) {\n            return\n        };\n        var p, q;\n        p = this._result.websuggestion_source;\n        var r = ((p === k.WEBSUGGESTIONS_AS_KEYWORDS) ? \"Search\" : ((p === k.BING_POPULAR) ? \"Popular Web Search\" : \"Web Search\"));\n        q = new j([r,], l);\n        return q.render();\n    };\n    e.exports = o;\n});\n__d(\"FacebarTypeaheadRenderer\", [\"FacebarTypeaheadEntityItem\",\"FacebarTypeaheadGrammarItem\",\"FacebarTypeaheadKeywordItem\",\"FacebarTypeaheadWebSuggestionItem\",\"FacebarTypeaheadSponsoredEntityItem\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarTypeaheadEntityItem\"), h = b(\"FacebarTypeaheadGrammarItem\"), i = b(\"FacebarTypeaheadKeywordItem\"), j = b(\"FacebarTypeaheadWebSuggestionItem\"), k = b(\"FacebarTypeaheadSponsoredEntityItem\"), l = {\n    };\n    function m(o) {\n        if (o.isSponsored) {\n            return new k(o);\n        }\n         else if ((o.type == \"websuggestion\")) {\n            return new j(o);\n        }\n         else if ((o.results_set_type == \"browse_type_blended\")) {\n            return new i(o);\n        }\n         else if ((o.type == \"grammar\")) {\n            return new h(o);\n        }\n         else return new g(o)\n        \n        \n        \n    ;\n    };\n    function n(o) {\n        var p = ((!o.fetchType && !o.isSponsored) && !o.isLockedWebSearchMode), q = o.uid, r = (p && l[q]), s = m(o);\n        if (!r) {\n            this.inform(\"renderingItem\", {\n                item: s,\n                result: o\n            });\n            r = s.render();\n            p = (p && s.cacheable());\n        }\n    ;\n        var t = r;\n        if (p) {\n            l[q] = r;\n            t = r.cloneNode(true);\n        }\n    ;\n        s.highlight(t);\n        return t;\n    };\n    e.exports = n;\n});");
// 9566
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"seea0c17ebd1a26d49fc43a456e604c511a079af1");
// 9567
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"G3fzU\",]);\n}\n;\n;\n__d(\"concatMap\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        var j = -1, k = i.length, l = [], m;\n        while (((++j < k))) {\n            m = h(i[j], j, i);\n            ((Array.isArray(m) ? Array.prototype.push.apply(l, m) : Array.prototype.push.call(l, m)));\n        };\n    ;\n        return l;\n    };\n;\n    e.exports = g;\n});\n__d(\"NodeHighlighter\", [\"concatMap\",\"createArrayFrom\",\"escapeRegex\",\"TokenizeUtil\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"concatMap\"), h = b(\"createArrayFrom\"), i = b(\"escapeRegex\"), j = b(\"TokenizeUtil\"), k = b(\"DOM\");\n    function l(o, p) {\n        var q = k.getText(o).split(p), r = q.map(function(s) {\n            if (p.test(s)) {\n                return m(s);\n            }\n        ;\n        ;\n            return ((s || \"\"));\n        });\n        return ((((q.length > 1)) ? r : null));\n    };\n;\n    function m(o) {\n        return k.create(\"span\", {\n            class: \"highlightNode\"\n        }, o);\n    };\n;\n    var n = {\n        getTextNodes: function(o) {\n            if (((this.isLeafNode(o) || this.isStopNode(o)))) {\n                return o;\n            }\n             else if (this.isDiscardNode(o)) {\n                return [];\n            }\n            \n        ;\n        ;\n            return g(this.getTextNodes.bind(this), h(o.childNodes));\n        },\n        getHighlightCandidates: function() {\n            return [];\n        },\n        isLeafNode: function(o) {\n            return k.isTextNode(o);\n        },\n        isStopNode: function(o) {\n            return false;\n        },\n        isDiscardNode: function(o) {\n            return false;\n        },\n        createSegmentedRegex: function(o) {\n            var p = j.getPunctuation();\n            return ((((((((((((\"(^|\\\\s|\" + p)) + \")(\")) + o.map(String).map(i).join(\"|\"))) + \")(?=(?:$|\\\\s|\")) + p)) + \"))\"));\n        },\n        createNonSegmentedRegex: function(o) {\n            return ((((\"(\" + o.map(String).join(\"|\"))) + \")\"));\n        },\n        createRegex: function(o) {\n            var p = /[\\u0E00-\\u109F\\u2000-\\uFFFF]/, q = [], r = [];\n            o.forEach(function(t) {\n                if (p.test(t)) {\n                    r.push(t);\n                }\n                 else q.push(t);\n            ;\n            ;\n            });\n            var s = \"\";\n            if (q.length) {\n                s += this.createSegmentedRegex(q);\n                s += (((r.length) ? \"|\" : \"\"));\n            }\n        ;\n        ;\n            if (r.length) {\n                s += this.createNonSegmentedRegex(r);\n            }\n        ;\n        ;\n            return new RegExp(s, \"i\");\n        },\n        highlight: function(o, p) {\n            if (((((!p || ((p.length === 0)))) || !o))) {\n                return;\n            }\n        ;\n        ;\n            var q = g(function(s) {\n                return g(this.getTextNodes.bind(this), k.scry(o, s));\n            }.bind(this), this.getHighlightCandidates()), r = this.createRegex(p);\n            q.forEach(function(s) {\n                var t = l(s, r);\n                if (t) {\n                    if (this.isStopNode(s)) {\n                        k.setContent(s, t);\n                    }\n                     else k.replace(s, t);\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    };\n    e.exports = n;\n});\n__d(\"BrowseFacebarHighlighter\", [\"copyProperties\",\"JSBNG__CSS\",\"csx\",\"escapeRegex\",\"NodeHighlighter\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"JSBNG__CSS\"), i = b(\"csx\"), j = b(\"escapeRegex\"), k = b(\"NodeHighlighter\"), l = {\n    };\n    g(l, k, {\n        getHighlightCandidates: function() {\n            return [\".-cx-PUBLIC-fbFacebarTypeaheadItem__labeltitle\",];\n        },\n        isDiscardNode: function(m) {\n            return h.hasClass(m, \"DefaultText\");\n        },\n        createSegmentedRegex: function(m) {\n            return ((((\"(^|\\\\s|\\\\b)(\" + m.map(String).map(j).join(\"|\"))) + \")\"));\n        }\n    });\n    e.exports = l;\n});\n__d(\"BrowseNUXBootstrap\", [\"Arbiter\",\"AsyncRequest\",\"invariant\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"invariant\"), j = b(\"Run\"), k = null, l = null, m = null, n = {\n        registerFacebar: function(o) {\n            i(!k);\n            k = o;\n            j.onLoad(function() {\n                new h(\"/ajax/browse/nux.php\").setAllowCrossPageTransition(true).send();\n            });\n        },\n        registerStory: function(o) {\n            l = o;\n            g.inform(\"BrowseNUX/story\", {\n            }, g.BEHAVIOR_STATE);\n        },\n        registerTypeaheadUnit: function(o) {\n            m = o;\n            g.inform(\"BrowseNUX/typeaheadUnit\", {\n            }, g.BEHAVIOR_STATE);\n        },\n        getFacebarData: function() {\n            return k;\n        },\n        getStoryData: function() {\n            return l;\n        },\n        getTypeaheadUnitData: function() {\n            return m;\n        }\n    };\n    e.exports = n;\n});\n__d(\"BrowseNUXCheckpoint\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\");\n    function i(l, m) {\n        new g(\"/ajax/browse/nux_checkpoint.php\").setData(l).setFinallyHandler(((m || h))).send();\n    };\n;\n    var j = null, k = {\n        SHOW_MEGAPHONE: 0,\n        RESULTS_VIEW: 1,\n        COMPLETED: 2,\n        init: function(l) {\n            j = l;\n        },\n        getStep: function() {\n            return j;\n        },\n        setStep: function(l, m) {\n            j = l;\n            i({\n                nextStep: l\n            }, m);\n        },\n        setFinished: function(l) {\n            j = k.COMPLETED;\n            i({\n                finished: true\n            }, l);\n        }\n    };\n    e.exports = k;\n});\n__d(\"BrowseNUXMegaphone\", [\"JSBNG__Event\",\"function-extensions\",\"Animation\",\"ArbiterMixin\",\"BrowseNUXBootstrap\",\"JSBNG__CSS\",\"cx\",\"DOM\",\"Ease\",\"MegaphoneHelper\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Animation\"), i = b(\"ArbiterMixin\"), j = b(\"BrowseNUXBootstrap\"), k = b(\"JSBNG__CSS\"), l = b(\"cx\"), m = b(\"DOM\"), n = b(\"Ease\"), o = b(\"MegaphoneHelper\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"csx\");\n    function u(v) {\n        this.megaphone = v;\n        this.contentArea = null;\n        this.className = null;\n        this.startButton = m.JSBNG__find(this.megaphone, \"a.-cx-PRIVATE-fbBrowseNUXMegaphone__button\");\n        this.hideLink = m.JSBNG__find(this.megaphone, \"a.-cx-PRIVATE-fbBrowseNUXMegaphone__hidelink\");\n        g.listen(this.startButton, \"click\", this._handleStart.bind(this));\n        g.listen(this.hideLink, \"click\", this._handleHide.bind(this));\n    };\n;\n    s(u.prototype, i, {\n        _attachListener: function() {\n            var v = 1, w = function() {\n                var x = this._getScrollOpacity();\n                if (((x !== v))) {\n                    p.set(this.megaphone, \"opacity\", ((((x === 1)) ? \"\" : x)));\n                    k.conditionShow(this.megaphone, ((x > 0)));\n                    v = x;\n                }\n            ;\n            ;\n            }.bind(this);\n            this.listener = g.listen(window, \"JSBNG__scroll\", w);\n            w();\n        },\n        _removeListener: function() {\n            if (this.listener) {\n                this.listener.remove();\n                this.listener = null;\n            }\n        ;\n        ;\n        },\n        _getScrollOpacity: function() {\n            var v = q.getElementPosition(r(\"globalContainer\"), \"viewport\"), w = Math.max(0, Math.min(1, ((((v.y + 70)) / 40))));\n            return n.circOut(w);\n        },\n        _handleStart: function() {\n            this.inform(\"start\");\n        },\n        _handleHide: function() {\n            var v = j.getStoryData();\n            o.hideStory(v.id, v.JSBNG__location);\n            this.inform(\"hide\");\n            this.hide();\n        },\n        setClass: function(v) {\n            ((this.className && k.removeClass(this.megaphone, this.className)));\n            k.addClass(this.megaphone, v);\n            this.className = v;\n        },\n        show: function(v) {\n            if (this.shown) {\n                return;\n            }\n        ;\n        ;\n            this.shown = true;\n            this.contentArea = v;\n            var w = 5, x = ((r(\"blueBarHolder\").offsetHeight - w));\n            p.set(this.megaphone, \"JSBNG__top\", ((x + \"px\")));\n            p.set(this.megaphone, \"opacity\", 0);\n            m.appendContent(r(\"pageHead\"), this.megaphone);\n            k.show(this.megaphone);\n            var y = ((((this.megaphone.offsetHeight || 90)) - w));\n            if (k.hasClass(JSBNG__document.body, \"-cx-PUBLIC-fbBrowseLayout__fullwidth\")) {\n                y = 0;\n            }\n        ;\n        ;\n            new h(v).to(\"marginTop\", y).duration(500).ease(n.sineOut).go();\n            var z = this._getScrollOpacity();\n            if (z) {\n                new h(this.megaphone).duration(250).checkpoint().to(\"opacity\", z).duration(250).ease(n.makePowerIn(2)).ondone(function() {\n                    if (((z === 1))) {\n                        p.set(this.megaphone, \"opacity\", \"\");\n                    }\n                ;\n                ;\n                    this._attachListener();\n                }.bind(this)).go();\n            }\n             else {\n                this._attachListener();\n                k.hide(this.megaphone);\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (!this.shown) {\n                return;\n            }\n        ;\n        ;\n            this.shown = false;\n            this._removeListener();\n            new h(this.megaphone).to(\"opacity\", 0).duration(250).ease(n.makePowerOut(2)).go();\n            new h(this.contentArea).to(\"marginTop\", 0).duration(500).ease(n.sineIn).ondone(m.remove.curry(this.megaphone)).go();\n        }\n    });\n    e.exports = u;\n});\n__d(\"TextSelection\", [], function(a, b, c, d, e, f) {\n    var g = window.JSBNG__getSelection, h = JSBNG__document.selection, i = {\n        JSBNG__getSelection: function() {\n            if (g) {\n                return ((g() + \"\"));\n            }\n             else if (h) {\n                return h.createRange().text;\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        clearSelection: function() {\n            if (g) {\n                g().removeAllRanges();\n            }\n             else if (h) {\n                h.empty();\n            }\n            \n        ;\n        ;\n        },\n        selectAllInNode: function(j) {\n            var k = JSBNG__document.body.createTextRange;\n            if (k) {\n                var l = k();\n                l.moveToElementText(j);\n                l.select();\n            }\n             else if (g) {\n                var m = g(), n = JSBNG__document.createRange();\n                n.selectNodeContents(j);\n                m.removeAllRanges();\n                m.addRange(n);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"BrowseNUXTourDialog\", [\"JSBNG__Event\",\"Animation\",\"JSBNG__CSS\",\"DOMQuery\",\"LayerSlowlyFadeOnShow\",\"TextSelection\",\"UserAgent\",\"copyProperties\",\"csx\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"JSBNG__CSS\"), j = b(\"DOMQuery\"), k = b(\"LayerSlowlyFadeOnShow\"), l = b(\"TextSelection\"), m = b(\"UserAgent\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = b(\"emptyFunction\");\n    function r(s, t) {\n        this.dialog = s;\n        this.typeahead = t;\n        this.dialog.enableBehavior(k);\n        this._closeButtonHandler = null;\n        i.addClass(this.dialog.getRoot(), \"-cx-PRIVATE-fbBrowseNUXTourDialog__root\");\n        i.addClass(this.dialog.getContent(), \"-cx-PRIVATE-fbBrowseNUXTourDialog__content\");\n        this.subscription = this.dialog.subscribe(\"beforehide\", q.thatReturnsFalse);\n    };\n;\n    n(r.prototype, {\n        showWithContext: function(s, t) {\n            this.resultIndex = t;\n            this.dialog.setContext(s).show();\n            l.clearSelection();\n        },\n        getButton: function() {\n            return j.JSBNG__find(this.dialog.getRoot(), \"a.-cx-PRIVATE-fbBrowseNUX__nextbutton\");\n        },\n        getCloseButton: function() {\n            return j.JSBNG__find(this.dialog.getRoot(), \"a.-cx-PRIVATE-fbBrowseNUX__closebutton\");\n        },\n        activateCloseButton: function(s) {\n            var t = this.getCloseButton();\n            this._closeButtonHandler = g.listen(t, \"click\", function(JSBNG__event) {\n                this.reset();\n                s(JSBNG__event);\n            }.bind(this));\n            i.show(t);\n        },\n        showButton: function() {\n            var s = this.getButton();\n            i.removeClass(s, \"invisible_elem\");\n            new h(s).to(\"opacity\", 1).go();\n        },\n        setNextHandler: function(s) {\n            var t = g.listen(this.getButton(), \"click\", function(JSBNG__event) {\n                t.remove();\n                this.reset();\n                s(JSBNG__event);\n            }.bind(this));\n        },\n        reset: function() {\n            this.subscription.unsubscribe();\n            ((this._closeButtonHandler && this._closeButtonHandler.remove()));\n            this.dialog.hide();\n        }\n    });\n    e.exports = r;\n});\n__d(\"AutoTypewriter\", [], function(a, b, c, d, e, f) {\n    var g = [null,null,], h = {\n        request: function(i, j, k) {\n            k = ((k || 200));\n            var l = false, m = 1, n = g.length;\n            (function o() {\n                if (l) {\n                    return;\n                }\n            ;\n            ;\n                var p = j.substr(0, m);\n                if (((p === j))) {\n                    i(p, true);\n                    g[n] = null;\n                }\n                 else {\n                    i(p, false);\n                    m++;\n                    JSBNG__setTimeout(o, k);\n                }\n            ;\n            ;\n            })();\n            g[n] = function() {\n                l = true;\n            };\n            return n;\n        },\n        cancel: function(i) {\n            if (!g[i]) {\n                return false;\n            }\n        ;\n        ;\n            g[i]();\n            g[i] = null;\n            return true;\n        }\n    };\n    e.exports = h;\n});\n__d(\"BrowseNUXTypewriter\", [\"Arbiter\",\"AutoTypewriter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AutoTypewriter\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.structuredInput = k;\n    };\n;\n    i(j.prototype, {\n        setValue: function(k, l) {\n            this._type(k, function(m, n) {\n                g.inform(\"BrowseNUX/typing\");\n                this.structuredInput.setText(m);\n                this.structuredInput.togglePlaceholder();\n                this.structuredInput.moveSelectionToEnd();\n            }.bind(this), l);\n        },\n        prependFragment: function(k, l) {\n            var m = this.structuredInput, n = m.getStructure();\n            this._type(k.text, function(o) {\n                g.inform(\"BrowseNUX/typing\");\n                k.text = o;\n                m.setStructure([k,].concat(n));\n                m.setSelection({\n                    offset: o.length,\n                    length: 0\n                });\n            }, l);\n        },\n        abort: function() {\n            if (this._token) {\n                h.cancel(this._token);\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        _type: function(k, l, m) {\n            this.abort();\n            var n = this.structuredInput;\n            this._wasEnabled = n.getEnabled();\n            n.setEnabled(true);\n            n.JSBNG__focus();\n            this._token = h.request(function(o, p) {\n                l(o);\n                if (p) {\n                    this._cleanup();\n                    ((m && m()));\n                }\n            ;\n            ;\n            }.bind(this), k, 100);\n        },\n        _cleanup: function() {\n            this.structuredInput.setEnabled(this._wasEnabled);\n            delete this._token;\n            delete this._wasEnabled;\n        }\n    });\n    e.exports = j;\n});\n__d(\"FacebarSemanticQuery\", [\"URI\",\"copyProperties\",\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"copyProperties\"), i = b(\"Env\"), j = \"str\";\n    function k(t) {\n        var u = {\n            me: i.user\n        };\n        return h(u, t.semantic_map);\n    };\n;\n    function l(t, u) {\n        var v = k(t);\n        if (((typeof v[u] !== \"undefined\"))) {\n            return String(v[u]);\n        }\n    ;\n    ;\n        return u;\n    };\n;\n    function m(t) {\n        return new g(\"/profile.php\").addQueryData({\n            id: t\n        });\n    };\n;\n    function n(t, u) {\n        var v, w = q(u), x = {\n        };\n        for (var y = 0; ((y < w.length)); ++y) {\n            if (((w[y].indexOf(\"path(\") === 0))) {\n                v = g(q(w[y])[0]);\n            }\n             else {\n                var z = w[y].substring(6, w[y].indexOf(\"(\")).split(\"_\"), aa = q(w[y]);\n                for (var ba = 0; ((ba < z.length)); ++ba) {\n                    x[z[ba]] = l(t, aa[ba]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        v.addQueryData(x);\n        return v;\n    };\n;\n    function o(t, u) {\n        var v = [u,], w = [], x = t.browse_functions, y = t.search_path;\n        while (((v.length > 0))) {\n            var z = v.pop();\n            if (!p(z)) {\n                w.push(z);\n                continue;\n            }\n        ;\n        ;\n            var aa = z.substring(0, z.indexOf(\"(\")), ba = aa, ca = q(z);\n            if (!x[aa]) {\n                w = [];\n                break;\n            }\n        ;\n        ;\n            var da = x[aa].minNumParams, ea = x[aa].maxNumParams;\n            if (((v.length > 0))) {\n                if (x[aa].numParamsUnbounded) {\n                    if (((w.length > 0))) {\n                        aa += ((\"-\" + ca.length));\n                    }\n                ;\n                ;\n                }\n                 else if (((((((ca.length != 1)) && ((ca.length > da)))) || ((((ca.length === 0)) && ((da != ea))))))) {\n                    aa += ((\"-\" + ca.length));\n                }\n                \n            ;\n            }\n        ;\n        ;\n            v.push(aa);\n            for (var fa = 0; ((fa < ca.length)); fa++) {\n                if (((ca[fa].length === 0))) {\n                    continue;\n                }\n            ;\n            ;\n                if (x[ba].allowsFreeText) {\n                    v.push(((((j + \"/\")) + encodeURIComponent(ca[fa]))));\n                }\n                 else v.push(ca[fa]);\n            ;\n            ;\n            };\n        ;\n        };\n    ;\n        return g(((y + w.join(\"/\"))));\n    };\n;\n    function p(t) {\n        return (/^[a-z\\-]+\\(.*\\)$/).test(t);\n    };\n;\n    function q(t) {\n        if (((!p(t) && ((t.indexOf(\"param_\") !== 0))))) {\n            return [t,];\n        }\n    ;\n    ;\n        var u = t.substring(((t.indexOf(\"(\") + 1)), ((t.length - 1)));\n        if (((u.length === 0))) {\n            return [];\n        }\n    ;\n    ;\n        return r(u);\n    };\n;\n    function r(t) {\n        var u = [], v = 0, w = 0;\n        for (var x = 0; ((x < t.length)); ++x) {\n            if (((((t[x] == \",\")) && ((w === 0))))) {\n                u.push(t.substring(v, x));\n                v = ((x + 1));\n            }\n             else if (((t[x] == \"(\"))) {\n                w++;\n            }\n             else if (((t[x] == \")\"))) {\n                w--;\n            }\n            \n            \n        ;\n        ;\n        };\n    ;\n        u.push(t.substring(v, t.length));\n        return u;\n    };\n;\n    function s(t, u) {\n        this.facebarConfig = t;\n        this.unmapped = ((u || \"\")).trim();\n        this.mapped = l(t, this.unmapped);\n        this.position = null;\n    };\n;\n    s.prototype.isEntity = function() {\n        return (/^\\d+$/).test(this.mapped);\n    };\n    s.prototype.isURI = function() {\n        return ((this.mapped.indexOf(\"uri(\") === 0));\n    };\n    s.prototype.isImplemented = function() {\n        return ((this.mapped && ((this.mapped.indexOf(\"*\") == -1))));\n    };\n    s.prototype.getUnimplemented = function() {\n        return ((this.mapped.match(/\\*[\\w\\-]+\\(/g) || [])).map(function(t) {\n            return t.substr(1, ((t.length - 2)));\n        });\n    };\n    s.prototype.getURI = function() {\n        if (this.isEntity()) {\n            return m(this.mapped);\n        }\n         else if (this.isURI()) {\n            return n(this.facebarConfig, this.mapped);\n        }\n         else return o(this.facebarConfig, this.unmapped)\n        \n    ;\n    };\n    e.exports = s;\n});\n__d(\"FacebarURI\", [\"URI\",\"Env\",\"FacebarSemanticQuery\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"Env\"), i = b(\"FacebarSemanticQuery\"), j = {\n        getSearchRawPrefix: function() {\n            return \"search\";\n        },\n        getSearchPath: function() {\n            return ((((\"/\" + this.getSearchRawPrefix())) + \"/\"));\n        },\n        getURI: function(k, l) {\n            var m = null, n = ((!l.song && l.path));\n            if (n) {\n                m = new g(n);\n                if (((l.type == \"user\"))) {\n                    m.addQueryData({\n                        fref: \"ts\"\n                    });\n                }\n            ;\n            ;\n            }\n             else {\n                var o = new i(k, l.semantic);\n                if (((o && o.isImplemented()))) {\n                    m = o.getURI();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ((m && j.getQualifiedURI(m)));\n        },\n        getQualifiedURI: function(k) {\n            var l = new g(k);\n            if (!l.getDomain()) {\n                var m = g(h.www_base);\n                l.setProtocol(m.getProtocol()).setDomain(m.getDomain()).setPort(m.getPort());\n            }\n        ;\n        ;\n            return l;\n        }\n    };\n    e.exports = j;\n});\n__d(\"BrowseNUXController\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"BrowseLogger\",\"BrowseNUXBootstrap\",\"BrowseNUXCheckpoint\",\"BrowseNUXMegaphone\",\"BrowseNUXTourDialog\",\"BrowseNUXTypewriter\",\"JSBNG__CSS\",\"DOM\",\"DOMScroll\",\"FacebarStructuredText\",\"FacebarURI\",\"KeyEventController\",\"LayerSlowlyFadeOnShow\",\"ModalMask\",\"PageTransitions\",\"Parent\",\"Run\",\"SubscriptionsHandler\",\"URI\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",\"emptyFunction\",\"ge\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"BrowseLogger\"), j = b(\"BrowseNUXBootstrap\"), k = b(\"BrowseNUXCheckpoint\"), l = b(\"BrowseNUXMegaphone\"), m = b(\"BrowseNUXTourDialog\"), n = b(\"BrowseNUXTypewriter\"), o = b(\"JSBNG__CSS\"), p = b(\"DOM\"), q = b(\"DOMScroll\"), r = b(\"FacebarStructuredText\"), s = b(\"FacebarURI\"), t = b(\"KeyEventController\"), u = b(\"LayerSlowlyFadeOnShow\"), v = b(\"ModalMask\"), w = b(\"PageTransitions\"), x = b(\"Parent\"), y = b(\"Run\"), z = b(\"SubscriptionsHandler\"), aa = b(\"URI\"), ba = b(\"Vector\"), ca = b(\"copyProperties\"), da = b(\"csx\"), ea = b(\"cx\"), fa = b(\"emptyFunction\"), ga = b(\"ge\"), ha = b(\"startsWith\"), ia = {\n        init: function(ma) {\n            ca(ia, {\n                bootstrap: j.getFacebarData(),\n                megaphone: new l(ma.megaphone),\n                fragments: ma.fragments,\n                resultURI: ma.resultURI,\n                buttons: ma.buttons,\n                dialogs: ma.dialogs,\n                endDialog: ma.endDialog\n            });\n            k.init(ma.nextStep);\n            h.inform(\"BrowseNUX/initialized\");\n            ia.initMegaphoneHandler();\n        },\n        initMegaphoneHandler: function() {\n            var ma = function() {\n                return ((k.getStep() == k.SHOW_MEGAPHONE));\n            };\n            h.subscribe(\"BrowseNUX/story\", function() {\n                if (ma()) {\n                    ia.showStoryMegaphone();\n                    h.inform(\"BrowseNUX/starting\");\n                }\n            ;\n            ;\n            });\n            h.subscribe(\"BrowseNUX/typeaheadUnit\", function() {\n                if (ma()) {\n                    ia.showViewMegaphone();\n                    h.inform(\"BrowseNUX/starting\");\n                }\n            ;\n            ;\n            });\n        },\n        startAtNextStep: function() {\n            var ma = w.getNextURI().getPath();\n            switch (k.getStep()) {\n              case k.SHOW_MEGAPHONE:\n                break;\n              case k.RESULTS_VIEW:\n                if (ha(ma, s.getSearchPath())) {\n                    JSBNG__setTimeout(function() {\n                        ia.showEndDialog();\n                        h.inform(\"BrowseNUX/starting\");\n                    }, 2000);\n                }\n                 else i.logNUXStep(\"abandon\");\n            ;\n            ;\n                break;\n              default:\n                return;\n            };\n        ;\n            y.onAfterLoad(function() {\n                w.setCompletionCallback(ia.startAtNextStep);\n            });\n        },\n        toggleSponsoredResults: function(ma) {\n            var na = ia.bootstrap, oa = na.typeahead, pa = na.FacebarTypeaheadSponsoredResults;\n            if (pa) {\n                if (ma) {\n                    oa.enableBehavior(pa);\n                }\n                 else oa.disableBehavior(pa);\n            ;\n            }\n        ;\n        ;\n        },\n        showMegaphone: function(ma) {\n            var na = false, oa = ma.subscribe(\"start\", function() {\n                na = true;\n                ma.hide();\n                ia.showSearchBarTour();\n            }), pa = ma.subscribe(\"hide\", function() {\n                na = true;\n                i.logNUXStep(\"hide\");\n            });\n            i.logNUXStep(\"show_megaphone\");\n            ia.prefetchResults();\n            ka(function() {\n                ((na || i.logNUXStep(\"ignore\")));\n                oa.unsubscribe();\n                pa.unsubscribe();\n            });\n        },\n        showViewMegaphone: function() {\n            var ma = j.getTypeaheadUnitData();\n            ia.showMegaphone(ma);\n        },\n        showStoryMegaphone: function() {\n            var ma = ((ga(\"contentArea\") || ga(\"JSBNG__content\")));\n            if (ma) {\n                var na = ia.megaphone, oa = j.getStoryData();\n                na.setClass(oa.className);\n                na.show(ma);\n                ia.showMegaphone(na);\n            }\n        ;\n        ;\n        },\n        prefetchResults: function() {\n            var ma = ia.bootstrap.typeahead.getData(), na = ia.fragments;\n            ma.query(r.fromStruct([na.page,]));\n            ma.query(r.fromStruct([na.edge,na.page,]));\n        },\n        showSearchBarTour: function(ma) {\n            var na = ia.dialogs;\n            i.logNUXStep(\"start\");\n            var oa = ia.bootstrap.input, pa = ia.bootstrap.typeahead, qa = la(pa);\n            ia.toggleSponsoredResults(false);\n            t.registerKey(\"BACKSPACE\", fa.thatReturnsFalse);\n            oa.setEnabled(false);\n            v.show();\n            var ra = new m(na.search, pa), sa = new n(oa), ta = ia.fragments.page, ua = ta.text.toLowerCase(), va = function() {\n                ra.showWithContext(oa.getRoot(), 0);\n            }, wa = function() {\n                oa.JSBNG__focus();\n                sa.setValue(ua, function() {\n                    JSBNG__setTimeout(function() {\n                        oa.setStructure([ta,]);\n                        oa.moveSelectionToEnd();\n                        ja(pa, function() {\n                            ra.showButton();\n                        });\n                    }, 1000);\n                });\n            };\n            JSBNG__setTimeout(va, 0);\n            JSBNG__setTimeout(wa, 2000);\n            var xa = new m(na.phrase, pa), ya = ia.fragments.edge;\n            na.phrase.setOffsetY(-10);\n            ra.setNextHandler(function() {\n                i.logNUXStep(\"phrase\");\n                sa.prependFragment(ya, function() {\n                    ja(pa, function() {\n                        var ab = pa.getView().getItems()[0];\n                        if (ab) {\n                            var bb = p.JSBNG__find(ab, \"span.-cx-PUBLIC-fbFacebarTypeaheadItem__label\");\n                            xa.showWithContext(bb, 1);\n                        }\n                         else xa.showWithContext(oa.getRoot(), 0);\n                    ;\n                    ;\n                        JSBNG__setTimeout(xa.showButton.bind(xa), 2000);\n                    });\n                });\n            });\n            xa.setNextHandler(function() {\n                i.logNUXStep(\"personalized\");\n                k.setStep(k.RESULTS_VIEW, function() {\n                    qa.release();\n                    w.go(aa(ia.resultURI).addQueryData({\n                        view: \"list\"\n                    }));\n                });\n            });\n            o.addClass(JSBNG__document.body, \"-cx-PUBLIC-fbBrowseNUX__shown\");\n            function za() {\n                ia.toggleSponsoredResults(true);\n                sa.abort();\n                qa.release();\n                ra.reset();\n                xa.reset();\n                v.hide();\n                oa.setEnabled(true);\n                o.removeClass(JSBNG__document.body, \"-cx-PUBLIC-fbBrowseNUX__shown\");\n            };\n        ;\n            if (ma) {\n                ra.activateCloseButton(za);\n                xa.activateCloseButton(za);\n            }\n        ;\n        ;\n            ka(za);\n        },\n        showEndDialog: function() {\n            var ma = ia.bootstrap.input, na = ia.bootstrap.typeahead, oa = ia.endDialog;\n            oa.enableBehavior(u);\n            oa.show();\n            i.logNUXStep(\"end_dialog\");\n            k.setFinished();\n            h.inform(\"BrowseNUX/finished\");\n            var pa = function(sa) {\n                ma.setStructure([]);\n                ma.togglePlaceholder();\n                ma.JSBNG__focus();\n                if (o.hasClass(JSBNG__document.documentElement, \"tinyViewport\")) {\n                    var ta = new ba(0, 0, \"JSBNG__document\");\n                    q.JSBNG__scrollTo(ta, true, false, false, sa);\n                }\n                 else if (sa) {\n                    sa();\n                }\n                \n            ;\n            ;\n            }, qa = oa.subscribe(\"button\", function(sa, ta) {\n                oa.hide();\n                switch (ta.getAttribute(\"data-action\")) {\n                  case \"replay\":\n                    ia.showSearchBarTour(true);\n                    i.logNUXStep(\"replay\");\n                    break;\n                  case \"search\":\n                    pa();\n                    i.logNUXStep(\"search\");\n                    break;\n                  case \"cancel\":\n                    i.logNUXStep(\"cancel\");\n                    break;\n                };\n            ;\n            }), ra = g.listen(oa.getRoot(), \"click\", function(JSBNG__event) {\n                var sa = JSBNG__event.getTarget();\n                if (sa) {\n                    var ta;\n                    if (sa.getAttribute(\"data-action\")) {\n                        ta = sa.getAttribute(\"data-action\");\n                    }\n                     else ta = sa.parentNode.getAttribute(\"data-action\");\n                ;\n                ;\n                    if (ta) {\n                        i.logNUXStep(ta);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                var ua = x.byClass(sa, \"-cx-PRIVATE-fbBrowseNUX__dialogsample\");\n                if (((!ua || JSBNG__event.isDefaultRequested()))) {\n                    return;\n                }\n            ;\n            ;\n                oa.hide();\n                pa(function() {\n                    var va = ((ua.getAttribute(\"data-query\") + \" \")), wa = new n(ma), xa = la(na);\n                    JSBNG__setTimeout(function() {\n                        wa.setValue(va, function() {\n                            ja(na, function() {\n                                xa.release();\n                                w.go(ua.getAttribute(\"href\"));\n                            });\n                        });\n                    }, 1000);\n                });\n                return false;\n            });\n            ka(function() {\n                ra.remove();\n                qa.unsubscribe();\n            });\n        }\n    };\n    function ja(ma, na) {\n        var oa = new h();\n        oa.registerCallback(na, [\"timeout\",\"render\",]);\n        JSBNG__setTimeout(oa.inform.bind(oa, \"timeout\"), 2000);\n        var pa = JSBNG__setTimeout(ra, 6000), qa = ma.subscribe(\"render\", ra);\n        function ra() {\n            qa.unsubscribe();\n            JSBNG__clearTimeout(pa);\n            oa.inform(\"render\");\n        };\n    ;\n        ka(qa.unsubscribe.bind(qa));\n    };\n;\n    function ka(ma) {\n        w.registerHandler(ma, 10);\n    };\n;\n    function la(ma) {\n        var na = new z(\"FacebarTypeaheadLock\");\n        na.addSubscriptions(g.listen(ia.bootstrap.input.getRichInput(), \"keydown\", fa.thatReturnsFalse), ma.getCore().subscribe(\"close\", fa.thatReturnsFalse), ma.getView().subscribe([\"beforeHighlight\",\"beforeSelect\",], fa.thatReturnsFalse));\n        return na;\n    };\n;\n    e.exports = ia;\n});\n__d(\"FacebarResultStore\", [\"copyProperties\",\"concatMap\",\"FacebarResultStoreUtils\",\"TokenizeUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"concatMap\"), i = b(\"FacebarResultStoreUtils\"), j = b(\"TokenizeUtil\"), k = \"unimplemented\";\n    function l(m, n, o, p) {\n        this.facebarConfig = m;\n        this.facebarConfig.grammar_stop_words_penalty = ((this.facebarConfig.grammar_stop_words_penalty || 2));\n        this.facebarConfig.grammar_stop_words = ((this.facebarConfig.grammar_stop_words || {\n        }));\n        this.facebarConfig.options = p;\n        this.tokenize = n;\n        this.getEntry = o;\n        this.typeaheadTypeMap = this.facebarConfig.mapped_types;\n        this.facebarConfig.typeahead_types.forEach(function(q) {\n            this.typeaheadTypeMap[q] = q;\n        }.bind(this));\n        this.resetCaches();\n        this.cacheEnabled(true);\n    };\n;\n    l.prototype.transformStructured = function(m) {\n        var n = [], o = [], p = \"\", q = \"\";\n        m.forEach(function(t, u) {\n            if (t.isType(\"text\")) {\n                p += t.getText();\n                q = ((((q == null)) ? null : ((q + t.getText()))));\n            }\n             else {\n                var v = p.match(/\\\"/g);\n                if (((v && ((v.length % 2))))) {\n                    p = ((p.replace(/\\s+$/, \"\") + \"\\\"\"));\n                }\n            ;\n            ;\n                if (p.length) {\n                    Array.prototype.push.apply(n, this.tokenize(p));\n                    o.push(p);\n                    p = \"\";\n                }\n            ;\n            ;\n                n.push(t.toStruct());\n                o.push({\n                    uid: String(t.getUID()),\n                    type: this._getFBObjectType(t.getTypePart(1)),\n                    text: t.getText()\n                });\n                q = null;\n            }\n        ;\n        ;\n        }.bind(this));\n        if (p.length) {\n            if (((p[((p.length - 1))] == \"'\"))) {\n                p = p.substr(0, ((p.length - 1)));\n            }\n        ;\n        ;\n            Array.prototype.push.apply(n, this.tokenize(p));\n            o.push(p);\n            if (((p[((p.length - 1))] == \" \"))) {\n                n.push(\"\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var r = JSON.stringify(o), s = r.replace(/\\]$/, \"\").replace(/\\\"$/, \"\");\n        s = s.replace(/\\s{2,}/g, \" \");\n        return {\n            tokens: n,\n            text_form: r,\n            is_empty: !!r.match(/^\\[(\\\"\\s*\\\")?\\]$/),\n            raw_text: q,\n            cache_id: s\n        };\n    };\n    l.prototype.resetCaches = function() {\n        this.bootstrapCache = {\n        };\n        this.queryCache = {\n            \"\": {\n                tokens: [],\n                results: []\n            }\n        };\n    };\n    l.prototype.setNullState = function(m) {\n        this.facebarConfig.null_state = m.map(this._extractStructure.bind(this));\n    };\n    l.prototype.addEntryToNullState = function(m) {\n        if (this.facebarConfig.null_state) {\n            var n = ((this.facebarConfig.entity_cost + m.grammar_costs[((((\"{\" + m.type)) + \"}\"))])), o = i.processEntityResult(m.type, m.uid, m.text, n);\n            this.facebarConfig.null_state.unshift(o);\n        }\n    ;\n    ;\n    };\n    l.prototype.setSortFunction = function(m) {\n        this._sortFunction = m;\n    };\n    l.prototype.addBootstrap = function(m) {\n        var n = this.bootstrapCache;\n        m.forEach(function(o) {\n            var p = this.getEntry(o);\n            p.bootstrapped = true;\n            var q = this.tokenize(p.textToIndex, true);\n            if (p.tokens) {\n                Array.prototype.push.apply(q, p.tokens.split(\" \"));\n            }\n        ;\n        ;\n            q.forEach(function(r) {\n                if (!n.hasOwnProperty(r)) {\n                    n[r] = {\n                    };\n                }\n            ;\n            ;\n                n[r][o] = true;\n            });\n        }, this);\n    };\n    l.prototype.addNullStateToQueryCache = function(m) {\n        this.saveResults(this.facebarConfig.null_state, m, true);\n    };\n    l.prototype.getResults = function(m) {\n        if (((((m.tokens.length === 0)) || ((((m.tokens.length == 1)) && ((m.tokens[0] === \"\"))))))) {\n            return {\n                results: ((this.facebarConfig.null_state || [])),\n                null_state: true\n            };\n        }\n    ;\n    ;\n        var n = this._getBestQueryCache(m.cache_id), o = n.results, p = {\n        }, q = this._getBootstrapMatchByType(m.tokens, p), r = this._addMatchingBootstrapResults(m.tokens, ((q[0] || {\n        })));\n        Array.prototype.push.apply(r, h(this._getResultsFromCache.bind(this, q, m.tokens), o));\n        var s = {\n        }, t = [], u = false, v = 0;\n        r.sort(this._sortFunction).forEach(function(w) {\n            w.semantic = w.semantic.toLowerCase();\n            if (!w.termMatches) {\n                w.termMatches = p[parseInt(w.semantic, 10)];\n            }\n        ;\n        ;\n            var x = l.getUniqueSemantic(w.semantic);\n            if (!x) {\n                return;\n            }\n        ;\n        ;\n            if (s[x]) {\n                if (w.isJSBootstrapMatch) {\n                    s[x].isJSBootstrapMatch = true;\n                    s[x].bootstrapCost = w.bootstrapCost;\n                }\n                 else if (((((s[x].isJSBootstrapMatch && ((w.backendCost !== undefined)))) && ((s[x].backendCost === undefined))))) {\n                    s[x].backendCost = w.backendCost;\n                }\n                \n            ;\n            ;\n                if (!!w.tags) {\n                    s[x].tags = w.tags;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            if (((u && w.blankFilled))) {\n                return;\n            }\n        ;\n        ;\n            if (((w.type.indexOf(\"browse_type\") >= 0))) {\n                v += 1;\n                if (((((this.facebarConfig.maxGrammarResults !== undefined)) && ((v > this.facebarConfig.maxGrammarResults))))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            u = ((u || !!w.blankFilled));\n            s[x] = w;\n            t.push(w);\n        }.bind(this));\n        return {\n            results: t,\n            webSuggOnTop: n.webSuggOnTop,\n            webSuggLimit: n.webSuggLimit,\n            webSuggLimitSeeMore: n.webSuggLimitSeeMore\n        };\n    };\n    l.prototype.cacheEnabled = function(m) {\n        this._enableCache = m;\n    };\n    l.prototype.saveResults = function(m, n, o, p) {\n        m = m.map(this._processBackendResult.bind(this));\n        var q = [];\n        if (this._enableCache) {\n            var r = {\n            }, s = {\n            };\n            m.forEach(function(u) {\n                s[u.semantic] = true;\n                ((((u.parse && u.parse.disambiguation)) && u.parse.disambiguation.forEach(function(v) {\n                    r[v] = true;\n                })));\n            });\n            var t = this._getBestQueryCache(n.cache_id);\n            t.results.forEach(function(u) {\n                if (((u.type === \"websuggestion\"))) {\n                    return;\n                }\n            ;\n            ;\n                if (((u.semanticForest in r))) {\n                    return;\n                }\n            ;\n            ;\n                var v = this._getDifferenceArrayTokens(u.tokens, n.tokens), w = this._getNumTokensMatching(v, u);\n                w = this._tryMatchingFinalInsertedEntity(v, w, u);\n                if (((((w > 0)) && ((w == v.length))))) {\n                    u.cacheOnlyResult = !s[u.semantic];\n                    q.push(u);\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        m.forEach(function(u) {\n            u.tokens = n.tokens;\n            u.cache_id_length = n.cache_id.length;\n            q.push(u);\n        });\n        if (((this.queryCache[n.cache_id] === undefined))) {\n            this.queryCache[n.cache_id] = {\n            };\n        }\n    ;\n    ;\n        g(this.queryCache[n.cache_id], {\n            tokens: n.tokens,\n            results: q,\n            incomplete: o\n        });\n        g(this.queryCache[n.cache_id], p);\n    };\n    l.prototype.alreadyKnown = function(m) {\n        return ((!!this.queryCache[m] && !this.queryCache[m].incomplete));\n    };\n    l.prototype.stripBrackets = function(m) {\n        return m.replace(/^[\\[\\{]/, \"\").replace(/[\\]\\}]$/, \"\");\n    };\n    l.prototype._extractStructure = function(m) {\n        function n(q, r, s) {\n            return {\n                type: q,\n                text: r,\n                uid: ((s || null))\n            };\n        };\n    ;\n        function o(q, r) {\n            q.split(\" \").forEach(function(s) {\n                if (((s !== \"\"))) {\n                    if (r) {\n                        m.chunks.push(m.structure.length);\n                    }\n                ;\n                ;\n                    m.structure.push(n(\"text\", s));\n                }\n            ;\n            ;\n                m.structure.push(n(\"text\", \" \"));\n            });\n            m.structure.pop();\n        };\n    ;\n        function p(q) {\n            var r = ((((((m.structure.length === 0)) && ((m.type != \"websuggestion\")))) ? ((q.charAt(0).toUpperCase() + q.substr(1))) : q));\n            return r;\n        };\n    ;\n        m.structure = [];\n        m.chunks = [];\n        m.parse.display.forEach(function(q) {\n            if (((typeof q === \"string\"))) {\n                o(p(q), true);\n            }\n             else if (q.uid) {\n                var r = this.getEntry(q.uid, q.fetchType);\n                m.chunks.push(m.structure.length);\n                if (r.grammar_like) {\n                    o(p(r.text), false);\n                }\n                 else {\n                    var s = q.type;\n                    if (q.fetchType) {\n                        s += ((\":\" + q.fetchType));\n                    }\n                ;\n                ;\n                    m.structure.push(n(s, r.text, q.uid));\n                }\n            ;\n            ;\n            }\n             else {\n                m.chunks.push(m.structure.length);\n                m.blankType = q.type.replace(/^blank:/, \"\");\n                m.structure.push(n(q.type, \"\"));\n            }\n            \n        ;\n        ;\n        }.bind(this));\n        return m;\n    };\n    l.prototype._getDifferenceArrayTokens = function(m, n) {\n        if (!m.length) {\n            return [\"\",].concat(n);\n        }\n    ;\n    ;\n        var o = ((m.length - 1)), p = m[o];\n        if (((p === \"\"))) {\n            p = m[--o];\n        }\n    ;\n    ;\n        return [((((typeof (p) == \"string\")) ? n[o].substr(p.length) : \"\")),].concat(n.slice(((o + 1))));\n    };\n    l.prototype._processBackendResult = function(m) {\n        m.semantic = m.semantic.toString();\n        m.backendCost = m.cost;\n        this._extractStructure(m);\n        if (m.type.match(/^\\{.*\\}$/)) {\n            m.useExtendedIndex = true;\n        }\n    ;\n    ;\n        if (m.semantic.match(/\\[.*\\]/)) {\n            var n = m.parse, o = n.pos;\n            if (((o === undefined))) {\n                m.semantic = m.semantic.replace(/\\[(.*)\\]/g, \"$1\");\n            }\n             else {\n                var p = n.remTokens[((n.remTokens.length - 1))];\n                if (((n.remTokens.length && m.structure[m.chunks[p]].uid))) {\n                    o = n.remTokens[((n.remTokens.length - 1))];\n                    m.completed = true;\n                }\n            ;\n            ;\n                var q = m.structure[m.chunks[o]].uid;\n                if (((q === null))) {\n                    m.semantic = m.semantic.replace(/\\[(\\d*)\\]/g, \"$1\");\n                }\n                 else {\n                    var r = new RegExp(((((\"\\\\[\" + q)) + \"\\\\]\")), \"g\");\n                    m.unsubstituted_semantic = m.semantic;\n                    m.semantic = m.semantic.replace(r, q);\n                    if (((((n && n.disambiguation)) && ((n.disambiguation.length > 0))))) {\n                        n.disambiguation = n.disambiguation.filter(function(s) {\n                            return ((s.indexOf(((((\"[\" + q)) + \"]\"))) !== -1));\n                        });\n                        n.unsubstituted_disambiguation = n.disambiguation.splice(0);\n                        n.disambiguation = n.disambiguation.map(function(s) {\n                            return s.replace(r, q);\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        m.semantic = m.semantic.replace(/\\[(.*)\\]/g, \"$1\");\n        m.tuid = JSON.stringify({\n            semantic: m.semantic,\n            structure: m.structure\n        });\n        return m;\n    };\n    l.prototype._sortFunction = function(m, n) {\n        return ((((m.cost || 0)) - ((n.cost || 0))));\n    };\n    l.prototype._getResultsFromCache = function(m, n, o) {\n        var p = this._getDifferenceArrayTokens(o.tokens, n), q = [], r = this._getNumTokensMatching(p, o), s = this._tryMatchingFinalInsertedEntity(p, r, o);\n        if (((((s > 0)) && ((s == p.length))))) {\n            q.push(o);\n        }\n    ;\n    ;\n        o.bolding = this._computeBolding(o, p, 0);\n        Array.prototype.push.apply(q, this._trySubstitutingBootstrapResult(m[((n.length - p.length))], o, p));\n        if (((r <= 0))) {\n            return q;\n        }\n    ;\n    ;\n        var t = p.slice(r);\n        r += ((n.length - p.length));\n        var u = {\n        };\n        if (((r == n.length))) {\n            --r;\n            if (((r < 0))) {\n                return q;\n            }\n        ;\n        ;\n            if (((n[r] !== \"\"))) {\n                u = this._computeBolding(o, p, 1);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((((r == ((n.length - 1)))) && ((n[r] === \"\"))))) {\n            --r;\n            if (((r < 0))) {\n                return q;\n            }\n        ;\n        ;\n            u = this._computeBolding(o, p, 1);\n        }\n    ;\n    ;\n        var v = function(w, x) {\n            x.bolding = w;\n            return x;\n        }.bind(null, u);\n        Array.prototype.push.apply(q, this._tryMatchingFinalBootstrapResult(m[r], t, o).map(v));\n        return q;\n    };\n    l.prototype._addMatchingBootstrapResults = function(m, n) {\n        return h(function(o) {\n            var p = n[o];\n            if (((p === undefined))) {\n                return [];\n            }\n        ;\n        ;\n            var q = [];\n            p.forEach(function(r) {\n                var s = this.getEntry(r, o);\n                if (!this._isTitleTermMatch(m, s)) {\n                    return;\n                }\n            ;\n            ;\n                var t = ((this._isExactNameMatch(m, s) ? 0 : this.facebarConfig.non_title_term_match_penalty)), u = this._isNonGrammarTermMatch(m, s), v = ((((((s.grammar_costs[((((\"{\" + o)) + \"}\"))] + t)) + this.facebarConfig.entity_cost)) + ((this.facebarConfig.grammar_stop_words_penalty * !u)))), w = i.processEntityResult(o, r, s.text, v);\n                w.bootstrapCost = v;\n                w.isJSBootstrapMatch = true;\n                q.push(w);\n            }.bind(this));\n            return q;\n        }.bind(this), this.facebarConfig.bootstrap_types);\n    };\n    l.prototype._isTitleTermMatch = function(m, n) {\n        var o = ((m[0] || {\n        }));\n        if (((typeof (o) == \"object\"))) {\n            return false;\n        }\n    ;\n    ;\n        var p = n.titleToIndex;\n        return ((((m.length === 1)) ? j.isPrefixMatch(o, p) : j.isExactMatch(o, p)));\n    };\n    l.prototype._isExactNameMatch = function(m, n) {\n        var o = ((m[0] || {\n        }));\n        if (((typeof (o) == \"object\"))) {\n            return 0;\n        }\n    ;\n    ;\n        var p = n.text;\n        if (((((m.length === 1)) ? j.isPrefixMatch(o, p) : j.isExactMatch(o, p)))) {\n            return true;\n        }\n    ;\n    ;\n        return ((((((m.length == 1)) && ((n.alias !== undefined)))) && j.isExactMatch(o, n.alias)));\n    };\n    l.prototype._isNonGrammarTermMatch = function(m, n) {\n        var o = j.parse(n.titleToIndex.toLowerCase()), p = o.tokens.filter(function(s) {\n            return ((((s !== \"\")) && !this.facebarConfig.grammar_stop_words[s]));\n        }.bind(this));\n        p = p.join(\" \");\n        for (var q = 0; ((q < m.length)); ++q) {\n            if (((typeof (m[q]) == \"object\"))) {\n                return true;\n            }\n        ;\n        ;\n            var r = ((((q === ((m.length - 1)))) ? j.isPrefixMatch(m[q], p) : j.isQueryMatch(m[q], p)));\n            if (r) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n    l.prototype._getBootstrapMatchByType = function(m, n) {\n        if (((m.length === 0))) {\n            return [];\n        }\n    ;\n    ;\n        var o = m.map(function() {\n            return {\n            };\n        }), p = ((m[((m.length - 1))] === \"\")), q = {\n        }, r, s = ((p ? ((m.length - 1)) : m.length));\n        if (((s && m[((s - 1))].uid))) {\n            this._pushBootstrapEntryAtPosition(o, ((s - 1)), m[((s - 1))].uid);\n            return o;\n        }\n    ;\n    ;\n        {\n            var fin197keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapCache))), fin197i = (0);\n            var t;\n            for (; (fin197i < fin197keys.length); (fin197i++)) {\n                ((t) = (fin197keys[fin197i]));\n                {\n                    if (((((s && ((t.indexOf(m[((s - 1))]) === 0)))) && ((!p || ((t === m[((s - 1))]))))))) {\n                        {\n                            var fin198keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapCache[t]))), fin198i = (0);\n                            (0);\n                            for (; (fin198i < fin198keys.length); (fin198i++)) {\n                                ((r) = (fin198keys[fin198i]));\n                                {\n                                    if (!q[r]) {\n                                        q[r] = 1;\n                                        this._addMatchedTerm(r, t, n);\n                                        this._pushBootstrapEntryAtPosition(o, ((s - 1)), r);\n                                    }\n                                ;\n                                ;\n                                };\n                            };\n                        };\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        for (var u = ((s - 2)); ((u >= 0)); u--) {\n            if (((typeof (m[u]) == \"object\"))) {\n                break;\n            }\n        ;\n        ;\n            if (((m[u].length && ((m[u][0] == \"\\\"\"))))) {\n                break;\n            }\n        ;\n        ;\n            {\n                var fin199keys = ((window.top.JSBNG_Replay.forInKeys)((this.bootstrapCache[m[u]]))), fin199i = (0);\n                (0);\n                for (; (fin199i < fin199keys.length); (fin199i++)) {\n                    ((r) = (fin199keys[fin199i]));\n                    {\n                        if (!q[r]) {\n                            q[r] = 0;\n                        }\n                    ;\n                    ;\n                        if (((((q[r] + u)) == ((s - 1))))) {\n                            ++q[r];\n                            this._addMatchedTerm(r, m[u], n);\n                            this._pushBootstrapEntryAtPosition(o, u, r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        };\n    ;\n        return o;\n    };\n    l.prototype._addMatchedTerm = function(m, n, o) {\n        (o[m] = ((o[m] || []))).push(n);\n        return o;\n    };\n    l.prototype._pushBootstrapEntryAtPosition = function(m, n, o) {\n        var p = this.getEntry(o);\n        if (!p) {\n            return;\n        }\n    ;\n    ;\n        {\n            var fin200keys = ((window.top.JSBNG_Replay.forInKeys)((p.grammar_costs))), fin200i = (0);\n            var q;\n            for (; (fin200i < fin200keys.length); (fin200i++)) {\n                ((q) = (fin200keys[fin200i]));\n                {\n                    var r = this.stripBrackets(q);\n                    if (((m[n][r] === undefined))) {\n                        m[n][r] = [];\n                    }\n                ;\n                ;\n                    m[n][r].push(o);\n                };\n            };\n        };\n    ;\n    };\n    l.prototype._getNumTokensMatching = function(m, n) {\n        var o = 0, p = n.parse, q = m.length, r = null, s = null;\n        if (((p.pos !== undefined))) {\n            var t = n.structure[n.chunks[p.pos]];\n            r = t.uid;\n            s = t.type.split(\":\")[2];\n        }\n    ;\n    ;\n        n.outputTokensUsed = [];\n        n.termMatches = [];\n        if (r) {\n            o = this._prefixMatchEntity(m, p, r, n.outputTokensUsed, s, !!n.useExtendedIndex, n.termMatches);\n            if (((((o === 0)) || ((o === q))))) {\n                return o;\n            }\n        ;\n        ;\n        }\n         else if (((((p.suffix && ((q == 1)))) && ((p.suffix.indexOf(m[0]) === 0))))) {\n            return q;\n        }\n         else if (((p.suffix == m[0]))) {\n            ++o;\n        }\n         else return 0\n        \n        \n    ;\n        var u = [];\n        for (var v = 0; ((v < p.remTokens.length)); v++) {\n            if (((((((typeof (m[o]) != \"string\")) || ((n.chunks.length < p.remTokens[v])))) || n.structure[n.chunks[p.remTokens[v]]].uid))) {\n                break;\n            }\n        ;\n        ;\n            var w = n.structure[n.chunks[p.remTokens[v]]].text;\n            u.push(w.toLowerCase());\n        };\n    ;\n        o = this._greedyMatchText(u, m, o, p.remTokens, n.outputTokensUsed);\n        if (((((o == ((q - 1)))) && ((m[o] === \"\"))))) {\n            return q;\n        }\n    ;\n    ;\n        return o;\n    };\n    l.prototype._prefixMatchEntity = function(m, n, o, p, q, r, s) {\n        if (((n.entTokens.length === 0))) {\n            if (((m[0] !== \"\"))) {\n                return 0;\n            }\n        ;\n        ;\n            if (((((n.possessive && ((m.length > 1)))) && ((m[1] == \"'s\"))))) {\n                p.push([((n.pos + 1)),]);\n                return 2;\n            }\n             else return 1\n        ;\n        }\n    ;\n    ;\n        var t = false, u = this.getEntry(o, q);\n        if (((((typeof (q) !== \"undefined\")) && ((q !== u.fetchType))))) {\n            return 0;\n        }\n    ;\n    ;\n        var v = this.tokenize(((r ? u.textToIndex : u.text)), true), w = [];\n        for (var x = 0; ((x < ((((m.length + n.entTokens.length)) - 1)))); x++) {\n            if (((x < ((n.entTokens.length - 1))))) {\n                w.push(n.entTokens[x]);\n            }\n             else if (((x == ((n.entTokens.length - 1))))) {\n                w.push(((n.entTokens[x] + m[0])));\n            }\n             else w.push(m[((((x - n.entTokens.length)) + 1))]);\n            \n        ;\n        ;\n        };\n    ;\n        var y = ((-n.entTokens.length + 1));\n        for (var z = 0; ((z < w.length)); ++z) {\n            var aa = w[z];\n            if (((typeof (aa) != \"string\"))) {\n                break;\n            }\n        ;\n        ;\n            if (((aa === \"\"))) {\n                y++;\n                continue;\n            }\n        ;\n        ;\n            var ba = false;\n            for (var ca = 0; ((ca < v.length)); ca++) {\n                if (((((v[ca] == aa)) || ((((z === ((w.length - 1)))) && ((v[ca].indexOf(aa) === 0))))))) {\n                    if (s) {\n                        s.push(v[ca]);\n                    }\n                ;\n                ;\n                    v[ca] = \"\";\n                    ba = true;\n                    ++y;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (ba) {\n                continue;\n            }\n        ;\n        ;\n            if (((((!n.possessive || ((aa.length <= 2)))) || ((aa.substr(((aa.length - 2))) != \"'s\"))))) {\n                break;\n            }\n        ;\n        ;\n            var da = aa.substr(0, ((aa.length - 2)));\n            for (ca = 0; ((ca < v.length)); ca++) {\n                if (((v[ca] == da))) {\n                    ++y;\n                    if (p) {\n                        t = true;\n                    }\n                ;\n                ;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            break;\n        };\n    ;\n        if (((y > 0))) {\n            if (t) {\n                p.push([((n.pos + 1)),]);\n            }\n        ;\n        ;\n            return y;\n        }\n    ;\n    ;\n        if (((p === undefined))) {\n            return 0;\n        }\n    ;\n    ;\n        var ea = m[0], fa = ea;\n        if (((((n.possessive && ((ea.length >= 2)))) && ((ea.substr(((ea.length - 2))) == \"'s\"))))) {\n            fa = ea.substr(0, ((ea.length - 2)));\n        }\n    ;\n    ;\n        if (((((((((m.length == 1)) && ((n.suffix.indexOf(ea) === 0)))) || ((n.suffix == fa)))) || ((n.suffix == ea))))) {\n            if (((((fa != ea)) && ((n.suffix == fa))))) {\n                p.push([((n.pos + 1)),]);\n            }\n        ;\n        ;\n            return 1;\n        }\n    ;\n    ;\n        return 0;\n    };\n    l.prototype._tryMatchingFinalInsertedEntity = function(m, n, o) {\n        if (((!o.completed || ((n < 0))))) {\n            return n;\n        }\n    ;\n    ;\n        var p = o.parse, q = p.remTokens[((p.remTokens.length - 1))], r = o.structure[o.chunks[q]], s = this.getEntry(r.uid, r.type), t = this.tokenize(s.text, true);\n        n = this._greedyMatchText(t, m, n);\n        if (((((n == ((m.length - 1)))) && ((m[n] === \"\"))))) {\n            return m.length;\n        }\n    ;\n    ;\n        return n;\n    };\n    l.prototype._greedyMatchText = function(m, n, o, p, q) {\n        for (var r = 0; ((r < m.length)); r++) {\n            var s = m[r];\n            if (((s == n[o]))) {\n                if (((q !== undefined))) {\n                    q.push(p[r]);\n                }\n            ;\n            ;\n                ++o;\n                continue;\n            }\n        ;\n        ;\n            if (((((o === ((n.length - 1)))) && ((s.indexOf(n[o]) === 0))))) {\n                if (((q !== undefined))) {\n                    if (((s == n[o]))) {\n                        q.push([p[r],]);\n                    }\n                     else q.push([p[r],n[o].length,]);\n                ;\n                }\n            ;\n            ;\n                return n.length;\n            }\n        ;\n        ;\n        };\n    ;\n        return o;\n    };\n    l.prototype._createMapOverFinalBootstrapUids = function(m, n, o, p, q, r) {\n        return function(s) {\n            var t = this.getEntry(s, q);\n            if (((((t === undefined)) || ((r(s, t) === false))))) {\n                return;\n            }\n        ;\n        ;\n            var u = {\n            };\n            g(u, m);\n            if (!u.iconClass) {\n                u.photo = t.photo;\n            }\n        ;\n        ;\n            u.cost = ((((((m.cost + l.EPSILON)) + t.grammar_costs[((((\"{\" + q)) + \"}\"))])) - o.grammar_costs[((((\"{\" + q)) + \"}\"))]));\n            u.cache_id_length = Infinity;\n            u.structure = m.structure.slice(0);\n            u.structure[m.chunks[p]] = {\n                type: n.type,\n                text: t.text,\n                uid: s\n            };\n            u.blankFilled = true;\n            var v = new RegExp(((((\"\\\\[\" + n.uid)) + \"\\\\]\")), \"g\");\n            u.semantic = m.unsubstituted_semantic.replace(v, s);\n            if (((((u.parse && u.parse.disambiguation)) && ((u.parse.disambiguation.length > 0))))) {\n                u.parse.disambiguation = u.parse.unsubstituted_disambiguation.map(function(w) {\n                    return w.replace(v, s);\n                });\n            }\n        ;\n        ;\n            u.tuid = JSON.stringify({\n                semantic: u.semantic,\n                structure: u.structure\n            });\n            return u;\n        }.bind(this);\n    };\n    l.prototype._tryMatchingFinalBootstrapResult = function(m, n, o) {\n        if (!o.completed) {\n            return [];\n        }\n    ;\n    ;\n        var p = o.parse, q = p.remTokens[((p.remTokens.length - 1))], r = o.structure[o.chunks[q]], s = r.type.substr(4).replace(\":blank\", \"\"), t = this.getEntry(r.uid, s), u = m[s];\n        if (((((((u === undefined)) || ((t === undefined)))) || ((t.grammar_costs === undefined))))) {\n            return [];\n        }\n    ;\n    ;\n        return u.map(this._createMapOverFinalBootstrapUids(o, r, t, q, s, function(v, w) {\n            return ((n.length == this._greedyMatchText(this.tokenize(w.text), n, 0)));\n        }.bind(this))).filter(function(v) {\n            return !!v;\n        });\n    };\n    l.prototype._trySubstitutingBootstrapResult = function(m, n, o) {\n        if (((((((n.unsubstituted_semantic === undefined)) || n.completed)) || ((n.type === k))))) {\n            return [];\n        }\n    ;\n    ;\n        var p = n.parse.pos, q = n.structure[n.chunks[n.parse.pos]], r = q.type.substr(4), s = m[r];\n        if (((s === undefined))) {\n            return [];\n        }\n    ;\n    ;\n        var t = this.getEntry(q.uid);\n        if (((!t || ((t.grammar_costs === undefined))))) {\n            return [];\n        }\n    ;\n    ;\n        return s.map(this._createMapOverFinalBootstrapUids(n, q, t, p, r, function(u) {\n            return ((this._prefixMatchEntity(o, n.parse, u) === o.length));\n        }.bind(this))).filter(function(u) {\n            return !!u;\n        });\n    };\n    l.prototype._computeBolding = function(m, n, o) {\n        var p = {\n        };\n        if (((m.parse.pos !== undefined))) {\n            var q = m.structure[m.chunks[m.parse.pos]];\n            if (!q.uid) {\n                p[m.chunks[m.parse.pos]] = ((((q.text.length - m.parse.suffix.length)) + n[0].length));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        m.parse.unmatch.forEach(function(t) {\n            if (((typeof (t) == \"object\"))) {\n                p[m.chunks[t[0]]] = ((m.structure[m.chunks[t[0]]].text.length - t[1].length));\n            }\n             else p[m.chunks[t]] = 0;\n        ;\n        ;\n        });\n        m.parse.remTokens.forEach(function(t) {\n            p[m.chunks[t]] = 0;\n        });\n        for (var r = 0; ((r < ((m.outputTokensUsed.length - o)))); r++) {\n            var s = m.outputTokensUsed[r];\n            if (((s.length == 1))) {\n                delete p[m.chunks[s[0]]];\n            }\n             else p[m.chunks[s[0]]] = s[1];\n        ;\n        ;\n        };\n    ;\n        return p;\n    };\n    l.prototype._getBestQueryCache = function(m) {\n        for (var n = m.length; ((n >= 0)); n--) {\n            var o = this.queryCache[m.slice(0, n)];\n            if (o) {\n                return o;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n    l.prototype._getFBObjectType = function(m) {\n        if (this.typeaheadTypeMap[m]) {\n            return this.typeaheadTypeMap[m];\n        }\n         else return \"page\"\n    ;\n    };\n    l.EPSILON = 59555;\n    l.getUniqueSemantic = function(m) {\n        var n = [], o = [], p = [];\n        m = ((((\"(\" + m)) + \")\"));\n        var q = m, r = false;\n        m.replace(/[\\(\\),]/g, function(s, t) {\n            var u;\n            switch (s) {\n              case \",\":\n                var v = ((p.length - 1));\n                u = q.substr(p[v], ((t - p[v])));\n                n[v].push(u);\n                p[v] = ((t + 1));\n                break;\n              case \"(\":\n                p.push(((t + 1)));\n                n.push([]);\n                o.push(((t + 1)));\n                break;\n              case \")\":\n                if (((p.length === 0))) {\n                    throw ((m + \" is not a valid semantic string\"));\n                }\n            ;\n            ;\n                var w = p.pop();\n                u = q.substr(w, ((t - w)));\n                var x = n.pop();\n                x.push(u);\n                var y = x.sort();\n                for (var z = 1; ((z < y.length)); z++) {\n                    if (((y[z] == y[((z - 1))]))) {\n                        r = true;\n                    }\n                ;\n                ;\n                };\n            ;\n                var aa = y.join(\",\");\n                q = ((((q.substr(0, o.pop()) + aa)) + q.substr(t)));\n                break;\n            };\n        ;\n            return s;\n        });\n        if (r) {\n            return \"\";\n        }\n    ;\n    ;\n        return q.replace(/\\((.*)\\)/, \"$1\");\n    };\n    e.exports = l;\n});\n__d(\"FacebarTokenizer\", [\"TokenizeUtil\",], function(a, b, c, d, e, f) {\n    var g = b(\"TokenizeUtil\"), h = \"[^\\\"]\", i = [\"\\\\s's\",\"'s\",((((\"\\\"\" + h)) + \"*\\\"?\")),], j = [[/\\s+$/,\"\",],[/\\\"\\s+/,\"\\\"\",],[/\\s+\\\"/,\"\\\"\",],[/\\\"\\\"/,\"\",],[/^\\\"$/,\"\",],[/\\s+/,\" \",],], k = {\n        tokenize: function(l, m) {\n            var n = [], o = 0;\n            l = l.replace(/\\s/g, \" \").toLowerCase();\n            l.replace(new RegExp(i.join(\"|\"), \"g\"), function(q, r) {\n                if (((r > o))) {\n                    var s = l.substr(o, ((r - o)));\n                    Array.prototype.push.apply(n, g.parse(s).tokens.slice(0));\n                }\n            ;\n            ;\n                var t = q;\n                for (var u = 0; ((u < j.length)); u++) {\n                    var v = j[u];\n                    t = t.replace(v[0], v[1]);\n                };\n            ;\n                if (((n.length && ((t == \"'s\"))))) {\n                    n[((n.length - 1))] += t;\n                }\n                 else if (((t !== \"\"))) {\n                    n.push(t);\n                }\n                \n            ;\n            ;\n                if (m) {\n                    Array.prototype.push.apply(n, g.parse(q).tokens);\n                }\n            ;\n            ;\n                o = ((r + q.length));\n            });\n            if (((o < l.length))) {\n                var p = l.substr(o, ((l.length - o)));\n                Array.prototype.push.apply(n, g.parse(p).tokens.slice(0));\n            }\n        ;\n        ;\n            return n;\n        }\n    };\n    e.exports = k;\n});\n__d(\"ResultsBucketizer\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        this.$ResultsBucketizer0 = h;\n        this.$ResultsBucketizer1 = i;\n    };\n;\n    g.trimResults = function(h, i, j) {\n        var k = [];\n        h.forEach(function(l, m) {\n            if (((l.indexBeforeBuckets > i))) {\n                k.push({\n                    index: m,\n                    originalIndex: l.indexBeforeBuckets\n                });\n            }\n        ;\n        ;\n        });\n        k.sort(function(l, m) {\n            return ((l.originalIndex - m.originalIndex));\n        }).slice(j).sort(function(l, m) {\n            return ((m.index - l.index));\n        }).forEach(function(l) {\n            h.splice(l.index, 1);\n        });\n    };\n    g.mergeBuckets = function(h, i) {\n        var j = [];\n        {\n            var fin201keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin201i = (0);\n            var k;\n            for (; (fin201i < fin201keys.length); (fin201i++)) {\n                ((k) = (fin201keys[fin201i]));\n                {\n                    if (!i[k].rule.hidden) {\n                        j.push(i[k]);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        j.sort(function(l, m) {\n            var n = ((((l.rule.position || 0)) - ((m.rule.position || 0))));\n            if (((n !== 0))) {\n                return n;\n            }\n        ;\n        ;\n            return ((l.results[0].indexBeforeBuckets - m.results[0].indexBeforeBuckets));\n        });\n        h.length = 0;\n        j.forEach(function(l, m) {\n            if (((((l.rule.maxPromotions !== undefined)) && ((m < ((j.length - 1))))))) {\n                g.trimResults(l.results, j[((m + 1))].results[0].indexBeforeBuckets, l.rule.maxPromotions);\n            }\n        ;\n        ;\n            Array.prototype.push.apply(h, l.results);\n        }.bind(this));\n    };\n    g.prototype.$ResultsBucketizer2 = function(h, i) {\n        if (((i.propertyName === undefined))) {\n            return ((i.bucketName || \"default\"));\n        }\n    ;\n    ;\n        var j = this.$ResultsBucketizer1(h, i.propertyName);\n        if (((((j === undefined)) || ((((i.propertyValue !== undefined)) && ((j.toString() !== i.propertyValue))))))) {\n            return false;\n        }\n    ;\n    ;\n        return ((i.bucketName || ((((i.propertyName + \".\")) + j.toString()))));\n    };\n    g.prototype.$ResultsBucketizer3 = function(h, i) {\n        var j = {\n        }, k = this.$ResultsBucketizer2.bind(this);\n        h.forEach(function(l, m) {\n            i.some(function(n) {\n                var o = k(l, n);\n                if (((o === false))) {\n                    return false;\n                }\n            ;\n            ;\n                if (((j[o] === undefined))) {\n                    j[o] = {\n                        results: [],\n                        rule: n\n                    };\n                }\n            ;\n            ;\n                if (((!!n.maxResults && ((j[o].results.length >= n.maxResults))))) {\n                    return false;\n                }\n            ;\n            ;\n                l.bucketLineage.push({\n                    bucketName: o,\n                    bucketIndex: j[o].results.length\n                });\n                j[o].results.push(l);\n                return true;\n            });\n        });\n        return j;\n    };\n    g.prototype.$ResultsBucketizer4 = function(h, i) {\n        var j = this.$ResultsBucketizer0[i];\n        if (!j) {\n            return {\n            };\n        }\n    ;\n    ;\n        var k = this.$ResultsBucketizer3(h, j);\n        {\n            var fin202keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin202i = (0);\n            var l;\n            for (; (fin202i < fin202keys.length); (fin202i++)) {\n                ((l) = (fin202keys[fin202i]));\n                {\n                    var m = k[l].rule.subBucketRules;\n                    if (!!m) {\n                        this.$ResultsBucketizer4(k[l].results, m);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        g.mergeBuckets(h, k);\n        return k;\n    };\n    g.prototype.bucketize = function(h) {\n        h.forEach(function(i, j) {\n            i.bucketLineage = [];\n            i.indexBeforeBuckets = j;\n        });\n        return this.$ResultsBucketizer4(h, \"main\");\n    };\n    e.exports = g;\n});\n__d(\"FacebarTypeaheadTypeNamedX\", [], function(a, b, c, d, e, f) {\n    var g = {\n        browse_type_user: \"user\",\n        browse_type_page: \"page\",\n        browse_type_place: \"place\",\n        browse_type_group: \"group\",\n        browse_type_application: \"app\"\n    }, h = 1, i = 3;\n    function j() {\n    \n    };\n;\n    j.addTypeNamedX = function(k, l, m, n) {\n        var o = new j(), p = o.buildTypeNamedXBuckets(((((l.entities || {\n        })).results || [])), ((((l[\"isSeeMore.true\"] || {\n        })).results || [])), n), q = p[0], r = p[1];\n        q.forEach(function(t, u) {\n            t.bucketLineage.push({\n                bucketName: \"promotedFromSeeMore\",\n                bucketIndex: u\n            });\n        });\n        var s = o.replaceResults(k, q);\n        s.forEach(function(t, u) {\n            t.bucketLineage.push({\n                bucketName: \"demotedToSeeMore\",\n                bucketIndex: u\n            });\n        });\n        s.push.apply(s, r);\n        r = s;\n        if (m) {\n            k.push.apply(k, r);\n        }\n    ;\n    ;\n    };\n    j.prototype.buildTypeNamedXBuckets = function(k, l, m) {\n        var n = {\n        };\n        k.forEach(function(v, w) {\n            var x = ((v.render_type || v.type));\n            if (((n[x] === undefined))) {\n                n[x] = {\n                    index: w,\n                    matchCount: 0\n                };\n            }\n        ;\n        ;\n            if (((v.text.toLowerCase().indexOf(m.toLowerCase()) >= 0))) {\n                n[x].matchCount++;\n            }\n        ;\n        ;\n        });\n        var o = [], p = [], q, r;\n        l.forEach(function(v) {\n            if (((v.results_set_type == \"browse_type_story\"))) {\n                if (((v.isPostsAboutEnt === true))) {\n                    r = v;\n                }\n                 else q = v;\n            ;\n            ;\n            }\n             else {\n                var w = g[v.results_set_type];\n                if (((((n[w] !== undefined)) && ((n[w].matchCount >= h))))) {\n                    o.push([v,n[w].index,]);\n                }\n                 else p.push(v);\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        o.sort(function(v, w) {\n            return ((v[1] - w[1]));\n        });\n        var s = o.map(function(v) {\n            return v[0];\n        });\n        if (((r !== undefined))) {\n            s.unshift(r);\n        }\n    ;\n    ;\n        if (((q !== undefined))) {\n            s.unshift(q);\n        }\n    ;\n    ;\n        var t = s.slice(0, i), u = s.slice(i);\n        return [t,u.concat(u, p),];\n    };\n    j.prototype.replaceResults = function(k, l) {\n        var m = [];\n        for (var n = 0; ((n < l.length)); n++) {\n            var o = 0, p = -1;\n            k.forEach(function(s, t) {\n                if (((((k[t].cost !== undefined)) && ((k[t].cost > o))))) {\n                    p = t;\n                    o = k[t].cost;\n                }\n            ;\n            ;\n            });\n            if (((p >= 0))) {\n                m.push(k[p]);\n                k.splice(p, 1);\n            }\n        ;\n        ;\n        };\n    ;\n        var q = k.length;\n        while (((((q > 0)) && ((k[((q - 1))].type == \"websuggestion\"))))) {\n            q--;\n        ;\n        };\n    ;\n        for (var r = 0; ((r < l.length)); r++) {\n            k.splice(q, 0, l[r]);\n            q++;\n        };\n    ;\n        return m;\n    };\n    e.exports = j;\n});\n__d(\"FacebarDataSource\", [\"Arbiter\",\"AsyncRequest\",\"FacebarResultStore\",\"FacebarStructuredText\",\"FacebarTokenizer\",\"FacebarURI\",\"SearchDataSource\",\"Vector\",\"ViewportBounds\",\"copyProperties\",\"throttle\",\"FacebarTypeNamedXTokenOptions\",\"ResultsBucketizer\",\"ResultsBucketizerConfig\",\"FacebarTypeaheadTypeNamedX\",\"BingScalingCommon\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"FacebarResultStore\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarTokenizer\"), l = b(\"FacebarURI\"), m = b(\"SearchDataSource\"), n = b(\"Vector\"), o = b(\"ViewportBounds\"), p = b(\"copyProperties\"), q = b(\"throttle\"), r = b(\"FacebarTypeNamedXTokenOptions\"), s = b(\"ResultsBucketizer\"), t = b(\"ResultsBucketizerConfig\"), u = b(\"FacebarTypeaheadTypeNamedX\"), v = b(\"BingScalingCommon\"), w = 100, x = 250;\n    {\n        var fin203keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin203i = (0);\n        var y;\n        for (; (fin203i < fin203keys.length); (fin203i++)) {\n            ((y) = (fin203keys[fin203i]));\n            {\n                if (((m.hasOwnProperty(y) && ((y !== \"_metaprototype\"))))) {\n                    aa[y] = m[y];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var z = ((((m === null)) ? null : m.prototype));\n    aa.prototype = Object.create(z);\n    aa.prototype.constructor = aa;\n    aa.__superConstructor__ = m;\n    function aa(ba) {\n        m.call(this, ba);\n        this.filterOutWebSuggestion = true;\n        this.bootstrap_saved = [];\n        this.null_state = null;\n        this._initialQueryData = null;\n        this._curQueryId = -1;\n        this._seeMore = false;\n        this._waitingQueries = 0;\n        this.mixGrammarAndEntity = ((((ba.mixGrammarAndEntity !== undefined)) ? ba.mixGrammarAndEntity : true));\n        this.grammarVersion = ((ba.grammarVersion || \"\"));\n        if (!ba.grammarOptions) {\n            ba.grammarOptions = {\n            };\n        }\n    ;\n    ;\n        this.recordingRoute = ((ba.grammarOptions.recordingRoute || \"banzai_vital\"));\n        this._maxGrammarResults = ba.grammarOptions.maxGrammarResults;\n        this._allowGrammar = ((ba.allowGrammar !== false));\n        this._webSearchLockedInMode = ((ba.webSearchLockedInMode !== false));\n        this.nullStateEndpoint = ((ba.nullStateEndpoint || \"/ajax/browse/null_state.php\"));\n        this.setNullStateData(((ba.nullStateData || {\n        })), true);\n        this._minWebSugg = ((ba.minWebSugg || 1));\n        this._minQueryLength = ((ba.minQueryLength || -1));\n        this.allowWebSuggOnTop = ((ba.allowWebSuggOnTop || false));\n        this._maxWebSuggToCountFetchMore = ((ba.maxWebSuggToCountFetchMore || 0));\n        this._fixProcessLean = ((ba.grammarOptions.fixProcessLean || false));\n        if (((ba.throttled === \"0\"))) {\n            this.executeQueryThrottled = this.executeQuery;\n            this.sendRemoteQueryThrottled = this.sendRemoteQuery;\n        }\n         else {\n            this.executeQueryThrottled = q(this.executeQuery, w, this);\n            this.sendRemoteQueryThrottled = q(this.sendRemoteQuery, x, this);\n        }\n    ;\n    ;\n        this.resultStoreOptions = ((ba.grammarOptions || {\n        }));\n        this.resultStoreOptions.useNewExactNameMatch = ((ba.grammarOptions.useNewExactNameMatch === \"true\"));\n        this._bypassBucketizer = false;\n        this._resultsBucketizer = new s(t.rules, function(da, ea) {\n            switch (ea) {\n              case \"isSeeMore\":\n                return da.isSeeMore;\n              case \"objectType\":\n                return da.type;\n              case \"resultSetType\":\n                return da.results_set_type;\n              case \"renderType\":\n                return ((da.render_type || da.type));\n              case \"cacheOnlyResult\":\n                return da.cacheOnlyResult;\n              case \"bootstrapped\":\n                return da.bootstrapped;\n              default:\n                return ((!!da.tags ? da.tags[ea] : undefined));\n            };\n        ;\n        });\n        var ca = new h().setURI(\"/ajax/typeahead/search/facebar/config.php\").setData({\n            version: this.grammarVersion\n        }).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true).setHandler(function(da) {\n            this.facebarConfig = da.payload;\n            this.createResultStore();\n            if (this.null_state) {\n                this.setNullState(this.null_state);\n                this.null_state = null;\n            }\n        ;\n        ;\n            this.inform(\"ready\", true);\n        }.bind(this)).setFinallyHandler(this.activityEnd.bind(this));\n        this.activityStart();\n        ca.send();\n        this.fetchNullState();\n    };\n;\n    aa.prototype.createResultStore = function() {\n        this.facebarConfig.maxGrammarResults = this._maxGrammarResults;\n        this.resultStore = new i(this.facebarConfig, k.tokenize, this.getEntry.bind(this), this.resultStoreOptions);\n        this.addEntries(this.bootstrap_saved);\n        if (this._fixProcessLean) {\n            this._processLean();\n        }\n    ;\n    ;\n        this.bootstrap_saved = [];\n        this.subscribe(\"enableCache\", function(ba, ca) {\n            this.resultStore.cacheEnabled(ca);\n        }.bind(this));\n        this.subscribe(\"setSortFunction\", function(ba, ca) {\n            this.resultStore.setSortFunction(ca);\n        }.bind(this));\n    };\n    aa.prototype.dirty = function() {\n        this.bootstrap_saved = [];\n        this._nullStateFetched = false;\n        if (this.resultStore) {\n            this.resultStore.resetCaches();\n        }\n    ;\n    ;\n        z.dirty.call(this);\n    };\n    aa.prototype.addEntries = function(ba) {\n        if (this.resultStore) {\n            this.resultStore.addBootstrap(this.processEntries(ba));\n        }\n         else Array.prototype.push.apply(this.bootstrap_saved, ba);\n    ;\n    ;\n    };\n    aa.prototype._processLean = function() {\n        if (this._fixProcessLean) {\n            if (((this._leanPayload && this.resultStore))) {\n                var ba, ca = this._leanPayload.entries;\n                {\n                    var fin204keys = ((window.top.JSBNG_Replay.forInKeys)((ca))), fin204i = (0);\n                    var da;\n                    for (; (fin204i < fin204keys.length); (fin204i++)) {\n                        ((da) = (fin204keys[fin204i]));\n                        {\n                            ba = this.getEntry(da);\n                            if (!ba) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            {\n                                var fin205keys = ((window.top.JSBNG_Replay.forInKeys)((ca[da]))), fin205i = (0);\n                                var ea;\n                                for (; (fin205i < fin205keys.length); (fin205i++)) {\n                                    ((ea) = (fin205keys[fin205i]));\n                                    {\n                                        if (!ba.grammar_costs) {\n                                            ba.grammar_costs = {\n                                            };\n                                        }\n                                    ;\n                                    ;\n                                        ba.grammar_costs[((((\"{\" + ea)) + \"}\"))] = ca[da][ea];\n                                    };\n                                };\n                            };\n                        ;\n                        };\n                    };\n                };\n            ;\n                this.setExclusions(this._leanPayload.blocked);\n                this._leanPayload = null;\n            }\n        ;\n        ;\n        }\n         else z._processLean.call(this);\n    ;\n    ;\n    };\n    aa.prototype.setNullStateData = function(ba, ca) {\n        if (ca) {\n            this.nullStateData = {\n                grammar_version: this.grammarVersion\n            };\n        }\n    ;\n    ;\n        p(this.nullStateData, ba);\n        return this;\n    };\n    aa.prototype.setNullState = function(ba) {\n        if (this.resultStore) {\n            this.processEntries(ba.entities);\n            this.resultStore.setNullState(ba.queries);\n            this.resultStore.addNullStateToQueryCache(this.getRawStructure(j.fromString(\"\")));\n            this.inform(\"ready\", true);\n        }\n    ;\n    ;\n    };\n    aa.prototype.allowGrammar = function() {\n        return this._allowGrammar;\n    };\n    aa.prototype.isWebSearchLockedInModeEnabled = function() {\n        return this._webSearchLockedInMode;\n    };\n    aa.prototype.fetchNullState = function() {\n        if (((this._nullStateFetched || !this._allowGrammar))) {\n            return;\n        }\n    ;\n    ;\n        var ba = new h().setURI(this.nullStateEndpoint).setData(this.nullStateData).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true).setHandler(function(ca) {\n            if (this.resultStore) {\n                this.setNullState(ca.payload);\n            }\n             else this.null_state = ca.payload;\n        ;\n        ;\n            this._nullStateFetched = true;\n        }.bind(this)).setFinallyHandler(this.activityEnd.bind(this));\n        this.activityStart();\n        ba.send();\n    };\n    aa.prototype.toTypeaheadEntryUid = function(ba) {\n        var ca, da = j.fromStruct(ba.structure), ea = da.getFragment(0);\n        if (((((da.getCount() == 1)) && ea.isType(\"ent\")))) {\n            var fa = ea.getType().split(\":\")[2];\n            ca = this.getEntry(ea.getUID(), fa);\n            ca.type = this.resultStore.stripBrackets(ba.type);\n        }\n         else {\n            ca = this.getEntry(ba.tuid);\n            if (!ca) {\n                var fa, ga, ha;\n                if (((ba.type === \"websuggestion\"))) {\n                    fa = ba.type;\n                    ha = ba.iconClass;\n                }\n                 else {\n                    fa = \"grammar\";\n                    ga = ba.type;\n                    ha = ba.iconClass;\n                }\n            ;\n            ;\n                ca = {\n                    dynamic_cost: ba.dynamic_cost,\n                    extra_uri_params: ba.extra_uri_params,\n                    icon_class: ha,\n                    memcache: ba.fromMemcache,\n                    photo: ba.photo,\n                    results_set_type: ga,\n                    tuid: ba.tuid,\n                    type: fa,\n                    uid: ba.tuid,\n                    tags: ba.tags,\n                    websuggestion_source: ba.websuggestion_source\n                };\n                this.processEntries([ca,]);\n                ca = this.getEntry(ba.tuid);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        if (((((ca.type === \"websuggestion\")) || ba.isRedirect))) {\n            ca.path = ba.path;\n        }\n    ;\n    ;\n        ca.error_info = ba.errorInfo;\n        ca.logInfo = ba.logInfo;\n        ca.structure = da;\n        ca.text = ca.structure.toString();\n        ca.queryTypeText = ba.queryTypeText;\n        ca.semantic = ba.semantic;\n        ca.tree = ba.tree;\n        ca.cost = ba.cost;\n        ca.isSeeMore = !!ba.isSeeMore;\n        ca.isNullState = !!ba.isNullState;\n        ca.entityInfo = ba.entityInfo;\n        ca.cacheOnlyResult = ((ba.cacheOnlyResult || false));\n        ca.uri = ((ca.uri || l.getURI(this.facebarConfig, ca)));\n        ca.semanticForest = ba.semanticForest;\n        ca.entityTypes = ba.entityTypes;\n        ca.parse = ba.parse;\n        ca.tags = ba.tags;\n        ca.isPostsAboutEnt = ((ba.isPostsAboutEnt || false));\n        ca.removable = true;\n        if (ba.isJSBootstrapMatch) {\n            ca.isJSBootstrapMatch = ba.isJSBootstrapMatch;\n            ca.backendCost = ba.backendCost;\n            ca.bootstrapCost = ba.bootstrapCost;\n        }\n    ;\n    ;\n        this._replaceCategoryWithTermMatches(ca, ba);\n        if (((((ba.parse && ba.parse.disambiguation)) && ((ba.parse.disambiguation.length > 0))))) {\n            ca.disambiguation_paths = [];\n            for (var ia = 0; ((ia < ba.parse.disambiguation.length)); ia++) {\n                var ja = {\n                };\n                ja.semantic = ba.parse.disambiguation[ia];\n                var ka = l.getURI(this.facebarConfig, ja);\n                if (ka) {\n                    ka.path = ka.path.replace(((((\"/^/\" + l.getSearchRawPrefix())) + \"//\")), \"\");\n                    ca.disambiguation_paths.push(ka.path);\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return ca.tuid;\n    };\n    aa.prototype._replaceCategoryWithTermMatches = function(ba, ca) {\n        if (((((((ba.type !== \"user\")) || !ba.term_to_subtitle)) || !ca.termMatches))) {\n            return;\n        }\n    ;\n    ;\n        var da = [];\n        ca.termMatches.forEach(function(fa) {\n            if (ba.term_to_subtitle[fa]) {\n                da.push(ba.term_to_subtitle[fa]);\n            }\n        ;\n        ;\n        }.bind(this));\n        if (((ba.category === undefined))) {\n            ba.category = \"\";\n        }\n    ;\n    ;\n        var ea = ba.category.split(\" \\u00b7 \");\n        ea.unshift.apply(ea, da);\n        ea = ea.filter(function(fa, ga, ha) {\n            return ((ga == ha.indexOf(fa)));\n        });\n        ba.category = ea.splice(0, 2).join(\" \\u00b7 \");\n    };\n    aa.prototype.getRawStructure = function(ba) {\n        if (((typeof ba == \"string\"))) {\n            ba = j.fromString(ba);\n        }\n    ;\n    ;\n        if (this.resultStore) {\n            return this.resultStore.transformStructured(ba.toArray());\n        }\n    ;\n    ;\n    };\n    aa.prototype.isSeeMore = function() {\n        return this._seeMore;\n    };\n    aa.prototype.saveResult = function(ba) {\n        this._initialQueryData = ba.uid;\n    };\n    aa.prototype.buildUids = function(ba, ca, da) {\n        if (((!ba || !this.resultStore))) {\n            return [];\n        }\n    ;\n    ;\n        if (((typeof ba == \"string\"))) {\n            ba = j.fromString(ba);\n        }\n    ;\n    ;\n        var ea = this.getRawStructure(ba), fa = this.resultStore.getResults(ea), ga = fa.results;\n        if (((typeof ga === \"undefined\"))) {\n            return [];\n        }\n    ;\n    ;\n        var ha = fa.webSuggOnTop;\n        if (((typeof ha === \"undefined\"))) {\n            ha = false;\n        }\n    ;\n    ;\n        var ia = ((fa.webSuggLimit || 0)), ja = ((fa.null_state === true)), ka = ((this.filterOutWebSuggestion && !ja)), la = 0;\n        ga = ga.filter(function(qa, ra) {\n            if (((!this._allowGrammar && ((qa.type == \"grammar\"))))) {\n                return false;\n            }\n        ;\n        ;\n            if (((qa.type != \"websuggestion\"))) {\n                return ((((qa.semantic != \"\\u003Cblank\\u003E\")) && ((((qa.type != \"unimplemented\")) || ((la++ === 0))))));\n            }\n             else return !ka\n        ;\n        }.bind(this));\n        var ma = ga.slice(), na = [], oa = [], pa = [];\n        ga.forEach(function(qa) {\n            if (((qa.forcedPosition > 0))) {\n                pa.push(qa);\n            }\n             else if (qa.isSeeMore) {\n                na.push(qa);\n            }\n             else oa.push(qa);\n            \n        ;\n        ;\n        });\n        if (ja) {\n            ga = this.orderNullState(ga, this.getMaxResults());\n        }\n         else {\n            ga = v.integrateWebsuggestions(oa, Boolean(ha), this.getMaxResults(), ia, this._minWebSugg);\n            ga.length = Math.min(ga.length, this.getMaxResults());\n        }\n    ;\n    ;\n        this.inform(\"decorateSeeMoreSuggestions\", {\n            structured: ba,\n            allResults: ma,\n            selectedResults: ga,\n            seeMoreResults: na\n        });\n        if (((pa.length > 0))) {\n            pa.sort(function(qa, ra) {\n                return ((qa.forcedPosition - ra.forcedPosition));\n            });\n            pa.forEach(function(qa) {\n                ga.splice(qa.forcedPosition, 0, qa);\n            });\n        }\n    ;\n    ;\n        if (((na.length > 0))) {\n            ga.push.apply(ga, na);\n        }\n    ;\n    ;\n        return ga.map(this.toTypeaheadEntryUid.bind(this));\n    };\n    aa.prototype.orderNullState = function(ba, ca) {\n        var da = {\n            JSBNG__top: [],\n            bottom: [],\n            middle: []\n        }, ea = function(ha) {\n            var ia = ha.null_state_position;\n            return ((da.hasOwnProperty(ia) ? ia : \"middle\"));\n        }, fa = function(ha, ia) {\n            return ((ha.original_cost - ia.original_cost));\n        };\n        ((ba && ba.forEach(function(ha) {\n            da[ea(ha)].push(ha);\n        }.bind(this))));\n        {\n            var fin206keys = ((window.top.JSBNG_Replay.forInKeys)((da))), fin206i = (0);\n            var ga;\n            for (; (fin206i < fin206keys.length); (fin206i++)) {\n                ((ga) = (fin206keys[fin206i]));\n                {\n                    da[ga] = da[ga].sort(fa).slice(0, ca);\n                    ca -= da[ga].length;\n                };\n            };\n        };\n    ;\n        return [].concat(da.JSBNG__top, da.middle, da.bottom);\n    };\n    aa.prototype.handleResponse = function(ba, ca) {\n        if (!(ba.payload.errors)) {\n            this.processEntries(ba.payload.entities);\n            this.filterOutWebSuggestion = true;\n            for (var da = 0; ((da < ba.payload.results.length)); da++) {\n                if (((ba.payload.results[da].type == \"websuggestion\"))) {\n                    this.filterOutWebSuggestion = false;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            var ea = {\n            };\n            [\"webSuggOnTop\",\"webSuggLimit\",\"webSuggLimitSeeMore\",].forEach(function(fa) {\n                if (ba.payload.hasOwnProperty(fa)) {\n                    ea[fa] = ba.payload[fa];\n                }\n            ;\n            ;\n            });\n            this.resultStore.saveResults(ba.payload.results, ca, ba.payload.incomplete, ea);\n        }\n    ;\n    ;\n    };\n    aa.prototype.processEntries = function(ba) {\n        return ba.map(function(ca, da) {\n            var ea = (ca.uid = ((ca.uid + \"\")));\n            ca.textToIndex = this.getTextToIndex(ca);\n            ca.titleToIndex = this.getTitleTerms(ca);\n            ea = this.getUID(ea, ca.fetchType);\n            var fa = this.getEntry(ea);\n            if (!fa) {\n                this.setEntry(ea, {\n                });\n                fa = this.getEntry(ea);\n            }\n        ;\n        ;\n            p(fa, ca);\n            fa.tokenVersion = ca.tokenVersion;\n            fa.tuid = ea;\n            ((((fa.index === undefined)) && (fa.index = da)));\n            return ea;\n        }.bind(this));\n    };\n    aa.prototype.getUID = function(ba, ca) {\n        ba = ((ba + \"\"));\n        if (((ca !== undefined))) {\n            ca = /([^:]+:)?([^:]+)(:.*)?/.exec(ca)[2];\n            return JSON.stringify([ba,ca,]);\n        }\n    ;\n    ;\n        return ba;\n    };\n    aa.prototype.getEntry = function(ba, ca) {\n        if (((ca !== undefined))) {\n            var da = z.getEntry.call(this, this.getUID(ba, ca));\n            if (da) {\n                return da;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return z.getEntry.call(this, ba);\n    };\n    aa.prototype.getEntryForFragment = function(ba) {\n        return this.getEntry(ba.getUID(), ba.getTypePart(2));\n    };\n    aa.prototype.getMaxResults = function() {\n        return this._numResults.max;\n    };\n    aa.prototype.query = function(ba, ca, da, ea) {\n        this.executeQueryThrottled(ba, ea, this._initialQueryData);\n        this._initialQueryData = null;\n    };\n    aa.prototype.executeQuery = function(ba, ca, da) {\n        this._seeMore = ((ca === true));\n        this._curQueryId++;\n        this.setQueryData({\n            qid: this._curQueryId,\n            see_more: this._seeMore,\n            max_results: ((this.getMaxResults() + r.additionalResultsToFetch))\n        });\n        this.inform(\"beforeQuery\", {\n            value: ba,\n            queryId: this.curQueryId\n        });\n        var ea = this.buildUids(ba, []);\n        if (da) {\n            ea = ea.filter(function(ga) {\n                return ((ga !== da));\n            });\n            ea.unshift(da);\n        }\n    ;\n    ;\n        this.value = ba;\n        this.inform(\"query\", {\n            value: ba,\n            results: ea,\n            see_more: this._seeMore,\n            queryId: this._curQueryId\n        });\n        if (this.resultStore) {\n            var fa = this.getRawStructure(ba);\n            if (this.shouldFetchMore(fa, ea)) {\n                this.sendRemoteQueryThrottled(fa, ba);\n            }\n        ;\n        ;\n            this.respond(ba, ea, false);\n        }\n    ;\n    ;\n    };\n    aa.prototype.shouldFetchMore = function(ba, ca) {\n        if (ba.is_empty) {\n            return false;\n        }\n    ;\n    ;\n        if (this._seeMore) {\n            return true;\n        }\n    ;\n    ;\n        if (this.resultStore.alreadyKnown(ba.cache_id)) {\n            return false;\n        }\n    ;\n    ;\n        if (((ba.raw_text && this._isQueryTooShort(ba.raw_text)))) {\n            return false;\n        }\n    ;\n    ;\n        if (((ca.length < this.getMaxResults()))) {\n            return true;\n        }\n    ;\n    ;\n        return ((this.countValidResults(ca) < this.getMaxResults()));\n    };\n    aa.prototype.countValidResults = function(ba) {\n        var ca = 0, da = 0;\n        ba.forEach(function(ea) {\n            var fa = this.getEntry(ea);\n            if (((fa && !fa.isNullState))) {\n                if (((fa.type === \"websuggestion\"))) {\n                    ca++;\n                }\n                 else da++;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n        return ((da + Math.min(this._maxWebSuggToCountFetchMore, ca)));\n    };\n    aa.prototype.sendRemoteQuery = function(ba, ca) {\n        var da = new h().setURI(this.queryEndpoint).setData(this.getQueryData(ba.text_form)).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true).setHandler(function(ea, fa) {\n            fa.queryId = ea;\n            this.inform(\"response_received\", fa);\n            this.handleResponse(fa, ba);\n            this.respond(ca, this.buildUids(ca), true, ((fa.payload && ((!fa.payload.results || ((fa.payload.results.length === 0)))))));\n            this.inform(\"backend_response\", fa);\n        }.bind(this, this._curQueryId)).setFinallyHandler(this.activityEnd.bind(this));\n        this.inform(\"sending_request\", da);\n        this.activityStart();\n        da.send();\n    };\n    aa.prototype.activityStart = function() {\n        if (!this._waitingQueries) {\n            this.inform(\"activity\", {\n                activity: true,\n                seeMore: this._seeMore\n            }, g.BEHAVIOR_STATE);\n        }\n    ;\n    ;\n        this._waitingQueries++;\n    };\n    aa.prototype.activityEnd = function() {\n        this._waitingQueries--;\n        if (!this._waitingQueries) {\n            this.inform(\"activity\", {\n                activity: false,\n                seeMore: this._seeMore\n            }, g.BEHAVIOR_STATE);\n        }\n    ;\n    ;\n    };\n    aa.prototype._bucketizeResults = function(ba, ca) {\n        var da = this._resultsBucketizer.bucketize(ca);\n        u.addTypeNamedX(ca, da, this.isSeeMore(), ba.toString());\n    };\n    aa.prototype.setBypassBucketizer = function(ba) {\n        this._bypassBucketizer = ba;\n    };\n    aa.prototype.respond = function(ba, ca, da, ea) {\n        this.inform(\"reorderResults\", ca);\n        this.inform(\"respondValidUids\", ca);\n        var fa = ca.map(this.getEntry.bind(this));\n        if (((((!!ba && ((((ba instanceof j)) && !ba.isEmptyOrWhitespace())))) && !this._bypassBucketizer))) {\n            this._bucketizeResults(ba, fa);\n        }\n    ;\n    ;\n        this.inform(\"respond\", {\n            value: ba,\n            results: fa,\n            isAsync: !!da,\n            isEmptyResults: ea,\n            isScrollable: this.isSeeMore()\n        });\n        return fa;\n    };\n    aa.prototype._updateMaxResults = function() {\n        var ba = n.getViewportDimensions().y, ca = ((o.getTop() || 42)), da = 56, ea = 48;\n        this.setMaxResults(Math.max(this._numResults.min, Math.min(this._numResults.max, ((Math.floor(((((((((ba - ca)) - ea)) - 25)) / da))) - 1)))));\n    };\n    aa.prototype.getCurQueryId = function() {\n        return this._curQueryId;\n    };\n    p(aa.prototype, {\n        events: [\"query\",\"respond\",\"bootstrapped\",\"activity\",\"ready\",]\n    });\n    e.exports = aa;\n});\n__d(\"FacebarFragmentRenderer\", [\"Badge\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Badge\"), h = b(\"DOM\");\n    function i(m, n, o) {\n        var p = m.structure.getFragment(n), q = null, r = ((m.bolding && m.bolding[n]));\n        if (((typeof r == \"number\"))) {\n            q = [r,((p.getLength() - r)),];\n        }\n         else if (r) {\n            q = r;\n        }\n        \n    ;\n    ;\n        var s = [p.getText(),];\n        if (m.verified) {\n            s.push(g(\"medium\", \"verified\"));\n        }\n    ;\n    ;\n        if (((q && q.length))) {\n            return h.create(\"span\", {\n            }, j(p.getText(), q, o));\n        }\n         else return h.create(\"span\", {\n            className: ((((m.bolding && o.unchanged)) || \"\"))\n        }, s)\n    ;\n    };\n;\n    function j(m, n, o) {\n        var p = [], q = false, r = 0;\n        n.forEach(function(s) {\n            var t = m.substr(r, s), u = ((q ? o.changed : o.unchanged));\n            if (((s && u))) {\n                p.push(h.create(\"span\", {\n                    className: u\n                }, t));\n            }\n             else p.push(t);\n        ;\n        ;\n            r += s;\n            q = !q;\n        });\n        return p;\n    };\n;\n    function k(m, n) {\n        var o = {\n        };\n        m.forEach(function(p, q) {\n            if (((p.type.lastIndexOf(\"ent:\", 0) === 0))) {\n                o[q] = l(n, p);\n            }\n        ;\n        ;\n        });\n        return o;\n    };\n;\n    function l(m, n) {\n        var o = false, p = [];\n        m.tokens.forEach(function(t) {\n            if (((typeof t == \"object\"))) {\n                if (((t.uid == n.getUID()))) {\n                    o = true;\n                }\n            ;\n            ;\n            }\n             else {\n                p.push(t);\n                if (((((t.length > 2)) && ((t.substr(((t.length - 2))) == \"'s\"))))) {\n                    p.push(t.substr(0, ((t.length - 2))));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        if (o) {\n            return;\n        }\n    ;\n    ;\n        var q = n.getText().split(\" \"), r = \"\", s = [];\n        q.forEach(function(t, u) {\n            var v = 0;\n            p.forEach(function(w) {\n                if (((((w.length > v)) && ((t.toLowerCase().indexOf(w) === 0))))) {\n                    v = w.length;\n                }\n            ;\n            ;\n            });\n            r += t.substr(0, v);\n            if (((v != t.length))) {\n                s.push(r.length);\n                s.push(((t.length - v)));\n                r = \"\";\n            }\n        ;\n        ;\n            if (((u < ((q.length - 1))))) {\n                r += \" \";\n            }\n        ;\n        ;\n        });\n        s.push(r.length);\n        return s;\n    };\n;\n    e.exports = {\n        renderFragment: i,\n        computeEntBolding: k\n    };\n});\n__d(\"FacebarTypeaheadItem\", [\"BrowseFacebarHighlighter\",\"JSBNG__CSS\",\"cx\",\"DOM\",\"FacebarFragmentRenderer\",\"FacebarRender\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"BrowseFacebarHighlighter\"), h = b(\"JSBNG__CSS\"), i = b(\"cx\"), j = b(\"DOM\"), k = b(\"FacebarFragmentRenderer\"), l = b(\"FacebarRender\"), m = b(\"fbt\"), n = \"-cx-PUBLIC-fbFacebarTypeaheadItem__label\", o = \"-cx-PUBLIC-fbFacebarTypeaheadItem__labeltitle\", p = k.renderFragment;\n    function q(s) {\n        var t = s.getTypePart(0);\n        return ((t ? ((((\"fragment\" + t.charAt(0).toUpperCase())) + t.substr(1))) : \"fragment\"));\n    };\n;\n    function r(s) {\n        this._result = s;\n        this._aux = null;\n        this._debug = null;\n        this._renderEducation = true;\n        this._classes = ((s.classNames || \"\")).split(\" \");\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__root\");\n        this.addClass(\"-cx-PRIVATE-fbHighlightNodeDecorator__highlight\");\n        this._shouldVAlign = true;\n        this._messageButton = null;\n    };\n;\n    r.prototype.setVAlign = function(s) {\n        this._shouldVAlign = s;\n        return this;\n    };\n    r.prototype.shouldVAlign = function() {\n        return this._shouldVAlign;\n    };\n    r.prototype.addClass = function(s) {\n        this._classes.push(s);\n    };\n    r.prototype.setAux = function(s) {\n        this._aux = s;\n        return this;\n    };\n    r.prototype.setShouldRenderEducation = function(s) {\n        this._renderEducation = s;\n        return this;\n    };\n    r.prototype.setDebug = function(s) {\n        this._debug = s;\n        return this;\n    };\n    r.prototype.setMessageButton = function(s) {\n        this._messageButton = s;\n        return this;\n    };\n    r.prototype.cacheable = function() {\n        return ((this._debug === null));\n    };\n    r.prototype.renderText = function() {\n        return this._result.structure.toArray().map(function(s, t) {\n            var u = p(this._result, t, {\n            });\n            return h.addClass(u, q(s));\n        }.bind(this));\n    };\n    r.prototype.renderAux = function() {\n        return ((this._aux ? [this._aux,] : []));\n    };\n    r.prototype.renderSubtext = function() {\n        return [];\n    };\n    r.prototype.renderIcon = function() {\n        return [];\n    };\n    r.prototype.renderEduContent = function() {\n        if (!this._renderEducation) {\n            return [];\n        }\n    ;\n    ;\n        var s = j.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__usereducationkeytext\"\n        }, \"Tab\"), t = m._(\"Use {tab} key to select\", [m.param(\"tab\", s),]);\n        return j.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__usereducationtext\"\n        }, l.children(t));\n    };\n    r.prototype.highlight = function(s) {\n        if (((!this._result.original_query || !h.hasClass(s, \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\")))) {\n            return;\n        }\n    ;\n    ;\n        var t = this._result.original_query.toString().trim(), u = t.split(\" \"), v = ((((u.length > 1)) ? [t,].concat(u) : [t,]));\n        v = v.filter(function(w) {\n            return ((w !== \"\"));\n        });\n        if (h.hasClass(s, \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\")) {\n            g.highlight(s, v);\n        }\n    ;\n    ;\n    };\n    r.prototype.render = function() {\n        var s = this.renderAux(), t = this.renderIcon(), u = this.renderText(), v = this.renderEduContent(), w = this.renderSubtext(), x = this._debug, y = this._messageButton, z = l.span(o, l.children(u, w));\n        h.conditionClass(z, \"-cx-PUBLIC-fbFacebarTypeaheadItem__valign\", ((this.shouldVAlign() && w)));\n        var aa = l.span(n, [z,v,y,]);\n        h.conditionClass(aa, \"-cx-PRIVATE-fbFacebarTypeaheadItem__hasmessagebutton\", y);\n        var ba = j.create(\"a\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__link\",\n            href: this._result.uri,\n            rel: \"ignore\"\n        }, j.create(\"span\", {\n            className: \"-cx-PUBLIC-fbFacebarTypeaheadItem__maincontent\"\n        }, l.children(t, aa, x))), ca = j.create(\"span\", {\n            className: \"-cx-PUBLIC-fbFacebarTypeaheadItem__auxcontent\"\n        }, l.children(s, this._aux));\n        if (t) {\n            this._classes.push(\"-cx-PRIVATE-fbFacebarTypeaheadItem__hasicon\");\n        }\n    ;\n    ;\n        var da = j.create(\"li\", {\n            className: this._classes.join(\" \")\n        }, [ba,ca,]);\n        da.setAttribute(\"aria-label\", this._result.structure.toString());\n        return da;\n    };\n    e.exports = r;\n});\n__d(\"FacebarTypeaheadToken\", [\"cx\",\"FacebarRender\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"FacebarRender\"), i = ((((\" \" + \"\\u00b7\")) + \" \")), j = \"-cx-PUBLIC-fbFacebarTypeaheadToken__root\", k = \"-cx-PUBLIC-fbFacebarTypeaheadToken__inner\", l = \"-cx-PUBLIC-fbFacebarTypeaheadToken__subtext\";\n    function m(n, o) {\n        this._text = n;\n        this._limit = null;\n        this._innerClass = ((o ? o : k));\n        this._showLeadingMiddot = false;\n        this._separateMainText = true;\n    };\n;\n    m.prototype.setLimit = function(n) {\n        this._limit = n;\n        return this;\n    };\n    m.prototype.setLeadingMiddot = function(n) {\n        this._showLeadingMiddot = n;\n        return this;\n    };\n    m.prototype.separateMainText = function(n) {\n        this._separateMainText = n;\n        return this;\n    };\n    m.prototype.getText = function() {\n        return this._text;\n    };\n    m.prototype.render = function() {\n        var n = this.getText();\n        if (n.length) {\n            ((this._limit && n.splice(this._limit)));\n            n.forEach(function(r, s) {\n                if (((((s !== 0)) || this._showLeadingMiddot))) {\n                    n[s] = [i,r,];\n                }\n            ;\n            ;\n            }.bind(this));\n            var o = ((this._separateMainText ? n.shift() : null)), p = ((n.length ? h.span(l, n) : null)), q = h.span(j, h.span(this._innerClass, [o,p,]));\n            return q;\n        }\n    ;\n    ;\n    };\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadEntityToken\", [\"FacebarTypeaheadToken\",\"DOM\",\"HTML\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarTypeaheadToken\"), h = b(\"DOM\"), i = b(\"HTML\"), j = \"\\u00b7\";\n    {\n        var fin207keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin207i = (0);\n        var k;\n        for (; (fin207i < fin207keys.length); (fin207i++)) {\n            ((k) = (fin207keys[fin207i]));\n            {\n                if (((g.hasOwnProperty(k) && ((k !== \"_metaprototype\"))))) {\n                    m[k] = g[k];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var l = ((((g === null)) ? null : g.prototype));\n    m.prototype = Object.create(l);\n    m.prototype.constructor = m;\n    m.__superConstructor__ = g;\n    function m(n) {\n        g.call(this);\n        this._entity = n;\n        this._default = {\n        };\n    };\n;\n    m.prototype.setDefaultText = function(n, o) {\n        this._default[n] = o;\n        return this;\n    };\n    m.prototype.getText = function() {\n        var n = [], o = {\n        }, p = function(r) {\n            r = r.trim();\n            if (!o[r]) {\n                n.push(r);\n                o[r] = 1;\n            }\n        ;\n        ;\n        }, q = function(r) {\n            if (((typeof r == \"object\"))) {\n                r = h.getText(i(r).getRootNode());\n            }\n        ;\n        ;\n            ((r && r.split(j).map(p)));\n        };\n        ((this._entity.category ? q(this._entity.category) : n.push(this._default[this._entity.type])));\n        q(this._entity.subtext);\n        return n;\n    };\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadEntityItem\", [\"JSBNG__CSS\",\"cx\",\"DOM\",\"FacebarTypeaheadItem\",\"FacebarTypeaheadEntityToken\",\"fbt\",\"TypeaheadFacepile\",\"FacebarRender\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"cx\"), i = b(\"DOM\"), j = b(\"FacebarTypeaheadItem\"), k = b(\"FacebarTypeaheadEntityToken\"), l = b(\"fbt\"), m = b(\"TypeaheadFacepile\"), n = b(\"FacebarRender\");\n    {\n        var fin208keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin208i = (0);\n        var o;\n        for (; (fin208i < fin208keys.length); (fin208i++)) {\n            ((o) = (fin208keys[fin208i]));\n            {\n                if (((j.hasOwnProperty(o) && ((o !== \"_metaprototype\"))))) {\n                    q[o] = j[o];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var p = ((((j === null)) ? null : j.prototype));\n    q.prototype = Object.create(p);\n    q.prototype.constructor = q;\n    q.__superConstructor__ = j;\n    function q(r) {\n        j.call(this, r);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\");\n    };\n;\n    q.prototype.renderSubtext = function() {\n        var r = n.span(\"DefaultText\", \"Timeline\");\n        return new k(this._result).setDefaultText(\"user\", r).render();\n    };\n    q.prototype.renderIcon = function() {\n        var r = ((this._result.photos || this._result.photo));\n        if (!r) {\n            return null;\n        }\n    ;\n    ;\n        if (((r instanceof Array))) {\n            r = m.render(r);\n            g.addClass(r, \"-cx-PRIVATE-fbFacebarTypeaheadItem__entitysplitpics\");\n            return r;\n        }\n         else return i.create(\"img\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityicon\",\n            alt: \"\",\n            src: r\n        })\n    ;\n    };\n    e.exports = q;\n});\n__d(\"FacebarDisambiguationDialog\", [\"JSBNG__Event\",\"BrowseLogger\",\"JSBNG__CSS\",\"cx\",\"Dialog\",\"DOM\",\"FacebarStructuredText\",\"FacebarTypeaheadEntityItem\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"BrowseLogger\"), i = b(\"JSBNG__CSS\"), j = b(\"cx\"), k = b(\"Dialog\"), l = b(\"DOM\"), m = b(\"FacebarStructuredText\"), n = b(\"FacebarTypeaheadEntityItem\"), o = b(\"tx\"), p = 650;\n    function q(r, s, t, u, v) {\n        this._sets = r;\n        this._path = s;\n        this._ondone = t;\n        this._oncancel = u;\n        this._selection = [];\n        this._typeaheadSID = v;\n    };\n;\n    q.prototype.show = function() {\n        new k().setTitle(\"Which of these did you mean?\").setBody(this._createBody()).setContentWidth(p).setModal(true).setButtons([k.CONFIRM,k.CANCEL,]).setHandler(this._handleDone.bind(this)).setCancelHandler(this._handleCancel.bind(this)).show();\n        this._sets.forEach(function(r) {\n            var s = [];\n            r.forEach(function(u) {\n                s.push(u.uid);\n            });\n            var t = r[0];\n            h.logDisambiguationImpression(t.text, t.type, this._path, s.join(\",\"), this._typeaheadSID);\n        }.bind(this));\n    };\n    q.prototype._createBody = function() {\n        var r = [];\n        this._sets.forEach(function(s, t) {\n            ((r.length && r.push(l.create(\"li\", {\n                className: \"-cx-PRIVATE-fbFacebarDisambiguationDialog__divider\"\n            }))));\n            s.forEach(function(u) {\n                var v = this._createItem(u, t);\n                ((this._selection[t] || this._selectItem(v)));\n                r.push(v.root);\n            }.bind(this));\n        }.bind(this));\n        return l.create(\"ul\", {\n            className: \"viewList disambiguationList\"\n        }, r);\n    };\n    q.prototype._createItem = function(r, s) {\n        var t = {\n            uri: null,\n            subtext: r.subtext,\n            category: r.category,\n            photo: r.photo,\n            type: r.type,\n            structure: m.fromStruct([{\n                text: r.text,\n                type: ((\"ent:\" + r.type)),\n                uid: r.uid\n            },])\n        }, u = l.create(\"div\", {\n            className: \"-cx-PRIVATE-fbFacebarDisambiguationDialog__check\"\n        }), v = new n(t).setAux(i.hide(u)).setShouldRenderEducation(false).render(), w = {\n            setId: s,\n            result: r,\n            root: v,\n            check: u\n        };\n        i.addClass(v, \"-cx-PRIVATE-fbFacebarDisambiguationDialog__item\");\n        g.listen(v, \"mouseover\", this._toggleHover.bind(this, w, true));\n        g.listen(v, \"mouseout\", this._toggleHover.bind(this, w, false));\n        g.listen(v, \"click\", function(JSBNG__event) {\n            this._selectItem(w);\n            return JSBNG__event.kill();\n        }.bind(this));\n        return w;\n    };\n    q.prototype._toggleHover = function(r, s) {\n        i.conditionClass(r.root, \"selected\", s);\n    };\n    q.prototype._toggleCheck = function(r, s) {\n        i.conditionShow(r.check, s);\n    };\n    q.prototype._selectItem = function(r) {\n        var s = this._selection[r.setId];\n        this._selection[r.setId] = r;\n        ((s && this._toggleCheck(s, false)));\n        this._toggleCheck(r, true);\n    };\n    q.prototype._handleDone = function(r) {\n        this._ondone(((((r == k.CONFIRM)) ? this._selection.map(function(s) {\n            var t = s.result;\n            h.logDisambiguationClick(t.text, t.type, this._path, t.index, t.uid, this._typeaheadSID);\n            return t;\n        }.bind(this)) : null)));\n    };\n    q.prototype._handleCancel = function() {\n        this._oncancel();\n    };\n    e.exports = q;\n});\n__d(\"FacebarTypeahead\", [\"Arbiter\",\"Typeahead\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Typeahead\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    {\n        var fin209keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin209i = (0);\n        var k;\n        for (; (fin209i < fin209keys.length); (fin209i++)) {\n            ((k) = (fin209keys[fin209i]));\n            {\n                if (((h.hasOwnProperty(k) && ((k !== \"_metaprototype\"))))) {\n                    m[k] = h[k];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var l = ((((h === null)) ? null : h.prototype));\n    m.prototype = Object.create(l);\n    m.prototype.constructor = m;\n    m.__superConstructor__ = h;\n    function m(n, o, p, q, r, s) {\n        h.call(this, n, o, p, q);\n        this.getCore();\n        this.proxyEvents();\n        this.initBehaviors(((r || [])));\n        var t = this.core.subscribe(\"JSBNG__focus\", function() {\n            if (s) {\n                s.init(this);\n            }\n        ;\n        ;\n            this.core.unsubscribe(t);\n            this.data.bootstrap(false);\n            this.core.input.JSBNG__focus();\n        }.bind(this));\n        this.data.bootstrap(true);\n        this.inform(\"init\", this, g.BEHAVIOR_PERSISTENT);\n        g.inform(\"Facebar/init\", this, g.BEHAVIOR_PERSISTENT);\n    };\n;\n    m.prototype.proxyEvents = function() {\n        var n, o = [], p = null, q = (function() {\n            while (n = o.shift()) {\n                this.inform(n[0], n[1]);\n            ;\n            };\n        ;\n            p = null;\n        }).bind(this);\n        [this.data,this.view,this.core,].forEach(function(r) {\n            r.subscribe(r.events, function(s, t) {\n                o.push([s,t,]);\n                p = ((p || q.defer()));\n            }.bind(this));\n        }, this);\n    };\n    i(m.prototype, {\n        init: j\n    });\n    e.exports = m;\n});\n__d(\"StructuredInputDOM\", [\"createArrayFrom\",\"JSBNG__CSS\",\"cx\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"createArrayFrom\"), h = b(\"JSBNG__CSS\"), i = b(\"cx\"), j = b(\"DOM\"), k = {\n        ENTITY_CLASS: \"-cx-PUBLIC-uiStructuredInput__entity\",\n        encodeText: function(l) {\n            return l.replace(/ /g, \"\\u00a0\");\n        },\n        decodeText: function(l) {\n            return l.replace(/\\u00a0/g, \" \");\n        },\n        createIconNode: function(l) {\n            if (((l && ((typeof l == \"object\"))))) {\n                var m = j.create(\"i\", {\n                    className: l.className,\n                    style: ((l.uri && {\n                        backgroundImage: ((((\"url(\\\"\" + l.uri)) + \"\\\")\"))\n                    }))\n                });\n                m.setAttribute(\"data-select\", \"ignore\");\n                return m;\n            }\n        ;\n        ;\n        },\n        createTextNode: function(l) {\n            return j.create(\"span\", {\n                \"data-si\": true\n            }, k.encodeText(((l || \"\"))));\n        },\n        createEntityNode: function(l, m) {\n            var n = k.encodeText(l.text), o = k.createIconNode(m.icon), p = j.create(\"span\", {\n            }, ((o ? [o,n,] : n))), q = ((m.className || \"\")).split(/\\s+/);\n            q.push(k.ENTITY_CLASS);\n            q.forEach(h.addClass.bind(h, p));\n            var r = {\n                si: true,\n                uid: l.uid,\n                type: l.type,\n                text: n,\n                fulltext: n,\n                group: m.group,\n                select: m.select,\n                icon: JSON.stringify(((m.icon || null)))\n            };\n            {\n                var fin210keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin210i = (0);\n                var s;\n                for (; (fin210i < fin210keys.length); (fin210i++)) {\n                    ((s) = (fin210keys[fin210i]));\n                    {\n                        if (((r[s] != null))) {\n                            p.setAttribute(((\"data-\" + s)), r[s]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return p;\n        },\n        convertToTextNode: function(l) {\n            l.className = \"\";\n            l.setAttribute(\"data-type\", \"text\");\n            l.removeAttribute(\"data-group\");\n            l.removeAttribute(\"data-select\");\n            l.removeAttribute(\"data-icon\");\n            l.removeAttribute(\"data-uid\");\n            for (var m = l.firstChild; m; m = m.nextSibling) {\n                if (!j.isTextNode(m)) {\n                    j.remove(m);\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        isEntityNode: function(l) {\n            return ((j.isElementNode(l) && h.hasClass(l, k.ENTITY_CLASS)));\n        },\n        containsOnlyText: function(l, m) {\n            m = g(m);\n            for (var n = l.firstChild; n; n = n.nextSibling) {\n                if (!((j.isTextNode(n) || ((l.nodeName in m))))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        getText: function(l) {\n            return j.getText(l).replace(/ /g, \"\\u00a0\");\n        },\n        getDecodedText: function(l) {\n            return k.decodeText(j.getText(l));\n        },\n        getLength: function(l) {\n            return j.getText(l).length;\n        },\n        getMarker: function(l, m, n) {\n            var o = l.firstChild;\n            while (o) {\n                var p = k.getLength(o);\n                if (((((p > m)) || !o.nextSibling))) {\n                    if (((j.isTextNode(o) || !n))) {\n                        return {\n                            node: o,\n                            offset: Math.min(m, p)\n                        };\n                    }\n                     else return k.getMarker(o, m)\n                ;\n                }\n                 else m -= p;\n            ;\n            ;\n                o = o.nextSibling;\n            };\n        ;\n        }\n    };\n    e.exports = k;\n});\n__d(\"StructuredInputUtil\", [\"StructuredInputDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"StructuredInputDOM\");\n    function h(n, o, p) {\n        var q = n.substr(0, o).lastIndexOf(p);\n        return ((((q !== -1)) ? ((q + 1)) : 0));\n    };\n;\n    function i(n, o, p) {\n        var q = n.indexOf(p, o);\n        return ((((q !== -1)) ? q : n.length));\n    };\n;\n    function j(n, o, p) {\n        return ((((((o === 0)) || ((o === n.length)))) || ((n.substr(o, p.length) == p))));\n    };\n;\n    function k(n, o, p, q) {\n        switch (o) {\n          case \"none\":\n            return p;\n          case \"all\":\n            return ((q ? n.length : 0));\n          case \"word\":\n            if (j(n, p, \"\\u00a0\")) {\n                return p;\n            }\n             else if (q) {\n                return i(n, p, \"\\u00a0\");\n            }\n             else return h(n, p, \"\\u00a0\")\n            \n        ;\n        };\n    ;\n    };\n;\n    function l(n, o) {\n        return ((((o && g.isEntityNode(n))) && !g.isEntityNode(o)));\n    };\n;\n    var m = {\n        getMarkerAtOffset: function(n, o) {\n            var p = n.firstChild, q = 0, r = 0;\n            while (p) {\n                q += r;\n                r = g.getLength(p);\n                if (((((q + r)) > o))) {\n                    break;\n                }\n                 else p = p.nextSibling;\n            ;\n            ;\n            };\n        ;\n            return {\n                node: ((p || n.lastChild)),\n                offset: ((o - q))\n            };\n        },\n        validateEntityText: function(n) {\n            var o = g.getText(n), p = n.getAttribute(\"data-fulltext\"), q = n.getAttribute(\"data-group\");\n            if (((q == \"hashtag\"))) {\n                var r = o.match(/#[^\\s]+/);\n                p = ((r && r[0]));\n            }\n        ;\n        ;\n            var s = o.indexOf(p), t = {\n                prefix: null,\n                entity: null,\n                suffix: null\n            };\n            switch (q) {\n              case \"none\":\n                t.entity = o;\n                break;\n              case \"hashtag\":\n            \n              case \"all\":\n                if (((s != -1))) {\n                    t.prefix = o.substr(0, s);\n                    t.entity = o.substr(s, p.length);\n                    t.suffix = o.substr(((s + p.length)));\n                }\n                 else t.suffix = o;\n            ;\n            ;\n                break;\n              case \"word\":\n                if (((s != -1))) {\n                    t.prefix = o.substr(0, s);\n                    o = o.substr(s);\n                }\n            ;\n            ;\n                var u = 0, v = 0;\n                while (((u < p.length))) {\n                    v = i(p, ((u + 1)), \"\\u00a0\");\n                    if (((o.substr(0, v) != p.substr(0, v)))) {\n                        break;\n                    }\n                     else u = v;\n                ;\n                ;\n                };\n            ;\n                t.entity = ((o.substr(0, u) || null));\n                t.suffix = ((o.substr(u) || null));\n            };\n        ;\n            return t;\n        },\n        getGrouping: function(n, o) {\n            var p = n.getAttribute(\"data-group\"), q = n.getAttribute(\"data-select\");\n            if (((o == \"select\"))) {\n                return ((((q == \"group\")) ? p : \"none\"));\n            }\n             else return p\n        ;\n        },\n        snapMarkerToText: function(n, o) {\n            var p = n.node;\n            if (g.isEntityNode(p)) {\n                var q = n.offset, r = m.getGrouping(p, o);\n                if (((r != \"none\"))) {\n                    if (((q === 0))) {\n                        var s = p.previousSibling;\n                        if (l(p, s)) {\n                            return {\n                                node: s,\n                                offset: g.getLength(s)\n                            };\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((q == g.getLength(p)))) {\n                        var t = p.nextSibling;\n                        if (l(p, t)) {\n                            return {\n                                node: t,\n                                offset: 0\n                            };\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return n;\n        },\n        nextMarkerBoundary: function(n, o, p) {\n            var q = n.node;\n            if (((g.isEntityNode(q) && ((!o || ((n.offset !== 0))))))) {\n                var r = m.getGrouping(q, p);\n                if (((r != \"none\"))) {\n                    return {\n                        node: n.node,\n                        offset: k(g.getText(q), r, n.offset, o)\n                    };\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return n;\n        }\n    };\n    e.exports = m;\n});\n__d(\"StructuredInputCleaner\", [\"DOM\",\"createArrayFrom\",\"copyProperties\",\"StructuredInputUtil\",\"StructuredInputDOM\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"createArrayFrom\"), i = b(\"copyProperties\"), j = b(\"StructuredInputUtil\"), k = b(\"StructuredInputDOM\"), l = b(\"UserAgent\");\n    function m(n, o) {\n        this._node = n;\n        this._wrapText = o;\n    };\n;\n    m.prototype._cleanEntityNode = function(n) {\n        var o = n.getAttribute(\"data-text\"), p = k.getText(n);\n        n.style.cssText = \"\";\n        if (((((o == p)) && k.containsOnlyText(n, {\n            I: true\n        })))) {\n            return null;\n        }\n    ;\n    ;\n        var q = [], r = j.validateEntityText(n), s = k.createIconNode(JSON.parse(n.getAttribute(\"data-icon\")));\n        if (((!r.entity && ((((r.suffix && !r.prefix)) || ((r.prefix && !r.suffix))))))) {\n            k.convertToTextNode(n);\n            n.setAttribute(\"data-text\", p);\n            return null;\n        }\n    ;\n    ;\n        if (r.prefix) {\n            q.push(this._createTextNode(r.prefix));\n        }\n    ;\n    ;\n        if (r.entity) {\n            g.setContent(n, ((s ? [s,r.entity,] : r.entity)));\n            n.setAttribute(\"data-text\", r.entity);\n            q.push(n);\n        }\n    ;\n    ;\n        if (r.suffix) {\n            q.push(this._createTextNode(r.suffix));\n        }\n    ;\n    ;\n        return q;\n    };\n    m.prototype._removeSpecialNodes = function() {\n        var n = h(this._node.getElementsByTagName(\"script\")), o = h(this._node.getElementsByTagName(\"style\"));\n        n.forEach(g.remove);\n        o.forEach(g.remove);\n    };\n    m.prototype._collapseNodes = function() {\n        for (var n, o = this._node.firstChild; o; o = n) {\n            n = o.nextSibling;\n            if (((((!g.isTextNode(o) && !k.isEntityNode(o))) && !k.containsOnlyText(o)))) {\n                for (var p = o.lastChild; p; p = o.lastChild) {\n                    this._node.insertBefore(p, n);\n                    n = p;\n                };\n            }\n        ;\n        ;\n        };\n    ;\n    };\n    m.prototype._createTextNode = function(n) {\n        if (this._wrapText) {\n            return k.createTextNode(n);\n        }\n         else return JSBNG__document.createTextNode(n)\n    ;\n    };\n    m.prototype.replaceNodes = function(n, o) {\n        if (((o == null))) {\n            return;\n        }\n    ;\n    ;\n        var p = ((n.length ? n[((n.length - 1))].nextSibling : null));\n        n.forEach(g.remove);\n        o.forEach(function(q) {\n            this._node.insertBefore(q, p);\n        }.bind(this));\n    };\n    m.prototype.clean = function() {\n        this._removeSpecialNodes();\n        this._collapseNodes();\n        var n = [], o = function() {\n            if (n.length) {\n                this.replaceNodes(n, this._cleanTextNodes(n));\n                n.length = 0;\n            }\n        ;\n        ;\n        }.bind(this);\n        h(this._node.childNodes).forEach(function(p) {\n            if (k.isEntityNode(p)) {\n                this.replaceNodes([p,], this._cleanEntityNode(p));\n                o(n);\n            }\n             else n.push(p);\n        ;\n        ;\n        }.bind(this));\n        o();\n        if (((!this._node.firstChild && l.firefox()))) {\n            this._node.appendChild(this._createTextNode());\n        }\n    ;\n    ;\n    };\n    m.prototype.endOnText = function() {\n        var n = function(o, p) {\n            if (k.isEntityNode(o)) {\n                this._node.insertBefore(this._createTextNode(), ((p ? o : null)));\n            }\n        ;\n        ;\n        }.bind(this);\n        n(this._node.firstChild, true);\n        n(this._node.lastChild, false);\n    };\n    i(m.prototype, {\n        _cleanTextNodes: (function() {\n            var n = function(p) {\n                return ((((p.nodeName === \"BR\")) || ((((p.nodeName === \"SPAN\")) && o(p)))));\n            }, o = function(p) {\n                return ((((p.getAttribute(\"data-si\") && k.containsOnlyText(p))) && ((k.getLength(p) > 0))));\n            };\n            return function(p) {\n                if (((((p.length != 1)) || !n(p[0])))) {\n                    var q = p.map(k.getText).join(\"\").replace(/\\s+/g, \" \");\n                    return ((q ? [this._createTextNode(q),] : []));\n                }\n                 else {\n                    p[0].style.cssText = \"\";\n                    return;\n                }\n            ;\n            ;\n            };\n        })()\n    });\n    e.exports = m;\n});\n__d(\"DOMSelection\", [], function(a, b, c, d, e, f) {\n    (function() {\n        var g = this, h = {\n            isPreceding: function(n, o) {\n                return ((o.compareDocumentPosition(n) & 2));\n            },\n            contains: function(n, o) {\n                if (((n.compareDocumentPosition != null))) {\n                    return ((n.compareDocumentPosition(o) & 16));\n                }\n                 else return n.contains(o)\n            ;\n            },\n            isCursorPreceding: function(n, o, p, q) {\n                if (((n === p))) {\n                    return ((o <= q));\n                }\n            ;\n            ;\n                if (((h.isText(n) && h.isText(p)))) {\n                    return h.isPreceding(n, p);\n                }\n            ;\n            ;\n                if (((h.isText(n) && !h.isText(p)))) {\n                    return !h.isCursorPreceding(p, q, n, o);\n                }\n            ;\n            ;\n                if (!h.contains(n, p)) {\n                    return h.isPreceding(n, p);\n                }\n            ;\n            ;\n                if (((n.childNodes.length <= o))) {\n                    return false;\n                }\n            ;\n            ;\n                if (((n.childNodes[o] === p))) {\n                    return ((0 <= q));\n                }\n            ;\n            ;\n                return h.isPreceding(n.childNodes[o], p);\n            },\n            isText: function(n) {\n                return ((((n != null)) ? ((n.nodeType == 3)) : false));\n            },\n            getChildIndex: function(n) {\n                var o = 0;\n                while (n = n.previousSibling) {\n                    o++;\n                ;\n                };\n            ;\n                return o;\n            }\n        }, i = g.JSBNG__Selection = (function() {\n            function n(o) {\n                this.win = o;\n            };\n        ;\n            n.prototype.hasSelection = function() {\n                return n.hasSelection(this.win);\n            };\n            n.prototype.isBidirectional = function() {\n                return n.isBidirectional(this.win);\n            };\n            n.prototype.getOrigin = function() {\n                return n.getOrigin(this.win);\n            };\n            n.prototype.getFocus = function() {\n                return n.getFocus(this.win);\n            };\n            n.prototype.getStart = function() {\n                return n.getStart(this.win);\n            };\n            n.prototype.getEnd = function() {\n                return n.getEnd(this.win);\n            };\n            n.prototype.trySelection = function(o, p, q, r) {\n                return n.trySelection(this.win, o, p, q, r);\n            };\n            n.prototype.setSelection = function(o, p, q, r) {\n                return n.setSelection(this.win, o, p, q, r);\n            };\n            n.prototype.clearSelection = function() {\n                return n.clearSelection(this.win);\n            };\n            return n;\n        })();\n        function j() {\n            if (((g.JSBNG__document.selection && /MSIE 9\\./.test(JSBNG__navigator.userAgent)))) {\n                return false;\n            }\n             else return !!g.JSBNG__getSelection\n        ;\n        };\n    ;\n        if (j()) {\n            i.supported = true;\n            i.hasSelection = function(n) {\n                var o;\n                return (((((o = n.JSBNG__getSelection()) && ((o.focusNode != null)))) && ((o.anchorNode != null))));\n            };\n            i.isBidirectional = function(n) {\n                return true;\n            };\n            i.getOrigin = function(n) {\n                var o;\n                if (!(((o = n.JSBNG__getSelection()) && ((o.anchorNode != null))))) {\n                    return null;\n                }\n            ;\n            ;\n                return [o.anchorNode,o.anchorOffset,];\n            };\n            i.getFocus = function(n) {\n                var o;\n                if (!(((o = n.JSBNG__getSelection()) && ((o.focusNode != null))))) {\n                    return null;\n                }\n            ;\n            ;\n                return [o.focusNode,o.focusOffset,];\n            };\n            i.getStart = function(n) {\n                var o, p, q, r, s, t;\n                if (!i.hasSelection(n)) {\n                    return null;\n                }\n            ;\n            ;\n                s = i.getOrigin(n), o = s[0], q = s[1];\n                t = i.getFocus(n), p = t[0], r = t[1];\n                if (h.isCursorPreceding(o, q, p, r)) {\n                    return [o,q,];\n                }\n            ;\n            ;\n                return [p,r,];\n            };\n            i.getEnd = function(n) {\n                var o, p, q, r, s, t;\n                if (!i.hasSelection(n)) {\n                    return null;\n                }\n            ;\n            ;\n                s = i.getOrigin(n), o = s[0], q = s[1];\n                t = i.getFocus(n), p = t[0], r = t[1];\n                if (h.isCursorPreceding(o, q, p, r)) {\n                    return [p,r,];\n                }\n            ;\n            ;\n                return [o,q,];\n            };\n            var k = function(n, o, p, q, s, t) {\n                var u = o.JSBNG__getSelection();\n                if (!u) {\n                    return;\n                }\n            ;\n            ;\n                if (((s == null))) {\n                    s = p;\n                }\n            ;\n            ;\n                if (((t == null))) {\n                    t = q;\n                }\n            ;\n            ;\n                if (((u.collapse && u.extend))) {\n                    u.collapse(p, q);\n                    u.extend(s, t);\n                }\n                 else {\n                    r = o.JSBNG__document.createRange();\n                    r.setStart(p, q);\n                    r.setEnd(s, t);\n                    if (((((n || !i.hasSelection(o))) || ((((((((r.endContainer === s)) && ((r.endOffset === t)))) && ((r.startContainer === p)))) && ((r.startOffset === q))))))) {\n                        try {\n                            u.removeAllRanges();\n                        } catch (v) {\n                        \n                        };\n                    ;\n                        u.addRange(r);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            i.setSelection = k.bind(i, true);\n            i.trySelection = k.bind(i, false);\n            i.clearSelection = function(n) {\n                try {\n                    var p = n.JSBNG__getSelection();\n                    if (!p) {\n                        return;\n                    }\n                ;\n                ;\n                    p.removeAllRanges();\n                } catch (o) {\n                \n                };\n            ;\n            };\n            i.getText = function(n) {\n                var o = n.JSBNG__getSelection();\n                if (!o) {\n                    return;\n                }\n            ;\n            ;\n                return o.toString();\n            };\n        }\n         else if (g.JSBNG__document.selection) {\n            var l = function(n, o, p) {\n                var q, r, s, t, u;\n                r = n.createElement(\"a\");\n                q = o.duplicate();\n                q.collapse(p);\n                u = q.parentElement();\n                while (true) {\n                    u.insertBefore(r, r.previousSibling);\n                    q.moveToElementText(r);\n                    if (!((((q.compareEndPoints(((p ? \"StartToStart\" : \"StartToEnd\")), o) > 0)) && ((r.previousSibling != null))))) {\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                if (((((q.compareEndPoints(((p ? \"StartToStart\" : \"StartToEnd\")), o) === -1)) && r.nextSibling))) {\n                    q.setEndPoint(((p ? \"EndToStart\" : \"EndToEnd\")), o);\n                    s = r.nextSibling;\n                    t = q.text.length;\n                }\n                 else {\n                    s = r.parentNode;\n                    t = h.getChildIndex(r);\n                }\n            ;\n            ;\n                r.parentNode.removeChild(r);\n                return [s,t,];\n            }, m = function(n, o, p, q, r) {\n                var s, t, u, v, w;\n                w = 0;\n                s = ((h.isText(q) ? q : q.childNodes[r]));\n                t = ((h.isText(q) ? q.parentNode : q));\n                if (h.isText(q)) {\n                    w = r;\n                }\n            ;\n            ;\n                v = n.createElement(\"a\");\n                t.insertBefore(v, ((s || null)));\n                u = n.body.createTextRange();\n                u.moveToElementText(v);\n                v.parentNode.removeChild(v);\n                o.setEndPoint(((p ? \"StartToStart\" : \"EndToEnd\")), u);\n                return o[((p ? \"moveStart\" : \"moveEnd\"))](\"character\", w);\n            };\n            i.supported = true;\n            i.hasSelection = function(n) {\n                var o;\n                if (!n.JSBNG__document.selection) {\n                    return false;\n                }\n            ;\n            ;\n                o = n.JSBNG__document.selection.createRange();\n                return ((o && ((o.parentElement().JSBNG__document === n.JSBNG__document))));\n            };\n            i.getStart = function(n) {\n                var o;\n                if (!i.hasSelection(n)) {\n                    return null;\n                }\n            ;\n            ;\n                o = n.JSBNG__document.selection.createRange();\n                return l(n.JSBNG__document, o, true);\n            };\n            i.getEnd = function(n) {\n                var o;\n                if (!i.hasSelection(n)) {\n                    return null;\n                }\n            ;\n            ;\n                o = n.JSBNG__document.selection.createRange();\n                return l(n.JSBNG__document, o, false);\n            };\n            i.isBidirectional = function(n) {\n                return false;\n            };\n            i.getOrigin = function(n) {\n                return i.getStart(n);\n            };\n            i.getFocus = function(n) {\n                return i.getEnd(n);\n            };\n            var k = function(n, o, p, q, r, s) {\n                if (((r == null))) {\n                    r = p;\n                }\n            ;\n            ;\n                if (((s == null))) {\n                    s = q;\n                }\n            ;\n            ;\n                var t = o.JSBNG__document.body.createTextRange();\n                m(o.JSBNG__document, t, false, r, s);\n                m(o.JSBNG__document, t, true, p, q);\n                return t.select();\n            };\n            i.setSelection = k.bind(i, true);\n            i.trySelection = k.bind(i, false);\n            i.clearSelection = function(n) {\n                return n.JSBNG__document.selection.empty();\n            };\n            i.getText = function(n) {\n                if (!i.hasSelection(n)) {\n                    return null;\n                }\n            ;\n            ;\n                var o = n.JSBNG__document.selection.createRange();\n                return ((o && o.text));\n            };\n        }\n         else i.supported = false;\n        \n    ;\n    ;\n    }).call(this);\n    e.exports = JSBNG__Selection;\n});\n__d(\"StructuredInputSelection\", [\"DOMSelection\",\"Vector\",\"StructuredInputUtil\",\"StructuredInputDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMSelection\"), h = b(\"Vector\"), i = b(\"StructuredInputUtil\"), j = b(\"StructuredInputDOM\");\n    function k(m) {\n        var n = m.ownerDocument;\n        this.window = ((n.defaultView || n.parentWindow));\n        this.root = m;\n        this.selection = false;\n        this.start = new l(this, []);\n        this.end = new l(this, []);\n        this.update();\n    };\n;\n    k.prototype.isSupported = function() {\n        return !!((g && g.hasSelection));\n    };\n    k.prototype.update = function() {\n        this.selection = false;\n        if (((this.isSupported() && ((this.root == JSBNG__document.activeElement))))) {\n            if (g.hasSelection(this.window)) {\n                var m = g.getStart(this.window), n = g.getEnd(this.window), o = g.getFocus(this.window);\n                this.start = this.makeMarker(m);\n                this.end = this.makeMarker(n);\n                this.backward = ((((m[0] == o[0])) && ((m[1] == o[1]))));\n                this.selection = ((this.start.node && this.end.node));\n            }\n        ;\n        }\n    ;\n    ;\n    };\n    k.prototype.makeMarker = function(m) {\n        if (((m[0] === this.root))) {\n            return new l(this, [this.root.childNodes[m[1]],0,]);\n        }\n         else return new l(this, m)\n    ;\n    };\n    k.prototype.getFocus = function() {\n        return ((this.backward ? this.start : this.end));\n    };\n    k.prototype.getOrigin = function() {\n        return ((this.backward ? this.end : this.start));\n    };\n    k.prototype.move = function(m) {\n        if (this.selection) {\n            this.start.move(m);\n            this.start.snap();\n            this.end.setPosition(this.start);\n            return this.apply();\n        }\n    ;\n    ;\n    };\n    k.prototype.expand = function(m) {\n        if (this.selection) {\n            if (g.isBidirectional()) {\n                this.start.move(!m);\n                this.start.snap();\n                this.end.move(m);\n                this.end.snap();\n            }\n        ;\n        ;\n            return this.apply();\n        }\n    ;\n    ;\n    };\n    k.prototype.getText = function() {\n        if (((this.selection && this.isSupported()))) {\n            var m = g.getText(this.window);\n            return m;\n        }\n    ;\n    ;\n    };\n    k.prototype.getOffset = function() {\n        if (this.selection) {\n            return this.start.rootOffset;\n        }\n    ;\n    ;\n    };\n    k.prototype.getLength = function() {\n        return ((this.getText() || \"\")).length;\n    };\n    k.prototype.setPosition = function(m, n) {\n        this.backward = false;\n        this.selection = true;\n        this.start.setPosition(i.getMarkerAtOffset(this.root, m));\n        this.start.snap();\n        if (((n > 0))) {\n            this.end.setPosition(i.getMarkerAtOffset(this.root, ((m + n))));\n            this.end.snap();\n        }\n         else this.end.setPosition(this.start);\n    ;\n    ;\n        return this.apply();\n    };\n    k.prototype.hasRange = function() {\n        return ((this.selection && ((((this.start.node != this.end.node)) || ((this.start.offset != this.end.offset))))));\n    };\n    k.prototype.scrollToFocus = function() {\n        var m = 5, n = this.getFocus();\n        if (n.node) {\n            var o = h.getElementDimensions(this.root).x, p = this.root.scrollLeft, q = ((n.node.offsetLeft + n.node.offsetWidth));\n            if (((((q - p)) < m))) {\n                this.root.scrollLeft = ((q - m));\n            }\n             else if (((((q - p)) > ((o - m))))) {\n                this.root.scrollLeft = ((((q - o)) + m));\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    k.prototype.apply = function() {\n        if (((this.start.hasChanged() || this.end.hasChanged()))) {\n            var m = this.getOrigin().getMarker(true), n = this.getFocus().getMarker(true);\n            this.selection = ((((((((this.selection && m)) && m.node)) && n)) && n.node));\n            if (((this.selection && this.isSupported()))) {\n                this.start.changed = false;\n                this.end.changed = false;\n                g.trySelection(this.window, m.node, m.offset, n.node, n.offset);\n                return true;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    function l(m, n) {\n        this.selection = m;\n        this.node = n[0];\n        this.offset = n[1];\n        this.rootOffset = this.getRootOffset(n[0], n[1]);\n        this.sibling = ((this.node && this.node.previousSibling));\n        this.changed = false;\n    };\n;\n    l.prototype.hasChanged = function() {\n        return ((this.changed || !this.isNodeValid()));\n    };\n    l.prototype.isNodeValid = function() {\n        if (((j.getLength(this.node) > this.offset))) {\n            var m = this.node;\n            while (m = m.parentNode) {\n                if (((m == this.selection.root))) {\n                    return true;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n    };\n    l.prototype.getMarker = function(m) {\n        if (((this.isNodeValid() && ((((m && !this.node.firstChild)) || ((!m && ((this.node.parentNode == this.selection.root))))))))) {\n            return this;\n        }\n         else return j.getMarker(this.selection.root, this.rootOffset, m)\n    ;\n    };\n    l.prototype.move = function(m) {\n        ((this.node && this.setPosition(i.nextMarkerBoundary(this.getMarker(false), m, \"select\"))));\n    };\n    l.prototype.snap = function() {\n        ((this.node && this.setPosition(i.snapMarkerToText(this.getMarker(false), \"select\"))));\n    };\n    l.prototype.setPosition = function(m) {\n        if (((((m.offset != this.offset)) || ((m.node != this.node))))) {\n            this.changed = true;\n            this.node = m.node;\n            this.offset = m.offset;\n            this.rootOffset = this.getRootOffset(this.node, this.offset);\n        }\n    ;\n    ;\n    };\n    l.prototype.getRootOffset = function(m, n) {\n        var o = 0, p = 5;\n        while (((m && ((o++ < p))))) {\n            if (((m === this.selection.root))) {\n                return n;\n            }\n             else {\n                var q = m;\n                while (q = q.previousSibling) {\n                    n += j.getLength(q);\n                ;\n                };\n            ;\n                m = m.parentNode;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n    e.exports = k;\n});\n__d(\"StructuredInput\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"JSBNG__CSS\",\"cx\",\"csx\",\"DataStore\",\"DOM\",\"Input\",\"InputSelection\",\"Keys\",\"Parent\",\"JSBNG__requestAnimationFrame\",\"StructuredInputCleaner\",\"StructuredInputDOM\",\"StructuredInputSelection\",\"StructuredInputUtil\",\"Style\",\"UserAgent\",\"copyProperties\",\"createArrayFrom\",\"createObjectFrom\",\"emptyFunction\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"JSBNG__CSS\"), k = b(\"cx\"), l = b(\"csx\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Input\"), p = b(\"InputSelection\"), q = b(\"Keys\"), r = b(\"Parent\"), s = b(\"JSBNG__requestAnimationFrame\"), t = b(\"StructuredInputCleaner\"), u = b(\"StructuredInputDOM\"), v = b(\"StructuredInputSelection\"), w = b(\"StructuredInputUtil\"), x = b(\"Style\"), y = b(\"UserAgent\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"createObjectFrom\"), ca = b(\"emptyFunction\"), da = 229, ea = ba([q.UP,q.DOWN,q.LEFT,q.RIGHT,]), fa = ba([q.BACKSPACE,q.DELETE,]), ga = ba([q.SPACE,q.RETURN,]), ha = ba(\"IUB\".split(\"\").map(function(qa) {\n        return qa.charCodeAt(0);\n    })), ia = y.firefox(), ja = y.ie(), ka = y.webkit(), la = b(\"mixin\"), ma = la(i);\n    {\n        var fin211keys = ((window.top.JSBNG_Replay.forInKeys)((ma))), fin211i = (0);\n        var na;\n        for (; (fin211i < fin211keys.length); (fin211i++)) {\n            ((na) = (fin211keys[fin211i]));\n            {\n                if (((ma.hasOwnProperty(na) && ((na !== \"_metaprototype\"))))) {\n                    pa[na] = ma[na];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var oa = ((((ma === null)) ? null : ma.prototype));\n    pa.prototype = Object.create(oa);\n    pa.prototype.constructor = pa;\n    pa.__superConstructor__ = ma;\n    function pa(qa) {\n        m.set(qa, \"StructuredInput\", this);\n        this._root = qa;\n        this._richInput = n.JSBNG__find(qa, \".-cx-PUBLIC-uiStructuredInput__rich\");\n        this._textInput = n.JSBNG__find(qa, \".-cx-PUBLIC-uiStructuredInput__text\");\n        this._placeholderText = n.scry(qa, \".-cx-PUBLIC-uiStructuredInput__placeholder\")[0];\n        this._hintText = n.JSBNG__find(qa, \".-cx-PUBLIC-uiStructuredInput__hint\");\n        this._contentWidth = null;\n        this._richWidth = null;\n        this._hintNodes = [];\n        this.init();\n    };\n;\n    pa.prototype.init = function() {\n        this.init = ca;\n        this._initSelection();\n        this._initCleaner();\n        this._initInputs();\n        this._initEvents();\n        this._scheduledCleanInput = false;\n        this._richChanged = false;\n        this._textChanged = false;\n        this._selectionChanged = false;\n        this._selectionIgnore = false;\n        this._imeMode = false;\n        this.cleanInput();\n        this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n    };\n    pa.prototype._initInputs = function() {\n        this._richInput.contentEditable = true;\n        this._richInput.spellcheck = false;\n        this._richInput.tabIndex = 0;\n        this._textInput.tabIndex = -1;\n        this._multiline = ((this._textInput.nodeName == \"TEXTAREA\"));\n        if (!j.shown(this._richInput)) {\n            var qa = p.get(this._textInput);\n            n.setContent(this._richInput, u.encodeText(o.getValue(this._textInput)));\n            j.hide(this._textInput);\n            j.show(this._richInput);\n            this.cleanInput();\n            this.setSelection({\n                offset: qa.start,\n                length: ((qa.end - qa.start))\n            });\n        }\n    ;\n    ;\n        this.togglePlaceholder();\n        this._toggleHint();\n    };\n    pa.prototype._initEvents = function() {\n        var qa = null;\n        g.listen(this._richInput, \"keydown\", function(ra) {\n            qa = ra.keyCode;\n            if (((ra.ctrlKey && ((ra.keyCode in ha))))) {\n                return ra.kill();\n            }\n             else if (((ra.keyCode in ea))) {\n                this._selectionChanged = true;\n                this.scheduleCleanInput(false);\n            }\n             else if (((ra.keyCode in fa))) {\n                this._richChanged = true;\n                this.scheduleCleanInput(true);\n                if (((ra.keyCode === q.BACKSPACE))) {\n                    if (this._deleteTrailingChunk()) {\n                        return ra.kill();\n                    }\n                ;\n                }\n            ;\n            ;\n            }\n             else if (((ra.keyCode == da))) {\n                this._imeMode = true;\n                j.hide(this._placeholderText);\n            }\n            \n            \n            \n        ;\n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"keyup\", function(ra) {\n            if (((((this._imeMode || ((ra.keyCode != qa)))) && ((ra.keyCode in ga))))) {\n                this._imeMode = false;\n                this._richChanged = true;\n                this.scheduleCleanInput();\n                return ra.kill();\n            }\n             else if (this._imeMode) {\n                this._textChanged = true;\n                this.cleanInput();\n            }\n            \n        ;\n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"keypress\", function(ra) {\n            if (((ra.keyCode == q.RETURN))) {\n                ((this._multiline && this._insertText(\"\\u000a\")));\n                return ra.kill();\n            }\n             else if (((!this._selectionChanged && this._selectionIsText()))) {\n                this._textChanged = true;\n                this.scheduleCleanInput(false);\n            }\n             else {\n                this._richChanged = true;\n                this.scheduleCleanInput(true);\n            }\n            \n        ;\n        ;\n        }.bind(this));\n        g.listen(JSBNG__document, \"selectionchange\", function() {\n            if (this._selectionIgnore) {\n                this._selectionIgnore = false;\n            }\n             else this._selectionChanged = true;\n        ;\n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"mousedown\", function() {\n            this._selectionChanged = true;\n            this._selectionLength = 0;\n            this._selectionOffset = 0;\n        }.bind(this));\n        g.listen(this._richInput, \"mouseup\", function() {\n            this._selectionChanged = true;\n            s(this.cleanInput.bind(this));\n        }.bind(this));\n        g.listen(this._richInput, \"cut\", function() {\n            this._richChanged = true;\n            this.scheduleCleanInput(false);\n        }.bind(this));\n        g.listen(this._richInput, \"paste\", function(ra) {\n            if (this._insertClipboard(((((ra && ra.JSBNG__clipboardData)) || window.JSBNG__clipboardData)))) {\n                return ra.kill();\n            }\n             else {\n                this._richChanged = true;\n                this.scheduleCleanInput(true);\n            }\n        ;\n        ;\n        }.bind(this));\n        g.listen(this._richInput, \"drop\", function(ra) {\n            this.JSBNG__focus();\n            this.selectAll();\n            this._insertClipboard(((ra && ra.dataTransfer)));\n            return ra.kill();\n        }.bind(this));\n        g.listen(this._richInput, \"dragover\", function(ra) {\n            ra.dataTransfer.dropEffect = \"move\";\n            ra.dataTransfer.effectAllowed = \"move\";\n            return ra.kill();\n        });\n        g.listen(this._richInput, \"JSBNG__focus\", function(ra) {\n            this._toggleHint();\n            this.inform(\"JSBNG__focus\");\n        }.bind(this));\n        g.listen(this._richInput, \"JSBNG__blur\", function(ra) {\n            j.hide(this._hintText);\n            this._imeMode = false;\n            this._richChanged = true;\n            this.scheduleCleanInput(false);\n            this.inform(\"JSBNG__blur\");\n        }.bind(this));\n    };\n    pa.prototype._initCleaner = function() {\n        this._cleaner = new t(this._richInput, true);\n    };\n    pa.prototype._initSelection = function() {\n        this._selection = new v(this._richInput);\n        this._selectionLength = 0;\n        this._selectionOffset = 0;\n    };\n    pa.prototype._insertClipboard = function(qa) {\n        if (((qa && qa.getData))) {\n            var ra = ((qa.types && aa(qa.types)));\n            if (!ra) {\n                this._insertText(qa.getData(\"JSBNG__Text\"));\n            }\n             else if (((ra.indexOf(\"text/html\") != -1))) {\n                this._insertHTML(qa.getData(\"text/html\"));\n            }\n             else if (((ra.indexOf(\"text/plain\") != -1))) {\n                this._insertText(qa.getData(\"text/plain\"));\n            }\n            \n            \n        ;\n        ;\n            return true;\n        }\n         else return false\n    ;\n    };\n    pa.prototype._deleteTrailingChunk = function(qa) {\n        var ra = this.JSBNG__getSelection();\n        if (((((ra.length > 0)) || ((ra.offset === 0))))) {\n            return false;\n        }\n    ;\n    ;\n        var sa = ((this.JSBNG__getSelection().offset - 1)), ta = w.getMarkerAtOffset(this._richInput, sa);\n        if (((((ta && u.isEntityNode(ta.node))) && ((w.getGrouping(ta.node, \"select\") !== \"none\"))))) {\n            n.remove(ta.node);\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n    pa.prototype._selectionIsText = function() {\n        var qa = this._selection.start.node, ra = this._selection.end.node;\n        return ((((((qa && ((qa === ra)))) && !u.isEntityNode(qa))) && !u.isEntityNode(qa.parentNode)));\n    };\n    pa.prototype._insertText = function(qa) {\n        if (qa) {\n            var ra = n.create(\"div\", {\n            }, qa);\n            return this._insertNodes(ra);\n        }\n    ;\n    ;\n    };\n    pa.prototype._insertNodes = function(qa) {\n        if (JSBNG__document.selection) {\n            JSBNG__document.selection.createRange().pasteHTML(qa.innerHTML);\n        }\n         else JSBNG__document.execCommand(\"insertHTML\", false, qa.innerHTML);\n    ;\n    ;\n        this._richChanged = true;\n        this.cleanInput();\n    };\n    pa.prototype.togglePlaceholder = function(qa) {\n        if (!this._placeholderText) {\n            return;\n        }\n    ;\n    ;\n        var ra = ((u.getLength(this._richInput) === 0));\n        if (((qa && ra))) {\n            j.show(this._placeholderText);\n        }\n         else j.conditionShow(this._placeholderText, ((ra && !this._imeMode)));\n    ;\n    ;\n    };\n    pa.prototype._toggleHint = function() {\n        var qa = aa(this._hintNodes), ra = null, sa = \"\", ta = u.getText(this._richInput).toLowerCase();\n        if (!this.hasFocus()) {\n            return;\n        }\n    ;\n    ;\n        if (this._contentOverflows()) {\n            j.hide(this._hintText);\n            return;\n        }\n    ;\n    ;\n        while (((qa.length && ((sa.length < ta.length))))) {\n            ra = qa.shift();\n            sa += u.getText(ra);\n        };\n    ;\n        if (((ta.length && ((sa.substr(0, ta.length).toLowerCase() == ta.toLowerCase()))))) {\n            n.setContent(this._hintText, aa(this._richInput.cloneNode(true).childNodes));\n            var ua = u.createTextNode(sa.substr(ta.length));\n            qa.unshift(ua);\n            n.appendContent(this._hintText, n.create(\"span\", {\n                className: \"-cx-PUBLIC-uiStructuredInput__hintsuffix\"\n            }, qa));\n            j.show(this._hintText);\n            j.hide(this._placeholderText);\n        }\n         else j.hide(this._hintText);\n    ;\n    ;\n    };\n    pa.prototype._contentOverflows = function() {\n        if (((this._richWidth === null))) {\n            this._richWidth = this._richInput.clientWidth;\n        }\n    ;\n    ;\n        if (((this._contentWidth === null))) {\n            var qa = this._richInput.lastChild;\n            this._contentWidth = ((n.isElementNode(qa) ? ((qa.offsetLeft + qa.offsetWidth)) : 0));\n        }\n    ;\n    ;\n        return ((this._contentWidth > this._richWidth));\n    };\n    pa.prototype._forceTop = function() {\n        if (!this._multiline) {\n            this._richInput.scrollTop = 0;\n        }\n    ;\n    ;\n        this._root.scrollTop = 0;\n    };\n    pa.prototype._createStructureNodes = function(qa) {\n        return qa.map(function(ra) {\n            return ((((ra.uid || ((ra.type && ((ra.type != \"text\")))))) ? u.createEntityNode(ra, ((ra.display || {\n            }))) : u.createTextNode(ra.text)));\n        }.bind(this));\n    };\n    pa.prototype._suppressInput = function() {\n        if (((ia || ja))) {\n            if (this._richClean) {\n                return;\n            }\n        ;\n        ;\n            this._richClean = this._richInput.cloneNode(true);\n            this._richClean.contentEditable = false;\n            this._root.insertBefore(this._richClean, this._richInput.nextSibling);\n            this._richClean.scrollLeft = this._richInput.scrollLeft;\n            x.set(this._richInput, \"padding\", 0);\n            x.set(this._richInput, \"height\", 0);\n        }\n    ;\n    ;\n    };\n    pa.prototype._revealInput = function() {\n        if (!this._richClean) {\n            return;\n        }\n    ;\n    ;\n        x.set(this._richInput, \"height\", \"\");\n        x.set(this._richInput, \"padding\", \"\");\n        this._root.removeChild(this._richClean);\n        this.JSBNG__focus();\n        this._richClean = null;\n    };\n    pa.prototype._cleanInput = function() {\n        var qa;\n        if (((this._textChanged && !this._richChanged))) {\n            this._selection.update();\n            qa = \"change\";\n        }\n         else if (((this._richChanged || this._selectionChanged))) {\n            this._selection.update();\n            if (this._richChanged) {\n                this._contentWidth = null;\n                this._cleaner.clean();\n                this._cleaner.endOnText();\n                this._selection.apply();\n                qa = \"change\";\n            }\n        ;\n        ;\n            if (this._selectionChanged) {\n                this._cleanSelection();\n                if (((this._selectionLength || !this._richChanged))) {\n                    qa = \"select\";\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        this._revealInput();\n        this._forceTop();\n        if (((this._richChanged || this._textChanged))) {\n            this.togglePlaceholder();\n            this._toggleHint();\n        }\n    ;\n    ;\n        this._selectionIgnore = true;\n        this._selectionChanged = false;\n        this._richChanged = false;\n        this._textChanged = false;\n        ((qa && this.inform(qa)));\n    };\n    pa.prototype._cleanSelection = function() {\n        var qa = this._selection.getLength(), ra = this._selection.getOffset();\n        if (qa) {\n            this._selection.expand(((qa >= this._selectionLength)));\n            qa = this._selection.getLength();\n            ra = this._selection.getOffset();\n        }\n    ;\n    ;\n        this._selectionLength = qa;\n        this._selectionOffset = ra;\n    };\n    pa.prototype.cleanInput = function() {\n        ((this._scheduledCleanInput || this._cleanInput()));\n    };\n    pa.prototype.scheduleCleanInput = function(qa) {\n        ((qa && this._suppressInput()));\n        if (!this._scheduledCleanInput) {\n            this._scheduledCleanInput = true;\n            s(function() {\n                this._cleanInput();\n                this._scheduledCleanInput = false;\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n    pa.prototype.setEnabled = function(qa) {\n        this._textInput.disabled = !qa;\n        this._richInput.contentEditable = qa;\n    };\n    pa.prototype.getRoot = function() {\n        return this._root;\n    };\n    pa.prototype.getRichInput = function() {\n        return this._richInput;\n    };\n    pa.prototype.getEnabled = function() {\n        return !this._textInput.disabled;\n    };\n    pa.prototype.getText = function() {\n        return u.getDecodedText(this._richInput);\n    };\n    pa.prototype.setText = function(qa) {\n        n.setContent(this._richInput, u.createTextNode(qa));\n        this._richChanged = false;\n        this._selectionChanged = false;\n        this.inform(\"change\");\n    };\n    pa.prototype.setHint = function(qa) {\n        this._hintNodes = this._createStructureNodes(qa);\n        this._toggleHint();\n    };\n    pa.prototype.getStructure = function() {\n        var qa = [];\n        aa(this._richInput.childNodes).forEach(function(ra) {\n            var sa = !n.isTextNode(ra), ta = u.getDecodedText(ra);\n            ((ta.length && qa.push({\n                text: ta,\n                uid: ((sa ? ra.getAttribute(\"data-uid\") : null)),\n                type: ((((sa && ra.getAttribute(\"data-type\"))) || \"text\"))\n            })));\n        }.bind(this));\n        return qa;\n    };\n    pa.prototype.setStructure = function(qa) {\n        n.setContent(this._richInput, this._createStructureNodes(qa));\n        this._cleaner.endOnText();\n        this._cleaner.clean();\n        this.togglePlaceholder();\n        this._toggleHint();\n        this._richChanged = false;\n        this._selectionChanged = false;\n        this.inform(\"change\");\n    };\n    pa.prototype.getContentDimensions = function() {\n        var qa = this._richInput.lastChild;\n        return {\n            width: ((qa ? ((qa.offsetLeft + qa.offsetWidth)) : 0)),\n            height: ((qa ? ((qa.offsetTop + qa.offsetHeight)) : 0))\n        };\n    };\n    pa.prototype.JSBNG__getSelection = function() {\n        return {\n            offset: this._selection.getOffset(),\n            length: this._selection.getLength()\n        };\n    };\n    pa.prototype.setSelection = function(qa) {\n        if (this.hasFocus()) {\n            this._selection.update();\n            this._selection.setPosition(qa.offset, qa.length);\n            this._selection.scrollToFocus();\n            this._selectionChanged = false;\n            this.inform(\"select\");\n        }\n    ;\n    ;\n    };\n    pa.prototype.moveSelectionToEnd = function() {\n        this.setSelection({\n            length: 0,\n            offset: u.getLength(this._richInput)\n        });\n    };\n    pa.prototype.isSelectionAtEnd = function() {\n        var qa = this.JSBNG__getSelection().offset, ra = u.getLength(this._richInput);\n        return ((qa >= ra));\n    };\n    pa.prototype.selectAll = function() {\n        this.setSelection({\n            offset: 0,\n            length: u.getLength(this._richInput)\n        });\n    };\n    pa.prototype.hasFocus = function() {\n        return n.contains(this._root, JSBNG__document.activeElement);\n    };\n    pa.prototype.JSBNG__focus = function() {\n        this._richInput.JSBNG__focus();\n    };\n    pa.prototype.JSBNG__blur = function() {\n        var qa = n.create(\"input\", {\n            type: \"text\",\n            tabIndex: -1,\n            style: {\n                position: \"absolute\",\n                JSBNG__top: 0,\n                left: \"-100px\",\n                width: \"1px\",\n                height: \"1px\"\n            }\n        });\n        n.appendContent(this._root, qa);\n        var ra = function() {\n            if (((this.hasFocus() || ((ka && ((JSBNG__document.activeElement === JSBNG__document.body))))))) {\n                qa.JSBNG__focus();\n                qa.JSBNG__blur();\n            }\n        ;\n        ;\n        };\n        this.JSBNG__blur = ra;\n        this.JSBNG__blur();\n    };\n    pa.getInstance = function(qa) {\n        var ra = r.byClass(qa, \"-cx-PRIVATE-uiStructuredInput__root\");\n        return ((ra ? m.get(ra, \"StructuredInput\") : null));\n    };\n    z(pa.prototype, {\n        _insertHTML: (function() {\n            var qa = n.create(\"div\"), ra = new t(qa, false);\n            return function(sa) {\n                if (sa) {\n                    qa.innerHTML = sa;\n                    ra.clean();\n                    return this._insertNodes(qa);\n                }\n            ;\n            ;\n            };\n        })()\n    });\n    e.exports = pa;\n});\n__d(\"FacebarTypeaheadWebSearch\", [\"startsWith\",\"FacebarStructuredFragment\",\"FacebarStructuredText\",], function(a, b, c, d, e, f) {\n    var g = b(\"startsWith\"), h = b(\"FacebarStructuredFragment\"), i = b(\"FacebarStructuredText\"), j = new h({\n        type: \"ent:websuggestion\",\n        text: \"Web Search: \",\n        uid: null\n    }), k = j.getText().toLowerCase().trim();\n    function l(o, p) {\n        if (((!o || ((o.type !== \"websuggestion\"))))) {\n            return;\n        }\n    ;\n    ;\n        var q = p.getValue().toArray();\n        q.forEach(function(r) {\n            if (((((r.isType(\"ent\") && !r.isType(\"ent\", \"user\"))) && r.getUID()))) {\n                if (o.extra_uri_params) {\n                    o.extra_uri_params.qh = r.getUID();\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n        });\n    };\n;\n    function m(o) {\n        return ((o.getType() === j.getType()));\n    };\n;\n    function n(o) {\n        this._core = o.getCore();\n        this._view = o.getView();\n        this._input = this._core.input;\n        this._isEnabled = false;\n    };\n;\n    n.prototype.enable = function() {\n        this._isEnabled = true;\n        this.changeListener = this._input.subscribe(\"change\", this._changeWebSearch.bind(this));\n        this.lockListener = this._input.subscribe(\"shortcut\", this._lockWebSearch.bind(this));\n        this.beforeSelectListener = this._view.subscribe(\"beforeSelect\", this._beforeSelect.bind(this));\n        this.beforeRenderListener = this._view.subscribe(\"beforeRender\", this._beforeRender.bind(this));\n    };\n    n.prototype._changeWebSearch = function() {\n        var o = this._input.getValue(), p = o.toArray(), q = p[0];\n        if (((q && ((q.getType() === \"text\"))))) {\n            if (g(q.getText().toLowerCase(), k)) {\n                p.splice(0, 1, j, new h({\n                    text: q.getText().substr(k.length).replace(/^ /, \"\")\n                }));\n                this._replaceFragments(p);\n            }\n             else if (((((p.length > 1)) && p.some(m)))) {\n                this._replaceFragments([new h({\n                    text: o.toString()\n                }),]);\n            }\n            \n        ;\n        }\n    ;\n    ;\n    };\n    n.prototype._replaceFragments = function(o) {\n        this._input.storeSelection();\n        this._input.setValue(new i(o));\n        this._input.restoreSelection();\n    };\n    n.prototype._beforeSelect = function(o, p) {\n        l(p.selected, this._input);\n        return true;\n    };\n    n.prototype._beforeRender = function(o, p) {\n        var q = this._input.getValue().toArray()[0], r = ((q && m(q)));\n        p.results.forEach(function(s) {\n            if (((s.type === \"websuggestion\"))) {\n                s.isLockedWebSearchMode = r;\n            }\n        ;\n        ;\n        });\n        return true;\n    };\n    n.prototype._lockWebSearch = function(o, p) {\n        if (p.shift) {\n            var q = this._input.getValue().toArray()[0];\n            if (((!q || !m(q)))) {\n                this._input.setValue(new i([j,]));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    n.prototype.disable = function() {\n        this.beforeSelectListener.unsubscribe();\n        this.changeListener.unsubscribe();\n        this.lockListener.unsubscribe();\n        this.beforeRenderListener.unsubscribe();\n        this._isEnabled = false;\n    };\n    n.addPrefix = function(o) {\n        if (!m(o.getFragment(0))) {\n            var p = [j,].concat(o.toArray());\n            return new i(p);\n        }\n         else return o\n    ;\n    };\n    e.exports = n;\n});\n__d(\"FacebarTypeaheadCore\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"Animation\",\"arrayContains\",\"Base64\",\"copyProperties\",\"csx\",\"JSBNG__CSS\",\"DOM\",\"FacebarStructuredText\",\"FacebarTypeaheadInput\",\"FacebarTypeaheadWebSearch\",\"invariant\",\"Keys\",\"startsWith\",\"Style\",\"URI\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Animation\"), k = b(\"arrayContains\"), l = b(\"Base64\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"JSBNG__CSS\"), p = b(\"DOM\"), q = b(\"FacebarStructuredText\"), r = b(\"FacebarTypeaheadInput\"), s = b(\"FacebarTypeaheadWebSearch\"), t = b(\"invariant\"), u = b(\"Keys\"), v = b(\"startsWith\"), w = b(\"Style\"), x = b(\"URI\"), y = b(\"mixin\"), z = y(i);\n    {\n        var fin212keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin212i = (0);\n        var aa;\n        for (; (fin212i < fin212keys.length); (fin212i++)) {\n            ((aa) = (fin212keys[fin212i]));\n            {\n                if (((z.hasOwnProperty(aa) && ((aa !== \"_metaprototype\"))))) {\n                    ca[aa] = z[aa];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var ba = ((((z === null)) ? null : z.prototype));\n    ca.prototype = Object.create(ba);\n    ca.prototype.constructor = ca;\n    ca.__superConstructor__ = z;\n    function ca(da) {\n        m(this, da);\n    };\n;\n    ca.prototype.init = function(da, ea, fa) {\n        this.init = function() {\n        \n        };\n        this.data = da;\n        this.view = ea;\n        this.root = fa;\n        this.windowFocused = true;\n        this.isFocused = false;\n        this.keepOpen = false;\n        this.hoverAnimation = null;\n        this.stickyQuery = null;\n        this.settedQuery = null;\n        this.selectedQuery = null;\n        this.currentQuery = null;\n        this._prefillTextInInputField = this.data.allowGrammar();\n        this._webSearchLockedInMode = this.data.isWebSearchLockedInModeEnabled();\n        this.initSubcomponents();\n        this.initEvents();\n        this.checkValue();\n    };\n    ca.prototype.initSubcomponents = function() {\n        var da = p.JSBNG__find(this.root, \".-cx-PUBLIC-fbFacebar__input\");\n        this.input = new r(da);\n        this.view.setInputElement(this.input.getRawInputElement());\n    };\n    ca.prototype.initEvents = function() {\n        g.listen(this.root, \"keydown\", this.keydown.bind(this));\n        g.listen(this.root.parentNode, \"mousedown\", this.mousedown.bind(this));\n        g.listen(this.view.getElement(), \"mousedown\", this.mousedown.bind(this));\n        g.listen(JSBNG__document.body, \"mouseup\", this.mouseup.bind(this));\n        g.listen(window, \"JSBNG__focus\", this.focusWindow.bind(this));\n        g.listen(window, \"JSBNG__blur\", this.blurWindow.bind(this));\n        this.view.subscribe(\"select\", this.selectView.bind(this));\n        this.view.subscribe(\"highlight\", this.highlightView.bind(this));\n        this.view.subscribe(\"render\", this.highlightView.bind(this));\n        this.view.subscribe(\"hideHelp\", this.performQuery.bind(this));\n        this.input.subscribe(\"JSBNG__focus\", this.focusInput.bind(this));\n        this.input.subscribe(\"JSBNG__blur\", this.blurInput.bind(this));\n        this.input.subscribe(\"change\", this.changeInput.bind(this));\n        this.data.subscribe(\"activity\", this.typeaheadActivity.bind(this));\n        this.data.subscribe(\"respond\", this.completeData.bind(this));\n        this.data.subscribe(\"ready\", this.typeaheadReady.bind(this));\n        this.initFocus.bind(this).defer();\n    };\n    ca.prototype.initFocus = function() {\n        if (p.contains(this.input.root, JSBNG__document.activeElement)) {\n            this.isFocused = true;\n            this._newSession();\n            this.open();\n        }\n    ;\n    ;\n    };\n    ca.prototype.cleanQuery = function(da) {\n        da = ((m({\n        }, da) || {\n        }));\n        if (!da.structure) {\n            da.structure = new q();\n        }\n    ;\n    ;\n        if (!this._prefillTextInInputField) {\n            da.structure = q.fromString(da.structure.toString());\n        }\n    ;\n    ;\n        t(((da.structure instanceof q)));\n        if (((((((da.type == \"websuggestion\")) && this._prefillTextInInputField)) && this._webSearchLockedInMode))) {\n            da.structure = s.addPrefix(da.structure);\n        }\n    ;\n    ;\n        return da;\n    };\n    ca.prototype.setPageQuery = function(da) {\n        da = this.cleanQuery(da);\n        var ea = this.input.getValue(), fa = da.structure, ga = ((!fa.isEmptyOrWhitespace() && ((ea.isEmptyOrWhitespace() || ((ea.toString().trim() == fa.toString().trim()))))));\n        return this.selectQuery(da, ga);\n    };\n    ca.prototype.selectQuery = function(da, ea) {\n        ea = ((ea !== false));\n        da = this.cleanQuery(da);\n        if (((ea || !this.selectedQuery))) {\n            if (((ea || this.getValue().isEmptyOrWhitespace()))) {\n                this.setQuery(da);\n            }\n        ;\n        ;\n            this.selectedQuery = da;\n        }\n    ;\n    ;\n        return da;\n    };\n    ca.prototype.completeSelection = function() {\n        var da = this.view.JSBNG__getSelection();\n        if (((da && !da.search))) {\n            this.data.saveResult(da);\n            this.setQuery(da);\n            return true;\n        }\n    ;\n    ;\n    };\n    ca.prototype.setQuery = function(da, ea) {\n        da = this.cleanQuery(da);\n        this.input.setValue(da.structure);\n        this.settedQuery = da;\n        this.stickyQuery = ((((ea === false)) ? this.stickyQuery : da));\n        this.checkValue();\n    };\n    ca.prototype.checkValue = function() {\n        if (((((!this.view.visible || !this.dataSourceReady)) || ((this.value && ((this.value.getHash() == this.input.getValue().getHash()))))))) {\n            return;\n        }\n    ;\n    ;\n        this.value = this.nextQuery = this.getValue();\n        this.performQuery();\n    };\n    ca.prototype.performQuery = function() {\n        this.data.query(this.nextQuery);\n        this.currentQuery = this.nextQuery;\n    };\n    ca.prototype.expandView = function() {\n        this.data.query(this.currentQuery, false, [], true);\n        this.input.restoreSelection();\n    };\n    ca.prototype.collapseView = function() {\n        this.requery();\n    };\n    ca.prototype.requery = function() {\n        if (this.currentQuery) {\n            this.data.query(this.currentQuery);\n        }\n    ;\n    ;\n    };\n    ca.prototype.executeQuery = function(da) {\n        da = this.cleanQuery(da);\n        var ea = this.inform(\"execute\", da), fa = this.getSessionID();\n        this.close();\n        if (this._prefillTextInInputField) {\n            this.selectQuery(da);\n        }\n         else this.selectQuery();\n    ;\n    ;\n        if (!ea) {\n            this._navigateToQuery(da, fa);\n        }\n    ;\n    ;\n    };\n    ca.prototype.getSearchType = function() {\n        return \"facebar\";\n    };\n    ca.prototype._newSession = function() {\n        this._sessionID = Math.JSBNG__random().toString();\n        this.inform(\"session\", this._sessionID, h.BEHAVIOR_STATE);\n    };\n    ca.prototype._closeSession = function() {\n        this.inform(\"session\", null, h.BEHAVIOR_STATE);\n    };\n    ca.prototype.getSessionID = function() {\n        return this._sessionID;\n    };\n    ca.prototype._navigateToQuery = function(da, ea) {\n        var fa = this.data.facebarConfig;\n        if (da.uri) {\n            da.uri.addQueryData(da.extra_uri_params);\n            da.uri.addQueryData({\n                ref: \"br_tf\"\n            });\n            if (((da.structure && ((((da.type == \"websuggestion\")) || ((((da.type == \"grammar\")) && ((!fa || v(da.uri.getPath(), fa.search_path)))))))))) {\n                var ga = this.data.getRawStructure(da.structure).text_form, ha = l.encode(ga).replace(/\\=+$/, \"\"), ia = {\n                    sid: ea,\n                    qs: ha,\n                    gv: this.data.getQueryData().grammar_version\n                }, ja = l.encode(JSON.stringify(ia)).replace(/\\=+$/, \"\");\n                da.uri.addQueryData({\n                    ref: ja\n                });\n            }\n        ;\n        ;\n            da.uri.go();\n            return;\n        }\n    ;\n    ;\n    };\n    ca.prototype.reset = function() {\n        this.selectQuery();\n        this.inform(\"reset\");\n    };\n    ca.prototype.animateInputValue = function(da, ea, fa) {\n        ((this.hoverAnimation && this.hoverAnimation.JSBNG__stop()));\n        var ga = new j(ea).from(\"opacity\", 1).to(\"opacity\", 0).duration(150).ondone(function() {\n            this.input.setValue(fa);\n            this.hoverAnimation = ha.go();\n        }.bind(this)), ha = new j(da).from(\"opacity\", 0).to(\"opacity\", 1).duration(150).ondone(function() {\n            this.hoverAnimation = null;\n            w.set(ea, \"opacity\", \"\");\n            w.set(da, \"opacity\", \"\");\n        }.bind(this));\n        w.set(da, \"opacity\", 0);\n        this.hoverAnimation = ga.go();\n    };\n    ca.prototype.open = function() {\n        o.addClass(JSBNG__document.body, \"facebarOpened\");\n        this.inform(\"open\");\n        this.view.show();\n        this.input.JSBNG__focus();\n        this.checkValue();\n        if (!this.isFocused) {\n            this.isFocused = true;\n            this._newSession();\n            this.inform(\"JSBNG__focus\");\n        }\n    ;\n    ;\n    };\n    ca.prototype.close = function() {\n        this._closeSession();\n        if (((this.inform(\"close\") === false))) {\n            return;\n        }\n    ;\n    ;\n        if (((((!this.value || this.value.isEmptyOrWhitespace())) && this.selectedQuery))) {\n            this.input.setValue(this.selectedQuery.structure);\n        }\n         else if (this.stickyQuery) {\n            this.input.setValue(this.stickyQuery.structure);\n        }\n        \n    ;\n    ;\n        this.input.JSBNG__blur();\n        this.view.hide();\n        this.view.setAutoSelect(false);\n        this.inform(\"session\", null, h.BEHAVIOR_STATE);\n        if (this.isFocused) {\n            o.addClass(JSBNG__document.body, \"facebarClosing\");\n            o.removeClass(JSBNG__document.body, \"facebarOpened\");\n            o.removeClass.curry(JSBNG__document.body, \"facebarClosing\").defer(355);\n            this.isFocused = false;\n            this.inform.bind(this, \"JSBNG__blur\").defer();\n        }\n    ;\n    ;\n    };\n    ca.prototype.getElement = function() {\n        return this.root;\n    };\n    ca.prototype.getValue = function() {\n        return this.input.getValue();\n    };\n    ca.prototype.getText = function() {\n        return this.getValue().toString();\n    };\n    ca.prototype.keydown = function(JSBNG__event) {\n        var da = true, ea = g.getKeyCode(JSBNG__event);\n        switch (ea) {\n          case u.ESC:\n            this.close();\n            break;\n          case u.RIGHT:\n            da = ((this.input.isSelectionAtEnd() && this.completeSelection()));\n            break;\n          case u.TAB:\n            if (((JSBNG__event.getModifiers().shift || ((!this.completeSelection() && !this.loading))))) {\n                this.view.setAutoSelect(false);\n                this.view.hide();\n                da = false;\n            }\n        ;\n        ;\n            break;\n          case u.UP:\n            this.view.prev();\n            break;\n          case u.DOWN:\n            this.view.next();\n            break;\n          case u.RETURN:\n            this.view.select();\n            break;\n          case u.PAGE_UP:\n            this.view.first();\n            break;\n          default:\n            if (((((ea >= \"0\".charCodeAt(0))) && ((ea <= \"z\".charCodeAt(0)))))) {\n                this.view.setAutoSelect(true);\n            }\n        ;\n        ;\n            this.stickyQuery = null;\n            da = false;\n            break;\n        };\n    ;\n        this.input.storeSelection();\n        if (da) {\n            return JSBNG__event.kill();\n        }\n    ;\n    ;\n    };\n    ca.prototype.mousedown = function() {\n        this.view.setAutoSelect(true);\n        this.input.storeSelection();\n        this.keepOpen = true;\n    };\n    ca.prototype.mouseup = function(da) {\n        if (this.keepOpen) {\n            this.open();\n        }\n    ;\n    ;\n        this.keepOpen = false;\n    };\n    ca.prototype.focusWindow = function() {\n        this.windowFocused = true;\n    };\n    ca.prototype.blurWindow = function() {\n        this.windowFocused = false;\n    };\n    ca.prototype.selectView = function(da, ea) {\n        if (((!ea || !ea.selected))) {\n            return;\n        }\n    ;\n    ;\n        ea.selected.see_more = this.data.isSeeMore();\n        this.inform(\"select\", ea);\n        var fa = this.cleanQuery(ea.selected);\n        this.executeQuery(fa);\n    };\n    ca.prototype.highlightView = function() {\n        var da = this.view.JSBNG__getSelection();\n        ((da && this.input.setHint(da.structure)));\n    };\n    ca.prototype.blurInput = function() {\n        JSBNG__setTimeout((function() {\n            if (((this.windowFocused || ((x.getRequestURI().getSubdomain() == \"apps\"))))) {\n                this.input.togglePlaceholder();\n                if (!this.keepOpen) {\n                    this.close();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }).bind(this), 0);\n    };\n    ca.prototype.changeInput = function() {\n        this.inform(\"change\");\n        this.checkValue();\n        this.inform(\"change_end\");\n    };\n    ca.prototype.focusInput = function() {\n        this.open();\n        this.input.togglePlaceholder(false);\n    };\n    ca.prototype.typeaheadReady = function() {\n        this.dataSourceReady = true;\n        this.checkValue();\n    };\n    ca.prototype.updateData = function() {\n        this.view.setLoading(this.loading);\n    };\n    ca.prototype.completeData = function(da, ea) {\n        if (((ea.forceDisplay || ((this.value && this.value.matches(ea.value)))))) {\n            this.view.render(ea.value, ea.results, ea.isAsync, ((((ea.results.length === 0)) && ea.isEmptyResults)), ea.isScrollable);\n        }\n    ;\n    ;\n    };\n    ca.prototype.typeaheadActivity = function(da, ea) {\n        this.fetching = ea.activity;\n        if (((this.loading != this.fetching))) {\n            this.loading = this.fetching;\n            this.updateData();\n        }\n    ;\n    ;\n    };\n    ca.prototype.getNameTextFromSelected = function() {\n        var da = ((this.settedQuery && this.settedQuery.semantic)), ea = ((this.data.facebarConfig && this.data.facebarConfig.name_functions)), fa = ((((da && ea)) && da.match(/[a-z-]+\\([^()]+\\)/g)));\n        if (fa) {\n            for (var ga = 0; ((ga < fa.length)); ga++) {\n                var ha = fa[ga].match(/([a-z-]+)\\(([^()]+)\\)/);\n                if (((ha && k(ea, ha[1])))) {\n                    return ha[2];\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        return this.value.toString();\n    };\n    m(ca.prototype, {\n        events: [\"session\",\"JSBNG__focus\",\"select\",\"change\",\"execute\",\"JSBNG__blur\",],\n        dataSourceReady: false\n    });\n    e.exports = ca;\n});\n__d(\"FacebarTypeaheadHighlighter\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        this.$FacebarTypeaheadHighlighter0 = h.getCore();\n        this.$FacebarTypeaheadHighlighter1 = this.$FacebarTypeaheadHighlighter0.view;\n    };\n;\n    g.prototype.enable = function() {\n        this.$FacebarTypeaheadHighlighter2 = this.$FacebarTypeaheadHighlighter1.subscribe(\"filter\", this.$FacebarTypeaheadHighlighter3.bind(this));\n    };\n    g.prototype.disable = function() {\n        this.$FacebarTypeaheadHighlighter2.unsubscribe();\n    };\n    g.prototype.$FacebarTypeaheadHighlighter3 = function(h, JSBNG__event) {\n        var i = JSBNG__event.results, j = JSBNG__event.value;\n        i.forEach(function(k) {\n            k.original_query = j;\n        });\n    };\n    e.exports = g;\n});\n__d(\"FacebarTypeaheadRecorder\", [\"clickRefAction\",\"copyProperties\",\"Env\",\"JSBNG__Event\",\"Keys\",\"ScubaSample\",\"SearchTypeaheadRecorder\",\"URI\",\"userAction\",\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"clickRefAction\"), h = b(\"copyProperties\"), i = b(\"Env\"), j = b(\"JSBNG__Event\"), k = b(\"Keys\"), l = b(\"ScubaSample\"), m = b(\"SearchTypeaheadRecorder\"), n = b(\"URI\"), o = b(\"userAction\"), p = b(\"Arbiter\");\n    {\n        var fin213keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin213i = (0);\n        var q;\n        for (; (fin213i < fin213keys.length); (fin213i++)) {\n            ((q) = (fin213keys[fin213i]));\n            {\n                if (((m.hasOwnProperty(q) && ((q !== \"_metaprototype\"))))) {\n                    s[q] = m[q];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var r = ((((m === null)) ? null : m.prototype));\n    s.prototype = Object.create(r);\n    s.prototype.constructor = s;\n    s.__superConstructor__ = m;\n    function s(t) {\n        this.typeahead = t;\n        m.call(this, t);\n        this.userText = \"\";\n        this.queryTimes = [];\n        this._sessionDisabled = false;\n    };\n;\n    s.prototype.initEvents = function() {\n        this.typeahead.getCore().subscribe(\"session\", function(t, u) {\n            if (((u === null))) {\n                this.sessionEnd();\n            }\n             else this.sessionStart(u);\n        ;\n        ;\n        }.bind(this));\n        this.typeahead.getCore().subscribe(\"select\", function(t, u) {\n            this.recordSelectInfo(u);\n        }.bind(this));\n        this.typeahead.getCore().input.subscribe(\"shortcut\", function(t, u) {\n            this.recordShortcut(u);\n        }.bind(this));\n        this.typeahead.getCore().subscribe(\"quickSelectRedirect\", function(t, u) {\n            this.recordQuickSelectInfo(u);\n        }.bind(this));\n        this.typeahead.getView().subscribe(\"render\", function(t, u) {\n            this.recordRender(u);\n        }.bind(this));\n        this.typeahead.data.subscribe(\"query\", function(t, u) {\n            if (!u.value.isEmpty()) {\n                this.recordCountStat(\"num_queries\");\n            }\n        ;\n        ;\n            if (u.see_more) {\n                this.recordStat(\"clicked_see_more\", 1);\n            }\n        ;\n        ;\n            this.recordAvgStat(\"num_results_from_cache\", u.results.length);\n            this.queryTimes[((u.queryId - this.startQueryId))] = {\n                send: JSBNG__Date.now()\n            };\n        }.bind(this));\n        this.typeahead.data.subscribe(\"sending_request\", function(t, u) {\n            var v = u.data.value;\n            if (!v) {\n                return;\n            }\n        ;\n        ;\n            this.backendQueries.push(v);\n        }.bind(this));\n        this.typeahead.subscribe(\"navigation\", function(t, u) {\n            if (((u && u.structure))) {\n                this.recordStat(\"navigation_input\", JSON.stringify(u.structure.toStruct()));\n                this.recordStat(\"navigation_text\", u.structure.toString());\n            }\n        ;\n        ;\n        }.bind(this));\n        this.typeahead.data.subscribe(\"response_received\", function(t, u, v) {\n            if (((u.queryId >= this.startQueryId))) {\n                var w = this.queryTimes[((u.queryId - this.startQueryId))];\n                w.recv = ((JSBNG__Date.now() - w.send));\n            }\n        ;\n        ;\n        }.bind(this));\n        this.typeahead.data.subscribe(\"backend_response\", function(t, u) {\n            if (((u.queryId >= this.startQueryId))) {\n                var v = this.queryTimes[((u.queryId - this.startQueryId))];\n                v.render = ((JSBNG__Date.now() - v.send));\n                if (u.payload.incomplete) {\n                    v.incomplete = true;\n                }\n            ;\n            ;\n                v.backendInfo = u.payload.info;\n                if (this.core.scubaInfo) {\n                    this.logToScuba(u, v, this.core.scubaInfo);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n        p.subscribe(\"BrowseNUX/typing\", this.disableThisSession.bind(this));\n        p.subscribe(\"TestConsole/typing\", this.disableThisSession.bind(this));\n        this.typeahead.getCore().subscribe(\"change\", function(t, u) {\n            this.userInput(this.core.getText());\n        }.bind(this));\n        this.typeahead.subscribe(\"clear\", function() {\n            this.recordAppendStat(\"before_clear_queries\", this.userText);\n        }.bind(this));\n        j.listen(this.element, \"keydown\", function(JSBNG__event) {\n            this.recordStat(\"keypressed\", 1);\n            if (((j.getKeyCode(JSBNG__event) == k.BACKSPACE))) {\n                if (!this._backspacing) {\n                    this._backspacing = true;\n                    this.recordAppendStat(\"before_backspace_queries\", this.core.getText());\n                }\n            ;\n            ;\n            }\n             else this._backspacing = false;\n        ;\n        ;\n        }.bind(this));\n        this.typeahead.subscribe(\"record_after_reorder\", function(t, u) {\n            this._reorderInfo = u;\n            this._reorderInfo.s_organic_results = this._reorderInfo.s_organic_results.map(this.buildTypeaheadRecord.bind(this));\n        }.bind(this));\n        this.typeahead.subscribe(\"filter\", function(t, u) {\n            this._unsupportedGrammarInfo = this.buildUnsupportedGrammarInfo(u);\n        }.bind(this));\n        this.typeahead.getCore().subscribe(\"recordFunction\", function(t, u) {\n            this._extraRecorder.push(u);\n        }.bind(this));\n    };\n    s.prototype._reset = function(t) {\n        this.stats = {\n        };\n        this.avgStats = {\n        };\n        this.appendStats = {\n        };\n        this._backspacing = false;\n        this.backendQueries = [];\n        this._topreplace = false;\n        this._inflightRequests = {\n        };\n    };\n    s.prototype.sessionStart = function(t) {\n        this._sessionEnded = false;\n        this.data.setQueryData({\n            sid: t\n        });\n        this.recordStat(\"sid\", t);\n        if (!this.stats.session_start_time) {\n            this.recordStat(\"session_start_time\", JSBNG__Date.now());\n        }\n    ;\n    ;\n        this.startQueryId = ((this.data.getCurQueryId() + 1));\n        this.recordStat(\"keypressed\", 0);\n        this.queryTimes = [];\n    };\n    s.prototype.sessionEnd = function() {\n        if (((this._sessionEnded || this._sessionDisabled))) {\n            if (this._sessionDisabled) {\n                this.reset();\n                this._sessionDisabled = false;\n                this._sessionEnded = true;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        this._sessionEnded = true;\n        this.recordStat(\"session_end_time\", JSBNG__Date.now());\n        this.recordStat(\"grammar_version\", this.data.getQueryData().grammar_version);\n        this.submit();\n    };\n    s.prototype.disableThisSession = function() {\n        this._sessionDisabled = true;\n    };\n    s.prototype.userInput = function(t) {\n        this.userText = t;\n    };\n    s.prototype.buildUnsupportedGrammarInfo = function(t) {\n        var u = ((t.results ? t.results[0] : null));\n        if (((!u || ((u.results_set_type !== \"unimplemented\"))))) {\n            return null;\n        }\n    ;\n    ;\n        return {\n            unsupported_grammar: {\n                category: ((u.error_info.category || \"unknown\")),\n                edge: u.error_info.blamed_edge\n            }\n        };\n    };\n    s.prototype.buildTypeaheadRecord = function(t, u) {\n        var v = ((((t.rankType || t.render_type)) || t.type)), w = 0, x = u;\n        if (((typeof t.groupIndex == \"number\"))) {\n            w = t.groupIndex;\n            x = t.indexInGroup;\n        }\n    ;\n    ;\n        var y = {\n            group_index: w,\n            index_in_group: x,\n            cost: t.cost,\n            s_value: ((t.s_value || 0)),\n            semantic: t.semantic,\n            text: t.structure.toString(),\n            cache_only: ((t.cacheOnlyResult ? 1 : 0)),\n            parse: t.parse,\n            semantic_forest: t.semanticForest,\n            normalized_input: t.entityTypes,\n            category: t.category,\n            type: v,\n            source: t.bootstrapped,\n            grammar_results_type: ((t.results_set_type || \"\")).replace(/[\\[\\{](.*)[\\]\\}]/, \"$1\"),\n            result_from_memcache: t.memcache,\n            websuggestion_source: t.websuggestion_source,\n            dynamic_cost: t.dynamic_cost,\n            is_js_bootstrap_match: t.isJSBootstrapMatch,\n            backend_cost: t.backendCost,\n            bootstrap_cost: t.bootstrapCost,\n            match_type: t.match_type,\n            l_type: t.l_type,\n            vertical_type: t.vertical_type,\n            prefix_match: t.prefix_match,\n            prefix_length: t.prefix_length,\n            index_before_buckets: t.indexBeforeBuckets,\n            bucket_lineage: t.bucketLineage\n        };\n        if (t.logInfo) {\n            y.backend_log_info = t.logInfo;\n        }\n    ;\n    ;\n        if (t.s_token) {\n            y.s_token = t.s_token;\n        }\n    ;\n    ;\n        if (t.s_categories) {\n            y.s_categories = t.s_categories;\n        }\n    ;\n    ;\n        return y;\n    };\n    s.prototype.buildListTypeaheadRecords = function() {\n        var t = [];\n        ((this.results && this.results.forEach(function(u, v) {\n            if (((u.uid !== \"search\"))) {\n                t.push(this.buildTypeaheadRecord(u, v));\n            }\n        ;\n        ;\n        }.bind(this))));\n        return t;\n    };\n    s.prototype.recordShortcut = function(t) {\n        this.recordStat(\"shortcut\", 1);\n        this.recordStat(\"shortcut_with_shift\", t.shift);\n    };\n    s.prototype.recordStats = function(t, u) {\n        {\n            var fin214keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin214i = (0);\n            var v;\n            for (; (fin214i < fin214keys.length); (fin214i++)) {\n                ((v) = (fin214keys[fin214i]));\n                {\n                    this.recordStat(((((t + \"_\")) + v)), u[v]);\n                ;\n                };\n            };\n        };\n    ;\n    };\n    s.prototype.getTypeaheadIndex = function(t, u) {\n        var v = ((((typeof t.groupIndex == \"number\")) ? ((t.groupIndex + 1)) : 0));\n        return ((u - v));\n    };\n    s.prototype.recordQuickSelectInfo = function(t) {\n        var u = {\n            input_query: t.input_query,\n            semantic: t.semantic,\n            type: t.type,\n            position: t.position,\n            with_mouse: t.with_mouse,\n            text: t.text,\n            quick_select: 1\n        };\n        this.recordStats(\"selected\", u);\n        this.recordStat(\"quick_select\", 1);\n    };\n    s.prototype.recordSelectInfo = function(t) {\n        var u = t.selected, v = this.getTypeaheadIndex(u, t.index), w = {\n        };\n        if (((u.uid == \"search\"))) {\n            w.selected_search = 1;\n        }\n         else {\n            w = this.buildTypeaheadRecord(u);\n            var x = ((((w.type == \"friend\")) ? \"user\" : w.type));\n            w.position = v;\n            w[x] = 1;\n        }\n    ;\n    ;\n        w.with_mouse = ((t.clicked ? 1 : 0));\n        w.quick_select = 0;\n        w.see_more = ((u.see_more ? 1 : 0));\n        w.input_query = this.userText;\n        w.input_fragments = JSON.stringify(this.core.currentQuery.toStruct());\n        var y = ((u.dataGT ? {\n            gt: JSON.parse(u.dataGT)\n        } : {\n        })), z = {\n            href: u.path\n        };\n        g(\"click\", z, null, null, y);\n        o(\"search\").uai(\"click\");\n        this.recordStats(\"selected\", w);\n        this.recordAppendStat(\"selection_history\", {\n            selected: w,\n            candidate_results: this.buildListTypeaheadRecords(),\n            timestamp: JSBNG__Date.now()\n        });\n        var aa = {\n        };\n        this._extraRecorder.forEach(function(ba) {\n            ba(t, this.results, aa);\n        }.bind(this));\n        this.recordStat(\"extra_select_info\", JSON.stringify(aa));\n        this.recordStat(\"selected_with_mouse\", ((t.clicked ? 1 : 0)));\n    };\n    s.prototype._dataToSubmit = function() {\n        this.recordStat(\"max_results\", this.data._maxResults);\n        if (((this.stats && this.stats.selected_input_query))) {\n            this.recordStat(\"input_query\", this.stats.selected_input_query);\n        }\n         else this.recordStat(\"input_query\", this.userText);\n    ;\n    ;\n        this.recordStat(\"uri\", n().toString());\n        if (!this.stats.shortcut) {\n            this.recordStat(\"shortcut\", 0);\n            this.recordStat(\"shortcut_with_shift\", false);\n        }\n    ;\n    ;\n        var t = this.stats;\n        {\n            var fin215keys = ((window.top.JSBNG_Replay.forInKeys)((this.avgStats))), fin215i = (0);\n            var u;\n            for (; (fin215i < fin215keys.length); (fin215i++)) {\n                ((u) = (fin215keys[fin215i]));\n                {\n                    var v = this.avgStats[u];\n                    t[u] = ((v[0] / v[1]));\n                };\n            };\n        };\n    ;\n        var w = {\n            candidate_results: this.buildListTypeaheadRecords(),\n            timestamp: JSBNG__Date.now(),\n            input_query: this.userText\n        };\n        if (this._reorderInfo) {\n            h(w, this._reorderInfo);\n        }\n    ;\n    ;\n        if (this._unsupportedGrammarInfo) {\n            h(w, this._unsupportedGrammarInfo);\n        }\n    ;\n    ;\n        this.recordAppendStat(\"suggestions_at_end_of_session\", w);\n        this.recordAppendStat(\"query_times\", this.queryTimes);\n        if (((this.backendQueries.length > 0))) {\n            if (((this.backendQueries.length > this.data.logBackendQueriesWindow))) {\n                this.backendQueries = this.backendQueries.slice(((this.backendQueries.length - this.data.logBackendQueriesWindow)));\n            }\n        ;\n        ;\n            this.recordStat(\"backend_queries\", this.backendQueries);\n        }\n    ;\n    ;\n        {\n            var fin216keys = ((window.top.JSBNG_Replay.forInKeys)((this.appendStats))), fin216i = (0);\n            var x;\n            for (; (fin216i < fin216keys.length); (fin216i++)) {\n                ((x) = (fin216keys[fin216i]));\n                {\n                    t[x] = JSON.stringify(this.appendStats[x]);\n                ;\n                };\n            };\n        };\n    ;\n        return t;\n    };\n    s.prototype.getDataToSubmit = function() {\n        return this._dataToSubmit();\n    };\n    s.prototype.reset = function() {\n        return this._reset();\n    };\n    s.prototype.submit = function() {\n        if (!this._sessionDisabled) {\n            r.submit.call(this);\n        }\n    ;\n    ;\n        this.view.inform(\"feedback\");\n        this._reset();\n    };\n    s.prototype.logToScuba = function(t, u, v) {\n        if (this._sessionDisabled) {\n            return;\n        }\n    ;\n    ;\n        var w = new l(\"search_facebar_js\", null, {\n            addBrowserFields: true\n        });\n        w.addInteger(\"sample_rate\", v.sample_rate);\n        w.addNormal(\"site\", v.site);\n        w.addDenorm(\"query\", t.request.uri.query_s);\n        var x = t.payload;\n        ((x.entities && w.addInteger(\"num_entities\", x.entities.length)));\n        ((x.results && w.addInteger(\"num_results\", x.results.length)));\n        if (x.times) {\n            w.addInteger(\"time_bootstrap\", x.times.bootstrap);\n            w.addInteger(\"time_php_end_to_end\", x.times.end_to_end);\n            w.addInteger(\"time_fetchers\", x.times.fetchers);\n            w.addInteger(\"time_grammar\", x.times.grammar);\n        }\n    ;\n    ;\n        w.addInteger(\"incomplete\", ((u.incomplete ? 1 : 0)));\n        w.addInteger(\"time_render\", ((u.render - u.recv)));\n        w.addInteger(\"time_js_async\", u.recv);\n        w.addInteger(\"query_id\", u.queryId);\n        w.addInteger(\"user_id\", i.user);\n        w.addInteger(\"session_id\", this.typeahead.getCore().getSessionID());\n        w.flush();\n    };\n    h(s.prototype, {\n        _endPoint: \"/ajax/typeahead/search/record_metrics.php\",\n        _sessionEnded: true,\n        _extraRecorder: [],\n        _banzaiRoute: \"facebar\"\n    });\n    e.exports = s;\n});\n__d(\"FacebarTypeaheadView\", [\"Animation\",\"Arbiter\",\"ContextualLayer\",\"copyProperties\",\"JSBNG__CSS\",\"csx\",\"cx\",\"DOM\",\"Ease\",\"JSBNG__Event\",\"FacebarStructuredText\",\"fbt\",\"Parent\",\"ScrollableArea\",\"Style\",\"throttle\",\"TypeaheadView\",\"Vector\",\"ViewportBounds\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ContextualLayer\"), j = b(\"copyProperties\"), k = b(\"JSBNG__CSS\"), l = b(\"csx\"), m = b(\"cx\"), n = b(\"DOM\"), o = b(\"Ease\"), p = b(\"JSBNG__Event\"), q = b(\"FacebarStructuredText\"), r = b(\"fbt\"), s = b(\"Parent\"), t = b(\"ScrollableArea\"), u = b(\"Style\"), v = b(\"throttle\"), w = b(\"TypeaheadView\"), x = b(\"Vector\"), y = b(\"ViewportBounds\"), z = 981, aa = 500, ba = \"unimplemented\";\n    {\n        var fin217keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin217i = (0);\n        var ca;\n        for (; (fin217i < fin217keys.length); (fin217i++)) {\n            ((ca) = (fin217keys[fin217i]));\n            {\n                if (((w.hasOwnProperty(ca) && ((ca !== \"_metaprototype\"))))) {\n                    ea[ca] = w[ca];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var da = ((((w === null)) ? null : w.prototype));\n    ea.prototype = Object.create(da);\n    ea.prototype.constructor = ea;\n    ea.__superConstructor__ = w;\n    function ea(fa, ga) {\n        w.call(this, fa, ga);\n        this.sid = \"\";\n        this.index = -1;\n        this.animation = null;\n        this.warningShown = false;\n        this.autoSelect = false;\n        this.minResults = ((ga.minResults || 3));\n        this.maxResults = ga.maxResults;\n        this.animateHeightThrottled = v(this.animateHeight, 50, this);\n        this.animateCount = -1;\n        this.animateWidth = -1;\n        this.loading = false;\n    };\n;\n    ea.prototype.init = function() {\n        this.initializeElements();\n        da.init.call(this);\n    };\n    ea.prototype.initializeElements = function() {\n        var fa = this.element;\n        this.JSBNG__content = n.JSBNG__find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__content\");\n        this.throbber = n.JSBNG__find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__throbber\");\n        this.warningNode = n.JSBNG__find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__warning\");\n        this.scroller = n.JSBNG__find(fa, \".-cx-PRIVATE-fbFacebarTypeaheadView__scroller\");\n        this.scrollableArea = t.getInstance(this.scroller);\n        this.footer = this.createFooter();\n    };\n    ea.prototype.initializeLayer = function() {\n        var fa = n.scry(JSBNG__document.body, \"#blueBar\")[0], ga, ha, ia;\n        if (((fa && n.contains(fa, this.element)))) {\n            ga = fa;\n            ia = \"-cx-PUBLIC-fbFacebarTypeaheadView__layer\";\n            ha = \"100%\";\n        }\n         else {\n            ga = this.element.parentNode;\n            ia = \"\";\n            ha = ((z + \"px\"));\n        }\n    ;\n    ;\n        this.wrapper = n.create(\"div\");\n        n.appendContent(this.wrapper, this.element);\n        this.layer = new i({\n            context: ga,\n            position: \"below\",\n            alignment: this.alignment,\n            causalElement: this.causalElement\n        }, this.wrapper);\n        this.layer.show();\n        this.layer.hide();\n        k.addClass(this.layer.getRoot(), ia);\n        u.set(this.layer.getContentRoot(), \"width\", ha);\n    };\n    ea.prototype.initializeEvents = function() {\n        p.listen(this.JSBNG__content, {\n            click: this.click.bind(this),\n            mouseover: this.mouseover.bind(this)\n        });\n    };\n    ea.prototype.setInputElement = function(fa) {\n        this.setAccessibilityControlElement(fa);\n        this.causalElement = fa;\n        this.initializeLayer();\n    };\n    ea.prototype.setAutoSelect = function(fa) {\n        this.autoSelect = fa;\n        if (((((this.index === -1)) && fa))) {\n            this.first();\n        }\n    ;\n    ;\n    };\n    ea.prototype.click = function(JSBNG__event) {\n        if (((!JSBNG__event.isMiddleClick() && !JSBNG__event.getModifiers().any))) {\n            var fa = s.byTag(JSBNG__event.getTarget(), \"a\");\n            if (((!fa || k.hasClass(fa, \"-cx-PRIVATE-fbFacebarTypeaheadItem__link\")))) {\n                this.select(true);\n                return JSBNG__event.kill();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    ea.prototype.show = function() {\n        if (!this.visible) {\n            this.inform(\"beforeShow\", this.layer);\n            var fa = da.show.call(this);\n            this.first();\n            this.layer.show();\n            this.layer.updatePosition();\n            this.recalculateScrollableArea();\n            this.animateCount = -1;\n            this.animateHeight();\n            this.inform(\"show\");\n            h.inform(\"layer_shown\", {\n                type: \"FacebarTypeahead\"\n            });\n            return fa;\n        }\n    ;\n    ;\n    };\n    ea.prototype.hide = function() {\n        if (this.visible) {\n            this.layer.hide();\n            da.hide.call(this);\n            u.set(this.scroller, \"height\", \"0px\");\n            this.inform(\"hide\");\n            h.inform(\"layer_hidden\", {\n                type: \"FacebarTypeahead\"\n            });\n        }\n    ;\n    ;\n        return this;\n    };\n    ea.prototype.select = function(fa) {\n        var ga = this.results[this.index];\n        if (!ga) {\n            this.inform(\"quickSelect\");\n            return;\n        }\n    ;\n    ;\n        var ha = this.inform(\"beforeSelect\", {\n            index: this.index,\n            selected: ga\n        });\n        if (((((ha !== false)) && this.isIndexFooter(this.index)))) {\n            ha = false;\n        }\n    ;\n    ;\n        if (((ha !== false))) {\n            da.select.call(this, fa);\n        }\n    ;\n    ;\n    };\n    ea.prototype.buildResults = function(fa) {\n        this.list = k.addClass(da.buildResults.call(this, fa), \"-cx-PRIVATE-fbFacebarTypeaheadView__list\");\n        return this.list;\n    };\n    ea.prototype.animateHeight = function() {\n        if (((this.items.length == this.animateCount))) {\n            var fa = x.getViewportDimensions().x;\n            if (((this.animateWidth != fa))) {\n                this.animateWidth = fa;\n                this.recalculateScrollableArea();\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        if (((this.list && k.shown(this.list)))) {\n            this.animateCount = this.items.length;\n            var ga = Math.min(x.getElementDimensions(this.list).y, this.calculateMaxAllowableHeight());\n            ((this.animation && this.animation.JSBNG__stop()));\n            this.animation = new g(this.scroller).to(\"height\", ga).duration(aa).ease(o.makePowerOut(5)).ondone(this.recalculateScrollableArea.bind(this)).go();\n        }\n    ;\n    ;\n    };\n    ea.prototype.calculateMaxAllowableHeight = function() {\n        var fa = x.getViewportDimensions().y, ga = ((y.getTop() || 48)), ha = 56, ia = ((Math.max(this.minResults, ((Math.floor(((((((fa - ga)) - 25)) / ha))) - 1))) + 1));\n        return ((((ia * ha)) + ((ha / 4))));\n    };\n    ea.prototype.render = function(fa, ga, ha, ia, ja) {\n        this.inform(\"filter\", {\n            results: ga,\n            value: fa,\n            isScrollable: ja\n        });\n        if (this.loading) {\n            ga.push({\n                uid: \"search\",\n                node: this.footer,\n                structure: new q(),\n                search: true\n            });\n        }\n    ;\n    ;\n        var ka = ga[0];\n        if (ia) {\n            this.showWarning(r._(\"There are no results for '{query}'\", [r.param(\"query\", fa.toString()),]));\n        }\n         else if (((ka && ((ka.results_set_type === ba))))) {\n            if (!ka.error_info.suppress) {\n                this.showWarning(((ka.error_info.errorMessage || \"This search isn't currently supported.\")));\n            }\n        ;\n        ;\n        }\n         else this.hideWarning();\n        \n    ;\n    ;\n        if (((this.inform(\"removeUnimplementedGrammar\") !== false))) {\n            ga = ga.filter(function(la) {\n                return ((la.results_set_type !== ba));\n            }.bind(this));\n        }\n    ;\n    ;\n        da.render.call(this, fa, ga, ha);\n        this.renderFooter();\n        this.animateHeightThrottled();\n    };\n    ea.prototype.showWarning = function(fa) {\n        k.show(this.warningNode);\n        n.setContent(this.warningNode, fa);\n        this.warningShown = true;\n        this.highlight(-1, false);\n    };\n    ea.prototype.hideWarning = function() {\n        k.hide(this.warningNode);\n        this.warningShown = false;\n        this.highlight(this.index, false);\n    };\n    ea.prototype.recalculateScrollableArea = function() {\n        u.set(this.scroller, \"width\", ((x.getElementDimensions(this.element).x + \"px\")));\n        this.scrollableArea.resize();\n        this.scrollableArea.poke();\n    };\n    ea.prototype.setLoading = function(fa) {\n        this.loading = fa;\n        this.renderFooter();\n    };\n    ea.prototype.JSBNG__scrollTo = function(fa) {\n        ((fa && this.scrollableArea.scrollIntoView(fa, true)));\n    };\n    ea.prototype.renderFooter = function() {\n        k.conditionShow(this.throbber, this.loading);\n        k.conditionShow(this.footer, this.loading);\n        if (this.loading) {\n            this.inform(\"showingFooter\");\n        }\n         else this.inform(\"hidingFooter\");\n    ;\n    ;\n    };\n    ea.prototype.isIndexFooter = function(fa) {\n        var ga = this.results[fa];\n        return ((ga && ((ga.node == this.footer))));\n    };\n    ea.prototype.first = function() {\n        this.index = ((this.autoSelect ? 0 : -1));\n        this.highlight(this.index);\n    };\n    ea.prototype.prev = function() {\n        if (((this.index <= 0))) {\n            this.index = this.items.length;\n        }\n    ;\n    ;\n        if (this.isIndexFooter(((this.index - 1)))) {\n            this.index -= 1;\n        }\n    ;\n    ;\n        da.prev.call(this);\n    };\n    ea.prototype.next = function() {\n        if (((((this.index + 1)) >= this.items.length))) {\n            this.index = -1;\n        }\n    ;\n    ;\n        if (this.isIndexFooter(((this.index + 1)))) {\n            this.index = -1;\n        }\n    ;\n    ;\n        da.next.call(this);\n    };\n    ea.prototype.highlight = function(fa, ga) {\n        ga = ((((ga !== false)) && ((this.index != fa))));\n        if (((!ga || ((this.inform(\"beforeHighlight\") !== false))))) {\n            var ha = ((((this.warningShown || !this.autoSelect)) ? -1 : 0));\n            da.highlight.call(this, Math.max(ha, fa), ga);\n        }\n    ;\n    ;\n    };\n    ea.prototype.createFooter = function() {\n        return n.create(\"li\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadView__footer hidden_elem\"\n        }, this.throbber);\n    };\n    j(ea.prototype, {\n        events: [\"highlight\",\"render\",\"filter\",]\n    });\n    e.exports = ea;\n});\n__d(\"FacebarTypeaheadViewMegaphone\", [\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"JSBNG__CSS\",\"JSBNG__Event\",\"mixin\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"JSBNG__CSS\"), k = b(\"JSBNG__Event\"), l = b(\"mixin\"), m = l(h);\n    {\n        var fin218keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin218i = (0);\n        var n;\n        for (; (fin218i < fin218keys.length); (fin218i++)) {\n            ((n) = (fin218keys[fin218i]));\n            {\n                if (((m.hasOwnProperty(n) && ((n !== \"_metaprototype\"))))) {\n                    p[n] = m[n];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var o = ((((m === null)) ? null : m.prototype));\n    p.prototype = Object.create(o);\n    p.prototype.constructor = p;\n    p.__superConstructor__ = m;\n    function p(q, r, s) {\n        this.root = q;\n        this.tourButton = r;\n        this.closeButton = s;\n        this.nuxReady = false;\n        this.core = null;\n        k.listen(this.tourButton, \"click\", this.$FacebarTypeaheadViewMegaphone0.bind(this));\n        k.listen(this.closeButton, \"click\", this.$FacebarTypeaheadViewMegaphone1.bind(this));\n        g.subscribe(\"Facebar/init\", this.$FacebarTypeaheadViewMegaphone2.bind(this));\n    };\n;\n    p.prototype.$FacebarTypeaheadViewMegaphone2 = function(q, r) {\n        r.view.subscribe(\"render\", this.$FacebarTypeaheadViewMegaphone4.bind(this));\n        r.view.subscribe(\"show\", this.$FacebarTypeaheadViewMegaphone4.bind(this));\n        g.subscribe(\"BrowseNUX/initialized\", this.$FacebarTypeaheadViewMegaphone5.bind(this));\n        this.core = r.core;\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone5 = function() {\n        this.nuxReady = true;\n        this.$FacebarTypeaheadViewMegaphone4();\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone4 = function() {\n        if (this.nuxReady) {\n            j.conditionShow(this.root, this.core.getValue().isEmpty());\n        }\n    ;\n    ;\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone0 = function() {\n        this.inform(\"start\");\n    };\n    p.prototype.$FacebarTypeaheadViewMegaphone1 = function() {\n        new i().setURI(\"/ajax/browse/nux_hide.php\").setMethod(\"POST\").send();\n        this.hide();\n        this.inform(\"hide\");\n    };\n    p.prototype.hide = function() {\n        j.hide(this.root);\n    };\n    e.exports = p;\n});\n__d(\"FacebarTypeaheadDecorateEntities\", [\"arrayContains\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(n) {\n        var o = [];\n        n.forEach(function(p) {\n            if (p.isType(\"ent\")) {\n                o.push(p.getUID());\n            }\n        ;\n        ;\n        });\n        return o;\n    };\n;\n    function k(n, o) {\n        var p = null;\n        n.structure.forEach(function(q) {\n            if (((q.isType(\"ent\") && !g(o, q.getUID())))) {\n                p = q;\n            }\n        ;\n        ;\n        });\n        return p;\n    };\n;\n    function l(n, o, p) {\n        n.forEach(function(q) {\n            var r = k(q, o);\n            q.decoration = {\n                entity: ((r && p.getEntryForFragment(r)))\n            };\n        });\n    };\n;\n    function m(n) {\n        this._typeahead = n;\n    };\n;\n    m.prototype.enable = function() {\n        this._typeahead.view.subscribe(\"filter\", function(n, o) {\n            l(o.results, j(this._typeahead.core.getValue()), this._typeahead.data);\n        }.bind(this));\n    };\n    h(m.prototype, {\n        disable: i\n    });\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadDecorateMessageButton\", [\"cx\",\"ChatOpenTab\",\"DOM\",\"React\",\"XUIButton.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"ChatOpenTab\"), i = b(\"DOM\"), j = b(\"React\"), k = b(\"XUIButton.react\");\n    function l(m) {\n        this.$FacebarTypeaheadDecorateMessageButton0 = m;\n        this.$FacebarTypeaheadDecorateMessageButton1 = null;\n    };\n;\n    l.prototype.enable = function() {\n        this.$FacebarTypeaheadDecorateMessageButton1 = this.$FacebarTypeaheadDecorateMessageButton0.view.subscribe(\"renderingItem\", this.$FacebarTypeaheadDecorateMessageButton2.bind(this));\n    };\n    l.prototype.$FacebarTypeaheadDecorateMessageButton2 = function(m, JSBNG__event) {\n        JSBNG__event.JSBNG__item.setShouldRenderEducation(false);\n        var n = JSBNG__event.result;\n        if (((((n.type !== \"user\")) && ((n.type !== \"{user}\"))))) {\n            return;\n        }\n    ;\n    ;\n        var o = i.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__typeaheadmessagebutton\"\n        }), p = function() {\n            h.openUserTab(n.uid, \"search\");\n        };\n        j.renderComponent(k({\n            label: \"Message\",\n            onMouseDown: p\n        }), o);\n        JSBNG__event.JSBNG__item.setMessageButton(o);\n    };\n    l.prototype.disable = function() {\n        ((this.$FacebarTypeaheadDecorateMessageButton1 && this.$FacebarTypeaheadDecorateMessageButton1.unsubscribe()));\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadDisambiguateResults\", [\"FacebarDisambiguationDialog\",\"FacebarStructuredFragment\",\"FacebarStructuredText\",\"URI\",\"copyProperties\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarDisambiguationDialog\"), h = b(\"FacebarStructuredFragment\"), i = b(\"FacebarStructuredText\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"getObjectValues\");\n    function n(w, x) {\n        var y = {\n        };\n        w.forEach(function(ba) {\n            if (((ba.type == \"grammar\"))) {\n                var ca = x(ba.structure).toLowerCase();\n                y[ca] = ((y[ca] || []));\n                y[ca].push(ba);\n            }\n        ;\n        ;\n        });\n        var z = [];\n        {\n            var fin219keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin219i = (0);\n            var aa;\n            for (; (fin219i < fin219keys.length); (fin219i++)) {\n                ((aa) = (fin219keys[fin219i]));\n                {\n                    if (((y[aa].length > 1))) {\n                        z.push(y[aa]);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return z;\n    };\n;\n    function o(w) {\n        var x = [];\n        w.toArray().forEach(function(y, z) {\n            if (y.isType(\"ent\")) {\n                x.push(z);\n            }\n        ;\n        ;\n        });\n        return x;\n    };\n;\n    function p(w, x, y) {\n        var z = {\n        }, aa = {\n        }, ba = {\n        };\n        x.forEach(function(da) {\n            var ea = w[0].structure.getFragment(da), fa = ea.getHash();\n            aa[fa] = ((aa[fa] || []));\n            ba[da] = aa[fa];\n            w.forEach(function(ga) {\n                var ha = ga.structure.getFragment(da), ia = ((ha && ha.getUID()));\n                if (((ia && !z.hasOwnProperty(ia)))) {\n                    aa[fa].push(y.getEntryForFragment(ha));\n                    z[ia] = true;\n                }\n            ;\n            ;\n            });\n        });\n        {\n            var fin220keys = ((window.top.JSBNG_Replay.forInKeys)((ba))), fin220i = (0);\n            var ca;\n            for (; (fin220i < fin220keys.length); (fin220i++)) {\n                ((ca) = (fin220keys[fin220i]));\n                {\n                    if (((ba[ca].length <= 1))) {\n                        delete ba[ca];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return ba;\n    };\n;\n    function q(w, x) {\n        var y = {\n        }, z = [];\n        w.forEach(function(aa) {\n            var ba = aa.structure.getFragment(x).getUID();\n            if (!y.hasOwnProperty(ba)) {\n                y[ba] = z.length;\n                z.push([]);\n            }\n        ;\n        ;\n            z[y[ba]].push(aa);\n        });\n        return z;\n    };\n;\n    function r(w, x, y) {\n        var z = w.shift();\n        z.ambiguity.entities = x;\n        y.push.apply(y, w);\n        return z;\n    };\n;\n    function s(w, x) {\n        var y = [], z = [], aa = false;\n        w.forEach(function(ca) {\n            ca.ambiguity = {\n                fragment: null,\n                entities: null,\n                text: null\n            };\n        });\n        n(w, function(ca) {\n            return ca.getHash();\n        }).forEach(function(ca) {\n            var da = ca[0].structure, ea = o(da), fa = p(ca, ea, x);\n            if (aa) {\n                r(ca, fa, y);\n                return;\n            }\n        ;\n        ;\n            var ga = ea.pop();\n            if (((typeof ga == \"number\"))) {\n                var ha = q(ca, ga);\n                aa = ((ha.length > 1));\n                if (aa) {\n                    delete fa[ga];\n                }\n            ;\n            ;\n                ha.forEach(function(ia) {\n                    var ja = r(ia, fa, y);\n                    if (aa) {\n                        var ka = ja.structure.getFragment(ga).getUID();\n                        ja.ambiguity.entity = x.getEntry(ka);\n                        z.push(ja);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        });\n        y.forEach(function(ca) {\n            var da = w.indexOf(ca);\n            ((((da != -1)) && w.splice(da, 1)));\n        });\n        n(w, function(ca) {\n            return ca.toString();\n        }).forEach(function(ca) {\n            ca.forEach(function(da) {\n                if (!da.ambiguity.entities) {\n                    da.ambiguity.text = da.queryTypeText;\n                }\n            ;\n            ;\n            });\n        });\n        var ba = w.indexOf(z[0]);\n        z.slice(1).forEach(function(ca) {\n            var da = w.indexOf(ca);\n            if (((((da != -1)) && ((da != ++ba))))) {\n                w.splice(da, 1);\n                w.splice(ba, 0, ca);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function t(w, x) {\n        var y = ((((w && w.ambiguity)) && w.ambiguity.entities)), z = ((y && Object.keys(y).map(Number))), aa = x.core.input;\n        if (((!z || ((z.length === 0))))) {\n            return false;\n        }\n    ;\n    ;\n        var ba = function(ea) {\n            x.core.executeQuery(u(w, z, ea));\n        }, ca = function() {\n            aa.JSBNG__focus();\n            aa.input.moveSelectionToEnd();\n        }, da = new g(m(y), w.uri.getPath(), ba, ca, x.getCore().getSessionID());\n        aa.JSBNG__blur();\n        da.show();\n        return true;\n    };\n;\n    function u(w, x, y) {\n        var z = w.structure.toArray(), aa = j(w.uri), ba = aa.getPath().split(\"/\");\n        x.forEach(function(ca) {\n            var da = z[ca], ea = y.shift(), fa = ba.indexOf(String(da.getUID()));\n            if (((fa != -1))) {\n                ba[fa] = ea.uid;\n            }\n        ;\n        ;\n            z[ca] = new h({\n                uid: ea.uid,\n                text: ea.text,\n                type: ((\"ent:\" + ea.type))\n            });\n        });\n        return {\n            uri: aa.setPath(ba.join(\"/\")),\n            structure: new i(z)\n        };\n    };\n;\n    function v(w) {\n        this._typeahead = w;\n    };\n;\n    v.prototype.enable = function() {\n        this._typeahead.view.subscribe(\"filter\", function(w, x) {\n            s(x.results, this._typeahead.data);\n        }.bind(this));\n        this._typeahead.view.subscribe(\"beforeSelect\", function(w, x) {\n            return !t(x.selected, this._typeahead);\n        }.bind(this));\n    };\n    k(v.prototype, {\n        disable: l\n    });\n    e.exports = v;\n});\n__d(\"FacebarTypeaheadHashtagResult\", [\"HashtagSearchResultUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"HashtagSearchResultUtils\");\n    function h(i) {\n        this.$FacebarTypeaheadHashtagResult0 = i.getData();\n    };\n;\n    h.prototype.enable = function() {\n        this.$FacebarTypeaheadHashtagResult1 = this.$FacebarTypeaheadHashtagResult0.subscribe(\"beforeQuery\", this.$FacebarTypeaheadHashtagResult2.bind(this));\n    };\n    h.prototype.$FacebarTypeaheadHashtagResult2 = function(i, j) {\n        if (((!j || !j.value))) {\n            return;\n        }\n    ;\n    ;\n        var k = this.$FacebarTypeaheadHashtagResult0.getRawStructure(j.value);\n        if (((((!k || k.is_empty)) || !k.raw_text))) {\n            return;\n        }\n    ;\n    ;\n        var l = g.getHashtagFromQuery(k.raw_text);\n        if (!l) {\n            return;\n        }\n    ;\n    ;\n        var m = ((\"hashtag:\" + l)), n = this.$FacebarTypeaheadHashtagResult0.getEntry(m);\n        if (!n) {\n            this.$FacebarTypeaheadHashtagResult0.processEntries([g.makeFacebarEntry(l),]);\n            this.$FacebarTypeaheadHashtagResult0.resultStore.saveResults([g.makeFacebarResult(l),], k, true);\n        }\n    ;\n    ;\n        return;\n    };\n    h.prototype.disable = function() {\n        ((this.$FacebarTypeaheadHashtagResult1 && this.$FacebarTypeaheadHashtagResult0.unsubscribe(this.$FacebarTypeaheadHashtagResult1)));\n    };\n    e.exports = h;\n});\n__d(\"FacebarTypeaheadMagGo\", [\"csx\",\"DOM\",\"JSBNG__Event\",\"$\",\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"csx\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"$\"), k = b(\"SubscriptionsHandler\");\n    function l(m) {\n        this._core = m.getCore();\n        this._view = this._core.view;\n        this._handler = new k();\n        this._selected = null;\n    };\n;\n    l.prototype.enable = function() {\n        var m = h.JSBNG__find(j(\"blueBar\"), \".-cx-PUBLIC-fbFacebar__icon\");\n        this._handler.addSubscriptions(i.listen(m, \"click\", this._runQuery.bind(this)), this._view.subscribe(\"highlight\", this._highlight.bind(this)), this._view.subscribe(\"render\", this._render.bind(this)), this._core.subscribe(\"close\", this._close.bind(this)));\n    };\n    l.prototype.disable = function() {\n        this._handler.release();\n    };\n    l.prototype._highlight = function(m, n) {\n        this._selected = n.selected;\n    };\n    l.prototype._render = function(m, n) {\n        this._selected = this._view.results[this._view.index];\n    };\n    l.prototype._runQuery = function() {\n        if (this._selected) {\n            return this._core.selectView(null, {\n                selected: this._selected\n            });\n        }\n    ;\n    ;\n    };\n    l.prototype._close = function() {\n        this._selected = null;\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadMagPPS\", [\"csx\",\"DOM\",\"JSBNG__Event\",\"FacebarStructuredText\",\"FacebarURI\",\"FacebarResultStoreUtils\",\"$\",\"SubscriptionsHandler\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"csx\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarURI\"), l = b(\"FacebarResultStoreUtils\"), m = b(\"$\"), n = b(\"SubscriptionsHandler\"), o = b(\"URI\");\n    function p(q) {\n        this._core = q.getCore();\n        this._data = q.getData();\n        this._view = this._core.view;\n        this._input = this._core.input;\n        this._handler = new n();\n    };\n;\n    p.prototype.enable = function() {\n        var q = h.JSBNG__find(m(\"blueBar\"), \".-cx-PUBLIC-fbFacebar__icon\");\n        this._handler.addSubscriptions(i.listen(q, \"click\", this._runQuery.bind(this)));\n    };\n    p.prototype.disable = function() {\n        this._handler.release();\n    };\n    p.prototype._runQuery = function() {\n        var q = this._input.getValue(), r = this._data.getRawStructure(q);\n        if (((!r || r.is_empty))) {\n            return;\n        }\n    ;\n    ;\n        var s;\n        if (!r.raw_text) {\n            s = l.getRawTextFromStructured(q.toArray());\n        }\n         else s = r.raw_text;\n    ;\n    ;\n        var t = o(this._view.seeMoreSerpEndpoint).addQueryData(\"q\", s).addQueryData(\"sid\", this._core.getSessionID());\n        t = k.getQualifiedURI(t);\n        var u = ((((((((((((((((\"uri(\" + \"path(\")) + this._view.seeMoreSerpEndpoint)) + \")\")) + \",param_q(\")) + s)) + \")\")) + \",param_source(mag_glass)\")) + \")\"));\n        return this._core.selectView(null, {\n            selected: {\n                uid: \"see_more_serp\",\n                node: this._moreBar,\n                structure: new j(),\n                search: true,\n                uri: t,\n                type: \"see_more_serp\",\n                text: s,\n                selected: true,\n                semantic: u\n            }\n        });\n    };\n    e.exports = p;\n});\n__d(\"FacebarTypeaheadNarrowDrawer\", [\"JSBNG__CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"cx\");\n    function i(j) {\n        this.$FacebarTypeaheadNarrowDrawer0 = j;\n        this.$FacebarTypeaheadNarrowDrawer1 = null;\n    };\n;\n    i.prototype.enable = function() {\n        this.$FacebarTypeaheadNarrowDrawer1 = this.$FacebarTypeaheadNarrowDrawer0.view.subscribe(\"beforeShow\", this.$FacebarTypeaheadNarrowDrawer2.bind(this));\n    };\n    i.prototype.$FacebarTypeaheadNarrowDrawer2 = function(j, k) {\n        g.removeClass(k.getRoot(), \"-cx-PUBLIC-fbFacebarTypeaheadView__layer\");\n        g.addClass(k.getContentRoot(), \"-cx-PUBLIC-fbFacebarTypeaheadView__narrowlayer\");\n        k.setContext(this.$FacebarTypeaheadNarrowDrawer0.element.offsetParent);\n    };\n    i.prototype.disable = function() {\n        ((this.$FacebarTypeaheadNarrowDrawer1 && this.$FacebarTypeaheadNarrowDrawer1.unsubscribe()));\n    };\n    e.exports = i;\n});\n__d(\"FacebarTypeaheadNavigation\", [\"Arbiter\",\"FacebarNavigation\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FacebarNavigation\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this._core = l.core;\n        this._preserveQuery = false;\n        this._typeahead = l;\n    };\n;\n    k.prototype.enable = function() {\n        h.registerBehavior(this);\n        this._core.subscribe(\"execute\", this.executedUserQuery.bind(this));\n        this._core.subscribe(\"change\", this.changeUserQuery.bind(this));\n    };\n    k.prototype.executedUserQuery = function(l, m) {\n        this._preserveQuery = true;\n    };\n    k.prototype.changeUserQuery = function() {\n        this._navigatedQuery = false;\n    };\n    k.prototype.pageTransition = function() {\n        if (!this._preserveQuery) {\n            this._core.close();\n            this._core.reset();\n        }\n         else this._preserveQuery = false;\n    ;\n    ;\n    };\n    k.prototype.setPageQuery = function(l) {\n        l = this._core.setPageQuery(l);\n        this._typeahead.inform(\"navigation\", l, g.BEHAVIOR_PERSISTENT);\n    };\n    i(k.prototype, {\n        disable: j\n    });\n    e.exports = k;\n});\n__d(\"FacebarTypeaheadQuickSelect\", [\"FacebarStructuredText\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarStructuredText\"), h = b(\"URI\"), i = \"/search/web/direct_search.php\";\n    function j(k) {\n        this._core = k.getCore();\n        this._view = k.getView();\n        this._input = this._core.input;\n        this._beforeSelectListener = null;\n        this._quickSelectListener = null;\n    };\n;\n    j.prototype.enable = function() {\n        this._beforeSelectListener = this._view.subscribe(\"beforeSelect\", this._quickSelect.bind(this));\n        this._quickSelectListener = this._view.subscribe(\"quickSelect\", this._quickSelect.bind(this));\n    };\n    j.prototype._quickSelect = function(k, l) {\n        if (((((l && l.selected)) && ((l.selected.uid !== \"search\"))))) {\n            return true;\n        }\n    ;\n    ;\n        var m = this._input.getValue().toArray(), n = new g(m), o = n.toString();\n        if (!o) {\n            return true;\n        }\n    ;\n    ;\n        var p = h(i).addQueryData(\"q\", o), q = {\n            input_query: o,\n            type: \"quickselect\",\n            text: o,\n            position: 0,\n            with_mouse: 0,\n            semantic: ((((\"uri(path(\" + p.toString())) + \"))\")),\n            extra_uri_params: {\n                source: \"quickselect\",\n                sid: this._core.getSessionID()\n            },\n            uri: p\n        };\n        this._core.inform(\"quickSelectRedirect\", q);\n        this._core.executeQuery(q);\n        return false;\n    };\n    j.prototype.disable = function() {\n        ((this._beforeSelectListener && this._view.unsubscribe(this._beforeSelectListener)));\n        ((this._quickSelectListener && this._view.unsubscribe(this._quickSelectListener)));\n    };\n    e.exports = j;\n});\n__d(\"FacebarTypeaheadRecorderBasic\", [\"Arbiter\",\"FacebarTypeaheadRecorder\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FacebarTypeaheadRecorder\"), i = b(\"copyProperties\");\n    function j(k) {\n        this._typeahead = k;\n    };\n;\n    j.prototype.enable = function() {\n        var k = this._typeahead;\n        this._subscription = k.subscribe(\"init\", function(l, m) {\n            var n = new h(k);\n            k.inform(\"recorder\", n, g.BEHAVIOR_PERSISTENT);\n        });\n    };\n    j.prototype.disable = function() {\n        this._typeahead.unsubscribe(this._subscription);\n        this._subscription = null;\n    };\n    i(j.prototype, {\n        _subscription: null\n    });\n    e.exports = j;\n});\n__d(\"FacebarTypeaheadSeeMore\", [\"JSBNG__CSS\",\"cx\",\"DOM\",\"FacebarStructuredText\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"cx\"), i = b(\"DOM\"), j = b(\"FacebarStructuredText\"), k = b(\"fbt\");\n    function l(m) {\n        this._core = m.getCore();\n        this._view = this._core.view;\n        this._moreBar = null;\n        this._isOpen = false;\n    };\n;\n    l.prototype.enable = function() {\n        this._subscriptions = [this._core.subscribe(\"close\", this._close.bind(this)),this._view.subscribe(\"filter\", this._buildSeeMore.bind(this)),this._view.subscribe(\"beforeSelect\", this._beforeSelect.bind(this)),this._view.subscribe(\"next\", this._scrollView.bind(this)),this._view.subscribe(\"prev\", this._scrollView.bind(this)),this._view.subscribe(\"showingFooter\", this._footerShow.bind(this)),this._view.subscribe(\"hidingFooter\", this._footerHide.bind(this)),];\n    };\n    l.prototype.disable = function() {\n        while (this._subscriptions.length) {\n            this._subscriptions.pop().unsubscribe();\n        ;\n        };\n    ;\n    };\n    l.prototype._beforeSelect = function(m, JSBNG__event) {\n        if (((!JSBNG__event.selected || ((JSBNG__event.selected.node !== this._moreBar))))) {\n            return true;\n        }\n    ;\n    ;\n        this._view.first();\n        this._core.expandView();\n        return false;\n    };\n    l.prototype._buildSeeMore = function(m, JSBNG__event) {\n        var n = JSBNG__event.results;\n        if (((((((n.length === 0)) || JSBNG__event.isScrollable)) || ((JSBNG__event.value.toString().trim() == \"\"))))) {\n            return;\n        }\n    ;\n    ;\n        if (((n.length < this._view.maxResults))) {\n            var o = n.some(function(q) {\n                return ((q.type !== \"websuggestion\"));\n            });\n            if (!o) {\n                return;\n            }\n        ;\n        ;\n        }\n         else if (((n.length > ((this._view.maxResults + 1))))) {\n            this._isOpen = true;\n            return;\n        }\n        \n    ;\n    ;\n        var p = \"See More\";\n        this._isOpen = false;\n        this._moreBar = i.create(\"li\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadView__seemore calltoaction\"\n        }, p);\n        this._moreBar.setAttribute(\"aria-label\", p);\n        n.push({\n            uid: \"search\",\n            node: this._moreBar,\n            structure: new j(),\n            search: true\n        });\n    };\n    l.prototype._close = function() {\n        if (this._isOpen) {\n            this._core.collapseView();\n            this._isOpen = false;\n        }\n    ;\n    ;\n        return true;\n    };\n    l.prototype._footerHide = function() {\n        if (this._moreBar) {\n            g.show(this._moreBar);\n            this._view.animateCount = -1;\n            this._view.animateHeightThrottled();\n        }\n    ;\n    ;\n        return true;\n    };\n    l.prototype._footerShow = function() {\n        ((this._moreBar && g.hide(this._moreBar)));\n        return true;\n    };\n    l.prototype._scrollView = function(m, n) {\n        if (this._isOpen) {\n            this._view.JSBNG__scrollTo(n);\n        }\n    ;\n    ;\n        return true;\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadSeeMoreSerp\", [\"JSBNG__CSS\",\"cx\",\"DOM\",\"FacebarStructuredText\",\"FacebarURI\",\"fbt\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"cx\"), i = b(\"DOM\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarURI\"), l = b(\"fbt\"), m = b(\"URI\");\n    function n(o) {\n        this._core = o.getCore();\n        this._view = this._core.view;\n        this._moreBar = null;\n    };\n;\n    n.prototype.enable = function() {\n        this._subscriptions = [this._view.subscribe(\"filter\", this._buildSeeMore.bind(this)),this._view.subscribe(\"showingFooter\", this._footerShow.bind(this)),this._view.subscribe(\"hidingFooter\", this._footerHide.bind(this)),];\n    };\n    n.prototype.disable = function() {\n        while (this._subscriptions.length) {\n            this._subscriptions.pop().unsubscribe();\n        ;\n        };\n    ;\n    };\n    n.prototype._buildSeeMore = function(o, JSBNG__event) {\n        var p = JSBNG__event.results, q = JSBNG__event.value.toString().trim();\n        if (((((((p.length === 0)) || JSBNG__event.isScrollable)) || ((q === \"\"))))) {\n            return;\n        }\n    ;\n    ;\n        var r = l._(\"See more results for \\\"{query}\\\"\", [l.param(\"query\", q),]);\n        this._moreBar = i.create(\"li\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadView__seemoreserp calltoaction\"\n        }, [i.create(\"span\", {\n            className: \"text\"\n        }, [i.create(\"span\", {\n            className: \"seeMore\"\n        }, [r,]),]),]);\n        var s = m(this._view.seeMoreSerpEndpoint).addQueryData(\"q\", q).addQueryData(\"sid\", this._core.getSessionID());\n        s = k.getQualifiedURI(s);\n        var t = ((((((((((((((((\"uri(\" + \"path(\")) + this._view.seeMoreSerpEndpoint)) + \")\")) + \",param_q(\")) + q)) + \")\")) + \",param_source(typeahead_footer)\")) + \")\"));\n        this._moreBar.setAttribute(\"aria-label\", r);\n        p.push({\n            uid: \"see_more_serp\",\n            node: this._moreBar,\n            structure: new j(),\n            search: true,\n            uri: s,\n            type: \"see_more_serp\",\n            text: q,\n            semantic: t\n        });\n    };\n    n.prototype._footerHide = function() {\n        if (this._moreBar) {\n            g.show(this._moreBar);\n            this._view.animateCount = -1;\n            this._view.animateHeightThrottled();\n        }\n    ;\n    ;\n        return true;\n    };\n    n.prototype._footerShow = function() {\n        ((this._moreBar && g.hide(this._moreBar)));\n        return true;\n    };\n    e.exports = n;\n});\n__d(\"FacebarTypeaheadSelectAll\", [\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__requestAnimationFrame\");\n    function h(i) {\n        this._core = i.getCore();\n        this._listener = null;\n    };\n;\n    h.prototype.enable = function() {\n        var i = this._core.input;\n        this._listener = this._core.subscribe(\"JSBNG__focus\", function() {\n            g(function() {\n                i.selectInput();\n            }.bind(this));\n        }.bind(this));\n    };\n    h.prototype.disable = function() {\n        ((this._listener && this._core.unsubscribe(this._listener)));\n    };\n    e.exports = h;\n});\n__d(\"FacebarTypeaheadShortcut\", [\"KeyEventController\",\"Run\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyEventController\"), h = b(\"Run\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l) {\n        this._input = l.core.input;\n        this._view = l.view;\n        this._listener = null;\n    };\n;\n    k.prototype.enable = function() {\n        this._registerListener();\n    };\n    k.prototype._registerListener = function() {\n        g.registerKey(\"SLASH\", this._handleKeydown.bind(this));\n        h.onLeave(function() {\n            this._registerListener.bind(this).defer();\n        }.bind(this));\n    };\n    k.prototype._handleKeydown = function(l) {\n        this._view.setAutoSelect(true);\n        this._input.JSBNG__focus();\n        this._input.inform(\"shortcut\", {\n            shift: l.getModifiers().shift\n        });\n        return false;\n    };\n    i(k.prototype, {\n        disable: j\n    });\n    e.exports = k;\n});\n__d(\"FacebarTypeaheadSizeAdjuster\", [\"copyProperties\",\"createArrayFrom\",\"clip\",\"emptyFunction\",\"foldl\",\"Style\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"clip\"), j = b(\"emptyFunction\"), k = b(\"foldl\"), l = b(\"Style\"), m = b(\"Vector\"), n = 12, o = 20, p = 50, q = 200, r = 5;\n    function s(u) {\n        return m.getElementDimensions(u).x;\n    };\n;\n    function t(u) {\n        this._core = u.getCore();\n        this._view = this._core.view;\n        this._input = this._core.input;\n        this._cachedSizes = {\n        };\n        this._appliedSize = null;\n        this._defaultSize = this.getDefaultFontSize();\n        this._calculatedSize = this._defaultSize;\n        this._containerWidth = this.getContainerWidth();\n    };\n;\n    t.prototype.enable = function() {\n        this._input.subscribe(\"change\", this.adjustFontSize.bind(this));\n        this.adjustFontSize();\n    };\n    t.prototype.getContainerWidth = function() {\n        return m.getElementDimensions(this._input.getElement()).x;\n    };\n    t.prototype.getDefaultFontSize = function() {\n        var u = l.get(this._input.getElement(), \"font-size\"), v = /^([\\d\\.]+)px$/.exec(u), w = ((v && Number(v[1])));\n        return Math.max(n, Math.min(o, w));\n    };\n    t.prototype.calculateFontSize = function() {\n        var u = this.getTextWidth(), v = this._calculatedSize;\n        if (((u > ((this._containerWidth - p))))) {\n            v--;\n        }\n         else if (((u < ((this._containerWidth - q))))) {\n            v++;\n        }\n        \n    ;\n    ;\n        this._calculatedSize = i(v, n, this._defaultSize);\n        return this._calculatedSize;\n    };\n    t.prototype.getTextWidth = function() {\n        var u = ((this._calculatedSize + this.getValueKey()));\n        if (!this._cachedSizes.hasOwnProperty(u)) {\n            this._cachedSizes[u] = this.measureTextWidth();\n        }\n    ;\n    ;\n        return this._cachedSizes[u];\n    };\n    t.prototype.getValueKey = function() {\n        var u = this._core.getValue().getHash(), v = ((r * Math.floor(((u.length / r)))));\n        return u.substr(0, v);\n    };\n    t.prototype.measureTextWidth = function() {\n        var u = this._input.getRawInputElement().childNodes;\n        return k(function(v, w) {\n            return ((v + s(w)));\n        }, h(u), 0);\n    };\n    t.prototype.adjustFontSize = function() {\n        for (var u = 0; ((u < 10)); u++) {\n            var v = this.calculateFontSize();\n            if (((v != this._appliedSize))) {\n                this._appliedSize = v;\n                l.set(this._input.getElement(), \"font-size\", ((v + \"px\")));\n                l.set(this._view.JSBNG__content, \"font-size\", ((v + \"px\")));\n            }\n             else break;\n        ;\n        ;\n        };\n    ;\n    };\n    g(t.prototype, {\n        disable: j\n    });\n    e.exports = t;\n});\n__d(\"FacebarTypeaheadTourItem\", [\"cx\",\"DOM\",\"FacebarTypeaheadItem\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"FacebarTypeaheadItem\");\n    {\n        var fin221keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin221i = (0);\n        var j;\n        for (; (fin221i < fin221keys.length); (fin221i++)) {\n            ((j) = (fin221keys[fin221i]));\n            {\n                if (((i.hasOwnProperty(j) && ((j !== \"_metaprototype\"))))) {\n                    l[j] = i[j];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var k = ((((i === null)) ? null : i.prototype));\n    l.prototype = Object.create(k);\n    l.prototype.constructor = l;\n    l.__superConstructor__ = i;\n    function l(m) {\n        i.call(this, m);\n    };\n;\n    l.prototype.renderIcon = function() {\n        return h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__iconwrapper\"\n        }, h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__touricon\"\n        }));\n    };\n    l.prototype.renderSubtext = function() {\n        this.setVAlign(false);\n        return k.renderSubtext.call(this);\n    };\n    e.exports = l;\n});\n__d(\"FacebarTypeaheadTour\", [\"Arbiter\",\"AsyncRequest\",\"BrowseNUXController\",\"FacebarStructuredText\",\"FacebarTypeaheadTourItem\",\"copyProperties\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"BrowseNUXController\"), j = b(\"FacebarStructuredText\"), k = b(\"FacebarTypeaheadTourItem\"), l = b(\"copyProperties\"), m = b(\"fbt\");\n    function n(o) {\n        this._core = o.getCore();\n        this._view = this._core.view;\n        this._moreBar = null;\n        this._events = [];\n        this._subscriptions = [];\n        this._item = {\n            uid: \"tour\",\n            uri: \"#\",\n            structure: j.fromString(\"Take the tour\")\n        };\n    };\n;\n    n.prototype.enable = function() {\n        this._subscriptions = [g.subscribe(\"BrowseNUX/initialized\", this._initEvents.bind(this)),g.subscribe(\"BrowseNUX/starting\", this._removeEvents.bind(this)),g.subscribe(\"BrowseNUX/finished\", this._initEvents.bind(this)),];\n    };\n    n.prototype.disable = function() {\n        while (this._subscriptions.length) {\n            this._subscriptions.pop().unsubscribe();\n        ;\n        };\n    ;\n    };\n    n.prototype._initEvents = function() {\n        this._events = [this._view.subscribe(\"filter\", this._addTour.bind(this)),this._view.subscribe(\"beforeSelect\", this._beforeSelect.bind(this)),];\n        this._core.requery();\n    };\n    n.prototype._removeEvents = function() {\n        while (this._events.length) {\n            this._events.pop().unsubscribe();\n        ;\n        };\n    ;\n        this._core.requery();\n    };\n    n.prototype._isNullState = function() {\n        return this._core.input.getValue().isEmpty();\n    };\n    n.prototype._addTour = function(o, JSBNG__event) {\n        var p = JSBNG__event.results;\n        if (((((p.length === 0)) || !this._isNullState()))) {\n            return;\n        }\n    ;\n    ;\n        var q = new k(this._item);\n        q.setShouldRenderEducation(false);\n        this._moreBar = q.render();\n        var r = p.length;\n        while (((--r >= 0))) {\n            if (((p[r].removable === true))) {\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        p.splice(((r + 1)), 0, l(this._item, {\n            node: this._moreBar\n        }));\n    };\n    n.prototype._beforeSelect = function(o, JSBNG__event) {\n        if (((JSBNG__event.selected.node === this._moreBar))) {\n            i.showSearchBarTour();\n            return false;\n        }\n    ;\n    ;\n        new h(\"/ajax/browse/nux_addquery.php\").send();\n        return true;\n    };\n    e.exports = n;\n});\n__d(\"FacebarTypeaheadTrigger\", [\"copyProperties\",\"Arbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Arbiter\");\n    function i(j) {\n        this._typeahead = j;\n        this._core = j.getCore();\n        this._subscription = null;\n    };\n;\n    i.prototype.enable = function() {\n        this._subscription = h.subscribe(\"FacebarTrigger/select\", this._activateTrigger.bind(this));\n    };\n    i.prototype.disable = function() {\n        h.unsubscribe(this._subscription);\n    };\n    i.prototype._activateTrigger = function(j, k) {\n        var l = g({\n            type: \"grammar\",\n            uri: null,\n            structure: null\n        }, k);\n        if (!l.uri) {\n            this._core.open();\n            this._core.setQuery(l, false);\n        }\n         else this._core.executeQuery(l);\n    ;\n    ;\n    };\n    e.exports = i;\n});\n__d(\"FacebarTypeaheadGrammarItem\", [\"cx\",\"DOM\",\"FacebarTypeaheadItem\",\"FacebarTypeaheadToken\",\"FacebarTypeaheadEntityToken\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"FacebarTypeaheadItem\"), j = b(\"FacebarTypeaheadToken\"), k = b(\"FacebarTypeaheadEntityToken\"), l = b(\"fbt\");\n    {\n        var fin222keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin222i = (0);\n        var m;\n        for (; (fin222i < fin222keys.length); (fin222i++)) {\n            ((m) = (fin222keys[fin222i]));\n            {\n                if (((i.hasOwnProperty(m) && ((m !== \"_metaprototype\"))))) {\n                    o[m] = i[m];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var n = ((((i === null)) ? null : i.prototype));\n    o.prototype = Object.create(n);\n    o.prototype.constructor = o;\n    o.__superConstructor__ = i;\n    function o(p) {\n        i.call(this, p);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__queryitem\");\n    };\n;\n    o.prototype.renderIcon = function() {\n        if (this._result.photo) {\n            return h.create(\"img\", {\n                className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__entityicon\",\n                alt: \"\",\n                src: this._result.photo\n            });\n        }\n    ;\n    ;\n        return h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__iconwrapper\"\n        }, h.create(\"span\", {\n            className: this._result.icon_class\n        }));\n    };\n    o.prototype.renderSubtext = function() {\n        var p = this._result.decoration, q = this._result.ambiguity, r = ((q && q.text)), s = ((((p && p.entity)) || ((q && q.entity))));\n        if (r) {\n            return new j([r,]).render();\n        }\n         else if (s) {\n            this.setVAlign(false);\n            return new k(s).setDefaultText(\"user\", \"Person\").setLeadingMiddot(true).setLimit(2).render();\n        }\n        \n    ;\n    ;\n    };\n    e.exports = o;\n});\n__d(\"FacebarTypeaheadKeywordItem\", [\"cx\",\"FacebarTypeaheadGrammarItem\",\"FacebarTypeaheadToken\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"FacebarTypeaheadGrammarItem\"), i = b(\"FacebarTypeaheadToken\"), j = \"-cx-PUBLIC-fbFacebarTypeaheadToken__subtext\";\n    {\n        var fin223keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin223i = (0);\n        var k;\n        for (; (fin223i < fin223keys.length); (fin223i++)) {\n            ((k) = (fin223keys[fin223i]));\n            {\n                if (((h.hasOwnProperty(k) && ((k !== \"_metaprototype\"))))) {\n                    m[k] = h[k];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var l = ((((h === null)) ? null : h.prototype));\n    m.prototype = Object.create(l);\n    m.prototype.constructor = m;\n    m.__superConstructor__ = h;\n    function m(n) {\n        h.call(this, n);\n    };\n;\n    m.prototype.renderSubtext = function() {\n        var n = new i([\"Search\",], j);\n        return n.render();\n    };\n    e.exports = m;\n});\n__d(\"FacebarTypeaheadSponsoredEntityItem\", [\"AsyncRequest\",\"Bootloader\",\"JSBNG__CSS\",\"cx\",\"DOM\",\"emptyFunction\",\"JSBNG__Event\",\"HTML\",\"FacebarTypeaheadEntityItem\",\"FacebarTypeaheadToken\",\"tx\",\"TypeaheadSearchSponsored\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"JSBNG__CSS\"), j = b(\"cx\"), k = b(\"DOM\"), l = b(\"emptyFunction\"), m = b(\"JSBNG__Event\"), n = b(\"HTML\"), o = b(\"FacebarTypeaheadEntityItem\"), p = b(\"FacebarTypeaheadToken\"), q = b(\"tx\"), r = b(\"TypeaheadSearchSponsored\"), s = \"\\u00b7\";\n    {\n        var fin224keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin224i = (0);\n        var t;\n        for (; (fin224i < fin224keys.length); (fin224i++)) {\n            ((t) = (fin224keys[fin224i]));\n            {\n                if (((o.hasOwnProperty(t) && ((t !== \"_metaprototype\"))))) {\n                    v[t] = o[t];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var u = ((((o === null)) ? null : o.prototype));\n    v.prototype = Object.create(u);\n    v.prototype.constructor = v;\n    v.__superConstructor__ = o;\n    function v(w) {\n        o.call(this, w);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__entityitem\");\n    };\n;\n    v.prototype.renderSubtext = function() {\n        var w = this._result, x = w.category;\n        if (w.category.__html) {\n            x = k.getText(n(x).getRootNode());\n        }\n    ;\n    ;\n        var y = [];\n        y.push(q._(\"Sponsored {category}\", {\n            category: x\n        }));\n        y.push(this.getHideLink());\n        return new p(y).render();\n    };\n    v.prototype.render = function() {\n        var w = u.render.call(this);\n        i.addClass(w, \"-cx-PRIVATE-fbFacebarTypeaheadToken__sponsored\");\n        return w;\n    };\n    v.prototype.getHideLink = function() {\n        var w = k.create(\"a\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__report\",\n            href: \"#\",\n            title: \"Hide the ad\"\n        }, \"\\u2715\");\n        m.listen(w, \"click\", this.hideSponsoredResult.bind(this));\n        return w;\n    };\n    v.prototype.renderText = function() {\n        var w = u.renderText.call(this);\n        w.push(this.getSponsoredMessage());\n        return w;\n    };\n    v.prototype.getSponsoredMessage = function() {\n        if (this._result.s_message) {\n            return k.create(\"span\", {\n                className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__sponsoredmessage\"\n            }, [((((\" \" + s)) + \" \")),this._result.s_message,]);\n        }\n    ;\n    ;\n        return [];\n    };\n    v.prototype.hideSponsoredResult = function(JSBNG__event) {\n        r.hideAdResult(this._result.uid);\n        h.loadModules([\"AdsHidePoll\",\"Dialog\",], function(w, x) {\n            var y = new x().setModal(true).setTitle(\"Ad was hidden\").setButtons(x.CLOSE);\n            new w(y.getBody(), this._result.s_token).setShowTitle(false).setUndoHandler(function() {\n                r.undoHideAdResult(this._result.uid);\n                y.hide();\n            }.bind(this)).renderAsync(function() {\n                y.show();\n            });\n        }.bind(this));\n        new g(\"/ajax/ads/hide\").setData({\n            action: \"hide\",\n            impression: this._result.s_token\n        }).setMethod(\"post\").setHandler(l).send();\n    };\n    e.exports = v;\n});\n__d(\"FacebarTypeaheadWebSuggestionItem\", [\"cx\",\"DOM\",\"FacebarTypeaheadItem\",\"FacebarTypeaheadToken\",], function(a, b, c, d, e, f) {\n    var g = b(\"cx\"), h = b(\"DOM\"), i = b(\"FacebarTypeaheadItem\"), j = b(\"FacebarTypeaheadToken\"), k = {\n        EXACT_MATCH: 1,\n        BING: 2,\n        BING_POPULAR: 3,\n        WEBSUGGESTIONS_AS_KEYWORDS: 4\n    }, l = \"-cx-PUBLIC-fbFacebarTypeaheadToken__websuggestioninner\";\n    {\n        var fin225keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin225i = (0);\n        var m;\n        for (; (fin225i < fin225keys.length); (fin225i++)) {\n            ((m) = (fin225keys[fin225i]));\n            {\n                if (((i.hasOwnProperty(m) && ((m !== \"_metaprototype\"))))) {\n                    o[m] = i[m];\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    var n = ((((i === null)) ? null : i.prototype));\n    o.prototype = Object.create(n);\n    o.prototype.constructor = o;\n    o.__superConstructor__ = i;\n    function o(p) {\n        i.call(this, p);\n        this.addClass(\"-cx-PRIVATE-fbFacebarTypeaheadItem__queryitem\");\n    };\n;\n    o.prototype.renderIcon = function() {\n        return h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__iconwrapper\"\n        }, h.create(\"span\", {\n            className: \"-cx-PRIVATE-fbFacebarTypeaheadItem__webicon\"\n        }));\n    };\n    o.prototype.renderSubtext = function() {\n        if (this._result.isLockedWebSearchMode) {\n            return;\n        }\n    ;\n    ;\n        var p, q;\n        p = this._result.websuggestion_source;\n        var r = ((((p === k.WEBSUGGESTIONS_AS_KEYWORDS)) ? \"Search\" : ((((p === k.BING_POPULAR)) ? \"Popular Web Search\" : \"Web Search\"))));\n        q = new j([r,], l);\n        return q.render();\n    };\n    e.exports = o;\n});\n__d(\"FacebarTypeaheadRenderer\", [\"FacebarTypeaheadEntityItem\",\"FacebarTypeaheadGrammarItem\",\"FacebarTypeaheadKeywordItem\",\"FacebarTypeaheadWebSuggestionItem\",\"FacebarTypeaheadSponsoredEntityItem\",], function(a, b, c, d, e, f) {\n    var g = b(\"FacebarTypeaheadEntityItem\"), h = b(\"FacebarTypeaheadGrammarItem\"), i = b(\"FacebarTypeaheadKeywordItem\"), j = b(\"FacebarTypeaheadWebSuggestionItem\"), k = b(\"FacebarTypeaheadSponsoredEntityItem\"), l = {\n    };\n    function m(o) {\n        if (o.isSponsored) {\n            return new k(o);\n        }\n         else if (((o.type == \"websuggestion\"))) {\n            return new j(o);\n        }\n         else if (((o.results_set_type == \"browse_type_blended\"))) {\n            return new i(o);\n        }\n         else if (((o.type == \"grammar\"))) {\n            return new h(o);\n        }\n         else return new g(o)\n        \n        \n        \n    ;\n    };\n;\n    function n(o) {\n        var p = ((((!o.fetchType && !o.isSponsored)) && !o.isLockedWebSearchMode)), q = o.uid, r = ((p && l[q])), s = m(o);\n        if (!r) {\n            this.inform(\"renderingItem\", {\n                JSBNG__item: s,\n                result: o\n            });\n            r = s.render();\n            p = ((p && s.cacheable()));\n        }\n    ;\n    ;\n        var t = r;\n        if (p) {\n            l[q] = r;\n            t = r.cloneNode(true);\n        }\n    ;\n    ;\n        s.highlight(t);\n        return t;\n    };\n;\n    e.exports = n;\n});");
// 10600
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o102,o135);
// undefined
o135 = null;
// 10605
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o136,o138);
// undefined
o138 = null;
// 10610
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o140,o141);
// undefined
o141 = null;
// 10615
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o142,o143);
// undefined
o143 = null;
// 10620
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o144,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/QRKzqNeXwzk.js",o145);
// undefined
o144 = null;
// undefined
o145 = null;
// 11423
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o76,o105);
// undefined
o105 = null;
// 11426
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"nxD7O\",]);\n}\n;\n__d(\"ErrorDialog\", [\"Dialog\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\"), h = b(\"emptyFunction\"), i = {\n        showAsyncError: function(j) {\n            try {\n                return i.show(j.getErrorSummary(), j.getErrorDescription());\n            } catch (k) {\n                alert(j);\n            };\n        },\n        show: function(j, k, l, m) {\n            return (new g()).setTitle(j).setBody(k).setButtons([g.OK,]).setStackable(true).setModal(true).setHandler((l || h)).setButtonsMessage((m || \"\")).show();\n        }\n    };\n    e.exports = i;\n});\n__d(\"ScrollingPager\", [\"Arbiter\",\"copyProperties\",\"CSS\",\"OnVisible\",\"UIPagelet\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"OnVisible\"), k = b(\"UIPagelet\"), l = b(\"$\"), m = b(\"ge\"), n = {\n    };\n    function o(p, q, r, s) {\n        this.scroll_loader_id = p;\n        this.pagelet_src = q;\n        this.data = r;\n        this.options = (s || {\n        });\n        if (this.options.target_id) {\n            this.target_id = this.options.target_id;\n            this.options.append = true;\n        }\n         else this.target_id = p;\n    ;\n        this.scroll_area_id = this.options.scroll_area_id;\n        this.handler = null;\n    };\n    h(o, {\n        REGISTERED: \"ScrollingPager/registered\",\n        getInstance: function(p) {\n            return n[p];\n        }\n    });\n    h(o.prototype, {\n        setBuffer: function(p) {\n            this.options.buffer = p;\n            (this.onvisible && this.onvisible.setBuffer(p));\n        },\n        getBuffer: function() {\n            return this.options.buffer;\n        },\n        register: function() {\n            this.onvisible = new j(l(this.scroll_loader_id), this.getHandler(), false, this.options.buffer, false, m(this.scroll_area_id));\n            n[this.scroll_loader_id] = this;\n            g.inform(o.REGISTERED, {\n                id: this.scroll_loader_id\n            });\n        },\n        getInstance: function(p) {\n            return n[p];\n        },\n        getHandler: function() {\n            if (this.handler) {\n                return this.handler\n            };\n            function p(q) {\n                var r = m(this.scroll_loader_id);\n                if (!r) {\n                    this.onvisible.remove();\n                    return;\n                }\n            ;\n                i.addClass(r.firstChild, \"async_saving\");\n                var s = this.options.handler;\n                this.options.handler = function() {\n                    g.inform(\"ScrollingPager/loadingComplete\");\n                    (s && s.apply(null, arguments));\n                };\n                if (q) {\n                    this.data.pager_fired_on_init = true;\n                };\n                k.loadFromEndpoint(this.pagelet_src, this.target_id, this.data, this.options);\n            };\n            return p.bind(this);\n        },\n        setHandler: function(p) {\n            this.handler = p;\n        },\n        removeOnVisible: function() {\n            this.onvisible.remove();\n        },\n        checkBuffer: function() {\n            (this.onvisible && this.onvisible.checkBuffer());\n        }\n    });\n    e.exports = o;\n});\n__d(\"tidyEvent\", [\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = [];\n    function i() {\n        while (h.length) {\n            var k = h.shift();\n            if (k.remove) {\n                (k._handler && k.remove());\n            }\n             else (k && k.unsubscribe());\n        ;\n        };\n    };\n    function j(k) {\n        if (!h.length) {\n            g.onLeave(i);\n        };\n        if (Array.isArray(k)) {\n            h = h.concat(k);\n        }\n         else h.push(k);\n    ;\n        return k;\n    };\n    e.exports = j;\n});\n__d(\"TimelineConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DS_HEIGHT: \"timeline-unit-height\",\n        DS_LOADED: \"timeline-capsule-loaded\",\n        DS_SIDEORG: \"timeline-unit-sideorg\",\n        DS_TAILBALANCE: \"timeline-capsule-tailbalance\",\n        DS_COLUMN_HEIGHT_DIFFERENTIAL: \"timeline-column-diff-height\",\n        FIXED_SIDE_LEFT: \"left\",\n        FIXED_SIDE_RIGHT: \"right\",\n        FIXED_SIDE_BOTH: \"both\",\n        FIXED_SIDE_NONE: \"none\",\n        SCROLL_TO_OFFSET: 30,\n        SUBSECTION_SCROLL_TO_OFFSET: 90,\n        SCRUBBER_DEFAULT_OFFSET: 38,\n        SECTION_LOADING: \"TimelineConstants/sectionLoading\",\n        SECTION_LOADED: \"TimelineConstants/sectionLoaded\",\n        SECTION_FULLY_LOADED: \"TimelineConstants/sectionFullyLoaded\",\n        SECTION_REGISTERED: \"TimelineConstants/sectionRegistered\"\n    };\n    e.exports = g;\n});\n__d(\"TimelineLegacySections\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        get: function(i) {\n            return g[i];\n        },\n        getAll: function() {\n            return g;\n        },\n        remove: function(i) {\n            delete g[i];\n        },\n        removeAll: function() {\n            g = {\n            };\n        },\n        set: function(i, j) {\n            g[i] = j;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        TIMELINE_KEY: \"timeline\",\n        WALL_KEY: \"wall\",\n        parseURI: function(i) {\n            i = g(i);\n            var j = i.getQueryData(), k = i.getPath(), l = k.split(\"/\").slice(1);\n            if (((l[0] == \"people\") || (l[0] == \"pages\"))) {\n                l = l.slice(2);\n            };\n            var m = ((j.sk || l[1]) || h.TIMELINE_KEY);\n            if ((m == h.WALL_KEY)) {\n                m = h.TIMELINE_KEY;\n            };\n            var n = null, o = null;\n            if ((m == h.TIMELINE_KEY)) {\n                o = (parseInt(l[2], 10) || null);\n                n = (parseInt(l[3], 10) || null);\n            }\n        ;\n            return {\n                path: k,\n                id: (j.id || l[0]),\n                key: m,\n                viewas: (j.viewas ? j.viewas : 0),\n                filter: (j.filter ? j.filter : null),\n                year: o,\n                month: n,\n                friendship: !!j.and\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineController\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOMQuery\",\"Run\",\"ScrollingPager\",\"TidyArbiter\",\"TimelineConstants\",\"TimelineLegacySections\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"copyProperties\",\"ge\",\"tidyEvent\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOMQuery\"), l = b(\"Run\"), m = b(\"ScrollingPager\"), n = b(\"TidyArbiter\"), o = b(\"TimelineConstants\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineURI\"), r = b(\"Vector\"), s = b(\"ViewportBounds\"), t = b(\"$\"), u = b(\"copyProperties\"), v = b(\"ge\"), w = b(\"tidyEvent\"), x = b(\"queryThenMutateDOM\"), y = 358, z = 48, aa = 740, ba = 1285, ca = null, da = false, ea, fa, ga, ha = {\n    }, ia = {\n    }, ja = [], ka = null, la = null, ma = false, na = false, oa = 0, pa = false, qa = false, ra = false, sa = {\n    }, ta = false;\n    function ua() {\n        (ka && ka.remove());\n        ka = null;\n    };\n    function va(hb, ib, jb) {\n        jb = (jb || []);\n        if (ha[hb]) {\n            return ha[hb][ib].apply(ha[hb], jb)\n        };\n        ia[hb] = (ia[hb] || {\n        });\n        ia[hb][ib] = jb;\n        return false;\n    };\n    function wa() {\n        if (!(((pa || ra) || qa))) {\n            ua();\n            return;\n        }\n    ;\n        var hb = r.getScrollPosition();\n        pa = (pa && ab(v(\"rightCol\"), hb, \"paddingTop\", true));\n        qa = (qa && ab(t(\"pagelet_above_header_timeline\"), hb, \"top\"));\n        ra = (ra && ab(t(\"blueBar\"), hb, \"paddingTop\"));\n    };\n    var xa = 0;\n    function ya() {\n        xa = r.getScrollPosition();\n    };\n    function za() {\n        x(ya, function() {\n            var hb = ((oa === 0) || (xa.y >= oa));\n            va(gb.STICKY_HEADER, \"toggle\", [hb,]);\n            va(gb.CONTENT, \"checkCurrentSectionChange\");\n        }, \"TimelineController/scrollListener\");\n    };\n    function ab(hb, ib, jb, kb) {\n        if (!hb) {\n            ua();\n            return;\n        }\n    ;\n        if ((ib.y <= 0)) {\n            bb(hb, jb);\n            return false;\n        }\n         else {\n            var lb = (kb && gb.getCurrentScrubber());\n            if ((lb && i.hasClass(lb.getRoot(), \"fixed_elem\"))) {\n                bb(hb, jb);\n                return false;\n            }\n             else {\n                var mb = (parseInt(hb.style[jb], 10) || 0);\n                if ((ib.y < mb)) {\n                    i.addClass(hb, \"timeline_fixed\");\n                    hb.style[jb] = (ib.y + \"px\");\n                }\n                 else i.removeClass(hb, \"timeline_fixed\");\n            ;\n            }\n        ;\n        }\n    ;\n        return true;\n    };\n    function bb(hb, ib) {\n        hb.style[ib] = \"0px\";\n        i.removeClass(hb, \"timeline_fixed\");\n    };\n    function cb() {\n        x(gb.shouldShowWideAds, function() {\n            va(gb.ADS, \"adjustAdsType\", [ma,]);\n            va(gb.ADS, \"adjustAdsToFit\");\n            va(gb.CONTENT, \"adjustContentPadding\");\n            va(gb.STICKY_HEADER_NAV, \"adjustMenuHeights\");\n        }, \"TimelineController/resize\");\n    };\n    function db(hb, ib) {\n        if ((hb == \"sidebar/initialized\")) {\n            ta = true;\n        };\n        va(gb.ADS, \"adjustAdsType\", [gb.shouldShowWideAds(),]);\n    };\n    function eb(hb, ib) {\n        var jb = v(\"rightCol\");\n        if (jb) {\n            jb.style.paddingTop = (ib + \"px\");\n            pa = true;\n        }\n    ;\n        var kb = t(\"pagelet_above_header_timeline\");\n        if (kb.firstChild) {\n            t(\"above_header_timeline_placeholder\").style.height = (kb.offsetHeight + \"px\");\n            kb.style.top = (ib + \"px\");\n            qa = true;\n        }\n    ;\n        var lb = document.documentElement;\n        ra = ((lb.clientHeight < 400) || (lb.clientWidth < lb.scrollWidth));\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = (ib + \"px\");\n        };\n        ka = g.listen(window, \"scroll\", wa);\n        h.inform(\"reflow\");\n    };\n    function fb() {\n        while (ja.length) {\n            ja.pop().remove();;\n        };\n        for (var hb in ha) {\n            (ha[hb].reset && ha[hb].reset());;\n        };\n        ua();\n        ga.unsubscribe();\n        ga = null;\n        ca = null;\n        ea = null;\n        ha = {\n        };\n        ia = {\n        };\n        la = null;\n        na = false;\n        oa = 0;\n        qa = false;\n        if (pa) {\n            var ib = v(\"rightCol\");\n            if (ib) {\n                ib.style.paddingTop = \"\";\n                i.removeClass(ib, \"timeline_fixed\");\n            }\n        ;\n        }\n    ;\n        pa = false;\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = \"\";\n            i.removeClass(t(\"blueBar\"), \"timeline_fixed\");\n        }\n    ;\n        ra = false;\n        ta = false;\n        da = false;\n        j.purge(o.DS_HEIGHT);\n        j.purge(o.DS_LOADED);\n        j.purge(o.DS_SIDEORG);\n        j.purge(o.DS_TAILBALANCE);\n        j.purge(o.DS_COLUMN_HEIGHT_DIFFERENTIAL);\n    };\n    var gb = {\n        NAV: \"nav\",\n        STICKY_HEADER: \"sticky_header\",\n        STICKY_HEADER_NAV: \"sticky_header_nav\",\n        SCRUBBER: \"scrubber\",\n        CONTENT: \"content\",\n        ADS: \"ads\",\n        LOGGING: \"logging\",\n        init: function(hb, ib, jb) {\n            if (da) {\n                return\n            };\n            if ((ib == q.WALL_KEY)) {\n                ib = q.TIMELINE_KEY;\n            };\n            da = true;\n            ea = hb;\n            fa = jb.has_fixed_ads;\n            na = jb.one_column_minimal;\n            sa = {\n                allactivity: true,\n                approve: true\n            };\n            if (!na) {\n                u(sa, {\n                    games: true,\n                    map: true,\n                    music: true,\n                    video: true\n                });\n            };\n            sa[q.TIMELINE_KEY] = true;\n            va(gb.CONTENT, \"adjustContentPadding\");\n            ja.push(g.listen(window, \"scroll\", za), g.listen(window, \"resize\", cb));\n            ga = h.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], db);\n            w(n.subscribe(\"TimelineCover/coverCollapsed\", eb));\n            l.onLeave(fb);\n            gb.registerCurrentKey(ib);\n        },\n        setAdsTracking: function(hb) {\n            va(gb.ADS, \"start\", [hb,]);\n        },\n        pageHasScrubber: function(hb) {\n            return ((!hb || ((!na && hb.match(/^(og_)?app_/)))) || ((hb in sa)));\n        },\n        fixedAds: function() {\n            return fa;\n        },\n        registerCurrentKey: function(hb) {\n            ca = hb;\n            la = (((hb !== \"map\") && (r.getViewportDimensions().y < aa)) && gb.pageHasScrubber(hb));\n            la = (la || t(\"blueBar\").offsetTop);\n            va(gb.ADS, \"setShortMode\", [la,]);\n            va(gb.ADS, \"updateCurrentKey\", [hb,]);\n            oa = ((hb == q.TIMELINE_KEY) ? (y - z) : 0);\n        },\n        getCurrentKey: function() {\n            return ca;\n        },\n        getCurrentScrubber: function() {\n            return ha[gb.SCRUBBER];\n        },\n        getCurrentStickyHeaderNav: function() {\n            return ha[gb.STICKY_HEADER_NAV];\n        },\n        scrubberHasLoaded: function(hb) {\n            i.conditionClass(hb.getRoot(), \"fixed_elem\", !la);\n            va(gb.ADS, \"registerScrubber\", [hb,]);\n        },\n        scrubberHasChangedState: function() {\n            va(gb.ADS, \"adjustAdsToFit\");\n        },\n        scrubberWasClicked: function(hb) {\n            va(gb.LOGGING, \"logScrubberClick\", [hb,]);\n        },\n        stickyHeaderNavWasClicked: function(hb) {\n            va(gb.LOGGING, \"logStickyHeaderNavClick\", [hb,]);\n        },\n        sectionHasChanged: function(hb, ib) {\n            va(gb.STICKY_HEADER_NAV, \"updateSection\", [hb,ib,]);\n            va(gb.SCRUBBER, \"updateSection\", [hb,ib,]);\n            va(gb.ADS, \"loadAdsIfEnoughTimePassed\");\n            va(gb.LOGGING, \"logSectionChange\", [hb,ib,]);\n        },\n        navigateToSection: function(hb) {\n            va(gb.CONTENT, \"navigateToSection\", [hb,]);\n        },\n        shouldShowWideAds: function() {\n            if (!ta) {\n                ma = false;\n            }\n             else {\n                var hb = ((ba + s.getRight()) + s.getLeft());\n                ma = (r.getViewportDimensions().x >= hb);\n            }\n        ;\n            return ma;\n        },\n        sidebarInitialized: function() {\n            return ta;\n        },\n        adjustStickyHeaderWidth: function() {\n            va(gb.STICKY_HEADER, \"adjustWidth\");\n        },\n        isOneColumnMinimal: function() {\n            return na;\n        },\n        register: function(hb, ib) {\n            ha[hb] = ib;\n            if (ia[hb]) {\n                for (var jb in ia[hb]) {\n                    va(hb, jb, ia[hb][jb]);;\n                };\n                delete ia[hb];\n            }\n        ;\n        },\n        adjustScrollingPagerBuffer: function(hb, ib) {\n            var jb = j.get(o.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib);\n            if (!jb) {\n                return\n            };\n            var kb = m.getInstance(hb);\n            (kb && kb.setBuffer((kb.getBuffer() + Math.abs(jb))));\n        },\n        runOnceWhenSectionFullyLoaded: function(hb, ib, jb) {\n            var kb = p.get(ib);\n            if (kb) {\n                var lb = false;\n                k.scry(kb.node, \".fbTimelineCapsule\").forEach(function(nb) {\n                    if ((!lb && (parseInt(j.get(o.DS_LOADED, nb.id), 10) >= parseInt(jb, 10)))) {\n                        hb();\n                        lb = true;\n                    }\n                ;\n                });\n                if (lb) {\n                    return\n                };\n            }\n        ;\n            var mb = h.subscribe(o.SECTION_FULLY_LOADED, function(nb, ob) {\n                if (((ob.scrubberKey === ib) && (ob.pageIndex === jb))) {\n                    hb();\n                    mb.unsubscribe();\n                }\n            ;\n            });\n        },\n        unrankedWasClicked: function() {\n            va(gb.LOGGING, \"logUnrankedClick\");\n        }\n    };\n    e.exports = gb;\n});\n__d(\"TimelineSmartInsert\", [\"Run\",\"UserAgent\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = b(\"UserAgent\"), i = b(\"Vector\"), j = 100;\n    function k(q) {\n        if ((q === \"viewport\")) {\n            return i.getViewportDimensions().y\n        };\n        return q;\n    };\n    var l = false, m = false;\n    function n() {\n        if (m) {\n            return\n        };\n        g.onLeave(o);\n        m = true;\n    };\n    function o() {\n        l = false;\n        m = false;\n    };\n    var p = {\n        run: function(q, r, s) {\n            n();\n            if ((!l || (h.ie() <= 8))) {\n                r();\n                return;\n            }\n        ;\n            var t = q.offsetHeight;\n            r();\n            var u = q.offsetHeight, v = i.getScrollPosition().y, w = i.getElementPosition(q).y;\n            if ((((u !== t) && (w < v)) && ((w + t) < (v + k((s || j)))))) {\n                window.scrollBy(0, (u - t));\n            };\n        },\n        enable: function() {\n            l = true;\n        }\n    };\n    e.exports = p;\n});\n__d(\"legacy:ui-scrolling-pager-js\", [\"ScrollingPager\",], function(a, b, c, d) {\n    a.ScrollingPager = b(\"ScrollingPager\");\n}, 3);\n__d(\"ButtonGroup\", [\"function-extensions\",\"copyProperties\",\"createArrayFrom\",\"CSS\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = \"firstItem\", m = \"lastItem\";\n    function n(s, t) {\n        var u = k.byClass(s, t);\n        if (!u) {\n            throw new Error(\"invalid use case\")\n        };\n        return u;\n    };\n    function o(s) {\n        return (i.shown(s) && h(s.childNodes).some(i.shown));\n    };\n    function p(s) {\n        var t, u, v;\n        h(s.childNodes).forEach(function(w) {\n            v = o(w);\n            i.removeClass(w, l);\n            i.removeClass(w, m);\n            i.conditionShow(w, v);\n            if (v) {\n                t = (t || w);\n                u = w;\n            }\n        ;\n        });\n        (t && i.addClass(t, l));\n        (u && i.addClass(u, m));\n        i.conditionShow(s, t);\n    };\n    function q(s, t) {\n        var u = n(t, \"uiButtonGroupItem\");\n        s(u);\n        p(u.parentNode);\n    };\n    function r(s) {\n        this._root = n(s, \"uiButtonGroup\");\n        j.set(this._root, \"ButtonGroup\", this);\n        p(this._root);\n    };\n    r.getInstance = function(s) {\n        var t = n(s, \"uiButtonGroup\"), u = j.get(t, \"ButtonGroup\");\n        return (u || new r(t));\n    };\n    g(r.prototype, {\n        hideItem: q.curry(i.hide),\n        showItem: q.curry(i.show),\n        toggleItem: q.curry(i.toggle)\n    });\n    e.exports = r;\n});\n__d(\"ButtonGroupMonitor\", [\"ContextualDialog\",\"ContextualLayer\",\"CSS\",\"Layer\",\"Parent\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualDialog\"), h = b(\"ContextualLayer\"), i = b(\"CSS\"), j = b(\"Layer\"), k = b(\"Parent\"), l = b(\"SelectorDeprecated\");\n    function m(n) {\n        var o = (k.byClass(n, \"bg_stat_elem\") || k.byClass(n, \"uiButtonGroup\"));\n        (o && i.toggleClass(o, \"uiButtonGroupActive\"));\n    };\n    j.subscribe([\"hide\",\"show\",], function(n, o) {\n        if (((o instanceof h) || (o instanceof g))) {\n            m(o.getCausalElement());\n        };\n    });\n    l.subscribe([\"close\",\"open\",], function(n, o) {\n        m(o.selector);\n    });\n});");
// 11427
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s6991863287b13869d6a8454747dc5da9967b0056");
// 11428
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"nxD7O\",]);\n}\n;\n;\n__d(\"ErrorDialog\", [\"Dialog\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\"), h = b(\"emptyFunction\"), i = {\n        showAsyncError: function(j) {\n            try {\n                return i.show(j.getErrorSummary(), j.getErrorDescription());\n            } catch (k) {\n                JSBNG__alert(j);\n            };\n        ;\n        },\n        show: function(j, k, l, m) {\n            return (new g()).setTitle(j).setBody(k).setButtons([g.OK,]).setStackable(true).setModal(true).setHandler(((l || h))).setButtonsMessage(((m || \"\"))).show();\n        }\n    };\n    e.exports = i;\n});\n__d(\"ScrollingPager\", [\"Arbiter\",\"copyProperties\",\"JSBNG__CSS\",\"OnVisible\",\"UIPagelet\",\"$\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"JSBNG__CSS\"), j = b(\"OnVisible\"), k = b(\"UIPagelet\"), l = b(\"$\"), m = b(\"ge\"), n = {\n    };\n    function o(p, q, r, s) {\n        this.scroll_loader_id = p;\n        this.pagelet_src = q;\n        this.data = r;\n        this.options = ((s || {\n        }));\n        if (this.options.target_id) {\n            this.target_id = this.options.target_id;\n            this.options.append = true;\n        }\n         else this.target_id = p;\n    ;\n    ;\n        this.scroll_area_id = this.options.scroll_area_id;\n        this.handler = null;\n    };\n;\n    h(o, {\n        REGISTERED: \"ScrollingPager/registered\",\n        getInstance: function(p) {\n            return n[p];\n        }\n    });\n    h(o.prototype, {\n        setBuffer: function(p) {\n            this.options.buffer = p;\n            ((this.onvisible && this.onvisible.setBuffer(p)));\n        },\n        getBuffer: function() {\n            return this.options.buffer;\n        },\n        register: function() {\n            this.onvisible = new j(l(this.scroll_loader_id), this.getHandler(), false, this.options.buffer, false, m(this.scroll_area_id));\n            n[this.scroll_loader_id] = this;\n            g.inform(o.REGISTERED, {\n                id: this.scroll_loader_id\n            });\n        },\n        getInstance: function(p) {\n            return n[p];\n        },\n        getHandler: function() {\n            if (this.handler) {\n                return this.handler;\n            }\n        ;\n        ;\n            function p(q) {\n                var r = m(this.scroll_loader_id);\n                if (!r) {\n                    this.onvisible.remove();\n                    return;\n                }\n            ;\n            ;\n                i.addClass(r.firstChild, \"async_saving\");\n                var s = this.options.handler;\n                this.options.handler = function() {\n                    g.inform(\"ScrollingPager/loadingComplete\");\n                    ((s && s.apply(null, arguments)));\n                };\n                if (q) {\n                    this.data.pager_fired_on_init = true;\n                }\n            ;\n            ;\n                k.loadFromEndpoint(this.pagelet_src, this.target_id, this.data, this.options);\n            };\n        ;\n            return p.bind(this);\n        },\n        setHandler: function(p) {\n            this.handler = p;\n        },\n        removeOnVisible: function() {\n            this.onvisible.remove();\n        },\n        checkBuffer: function() {\n            ((this.onvisible && this.onvisible.checkBuffer()));\n        }\n    });\n    e.exports = o;\n});\n__d(\"tidyEvent\", [\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = [];\n    function i() {\n        while (h.length) {\n            var k = h.shift();\n            if (k.remove) {\n                ((k._handler && k.remove()));\n            }\n             else ((k && k.unsubscribe()));\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function j(k) {\n        if (!h.length) {\n            g.onLeave(i);\n        }\n    ;\n    ;\n        if (Array.isArray(k)) {\n            h = h.concat(k);\n        }\n         else h.push(k);\n    ;\n    ;\n        return k;\n    };\n;\n    e.exports = j;\n});\n__d(\"TimelineConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        DS_HEIGHT: \"timeline-unit-height\",\n        DS_LOADED: \"timeline-capsule-loaded\",\n        DS_SIDEORG: \"timeline-unit-sideorg\",\n        DS_TAILBALANCE: \"timeline-capsule-tailbalance\",\n        DS_COLUMN_HEIGHT_DIFFERENTIAL: \"timeline-column-diff-height\",\n        FIXED_SIDE_LEFT: \"left\",\n        FIXED_SIDE_RIGHT: \"right\",\n        FIXED_SIDE_BOTH: \"both\",\n        FIXED_SIDE_NONE: \"none\",\n        SCROLL_TO_OFFSET: 30,\n        SUBSECTION_SCROLL_TO_OFFSET: 90,\n        SCRUBBER_DEFAULT_OFFSET: 38,\n        SECTION_LOADING: \"TimelineConstants/sectionLoading\",\n        SECTION_LOADED: \"TimelineConstants/sectionLoaded\",\n        SECTION_FULLY_LOADED: \"TimelineConstants/sectionFullyLoaded\",\n        SECTION_REGISTERED: \"TimelineConstants/sectionRegistered\"\n    };\n    e.exports = g;\n});\n__d(\"TimelineLegacySections\", [], function(a, b, c, d, e, f) {\n    var g = {\n    }, h = {\n        get: function(i) {\n            return g[i];\n        },\n        getAll: function() {\n            return g;\n        },\n        remove: function(i) {\n            delete g[i];\n        },\n        removeAll: function() {\n            g = {\n            };\n        },\n        set: function(i, j) {\n            g[i] = j;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineURI\", [\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = {\n        TIMELINE_KEY: \"timeline\",\n        WALL_KEY: \"wall\",\n        parseURI: function(i) {\n            i = g(i);\n            var j = i.getQueryData(), k = i.getPath(), l = k.split(\"/\").slice(1);\n            if (((((l[0] == \"people\")) || ((l[0] == \"pages\"))))) {\n                l = l.slice(2);\n            }\n        ;\n        ;\n            var m = ((((j.sk || l[1])) || h.TIMELINE_KEY));\n            if (((m == h.WALL_KEY))) {\n                m = h.TIMELINE_KEY;\n            }\n        ;\n        ;\n            var n = null, o = null;\n            if (((m == h.TIMELINE_KEY))) {\n                o = ((parseInt(l[2], 10) || null));\n                n = ((parseInt(l[3], 10) || null));\n            }\n        ;\n        ;\n            return {\n                path: k,\n                id: ((j.id || l[0])),\n                key: m,\n                viewas: ((j.viewas ? j.viewas : 0)),\n                filter: ((j.filter ? j.filter : null)),\n                year: o,\n                month: n,\n                friendship: !!j.and\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineController\", [\"JSBNG__Event\",\"Arbiter\",\"JSBNG__CSS\",\"DataStore\",\"DOMQuery\",\"Run\",\"ScrollingPager\",\"TidyArbiter\",\"TimelineConstants\",\"TimelineLegacySections\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"copyProperties\",\"ge\",\"tidyEvent\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DataStore\"), k = b(\"DOMQuery\"), l = b(\"Run\"), m = b(\"ScrollingPager\"), n = b(\"TidyArbiter\"), o = b(\"TimelineConstants\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineURI\"), r = b(\"Vector\"), s = b(\"ViewportBounds\"), t = b(\"$\"), u = b(\"copyProperties\"), v = b(\"ge\"), w = b(\"tidyEvent\"), x = b(\"queryThenMutateDOM\"), y = 358, z = 48, aa = 740, ba = 1285, ca = null, da = false, ea, fa, ga, ha = {\n    }, ia = {\n    }, ja = [], ka = null, la = null, ma = false, na = false, oa = 0, pa = false, qa = false, ra = false, sa = {\n    }, ta = false;\n    function ua() {\n        ((ka && ka.remove()));\n        ka = null;\n    };\n;\n    function va(hb, ib, jb) {\n        jb = ((jb || []));\n        if (ha[hb]) {\n            return ha[hb][ib].apply(ha[hb], jb);\n        }\n    ;\n    ;\n        ia[hb] = ((ia[hb] || {\n        }));\n        ia[hb][ib] = jb;\n        return false;\n    };\n;\n    function wa() {\n        if (!((((pa || ra)) || qa))) {\n            ua();\n            return;\n        }\n    ;\n    ;\n        var hb = r.getScrollPosition();\n        pa = ((pa && ab(v(\"rightCol\"), hb, \"paddingTop\", true)));\n        qa = ((qa && ab(t(\"pagelet_above_header_timeline\"), hb, \"JSBNG__top\")));\n        ra = ((ra && ab(t(\"blueBar\"), hb, \"paddingTop\")));\n    };\n;\n    var xa = 0;\n    function ya() {\n        xa = r.getScrollPosition();\n    };\n;\n    function za() {\n        x(ya, function() {\n            var hb = ((((oa === 0)) || ((xa.y >= oa))));\n            va(gb.STICKY_HEADER, \"toggle\", [hb,]);\n            va(gb.CONTENT, \"checkCurrentSectionChange\");\n        }, \"TimelineController/scrollListener\");\n    };\n;\n    function ab(hb, ib, jb, kb) {\n        if (!hb) {\n            ua();\n            return;\n        }\n    ;\n    ;\n        if (((ib.y <= 0))) {\n            bb(hb, jb);\n            return false;\n        }\n         else {\n            var lb = ((kb && gb.getCurrentScrubber()));\n            if (((lb && i.hasClass(lb.getRoot(), \"fixed_elem\")))) {\n                bb(hb, jb);\n                return false;\n            }\n             else {\n                var mb = ((parseInt(hb.style[jb], 10) || 0));\n                if (((ib.y < mb))) {\n                    i.addClass(hb, \"timeline_fixed\");\n                    hb.style[jb] = ((ib.y + \"px\"));\n                }\n                 else i.removeClass(hb, \"timeline_fixed\");\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function bb(hb, ib) {\n        hb.style[ib] = \"0px\";\n        i.removeClass(hb, \"timeline_fixed\");\n    };\n;\n    function cb() {\n        x(gb.shouldShowWideAds, function() {\n            va(gb.ADS, \"adjustAdsType\", [ma,]);\n            va(gb.ADS, \"adjustAdsToFit\");\n            va(gb.CONTENT, \"adjustContentPadding\");\n            va(gb.STICKY_HEADER_NAV, \"adjustMenuHeights\");\n        }, \"TimelineController/resize\");\n    };\n;\n    function db(hb, ib) {\n        if (((hb == \"sidebar/initialized\"))) {\n            ta = true;\n        }\n    ;\n    ;\n        va(gb.ADS, \"adjustAdsType\", [gb.shouldShowWideAds(),]);\n    };\n;\n    function eb(hb, ib) {\n        var jb = v(\"rightCol\");\n        if (jb) {\n            jb.style.paddingTop = ((ib + \"px\"));\n            pa = true;\n        }\n    ;\n    ;\n        var kb = t(\"pagelet_above_header_timeline\");\n        if (kb.firstChild) {\n            t(\"above_header_timeline_placeholder\").style.height = ((kb.offsetHeight + \"px\"));\n            kb.style.JSBNG__top = ((ib + \"px\"));\n            qa = true;\n        }\n    ;\n    ;\n        var lb = JSBNG__document.documentElement;\n        ra = ((((lb.clientHeight < 400)) || ((lb.clientWidth < lb.scrollWidth))));\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = ((ib + \"px\"));\n        }\n    ;\n    ;\n        ka = g.listen(window, \"JSBNG__scroll\", wa);\n        h.inform(\"reflow\");\n    };\n;\n    function fb() {\n        while (ja.length) {\n            ja.pop().remove();\n        ;\n        };\n    ;\n        {\n            var fin226keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin226i = (0);\n            var hb;\n            for (; (fin226i < fin226keys.length); (fin226i++)) {\n                ((hb) = (fin226keys[fin226i]));\n                {\n                    ((ha[hb].reset && ha[hb].reset()));\n                ;\n                };\n            };\n        };\n    ;\n        ua();\n        ga.unsubscribe();\n        ga = null;\n        ca = null;\n        ea = null;\n        ha = {\n        };\n        ia = {\n        };\n        la = null;\n        na = false;\n        oa = 0;\n        qa = false;\n        if (pa) {\n            var ib = v(\"rightCol\");\n            if (ib) {\n                ib.style.paddingTop = \"\";\n                i.removeClass(ib, \"timeline_fixed\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        pa = false;\n        if (ra) {\n            t(\"blueBar\").style.paddingTop = \"\";\n            i.removeClass(t(\"blueBar\"), \"timeline_fixed\");\n        }\n    ;\n    ;\n        ra = false;\n        ta = false;\n        da = false;\n        j.purge(o.DS_HEIGHT);\n        j.purge(o.DS_LOADED);\n        j.purge(o.DS_SIDEORG);\n        j.purge(o.DS_TAILBALANCE);\n        j.purge(o.DS_COLUMN_HEIGHT_DIFFERENTIAL);\n    };\n;\n    var gb = {\n        NAV: \"nav\",\n        STICKY_HEADER: \"sticky_header\",\n        STICKY_HEADER_NAV: \"sticky_header_nav\",\n        SCRUBBER: \"scrubber\",\n        CONTENT: \"JSBNG__content\",\n        ADS: \"ads\",\n        LOGGING: \"logging\",\n        init: function(hb, ib, jb) {\n            if (da) {\n                return;\n            }\n        ;\n        ;\n            if (((ib == q.WALL_KEY))) {\n                ib = q.TIMELINE_KEY;\n            }\n        ;\n        ;\n            da = true;\n            ea = hb;\n            fa = jb.has_fixed_ads;\n            na = jb.one_column_minimal;\n            sa = {\n                allactivity: true,\n                approve: true\n            };\n            if (!na) {\n                u(sa, {\n                    games: true,\n                    map: true,\n                    music: true,\n                    video: true\n                });\n            }\n        ;\n        ;\n            sa[q.TIMELINE_KEY] = true;\n            va(gb.CONTENT, \"adjustContentPadding\");\n            ja.push(g.listen(window, \"JSBNG__scroll\", za), g.listen(window, \"resize\", cb));\n            ga = h.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], db);\n            w(n.subscribe(\"TimelineCover/coverCollapsed\", eb));\n            l.onLeave(fb);\n            gb.registerCurrentKey(ib);\n        },\n        setAdsTracking: function(hb) {\n            va(gb.ADS, \"start\", [hb,]);\n        },\n        pageHasScrubber: function(hb) {\n            return ((((!hb || ((!na && hb.match(/^(og_)?app_/))))) || ((hb in sa))));\n        },\n        fixedAds: function() {\n            return fa;\n        },\n        registerCurrentKey: function(hb) {\n            ca = hb;\n            la = ((((((hb !== \"map\")) && ((r.getViewportDimensions().y < aa)))) && gb.pageHasScrubber(hb)));\n            la = ((la || t(\"blueBar\").offsetTop));\n            va(gb.ADS, \"setShortMode\", [la,]);\n            va(gb.ADS, \"updateCurrentKey\", [hb,]);\n            oa = ((((hb == q.TIMELINE_KEY)) ? ((y - z)) : 0));\n        },\n        getCurrentKey: function() {\n            return ca;\n        },\n        getCurrentScrubber: function() {\n            return ha[gb.SCRUBBER];\n        },\n        getCurrentStickyHeaderNav: function() {\n            return ha[gb.STICKY_HEADER_NAV];\n        },\n        scrubberHasLoaded: function(hb) {\n            i.conditionClass(hb.getRoot(), \"fixed_elem\", !la);\n            va(gb.ADS, \"registerScrubber\", [hb,]);\n        },\n        scrubberHasChangedState: function() {\n            va(gb.ADS, \"adjustAdsToFit\");\n        },\n        scrubberWasClicked: function(hb) {\n            va(gb.LOGGING, \"logScrubberClick\", [hb,]);\n        },\n        stickyHeaderNavWasClicked: function(hb) {\n            va(gb.LOGGING, \"logStickyHeaderNavClick\", [hb,]);\n        },\n        sectionHasChanged: function(hb, ib) {\n            va(gb.STICKY_HEADER_NAV, \"updateSection\", [hb,ib,]);\n            va(gb.SCRUBBER, \"updateSection\", [hb,ib,]);\n            va(gb.ADS, \"loadAdsIfEnoughTimePassed\");\n            va(gb.LOGGING, \"logSectionChange\", [hb,ib,]);\n        },\n        navigateToSection: function(hb) {\n            va(gb.CONTENT, \"navigateToSection\", [hb,]);\n        },\n        shouldShowWideAds: function() {\n            if (!ta) {\n                ma = false;\n            }\n             else {\n                var hb = ((((ba + s.getRight())) + s.getLeft()));\n                ma = ((r.getViewportDimensions().x >= hb));\n            }\n        ;\n        ;\n            return ma;\n        },\n        sidebarInitialized: function() {\n            return ta;\n        },\n        adjustStickyHeaderWidth: function() {\n            va(gb.STICKY_HEADER, \"adjustWidth\");\n        },\n        isOneColumnMinimal: function() {\n            return na;\n        },\n        register: function(hb, ib) {\n            ha[hb] = ib;\n            if (ia[hb]) {\n                {\n                    var fin227keys = ((window.top.JSBNG_Replay.forInKeys)((ia[hb]))), fin227i = (0);\n                    var jb;\n                    for (; (fin227i < fin227keys.length); (fin227i++)) {\n                        ((jb) = (fin227keys[fin227i]));\n                        {\n                            va(hb, jb, ia[hb][jb]);\n                        ;\n                        };\n                    };\n                };\n            ;\n                delete ia[hb];\n            }\n        ;\n        ;\n        },\n        adjustScrollingPagerBuffer: function(hb, ib) {\n            var jb = j.get(o.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib);\n            if (!jb) {\n                return;\n            }\n        ;\n        ;\n            var kb = m.getInstance(hb);\n            ((kb && kb.setBuffer(((kb.getBuffer() + Math.abs(jb))))));\n        },\n        runOnceWhenSectionFullyLoaded: function(hb, ib, jb) {\n            var kb = p.get(ib);\n            if (kb) {\n                var lb = false;\n                k.scry(kb.node, \".fbTimelineCapsule\").forEach(function(nb) {\n                    if (((!lb && ((parseInt(j.get(o.DS_LOADED, nb.id), 10) >= parseInt(jb, 10)))))) {\n                        hb();\n                        lb = true;\n                    }\n                ;\n                ;\n                });\n                if (lb) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var mb = h.subscribe(o.SECTION_FULLY_LOADED, function(nb, ob) {\n                if (((((ob.scrubberKey === ib)) && ((ob.pageIndex === jb))))) {\n                    hb();\n                    mb.unsubscribe();\n                }\n            ;\n            ;\n            });\n        },\n        unrankedWasClicked: function() {\n            va(gb.LOGGING, \"logUnrankedClick\");\n        }\n    };\n    e.exports = gb;\n});\n__d(\"TimelineSmartInsert\", [\"Run\",\"UserAgent\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"Run\"), h = b(\"UserAgent\"), i = b(\"Vector\"), j = 100;\n    function k(q) {\n        if (((q === \"viewport\"))) {\n            return i.getViewportDimensions().y;\n        }\n    ;\n    ;\n        return q;\n    };\n;\n    var l = false, m = false;\n    function n() {\n        if (m) {\n            return;\n        }\n    ;\n    ;\n        g.onLeave(o);\n        m = true;\n    };\n;\n    function o() {\n        l = false;\n        m = false;\n    };\n;\n    var p = {\n        run: function(q, r, s) {\n            n();\n            if (((!l || ((h.ie() <= 8))))) {\n                r();\n                return;\n            }\n        ;\n        ;\n            var t = q.offsetHeight;\n            r();\n            var u = q.offsetHeight, v = i.getScrollPosition().y, w = i.getElementPosition(q).y;\n            if (((((((u !== t)) && ((w < v)))) && ((((w + t)) < ((v + k(((s || j)))))))))) {\n                window.JSBNG__scrollBy(0, ((u - t)));\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            l = true;\n        }\n    };\n    e.exports = p;\n});\n__d(\"legacy:ui-scrolling-pager-js\", [\"ScrollingPager\",], function(a, b, c, d) {\n    a.ScrollingPager = b(\"ScrollingPager\");\n}, 3);\n__d(\"ButtonGroup\", [\"function-extensions\",\"copyProperties\",\"createArrayFrom\",\"JSBNG__CSS\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"copyProperties\"), h = b(\"createArrayFrom\"), i = b(\"JSBNG__CSS\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = \"firstItem\", m = \"lastItem\";\n    function n(s, t) {\n        var u = k.byClass(s, t);\n        if (!u) {\n            throw new Error(\"invalid use case\");\n        }\n    ;\n    ;\n        return u;\n    };\n;\n    function o(s) {\n        return ((i.shown(s) && h(s.childNodes).some(i.shown)));\n    };\n;\n    function p(s) {\n        var t, u, v;\n        h(s.childNodes).forEach(function(w) {\n            v = o(w);\n            i.removeClass(w, l);\n            i.removeClass(w, m);\n            i.conditionShow(w, v);\n            if (v) {\n                t = ((t || w));\n                u = w;\n            }\n        ;\n        ;\n        });\n        ((t && i.addClass(t, l)));\n        ((u && i.addClass(u, m)));\n        i.conditionShow(s, t);\n    };\n;\n    function q(s, t) {\n        var u = n(t, \"uiButtonGroupItem\");\n        s(u);\n        p(u.parentNode);\n    };\n;\n    function r(s) {\n        this._root = n(s, \"uiButtonGroup\");\n        j.set(this._root, \"ButtonGroup\", this);\n        p(this._root);\n    };\n;\n    r.getInstance = function(s) {\n        var t = n(s, \"uiButtonGroup\"), u = j.get(t, \"ButtonGroup\");\n        return ((u || new r(t)));\n    };\n    g(r.prototype, {\n        hideItem: q.curry(i.hide),\n        showItem: q.curry(i.show),\n        toggleItem: q.curry(i.toggle)\n    });\n    e.exports = r;\n});\n__d(\"ButtonGroupMonitor\", [\"ContextualDialog\",\"ContextualLayer\",\"JSBNG__CSS\",\"Layer\",\"Parent\",\"SelectorDeprecated\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualDialog\"), h = b(\"ContextualLayer\"), i = b(\"JSBNG__CSS\"), j = b(\"Layer\"), k = b(\"Parent\"), l = b(\"SelectorDeprecated\");\n    function m(n) {\n        var o = ((k.byClass(n, \"bg_stat_elem\") || k.byClass(n, \"uiButtonGroup\")));\n        ((o && i.toggleClass(o, \"uiButtonGroupActive\")));\n    };\n;\n    j.subscribe([\"hide\",\"show\",], function(n, o) {\n        if (((((o instanceof h)) || ((o instanceof g))))) {\n            m(o.getCausalElement());\n        }\n    ;\n    ;\n    });\n    l.subscribe([\"close\",\"open\",], function(n, o) {\n        m(o.selector);\n    });\n});");
// 11513
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o27,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y3/r/8VWsK8lNjX5.js",o123);
// undefined
o27 = null;
// undefined
o123 = null;
// 11534
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_413[0](false);
// 11564
fpc.call(JSBNG_Replay.s5f7fb1571d9ddaabf0918a66ba121ad96869441c_256[0], o124,undefined);
// undefined
o124 = null;
// 11770
fpc.call(JSBNG_Replay.s1da4c91f736d950de61ac9962e5a050e9ae4a4ed_104[0], o118,undefined);
// undefined
o118 = null;
// 11771
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 11778
o19.readyState = 2;
// 11776
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o136,o125);
// undefined
o125 = null;
// 11782
o19.readyState = 3;
// 11780
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o136,o127);
// undefined
o127 = null;
// 11784
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o136,o146);
// undefined
o146 = null;
// 11788
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o136,o147);
// undefined
o147 = null;
// 11794
o19.readyState = 4;
// undefined
o19 = null;
// 11834
o150.toString = f81632121_1344;
// undefined
o150 = null;
// 11843
o151.hasOwnProperty = f81632121_1662;
// undefined
o151 = null;
// 11792
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o136,o148);
// undefined
o136 = null;
// undefined
o148 = null;
// 11920
o18.readyState = 2;
// 11918
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o102,o149);
// undefined
o149 = null;
// 11924
o18.readyState = 3;
// 11922
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o102,o152);
// undefined
o152 = null;
// 11926
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o102,o153);
// undefined
o153 = null;
// 11932
o18.readyState = 4;
// undefined
o18 = null;
// 11972
o156.toString = f81632121_1344;
// undefined
o156 = null;
// 11980
o157.hasOwnProperty = f81632121_1662;
// undefined
o157 = null;
// 11930
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o102,o154);
// undefined
o102 = null;
// undefined
o154 = null;
// 12118
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"ywV7J\",]);\n}\n;\n__d(\"CensorLogger\", [\"Event\",\"Banzai\",\"DOM\",\"debounce\",\"ge\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Banzai\"), i = b(\"DOM\"), j = b(\"debounce\"), k = b(\"ge\"), l = ((10 * 60) * 1000), m = b(\"Keys\").RETURN, n = function(q) {\n        var r = ((q.target || q.srcElement)).id, s = ((q.target || q.srcElement)).value.trim().length, t = o.tracker(r);\n        if (!t) {\n            return\n        };\n        if (((s > 5) && !t.submitted)) {\n            if (((t.type == \"comment\") && (t.parent_fbid == \"unknown\"))) {\n                if (!o.syncTrackerWithForm(r)) {\n                    o.snowliftSync(r);\n                };\n                t = o.tracker(r);\n            }\n        ;\n            h.post(\"censorlogger\", {\n                impid: t.impid,\n                clearcounter: t.clearcounter,\n                instrument: t.type,\n                elementid: r,\n                parent_fbid: (((t.parent_fbid == \"unknown\") ? null : t.parent_fbid)),\n                version: \"original\"\n            }, h.VITAL);\n            o.setSubmitted(r, true);\n        }\n         else if ((((s === 0) && t.submitted) && (q.which != m))) {\n            o.debouncers[r] = p(r);\n            o.debouncers[r]();\n        }\n         else if (((s > 0) && t.submitted)) {\n            if (o.debouncers[r]) {\n                o.debouncers[r].reset();\n            }\n        }\n        \n    ;\n    }, o = {\n        init: function(q) {\n            this.impressionID = q;\n            for (var r in this.trackedElements) {\n                if (!k(r)) {\n                    this.stopTracking(r);\n                };\n            };\n            for (var s in this.unmatchedForms) {\n                if (!k(s)) {\n                    delete this.unmatchedForms[s];\n                };\n            };\n        },\n        trackElement: function(q, r, s) {\n            var t, u, v;\n            this.debouncers = (this.debouncers || {\n            });\n            this.trackedElements = (this.trackedElements || {\n            });\n            this.unmatchedForms = (this.unmatchedForms || {\n            });\n            r = r.toLowerCase();\n            if ((r == \"composer\")) {\n                t = ((s ? i.find(q, \"div.uiMetaComposerMessageBox textarea.input\") : i.find(q, \"div.uiComposerMessageBox textarea.input\")));\n                u = i.find(q, \"form.attachmentForm\");\n                var w = i.scry(q, \"input[name=\\\"xhpc_targetid\\\"]\")[0];\n                if (w) {\n                    v = w.value;\n                };\n            }\n             else if ((r == \"comment\")) {\n                t = i.find(q, \"div.commentBox textarea.textInput\");\n            }\n        ;\n            if ((t == null)) {\n                return\n            };\n            var x = i.getID(t);\n            if (u) {\n                this.addJoinTableInfoToForm(u, i.getID(t));\n            };\n            g.listen(t, \"keyup\", n.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: r,\n                impid: this.impressionID,\n                parent_fbid: (v || \"unknown\"),\n                formID: ((u ? i.getID(u) : null))\n            };\n            if ((r == \"comment\")) {\n                this.syncTrackerWithForm(x);\n            };\n        },\n        registerForm: function(q, r) {\n            this.unmatchedForms = (this.unmatchedForms || {\n            });\n            this.unmatchedForms[q] = r;\n        },\n        syncTrackerWithForm: function(q) {\n            for (var r in this.unmatchedForms) {\n                var s = k(r);\n                if (s) {\n                    var t = i.scry(s, \"div.commentBox textarea.textInput\")[0];\n                    if (t) {\n                        var u = i.getID(t);\n                        if ((u && (u == q))) {\n                            this.trackedElements[q].parent_fbid = this.unmatchedForms[r];\n                            this.trackedElements[q].formID = r;\n                            this.addJoinTableInfoToForm(s, q);\n                            delete this.unmatchedForms[r];\n                            return true;\n                        }\n                    ;\n                    }\n                ;\n                }\n            ;\n            };\n            return false;\n        },\n        snowliftSync: function(q) {\n            var r, s = k(q);\n            if ((s && (r = i.scry(s, \"^.fbPhotosSnowboxFeedbackInput\")[0]))) {\n                var t = i.find(r, \"input[name=\\\"feedback_params\\\"]\"), u = JSON.parse(t.value).target_fbid;\n                this.trackedElements[q].parent_fbid = u;\n                this.trackedElements[q].formID = r.id;\n                this.addJoinTableInfoToForm(r, q);\n                return true;\n            }\n        ;\n            return false;\n        },\n        stopTracking: function(q) {\n            delete this.trackedElements[q];\n            if (this.debouncers[q]) {\n                this.debouncers[q].reset();\n                delete this.debouncers[q];\n            }\n        ;\n        },\n        tracker: function(q) {\n            return this.trackedElements[q];\n        },\n        getSubmitted: function(q) {\n            return ((this.trackedElements[q] ? this.trackedElements[q].submitted : false));\n        },\n        setSubmitted: function(q, r) {\n            if (this.trackedElements[q]) {\n                this.trackedElements[q].submitted = r;\n            };\n        },\n        incrementClearCounter: function(q) {\n            if (!this.tracker(q)) {\n                return\n            };\n            this.trackedElements[q].clearcounter++;\n            this.trackedElements[q].submitted = false;\n            var r = i.scry(k(this.trackedElements[q].formID), \"input[name=\\\"clp\\\"]\")[0];\n            if (r) {\n                r.value = JSON.stringify({\n                    censorlogger_impid: this.trackedElements[q].impid,\n                    clearcounter: this.trackedElements[q].clearcounter,\n                    element_id: q\n                });\n            };\n        },\n        addJoinTableInfoToForm: function(q, r) {\n            i.prependContent(q, i.create(\"input\", {\n                type: \"hidden\",\n                name: \"clp\",\n                value: JSON.stringify({\n                    censorlogger_impid: this.impressionID,\n                    clearcounter: 0,\n                    element_id: r,\n                    version: \"original\"\n                })\n            }));\n        }\n    }, p = function(q) {\n        return j(function() {\n            o.incrementClearCounter(q);\n        }, l, o);\n    };\n    e.exports = o;\n});");
// 12119
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sb07b886257ccef0f1a7b671b3a82a783aa23d43f");
// 12120
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"ywV7J\",]);\n}\n;\n;\n__d(\"CensorLogger\", [\"JSBNG__Event\",\"Banzai\",\"DOM\",\"debounce\",\"ge\",\"Keys\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Banzai\"), i = b(\"DOM\"), j = b(\"debounce\"), k = b(\"ge\"), l = ((((10 * 60)) * 1000)), m = b(\"Keys\").RETURN, n = function(q) {\n        var r = ((q.target || q.srcElement)).id, s = ((q.target || q.srcElement)).value.trim().length, t = o.tracker(r);\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        if (((((s > 5)) && !t.submitted))) {\n            if (((((t.type == \"comment\")) && ((t.parent_fbid == \"unknown\"))))) {\n                if (!o.syncTrackerWithForm(r)) {\n                    o.snowliftSync(r);\n                }\n            ;\n            ;\n                t = o.tracker(r);\n            }\n        ;\n        ;\n            h.post(\"censorlogger\", {\n                impid: t.impid,\n                clearcounter: t.clearcounter,\n                instrument: t.type,\n                elementid: r,\n                parent_fbid: ((((t.parent_fbid == \"unknown\")) ? null : t.parent_fbid)),\n                version: \"original\"\n            }, h.VITAL);\n            o.setSubmitted(r, true);\n        }\n         else if (((((((s === 0)) && t.submitted)) && ((q.which != m))))) {\n            o.debouncers[r] = p(r);\n            o.debouncers[r]();\n        }\n         else if (((((s > 0)) && t.submitted))) {\n            if (o.debouncers[r]) {\n                o.debouncers[r].reset();\n            }\n        ;\n        }\n        \n        \n    ;\n    ;\n    }, o = {\n        init: function(q) {\n            this.impressionID = q;\n            {\n                var fin228keys = ((window.top.JSBNG_Replay.forInKeys)((this.trackedElements))), fin228i = (0);\n                var r;\n                for (; (fin228i < fin228keys.length); (fin228i++)) {\n                    ((r) = (fin228keys[fin228i]));\n                    {\n                        if (!k(r)) {\n                            this.stopTracking(r);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin229keys = ((window.top.JSBNG_Replay.forInKeys)((this.unmatchedForms))), fin229i = (0);\n                var s;\n                for (; (fin229i < fin229keys.length); (fin229i++)) {\n                    ((s) = (fin229keys[fin229i]));\n                    {\n                        if (!k(s)) {\n                            delete this.unmatchedForms[s];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        trackElement: function(q, r, s) {\n            var t, u, v;\n            this.debouncers = ((this.debouncers || {\n            }));\n            this.trackedElements = ((this.trackedElements || {\n            }));\n            this.unmatchedForms = ((this.unmatchedForms || {\n            }));\n            r = r.toLowerCase();\n            if (((r == \"composer\"))) {\n                t = ((s ? i.JSBNG__find(q, \"div.uiMetaComposerMessageBox textarea.input\") : i.JSBNG__find(q, \"div.uiComposerMessageBox textarea.input\")));\n                u = i.JSBNG__find(q, \"form.attachmentForm\");\n                var w = i.scry(q, \"input[name=\\\"xhpc_targetid\\\"]\")[0];\n                if (w) {\n                    v = w.value;\n                }\n            ;\n            ;\n            }\n             else if (((r == \"comment\"))) {\n                t = i.JSBNG__find(q, \"div.commentBox textarea.textInput\");\n            }\n            \n        ;\n        ;\n            if (((t == null))) {\n                return;\n            }\n        ;\n        ;\n            var x = i.getID(t);\n            if (u) {\n                this.addJoinTableInfoToForm(u, i.getID(t));\n            }\n        ;\n        ;\n            g.listen(t, \"keyup\", n.bind(this));\n            this.trackedElements[x] = {\n                submitted: false,\n                clearcounter: 0,\n                type: r,\n                impid: this.impressionID,\n                parent_fbid: ((v || \"unknown\")),\n                formID: ((u ? i.getID(u) : null))\n            };\n            if (((r == \"comment\"))) {\n                this.syncTrackerWithForm(x);\n            }\n        ;\n        ;\n        },\n        registerForm: function(q, r) {\n            this.unmatchedForms = ((this.unmatchedForms || {\n            }));\n            this.unmatchedForms[q] = r;\n        },\n        syncTrackerWithForm: function(q) {\n            {\n                var fin230keys = ((window.top.JSBNG_Replay.forInKeys)((this.unmatchedForms))), fin230i = (0);\n                var r;\n                for (; (fin230i < fin230keys.length); (fin230i++)) {\n                    ((r) = (fin230keys[fin230i]));\n                    {\n                        var s = k(r);\n                        if (s) {\n                            var t = i.scry(s, \"div.commentBox textarea.textInput\")[0];\n                            if (t) {\n                                var u = i.getID(t);\n                                if (((u && ((u == q))))) {\n                                    this.trackedElements[q].parent_fbid = this.unmatchedForms[r];\n                                    this.trackedElements[q].formID = r;\n                                    this.addJoinTableInfoToForm(s, q);\n                                    delete this.unmatchedForms[r];\n                                    return true;\n                                }\n                            ;\n                            ;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return false;\n        },\n        snowliftSync: function(q) {\n            var r, s = k(q);\n            if (((s && (r = i.scry(s, \"^.fbPhotosSnowboxFeedbackInput\")[0])))) {\n                var t = i.JSBNG__find(r, \"input[name=\\\"feedback_params\\\"]\"), u = JSON.parse(t.value).target_fbid;\n                this.trackedElements[q].parent_fbid = u;\n                this.trackedElements[q].formID = r.id;\n                this.addJoinTableInfoToForm(r, q);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        stopTracking: function(q) {\n            delete this.trackedElements[q];\n            if (this.debouncers[q]) {\n                this.debouncers[q].reset();\n                delete this.debouncers[q];\n            }\n        ;\n        ;\n        },\n        tracker: function(q) {\n            return this.trackedElements[q];\n        },\n        getSubmitted: function(q) {\n            return ((this.trackedElements[q] ? this.trackedElements[q].submitted : false));\n        },\n        setSubmitted: function(q, r) {\n            if (this.trackedElements[q]) {\n                this.trackedElements[q].submitted = r;\n            }\n        ;\n        ;\n        },\n        incrementClearCounter: function(q) {\n            if (!this.tracker(q)) {\n                return;\n            }\n        ;\n        ;\n            this.trackedElements[q].clearcounter++;\n            this.trackedElements[q].submitted = false;\n            var r = i.scry(k(this.trackedElements[q].formID), \"input[name=\\\"clp\\\"]\")[0];\n            if (r) {\n                r.value = JSON.stringify({\n                    censorlogger_impid: this.trackedElements[q].impid,\n                    clearcounter: this.trackedElements[q].clearcounter,\n                    element_id: q\n                });\n            }\n        ;\n        ;\n        },\n        addJoinTableInfoToForm: function(q, r) {\n            i.prependContent(q, i.create(\"input\", {\n                type: \"hidden\",\n                JSBNG__name: \"clp\",\n                value: JSON.stringify({\n                    censorlogger_impid: this.impressionID,\n                    clearcounter: 0,\n                    element_id: r,\n                    version: \"original\"\n                })\n            }));\n        }\n    }, p = function(q) {\n        return j(function() {\n            o.incrementClearCounter(q);\n        }, l, o);\n    };\n    e.exports = o;\n});");
// 12127
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o155,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yt/r/wyUJpAs1Jud.js",o158);
// undefined
o155 = null;
// undefined
o158 = null;
// 12132
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"gyG67\",]);\n}\n;\n__d(\"FullScreen\", [\"Event\",\"Arbiter\",\"CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = b(\"throttle\"), m = {\n    }, n = k(new h(), {\n        listenForEvent: function(p) {\n            var q = l(this.onChange, 0, this);\n            if (!m[p.id]) {\n                m[p.id] = true;\n                g.listen(p, {\n                    webkitfullscreenchange: q,\n                    mozfullscreenchange: q,\n                    fullscreenchange: q\n                });\n            }\n        ;\n        },\n        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\n            ;\n            }\n             else if (p.mozRequestFullScreen) {\n                p.mozRequestFullScreen();\n            }\n             else if (p.requestFullScreen) {\n                p.requestFullScreen();\n            }\n             else return false\n            \n            \n        ;\n            return true;\n        },\n        disableFullScreen: function() {\n            if (document.webkitCancelFullScreen) {\n                document.webkitCancelFullScreen();\n            }\n             else if (document.mozCancelFullScreen) {\n                document.mozCancelFullScreen();\n            }\n             else if (document.cancelFullScreen) {\n                document.cancelFullScreen();\n            }\n             else if (document.exitFullScreen) {\n                document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return (((document.webkitIsFullScreen || document.fullScreen) || document.mozFullScreen));\n        },\n        toggleFullScreen: function(p) {\n            if (this.isFullScreen()) {\n                this.disableFullScreen();\n                return false;\n            }\n             else return this.enableFullScreen(p)\n        ;\n            return false;\n        },\n        onChange: function() {\n            var p = this.isFullScreen();\n            i.conditionClass(document.body, \"fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return (((((document.webkitCancelFullScreen && j.chrome())) || document.mozCancelFullScreen) || document.cancelFullScreen) || document.exitFullScreen);\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"ImageUtils\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = {\n        hasLoaded: function(i) {\n            if ((i.naturalWidth !== undefined)) {\n                return (i.complete && (i.width !== 0));\n            }\n             else if ((((i.height == 20) && (i.width == 20)) && i.complete)) {\n                return false;\n            }\n             else if (((i.complete === undefined) && (g.webkit() < 500))) {\n                var j = new Image();\n                j.src = i.src;\n                return j.complete;\n            }\n            \n            \n        ;\n            return i.complete;\n        }\n    };\n    e.exports = h;\n});\n__d(\"PhotoEverstoreLogger\", [\"Event\",\"AsyncRequest\",\"copyProperties\",\"ImageUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"ImageUtils\"), k = {\n        BATCH_WINDOW_MS: 500,\n        storedLog: []\n    };\n    function l() {\n    \n    };\n    i(l, {\n        _log: function(n) {\n            k.storedLog.push(n);\n            if ((k.storedLog.length == 1)) {\n                setTimeout(m, k.BATCH_WINDOW_MS, false);\n            };\n        },\n        logImmediately: function(n) {\n            l._log(n);\n        },\n        registerForLogging: function(n) {\n            if (j.hasLoaded(n)) {\n                l._log(n.src);\n            }\n             else g.listen(n, \"load\", function(event) {\n                l._log(n.src);\n            });\n        ;\n        }\n    });\n    function m() {\n        var n = k.storedLog;\n        k.storedLog = [];\n        var o = JSON.stringify(n);\n        new h().setURI(\"/ajax/photos/logging/everstore_logging.php\").setData({\n            loggedUrls: o\n        }).setMethod(\"POST\").setOption(\"suppressErrorHandlerWarning\", true).setOption(\"suppressErrorAlerts\", true).send();\n    };\n    e.exports = l;\n});\n__d(\"PhotoSessionLog\", [\"AsyncRequest\",\"Run\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Run\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k() {\n    \n    };\n    j(k, {\n        UNKNOWN: 0,\n        ESC: 1,\n        X: 2,\n        OUTSIDE: 3,\n        UNLOAD: 4,\n        NAVIGATE: 5,\n        AGGREGATE: 6,\n        LEAVE: 7,\n        PERMALINK: 0,\n        SNOWLIFT: 6,\n        AGGREGATION_COUNT: 20,\n        set: null,\n        time: null,\n        views: 0,\n        fbidList: [],\n        details: {\n        },\n        width: 0,\n        height: 0,\n        first: false,\n        last: false,\n        logIds: false,\n        version: null,\n        source: null,\n        buttonLikes: 0,\n        pagingAction: \"\",\n        faceTagImpressions: 0,\n        cycle: false,\n        endOfRelevant: false,\n        relevantCount: 0,\n        initLogging: function(l) {\n            this.set = null;\n            this.time = new Date();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fullScreenViews = {\n            };\n            this.first = true;\n            this.last = false;\n            this.logIds = false;\n            this.version = l;\n            this.buttonLikes = 0;\n            this.pagingAction = \"\";\n            this.faceTagImpressions = 0;\n            this.cycle = false;\n            this.endOfRelevant = false;\n            this.relevantCount = 0;\n            if ((l === k.SNOWLIFT)) {\n                var m = i.getViewportDimensions();\n                this.width = m.x;\n                this.height = m.y;\n            }\n        ;\n        },\n        setLogFbids: function(l) {\n            this.logIds = l;\n        },\n        setPhotoSet: function(l) {\n            this.set = l;\n        },\n        addButtonLike: function() {\n            this.buttonLikes++;\n        },\n        setPagingAction: function(l) {\n            this.pagingAction = l;\n        },\n        addFaceTagImpression: function() {\n            this.faceTagImpressions++;\n        },\n        setCycle: function(l) {\n            this.cycle = l;\n        },\n        setEndOfRelevant: function(l) {\n            this.endOfRelevant = l;\n        },\n        setRelevantCount: function(l) {\n            this.relevantCount = l;\n        },\n        setEndMetrics: function(l) {\n            this.endMetrics = l;\n        },\n        setSource: function(l) {\n            this.source = l;\n        },\n        addPhotoView: function(l, m, n) {\n            if ((this.logIds && (this.views >= this.AGGREGATION_COUNT))) {\n                this.logPhotoViews(this.AGGREGATE);\n            };\n            this.views++;\n            if (l) {\n                this.fbidList.push([l.fbid,l.owner,Date.now(),]);\n            };\n            if (m) {\n                this.hiResLoads++;\n            };\n            if (n) {\n                this.fullScreenViews[l.fbid] = true;\n            };\n        },\n        logEnterFullScreen: function(l) {\n            this.fullScreenViews[l] = true;\n        },\n        addDetailData: function(l, m) {\n            if (!this.details[l]) {\n                this.details[l] = {\n                    t: m.num_tags,\n                    l: m.has_location,\n                    c: m.has_caption,\n                    cm: m.comment_count,\n                    lk: m.like_count,\n                    w: m.width,\n                    h: m.height,\n                    ad: \"{}\",\n                    p: this.pagingAction\n                };\n            };\n        },\n        updateAdData: function(l, m) {\n            if (this.details[l]) {\n                this.details[l].ad = JSON.stringify(m);\n            };\n        },\n        logPhotoViews: function(l) {\n            if (((!this.views) || (((this.version === k.SNOWLIFT) && (l == k.LEAVE))))) {\n                return\n            };\n            if ((l != this.AGGREGATE)) {\n                this.last = true;\n            };\n            var m = {\n                set: this.set,\n                time: (new Date() - this.time),\n                fbids: (this.logIds ? this.fbidList : []),\n                details: (this.logIds ? this.details : {\n                }),\n                first: this.first,\n                last: this.last,\n                close: (l ? l : this.UNKNOWN),\n                button_likes: this.buttonLikes,\n                version: this.version,\n                face_imp: this.faceTagImpressions,\n                endmetric: this.endMetrics,\n                cycle: this.cycle,\n                end_relev: this.endOfRelevant,\n                relev_count: this.relevantCount,\n                source: this.source\n            };\n            if ((this.version === k.SNOWLIFT)) {\n                var n = i.getViewportDimensions();\n                m.width = (n.x || this.width);\n                m.height = (n.y || this.height);\n                if ((this.hiResLoads > 0)) {\n                    m.hires_loads = this.hiResLoads;\n                };\n                if (this.last) {\n                    var o = Object.keys(this.fullScreenViews).length;\n                    if ((o > 0)) {\n                        m.fullscreen = o;\n                    };\n                }\n            ;\n            }\n        ;\n            new g().setURI(\"/ajax/photos/logging/session_logging.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", ((l != k.UNLOAD))).setOption(\"suppressErrorHandlerWarning\", true).setData(m).send();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fbidList = [];\n            this.details = {\n            };\n            this.first = false;\n            this.buttonLikes = 0;\n            if (this.last) {\n                this.set = null;\n                this.logIds = false;\n                this.fullScreenViews = {\n                };\n            }\n        ;\n        }\n    });\n    h.onUnload(function() {\n        k.logPhotoViews(k.UNLOAD);\n    });\n    h.onLeave(function() {\n        k.logPhotoViews(k.LEAVE);\n    });\n    e.exports = k;\n});\n__d(\"PhotoViewerImage\", [\"PhotoEverstoreLogger\",\"URI\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"PhotoEverstoreLogger\"), h = b(\"URI\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._hiResDimensions = (l.hiResDimensions && i.deserialize(l.hiResDimensions));\n        this._normalDimensions = (l.normalDimensions && i.deserialize(l.normalDimensions));\n        this._info = l.info;\n        this._video = l.video;\n        this._shouldLog = l.everstoreLogThis;\n        this._hiResSrc = l.hiResSrc;\n        this._normalSrc = l.normalSrc;\n        this._thumbSrc = l.thumbSrc;\n        this._isInverted = false;\n        this._data = l;\n    };\n    j(k.prototype, {\n        getURIString: function() {\n            return h(this._info.permalink).getUnqualifiedURI().toString();\n        },\n        hasHiResDimensions: function() {\n            return !!this._hiResDimensions;\n        },\n        getHiResDimensions: function() {\n            return this._hiResDimensions;\n        },\n        getNormalDimensions: function() {\n            return this._normalDimensions;\n        },\n        getHiResSrc: function() {\n            return this._hiResSrc;\n        },\n        getNormalSrc: function() {\n            return this._normalSrc;\n        },\n        getThumbSrc: function() {\n            return this._thumbSrc;\n        },\n        getInfo: function() {\n            return this._info;\n        },\n        getPermalink: function() {\n            return this._info.permalink;\n        },\n        getHighestResSrc: function() {\n            return (this._hiResSrc || this._normalSrc);\n        },\n        preload: function(l) {\n            if (this.getHighestResSrc()) {\n                if ((l && !this._resource)) {\n                    this._resource = new Image();\n                    this._resource.src = this.getHighestResSrc();\n                    if (this._shouldLog) {\n                        g.logImmediately(this._resource.src);\n                    };\n                }\n                 else if ((!l && !this._small)) {\n                    this._small = new Image();\n                    this._small.src = (this._normalSrc || this._hiResSrc);\n                    if (this._shouldLog) {\n                        g.logImmediately(this._small.src);\n                    };\n                }\n                \n            \n            };\n        },\n        setNormalDimensions: function(l, m) {\n            this._normalDimensions = new i(l, m);\n        },\n        setHiResDimensions: function(l, m) {\n            this._hiResDimensions = new i(l, m);\n        },\n        invertDimensions: function() {\n            if (this.hasHiResDimensions()) {\n                this._hiResDimensions = new i(this._hiResDimensions.y, this._hiResDimensions.x);\n            };\n            this._normalDimensions = new i(this._normalDimensions.y, this._normalDimensions.x);\n            this._isInverted = !this._isInverted;\n        },\n        copy: function() {\n            return new k(this._data);\n        }\n    });\n    e.exports = k;\n});\n__d(\"PhotosConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        VIEWER_PERMALINK: 0,\n        VIEWER_SNOWLIFT: 6,\n        VIEWER_VAULTBOX: 8,\n        BULK_EDITOR: 3,\n        FLASH_UPLOADER: 4,\n        HTML5_UPLOADER: 10,\n        SIZE_NORMAL: \"n\",\n        PIC_NORMAL_FBX_SIZE: 180\n    };\n    e.exports = g;\n});\n__d(\"PhotosUtils\", [\"copyProperties\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Vector\");\n    function i() {\n    \n    };\n    g(i, {\n        getNearestBox: function(j, k) {\n            var l = Infinity, m = null;\n            for (var n in j) {\n                var o = j[n];\n                if (o.contains(k)) {\n                    var p = k.distanceTo(o.getCenter());\n                    if ((p < l)) {\n                        l = p;\n                        m = n;\n                    }\n                ;\n                }\n            ;\n            };\n            return m;\n        },\n        absoluteToNormalizedPosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.sub(l).mul((100 / m.x), (100 / m.y));\n            n.domain = \"pure\";\n            return n;\n        },\n        normalizedToAbsolutePosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.mul((m.x / 100), (m.y / 100)).add(l);\n            n.domain = \"document\";\n            return n;\n        },\n        isFacebox: function(j) {\n            return j.match(/^face:/);\n        },\n        isTag: function(j) {\n            return j.match(/^tag:/);\n        }\n    });\n    e.exports = i;\n});\n__d(\"PhotoStreamCache\", [\"DOM\",\"HTML\",\"PhotosConst\",\"PhotoEverstoreLogger\",\"PhotoViewerImage\",\"Rect\",\"UIPagelet\",\"URI\",\"Vector\",\"copyProperties\",\"createArrayFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"HTML\"), i = b(\"PhotosConst\"), j = b(\"PhotoEverstoreLogger\"), k = b(\"PhotoViewerImage\"), l = b(\"Rect\"), m = b(\"UIPagelet\"), n = b(\"URI\"), o = b(\"Vector\"), p = b(\"copyProperties\"), q = b(\"createArrayFrom\"), r = b(\"ge\");\n    function s() {\n    \n    };\n    p(s, {\n        ERROR: \"error\",\n        HTML: \"html\",\n        IMAGE_DATA: \"image\",\n        EXTRA: \"extra\",\n        BUFFER_SIZE: 3,\n        INIT_BUCKET_SIZE: 4,\n        FULL_BUCKET_SIZE: 12,\n        ERROR_ID: -1,\n        INIT_PLACEHOLDER: 1\n    });\n    p(s.prototype, {\n        init: function(t, u, v) {\n            this.version = t;\n            this.pageletName = u;\n            this.pageletRootID = v;\n            this.bufferSize = s.BUFFER_SIZE;\n            this.fullBucketSize = s.FULL_BUCKET_SIZE;\n            this.initError = false;\n            this.isActive = true;\n            this.usesOpaqueCursor = false;\n            this.usesNonCircularPhotoSet = false;\n            this.reachedLeftEnd = false;\n            this.reachedRightEnd = false;\n            this.leftLock = false;\n            this.rightLock = false;\n            this.useAjaxPipe = true;\n            this.reset();\n        },\n        getUsesOpaqueCursor: function() {\n            return this.usesOpaqueCursor;\n        },\n        isNonCircularPhotoSet: function() {\n            return this.usesNonCircularPhotoSet;\n        },\n        setReachedLeftEnd: function() {\n            this.reachedLeftEnd = true;\n        },\n        setReachedRightEnd: function() {\n            this.reachedRightEnd = true;\n        },\n        hasReachedLeftEnd: function() {\n            return this.reachedLeftEnd;\n        },\n        hasReachedRightEnd: function() {\n            return this.reachedRightEnd;\n        },\n        nonCircularPhotoSetCanPage: function(t) {\n            if (!this.isNonCircularPhotoSet()) {\n                return true\n            };\n            if ((t < 0)) {\n                return (this.getCursorPos() || !this.hasReachedLeftEnd())\n            };\n            if ((t > 0)) {\n                return ((((this.getLength() - 1) != this.getCursorPos())) || !this.hasReachedRightEnd())\n            };\n            return true;\n        },\n        setUseAjaxPipe: function(t) {\n            this.useAjaxPipe = t;\n        },\n        reset: function() {\n            this.cache = {\n                image: {\n                },\n                extra: {\n                },\n                html: {\n                }\n            };\n            this.fbidList = [];\n            this.loaded = false;\n            this.allLoaded = false;\n            this.permalinkMap = {\n            };\n            this.position = 0;\n            this.totalCount = null;\n            this.firstCursor = null;\n            this.firstCursorIndex = null;\n            this.firstOpaqueCursor = null;\n        },\n        waitForInitData: function() {\n            this.fbidList.push(s.INIT_PLACEHOLDER);\n        },\n        destroy: function() {\n            this.reset();\n            this.isActive = false;\n        },\n        isLoaded: function() {\n            return this.loaded;\n        },\n        canPage: function() {\n            if (!this.isLoaded()) {\n                return false\n            };\n            if ((this.totalCount !== null)) {\n                return (this.totalCount > 1)\n            };\n            if (this.usesNonCircularPhotoSet) {\n                return true\n            };\n            return (this.getLength() > 1);\n        },\n        errorInCurrent: function() {\n            if (this.initError) {\n                return true;\n            }\n             else if (!this.isLoaded()) {\n                return false\n            }\n        ;\n            return this.checkErrorAt(this.getCursor());\n        },\n        getLength: function() {\n            return this.fbidList.length;\n        },\n        getPhotoSet: function() {\n            return this.photoSetQuery.set;\n        },\n        getPhotoSetQuery: function() {\n            return this.photoSetQuery;\n        },\n        getCurrentImageData: function() {\n            return this.getImageData(this.getCursor());\n        },\n        getOpaqueCursor: function(t) {\n            if (this.getImageData(t)) {\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    return this.getImageData(t).getInfo().opaquecursor\n                };\n                return this.getImageData(t).info.opaquecursor;\n            }\n        ;\n            if ((t == this.firstCursor)) {\n                return this.firstOpaqueCursor\n            };\n            return null;\n        },\n        getImageData: function(t) {\n            return this.getCacheContent(t, s.IMAGE_DATA);\n        },\n        getCurrentHtml: function() {\n            return this.getCacheContent(this.getCursor(), s.HTML);\n        },\n        getCurrentExtraData: function() {\n            return this.getCacheContent(this.getCursor(), s.EXTRA);\n        },\n        getCacheContent: function(t, u) {\n            if (((!t || (t === s.ERROR_ID)) || (t === s.INIT_PLACEHOLDER))) {\n                return null\n            };\n            return this.cache[u][t];\n        },\n        getCursorPos: function() {\n            return this.position;\n        },\n        getCursor: function() {\n            if (((this.position >= 0) && (this.position < this.getLength()))) {\n                return this.fbidList[this.position]\n            };\n            return null;\n        },\n        getCursorForURI: function(t) {\n            return this.permalinkMap[t];\n        },\n        calculatePositionForMovement: function(t) {\n            var u = (this.position + t);\n            if (this.allLoaded) {\n                var v = this.getLength();\n                u = (((v + (u % v))) % v);\n            }\n        ;\n            return u;\n        },\n        isValidMovement: function(t) {\n            if ((!this.isLoaded() || !this.canPage())) {\n                return false\n            };\n            var u = this.calculatePositionForMovement(t);\n            return ((this.getCursor() > 0) || (((u >= 0) && (u < this.getLength()))));\n        },\n        moveCursor: function(t) {\n            if (!this.isValidMovement(t)) {\n                return\n            };\n            this.position = this.calculatePositionForMovement(t);\n            if ((t !== 0)) {\n                this.loadMoreIfNeccessary((t > 0));\n            };\n        },\n        checkErrorAt: function(t) {\n            if (!this.isLoaded()) {\n                return false\n            };\n            if ((t === s.ERROR_ID)) {\n                return true\n            };\n            return false;\n        },\n        getRelativeMovement: function(t) {\n            for (var u = 0; (u < this.getLength()); u++) {\n                if ((this.fbidList[u] == t)) {\n                    return (u - this.position)\n                };\n            };\n            return null;\n        },\n        preloadImages: function(t) {\n            var u, v, w = this.getLength(), x = this.cache.image, y = s.BUFFER_SIZE;\n            if ((w > (y * 2))) {\n                u = ((((this.position + w) - (y % w))) % w);\n                v = (((this.position + y)) % w);\n            }\n             else {\n                u = 0;\n                v = (w - 1);\n            }\n        ;\n            while ((u != v)) {\n                var z = this.fbidList[u];\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    (x[z] && x[z].preload(t));\n                }\n                 else if ((x[z] && x[z].url)) {\n                    if ((t && !x[z].resource)) {\n                        x[z].resource = new Image();\n                        x[z].resource.src = x[z].url;\n                        if ((x[z].everstoreLogThis === true)) {\n                            j.logImmediately(x[z].resource.src);\n                        };\n                    }\n                     else if ((!t && !x[z].small)) {\n                        x[z].small = new Image();\n                        x[z].small.src = (x[z].smallurl || x[z].url);\n                        if ((x[z].everstoreLogThis === true)) {\n                            j.logImmediately(x[z].small.src);\n                        };\n                    }\n                    \n                \n                }\n            ;\n                u = (((u + 1)) % w);\n            };\n        },\n        loadMoreIfNeccessary: function(t) {\n            if (((this.allLoaded || ((t && this.rightLock))) || ((!t && this.leftLock)))) {\n                return\n            };\n            var u = (t ? 1 : -1), v = (this.position + (this.bufferSize * u));\n            if (((v < 0) && !this.checkErrorAt(this.getEndCursor(false)))) {\n                this.leftLock = true;\n                this.fetch(this.fullBucketSize, false);\n            }\n             else if (((v > this.getLength()) && !this.checkErrorAt(this.getEndCursor(true)))) {\n                this.rightLock = true;\n                this.fetch(this.fullBucketSize, true);\n            }\n            \n        ;\n        },\n        getEndCursor: function(t) {\n            return (t ? this.fbidList[(this.getLength() - 1)] : this.fbidList[0]);\n        },\n        calculateRelativeIndex: function(t, u, v) {\n            if (!this.totalCount) {\n                return null\n            };\n            var w = this.fbidList.indexOf(u), x = this.fbidList.indexOf(v);\n            if (((w === -1) || (x === -1))) {\n                return null\n            };\n            var y = (x - w);\n            return ((((t + y) + this.totalCount)) % this.totalCount);\n        },\n        calculateDistance: function(t, u) {\n            var v = this.fbidList.indexOf(t), w = this.fbidList.indexOf(u);\n            if (((v === -1) || (w === -1))) {\n                return null\n            };\n            return ((((w - v) + this.getLength())) % this.getLength());\n        },\n        fetch: function(t, u) {\n            var v = this.getEndCursor(u), w = p({\n                cursor: v,\n                version: this.version,\n                end: this.getEndCursor(!u),\n                fetchSize: (u ? t : (-1 * t)),\n                relevant_count: this.relevantCount,\n                opaqueCursor: this.getOpaqueCursor(v)\n            }, this.photoSetQuery);\n            if ((this.totalCount && (this.firstCursorIndex !== null))) {\n                w.total = this.totalCount;\n                w.cursorIndex = this.calculateRelativeIndex(this.firstCursorIndex, this.firstCursor, v);\n            }\n        ;\n            var x = r(this.pageletRootID);\n            if (!x) {\n                x = g.create(\"div\", {\n                    id: this.pageletRootID\n                });\n                g.appendContent(document.body, x);\n            }\n        ;\n            m.loadFromEndpoint(this.pageletName, x, w, {\n                usePipe: this.useAjaxPipe,\n                automatic: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n            if (!this.useAjaxPipe) {\n                this.setUseAjaxPipe(true);\n            };\n        },\n        storeToCache: function(t) {\n            var u = {\n            };\n            if (!this.isActive) {\n                return u\n            };\n            if ((\"error\" in t)) {\n                this.processErrorResult(t.error);\n                u.error = true;\n                return u;\n            }\n        ;\n            if ((\"init\" in t)) {\n                this.processInitResult(t.init);\n                u.init = {\n                    logids: t.init.logids,\n                    fbid: t.init.fbid,\n                    loggedin: t.init.loggedin,\n                    fromad: t.init.fromad,\n                    disablesessionads: t.init.disablesessionads,\n                    flashtags: t.init.flashtags\n                };\n            }\n        ;\n            if ((\"image\" in t)) {\n                this.processImageResult(t.image);\n                u.image = true;\n            }\n        ;\n            if ((\"data\" in t)) {\n                this.processDataResult(t.data);\n                u.data = true;\n            }\n        ;\n            return u;\n        },\n        processInitResult: function(t) {\n            if (this.loaded) {\n                return\n            };\n            this.usesOpaqueCursor = t.usesopaquecursor;\n            this.usesNonCircularPhotoSet = t.isnoncircularphotoset;\n            this.loaded = true;\n            this.photoSetQuery = t.query;\n            if (t.bufferSize) {\n                this.bufferSize = t.bufferSize;\n            };\n            if (t.fullBucketSize) {\n                this.fullBucketSize = t.fullBucketSize;\n            };\n            if ((this.fbidList.length === 0)) {\n                this.fbidList.push(t.fbid);\n                this.rightLock = true;\n            }\n             else {\n                var u = this.fbidList.indexOf(s.INIT_PLACEHOLDER);\n                if ((u != -1)) {\n                    this.fbidList[u] = t.fbid;\n                };\n            }\n        ;\n            this.firstCursor = t.fbid;\n            this.firstOpaqueCursor = t.opaquecursor;\n            if (((\"initIndex\" in t) && (\"totalCount\" in t))) {\n                this.firstCursorIndex = t.initIndex;\n                this.totalCount = t.totalCount;\n            }\n        ;\n            if ((this.version == i.VIEWER_PERMALINK)) {\n                this.fetch(s.INIT_BUCKET_SIZE, true);\n            };\n        },\n        processImageResult: function(t) {\n            for (var u in t) {\n                if (((u === this.firstCursor) && t[u].everstoreLogThis)) {\n                    j.logImmediately(t[u].url);\n                };\n                if ((this.version === i.VIEWER_VAULTBOX)) {\n                    var v = t[u];\n                    this.cache.image[u] = new k(v);\n                    this.permalinkMap[this.cache.image[u].getURIString()] = u;\n                }\n                 else {\n                    this.cache.image[u] = t[u];\n                    if (t[u].dimensions) {\n                        this.cache.image[u].dimensions = o.deserialize(t[u].dimensions);\n                    };\n                    if (t[u].smalldims) {\n                        this.cache.image[u].smalldims = o.deserialize(t[u].smalldims);\n                    };\n                    this.permalinkMap[n(t[u].info.permalink).getUnqualifiedURI().toString()] = u;\n                }\n            ;\n            };\n        },\n        attachToFbidsList: function(t, u, v) {\n            if (this.allLoaded) {\n                return\n            };\n            if ((u === -1)) {\n                for (var w = (t.length - 1); (w >= 0); w--) {\n                    this.fbidList.unshift(t[w]);\n                    this.position++;\n                };\n                this.leftLock = false;\n            }\n             else {\n                for (var x = 0; (x < t.length); x++) {\n                    this.fbidList.push(t[x]);;\n                };\n                this.rightLock = false;\n            }\n        ;\n            if (v) {\n                this.setAllLoaded();\n            };\n        },\n        setAllLoaded: function() {\n            this.allLoaded = true;\n            if ((this.getCursor() === null)) {\n                this.position = this.calculatePositionForMovement(0);\n            };\n        },\n        processDataResult: function(t) {\n            for (var u in t) {\n                if (!this.cache.html[u]) {\n                    this.cache.html[u] = {\n                    };\n                };\n                for (var v in t[u].html) {\n                    var w = t[u].html[v];\n                    if ((typeof w === \"string\")) {\n                        w = h(w).getRootNode();\n                    };\n                    this.cache.html[u][v] = q(w.childNodes);\n                };\n                if (!((\"extra\" in t[u]))) {\n                    this.cache.extra[u] = null;\n                    continue;\n                }\n            ;\n                this.cache.extra[u] = {\n                    tagRects: {\n                    }\n                };\n                if (!Array.isArray(t[u].extra.tagRects)) {\n                    for (var x in t[u].extra.tagRects) {\n                        if (t[u].extra.tagRects[x]) {\n                            this.cache.extra[u].tagRects[x] = l.deserialize(t[u].extra.tagRects[x]);\n                        };\n                    }\n                };\n                Object.keys(t[u].extra).forEach(function(y) {\n                    if ((y == \"tagRects\")) {\n                        return\n                    };\n                    this.cache.extra[u][y] = t[u].extra[y];\n                }.bind(this));\n            };\n        },\n        processErrorResult: function(t) {\n            if (!this.isLoaded()) {\n                this.initError = true;\n                return;\n            }\n        ;\n            var u = t.side, v = [s.ERROR_ID,];\n            this.attachToFbidsList(v, u);\n        },\n        setTotalCount: function(t) {\n            this.totalCount = t;\n        },\n        setFirstCursorIndex: function(t) {\n            this.firstCursorIndex = t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotoViewer\", [\"Bootloader\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n        this.image = null;\n        this.root = null;\n        this.stream = null;\n    };\n    h(j, {\n        bootstrap: function(k, l) {\n            g.loadModules([\"PhotoSnowlift\",], function(m) {\n                m.bootstrap(k, l);\n            });\n        }\n    });\n    h(j.prototype, {\n        getEventPrefix: i.thatReturnsNull,\n        getEventString: function(k) {\n            var l = this.getEventPrefix();\n            if (l) {\n                return ((l + \".\") + k)\n            };\n            return null;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getPosition: function() {\n            return (this.stream ? this.stream.getCursor() : null);\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: i.thatReturnsNull,\n        getVersionConst: i.thatReturnsNull,\n        getViewerSource: i.thatReturnsNull,\n        getViewerSet: i.thatReturnsNull\n    });\n    e.exports = j;\n});\n__d(\"ManagedError\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Error.prototype.constructor.call(this, h);\n        this.message = h;\n        this.innerError = i;\n    };\n    g.prototype = new Error();\n    g.prototype.constructor = g;\n    e.exports = g;\n});\n__d(\"AssertionError\", [\"ManagedError\",], function(a, b, c, d, e, f) {\n    var g = b(\"ManagedError\");\n    function h(i) {\n        g.prototype.constructor.apply(this, arguments);\n    };\n    h.prototype = new g();\n    h.prototype.constructor = h;\n    e.exports = h;\n});\n__d(\"Assert\", [\"AssertionError\",\"sprintf\",], function(a, b, c, d, e, f) {\n    var g = b(\"AssertionError\"), h = b(\"sprintf\");\n    function i(n, o) {\n        if (((typeof n !== \"boolean\") || !n)) {\n            throw new g(o)\n        };\n        return n;\n    };\n    function j(n, o, p) {\n        var q;\n        if ((o === undefined)) {\n            q = \"undefined\";\n        }\n         else if ((o === null)) {\n            q = \"null\";\n        }\n         else {\n            var r = Object.prototype.toString.call(o);\n            q = /\\s(\\w*)/.exec(r)[1].toLowerCase();\n        }\n        \n    ;\n        i((n.indexOf(q) !== -1), (p || h(\"Expression is of type %s, not %s\", q, n)));\n        return o;\n    };\n    function k(n, o, p) {\n        i((o instanceof n), (p || \"Expression not instance of type\"));\n        return o;\n    };\n    function l(n, o) {\n        m[(\"is\" + n)] = o;\n        m[(\"maybe\" + n)] = function(p, q) {\n            if ((p != null)) {\n                o(p, q);\n            };\n        };\n    };\n    var m = {\n        isInstanceOf: k,\n        isTrue: i,\n        isTruthy: function(n, o) {\n            return i(!!n, o);\n        },\n        type: j,\n        define: function(n, o) {\n            n = (n.substring(0, 1).toUpperCase() + n.substring(1).toLowerCase());\n            l(n, function(p, q) {\n                i(o(p), q);\n            });\n        }\n    };\n    [\"Array\",\"Boolean\",\"Date\",\"Function\",\"Null\",\"Number\",\"Object\",\"Regexp\",\"String\",\"Undefined\",].forEach(function(n) {\n        l(n, j.bind(null, n.toLowerCase()));\n    });\n    e.exports = m;\n});");
// 12133
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s2b2e6bc548a30a5306679fa35cdad18274145a8b");
// 12134
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"gyG67\",]);\n}\n;\n;\n__d(\"FullScreen\", [\"JSBNG__Event\",\"Arbiter\",\"JSBNG__CSS\",\"UserAgent\",\"copyProperties\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"UserAgent\"), k = b(\"copyProperties\"), l = b(\"throttle\"), m = {\n    }, n = k(new h(), {\n        listenForEvent: function(p) {\n            var q = l(this.onChange, 0, this);\n            if (!m[p.id]) {\n                m[p.id] = true;\n                g.listen(p, {\n                    webkitfullscreenchange: q,\n                    mozfullscreenchange: q,\n                    fullscreenchange: q\n                });\n            }\n        ;\n        ;\n        },\n        enableFullScreen: function(p) {\n            this.listenForEvent(p);\n            if (p.webkitRequestFullScreen) {\n                if (j.chrome()) {\n                    p.webkitRequestFullScreen(JSBNG__Element.ALLOW_KEYBOARD_INPUT);\n                }\n                 else p.webkitRequestFullScreen();\n            ;\n            ;\n            }\n             else if (p.mozRequestFullScreen) {\n                p.mozRequestFullScreen();\n            }\n             else if (p.requestFullScreen) {\n                p.requestFullScreen();\n            }\n             else return false\n            \n            \n        ;\n            return true;\n        },\n        disableFullScreen: function() {\n            if (JSBNG__document.webkitCancelFullScreen) {\n                JSBNG__document.webkitCancelFullScreen();\n            }\n             else if (JSBNG__document.mozCancelFullScreen) {\n                JSBNG__document.mozCancelFullScreen();\n            }\n             else if (JSBNG__document.cancelFullScreen) {\n                JSBNG__document.cancelFullScreen();\n            }\n             else if (JSBNG__document.exitFullScreen) {\n                JSBNG__document.exitFullScreen();\n            }\n             else return false\n            \n            \n            \n        ;\n            return true;\n        },\n        isFullScreen: function() {\n            return ((((JSBNG__document.webkitIsFullScreen || JSBNG__document.JSBNG__fullScreen)) || JSBNG__document.mozFullScreen));\n        },\n        toggleFullScreen: function(p) {\n            if (this.isFullScreen()) {\n                this.disableFullScreen();\n                return false;\n            }\n             else return this.enableFullScreen(p)\n        ;\n            return false;\n        },\n        onChange: function() {\n            var p = this.isFullScreen();\n            i.conditionClass(JSBNG__document.body, \"JSBNG__fullScreen\", p);\n            this.inform(\"changed\");\n        },\n        isSupported: function() {\n            return ((((((((JSBNG__document.webkitCancelFullScreen && j.chrome())) || JSBNG__document.mozCancelFullScreen)) || JSBNG__document.cancelFullScreen)) || JSBNG__document.exitFullScreen));\n        }\n    }), o = l(n.onChange, 0, n);\n    g.listen(JSBNG__document, {\n        webkitfullscreenchange: o,\n        mozfullscreenchange: o,\n        fullscreenchange: o\n    });\n    e.exports = n;\n});\n__d(\"ImageUtils\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\"), h = {\n        hasLoaded: function(i) {\n            if (((i.naturalWidth !== undefined))) {\n                return ((i.complete && ((i.width !== 0))));\n            }\n             else if (((((((i.height == 20)) && ((i.width == 20)))) && i.complete))) {\n                return false;\n            }\n             else if (((((i.complete === undefined)) && ((g.webkit() < 500))))) {\n                var j = new JSBNG__Image();\n                j.src = i.src;\n                return j.complete;\n            }\n            \n            \n        ;\n        ;\n            return i.complete;\n        }\n    };\n    e.exports = h;\n});\n__d(\"PhotoEverstoreLogger\", [\"JSBNG__Event\",\"AsyncRequest\",\"copyProperties\",\"ImageUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"copyProperties\"), j = b(\"ImageUtils\"), k = {\n        BATCH_WINDOW_MS: 500,\n        storedLog: []\n    };\n    function l() {\n    \n    };\n;\n    i(l, {\n        _log: function(n) {\n            k.storedLog.push(n);\n            if (((k.storedLog.length == 1))) {\n                JSBNG__setTimeout(m, k.BATCH_WINDOW_MS, false);\n            }\n        ;\n        ;\n        },\n        logImmediately: function(n) {\n            l._log(n);\n        },\n        registerForLogging: function(n) {\n            if (j.hasLoaded(n)) {\n                l._log(n.src);\n            }\n             else g.listen(n, \"load\", function(JSBNG__event) {\n                l._log(n.src);\n            });\n        ;\n        ;\n        }\n    });\n    function m() {\n        var n = k.storedLog;\n        k.storedLog = [];\n        var o = JSON.stringify(n);\n        new h().setURI(\"/ajax/photos/logging/everstore_logging.php\").setData({\n            loggedUrls: o\n        }).setMethod(\"POST\").setOption(\"suppressErrorHandlerWarning\", true).setOption(\"suppressErrorAlerts\", true).send();\n    };\n;\n    e.exports = l;\n});\n__d(\"PhotoSessionLog\", [\"AsyncRequest\",\"Run\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Run\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k() {\n    \n    };\n;\n    j(k, {\n        UNKNOWN: 0,\n        ESC: 1,\n        X: 2,\n        OUTSIDE: 3,\n        UNLOAD: 4,\n        NAVIGATE: 5,\n        AGGREGATE: 6,\n        LEAVE: 7,\n        PERMALINK: 0,\n        SNOWLIFT: 6,\n        AGGREGATION_COUNT: 20,\n        set: null,\n        time: null,\n        views: 0,\n        fbidList: [],\n        details: {\n        },\n        width: 0,\n        height: 0,\n        first: false,\n        last: false,\n        logIds: false,\n        version: null,\n        source: null,\n        buttonLikes: 0,\n        pagingAction: \"\",\n        faceTagImpressions: 0,\n        cycle: false,\n        endOfRelevant: false,\n        relevantCount: 0,\n        initLogging: function(l) {\n            this.set = null;\n            this.time = new JSBNG__Date();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fullScreenViews = {\n            };\n            this.first = true;\n            this.last = false;\n            this.logIds = false;\n            this.version = l;\n            this.buttonLikes = 0;\n            this.pagingAction = \"\";\n            this.faceTagImpressions = 0;\n            this.cycle = false;\n            this.endOfRelevant = false;\n            this.relevantCount = 0;\n            if (((l === k.SNOWLIFT))) {\n                var m = i.getViewportDimensions();\n                this.width = m.x;\n                this.height = m.y;\n            }\n        ;\n        ;\n        },\n        setLogFbids: function(l) {\n            this.logIds = l;\n        },\n        setPhotoSet: function(l) {\n            this.set = l;\n        },\n        addButtonLike: function() {\n            this.buttonLikes++;\n        },\n        setPagingAction: function(l) {\n            this.pagingAction = l;\n        },\n        addFaceTagImpression: function() {\n            this.faceTagImpressions++;\n        },\n        setCycle: function(l) {\n            this.cycle = l;\n        },\n        setEndOfRelevant: function(l) {\n            this.endOfRelevant = l;\n        },\n        setRelevantCount: function(l) {\n            this.relevantCount = l;\n        },\n        setEndMetrics: function(l) {\n            this.endMetrics = l;\n        },\n        setSource: function(l) {\n            this.source = l;\n        },\n        addPhotoView: function(l, m, n) {\n            if (((this.logIds && ((this.views >= this.AGGREGATION_COUNT))))) {\n                this.logPhotoViews(this.AGGREGATE);\n            }\n        ;\n        ;\n            this.views++;\n            if (l) {\n                this.fbidList.push([l.fbid,l.owner,JSBNG__Date.now(),]);\n            }\n        ;\n        ;\n            if (m) {\n                this.hiResLoads++;\n            }\n        ;\n        ;\n            if (n) {\n                this.fullScreenViews[l.fbid] = true;\n            }\n        ;\n        ;\n        },\n        logEnterFullScreen: function(l) {\n            this.fullScreenViews[l] = true;\n        },\n        addDetailData: function(l, m) {\n            if (!this.details[l]) {\n                this.details[l] = {\n                    t: m.num_tags,\n                    l: m.has_location,\n                    c: m.has_caption,\n                    cm: m.comment_count,\n                    lk: m.like_count,\n                    w: m.width,\n                    h: m.height,\n                    ad: \"{}\",\n                    p: this.pagingAction\n                };\n            }\n        ;\n        ;\n        },\n        updateAdData: function(l, m) {\n            if (this.details[l]) {\n                this.details[l].ad = JSON.stringify(m);\n            }\n        ;\n        ;\n        },\n        logPhotoViews: function(l) {\n            if ((((!this.views) || ((((this.version === k.SNOWLIFT)) && ((l == k.LEAVE))))))) {\n                return;\n            }\n        ;\n        ;\n            if (((l != this.AGGREGATE))) {\n                this.last = true;\n            }\n        ;\n        ;\n            var m = {\n                set: this.set,\n                time: ((new JSBNG__Date() - this.time)),\n                fbids: ((this.logIds ? this.fbidList : [])),\n                details: ((this.logIds ? this.details : {\n                })),\n                first: this.first,\n                last: this.last,\n                close: ((l ? l : this.UNKNOWN)),\n                button_likes: this.buttonLikes,\n                version: this.version,\n                face_imp: this.faceTagImpressions,\n                endmetric: this.endMetrics,\n                cycle: this.cycle,\n                end_relev: this.endOfRelevant,\n                relev_count: this.relevantCount,\n                source: this.source\n            };\n            if (((this.version === k.SNOWLIFT))) {\n                var n = i.getViewportDimensions();\n                m.width = ((n.x || this.width));\n                m.height = ((n.y || this.height));\n                if (((this.hiResLoads > 0))) {\n                    m.hires_loads = this.hiResLoads;\n                }\n            ;\n            ;\n                if (this.last) {\n                    var o = Object.keys(this.fullScreenViews).length;\n                    if (((o > 0))) {\n                        m.fullscreen = o;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/photos/logging/session_logging.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", ((l != k.UNLOAD))).setOption(\"suppressErrorHandlerWarning\", true).setData(m).send();\n            this.views = 0;\n            this.hiResLoads = 0;\n            this.fbidList = [];\n            this.details = {\n            };\n            this.first = false;\n            this.buttonLikes = 0;\n            if (this.last) {\n                this.set = null;\n                this.logIds = false;\n                this.fullScreenViews = {\n                };\n            }\n        ;\n        ;\n        }\n    });\n    h.onUnload(function() {\n        k.logPhotoViews(k.UNLOAD);\n    });\n    h.onLeave(function() {\n        k.logPhotoViews(k.LEAVE);\n    });\n    e.exports = k;\n});\n__d(\"PhotoViewerImage\", [\"PhotoEverstoreLogger\",\"URI\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"PhotoEverstoreLogger\"), h = b(\"URI\"), i = b(\"Vector\"), j = b(\"copyProperties\");\n    function k(l) {\n        this._hiResDimensions = ((l.hiResDimensions && i.deserialize(l.hiResDimensions)));\n        this._normalDimensions = ((l.normalDimensions && i.deserialize(l.normalDimensions)));\n        this._info = l.info;\n        this._video = l.video;\n        this._shouldLog = l.everstoreLogThis;\n        this._hiResSrc = l.hiResSrc;\n        this._normalSrc = l.normalSrc;\n        this._thumbSrc = l.thumbSrc;\n        this._isInverted = false;\n        this._data = l;\n    };\n;\n    j(k.prototype, {\n        getURIString: function() {\n            return h(this._info.permalink).getUnqualifiedURI().toString();\n        },\n        hasHiResDimensions: function() {\n            return !!this._hiResDimensions;\n        },\n        getHiResDimensions: function() {\n            return this._hiResDimensions;\n        },\n        getNormalDimensions: function() {\n            return this._normalDimensions;\n        },\n        getHiResSrc: function() {\n            return this._hiResSrc;\n        },\n        getNormalSrc: function() {\n            return this._normalSrc;\n        },\n        getThumbSrc: function() {\n            return this._thumbSrc;\n        },\n        getInfo: function() {\n            return this._info;\n        },\n        getPermalink: function() {\n            return this._info.permalink;\n        },\n        getHighestResSrc: function() {\n            return ((this._hiResSrc || this._normalSrc));\n        },\n        preload: function(l) {\n            if (this.getHighestResSrc()) {\n                if (((l && !this._resource))) {\n                    this._resource = new JSBNG__Image();\n                    this._resource.src = this.getHighestResSrc();\n                    if (this._shouldLog) {\n                        g.logImmediately(this._resource.src);\n                    }\n                ;\n                ;\n                }\n                 else if (((!l && !this._small))) {\n                    this._small = new JSBNG__Image();\n                    this._small.src = ((this._normalSrc || this._hiResSrc));\n                    if (this._shouldLog) {\n                        g.logImmediately(this._small.src);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        setNormalDimensions: function(l, m) {\n            this._normalDimensions = new i(l, m);\n        },\n        setHiResDimensions: function(l, m) {\n            this._hiResDimensions = new i(l, m);\n        },\n        invertDimensions: function() {\n            if (this.hasHiResDimensions()) {\n                this._hiResDimensions = new i(this._hiResDimensions.y, this._hiResDimensions.x);\n            }\n        ;\n        ;\n            this._normalDimensions = new i(this._normalDimensions.y, this._normalDimensions.x);\n            this._isInverted = !this._isInverted;\n        },\n        copy: function() {\n            return new k(this._data);\n        }\n    });\n    e.exports = k;\n});\n__d(\"PhotosConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        VIEWER_PERMALINK: 0,\n        VIEWER_SNOWLIFT: 6,\n        VIEWER_VAULTBOX: 8,\n        BULK_EDITOR: 3,\n        FLASH_UPLOADER: 4,\n        HTML5_UPLOADER: 10,\n        SIZE_NORMAL: \"n\",\n        PIC_NORMAL_FBX_SIZE: 180\n    };\n    e.exports = g;\n});\n__d(\"PhotosUtils\", [\"copyProperties\",\"Vector\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"Vector\");\n    function i() {\n    \n    };\n;\n    g(i, {\n        getNearestBox: function(j, k) {\n            var l = Infinity, m = null;\n            {\n                var fin231keys = ((window.top.JSBNG_Replay.forInKeys)((j))), fin231i = (0);\n                var n;\n                for (; (fin231i < fin231keys.length); (fin231i++)) {\n                    ((n) = (fin231keys[fin231i]));\n                    {\n                        var o = j[n];\n                        if (o.contains(k)) {\n                            var p = k.distanceTo(o.getCenter());\n                            if (((p < l))) {\n                                l = p;\n                                m = n;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return m;\n        },\n        absoluteToNormalizedPosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.sub(l).mul(((100 / m.x)), ((100 / m.y)));\n            n.domain = \"pure\";\n            return n;\n        },\n        normalizedToAbsolutePosition: function(j, k) {\n            var l = h.getElementPosition(j), m = h.getElementDimensions(j), n = k.mul(((m.x / 100)), ((m.y / 100))).add(l);\n            n.domain = \"JSBNG__document\";\n            return n;\n        },\n        isFacebox: function(j) {\n            return j.match(/^face:/);\n        },\n        isTag: function(j) {\n            return j.match(/^tag:/);\n        }\n    });\n    e.exports = i;\n});\n__d(\"PhotoStreamCache\", [\"DOM\",\"HTML\",\"PhotosConst\",\"PhotoEverstoreLogger\",\"PhotoViewerImage\",\"JSBNG__Rect\",\"UIPagelet\",\"URI\",\"Vector\",\"copyProperties\",\"createArrayFrom\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"HTML\"), i = b(\"PhotosConst\"), j = b(\"PhotoEverstoreLogger\"), k = b(\"PhotoViewerImage\"), l = b(\"JSBNG__Rect\"), m = b(\"UIPagelet\"), n = b(\"URI\"), o = b(\"Vector\"), p = b(\"copyProperties\"), q = b(\"createArrayFrom\"), r = b(\"ge\");\n    function s() {\n    \n    };\n;\n    p(s, {\n        ERROR: \"error\",\n        HTML: \"html\",\n        IMAGE_DATA: \"image\",\n        EXTRA: \"extra\",\n        BUFFER_SIZE: 3,\n        INIT_BUCKET_SIZE: 4,\n        FULL_BUCKET_SIZE: 12,\n        ERROR_ID: -1,\n        INIT_PLACEHOLDER: 1\n    });\n    p(s.prototype, {\n        init: function(t, u, v) {\n            this.version = t;\n            this.pageletName = u;\n            this.pageletRootID = v;\n            this.bufferSize = s.BUFFER_SIZE;\n            this.fullBucketSize = s.FULL_BUCKET_SIZE;\n            this.initError = false;\n            this.isActive = true;\n            this.usesOpaqueCursor = false;\n            this.usesNonCircularPhotoSet = false;\n            this.reachedLeftEnd = false;\n            this.reachedRightEnd = false;\n            this.leftLock = false;\n            this.rightLock = false;\n            this.useAjaxPipe = true;\n            this.reset();\n        },\n        getUsesOpaqueCursor: function() {\n            return this.usesOpaqueCursor;\n        },\n        isNonCircularPhotoSet: function() {\n            return this.usesNonCircularPhotoSet;\n        },\n        setReachedLeftEnd: function() {\n            this.reachedLeftEnd = true;\n        },\n        setReachedRightEnd: function() {\n            this.reachedRightEnd = true;\n        },\n        hasReachedLeftEnd: function() {\n            return this.reachedLeftEnd;\n        },\n        hasReachedRightEnd: function() {\n            return this.reachedRightEnd;\n        },\n        nonCircularPhotoSetCanPage: function(t) {\n            if (!this.isNonCircularPhotoSet()) {\n                return true;\n            }\n        ;\n        ;\n            if (((t < 0))) {\n                return ((this.getCursorPos() || !this.hasReachedLeftEnd()));\n            }\n        ;\n        ;\n            if (((t > 0))) {\n                return ((((((this.getLength() - 1)) != this.getCursorPos())) || !this.hasReachedRightEnd()));\n            }\n        ;\n        ;\n            return true;\n        },\n        setUseAjaxPipe: function(t) {\n            this.useAjaxPipe = t;\n        },\n        reset: function() {\n            this.cache = {\n                image: {\n                },\n                extra: {\n                },\n                html: {\n                }\n            };\n            this.fbidList = [];\n            this.loaded = false;\n            this.allLoaded = false;\n            this.permalinkMap = {\n            };\n            this.position = 0;\n            this.totalCount = null;\n            this.firstCursor = null;\n            this.firstCursorIndex = null;\n            this.firstOpaqueCursor = null;\n        },\n        waitForInitData: function() {\n            this.fbidList.push(s.INIT_PLACEHOLDER);\n        },\n        destroy: function() {\n            this.reset();\n            this.isActive = false;\n        },\n        isLoaded: function() {\n            return this.loaded;\n        },\n        canPage: function() {\n            if (!this.isLoaded()) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.totalCount !== null))) {\n                return ((this.totalCount > 1));\n            }\n        ;\n        ;\n            if (this.usesNonCircularPhotoSet) {\n                return true;\n            }\n        ;\n        ;\n            return ((this.getLength() > 1));\n        },\n        errorInCurrent: function() {\n            if (this.initError) {\n                return true;\n            }\n             else if (!this.isLoaded()) {\n                return false;\n            }\n            \n        ;\n        ;\n            return this.checkErrorAt(this.getCursor());\n        },\n        getLength: function() {\n            return this.fbidList.length;\n        },\n        getPhotoSet: function() {\n            return this.photoSetQuery.set;\n        },\n        getPhotoSetQuery: function() {\n            return this.photoSetQuery;\n        },\n        getCurrentImageData: function() {\n            return this.getImageData(this.getCursor());\n        },\n        getOpaqueCursor: function(t) {\n            if (this.getImageData(t)) {\n                if (((this.version === i.VIEWER_VAULTBOX))) {\n                    return this.getImageData(t).getInfo().opaquecursor;\n                }\n            ;\n            ;\n                return this.getImageData(t).info.opaquecursor;\n            }\n        ;\n        ;\n            if (((t == this.firstCursor))) {\n                return this.firstOpaqueCursor;\n            }\n        ;\n        ;\n            return null;\n        },\n        getImageData: function(t) {\n            return this.getCacheContent(t, s.IMAGE_DATA);\n        },\n        getCurrentHtml: function() {\n            return this.getCacheContent(this.getCursor(), s.HTML);\n        },\n        getCurrentExtraData: function() {\n            return this.getCacheContent(this.getCursor(), s.EXTRA);\n        },\n        getCacheContent: function(t, u) {\n            if (((((!t || ((t === s.ERROR_ID)))) || ((t === s.INIT_PLACEHOLDER))))) {\n                return null;\n            }\n        ;\n        ;\n            return this.cache[u][t];\n        },\n        getCursorPos: function() {\n            return this.position;\n        },\n        getCursor: function() {\n            if (((((this.position >= 0)) && ((this.position < this.getLength()))))) {\n                return this.fbidList[this.position];\n            }\n        ;\n        ;\n            return null;\n        },\n        getCursorForURI: function(t) {\n            return this.permalinkMap[t];\n        },\n        calculatePositionForMovement: function(t) {\n            var u = ((this.position + t));\n            if (this.allLoaded) {\n                var v = this.getLength();\n                u = ((((v + ((u % v)))) % v));\n            }\n        ;\n        ;\n            return u;\n        },\n        isValidMovement: function(t) {\n            if (((!this.isLoaded() || !this.canPage()))) {\n                return false;\n            }\n        ;\n        ;\n            var u = this.calculatePositionForMovement(t);\n            return ((((this.getCursor() > 0)) || ((((u >= 0)) && ((u < this.getLength()))))));\n        },\n        moveCursor: function(t) {\n            if (!this.isValidMovement(t)) {\n                return;\n            }\n        ;\n        ;\n            this.position = this.calculatePositionForMovement(t);\n            if (((t !== 0))) {\n                this.loadMoreIfNeccessary(((t > 0)));\n            }\n        ;\n        ;\n        },\n        checkErrorAt: function(t) {\n            if (!this.isLoaded()) {\n                return false;\n            }\n        ;\n        ;\n            if (((t === s.ERROR_ID))) {\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        getRelativeMovement: function(t) {\n            for (var u = 0; ((u < this.getLength())); u++) {\n                if (((this.fbidList[u] == t))) {\n                    return ((u - this.position));\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        preloadImages: function(t) {\n            var u, v, w = this.getLength(), x = this.cache.image, y = s.BUFFER_SIZE;\n            if (((w > ((y * 2))))) {\n                u = ((((((this.position + w)) - ((y % w)))) % w));\n                v = ((((this.position + y)) % w));\n            }\n             else {\n                u = 0;\n                v = ((w - 1));\n            }\n        ;\n        ;\n            while (((u != v))) {\n                var z = this.fbidList[u];\n                if (((this.version === i.VIEWER_VAULTBOX))) {\n                    ((x[z] && x[z].preload(t)));\n                }\n                 else if (((x[z] && x[z].url))) {\n                    if (((t && !x[z].resource))) {\n                        x[z].resource = new JSBNG__Image();\n                        x[z].resource.src = x[z].url;\n                        if (((x[z].everstoreLogThis === true))) {\n                            j.logImmediately(x[z].resource.src);\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((!t && !x[z].small))) {\n                        x[z].small = new JSBNG__Image();\n                        x[z].small.src = ((x[z].smallurl || x[z].url));\n                        if (((x[z].everstoreLogThis === true))) {\n                            j.logImmediately(x[z].small.src);\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                }\n                \n            ;\n            ;\n                u = ((((u + 1)) % w));\n            };\n        ;\n        },\n        loadMoreIfNeccessary: function(t) {\n            if (((((this.allLoaded || ((t && this.rightLock)))) || ((!t && this.leftLock))))) {\n                return;\n            }\n        ;\n        ;\n            var u = ((t ? 1 : -1)), v = ((this.position + ((this.bufferSize * u))));\n            if (((((v < 0)) && !this.checkErrorAt(this.getEndCursor(false))))) {\n                this.leftLock = true;\n                this.fetch(this.fullBucketSize, false);\n            }\n             else if (((((v > this.getLength())) && !this.checkErrorAt(this.getEndCursor(true))))) {\n                this.rightLock = true;\n                this.fetch(this.fullBucketSize, true);\n            }\n            \n        ;\n        ;\n        },\n        getEndCursor: function(t) {\n            return ((t ? this.fbidList[((this.getLength() - 1))] : this.fbidList[0]));\n        },\n        calculateRelativeIndex: function(t, u, v) {\n            if (!this.totalCount) {\n                return null;\n            }\n        ;\n        ;\n            var w = this.fbidList.indexOf(u), x = this.fbidList.indexOf(v);\n            if (((((w === -1)) || ((x === -1))))) {\n                return null;\n            }\n        ;\n        ;\n            var y = ((x - w));\n            return ((((((t + y)) + this.totalCount)) % this.totalCount));\n        },\n        calculateDistance: function(t, u) {\n            var v = this.fbidList.indexOf(t), w = this.fbidList.indexOf(u);\n            if (((((v === -1)) || ((w === -1))))) {\n                return null;\n            }\n        ;\n        ;\n            return ((((((w - v)) + this.getLength())) % this.getLength()));\n        },\n        fetch: function(t, u) {\n            var v = this.getEndCursor(u), w = p({\n                cursor: v,\n                version: this.version,\n                end: this.getEndCursor(!u),\n                fetchSize: ((u ? t : ((-1 * t)))),\n                relevant_count: this.relevantCount,\n                opaqueCursor: this.getOpaqueCursor(v)\n            }, this.photoSetQuery);\n            if (((this.totalCount && ((this.firstCursorIndex !== null))))) {\n                w.total = this.totalCount;\n                w.cursorIndex = this.calculateRelativeIndex(this.firstCursorIndex, this.firstCursor, v);\n            }\n        ;\n        ;\n            var x = r(this.pageletRootID);\n            if (!x) {\n                x = g.create(\"div\", {\n                    id: this.pageletRootID\n                });\n                g.appendContent(JSBNG__document.body, x);\n            }\n        ;\n        ;\n            m.loadFromEndpoint(this.pageletName, x, w, {\n                usePipe: this.useAjaxPipe,\n                automatic: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n            if (!this.useAjaxPipe) {\n                this.setUseAjaxPipe(true);\n            }\n        ;\n        ;\n        },\n        storeToCache: function(t) {\n            var u = {\n            };\n            if (!this.isActive) {\n                return u;\n            }\n        ;\n        ;\n            if (((\"error\" in t))) {\n                this.processErrorResult(t.error);\n                u.error = true;\n                return u;\n            }\n        ;\n        ;\n            if (((\"init\" in t))) {\n                this.processInitResult(t.init);\n                u.init = {\n                    logids: t.init.logids,\n                    fbid: t.init.fbid,\n                    loggedin: t.init.loggedin,\n                    fromad: t.init.fromad,\n                    disablesessionads: t.init.disablesessionads,\n                    flashtags: t.init.flashtags\n                };\n            }\n        ;\n        ;\n            if (((\"image\" in t))) {\n                this.processImageResult(t.image);\n                u.image = true;\n            }\n        ;\n        ;\n            if (((\"data\" in t))) {\n                this.processDataResult(t.data);\n                u.data = true;\n            }\n        ;\n        ;\n            return u;\n        },\n        processInitResult: function(t) {\n            if (this.loaded) {\n                return;\n            }\n        ;\n        ;\n            this.usesOpaqueCursor = t.usesopaquecursor;\n            this.usesNonCircularPhotoSet = t.isnoncircularphotoset;\n            this.loaded = true;\n            this.photoSetQuery = t.query;\n            if (t.bufferSize) {\n                this.bufferSize = t.bufferSize;\n            }\n        ;\n        ;\n            if (t.fullBucketSize) {\n                this.fullBucketSize = t.fullBucketSize;\n            }\n        ;\n        ;\n            if (((this.fbidList.length === 0))) {\n                this.fbidList.push(t.fbid);\n                this.rightLock = true;\n            }\n             else {\n                var u = this.fbidList.indexOf(s.INIT_PLACEHOLDER);\n                if (((u != -1))) {\n                    this.fbidList[u] = t.fbid;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.firstCursor = t.fbid;\n            this.firstOpaqueCursor = t.opaquecursor;\n            if (((((\"initIndex\" in t)) && ((\"totalCount\" in t))))) {\n                this.firstCursorIndex = t.initIndex;\n                this.totalCount = t.totalCount;\n            }\n        ;\n        ;\n            if (((this.version == i.VIEWER_PERMALINK))) {\n                this.fetch(s.INIT_BUCKET_SIZE, true);\n            }\n        ;\n        ;\n        },\n        processImageResult: function(t) {\n            {\n                var fin232keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin232i = (0);\n                var u;\n                for (; (fin232i < fin232keys.length); (fin232i++)) {\n                    ((u) = (fin232keys[fin232i]));\n                    {\n                        if (((((u === this.firstCursor)) && t[u].everstoreLogThis))) {\n                            j.logImmediately(t[u].url);\n                        }\n                    ;\n                    ;\n                        if (((this.version === i.VIEWER_VAULTBOX))) {\n                            var v = t[u];\n                            this.cache.image[u] = new k(v);\n                            this.permalinkMap[this.cache.image[u].getURIString()] = u;\n                        }\n                         else {\n                            this.cache.image[u] = t[u];\n                            if (t[u].dimensions) {\n                                this.cache.image[u].dimensions = o.deserialize(t[u].dimensions);\n                            }\n                        ;\n                        ;\n                            if (t[u].smalldims) {\n                                this.cache.image[u].smalldims = o.deserialize(t[u].smalldims);\n                            }\n                        ;\n                        ;\n                            this.permalinkMap[n(t[u].info.permalink).getUnqualifiedURI().toString()] = u;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        attachToFbidsList: function(t, u, v) {\n            if (this.allLoaded) {\n                return;\n            }\n        ;\n        ;\n            if (((u === -1))) {\n                for (var w = ((t.length - 1)); ((w >= 0)); w--) {\n                    this.fbidList.unshift(t[w]);\n                    this.position++;\n                };\n            ;\n                this.leftLock = false;\n            }\n             else {\n                for (var x = 0; ((x < t.length)); x++) {\n                    this.fbidList.push(t[x]);\n                ;\n                };\n            ;\n                this.rightLock = false;\n            }\n        ;\n        ;\n            if (v) {\n                this.setAllLoaded();\n            }\n        ;\n        ;\n        },\n        setAllLoaded: function() {\n            this.allLoaded = true;\n            if (((this.getCursor() === null))) {\n                this.position = this.calculatePositionForMovement(0);\n            }\n        ;\n        ;\n        },\n        processDataResult: function(t) {\n            {\n                var fin233keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin233i = (0);\n                var u;\n                for (; (fin233i < fin233keys.length); (fin233i++)) {\n                    ((u) = (fin233keys[fin233i]));\n                    {\n                        if (!this.cache.html[u]) {\n                            this.cache.html[u] = {\n                            };\n                        }\n                    ;\n                    ;\n                        {\n                            var fin234keys = ((window.top.JSBNG_Replay.forInKeys)((t[u].html))), fin234i = (0);\n                            var v;\n                            for (; (fin234i < fin234keys.length); (fin234i++)) {\n                                ((v) = (fin234keys[fin234i]));\n                                {\n                                    var w = t[u].html[v];\n                                    if (((typeof w === \"string\"))) {\n                                        w = h(w).getRootNode();\n                                    }\n                                ;\n                                ;\n                                    this.cache.html[u][v] = q(w.childNodes);\n                                };\n                            };\n                        };\n                    ;\n                        if (!((\"extra\" in t[u]))) {\n                            this.cache.extra[u] = null;\n                            continue;\n                        }\n                    ;\n                    ;\n                        this.cache.extra[u] = {\n                            tagRects: {\n                            }\n                        };\n                        if (!Array.isArray(t[u].extra.tagRects)) {\n                            {\n                                var fin235keys = ((window.top.JSBNG_Replay.forInKeys)((t[u].extra.tagRects))), fin235i = (0);\n                                var x;\n                                for (; (fin235i < fin235keys.length); (fin235i++)) {\n                                    ((x) = (fin235keys[fin235i]));\n                                    {\n                                        if (t[u].extra.tagRects[x]) {\n                                            this.cache.extra[u].tagRects[x] = l.deserialize(t[u].extra.tagRects[x]);\n                                        }\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        Object.keys(t[u].extra).forEach(function(y) {\n                            if (((y == \"tagRects\"))) {\n                                return;\n                            }\n                        ;\n                        ;\n                            this.cache.extra[u][y] = t[u].extra[y];\n                        }.bind(this));\n                    };\n                };\n            };\n        ;\n        },\n        processErrorResult: function(t) {\n            if (!this.isLoaded()) {\n                this.initError = true;\n                return;\n            }\n        ;\n        ;\n            var u = t.side, v = [s.ERROR_ID,];\n            this.attachToFbidsList(v, u);\n        },\n        setTotalCount: function(t) {\n            this.totalCount = t;\n        },\n        setFirstCursorIndex: function(t) {\n            this.firstCursorIndex = t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"PhotoViewer\", [\"Bootloader\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n        this.image = null;\n        this.root = null;\n        this.stream = null;\n    };\n;\n    h(j, {\n        bootstrap: function(k, l) {\n            g.loadModules([\"PhotoSnowlift\",], function(m) {\n                m.bootstrap(k, l);\n            });\n        }\n    });\n    h(j.prototype, {\n        getEventPrefix: i.thatReturnsNull,\n        getEventString: function(k) {\n            var l = this.getEventPrefix();\n            if (l) {\n                return ((((l + \".\")) + k));\n            }\n        ;\n        ;\n            return null;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getPosition: function() {\n            return ((this.stream ? this.stream.getCursor() : null));\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: i.thatReturnsNull,\n        getVersionConst: i.thatReturnsNull,\n        getViewerSource: i.thatReturnsNull,\n        getViewerSet: i.thatReturnsNull\n    });\n    e.exports = j;\n});\n__d(\"ManagedError\", [], function(a, b, c, d, e, f) {\n    function g(h, i) {\n        Error.prototype.constructor.call(this, h);\n        this.message = h;\n        this.innerError = i;\n    };\n;\n    g.prototype = new Error();\n    g.prototype.constructor = g;\n    e.exports = g;\n});\n__d(\"AssertionError\", [\"ManagedError\",], function(a, b, c, d, e, f) {\n    var g = b(\"ManagedError\");\n    function h(i) {\n        g.prototype.constructor.apply(this, arguments);\n    };\n;\n    h.prototype = new g();\n    h.prototype.constructor = h;\n    e.exports = h;\n});\n__d(\"Assert\", [\"AssertionError\",\"sprintf\",], function(a, b, c, d, e, f) {\n    var g = b(\"AssertionError\"), h = b(\"sprintf\");\n    function i(n, o) {\n        if (((((typeof n !== \"boolean\")) || !n))) {\n            throw new g(o);\n        }\n    ;\n    ;\n        return n;\n    };\n;\n    function j(n, o, p) {\n        var q;\n        if (((o === undefined))) {\n            q = \"undefined\";\n        }\n         else if (((o === null))) {\n            q = \"null\";\n        }\n         else {\n            var r = Object.prototype.toString.call(o);\n            q = /\\s(\\w*)/.exec(r)[1].toLowerCase();\n        }\n        \n    ;\n    ;\n        i(((n.indexOf(q) !== -1)), ((p || h(\"Expression is of type %s, not %s\", q, n))));\n        return o;\n    };\n;\n    function k(n, o, p) {\n        i(((o instanceof n)), ((p || \"Expression not instance of type\")));\n        return o;\n    };\n;\n    function l(n, o) {\n        m[((\"is\" + n))] = o;\n        m[((\"maybe\" + n))] = function(p, q) {\n            if (((p != null))) {\n                o(p, q);\n            }\n        ;\n        ;\n        };\n    };\n;\n    var m = {\n        isInstanceOf: k,\n        isTrue: i,\n        isTruthy: function(n, o) {\n            return i(!!n, o);\n        },\n        type: j,\n        define: function(n, o) {\n            n = ((n.substring(0, 1).toUpperCase() + n.substring(1).toLowerCase()));\n            l(n, function(p, q) {\n                i(o(p), q);\n            });\n        }\n    };\n    [\"Array\",\"Boolean\",\"JSBNG__Date\",\"Function\",\"Null\",\"Number\",\"Object\",\"Regexp\",\"String\",\"Undefined\",].forEach(function(n) {\n        l(n, j.bind(null, n.toLowerCase()));\n    });\n    e.exports = m;\n});");
// 12137
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o159,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/ul7Pqk1hCQb.js",o160);
// undefined
o159 = null;
// undefined
o160 = null;
// 12142
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"cstCX\",]);\n}\n;\n__d(\"SubscriptionLevels\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ALL: \"162318810514679\",\n        DEFAULT: \"271670892858696\",\n        TOP: \"266156873403755\"\n    };\n    e.exports = g;\n});\n__d(\"EditSubscriptions\", [\"Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOM\",\"MenuDeprecated\",\"Parent\",\"SubscriptionLevels\",\"arrayContains\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"Parent\"), n = b(\"SubscriptionLevels\"), o = b(\"arrayContains\"), p = b(\"cx\"), q = b(\"ge\"), r = 13, s = 45, t = [n.ALL,n.DEFAULT,n.TOP,], u = {\n    }, v = {\n    }, w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = {\n    }, da = {\n    }, ea = {\n    }, fa = \"/ajax/follow/follow_profile.php\", ga = \"/ajax/follow/unfollow_profile.php\", ha = \"/ajax/settings/notifications/notify_me.php\", ia = {\n    }, ja = {\n    }, ka = null, la = false;\n    function ma(jb) {\n        return o(t, jb);\n    };\n    function na(jb, kb, lb, mb) {\n        var nb = (m.byClass(mb, \"uiMenuItem\") || m.byClass(mb, \"-cx-PUBLIC-abstractMenuItem__root\"));\n        if ((!nb || !k.contains(jb, nb))) {\n            return;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSubscribeCheckbox\")) {\n            if (w[kb]) {\n                qa(jb, kb);\n            }\n             else pa(jb, kb);\n        ;\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuUnsubscribe\")) {\n            qa(jb, kb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSettingsItem\")) {\n            db(jb, true);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuGoBack\")) {\n            db(jb, false);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuItem\")) {\n            oa(jb, kb, lb, nb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuNotifyMeCheckbox\")) {\n            if (x[kb]) {\n                hb(jb, kb);\n            }\n             else gb(jb, kb);\n        ;\n            return false;\n        }\n        \n        \n        \n        \n        \n        \n    ;\n    };\n    function oa(jb, kb, lb, mb) {\n        if (j.hasClass(mb, \"SubscriptionMenuLevel\")) {\n            if (l.isItemChecked(mb)) {\n                return\n            };\n            bb(jb, kb, ua(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionMenuCategory\")) {\n            ya(kb, mb, !l.isItemChecked(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionAppStory\")) {\n            ab(kb, mb, !l.isItemChecked(mb), lb);\n        }\n        \n    ;\n    };\n    function pa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"FollowingUser\", lb);\n        new i().setURI(fa).setMethod(\"POST\").setData({\n            profile_id: kb,\n            location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"FollowUserFail\", lb)).send();\n    };\n    function qa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"UnfollowingUser\", lb);\n        new i().setURI(ga).setMethod(\"POST\").setData({\n            profile_id: kb,\n            location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"UnfollowUserFail\", lb)).send();\n    };\n    function ra(jb) {\n        if (j.hasClass(jb, \"followButtonFlyout\")) {\n            return r;\n        }\n         else return s\n    ;\n    };\n    function sa(jb, kb, lb) {\n        var mb = {\n            profile_id: jb,\n            level: ba[jb],\n            custom_categories: ca[jb],\n            location: lb\n        };\n        new i().setURI(\"/ajax/follow/manage_subscriptions.php\").setData(mb).send();\n    };\n    function ta(jb, kb) {\n        var lb = (ca[kb] || []), mb = l.getItems(jb);\n        mb.forEach(function(nb) {\n            if (j.hasClass(nb, \"SubscriptionMenuCategory\")) {\n                var ob = ua(nb);\n                if (o(lb, ob)) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            }\n             else if (j.hasClass(nb, \"SubscriptionAppStory\")) {\n                var pb = ua(nb);\n                if ((ja[kb] && ja[kb][pb])) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            }\n            \n        ;\n        });\n        bb(jb, kb, ba[kb], false);\n    };\n    function ua(jb) {\n        var kb = k.scry(jb, \"input\")[0];\n        return (kb && kb.value);\n    };\n    function va(jb) {\n        return k.find(jb, \"a.itemAnchor\");\n    };\n    function wa(jb) {\n        j.addClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", true);\n    };\n    function xa(jb) {\n        j.removeClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", false);\n    };\n    function ya(jb, kb, lb, mb, nb) {\n        if (lb) {\n            wa(kb);\n        }\n         else xa(kb);\n    ;\n        var ob = ua(kb);\n        if (ma(ob)) {\n            (lb && za(jb, ob));\n        }\n         else if (lb) {\n            if (!o(ca[jb], ob)) {\n                ca[jb].push(ob);\n            };\n        }\n         else {\n            var pb = ca[jb].indexOf(ob);\n            if ((pb !== -1)) {\n                ca[jb].splice(pb, 1);\n            };\n        }\n        \n    ;\n        if (mb) {\n            sa(jb, ob, nb);\n        };\n    };\n    function za(jb, kb) {\n        ba[jb] = kb;\n        h.inform(\"SubscriptionLevelUpdated\", {\n            profile_id: jb,\n            level: kb\n        });\n    };\n    function ab(jb, kb, lb, mb) {\n        var nb = \"/ajax/feed/filter_action/\", ob = ua(kb), pb = {\n            actor_id: jb,\n            app_id: ob\n        };\n        if (lb) {\n            wa(kb);\n            nb += \"resubscribe_user_app/\";\n            pb.action = \"resubscribe_user_app\";\n            if (!ja[jb]) {\n                ja[jb] = {\n                };\n            };\n            ja[jb][ob] = true;\n        }\n         else {\n            xa(kb);\n            nb += \"unsubscribe_user_app_checkbox/\";\n            pb.action = \"unsubscribe_user_app_checkbox\";\n            if (ja[jb]) {\n                ja[jb][ob] = false;\n            };\n        }\n    ;\n        new i().setURI(nb).setData(pb).send();\n    };\n    function bb(jb, kb, lb, mb, nb) {\n        var ob = k.scry(jb, \".SubscriptionMenuLevel\"), pb = null;\n        ob.forEach(function(qb) {\n            if ((ua(qb) == lb)) {\n                pb = qb;\n            }\n             else if (l.isItemChecked(qb)) {\n                ya(kb, qb, false, false);\n            }\n        ;\n        });\n        (pb && ya(kb, pb, true, mb, nb));\n    };\n    function cb(jb, kb, lb) {\n        w[kb] = lb;\n        j.conditionClass(jb, \"isUnsubscribed\", !lb);\n        var mb = k.scry(jb, \"li.SubscribeMenuSubscribeCheckbox\");\n        if ((mb.length !== 0)) {\n            var nb = mb[0];\n            if (lb) {\n                wa(nb);\n            }\n             else xa(nb);\n        ;\n        }\n    ;\n    };\n    function db(jb, kb) {\n        j.conditionClass(jb, \"subscriptionMenuOpen\", kb);\n    };\n    function eb(jb, kb, lb) {\n        var mb = k.find(jb, \".FriendListSubscriptionsMenu\"), nb = k.find(mb, \".uiMenuInner\");\n        if ((ka != null)) {\n            ka.forEach(function(ob) {\n                nb.removeChild(ob);\n            });\n        };\n        lb.forEach(function(ob) {\n            nb.appendChild(ob);\n        });\n        ka = lb;\n    };\n    h.subscribe(\"UnfollowUser\", function(jb, kb) {\n        if (da[kb.profile_id]) {\n            za(kb.profile_id, da[kb.profile_id]);\n            ca[kb.profile_id] = ea[kb.profile_id].slice();\n        }\n    ;\n    });\n    h.subscribe(\"UpdateSubscriptionLevel\", function(jb, kb) {\n        var lb = (kb.profile_id + \"\"), mb = (kb.level + \"\");\n        za(lb, mb);\n        var nb;\n        for (nb in u) {\n            if ((u[nb] === lb)) {\n                var ob = q(nb);\n                (ob && bb(ob, lb, mb, false));\n            }\n        ;\n        };\n    });\n    function fb(jb, kb, lb) {\n        x[kb] = lb;\n        var mb = (z[kb] && !la), nb = k.scry(jb, \"li.SubscribeMenuNotifyMeCheckbox\");\n        if ((nb.length !== 0)) {\n            var ob = nb[0];\n            j.conditionShow(ob, !mb);\n            j.conditionShow(k.find(jb, \"li.SubscribeMenuNotifyMeCheckboxSeparator\"), !mb);\n            if (lb) {\n                wa(ob);\n            }\n             else xa(ob);\n        ;\n        }\n    ;\n    };\n    function gb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"EnableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: true\n        }).setErrorHandler(h.inform.curry(\"EnableNotifsForUserFail\", lb)).send();\n    };\n    function hb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"DisableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: false\n        }).setErrorHandler(h.inform.curry(\"DisableNotifsForUserFail\", lb)).send();\n    };\n    var ib = {\n        init: function(jb, kb, lb) {\n            var mb = k.getID(jb);\n            if (!u[mb]) {\n                g.listen(jb, \"click\", function(nb) {\n                    return na(jb, u[mb], lb, nb.getTarget());\n                });\n            };\n            if (((lb === s) && ia[kb].length)) {\n                eb(jb, kb, ia[kb]);\n            };\n            if (ba[kb]) {\n                ta(jb, kb);\n            };\n            u[mb] = kb;\n            j.conditionClass(jb, \"NonFriendSubscriptionMenu\", !v[kb]);\n            j.conditionClass(jb, \"cannotSubscribe\", !y[kb]);\n            j.conditionClass(jb, \"noSubscriptionLevels\", (z[kb] && !aa[kb]));\n            j.conditionClass(jb, \"noSubscribeCheckbox\", (!v[kb] && !z[kb]));\n            cb(jb, kb, w[kb]);\n            fb(jb, kb, x[kb]);\n            h.subscribe([\"FollowUser\",\"FollowingUser\",\"UnfollowUserFail\",], function(nb, ob) {\n                cb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"UnfollowUser\",\"UnfollowingUser\",\"FollowUserFail\",], function(nb, ob) {\n                h.inform(\"SubMenu/Reset\");\n                cb(jb, kb, false);\n            }.bind(this));\n            h.subscribe([\"EnableNotifsForUser\",\"DisableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"DisableNotifsForUser\",\"EnableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, false);\n            }.bind(this));\n            h.subscribe(\"listeditor/friend_lists_changed\", function(nb, ob) {\n                if (ob.notify_state) {\n                    var pb = (ob.added_uid ? ob.added_uid : ob.removed_uid);\n                    fb(jb, pb, ob.notify_state.is_notified);\n                }\n            ;\n            }.bind(this));\n            db(jb, false);\n        },\n        getSubscriptions: function(jb) {\n            return {\n                level: ba[jb],\n                custom_categories: ca[jb]\n            };\n        },\n        setSubscriptions: function(jb, kb, lb, mb, nb, ob, pb, qb, rb, sb, tb, ub, vb) {\n            za(jb, (pb + \"\"));\n            v[jb] = kb;\n            w[jb] = lb;\n            y[jb] = mb;\n            z[jb] = nb;\n            aa[jb] = ob;\n            da[jb] = (rb + \"\");\n            ca[jb] = qb.map(String);\n            ea[jb] = sb.map(String);\n            ia[jb] = vb;\n            x[jb] = tb;\n            la = ub;\n        }\n    };\n    e.exports = (a.EditSubscriptions || ib);\n});\n__d(\"legacy:EditSubscriptions\", [\"SubscriptionLevels\",\"EditSubscriptions\",], function(a, b, c, d) {\n    a.SubscriptionLevels = b(\"SubscriptionLevels\");\n    a.EditSubscriptions = b(\"EditSubscriptions\");\n}, 3);\n__d(\"DynamicFriendListEducation\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"Dialog\",\"PageTransitions\",\"arrayContains\",\"createArrayFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"PageTransitions\"), l = b(\"arrayContains\"), m = b(\"createArrayFrom\"), n = b(\"removeFromArray\"), o, p, q, r, s, t;\n    function u() {\n        (q && q.hide());\n        (r && r.hide());\n    };\n    function v(y) {\n        n(p, y);\n        u();\n        s({\n            accept_tag_education: true\n        });\n    };\n    function w() {\n        u();\n        s({\n            nux_cancel: true\n        });\n    };\n    var x = {\n        init: function(y, z) {\n            o = y;\n            p = m(z).map(String);\n            k.registerHandler(function() {\n                u();\n                o = false;\n                s = undefined;\n                p = [];\n            });\n        },\n        showDialog: function(y, z, aa) {\n            if ((o && l(p, y))) {\n                u();\n                h.inform(\"DynamicFriendListEducation/dialogOpen\", {\n                    uid: z,\n                    flid: y\n                });\n                s = aa;\n                q = new j().setAsync(new i(\"/ajax/friends/lists/smart_list_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true)).setHandler(v.bind(this, y)).setCloseHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogClosed\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).setCancelHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogCancel\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).show();\n            }\n             else aa();\n        ;\n        },\n        showContextualDialog: function(y, z, aa, ba) {\n            if ((o && l(p, y))) {\n                u();\n                t = aa;\n                s = ba;\n                new i(\"/ajax/friends/lists/smart_list_contextual_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true).send();\n            }\n             else ba();\n        ;\n        },\n        setContextualDialog: function(y, z, aa, ba) {\n            r = y;\n            r.setContext(t);\n            r.show();\n            g.listen(z, \"click\", v.bind(this, ba));\n            g.listen(aa, \"click\", w);\n        }\n    };\n    e.exports = x;\n});\n__d(\"FriendStatus\", [\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"eachKeyVal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"eachKeyVal\");\n    function m(q, r, s) {\n        this.id = q;\n        this.update(r, s);\n    };\n    j(m.prototype, {\n        update: function(q, r) {\n            (q && (this.status = q));\n            if (r) {\n                this.lists = k(r).map(String);\n                this._informListChange();\n            }\n        ;\n        },\n        isComplete: function() {\n            return !!this.lists;\n        },\n        addToList: function(q) {\n            if ((this.lists && !i(this.lists, q))) {\n                this.lists.push(q);\n            };\n            this._informListChange();\n        },\n        removeFromList: function(q) {\n            if (this.lists) {\n                var r = this.lists.indexOf(q);\n                ((r !== -1) && this.lists.splice(r, 1));\n            }\n        ;\n            this._informListChange();\n        },\n        updateList: function(q, r) {\n            (r ? this.addToList(q) : this.removeFromList(q));\n        },\n        _informListChange: function() {\n            g.inform(\"FriendListMembershipChange\", {\n                uid: this.id,\n                lists: this.lists\n            });\n        }\n    });\n    j(m, {\n        ARE_FRIENDS: 1,\n        INCOMING_REQUEST: 2,\n        OUTGOING_REQUEST: 3,\n        CAN_REQUEST: 4\n    });\n    var n = {\n    }, o = {\n    };\n    function p(q, r, s) {\n        if (!n[s.uid]) {\n            n[s.uid] = new m(s.uid, q);\n        }\n         else n[s.uid].update(q);\n    ;\n        g.inform(\"FriendRequest/change\", {\n            uid: s.uid,\n            status: q\n        });\n    };\n    g.subscribe([\"FriendRequest/cancel\",\"FriendRequest/unfriend\",\"FriendRequest/sendFail\",], p.curry(m.CAN_REQUEST));\n    g.subscribe([\"FriendRequest/confirmFail\",], p.curry(m.INCOMING_REQUEST));\n    g.subscribe([\"FriendRequest/cancelFail\",\"FriendRequest/sent\",\"FriendRequest/sending\",], p.curry(m.OUTGOING_REQUEST));\n    g.subscribe([\"FriendRequest/confirm\",\"FriendRequest/confirming\",], p.curry(m.ARE_FRIENDS));\n    j(m, {\n        CLOSE_FRIENDS: null,\n        ACQUAINTANCES: null,\n        getFriend: function(q, r) {\n            if ((n[q] && n[q].isComplete())) {\n                r(n[q]);\n            }\n             else if (o[q]) {\n                o[q].push(r);\n            }\n             else {\n                o[q] = [r,];\n                new h().setURI(\"/ajax/friends/status.php\").setData({\n                    friend: q\n                }).setHandler(function(s) {\n                    var t = s.getPayload();\n                    m.initFriend.bind(m, q, t.status, t.lists).defer();\n                }).send();\n            }\n            \n        ;\n        },\n        initFriend: function(q, r, s) {\n            var t = (n[q] || new m(q));\n            t.update((t.status || r), (t.lists || s));\n            n[q] = t;\n            (o[q] && o[q].forEach(function(u) {\n                u(t);\n            }));\n            o[q] = null;\n        },\n        setSpecialLists: function(q) {\n            var r = (m.CLOSE_FRIENDS === null);\n            m.CLOSE_FRIENDS = (q.close + \"\");\n            m.ACQUAINTANCES = (q.acq + \"\");\n            if (r) {\n                l(n, function(s, t) {\n                    t._informListChange();\n                });\n            };\n        }\n    });\n    e.exports = m;\n});\n__d(\"FriendEditLists\", [\"Arbiter\",\"AsyncRequest\",\"CSS\",\"DOMQuery\",\"DynamicFriendListEducation\",\"EditSubscriptions\",\"FriendStatus\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"URI\",\"$\",\"arrayContains\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"DynamicFriendListEducation\"), l = b(\"EditSubscriptions\"), m = b(\"FriendStatus\"), n = b(\"MenuDeprecated\"), o = b(\"Parent\"), p = b(\"ScrollableArea\"), q = b(\"URI\"), r = b(\"$\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"ge\"), v = 5, w = {\n    }, x = \"/ajax/profile/removefriendconfirm.php\", y = \"/ajax/friends/requests/cancel.php\", z = \"/ajax/choose/\", aa = \"/profile.php\", ba = \"/ajax/report/social.php\", ca, da;\n    function ea(pa, qa, ra) {\n        var sa = w[pa.id], ta = function(ua) {\n            var va = {\n                action: (ra ? \"add_list\" : \"del_list\"),\n                to_friend: sa.id,\n                friendlists: [qa,],\n                source: ca\n            };\n            if (ua) {\n                t(va, ua);\n            };\n            sa.updateList(qa, ra);\n            var wa;\n            if ((ra && (qa == m.CLOSE_FRIENDS))) {\n                wa = ha(pa, m.ACQUAINTANCES);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.ACQUAINTANCES, false);\n                }\n            ;\n            }\n             else if ((ra && (qa == m.ACQUAINTANCES))) {\n                wa = ha(pa, m.CLOSE_FRIENDS);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.CLOSE_FRIENDS, false);\n                }\n            ;\n            }\n            \n        ;\n            var xa = {\n                flid: qa,\n                uid: sa.id\n            }, ya = (ra ? \"FriendListHovercard/add\" : \"FriendListHovercard/remove\");\n            g.inform(ya, xa);\n            new h().setURI(\"/ajax/add_friend/action.php\").setData(va).send();\n        };\n        if (ra) {\n            k.showDialog(qa, sa.id, ta);\n        }\n         else ta();\n    ;\n    };\n    function fa(pa) {\n        var qa = j.scry(pa, \"input\")[0];\n        return (qa && qa.value);\n    };\n    function ga(pa, qa, ra) {\n        var sa = {\n            uid: qa.id\n        };\n        new h().setURI(y).setMethod(\"POST\").setData({\n            friend: qa.id\n        }).setHandler(g.inform.bind(g, \"FriendRequest/cancel\", sa)).setErrorHandler(g.inform.bind(g, \"FriendRequest/cancelFail\", sa)).setStatusElement(ra).send();\n    };\n    function ha(pa, qa) {\n        var ra = n.getItems(pa);\n        for (var sa = 0; (sa < ra.length); sa++) {\n            if ((fa(ra[sa]) == qa)) {\n                return ra[sa]\n            };\n        };\n        return null;\n    };\n    function ia(pa, qa) {\n        var ra = n.getItems(pa);\n        ra.forEach(function(sa) {\n            var ta = fa(sa), ua = s(qa.lists, ta);\n            if ((n.isItemChecked(sa) !== ua)) {\n                n.toggleItem(sa);\n            };\n        });\n    };\n    function ja(pa) {\n        var qa = n.getItems(pa), ra = (!i.hasClass(pa, \"followButtonFlyout\") && !i.hasClass(pa, \"likeButtonFlyout\")), sa = [], ta = [], ua = 0, va = 0;\n        qa.forEach(function(ab) {\n            if (i.hasClass(ab, \"neverHide\")) {\n                i.removeClass(ab, \"underShowMore\");\n                ua++;\n            }\n             else if (n.isItemChecked(ab)) {\n                sa.push(ab);\n            }\n             else if (((i.hasClass(ab, \"neverShow\") || i.hasClass(ab, \"FriendListCreateTrigger\")) || ((!ra && i.hasClass(ab, \"friendOptionsOnly\"))))) {\n                i.addClass(ab, \"underShowMore\");\n                va++;\n            }\n             else ta.push(ab);\n            \n            \n        ;\n        });\n        var wa = (v - ua), xa = sa.concat(ta), ya = va;\n        xa.forEach(function(ab) {\n            if (i.hasClass(ab, \"ShowMoreItem\")) {\n                wa--;\n                return;\n            }\n        ;\n            if (wa) {\n                i.removeClass(ab, \"underShowMore\");\n                wa--;\n            }\n             else {\n                i.addClass(ab, \"underShowMore\");\n                ya = true;\n            }\n        ;\n        });\n        i.conditionClass(pa, \"hasMoreFriendListItems\", ya);\n        var za = j.scry(pa, \".FriendListMenuShowMore\");\n        za.forEach(function(ab) {\n            i.removeClass(ab, \"FriendListMenuShowMore\");\n        });\n    };\n    function ka(pa, qa) {\n        i.conditionClass(pa, \"FriendListMemorializedUser\", qa);\n    };\n    function la(pa, qa) {\n        i.conditionClass(pa, \"FriendListCannotSuggestFriends\", !qa);\n    };\n    function ma(pa, qa) {\n        var ra = j.scry(pa, \".FriendListUnfriend\")[0], sa = j.scry(pa, \".FriendListCancel\")[0], ta = j.scry(pa, \".FriendListSuggestFriends\")[0], ua = j.scry(pa, \".FriendListFriendship\")[0], va = j.scry(pa, \".FriendListReportBlock\")[0];\n        if (sa) {\n            i.conditionShow(sa, (qa.status == m.OUTGOING_REQUEST));\n        };\n        if (ra) {\n            i.conditionShow(ra, (qa.status == m.ARE_FRIENDS));\n            var wa = j.find(ra, \"a\");\n            wa.setAttribute(\"ajaxify\", q(x).addQueryData({\n                uid: qa.id,\n                unref: da\n            }).toString());\n        }\n         else i.conditionClass(pa, \"NoFriendListActionSeparator\", (!sa || (qa.status != m.OUTGOING_REQUEST)));\n    ;\n        if (ta) {\n            j.find(ta, \"a\").setAttribute(\"href\", q(z).addQueryData({\n                type: \"suggest_friends\",\n                newcomer: qa.id,\n                ref: \"profile_others_dropdown\"\n            }).toString());\n        };\n        if (ua) {\n            i.conditionShow(ua, (qa.status == m.ARE_FRIENDS));\n            j.find(ua, \"a\").setAttribute(\"href\", q(aa).addQueryData({\n                and: qa.id\n            }).toString());\n        }\n    ;\n        if (va) {\n            j.find(va, \"a\").setAttribute(\"ajaxify\", q(ba).addQueryData({\n                content_type: 0,\n                cid: qa.id,\n                rid: qa.id\n            }).toString());\n        };\n    };\n    function na(pa, qa) {\n        var ra = j.scry(pa, \"div.FriendListSubscriptionsMenu\");\n        if ((ra.length !== 0)) {\n            l.init(pa, qa, 45);\n        };\n    };\n    g.subscribe(\"FriendRequest/change\", function(pa, qa) {\n        for (var ra in w) {\n            var sa = u(ra), ta = w[ra];\n            if (((sa && ta) && (ta.id == qa.uid))) {\n                ia(sa, ta);\n                ma(sa, ta);\n                ja(sa);\n            }\n        ;\n        };\n    });\n    n.subscribe(\"select\", function(pa, qa) {\n        if ((i.hasClass(qa.item, \"ShowMoreItem\") && i.hasClass(qa.menu, \"FriendListMenu\"))) {\n            i.addClass(qa.menu, \"FriendListMenuShowMore\");\n            p.poke(qa.item);\n        }\n    ;\n    });\n    var oa = {\n        init: function(pa, qa, ra, sa, ta, ua) {\n            pa = r(pa);\n            ca = ra;\n            da = ua;\n            if (!w[pa.id]) {\n                n.subscribe(\"select\", function(va, wa) {\n                    if (j.contains(pa, wa.item)) {\n                        if (o.byClass(wa.item, \"FriendListItem\")) {\n                            n.toggleItem(wa.item);\n                            var xa = fa(wa.item);\n                            ea(pa, xa, n.isItemChecked(wa.item));\n                        }\n                         else if (o.byClass(wa.item, \"FriendListCancel\")) {\n                            ga(pa, w[pa.id], wa.item);\n                        }\n                         else if (o.byClass(wa.item, \"FriendListUnfriend\")) {\n                            g.inform(\"FriendEditLists/unfriend\");\n                        }\n                        \n                    \n                    };\n                });\n            };\n            i.addClass(pa, \"async_saving\");\n            m.getFriend(qa, function(va) {\n                ka(pa, sa);\n                la(pa, ta);\n                ia(pa, va);\n                ma(pa, va);\n                w[pa.id] = va;\n                ja(pa);\n                na(pa, qa);\n                i.removeClass(pa, \"async_saving\");\n            }.bind(this));\n        }\n    };\n    e.exports = (a.FriendEditLists || oa);\n});\n__d(\"FriendListFlyoutController\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"Button\",\"ContextualLayer\",\"CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"FriendEditLists\",\"FriendStatus\",\"Keys\",\"Layer\",\"LayerHideOnEscape\",\"LayerTabIsolation\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"Style\",\"TabbableElements\",\"UserAgent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Button\"), k = b(\"ContextualLayer\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMQuery\"), q = b(\"FriendEditLists\"), r = b(\"FriendStatus\"), s = b(\"Keys\"), t = b(\"Layer\"), u = b(\"LayerHideOnEscape\"), v = b(\"LayerTabIsolation\"), w = b(\"MenuDeprecated\"), x = b(\"Parent\"), y = b(\"ScrollableArea\"), z = b(\"Style\"), aa = b(\"TabbableElements\"), ba = b(\"UserAgent\"), ca = b(\"cx\"), da = b(\"emptyFunction\"), ea, fa, ga = null, ha = null, ia, ja, ka, la, ma, na, oa = 1500, pa, qa = [\"uiButtonConfirm\",\"uiButtonSpecial\",\"-cx-PRIVATE-uiButton__special\",\"-cx-PRIVATE-uiButton__confirm\",\"-cx-PRIVATE-xuiButton__special\",\"-cx-PRIVATE-xuiOverlayButton__root\",\"-cx-PRIVATE-xuiButton__confirm\",], ra = {\n        init: function(tb, ub) {\n            ra.init = da;\n            ea = tb;\n            ea.subscribe(\"mouseenter\", ab);\n            ea.subscribe(\"mouseleave\", ob);\n            ea.subscribe(\"hide\", cb);\n            ea.enableBehavior(v);\n            ea.enableBehavior(u);\n            pa = ub;\n            if (ga) {\n                o.setContent(ea.getContent(), [ga,ha,]);\n            };\n            var vb = function(wb) {\n                var xb = x.byClass(wb.getTarget(), \"enableFriendListFlyout\");\n                if (xb) {\n                    if ((ia === xb)) {\n                        clearTimeout(la);\n                    }\n                     else {\n                        (fa && qb());\n                        nb(xb);\n                    }\n                \n                };\n            };\n            g.listen(document.documentElement, {\n                mouseover: vb,\n                click: vb,\n                keydown: function(event) {\n                    var wb = event.getTarget();\n                    if (event.getModifiers().any) {\n                        return\n                    };\n                    if ((!fa || p.isNodeOfType(wb, [\"input\",\"textarea\",]))) {\n                        return\n                    };\n                    var xb = g.getKeyCode(event), yb;\n                    switch (xb) {\n                      case s.UP:\n                    \n                      case s.DOWN:\n                        var zb = za();\n                        yb = xa(zb);\n                        va(zb[(yb + (((xb === s.UP) ? -1 : 1)))]);\n                        return false;\n                      case s.SPACE:\n                        var ac = wa(wb);\n                        if (ac) {\n                            sa(ac);\n                            event.prevent();\n                        }\n                    ;\n                        break;\n                      default:\n                        var bc = String.fromCharCode(xb).toLowerCase(), cc = za();\n                        yb = xa(cc);\n                        var dc = yb, ec = cc.length;\n                        while ((((~yb && ((dc = (++dc % ec)) !== yb))) || ((!~yb && (++dc < ec))))) {\n                            var fc = w.getItemLabel(cc[dc]);\n                            if ((fc && (fc.charAt(0).toLowerCase() === bc))) {\n                                va(cc[dc]);\n                                return false;\n                            }\n                        ;\n                        };\n                    };\n                }\n            });\n            h.subscribe(\"FriendEditLists/unfriend\", qb);\n            h.subscribe(\"DynamicFriendListEducation/dialogOpen\", function() {\n                na = true;\n            });\n            h.subscribe(\"DynamicFriendListEducation/dialogClosed\", function() {\n                na = false;\n                ob();\n            });\n        },\n        initContent: function(tb) {\n            o.appendContent(document.body, tb);\n            db(tb);\n            (function() {\n                if (!ga) {\n                    ga = tb;\n                    (ea && o.setContent(ea.getContent(), [ga,ha,]));\n                    l.show(ga);\n                    g.listen(ga, \"click\", rb);\n                    (fa && kb(ia));\n                }\n                 else {\n                    o.remove(tb);\n                    tb = null;\n                }\n            ;\n            }).defer();\n        },\n        initNux: function(tb) {\n            if (ha) {\n                return\n            };\n            ha = tb;\n            (ea && o.setContent(ea.getContent(), [ga,ha,]));\n        },\n        show: function(tb) {\n            lb(tb);\n        },\n        hide: function(tb) {\n            ((tb === false) ? qb() : ob());\n        },\n        setActiveNode: function(tb) {\n            (fa && qb());\n            ia = tb;\n            ja = g.listen(tb, \"mouseleave\", function() {\n                ia = null;\n                (ja && ja.remove());\n            });\n        },\n        setCloseListener: function(tb, ub) {\n            m.set(tb, \"flfcloselistener\", ub);\n            if ((ia != tb)) {\n                m.set(tb, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            };\n        },\n        setCloseListenerTimeout: function(tb) {\n            oa = tb;\n        }\n    };\n    function sa(tb) {\n        (ba.firefox() && ua(tb).blur());\n        w.inform(\"select\", {\n            menu: ta(tb),\n            item: tb\n        });\n    };\n    function ta(tb) {\n        if (l.hasClass(tb, \"uiMenuContainer\")) {\n            return tb\n        };\n        return x.byClass(tb, \"uiMenu\");\n    };\n    function ua(tb) {\n        return p.find(tb, \"a.itemAnchor\");\n    };\n    function va(tb) {\n        if ((tb && ya(tb))) {\n            w._removeSelected(ea.getContent());\n            l.addClass(tb, \"selected\");\n            ua(tb).focus();\n        }\n    ;\n    };\n    function wa(tb) {\n        return x.byClass(tb, \"uiMenuItem\");\n    };\n    function xa(tb) {\n        if (document.activeElement) {\n            var ub = wa(document.activeElement);\n            return tb.indexOf(ub);\n        }\n    ;\n        return -1;\n    };\n    function ya(tb) {\n        return ((!l.hasClass(tb, \"disabled\") && (z.get(tb, \"display\") !== \"none\")) && (z.get(x.byClass(tb, \"uiMenu\"), \"display\") !== \"none\"));\n    };\n    function za() {\n        return w.getItems(ea.getContent()).filter(ya);\n    };\n    function ab() {\n        clearTimeout(la);\n    };\n    function bb(tb) {\n        for (var ub = 0; (ub < qa.length); ub++) {\n            if (l.hasClass(tb, qa[ub])) {\n                return false\n            };\n        };\n        return true;\n    };\n    function cb() {\n        if (ia) {\n            if (bb(ia)) {\n                l.removeClass(ia, \"-cx-PUBLIC-uiHoverButton__selected\");\n                if ((l.hasClass(ia, \"uiButton\") || l.hasClass(ia, \"-cx-PRIVATE-uiButton__root\"))) {\n                    l.removeClass(ia, \"selected\");\n                };\n            }\n        ;\n            if (m.get(ia, \"flfcloselistener\")) {\n                var tb = ia;\n                m.set(ia, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        }\n    ;\n        fa = false;\n        jb();\n        ia = null;\n    };\n    function db(tb) {\n        var ub = p.scry(tb, \"[tabindex=\\\"0\\\"]\");\n        ub.forEach(function(vb) {\n            vb.tabIndex = \"-1\";\n        });\n        (ub[0] && (ub[0].tabIndex = \"0\"));\n    };\n    function eb(tb) {\n        if ((p.isNodeOfType(tb, \"label\") && l.hasClass(tb, \"uiButton\"))) {\n            tb = j.getInputElement(tb);\n        };\n        return tb;\n    };\n    function fb(tb) {\n        return m.get(eb(tb), \"profileid\");\n    };\n    function gb(tb) {\n        return (m.get(eb(tb), \"memorialized\") === \"true\");\n    };\n    function hb(tb) {\n        return (m.get(eb(tb), \"cansuggestfriends\") === \"true\");\n    };\n    function ib(tb) {\n        return m.get(eb(tb), \"unref\");\n    };\n    function jb() {\n        (ja && ja.remove());\n        ja = null;\n        (ma && t.unsubscribe(ma));\n        ma = null;\n        (la && clearTimeout(la));\n        la = null;\n    };\n    function kb(tb) {\n        var ub = fb(tb), vb = gb(tb), wb = hb(tb), xb = m.get(tb, \"flloc\"), yb = ib(tb);\n        q.init(ga, ub, xb, vb, wb, yb);\n        l.conditionClass(ga, \"followButtonFlyout\", l.hasClass(tb, \"profileFollowButton\"));\n        l.conditionClass(ga, \"friendButtonFlyout\", ((l.hasClass(tb, \"FriendRequestFriends\") || l.hasClass(tb, \"FriendRequestIncoming\")) || l.hasClass(tb, \"FriendRequestOutgoing\")));\n        l.conditionClass(ga, \"likeButtonFlyout\", l.hasClass(tb, \"profileLikeButton\"));\n        var zb = p.scry(ga, \"div.uiScrollableArea\")[0];\n        (zb && y.poke(zb));\n        var ac = aa.find(ga)[0];\n        (ac && ac.focus());\n    };\n    function lb(tb) {\n        if ((!ea || fa)) {\n            return\n        };\n        ea.setContext(tb);\n        ea.setCausalElement(tb);\n        tb.setAttribute(\"aria-expanded\", \"true\");\n        if (bb(tb)) {\n            l.addClass(tb, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if ((l.hasClass(tb, \"uiButton\") || l.hasClass(tb, \"-cx-PRIVATE-uiButton__root\"))) {\n                l.addClass(tb, \"selected\");\n            };\n        }\n    ;\n        ea.show();\n        ia = tb;\n        fa = true;\n        var ub = null;\n        if (ga) {\n            ub = \"show\";\n            kb(tb);\n        }\n         else {\n            ub = \"init_show\";\n            new i().setURI(\"/ajax/friends/lists/flyout_content.php\").setStatusElement(ea.getContent()).send();\n        }\n    ;\n        jb();\n        ja = g.listen(tb, \"mouseleave\", ob);\n        ma = t.subscribe(\"show\", mb);\n        if (m.get(tb, \"flfcloselistener\")) {\n            clearTimeout(m.remove(tb, \"flfcloselistenertimeout\"));\n        };\n        var vb = fb(tb);\n        r.getFriend(vb, function(wb) {\n            if ((wb.status == r.ARE_FRIENDS)) {\n                new i().setURI(\"/ajax/friends/lists/flyout_log.php\").setData({\n                    target_id: fb(tb),\n                    unref: ib(tb),\n                    action: ub\n                }).send();\n            };\n            if (!ha) {\n                return\n            };\n            if ((wb.status == r.OUTGOING_REQUEST)) {\n                l.show(ha);\n                i.bootstrap(\"/ajax/friends/lists/nux_flyout.php\", null, true);\n            }\n             else l.hide(ha);\n        ;\n        });\n    };\n    function mb(tb, ub) {\n        if ((!((ub instanceof k)) || !p.contains(ia, ub.getContext()))) {\n            ob();\n        };\n    };\n    function nb(tb) {\n        ia = tb;\n        ka = lb.curry(tb).defer(pa);\n        ja = g.listen(tb, \"mouseleave\", function() {\n            clearTimeout(ka);\n            ia = null;\n            (ja && ja.remove());\n        });\n    };\n    function ob() {\n        la = qb.defer(150);\n    };\n    function pb() {\n        var tb = n.getCurrent(), ub = (tb && tb.getBody());\n        return !!((ub && p.scry(ub, \".friendListDialogTourCarousel\")[0]));\n    };\n    function qb() {\n        if ((na || pb())) {\n            return\n        };\n        ((ba.ie() < 8) && document.documentElement.focus());\n        if (ea) {\n            ea.hide();\n            var tb = ea.getCausalElement();\n            (tb && tb.setAttribute(\"aria-expanded\", \"false\"));\n        }\n    ;\n    };\n    function rb(event) {\n        var tb = x.byTag(event.getTarget(), \"a\");\n        if ((tb && l.hasClass(tb, \"FriendListActionItem\"))) {\n            ob();\n        };\n    };\n    function sb(tb) {\n        var ub = m.remove(tb, \"flfcloselistener\");\n        (ub && ub());\n    };\n    e.exports = (a.FriendListFlyoutController || ra);\n});\n__d(\"AddFriendButton\", [\"Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"collectDataAttributes\",\"CSS\",\"DOMQuery\",\"FriendListFlyoutController\",\"FriendStatus\",\"ge\",\"goURI\",\"Style\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncResponse\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"DOMQuery\"), o = b(\"FriendListFlyoutController\"), p = b(\"FriendStatus\"), q = b(\"ge\"), r = b(\"goURI\"), s = b(\"Style\"), t = b(\"URI\"), u = {\n        ERROR_ALREADY_ADDED: 1431005,\n        init: function(v, w, x, y, z, aa, ba, ca, da, ea, fa, ga) {\n            var ha = v.id, ia = null, ja = n.scry(v, \".addButton\")[0], ka = n.scry(v, \".addFriendText\")[0], la = n.scry(v, \".outgoingButton\")[0], ma = n.scry(v, \".incomingButton\")[0], na = n.scry(v, \".friendButton\")[0];\n            function oa(ua, va, wa) {\n                var xa = new t(ja.getAttribute(\"ajaxify\")), ya = l(v, [\"ft\",\"gt\",]);\n                new j().setURI(aa).setData({\n                    to_friend: w,\n                    action: ua,\n                    how_found: y,\n                    ref_param: z,\n                    link_data: ya,\n                    outgoing_id: la.id,\n                    xids: xa.getQueryData().xids,\n                    logging_location: ba,\n                    no_flyout_on_click: ca,\n                    ego_log_data: da,\n                    http_referer: fa\n                }).setErrorHandler(va).setServerDialogCancelHandler(wa).setRelativeTo(la).send();\n                if ((ga && (ua === \"add_friend\"))) {\n                    new j().setURI(\"/ajax/add_friend/chain_pymk.php\").send();\n                };\n            };\n            function pa(ua, va) {\n                if (ka) {\n                    m.hide(ka);\n                }\n                 else if (ja) {\n                    m.hide(ja);\n                }\n            ;\n                (la && m.hide(la));\n                (ma && m.hide(ma));\n                (na && m.hide(na));\n                if (ua) {\n                    m.show(ua);\n                };\n                if ((((\"Outgoing\" == va) && (ia != va)) && ea)) {\n                    new h(ua).from(\"backgroundColor\", \"#FFF8CC\").to(\"backgroundColor\", \"transparent\").from(\"borderColor\", \"#FFE222\").to(\"borderColor\", s.get(ua, \"borderLeftColor\")).duration(2000).go();\n                };\n                (ia && m.removeClass(v, (\"fStatus\" + ia)));\n                ia = va;\n                m.addClass(v, (\"fStatus\" + va));\n            };\n            function qa(ua) {\n                if (m.hasClass(ua, \"enableFriendListFlyout\")) {\n                    o.show(ua);\n                }\n                 else o.hide();\n            ;\n            };\n            var ra = i.subscribe(\"FriendRequest/change\", function(ua, va) {\n                ta();\n                if ((va.uid != w)) {\n                    return\n                };\n                switch (va.status) {\n                  case p.ARE_FRIENDS:\n                    return pa(na, \"Friends\");\n                  case p.INCOMING_REQUEST:\n                    return pa(ma, \"Incoming\");\n                  case p.OUTGOING_REQUEST:\n                    return pa(la, \"Outgoing\");\n                  case p.CAN_REQUEST:\n                    return pa((ka ? ka : ja), \"Requestable\");\n                };\n            }), sa;\n            if (x) {\n                sa = i.subscribe(\"FriendRequest/confirm\", function(ua, va) {\n                    ta();\n                    ((va.uid == w) && r(x));\n                });\n            };\n            (ja && g.listen(ja, \"click\", function() {\n                i.inform(\"FriendRequest/sending\", {\n                    uid: w\n                });\n                if (ca) {\n                    o.setActiveNode(la);\n                }\n                 else qa(la);\n            ;\n                oa(\"add_friend\", function(ua) {\n                    var va = ((ua.error == u.ERROR_ALREADY_ADDED) ? \"FriendRequest/sent\" : \"FriendRequest/sendFail\");\n                    i.inform(va, {\n                        uid: w\n                    });\n                    o.hide();\n                    k.defaultErrorHandler(ua);\n                }, function(ua) {\n                    i.inform(\"FriendRequest/sendFail\", {\n                        uid: w\n                    });\n                    o.hide();\n                });\n            }));\n            function ta() {\n                if (q(ha)) {\n                    return\n                };\n                (ra && ra.unsubscribe());\n                (sa && sa.unsubscribe());\n                ra = sa = null;\n            };\n        }\n    };\n    e.exports = u;\n});\n__d(\"FriendButtonIcon\", [\"Arbiter\",\"FriendStatus\",\"Button\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FriendStatus\"), i = b(\"Button\"), j = b(\"arrayContains\");\n    e.exports = {\n        register: function(k, l, m) {\n            g.subscribe(\"FriendListMembershipChange\", function(n, o) {\n                if ((o.uid == m)) {\n                    var p = j(o.lists, h.CLOSE_FRIENDS), q = j(o.lists, h.ACQUAINTANCES);\n                    if ((p && !q)) {\n                        i.setIcon(k, l.close);\n                    }\n                     else if ((q && !p)) {\n                        i.setIcon(k, l.acquaintance);\n                    }\n                     else i.setIcon(k, l.friend);\n                    \n                ;\n                }\n            ;\n            });\n        }\n    };\n});\n__d(\"legacy:friend-browser-checkbox-js\", [\"FriendBrowserCheckboxController\",], function(a, b, c, d) {\n    a.FriendBrowserCheckboxController = b(\"FriendBrowserCheckboxController\");\n}, 3);\n__d(\"legacy:onvisible\", [\"OnVisible\",], function(a, b, c, d) {\n    a.OnVisible = b(\"OnVisible\");\n}, 3);");
// 12143
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s16aa7ef075b409a7e3c2d48eb99ad115febdba99");
// 12144
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"cstCX\",]);\n}\n;\n;\n__d(\"SubscriptionLevels\", [], function(a, b, c, d, e, f) {\n    var g = {\n        ALL: \"162318810514679\",\n        DEFAULT: \"271670892858696\",\n        TOP: \"266156873403755\"\n    };\n    e.exports = g;\n});\n__d(\"EditSubscriptions\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"MenuDeprecated\",\"Parent\",\"SubscriptionLevels\",\"arrayContains\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"Parent\"), n = b(\"SubscriptionLevels\"), o = b(\"arrayContains\"), p = b(\"cx\"), q = b(\"ge\"), r = 13, s = 45, t = [n.ALL,n.DEFAULT,n.TOP,], u = {\n    }, v = {\n    }, w = {\n    }, x = {\n    }, y = {\n    }, z = {\n    }, aa = {\n    }, ba = {\n    }, ca = {\n    }, da = {\n    }, ea = {\n    }, fa = \"/ajax/follow/follow_profile.php\", ga = \"/ajax/follow/unfollow_profile.php\", ha = \"/ajax/settings/notifications/notify_me.php\", ia = {\n    }, ja = {\n    }, ka = null, la = false;\n    function ma(jb) {\n        return o(t, jb);\n    };\n;\n    function na(jb, kb, lb, mb) {\n        var nb = ((m.byClass(mb, \"uiMenuItem\") || m.byClass(mb, \"-cx-PUBLIC-abstractMenuItem__root\")));\n        if (((!nb || !k.contains(jb, nb)))) {\n            return;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSubscribeCheckbox\")) {\n            if (w[kb]) {\n                qa(jb, kb);\n            }\n             else pa(jb, kb);\n        ;\n        ;\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuUnsubscribe\")) {\n            qa(jb, kb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuSettingsItem\")) {\n            db(jb, true);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuGoBack\")) {\n            db(jb, false);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscriptionMenuItem\")) {\n            oa(jb, kb, lb, nb);\n            return false;\n        }\n         else if (j.hasClass(nb, \"SubscribeMenuNotifyMeCheckbox\")) {\n            if (x[kb]) {\n                hb(jb, kb);\n            }\n             else gb(jb, kb);\n        ;\n        ;\n            return false;\n        }\n        \n        \n        \n        \n        \n        \n    ;\n    ;\n    };\n;\n    function oa(jb, kb, lb, mb) {\n        if (j.hasClass(mb, \"SubscriptionMenuLevel\")) {\n            if (l.isItemChecked(mb)) {\n                return;\n            }\n        ;\n        ;\n            bb(jb, kb, ua(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionMenuCategory\")) {\n            ya(kb, mb, !l.isItemChecked(mb), true, lb);\n        }\n         else if (j.hasClass(mb, \"SubscriptionAppStory\")) {\n            ab(kb, mb, !l.isItemChecked(mb), lb);\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    function pa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"FollowingUser\", lb);\n        new i().setURI(fa).setMethod(\"POST\").setData({\n            profile_id: kb,\n            JSBNG__location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"FollowUserFail\", lb)).send();\n    };\n;\n    function qa(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"UnfollowingUser\", lb);\n        new i().setURI(ga).setMethod(\"POST\").setData({\n            profile_id: kb,\n            JSBNG__location: ra(jb)\n        }).setErrorHandler(h.inform.curry(\"UnfollowUserFail\", lb)).send();\n    };\n;\n    function ra(jb) {\n        if (j.hasClass(jb, \"followButtonFlyout\")) {\n            return r;\n        }\n         else return s\n    ;\n    };\n;\n    function sa(jb, kb, lb) {\n        var mb = {\n            profile_id: jb,\n            level: ba[jb],\n            custom_categories: ca[jb],\n            JSBNG__location: lb\n        };\n        new i().setURI(\"/ajax/follow/manage_subscriptions.php\").setData(mb).send();\n    };\n;\n    function ta(jb, kb) {\n        var lb = ((ca[kb] || [])), mb = l.getItems(jb);\n        mb.forEach(function(nb) {\n            if (j.hasClass(nb, \"SubscriptionMenuCategory\")) {\n                var ob = ua(nb);\n                if (o(lb, ob)) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            ;\n            }\n             else if (j.hasClass(nb, \"SubscriptionAppStory\")) {\n                var pb = ua(nb);\n                if (((ja[kb] && ja[kb][pb]))) {\n                    wa(nb);\n                }\n                 else xa(nb);\n            ;\n            ;\n            }\n            \n        ;\n        ;\n        });\n        bb(jb, kb, ba[kb], false);\n    };\n;\n    function ua(jb) {\n        var kb = k.scry(jb, \"input\")[0];\n        return ((kb && kb.value));\n    };\n;\n    function va(jb) {\n        return k.JSBNG__find(jb, \"a.itemAnchor\");\n    };\n;\n    function wa(jb) {\n        j.addClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", true);\n    };\n;\n    function xa(jb) {\n        j.removeClass(jb, \"checked\");\n        va(jb).setAttribute(\"aria-checked\", false);\n    };\n;\n    function ya(jb, kb, lb, mb, nb) {\n        if (lb) {\n            wa(kb);\n        }\n         else xa(kb);\n    ;\n    ;\n        var ob = ua(kb);\n        if (ma(ob)) {\n            ((lb && za(jb, ob)));\n        }\n         else if (lb) {\n            if (!o(ca[jb], ob)) {\n                ca[jb].push(ob);\n            }\n        ;\n        ;\n        }\n         else {\n            var pb = ca[jb].indexOf(ob);\n            if (((pb !== -1))) {\n                ca[jb].splice(pb, 1);\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        if (mb) {\n            sa(jb, ob, nb);\n        }\n    ;\n    ;\n    };\n;\n    function za(jb, kb) {\n        ba[jb] = kb;\n        h.inform(\"SubscriptionLevelUpdated\", {\n            profile_id: jb,\n            level: kb\n        });\n    };\n;\n    function ab(jb, kb, lb, mb) {\n        var nb = \"/ajax/feed/filter_action/\", ob = ua(kb), pb = {\n            actor_id: jb,\n            app_id: ob\n        };\n        if (lb) {\n            wa(kb);\n            nb += \"resubscribe_user_app/\";\n            pb.action = \"resubscribe_user_app\";\n            if (!ja[jb]) {\n                ja[jb] = {\n                };\n            }\n        ;\n        ;\n            ja[jb][ob] = true;\n        }\n         else {\n            xa(kb);\n            nb += \"unsubscribe_user_app_checkbox/\";\n            pb.action = \"unsubscribe_user_app_checkbox\";\n            if (ja[jb]) {\n                ja[jb][ob] = false;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        new i().setURI(nb).setData(pb).send();\n    };\n;\n    function bb(jb, kb, lb, mb, nb) {\n        var ob = k.scry(jb, \".SubscriptionMenuLevel\"), pb = null;\n        ob.forEach(function(qb) {\n            if (((ua(qb) == lb))) {\n                pb = qb;\n            }\n             else if (l.isItemChecked(qb)) {\n                ya(kb, qb, false, false);\n            }\n            \n        ;\n        ;\n        });\n        ((pb && ya(kb, pb, true, mb, nb)));\n    };\n;\n    function cb(jb, kb, lb) {\n        w[kb] = lb;\n        j.conditionClass(jb, \"isUnsubscribed\", !lb);\n        var mb = k.scry(jb, \"li.SubscribeMenuSubscribeCheckbox\");\n        if (((mb.length !== 0))) {\n            var nb = mb[0];\n            if (lb) {\n                wa(nb);\n            }\n             else xa(nb);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function db(jb, kb) {\n        j.conditionClass(jb, \"subscriptionMenuOpen\", kb);\n    };\n;\n    function eb(jb, kb, lb) {\n        var mb = k.JSBNG__find(jb, \".FriendListSubscriptionsMenu\"), nb = k.JSBNG__find(mb, \".uiMenuInner\");\n        if (((ka != null))) {\n            ka.forEach(function(ob) {\n                nb.removeChild(ob);\n            });\n        }\n    ;\n    ;\n        lb.forEach(function(ob) {\n            nb.appendChild(ob);\n        });\n        ka = lb;\n    };\n;\n    h.subscribe(\"UnfollowUser\", function(jb, kb) {\n        if (da[kb.profile_id]) {\n            za(kb.profile_id, da[kb.profile_id]);\n            ca[kb.profile_id] = ea[kb.profile_id].slice();\n        }\n    ;\n    ;\n    });\n    h.subscribe(\"UpdateSubscriptionLevel\", function(jb, kb) {\n        var lb = ((kb.profile_id + \"\")), mb = ((kb.level + \"\"));\n        za(lb, mb);\n        var nb;\n        {\n            var fin236keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin236i = (0);\n            (0);\n            for (; (fin236i < fin236keys.length); (fin236i++)) {\n                ((nb) = (fin236keys[fin236i]));\n                {\n                    if (((u[nb] === lb))) {\n                        var ob = q(nb);\n                        ((ob && bb(ob, lb, mb, false)));\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    function fb(jb, kb, lb) {\n        x[kb] = lb;\n        var mb = ((z[kb] && !la)), nb = k.scry(jb, \"li.SubscribeMenuNotifyMeCheckbox\");\n        if (((nb.length !== 0))) {\n            var ob = nb[0];\n            j.conditionShow(ob, !mb);\n            j.conditionShow(k.JSBNG__find(jb, \"li.SubscribeMenuNotifyMeCheckboxSeparator\"), !mb);\n            if (lb) {\n                wa(ob);\n            }\n             else xa(ob);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function gb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"EnableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: true\n        }).setErrorHandler(h.inform.curry(\"EnableNotifsForUserFail\", lb)).send();\n    };\n;\n    function hb(jb, kb) {\n        var lb = {\n            profile_id: kb\n        };\n        h.inform(\"DisableNotifsForUser\", lb);\n        new i().setURI(ha).setMethod(\"POST\").setData({\n            notifier_id: kb,\n            enable: false\n        }).setErrorHandler(h.inform.curry(\"DisableNotifsForUserFail\", lb)).send();\n    };\n;\n    var ib = {\n        init: function(jb, kb, lb) {\n            var mb = k.getID(jb);\n            if (!u[mb]) {\n                g.listen(jb, \"click\", function(nb) {\n                    return na(jb, u[mb], lb, nb.getTarget());\n                });\n            }\n        ;\n        ;\n            if (((((lb === s)) && ia[kb].length))) {\n                eb(jb, kb, ia[kb]);\n            }\n        ;\n        ;\n            if (ba[kb]) {\n                ta(jb, kb);\n            }\n        ;\n        ;\n            u[mb] = kb;\n            j.conditionClass(jb, \"NonFriendSubscriptionMenu\", !v[kb]);\n            j.conditionClass(jb, \"cannotSubscribe\", !y[kb]);\n            j.conditionClass(jb, \"noSubscriptionLevels\", ((z[kb] && !aa[kb])));\n            j.conditionClass(jb, \"noSubscribeCheckbox\", ((!v[kb] && !z[kb])));\n            cb(jb, kb, w[kb]);\n            fb(jb, kb, x[kb]);\n            h.subscribe([\"FollowUser\",\"FollowingUser\",\"UnfollowUserFail\",], function(nb, ob) {\n                cb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"UnfollowUser\",\"UnfollowingUser\",\"FollowUserFail\",], function(nb, ob) {\n                h.inform(\"SubMenu/Reset\");\n                cb(jb, kb, false);\n            }.bind(this));\n            h.subscribe([\"EnableNotifsForUser\",\"DisableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, true);\n            }.bind(this));\n            h.subscribe([\"DisableNotifsForUser\",\"EnableNotifsForUserFail\",], function(nb, ob) {\n                fb(jb, kb, false);\n            }.bind(this));\n            h.subscribe(\"listeditor/friend_lists_changed\", function(nb, ob) {\n                if (ob.notify_state) {\n                    var pb = ((ob.added_uid ? ob.added_uid : ob.removed_uid));\n                    fb(jb, pb, ob.notify_state.is_notified);\n                }\n            ;\n            ;\n            }.bind(this));\n            db(jb, false);\n        },\n        getSubscriptions: function(jb) {\n            return {\n                level: ba[jb],\n                custom_categories: ca[jb]\n            };\n        },\n        setSubscriptions: function(jb, kb, lb, mb, nb, ob, pb, qb, rb, sb, tb, ub, vb) {\n            za(jb, ((pb + \"\")));\n            v[jb] = kb;\n            w[jb] = lb;\n            y[jb] = mb;\n            z[jb] = nb;\n            aa[jb] = ob;\n            da[jb] = ((rb + \"\"));\n            ca[jb] = qb.map(String);\n            ea[jb] = sb.map(String);\n            ia[jb] = vb;\n            x[jb] = tb;\n            la = ub;\n        }\n    };\n    e.exports = ((a.EditSubscriptions || ib));\n});\n__d(\"legacy:EditSubscriptions\", [\"SubscriptionLevels\",\"EditSubscriptions\",], function(a, b, c, d) {\n    a.SubscriptionLevels = b(\"SubscriptionLevels\");\n    a.EditSubscriptions = b(\"EditSubscriptions\");\n}, 3);\n__d(\"DynamicFriendListEducation\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"Dialog\",\"PageTransitions\",\"arrayContains\",\"createArrayFrom\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Dialog\"), k = b(\"PageTransitions\"), l = b(\"arrayContains\"), m = b(\"createArrayFrom\"), n = b(\"removeFromArray\"), o, p, q, r, s, t;\n    function u() {\n        ((q && q.hide()));\n        ((r && r.hide()));\n    };\n;\n    function v(y) {\n        n(p, y);\n        u();\n        s({\n            accept_tag_education: true\n        });\n    };\n;\n    function w() {\n        u();\n        s({\n            nux_cancel: true\n        });\n    };\n;\n    var x = {\n        init: function(y, z) {\n            o = y;\n            p = m(z).map(String);\n            k.registerHandler(function() {\n                u();\n                o = false;\n                s = undefined;\n                p = [];\n            });\n        },\n        showDialog: function(y, z, aa) {\n            if (((o && l(p, y)))) {\n                u();\n                h.inform(\"DynamicFriendListEducation/dialogOpen\", {\n                    uid: z,\n                    flid: y\n                });\n                s = aa;\n                q = new j().setAsync(new i(\"/ajax/friends/lists/smart_list_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true)).setHandler(v.bind(this, y)).setCloseHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogClosed\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).setCancelHandler(function() {\n                    h.inform(\"DynamicFriendListEducation/dialogCancel\", {\n                        uid: z,\n                        flid: y\n                    });\n                }).show();\n            }\n             else aa();\n        ;\n        ;\n        },\n        showContextualDialog: function(y, z, aa, ba) {\n            if (((o && l(p, y)))) {\n                u();\n                t = aa;\n                s = ba;\n                new i(\"/ajax/friends/lists/smart_list_contextual_education.php\").setMethod(\"GET\").setData({\n                    flid: y,\n                    uid: z\n                }).setReadOnly(true).send();\n            }\n             else ba();\n        ;\n        ;\n        },\n        setContextualDialog: function(y, z, aa, ba) {\n            r = y;\n            r.setContext(t);\n            r.show();\n            g.listen(z, \"click\", v.bind(this, ba));\n            g.listen(aa, \"click\", w);\n        }\n    };\n    e.exports = x;\n});\n__d(\"FriendStatus\", [\"function-extensions\",\"Arbiter\",\"AsyncRequest\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"eachKeyVal\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\"), l = b(\"eachKeyVal\");\n    function m(q, r, s) {\n        this.id = q;\n        this.update(r, s);\n    };\n;\n    j(m.prototype, {\n        update: function(q, r) {\n            ((q && (this.JSBNG__status = q)));\n            if (r) {\n                this.lists = k(r).map(String);\n                this._informListChange();\n            }\n        ;\n        ;\n        },\n        isComplete: function() {\n            return !!this.lists;\n        },\n        addToList: function(q) {\n            if (((this.lists && !i(this.lists, q)))) {\n                this.lists.push(q);\n            }\n        ;\n        ;\n            this._informListChange();\n        },\n        removeFromList: function(q) {\n            if (this.lists) {\n                var r = this.lists.indexOf(q);\n                ((((r !== -1)) && this.lists.splice(r, 1)));\n            }\n        ;\n        ;\n            this._informListChange();\n        },\n        updateList: function(q, r) {\n            ((r ? this.addToList(q) : this.removeFromList(q)));\n        },\n        _informListChange: function() {\n            g.inform(\"FriendListMembershipChange\", {\n                uid: this.id,\n                lists: this.lists\n            });\n        }\n    });\n    j(m, {\n        ARE_FRIENDS: 1,\n        INCOMING_REQUEST: 2,\n        OUTGOING_REQUEST: 3,\n        CAN_REQUEST: 4\n    });\n    var n = {\n    }, o = {\n    };\n    function p(q, r, s) {\n        if (!n[s.uid]) {\n            n[s.uid] = new m(s.uid, q);\n        }\n         else n[s.uid].update(q);\n    ;\n    ;\n        g.inform(\"FriendRequest/change\", {\n            uid: s.uid,\n            JSBNG__status: q\n        });\n    };\n;\n    g.subscribe([\"FriendRequest/cancel\",\"FriendRequest/unfriend\",\"FriendRequest/sendFail\",], p.curry(m.CAN_REQUEST));\n    g.subscribe([\"FriendRequest/confirmFail\",], p.curry(m.INCOMING_REQUEST));\n    g.subscribe([\"FriendRequest/cancelFail\",\"FriendRequest/sent\",\"FriendRequest/sending\",], p.curry(m.OUTGOING_REQUEST));\n    g.subscribe([\"FriendRequest/confirm\",\"FriendRequest/confirming\",], p.curry(m.ARE_FRIENDS));\n    j(m, {\n        CLOSE_FRIENDS: null,\n        ACQUAINTANCES: null,\n        getFriend: function(q, r) {\n            if (((n[q] && n[q].isComplete()))) {\n                r(n[q]);\n            }\n             else if (o[q]) {\n                o[q].push(r);\n            }\n             else {\n                o[q] = [r,];\n                new h().setURI(\"/ajax/friends/status.php\").setData({\n                    friend: q\n                }).setHandler(function(s) {\n                    var t = s.getPayload();\n                    m.initFriend.bind(m, q, t.JSBNG__status, t.lists).defer();\n                }).send();\n            }\n            \n        ;\n        ;\n        },\n        initFriend: function(q, r, s) {\n            var t = ((n[q] || new m(q)));\n            t.update(((t.JSBNG__status || r)), ((t.lists || s)));\n            n[q] = t;\n            ((o[q] && o[q].forEach(function(u) {\n                u(t);\n            })));\n            o[q] = null;\n        },\n        setSpecialLists: function(q) {\n            var r = ((m.CLOSE_FRIENDS === null));\n            m.CLOSE_FRIENDS = ((q.close + \"\"));\n            m.ACQUAINTANCES = ((q.acq + \"\"));\n            if (r) {\n                l(n, function(s, t) {\n                    t._informListChange();\n                });\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"FriendEditLists\", [\"Arbiter\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOMQuery\",\"DynamicFriendListEducation\",\"EditSubscriptions\",\"FriendStatus\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"URI\",\"$\",\"arrayContains\",\"copyProperties\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__CSS\"), j = b(\"DOMQuery\"), k = b(\"DynamicFriendListEducation\"), l = b(\"EditSubscriptions\"), m = b(\"FriendStatus\"), n = b(\"MenuDeprecated\"), o = b(\"Parent\"), p = b(\"ScrollableArea\"), q = b(\"URI\"), r = b(\"$\"), s = b(\"arrayContains\"), t = b(\"copyProperties\"), u = b(\"ge\"), v = 5, w = {\n    }, x = \"/ajax/profile/removefriendconfirm.php\", y = \"/ajax/friends/requests/cancel.php\", z = \"/ajax/choose/\", aa = \"/profile.php\", ba = \"/ajax/report/social.php\", ca, da;\n    function ea(pa, qa, ra) {\n        var sa = w[pa.id], ta = function(ua) {\n            var va = {\n                action: ((ra ? \"add_list\" : \"del_list\")),\n                to_friend: sa.id,\n                friendlists: [qa,],\n                source: ca\n            };\n            if (ua) {\n                t(va, ua);\n            }\n        ;\n        ;\n            sa.updateList(qa, ra);\n            var wa;\n            if (((ra && ((qa == m.CLOSE_FRIENDS))))) {\n                wa = ha(pa, m.ACQUAINTANCES);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.ACQUAINTANCES, false);\n                }\n            ;\n            ;\n            }\n             else if (((ra && ((qa == m.ACQUAINTANCES))))) {\n                wa = ha(pa, m.CLOSE_FRIENDS);\n                if (n.isItemChecked(wa)) {\n                    n.toggleItem(wa);\n                    ea(pa, m.CLOSE_FRIENDS, false);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            var xa = {\n                flid: qa,\n                uid: sa.id\n            }, ya = ((ra ? \"FriendListHovercard/add\" : \"FriendListHovercard/remove\"));\n            g.inform(ya, xa);\n            new h().setURI(\"/ajax/add_friend/action.php\").setData(va).send();\n        };\n        if (ra) {\n            k.showDialog(qa, sa.id, ta);\n        }\n         else ta();\n    ;\n    ;\n    };\n;\n    function fa(pa) {\n        var qa = j.scry(pa, \"input\")[0];\n        return ((qa && qa.value));\n    };\n;\n    function ga(pa, qa, ra) {\n        var sa = {\n            uid: qa.id\n        };\n        new h().setURI(y).setMethod(\"POST\").setData({\n            friend: qa.id\n        }).setHandler(g.inform.bind(g, \"FriendRequest/cancel\", sa)).setErrorHandler(g.inform.bind(g, \"FriendRequest/cancelFail\", sa)).setStatusElement(ra).send();\n    };\n;\n    function ha(pa, qa) {\n        var ra = n.getItems(pa);\n        for (var sa = 0; ((sa < ra.length)); sa++) {\n            if (((fa(ra[sa]) == qa))) {\n                return ra[sa];\n            }\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function ia(pa, qa) {\n        var ra = n.getItems(pa);\n        ra.forEach(function(sa) {\n            var ta = fa(sa), ua = s(qa.lists, ta);\n            if (((n.isItemChecked(sa) !== ua))) {\n                n.toggleItem(sa);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ja(pa) {\n        var qa = n.getItems(pa), ra = ((!i.hasClass(pa, \"followButtonFlyout\") && !i.hasClass(pa, \"likeButtonFlyout\"))), sa = [], ta = [], ua = 0, va = 0;\n        qa.forEach(function(ab) {\n            if (i.hasClass(ab, \"neverHide\")) {\n                i.removeClass(ab, \"underShowMore\");\n                ua++;\n            }\n             else if (n.isItemChecked(ab)) {\n                sa.push(ab);\n            }\n             else if (((((i.hasClass(ab, \"neverShow\") || i.hasClass(ab, \"FriendListCreateTrigger\"))) || ((!ra && i.hasClass(ab, \"friendOptionsOnly\")))))) {\n                i.addClass(ab, \"underShowMore\");\n                va++;\n            }\n             else ta.push(ab);\n            \n            \n        ;\n        ;\n        });\n        var wa = ((v - ua)), xa = sa.concat(ta), ya = va;\n        xa.forEach(function(ab) {\n            if (i.hasClass(ab, \"ShowMoreItem\")) {\n                wa--;\n                return;\n            }\n        ;\n        ;\n            if (wa) {\n                i.removeClass(ab, \"underShowMore\");\n                wa--;\n            }\n             else {\n                i.addClass(ab, \"underShowMore\");\n                ya = true;\n            }\n        ;\n        ;\n        });\n        i.conditionClass(pa, \"hasMoreFriendListItems\", ya);\n        var za = j.scry(pa, \".FriendListMenuShowMore\");\n        za.forEach(function(ab) {\n            i.removeClass(ab, \"FriendListMenuShowMore\");\n        });\n    };\n;\n    function ka(pa, qa) {\n        i.conditionClass(pa, \"FriendListMemorializedUser\", qa);\n    };\n;\n    function la(pa, qa) {\n        i.conditionClass(pa, \"FriendListCannotSuggestFriends\", !qa);\n    };\n;\n    function ma(pa, qa) {\n        var ra = j.scry(pa, \".FriendListUnfriend\")[0], sa = j.scry(pa, \".FriendListCancel\")[0], ta = j.scry(pa, \".FriendListSuggestFriends\")[0], ua = j.scry(pa, \".FriendListFriendship\")[0], va = j.scry(pa, \".FriendListReportBlock\")[0];\n        if (sa) {\n            i.conditionShow(sa, ((qa.JSBNG__status == m.OUTGOING_REQUEST)));\n        }\n    ;\n    ;\n        if (ra) {\n            i.conditionShow(ra, ((qa.JSBNG__status == m.ARE_FRIENDS)));\n            var wa = j.JSBNG__find(ra, \"a\");\n            wa.setAttribute(\"ajaxify\", q(x).addQueryData({\n                uid: qa.id,\n                unref: da\n            }).toString());\n        }\n         else i.conditionClass(pa, \"NoFriendListActionSeparator\", ((!sa || ((qa.JSBNG__status != m.OUTGOING_REQUEST)))));\n    ;\n    ;\n        if (ta) {\n            j.JSBNG__find(ta, \"a\").setAttribute(\"href\", q(z).addQueryData({\n                type: \"suggest_friends\",\n                newcomer: qa.id,\n                ref: \"profile_others_dropdown\"\n            }).toString());\n        }\n    ;\n    ;\n        if (ua) {\n            i.conditionShow(ua, ((qa.JSBNG__status == m.ARE_FRIENDS)));\n            j.JSBNG__find(ua, \"a\").setAttribute(\"href\", q(aa).addQueryData({\n                and: qa.id\n            }).toString());\n        }\n    ;\n    ;\n        if (va) {\n            j.JSBNG__find(va, \"a\").setAttribute(\"ajaxify\", q(ba).addQueryData({\n                content_type: 0,\n                cid: qa.id,\n                rid: qa.id\n            }).toString());\n        }\n    ;\n    ;\n    };\n;\n    function na(pa, qa) {\n        var ra = j.scry(pa, \"div.FriendListSubscriptionsMenu\");\n        if (((ra.length !== 0))) {\n            l.init(pa, qa, 45);\n        }\n    ;\n    ;\n    };\n;\n    g.subscribe(\"FriendRequest/change\", function(pa, qa) {\n        {\n            var fin237keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin237i = (0);\n            var ra;\n            for (; (fin237i < fin237keys.length); (fin237i++)) {\n                ((ra) = (fin237keys[fin237i]));\n                {\n                    var sa = u(ra), ta = w[ra];\n                    if (((((sa && ta)) && ((ta.id == qa.uid))))) {\n                        ia(sa, ta);\n                        ma(sa, ta);\n                        ja(sa);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    n.subscribe(\"select\", function(pa, qa) {\n        if (((i.hasClass(qa.JSBNG__item, \"ShowMoreItem\") && i.hasClass(qa.menu, \"FriendListMenu\")))) {\n            i.addClass(qa.menu, \"FriendListMenuShowMore\");\n            p.poke(qa.JSBNG__item);\n        }\n    ;\n    ;\n    });\n    var oa = {\n        init: function(pa, qa, ra, sa, ta, ua) {\n            pa = r(pa);\n            ca = ra;\n            da = ua;\n            if (!w[pa.id]) {\n                n.subscribe(\"select\", function(va, wa) {\n                    if (j.contains(pa, wa.JSBNG__item)) {\n                        if (o.byClass(wa.JSBNG__item, \"FriendListItem\")) {\n                            n.toggleItem(wa.JSBNG__item);\n                            var xa = fa(wa.JSBNG__item);\n                            ea(pa, xa, n.isItemChecked(wa.JSBNG__item));\n                        }\n                         else if (o.byClass(wa.JSBNG__item, \"FriendListCancel\")) {\n                            ga(pa, w[pa.id], wa.JSBNG__item);\n                        }\n                         else if (o.byClass(wa.JSBNG__item, \"FriendListUnfriend\")) {\n                            g.inform(\"FriendEditLists/unfriend\");\n                        }\n                        \n                        \n                    ;\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            i.addClass(pa, \"async_saving\");\n            m.getFriend(qa, function(va) {\n                ka(pa, sa);\n                la(pa, ta);\n                ia(pa, va);\n                ma(pa, va);\n                w[pa.id] = va;\n                ja(pa);\n                na(pa, qa);\n                i.removeClass(pa, \"async_saving\");\n            }.bind(this));\n        }\n    };\n    e.exports = ((a.FriendEditLists || oa));\n});\n__d(\"FriendListFlyoutController\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"Button\",\"ContextualLayer\",\"JSBNG__CSS\",\"DataStore\",\"Dialog\",\"DOM\",\"DOMQuery\",\"FriendEditLists\",\"FriendStatus\",\"Keys\",\"Layer\",\"LayerHideOnEscape\",\"LayerTabIsolation\",\"MenuDeprecated\",\"Parent\",\"ScrollableArea\",\"Style\",\"TabbableElements\",\"UserAgent\",\"cx\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Button\"), k = b(\"ContextualLayer\"), l = b(\"JSBNG__CSS\"), m = b(\"DataStore\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMQuery\"), q = b(\"FriendEditLists\"), r = b(\"FriendStatus\"), s = b(\"Keys\"), t = b(\"Layer\"), u = b(\"LayerHideOnEscape\"), v = b(\"LayerTabIsolation\"), w = b(\"MenuDeprecated\"), x = b(\"Parent\"), y = b(\"ScrollableArea\"), z = b(\"Style\"), aa = b(\"TabbableElements\"), ba = b(\"UserAgent\"), ca = b(\"cx\"), da = b(\"emptyFunction\"), ea, fa, ga = null, ha = null, ia, ja, ka, la, ma, na, oa = 1500, pa, qa = [\"uiButtonConfirm\",\"uiButtonSpecial\",\"-cx-PRIVATE-uiButton__special\",\"-cx-PRIVATE-uiButton__confirm\",\"-cx-PRIVATE-xuiButton__special\",\"-cx-PRIVATE-xuiOverlayButton__root\",\"-cx-PRIVATE-xuiButton__confirm\",], ra = {\n        init: function(tb, ub) {\n            ra.init = da;\n            ea = tb;\n            ea.subscribe(\"mouseenter\", ab);\n            ea.subscribe(\"mouseleave\", ob);\n            ea.subscribe(\"hide\", cb);\n            ea.enableBehavior(v);\n            ea.enableBehavior(u);\n            pa = ub;\n            if (ga) {\n                o.setContent(ea.getContent(), [ga,ha,]);\n            }\n        ;\n        ;\n            var vb = function(wb) {\n                var xb = x.byClass(wb.getTarget(), \"enableFriendListFlyout\");\n                if (xb) {\n                    if (((ia === xb))) {\n                        JSBNG__clearTimeout(la);\n                    }\n                     else {\n                        ((fa && qb()));\n                        nb(xb);\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n            g.listen(JSBNG__document.documentElement, {\n                mouseover: vb,\n                click: vb,\n                keydown: function(JSBNG__event) {\n                    var wb = JSBNG__event.getTarget();\n                    if (JSBNG__event.getModifiers().any) {\n                        return;\n                    }\n                ;\n                ;\n                    if (((!fa || p.isNodeOfType(wb, [\"input\",\"textarea\",])))) {\n                        return;\n                    }\n                ;\n                ;\n                    var xb = g.getKeyCode(JSBNG__event), yb;\n                    switch (xb) {\n                      case s.UP:\n                    \n                      case s.DOWN:\n                        var zb = za();\n                        yb = xa(zb);\n                        va(zb[((yb + ((((xb === s.UP)) ? -1 : 1))))]);\n                        return false;\n                      case s.SPACE:\n                        var ac = wa(wb);\n                        if (ac) {\n                            sa(ac);\n                            JSBNG__event.prevent();\n                        }\n                    ;\n                    ;\n                        break;\n                      default:\n                        var bc = String.fromCharCode(xb).toLowerCase(), cc = za();\n                        yb = xa(cc);\n                        var dc = yb, ec = cc.length;\n                        while (((((~yb && (((dc = ((++dc % ec))) !== yb)))) || ((!~yb && ((++dc < ec))))))) {\n                            var fc = w.getItemLabel(cc[dc]);\n                            if (((fc && ((fc.charAt(0).toLowerCase() === bc))))) {\n                                va(cc[dc]);\n                                return false;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    };\n                ;\n                }\n            });\n            h.subscribe(\"FriendEditLists/unfriend\", qb);\n            h.subscribe(\"DynamicFriendListEducation/dialogOpen\", function() {\n                na = true;\n            });\n            h.subscribe(\"DynamicFriendListEducation/dialogClosed\", function() {\n                na = false;\n                ob();\n            });\n        },\n        initContent: function(tb) {\n            o.appendContent(JSBNG__document.body, tb);\n            db(tb);\n            (function() {\n                if (!ga) {\n                    ga = tb;\n                    ((ea && o.setContent(ea.getContent(), [ga,ha,])));\n                    l.show(ga);\n                    g.listen(ga, \"click\", rb);\n                    ((fa && kb(ia)));\n                }\n                 else {\n                    o.remove(tb);\n                    tb = null;\n                }\n            ;\n            ;\n            }).defer();\n        },\n        initNux: function(tb) {\n            if (ha) {\n                return;\n            }\n        ;\n        ;\n            ha = tb;\n            ((ea && o.setContent(ea.getContent(), [ga,ha,])));\n        },\n        show: function(tb) {\n            lb(tb);\n        },\n        hide: function(tb) {\n            ((((tb === false)) ? qb() : ob()));\n        },\n        setActiveNode: function(tb) {\n            ((fa && qb()));\n            ia = tb;\n            ja = g.listen(tb, \"mouseleave\", function() {\n                ia = null;\n                ((ja && ja.remove()));\n            });\n        },\n        setCloseListener: function(tb, ub) {\n            m.set(tb, \"flfcloselistener\", ub);\n            if (((ia != tb))) {\n                m.set(tb, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        ;\n        },\n        setCloseListenerTimeout: function(tb) {\n            oa = tb;\n        }\n    };\n    function sa(tb) {\n        ((ba.firefox() && ua(tb).JSBNG__blur()));\n        w.inform(\"select\", {\n            menu: ta(tb),\n            JSBNG__item: tb\n        });\n    };\n;\n    function ta(tb) {\n        if (l.hasClass(tb, \"uiMenuContainer\")) {\n            return tb;\n        }\n    ;\n    ;\n        return x.byClass(tb, \"uiMenu\");\n    };\n;\n    function ua(tb) {\n        return p.JSBNG__find(tb, \"a.itemAnchor\");\n    };\n;\n    function va(tb) {\n        if (((tb && ya(tb)))) {\n            w._removeSelected(ea.getContent());\n            l.addClass(tb, \"selected\");\n            ua(tb).JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function wa(tb) {\n        return x.byClass(tb, \"uiMenuItem\");\n    };\n;\n    function xa(tb) {\n        if (JSBNG__document.activeElement) {\n            var ub = wa(JSBNG__document.activeElement);\n            return tb.indexOf(ub);\n        }\n    ;\n    ;\n        return -1;\n    };\n;\n    function ya(tb) {\n        return ((((!l.hasClass(tb, \"disabled\") && ((z.get(tb, \"display\") !== \"none\")))) && ((z.get(x.byClass(tb, \"uiMenu\"), \"display\") !== \"none\"))));\n    };\n;\n    function za() {\n        return w.getItems(ea.getContent()).filter(ya);\n    };\n;\n    function ab() {\n        JSBNG__clearTimeout(la);\n    };\n;\n    function bb(tb) {\n        for (var ub = 0; ((ub < qa.length)); ub++) {\n            if (l.hasClass(tb, qa[ub])) {\n                return false;\n            }\n        ;\n        ;\n        };\n    ;\n        return true;\n    };\n;\n    function cb() {\n        if (ia) {\n            if (bb(ia)) {\n                l.removeClass(ia, \"-cx-PUBLIC-uiHoverButton__selected\");\n                if (((l.hasClass(ia, \"uiButton\") || l.hasClass(ia, \"-cx-PRIVATE-uiButton__root\")))) {\n                    l.removeClass(ia, \"selected\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (m.get(ia, \"flfcloselistener\")) {\n                var tb = ia;\n                m.set(ia, \"flfcloselistenertimeout\", sb.curry(tb).defer(oa));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        fa = false;\n        jb();\n        ia = null;\n    };\n;\n    function db(tb) {\n        var ub = p.scry(tb, \"[tabindex=\\\"0\\\"]\");\n        ub.forEach(function(vb) {\n            vb.tabIndex = \"-1\";\n        });\n        ((ub[0] && (ub[0].tabIndex = \"0\")));\n    };\n;\n    function eb(tb) {\n        if (((p.isNodeOfType(tb, \"label\") && l.hasClass(tb, \"uiButton\")))) {\n            tb = j.getInputElement(tb);\n        }\n    ;\n    ;\n        return tb;\n    };\n;\n    function fb(tb) {\n        return m.get(eb(tb), \"profileid\");\n    };\n;\n    function gb(tb) {\n        return ((m.get(eb(tb), \"memorialized\") === \"true\"));\n    };\n;\n    function hb(tb) {\n        return ((m.get(eb(tb), \"cansuggestfriends\") === \"true\"));\n    };\n;\n    function ib(tb) {\n        return m.get(eb(tb), \"unref\");\n    };\n;\n    function jb() {\n        ((ja && ja.remove()));\n        ja = null;\n        ((ma && t.unsubscribe(ma)));\n        ma = null;\n        ((la && JSBNG__clearTimeout(la)));\n        la = null;\n    };\n;\n    function kb(tb) {\n        var ub = fb(tb), vb = gb(tb), wb = hb(tb), xb = m.get(tb, \"flloc\"), yb = ib(tb);\n        q.init(ga, ub, xb, vb, wb, yb);\n        l.conditionClass(ga, \"followButtonFlyout\", l.hasClass(tb, \"profileFollowButton\"));\n        l.conditionClass(ga, \"friendButtonFlyout\", ((((l.hasClass(tb, \"FriendRequestFriends\") || l.hasClass(tb, \"FriendRequestIncoming\"))) || l.hasClass(tb, \"FriendRequestOutgoing\"))));\n        l.conditionClass(ga, \"likeButtonFlyout\", l.hasClass(tb, \"profileLikeButton\"));\n        var zb = p.scry(ga, \"div.uiScrollableArea\")[0];\n        ((zb && y.poke(zb)));\n        var ac = aa.JSBNG__find(ga)[0];\n        ((ac && ac.JSBNG__focus()));\n    };\n;\n    function lb(tb) {\n        if (((!ea || fa))) {\n            return;\n        }\n    ;\n    ;\n        ea.setContext(tb);\n        ea.setCausalElement(tb);\n        tb.setAttribute(\"aria-expanded\", \"true\");\n        if (bb(tb)) {\n            l.addClass(tb, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if (((l.hasClass(tb, \"uiButton\") || l.hasClass(tb, \"-cx-PRIVATE-uiButton__root\")))) {\n                l.addClass(tb, \"selected\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        ea.show();\n        ia = tb;\n        fa = true;\n        var ub = null;\n        if (ga) {\n            ub = \"show\";\n            kb(tb);\n        }\n         else {\n            ub = \"init_show\";\n            new i().setURI(\"/ajax/friends/lists/flyout_content.php\").setStatusElement(ea.getContent()).send();\n        }\n    ;\n    ;\n        jb();\n        ja = g.listen(tb, \"mouseleave\", ob);\n        ma = t.subscribe(\"show\", mb);\n        if (m.get(tb, \"flfcloselistener\")) {\n            JSBNG__clearTimeout(m.remove(tb, \"flfcloselistenertimeout\"));\n        }\n    ;\n    ;\n        var vb = fb(tb);\n        r.getFriend(vb, function(wb) {\n            if (((wb.JSBNG__status == r.ARE_FRIENDS))) {\n                new i().setURI(\"/ajax/friends/lists/flyout_log.php\").setData({\n                    target_id: fb(tb),\n                    unref: ib(tb),\n                    action: ub\n                }).send();\n            }\n        ;\n        ;\n            if (!ha) {\n                return;\n            }\n        ;\n        ;\n            if (((wb.JSBNG__status == r.OUTGOING_REQUEST))) {\n                l.show(ha);\n                i.bootstrap(\"/ajax/friends/lists/nux_flyout.php\", null, true);\n            }\n             else l.hide(ha);\n        ;\n        ;\n        });\n    };\n;\n    function mb(tb, ub) {\n        if (((!((ub instanceof k)) || !p.contains(ia, ub.getContext())))) {\n            ob();\n        }\n    ;\n    ;\n    };\n;\n    function nb(tb) {\n        ia = tb;\n        ka = lb.curry(tb).defer(pa);\n        ja = g.listen(tb, \"mouseleave\", function() {\n            JSBNG__clearTimeout(ka);\n            ia = null;\n            ((ja && ja.remove()));\n        });\n    };\n;\n    function ob() {\n        la = qb.defer(150);\n    };\n;\n    function pb() {\n        var tb = n.getCurrent(), ub = ((tb && tb.getBody()));\n        return !!((ub && p.scry(ub, \".friendListDialogTourCarousel\")[0]));\n    };\n;\n    function qb() {\n        if (((na || pb()))) {\n            return;\n        }\n    ;\n    ;\n        ((((ba.ie() < 8)) && JSBNG__document.documentElement.JSBNG__focus()));\n        if (ea) {\n            ea.hide();\n            var tb = ea.getCausalElement();\n            ((tb && tb.setAttribute(\"aria-expanded\", \"false\")));\n        }\n    ;\n    ;\n    };\n;\n    function rb(JSBNG__event) {\n        var tb = x.byTag(JSBNG__event.getTarget(), \"a\");\n        if (((tb && l.hasClass(tb, \"FriendListActionItem\")))) {\n            ob();\n        }\n    ;\n    ;\n    };\n;\n    function sb(tb) {\n        var ub = m.remove(tb, \"flfcloselistener\");\n        ((ub && ub()));\n    };\n;\n    e.exports = ((a.FriendListFlyoutController || ra));\n});\n__d(\"AddFriendButton\", [\"JSBNG__Event\",\"Animation\",\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"collectDataAttributes\",\"JSBNG__CSS\",\"DOMQuery\",\"FriendListFlyoutController\",\"FriendStatus\",\"ge\",\"goURI\",\"Style\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AsyncResponse\"), l = b(\"collectDataAttributes\"), m = b(\"JSBNG__CSS\"), n = b(\"DOMQuery\"), o = b(\"FriendListFlyoutController\"), p = b(\"FriendStatus\"), q = b(\"ge\"), r = b(\"goURI\"), s = b(\"Style\"), t = b(\"URI\"), u = {\n        ERROR_ALREADY_ADDED: 1431005,\n        init: function(v, w, x, y, z, aa, ba, ca, da, ea, fa, ga) {\n            var ha = v.id, ia = null, ja = n.scry(v, \".addButton\")[0], ka = n.scry(v, \".addFriendText\")[0], la = n.scry(v, \".outgoingButton\")[0], ma = n.scry(v, \".incomingButton\")[0], na = n.scry(v, \".friendButton\")[0];\n            function oa(ua, va, wa) {\n                var xa = new t(ja.getAttribute(\"ajaxify\")), ya = l(v, [\"ft\",\"gt\",]);\n                new j().setURI(aa).setData({\n                    to_friend: w,\n                    action: ua,\n                    how_found: y,\n                    ref_param: z,\n                    link_data: ya,\n                    outgoing_id: la.id,\n                    xids: xa.getQueryData().xids,\n                    logging_location: ba,\n                    no_flyout_on_click: ca,\n                    ego_log_data: da,\n                    http_referer: fa\n                }).setErrorHandler(va).setServerDialogCancelHandler(wa).setRelativeTo(la).send();\n                if (((ga && ((ua === \"add_friend\"))))) {\n                    new j().setURI(\"/ajax/add_friend/chain_pymk.php\").send();\n                }\n            ;\n            ;\n            };\n        ;\n            function pa(ua, va) {\n                if (ka) {\n                    m.hide(ka);\n                }\n                 else if (ja) {\n                    m.hide(ja);\n                }\n                \n            ;\n            ;\n                ((la && m.hide(la)));\n                ((ma && m.hide(ma)));\n                ((na && m.hide(na)));\n                if (ua) {\n                    m.show(ua);\n                }\n            ;\n            ;\n                if (((((((\"Outgoing\" == va)) && ((ia != va)))) && ea))) {\n                    new h(ua).from(\"backgroundColor\", \"#FFF8CC\").to(\"backgroundColor\", \"transparent\").from(\"borderColor\", \"#FFE222\").to(\"borderColor\", s.get(ua, \"borderLeftColor\")).duration(2000).go();\n                }\n            ;\n            ;\n                ((ia && m.removeClass(v, ((\"fStatus\" + ia)))));\n                ia = va;\n                m.addClass(v, ((\"fStatus\" + va)));\n            };\n        ;\n            function qa(ua) {\n                if (m.hasClass(ua, \"enableFriendListFlyout\")) {\n                    o.show(ua);\n                }\n                 else o.hide();\n            ;\n            ;\n            };\n        ;\n            var ra = i.subscribe(\"FriendRequest/change\", function(ua, va) {\n                ta();\n                if (((va.uid != w))) {\n                    return;\n                }\n            ;\n            ;\n                switch (va.JSBNG__status) {\n                  case p.ARE_FRIENDS:\n                    return pa(na, \"Friends\");\n                  case p.INCOMING_REQUEST:\n                    return pa(ma, \"Incoming\");\n                  case p.OUTGOING_REQUEST:\n                    return pa(la, \"Outgoing\");\n                  case p.CAN_REQUEST:\n                    return pa(((ka ? ka : ja)), \"Requestable\");\n                };\n            ;\n            }), sa;\n            if (x) {\n                sa = i.subscribe(\"FriendRequest/confirm\", function(ua, va) {\n                    ta();\n                    ((((va.uid == w)) && r(x)));\n                });\n            }\n        ;\n        ;\n            ((ja && g.listen(ja, \"click\", function() {\n                i.inform(\"FriendRequest/sending\", {\n                    uid: w\n                });\n                if (ca) {\n                    o.setActiveNode(la);\n                }\n                 else qa(la);\n            ;\n            ;\n                oa(\"add_friend\", function(ua) {\n                    var va = ((((ua.error == u.ERROR_ALREADY_ADDED)) ? \"FriendRequest/sent\" : \"FriendRequest/sendFail\"));\n                    i.inform(va, {\n                        uid: w\n                    });\n                    o.hide();\n                    k.defaultErrorHandler(ua);\n                }, function(ua) {\n                    i.inform(\"FriendRequest/sendFail\", {\n                        uid: w\n                    });\n                    o.hide();\n                });\n            })));\n            function ta() {\n                if (q(ha)) {\n                    return;\n                }\n            ;\n            ;\n                ((ra && ra.unsubscribe()));\n                ((sa && sa.unsubscribe()));\n                ra = sa = null;\n            };\n        ;\n        }\n    };\n    e.exports = u;\n});\n__d(\"FriendButtonIcon\", [\"Arbiter\",\"FriendStatus\",\"Button\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"FriendStatus\"), i = b(\"Button\"), j = b(\"arrayContains\");\n    e.exports = {\n        register: function(k, l, m) {\n            g.subscribe(\"FriendListMembershipChange\", function(n, o) {\n                if (((o.uid == m))) {\n                    var p = j(o.lists, h.CLOSE_FRIENDS), q = j(o.lists, h.ACQUAINTANCES);\n                    if (((p && !q))) {\n                        i.setIcon(k, l.close);\n                    }\n                     else if (((q && !p))) {\n                        i.setIcon(k, l.acquaintance);\n                    }\n                     else i.setIcon(k, l.friend);\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        }\n    };\n});\n__d(\"legacy:friend-browser-checkbox-js\", [\"FriendBrowserCheckboxController\",], function(a, b, c, d) {\n    a.FriendBrowserCheckboxController = b(\"FriendBrowserCheckboxController\");\n}, 3);\n__d(\"legacy:onvisible\", [\"OnVisible\",], function(a, b, c, d) {\n    a.OnVisible = b(\"OnVisible\");\n}, 3);");
// 12378
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o161,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yW/r/W9EdqwZ5ZfH.js",o162);
// undefined
o161 = null;
// undefined
o162 = null;
// 12391
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"dShSX\",]);\n}\n;\n__d(\"TrackingPixel\", [\"Arbiter\",\"ControlledReferer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ControlledReferer\"), i = {\n        _iframe: undefined,\n        loadWithNoReferrer: function(j) {\n            if (!i._iframe) {\n                var k = document.createElement(\"iframe\");\n                k.frameborder = 0;\n                k.width = k.height = 1;\n                k.style.position = \"absolute\";\n                k.style.top = \"-10px\";\n                h.useFacebookReferer(k, function() {\n                    g.inform(\"TrackingPixel/iframeIsLoaded\", null, g.BEHAVIOR_PERSISTENT);\n                }, null);\n                document.body.appendChild(k);\n                i._iframe = k;\n            }\n        ;\n            g.subscribe(\"TrackingPixel/iframeIsLoaded\", function() {\n                var l = i._iframe.contentWindow.document, m = l.createElement(\"img\");\n                m.src = j;\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ExternalTrackingTag\", [\"AsyncSignal\",\"TrackingPixel\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"TrackingPixel\"), i = b(\"Event\"), j = {\n        listenForElementClick: function(k, l, m, n) {\n            i.listen(k, \"click\", function() {\n                j.sendRequest(l, m, n);\n            });\n        },\n        sendRequest: function(k, l, m) {\n            if (!k) {\n                return\n            };\n            new g(\"/ads/external_tracking_tag/\", {\n                href: k,\n                tracking_tag_id: l,\n                adgroup_id: m\n            }).send();\n            h.loadWithNoReferrer(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"ad-logging\", [\"Arbiter\",\"AsyncRequest\",\"Banzai\",\"collectDataAttributes\",\"Parent\",\"TrackingNodes\",\"ExternalTrackingTag\",], function(a, b, c, d, e, f) {\n    var g = \"ssinfeed\", h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Banzai\"), k = b(\"collectDataAttributes\"), l = b(\"Parent\"), m = b(\"TrackingNodes\"), n = b(\"ExternalTrackingTag\"), o = {\n    };\n    function p(s) {\n        return (((((s.getAttribute && ((s.getAttribute(\"ajaxify\") || s.getAttribute(\"data-endpoint\")))) || s.action) || s.href) || s.name));\n    };\n    function q(s) {\n        var t = (s.ei || s.ai);\n        if ((!t && s.mei)) {\n            t = s.mf_story_key;\n        };\n        if (((s !== null) && (typeof (t) === \"string\"))) {\n            var u = false;\n            if (s.tn) {\n                var v = m.parseTrackingNodeString(s.tn);\n                for (var w = 0; (w < v.length); w++) {\n                    var x = v[w][0];\n                    switch (x) {\n                      case m.types.LIKE_LINK:\n                    \n                      case m.types.UNLIKE_LINK:\n                    \n                      case m.types.COMMENT:\n                    \n                      case m.types.ADD_COMMENT_BOX:\n                        return;\n                      case m.types.XBUTTON:\n                    \n                      case m.types.HIDE_LINK:\n                    \n                      case m.types.REPORT_SPAM_LINK:\n                    \n                      case m.types.HIDE_ALL_LINK:\n                    \n                      case m.types.DROPDOWN_BUTTON:\n                    \n                      case m.types.UNHIDE_LINK:\n                        return;\n                      case m.types.RELATED_SHARE:\n                        return;\n                      case m.types.ATTACHMENT:\n                    \n                      case m.types.USER_MESSAGE:\n                        u = true;\n                        break;\n                    };\n                };\n            }\n        ;\n            var y = Date.now(), z = 500;\n            s.duplicate_click = (!!o[t] && (((y - o[t]) < z)));\n            o[t] = y;\n            if (j.isEnabled(\"ssinfeed\")) {\n                j.post(g, s, {\n                    delay: 0,\n                    retry: j.isEnabled(\"ssinfeed_retry\")\n                });\n            }\n             else {\n                var aa = new i(\"/ajax/ssinfeed/end/\").setData(s).setAllowCrossPageTransition(true).setMethod(\"POST\");\n                aa.send();\n            }\n        ;\n            if (((u && s.external_tracking_tag) && !s.duplicate_click)) {\n                n.sendRequest(s.external_tracking_tag.url, s.external_tracking_tag.tag_id, s.external_tracking_tag.adgroup_id);\n            };\n        }\n    ;\n    };\n    function r(s, t) {\n        if (!t.node) {\n            return\n        };\n        var u = p(t.node), v = (l.byTag(t.node, \"input\") || l.byTag(t.node, \"button\"));\n        if (((((!u && v) && (v.type == \"submit\")) && v.getAttribute) && v.getAttribute(\"data-ft\"))) {\n            u = \"#\";\n        };\n        var w;\n        if (((u && t.event) && (((t.event.type === \"click\") || (t.event.type === \"contextmenu\"))))) {\n            w = k(t.node, [\"ft\",]);\n            w.ft.href = u;\n            w.ft.mouse_type = t.event.type;\n            q(w.ft);\n        }\n    ;\n    };\n    h.subscribe(\"ClickRefAction/new\", r);\n});\n__d(\"PopoverMenu.react\", [\"CSS\",\"InlineBlock.react\",\"Popover\",\"PopoverMenu\",\"React\",\"ReactPropTypes\",\"SubscriptionsHandler\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"InlineBlock.react\"), i = b(\"Popover\"), j = b(\"PopoverMenu\"), k = b(\"React\"), l = b(\"ReactPropTypes\"), m = b(\"SubscriptionsHandler\"), n = b(\"cx\"), o = b(\"joinClasses\");\n    function p(r, s) {\n        var t, u;\n        for (var v in r) {\n            t = r[v];\n            u = s[v];\n            if (((typeof t === \"object\") && (typeof u === \"object\"))) {\n                if (!p(t, u)) {\n                    return false\n                };\n            }\n             else if ((t !== u)) {\n                return false\n            }\n        ;\n        };\n        return true;\n    };\n    var q = k.createClass({\n        displayName: \"ReactPopoverMenu\",\n        propTypes: {\n            alignh: l.oneOf([\"left\",\"center\",\"right\",]),\n            layerBehaviors: l.array,\n            menu: l.object,\n            disabled: l.bool\n        },\n        _menuSubscriptions: null,\n        componentDidMount: function() {\n            var r = this.refs.root.getDOMNode(), s = r.firstChild;\n            g.addClass(s, \"-cx-PRIVATE-uiPopover__trigger\");\n            this._popover = new i(r, s, this.props.layerBehaviors, {\n                alignh: this.props.alignh,\n                disabled: this.props.disabled\n            });\n            this._popoverMenu = new j(this._popover, s, this._createMenu(this.props.menu), this.props.behaviors);\n        },\n        componentDidUpdate: function(r) {\n            if (!p(r.menu, this.props.menu)) {\n                if (this._menuSubscriptions) {\n                    this._menuSubscriptions.release();\n                    this._menuSubscriptions = null;\n                }\n            ;\n                this._popoverMenu.setMenu(this._createMenu(this.props.menu));\n            }\n        ;\n            if ((this.props.alignh !== r.alignh)) {\n                this._popoverMenu.getPopover().getLayer().setAlignment(this.props.alignh);\n            };\n            if ((this.props.disabled !== r.disabled)) {\n                if (this.props.disabled) {\n                    this._popoverMenu.disable();\n                }\n                 else this._popoverMenu.enable();\n            \n            };\n        },\n        getFirstChild: function() {\n            var r = this.props.children;\n            return (Array.isArray(r) ? r[0] : r);\n        },\n        getButtonSize: function() {\n            var r = this.getFirstChild();\n            return (r && r.getButtonSize());\n        },\n        render: function() {\n            var r = this.getFirstChild();\n            r.props.className = o((r.props.className || \"\"), \"-cx-PRIVATE-uiPopover__trigger\");\n            return this.transferPropsTo(h({\n                alignv: \"middle\",\n                className: \"uiPopover\",\n                ref: \"root\",\n                disabled: null\n            }, this.props.children));\n        },\n        componentWillUnmount: function() {\n            if (this._menuSubscriptions) {\n                this._menuSubscriptions.release();\n                this._menuSubscriptions = null;\n            }\n        ;\n        },\n        _createMenu: function(r) {\n            var s = new r.ctor(r.menuitems, r.config);\n            this._menuSubscriptions = new m();\n            if (r.onItemClick) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"itemclick\", r.onItemClick));\n            };\n            if (r.onChange) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"change\", r.onChange));\n            };\n            if (this.props.onShow) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"show\", this.props.onShow));\n            };\n            if (this.props.onHide) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"hide\", this.props.onHide));\n            };\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ReactMenu\", [\"Menu\",\"MenuItem\",\"MenuSelectableItem\",\"MenuTheme\",\"SelectableMenu\",\"cx\",\"flattenArray\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Menu\"), h = b(\"MenuItem\"), i = b(\"MenuSelectableItem\"), j = b(\"MenuTheme\"), k = b(\"SelectableMenu\"), l = b(\"cx\"), m = b(\"flattenArray\"), n = b(\"merge\"), o = Array.prototype.slice;\n    function p(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: g,\n            menuitems: m((r || [])),\n            config: {\n                theme: j,\n                maxheight: (q ? q.maxheight : null)\n            }\n        };\n        return n(s, q);\n    };\n    p.SelectableMenu = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: k,\n            menuitems: m(r),\n            config: {\n                className: \"-cx-PUBLIC-abstractSelectableMenu__root\",\n                theme: j,\n                multiple: (q && q.multiple),\n                maxheight: (q ? q.maxheight : null)\n            }\n        };\n        return n(s, q);\n    };\n    p.Item = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: h,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    p.SelectableItem = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        };\n        var s = {\n            ctor: i,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    e.exports = p;\n});\n__d(\"UFIOrderingModeSelector.react\", [\"InlineBlock.react\",\"Link.react\",\"LoadingIndicator.react\",\"React\",\"Image.react\",\"ReactMenu\",\"PopoverMenu.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"InlineBlock.react\"), h = b(\"Link.react\"), i = b(\"LoadingIndicator.react\"), j = b(\"React\"), k = b(\"Image.react\"), l = b(\"ReactMenu\"), m = b(\"PopoverMenu.react\"), n = b(\"cx\"), o = b(\"ix\"), p = l.SelectableMenu, q = l.SelectableItem, r = j.createClass({\n        displayName: \"UFIOrderingModeSelector\",\n        getInitialState: function() {\n            var s = null;\n            this.props.orderingmodes.map(function(t) {\n                if (t.selected) {\n                    s = t;\n                };\n            });\n            return {\n                selectedMode: s\n            };\n        },\n        onMenuItemClick: function(s, t) {\n            var u = t.item.getValue();\n            this.props.orderingmodes.map(function(v) {\n                if ((v.value === u)) {\n                    this.setState({\n                        selectedMode: v\n                    });\n                };\n            }.bind(this));\n            this.props.onOrderChanged(u);\n        },\n        render: function() {\n            var s = null;\n            if ((this.props.currentOrderingMode != this.state.selectedMode.value)) {\n                s = i({\n                    className: \"UFIOrderingModeSelectorLoading\",\n                    color: \"white\",\n                    size: \"small\"\n                });\n            };\n            var t = p({\n                onItemClick: this.onMenuItemClick\n            }, this.props.orderingmodes.map(function(u) {\n                return (q({\n                    key: u.value,\n                    value: u.value,\n                    selected: (u.value === this.state.selectedMode.value)\n                }, u.name));\n            }.bind(this)));\n            return (j.DOM.div({\n                className: \"UFIOrderingModeSelector\"\n            }, s, g(null, m({\n                className: \"UFIOrderingModeSelectorPopover\",\n                menu: t,\n                alignh: \"right\"\n            }, h(null, this.state.selectedMode.name, k({\n                className: \"UFIOrderingModeSelectorDownCaret\",\n                src: o(\"/images/ui/xhp/link/more/down_caret.gif\")\n            }))))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"SwapButtonDEPRECATED\", [\"Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k(l, m, n) {\n        this._swapperButton = l;\n        this._swappeeButton = m;\n        g.listen(l, \"click\", this.swap.bind(this));\n        if (n) {\n            g.listen(m, \"click\", this.unswap.bind(this));\n        };\n        h.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", this.setFocusOnSwapper.bind(this), h.SUBSCRIBE_ALL);\n    };\n    i(k.prototype, {\n        _swapperButton: null,\n        _swappeeButton: null,\n        swap: function(l) {\n            j.hide(this._swapperButton);\n            j.show(this._swappeeButton);\n            ((l !== false) && this._swappeeButton.focus());\n        },\n        unswap: function(l) {\n            j.show(this._swapperButton);\n            j.hide(this._swappeeButton);\n            ((l !== false) && this._swapperButton.focus());\n        },\n        toggle: function() {\n            j.toggle(this._swapperButton);\n            j.toggle(this._swappeeButton);\n        },\n        setFocusOnSwapper: function() {\n            this._swapperButton.focus();\n        }\n    });\n    e.exports = k;\n});\n__d(\"SubscribeButton\", [\"Arbiter\",\"AsyncRequest\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Event\"), j = {\n        SUBSCRIBED: \"FollowingUser\",\n        UNSUBSCRIBED: \"UnfollowingUser\",\n        init: function(k, l, m, n, o, p) {\n            i.listen(l, \"click\", function() {\n                g.inform(j.SUBSCRIBED, {\n                    profile_id: n\n                });\n            });\n            g.subscribe(j.SUBSCRIBED, function(q, r) {\n                if ((n === r.profile_id)) {\n                    if (!o) {\n                        m.suppressNextMouseEnter();\n                    };\n                    k.swap();\n                    if ((p === true)) {\n                        new h().setURI(\"/ajax/profile/suggestions_on_following.php\").setData({\n                            profileid: n\n                        }).send();\n                    };\n                }\n            ;\n            });\n            g.subscribe(j.UNSUBSCRIBED, function(q, r) {\n                if ((n === r.profile_id)) {\n                    k.unswap();\n                    m.hideFlyout();\n                    g.inform(\"SubMenu/Reset\");\n                }\n            ;\n            });\n        },\n        initUnsubscribe: function(k, l) {\n            i.listen(k, \"click\", function() {\n                g.inform.bind(g, j.UNSUBSCRIBED, {\n                    profile_id: l\n                }).defer();\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"Tour\", [\"Arbiter\",\"LayerDestroyOnHide\",\"LayerHideOnEscape\",\"copyProperties\",\"NavigationMessage\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"LayerDestroyOnHide\"), i = b(\"LayerHideOnEscape\"), j = b(\"copyProperties\"), k = b(\"NavigationMessage\");\n    function l() {\n        if (l._instance) {\n            l._instance.setTourComplete();\n        };\n        l._instance = this;\n    };\n    j(l.prototype, {\n        tourStarted: false,\n        tourComplete: false,\n        _navigationBeginToken: null,\n        _pageLeaveToken: null,\n        steps: {\n        },\n        openDialog: null,\n        init: function() {\n            this._pageLeaveToken = g.subscribe(\"onload/exit\", this.handleLeavePage.bind(this));\n            this._navigationBeginToken = g.subscribe(k.NAVIGATION_BEGIN, this.handleTransition.bind(this));\n            this.steps = {\n            };\n            return this;\n        },\n        registerStep: function(m, n) {\n            m.disableBehavior(h);\n            m.disableBehavior(i);\n            this.steps[n] = m;\n            m.subscribe(\"show\", function() {\n                m.inform(\"tour-dialog-show\", m);\n            });\n            if (!this.getTourStarted()) {\n                this.setTourStart();\n            };\n        },\n        _unsubscribeSubscriptions: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._pageLeaveToken.unsubscribe();\n        },\n        handleLeavePage: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTransition: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTourStart: function() {\n        \n        },\n        handleTourStop: function() {\n        \n        },\n        handleTourComplete: function() {\n        \n        },\n        showStep: function(m) {\n            var n = this.steps[m];\n            if (!((this.openDialog == n))) {\n                this.hideOpenDialog();\n            };\n            if (!n) {\n                return\n            };\n            this.openDialog = n;\n            n.show();\n        },\n        hideOpenDialog: function() {\n            if (this.openDialog) {\n                this.openDialog.hide();\n                this.openDialog = null;\n            }\n        ;\n        },\n        getTourStarted: function() {\n            return this.tourStarted;\n        },\n        setTourStart: function() {\n            this.tourStarted = true;\n            this.handleTourStart();\n        },\n        setTourStop: function() {\n            this.tourStarted = false;\n            this.hideOpenDialog();\n            this.handleTourStop();\n        },\n        setTourComplete: function() {\n            if (this.tourComplete) {\n                return\n            };\n            this.setTourStop();\n            this.tourComplete = true;\n            this.handleTourComplete();\n        },\n        hideStep: function(m) {\n            var n = this.steps[m];\n            (n && n.hide());\n        }\n    });\n    j(l, {\n        getInstance: function() {\n            return (l._instance || (l._instance = new l()));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FutureSideNavItem\", [\"Arbiter\",\"CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\");\n    function n(o, p) {\n        this.id = o.id;\n        this.up = p;\n        this.endpoint = o.endpoint;\n        this.type = o.type;\n        this.node = (o.node || k(o.id));\n        this.paths = (o.path ? m(o.path) : []);\n        this.keys = (o.key ? m(o.key) : []);\n        var q = this._findKeys(this.keys);\n        this.numericKey = (q.numeric || this.keys[0]);\n        this.textKey = (q.text || this.keys[0]);\n        this._pathPattern = this._buildRegex(this.paths);\n        this._keyPattern = this._buildRegex(this.keys);\n        this.hideLoading();\n        this.hideSelected();\n    };\n    l(n.prototype, {\n        equals: function(o) {\n            return (o && (o.id === this.id));\n        },\n        getLinkNode: function() {\n            return ((i.scry(this.node, \"a.item\")[0] || i.scry(this.node, \"a.subitem\")[0]));\n        },\n        matchPath: function(o) {\n            return this._matchInput(this._pathPattern, o);\n        },\n        matchKey: function(o) {\n            return this._matchInput(this._keyPattern, o);\n        },\n        _matchInput: function(o, p) {\n            var q = (o && o.exec(p));\n            return (q && q.slice(1));\n        },\n        getTop: function() {\n            return (this.isTop() ? this : this.up.getTop());\n        },\n        isTop: function(o) {\n            return !this.up;\n        },\n        setCount: function(o, p) {\n            return this._updateCount(o, true);\n        },\n        incrementCount: function(o, p) {\n            return this._updateCount(o, false);\n        },\n        _updateCount: function(o, p, q) {\n            var r = i.scry(this.node, \"span.count\")[0], s = (r && i.scry(r, \"span.countValue\")[0]);\n            if (s) {\n                var t = (p ? 0 : parseInt(i.getText(s), 10)), u = Math.max(0, (t + o)), v = (this.isTop() ? \"hidden\" : \"hiddenSubitem\");\n                i.setContent(s, u);\n                (q && h.conditionClass(this.node, v, !u));\n                h.conditionClass(r, \"hidden_elem\", !u);\n                if (this.isTop()) {\n                    var w = i.scry(this.node, \"div.linkWrap\")[0];\n                    if (w) {\n                        h.conditionClass(w, \"noCount\", !u);\n                        h.conditionClass(w, \"hasCount\", u);\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n            g.inform(\"NavigationMessage.COUNT_UPDATE_DONE\");\n        },\n        showLoading: function() {\n            h.addClass(this.node, \"loading\");\n        },\n        hideLoading: function() {\n            h.removeClass(this.node, \"loading\");\n        },\n        showSelected: function() {\n            h.addClass(this.node, \"selectedItem\");\n            (h.hasClass(this.node, \"hider\") && h.addClass(this._getExpanderParent(), \"expandedMode\"));\n        },\n        hideSelected: function() {\n            h.removeClass(this.node, \"selectedItem\");\n        },\n        showChildren: function() {\n            h.addClass(this.node, \"open\");\n        },\n        hideChildren: function() {\n            h.removeClass(this.node, \"open\");\n        },\n        _getExpanderParent: function() {\n            return j.byClass(this.node, \"expandableSideNav\");\n        },\n        _buildRegex: function(o) {\n            if (o.length) {\n                var p = o.map(function(q) {\n                    if ((typeof q === \"string\")) {\n                        return q.replace(/([^a-z0-9_])/gi, \"\\\\$1\");\n                    }\n                     else if ((q && q.regex)) {\n                        return q.regex\n                    }\n                ;\n                });\n                return new RegExp(((\"^(?:\" + p.join(\"|\")) + \")$\"));\n            }\n        ;\n        },\n        _findKeys: function(o) {\n            var p = /^(app|group|fl)_/, q = {\n            };\n            for (var r = 0; (r < o.length); r++) {\n                var s = p.test(o[r]);\n                if ((s && !q.numeric)) {\n                    q.numeric = o[r];\n                }\n                 else if ((!s && !q.text)) {\n                    q.text = o[r];\n                }\n            ;\n                if ((q.numeric && q.text)) {\n                    break;\n                };\n            };\n            return q;\n        }\n    });\n    e.exports = n;\n});\n__d(\"FutureSideNavSection\", [\"Bootloader\",\"DOMQuery\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"DOMQuery\"), i = b(\"$\"), j = b(\"copyProperties\");\n    function k(l) {\n        this.id = l.id;\n        this.node = (this.node || i(l.id));\n        this.editEndpoint = l.editEndpoint;\n    };\n    j(k.prototype, {\n        equals: function(l) {\n            return (l && (l.id === this.id));\n        },\n        getEditorAsync: function(l) {\n            g.loadModules([\"SortableSideNav\",], function(m) {\n                var n = new m(h.find(this.node, \"ul.uiSideNav\"), this.editEndpoint);\n                l(n);\n            }.bind(this));\n        }\n    });\n    e.exports = k;\n});\n__d(\"FutureSideNav\", [\"Arbiter\",\"Bootloader\",\"ChannelConstants\",\"CSS\",\"DOM\",\"Event\",\"FutureSideNavItem\",\"FutureSideNavSection\",\"NavigationMessage\",\"PageTransitions\",\"Parent\",\"Run\",\"SelectorDeprecated\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"ChannelConstants\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Event\"), m = b(\"FutureSideNavItem\"), n = b(\"FutureSideNavSection\"), o = b(\"NavigationMessage\"), p = b(\"PageTransitions\"), q = b(\"Parent\"), r = b(\"Run\"), s = b(\"SelectorDeprecated\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"Vector\"), w = b(\"copyProperties\"), x = b(\"createArrayFrom\");\n    function y() {\n        (y.instance && y.instance.uninstall());\n        y.instance = this;\n    };\n    y.instance = null;\n    y.getInstance = function() {\n        return (y.instance || new y());\n    };\n    w(y.prototype, {\n        init: function(z, aa, ba) {\n            this.root = z;\n            this.items = {\n            };\n            this.sections = {\n            };\n            this.editor = null;\n            this.editing = false;\n            this.selected = null;\n            this.loading = null;\n            this.keyParam = \"sk\";\n            this.defaultKey = aa;\n            this.uri = t.getRequestURI();\n            this.ajaxPipe = ba;\n            this.ajaxPipeEndpoints = {\n            };\n            this.sidecol = true;\n            this._installed = true;\n            this._handlePageTransitions = true;\n            p.registerHandler(function(ca) {\n                return (this._handlePageTransitions && this.handlePageTransition(ca));\n            }.bind(this));\n            this._eventHandlers = [];\n            this._arbiterSubscriptions = [g.subscribe(o.NAVIGATION_COMPLETED, this.navigationComplete.bind(this)),g.subscribe(o.NAVIGATION_FAILED, this.navigationFailed.bind(this)),g.subscribe(o.NAVIGATION_COUNT_UPDATE, this.navigationCountUpdate.bind(this)),g.subscribe(o.NAVIGATION_SELECT, this.navigationSelect.bind(this)),g.subscribe(i.getArbiterType(\"nav_update_counts\"), this.navigationCountUpdateFromPresence.bind(this)),];\n            this._explicitHover = [];\n            this._ensureHover(\"sideNavItem\");\n            this._eventHandlers.push(l.listen(window, \"resize\", this._handleResize.bind(this)));\n            this._checkNarrow();\n            this._selectorSubscriptions = [];\n            (window.Selector && this._selectorSubscriptions.push(s.subscribe([\"open\",\"close\",], function(ca, da) {\n                var ea = q.byClass(da.selector, \"sideNavItem\");\n                (ea && j.conditionClass(ea, \"editMenuOpened\", (ca === \"open\")));\n            })));\n            r.onLeave(this.uninstall.bind(this));\n            if (this._pendingSections) {\n                this._pendingSections.forEach(function(ca) {\n                    this.initSection.apply(this, ca);\n                }.bind(this));\n            };\n        },\n        _handleResize: (function() {\n            var z;\n            return function() {\n                (z && clearTimeout(z));\n                z = this._checkNarrow.bind(this).defer(200);\n            };\n        })(),\n        _checkNarrow: function() {\n            j.conditionClass(this.root, \"uiNarrowSideNav\", (v.getElementPosition(this.root).x < 20));\n        },\n        _ensureHover: function(z) {\n            if ((u.ie() < 8)) {\n                h.loadModules([\"ExplicitHover\",], function(aa) {\n                    this._explicitHover.push(new aa(this.root, z));\n                }.bind(this));\n            };\n        },\n        uninstall: function() {\n            if (this._installed) {\n                this._installed = false;\n                this._handlePageTransitions = false;\n                this._arbiterSubscriptions.forEach(g.unsubscribe);\n                this._selectorSubscriptions.forEach(function(z) {\n                    s.unsubscribe(z);\n                });\n                this._eventHandlers.forEach(function(z) {\n                    z.remove();\n                });\n                this._explicitHover.forEach(function(z) {\n                    z.uninstall();\n                });\n            }\n        ;\n        },\n        initSection: function(z, aa) {\n            if (!this._installed) {\n                this._pendingSections = (this._pendingSections || []);\n                this._pendingSections.push(arguments);\n                return;\n            }\n        ;\n            this._initItems(aa);\n            this._initSection(z);\n        },\n        addItem: function(z, aa) {\n            this._initItem(z, aa);\n        },\n        _initItems: function(z) {\n            var aa = function(ba, ca) {\n                var da = this._initItem(ba, ca);\n                if (ba.children) {\n                    ba.children.forEach(function(ea) {\n                        aa(ea, da);\n                    });\n                };\n            }.bind(this);\n            x(z).forEach(function(ba) {\n                aa(ba, null);\n            });\n        },\n        _initItem: function(z, aa) {\n            var ba = this.items[z.id] = this._constructItem(z, aa);\n            if ((ba.equals(this.selected) || z.selected)) {\n                this.setSelected(ba);\n            };\n            var ca = ba.getLinkNode();\n            (ca && this._eventHandlers.push(l.listen(ca, \"click\", function(event) {\n                return !this.editing;\n            }.bind(this))));\n            return ba;\n        },\n        _initSection: function(z) {\n            var aa = this.sections[z.id] = this._constructSection(z);\n            this._eventHandlers.push(l.listen(aa.node, \"click\", this.handleSectionClick.bind(this, aa)));\n            k.scry(aa.node, \"div.bookmarksMenuButton\").forEach(j.show);\n            return aa;\n        },\n        _constructItem: function(z, aa) {\n            return new m(z, aa);\n        },\n        _constructSection: function(z) {\n            return new n(z);\n        },\n        handleSectionClick: function(z, event) {\n            var aa = this._getEventTarget(event, \"a\"), ba = this._getItemForNode(aa);\n            if (!aa) {\n                return;\n            }\n             else if (j.hasClass(aa.parentNode, \"uiMenuItem\")) {\n                this._handleMenuClick(z, ba, aa.parentNode, event);\n            }\n             else this._handleLinkClick(z, aa, event);\n            \n        ;\n        },\n        _getEventTarget: function(event, z) {\n            var aa = event.getTarget();\n            if ((aa.tagName !== z.toUpperCase())) {\n                return q.byTag(aa, z);\n            }\n             else return aa\n        ;\n        },\n        _handleMenuClick: function(z, aa, ba, event) {\n            if (j.hasClass(ba, \"rearrange\")) {\n                this.beginEdit(z);\n            };\n        },\n        _handleLinkClick: function(z, aa, event) {\n            if (j.hasClass(aa, \"navEditDone\")) {\n                (this.editing ? this.endEdit() : this.beginEdit(z));\n                event.kill();\n            }\n        ;\n        },\n        getItem: function(z) {\n            if (this._isCurrentPath(z)) {\n                return this._getItemForKey((this._getKey(z.getQueryData()) || this.defaultKey));\n            }\n             else return this._getItemForPath(z.getPath())\n        ;\n        },\n        getNodeForKey: function(z) {\n            var aa = this._getItemForKey(z);\n            if (aa) {\n                return aa.node\n            };\n        },\n        _isCurrentPath: function(z) {\n            return ((z.getDomain() === this.uri.getDomain()) && (z.getPath() === this.uri.getPath()));\n        },\n        _getKey: function(z) {\n            return z[this.keyParam];\n        },\n        _getItemForNode: function(z) {\n            z = q.byClass(z, \"sideNavItem\");\n            return (z && this.items[z.id]);\n        },\n        _getItemForKey: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchKey(z);\n            });\n        },\n        _getItemForPath: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchPath(z);\n            });\n        },\n        _findItem: function(z) {\n            for (var aa in this.items) {\n                if (z(this.items[aa])) {\n                    return this.items[aa]\n                };\n            };\n        },\n        removeItem: function(z) {\n            if ((z && this.items[z.id])) {\n                k.remove(z.node);\n                delete this.items[z.id];\n            }\n        ;\n        },\n        removeItemByKey: function(z) {\n            this.removeItem(this._getItemForKey(z));\n        },\n        moveItem: function(z, aa, ba) {\n            var ca = k.find(z.node, \"ul.uiSideNav\");\n            ((ba ? k.prependContent : k.appendContent))(ca, aa.node);\n        },\n        setLoading: function(z) {\n            (this.loading && this.loading.hideLoading());\n            this.loading = z;\n            (this.loading && this.loading.showLoading());\n        },\n        setSelected: function(z) {\n            this.setLoading(null);\n            if (this.selected) {\n                this.selected.hideSelected();\n                this.selected.getTop().hideChildren();\n            }\n        ;\n            this.selected = z;\n            if (this.selected) {\n                this.selected.showSelected();\n                this.selected.getTop().showChildren();\n            }\n        ;\n        },\n        handlePageTransition: function(z) {\n            var aa = this.getItem(z), ba = ((aa && aa.endpoint) && this._doPageTransition(aa, z));\n            return ba;\n        },\n        _doPageTransition: function(z, aa) {\n            this.setLoading(z);\n            this._sendPageTransition(z.endpoint, w(this._getTransitionData(z, aa), aa.getQueryData()));\n            return true;\n        },\n        _sendPageTransition: function(z, aa) {\n            aa.endpoint = z;\n            g.inform(o.NAVIGATION_BEGIN, {\n                useAjaxPipe: this._useAjaxPipe(z),\n                params: aa\n            });\n        },\n        _getTransitionData: function(z, aa) {\n            var ba = {\n            };\n            ba.sidecol = this.sidecol;\n            ba.path = aa.getPath();\n            ba[this.keyParam] = z.textKey;\n            ba.key = z.textKey;\n            return ba;\n        },\n        _useAjaxPipe: function(z) {\n            return (this.ajaxPipe || this.ajaxPipeEndpoints[z]);\n        },\n        navigationComplete: function() {\n            (this.loading && this.setSelected(this.loading));\n        },\n        navigationFailed: function() {\n            this.setLoading(null);\n        },\n        navigationSelect: function(z, aa) {\n            var ba = this._getItemForKey(this._getKey(aa));\n            if (aa.asLoading) {\n                this.setLoading(ba);\n            }\n             else this.setSelected(ba);\n        ;\n        },\n        navigationCountUpdate: function(z, aa) {\n            var ba = this._getItemForKey((aa && aa.key));\n            if (ba) {\n                if ((typeof aa.count !== \"undefined\")) {\n                    ba.setCount(aa.count, aa.hide);\n                }\n                 else if ((typeof aa.increment !== \"undefined\")) {\n                    ba.incrementCount(aa.increment, aa.hide);\n                }\n            \n            };\n        },\n        navigationCountUpdateFromPresence: function(z, aa) {\n            aa = aa.obj;\n            if (aa) {\n                if ((!aa.class_name || (aa.class_name && j.hasClass(this.root, aa.class_name)))) {\n                    if (aa.items) {\n                        for (var ba = 0; (ba < aa.items.length); ba++) {\n                            this.navigationCountUpdate(z, aa.items[ba]);;\n                        }\n                    }\n                }\n            };\n        },\n        beginEdit: function(z) {\n            if (!this.editing) {\n                this.editing = true;\n                j.addClass(this.root, \"editMode\");\n                this._updateTrackingData();\n                this._initEditor(z);\n            }\n        ;\n        },\n        endEdit: function() {\n            if (this.editing) {\n                j.removeClass(this.root, \"editMode\");\n                (this.editor && this.editor.endEdit());\n                this.editor = null;\n                this.editing = false;\n                this._updateTrackingData();\n            }\n        ;\n        },\n        _updateTrackingData: function(z) {\n            var aa = (this.root.getAttribute(\"data-gt\") || \"{}\");\n            try {\n                aa = JSON.parse(aa);\n                if (this.editing) {\n                    aa.editing = true;\n                }\n                 else delete aa.editing;\n            ;\n                this.root.setAttribute(\"data-gt\", JSON.stringify(aa));\n            } catch (ba) {\n            \n            };\n        },\n        _initEditor: function(z) {\n            z.getEditorAsync(function(aa) {\n                if (this.editing) {\n                    this.editor = aa;\n                    this.editor.beginEdit();\n                }\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = y;\n});\n__d(\"PageFanning\", [\"Animation\",\"AsyncRequest\",\"CSS\",\"DOM\",\"FutureSideNav\",\"Parent\",\"URI\",\"$\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"FutureSideNav\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"$\"), o = b(\"collectDataAttributes\"), p = b(\"copyProperties\"), q = {\n        setFanStatus: function(s, t, u, v, w, x, y) {\n            var z = {\n                ft: {\n                }\n            };\n            if (s) {\n                z = {\n                    ft: o(s, [\"ft\",]).ft\n                };\n            };\n            w = (w || function(ca) {\n                var da = ca.getPayload();\n                if ((!da || !s)) {\n                    return\n                };\n                if (da.reload) {\n                    q.reloadOnFanStatusChanged(da.preserve_tab);\n                }\n                 else r(s, da);\n            ;\n            });\n            var aa = {\n                fbpage_id: t,\n                add: u,\n                reload: v\n            };\n            if ((y != null)) {\n                p(aa, y);\n            };\n            p(aa, z);\n            var ba = new h().setURI(\"/ajax/pages/fan_status.php\").setData(aa).setNectarModuleDataSafe(s).setHandler(w);\n            if (x) {\n                ba.setErrorHandler(x);\n            };\n            ba.send();\n            return false;\n        },\n        reloadOnFanStatusChanged: function(s) {\n            var t = m.getRequestURI();\n            if (s) {\n                var u = k.getInstance().selected.textKey;\n                if ((!t.getQueryData().sk && u)) {\n                    t.addQueryData({\n                        sk: u\n                    });\n                };\n            }\n        ;\n            window.location.href = t;\n        },\n        toggleLikeOnFanStatusChanged: function(s, t) {\n            var u = n((\"liked_pages_like_action_\" + s)), v = n((\"liked_pages_undo_action_\" + s));\n            i.conditionClass(u, \"hidden_elem\", t);\n            i.conditionClass(v, \"hidden_elem\", !t);\n        },\n        informPageLikeButtonOnChange: function(s, t) {\n            var u = a.PageLikeButton;\n            if (u) {\n                if (t) {\n                    u.informLike(s);\n                    u.informLikeSuccess(s);\n                }\n                 else u.informUnlike(s);\n            \n            };\n        }\n    };\n    function r(s, t) {\n        var u = t.feedback;\n        if (!u) {\n            return\n        };\n        if (l.byClass(s, \"fbTimelineEscapeSectionItem\")) {\n            s = (l.byClass(s, \"fan_status_inactive\") || s);\n        };\n        var v = j.create(\"span\", {\n            className: \"fan_status_inactive\"\n        }, u);\n        s.parentNode.replaceChild(v, s);\n        var w = function() {\n            if (t.can_repeat_action) {\n                v.parentNode.replaceChild(s, v);\n            };\n        };\n        new g(v).duration(3000).checkpoint().to(\"backgroundColor\", \"#FFFFFF\").duration(1000).ondone(w).go();\n    };\n    e.exports = q;\n});\n__d(\"PageLikeButton\", [\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"Event\",\"PageFanning\",\"SubscribeButton\",\"Tour\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Event\"), k = b(\"PageFanning\"), l = b(\"SubscribeButton\"), m = b(\"Tour\"), n = b(\"URI\"), o = {\n        LIKED: \"liked\",\n        UNLIKED: \"unliked\",\n        LIKED_SUCCESS: \"liked_success\",\n        init: function(r, s, t, u, v, w, x, y, z, aa, ba) {\n            g.subscribe(o.LIKED, function(ca, da) {\n                if ((u === da.profile_id)) {\n                    if (!z) {\n                        t.suppressNextMouseEnter();\n                    };\n                    r.swap(ba);\n                }\n            ;\n            });\n            g.subscribe(o.UNLIKED, function(ca, da) {\n                if ((u === da.profile_id)) {\n                    r.unswap(ba);\n                    t.hideFlyout();\n                }\n            ;\n            });\n            if (y) {\n                g.subscribe(o.LIKED_SUCCESS, function(ca, da) {\n                    var ea = n.getRequestURI().getQueryData().app_data;\n                    if ((da.profile_id == u)) {\n                        new h().setURI(\"/ajax/pages/fetch_app_column.php\").setData({\n                            profile_id: u,\n                            tab_key: y,\n                            app_data: ea\n                        }).send();\n                    };\n                });\n            };\n            j.listen(s, \"click\", q.bind(null, u, v, w, x));\n        },\n        initCallout: function(r, s) {\n            var t = document.getElementById(\"pageActionLikeCalloutButton\");\n            j.listen(t, \"click\", q.bind(null, r, s, null, null));\n        },\n        initUnlike: function(r, s, t) {\n            j.listen(r, \"click\", function(event) {\n                p(event.getTarget(), s, false, function(u) {\n                    g.inform(o.LIKED, {\n                        profile_id: s\n                    });\n                    i.defaultErrorHandler(u);\n                }, t);\n                o.informUnlike(s);\n            });\n        },\n        informLike: function(r, s, t) {\n            var u = {\n                profile_id: r,\n                target: s,\n                origin: t\n            };\n            g.inform(o.LIKED, u);\n            g.inform(l.SUBSCRIBED, u);\n        },\n        informLikeSuccess: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform(o.LIKED_SUCCESS, s);\n        },\n        informUnlike: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform.bind(g, o.UNLIKED, s).defer();\n            g.inform.bind(g, l.UNSUBSCRIBED, s).defer();\n        }\n    };\n    function p(r, s, t, u, v, w, x) {\n        m.getInstance().hideStep(\"low_page_likes\");\n        k.setFanStatus(r, s, t, false, function() {\n            o.informLikeSuccess(s);\n        }, u, {\n            fan_origin: v,\n            fan_source: w,\n            cat: x\n        });\n    };\n    function q(r, s, t, u, event) {\n        p(event.getTarget(), r, true, function(v) {\n            g.inform(o.UNLIKED, {\n                profile_id: r\n            });\n            i.defaultErrorHandler(v);\n        }, s, t, u);\n        o.informLike(r, event.getTarget(), s);\n    };\n    e.exports = o;\n    a.PageLikeButton = o;\n});\n__d(\"legacy:PageLikeButton\", [\"PageLikeButton\",], function(a, b, c, d) {\n    a.PageLikeButton = b(\"PageLikeButton\");\n}, 3);\n__d(\"HoverButton\", [\"AsyncRequest\",\"CSS\",\"DOM\",\"URI\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        this._button = n;\n        this._flyout = o;\n        this._flyoutAjaxify = q;\n        this._flyoutContent = p;\n        o.subscribe(\"show\", this._onShow.bind(this));\n        o.subscribe(\"hide\", this._onHide.bind(this));\n    };\n    k(m.prototype, {\n        _button: null,\n        _flyout: null,\n        _flyoutAjaxify: null,\n        _flyoutContent: null,\n        showFlyoutBriefly: function() {\n            this.showFlyout();\n            this._flyout.hideFlyoutDelayed(5000);\n        },\n        showFlyout: function() {\n            this._flyout.showFlyout(this._button, true);\n            this._flyout.inform(\"show\", this._button);\n        },\n        hideFlyout: function() {\n            this._flyout.hideFlyout(true);\n            this._flyout.inform(\"hide\", this._button);\n        },\n        enableButton: function() {\n            this._flyout.initNode(this._button);\n        },\n        disableButton: function() {\n            this.hideFlyout();\n            this._flyout.deactivateNode(this._button);\n        },\n        _onShow: function(n, o) {\n            h.addClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if ((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\"))) {\n                h.addClass(o, \"selected\");\n            };\n            if (this._flyoutAjaxify) {\n                h.addClass(this._flyoutContent, \"async_saving\");\n                new g().setURI(new j(this._flyoutAjaxify)).setHandler(function(p) {\n                    h.removeClass(this._flyoutContent, \"async_saving\");\n                    i.setContent(this._flyoutContent, p.payload);\n                }.bind(this)).send();\n                this._flyoutAjaxify = null;\n            }\n        ;\n        },\n        _onHide: function(n, o) {\n            h.removeClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if ((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\"))) {\n                h.removeClass(o, \"selected\");\n            };\n        },\n        destroy: function() {\n            this.hideFlyout();\n            this._flyout.destroy();\n        },\n        suppressNextMouseEnter: function() {\n            this._flyout.setActiveNode(this._button);\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:ui-side-nav-future-js\", [\"FutureSideNav\",], function(a, b, c, d) {\n    a.FutureSideNav = b(\"FutureSideNav\");\n}, 3);");
// 12392
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s98531d6b18e98ac4b77cb6624350e8113c34f3ad");
// 12393
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"dShSX\",]);\n}\n;\n;\n__d(\"TrackingPixel\", [\"Arbiter\",\"ControlledReferer\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ControlledReferer\"), i = {\n        _iframe: undefined,\n        loadWithNoReferrer: function(j) {\n            if (!i._iframe) {\n                var k = JSBNG__document.createElement(\"div\");\n                k.frameborder = 0;\n                k.width = k.height = 1;\n                k.style.position = \"absolute\";\n                k.style.JSBNG__top = \"-10px\";\n                h.useFacebookReferer(k, function() {\n                    g.inform(\"TrackingPixel/iframeIsLoaded\", null, g.BEHAVIOR_PERSISTENT);\n                }, null);\n                JSBNG__document.body.appendChild(k);\n                i._iframe = k;\n            }\n        ;\n        ;\n            g.subscribe(\"TrackingPixel/iframeIsLoaded\", function() {\n                var l = i._iframe.contentWindow.JSBNG__document, m = l.createElement(\"img\");\n                m.src = j;\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"ExternalTrackingTag\", [\"AsyncSignal\",\"TrackingPixel\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"TrackingPixel\"), i = b(\"JSBNG__Event\"), j = {\n        listenForElementClick: function(k, l, m, n) {\n            i.listen(k, \"click\", function() {\n                j.sendRequest(l, m, n);\n            });\n        },\n        sendRequest: function(k, l, m) {\n            if (!k) {\n                return;\n            }\n        ;\n        ;\n            new g(\"/ads/external_tracking_tag/\", {\n                href: k,\n                tracking_tag_id: l,\n                adgroup_id: m\n            }).send();\n            h.loadWithNoReferrer(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"ad-logging\", [\"Arbiter\",\"AsyncRequest\",\"Banzai\",\"collectDataAttributes\",\"Parent\",\"TrackingNodes\",\"ExternalTrackingTag\",], function(a, b, c, d, e, f) {\n    var g = \"ssinfeed\", h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"Banzai\"), k = b(\"collectDataAttributes\"), l = b(\"Parent\"), m = b(\"TrackingNodes\"), n = b(\"ExternalTrackingTag\"), o = {\n    };\n    function p(s) {\n        return ((((((((s.getAttribute && ((s.getAttribute(\"ajaxify\") || s.getAttribute(\"data-endpoint\"))))) || s.action)) || s.href)) || s.JSBNG__name));\n    };\n;\n    function q(s) {\n        var t = ((s.ei || s.ai));\n        if (((!t && s.mei))) {\n            t = s.mf_story_key;\n        }\n    ;\n    ;\n        if (((((s !== null)) && ((typeof (t) === \"string\"))))) {\n            var u = false;\n            if (s.tn) {\n                var v = m.parseTrackingNodeString(s.tn);\n                for (var w = 0; ((w < v.length)); w++) {\n                    var x = v[w][0];\n                    switch (x) {\n                      case m.types.LIKE_LINK:\n                    \n                      case m.types.UNLIKE_LINK:\n                    \n                      case m.types.COMMENT:\n                    \n                      case m.types.ADD_COMMENT_BOX:\n                        return;\n                      case m.types.XBUTTON:\n                    \n                      case m.types.HIDE_LINK:\n                    \n                      case m.types.REPORT_SPAM_LINK:\n                    \n                      case m.types.HIDE_ALL_LINK:\n                    \n                      case m.types.DROPDOWN_BUTTON:\n                    \n                      case m.types.UNHIDE_LINK:\n                        return;\n                      case m.types.RELATED_SHARE:\n                        return;\n                      case m.types.ATTACHMENT:\n                    \n                      case m.types.USER_MESSAGE:\n                        u = true;\n                        break;\n                    };\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var y = JSBNG__Date.now(), z = 500;\n            s.duplicate_click = ((!!o[t] && ((((y - o[t])) < z))));\n            o[t] = y;\n            if (j.isEnabled(\"ssinfeed\")) {\n                j.post(g, s, {\n                    delay: 0,\n                    retry: j.isEnabled(\"ssinfeed_retry\")\n                });\n            }\n             else {\n                var aa = new i(\"/ajax/ssinfeed/end/\").setData(s).setAllowCrossPageTransition(true).setMethod(\"POST\");\n                aa.send();\n            }\n        ;\n        ;\n            if (((((u && s.external_tracking_tag)) && !s.duplicate_click))) {\n                n.sendRequest(s.external_tracking_tag.url, s.external_tracking_tag.tag_id, s.external_tracking_tag.adgroup_id);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function r(s, t) {\n        if (!t.node) {\n            return;\n        }\n    ;\n    ;\n        var u = p(t.node), v = ((l.byTag(t.node, \"input\") || l.byTag(t.node, \"button\")));\n        if (((((((((!u && v)) && ((v.type == \"submit\")))) && v.getAttribute)) && v.getAttribute(\"data-ft\")))) {\n            u = \"#\";\n        }\n    ;\n    ;\n        var w;\n        if (((((u && t.JSBNG__event)) && ((((t.JSBNG__event.type === \"click\")) || ((t.JSBNG__event.type === \"contextmenu\"))))))) {\n            w = k(t.node, [\"ft\",]);\n            w.ft.href = u;\n            w.ft.mouse_type = t.JSBNG__event.type;\n            q(w.ft);\n        }\n    ;\n    ;\n    };\n;\n    h.subscribe(\"ClickRefAction/new\", r);\n});\n__d(\"PopoverMenu.react\", [\"JSBNG__CSS\",\"InlineBlock.react\",\"Popover\",\"PopoverMenu\",\"React\",\"ReactPropTypes\",\"SubscriptionsHandler\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"InlineBlock.react\"), i = b(\"Popover\"), j = b(\"PopoverMenu\"), k = b(\"React\"), l = b(\"ReactPropTypes\"), m = b(\"SubscriptionsHandler\"), n = b(\"cx\"), o = b(\"joinClasses\");\n    function p(r, s) {\n        var t, u;\n        {\n            var fin238keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin238i = (0);\n            var v;\n            for (; (fin238i < fin238keys.length); (fin238i++)) {\n                ((v) = (fin238keys[fin238i]));\n                {\n                    t = r[v];\n                    u = s[v];\n                    if (((((typeof t === \"object\")) && ((typeof u === \"object\"))))) {\n                        if (!p(t, u)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((t !== u))) {\n                        return false;\n                    }\n                    \n                ;\n                ;\n                };\n            };\n        };\n    ;\n        return true;\n    };\n;\n    var q = k.createClass({\n        displayName: \"ReactPopoverMenu\",\n        propTypes: {\n            alignh: l.oneOf([\"left\",\"center\",\"right\",]),\n            layerBehaviors: l.array,\n            menu: l.object,\n            disabled: l.bool\n        },\n        _menuSubscriptions: null,\n        componentDidMount: function() {\n            var r = this.refs.root.getDOMNode(), s = r.firstChild;\n            g.addClass(s, \"-cx-PRIVATE-uiPopover__trigger\");\n            this._popover = new i(r, s, this.props.layerBehaviors, {\n                alignh: this.props.alignh,\n                disabled: this.props.disabled\n            });\n            this._popoverMenu = new j(this._popover, s, this._createMenu(this.props.menu), this.props.behaviors);\n        },\n        componentDidUpdate: function(r) {\n            if (!p(r.menu, this.props.menu)) {\n                if (this._menuSubscriptions) {\n                    this._menuSubscriptions.release();\n                    this._menuSubscriptions = null;\n                }\n            ;\n            ;\n                this._popoverMenu.setMenu(this._createMenu(this.props.menu));\n            }\n        ;\n        ;\n            if (((this.props.alignh !== r.alignh))) {\n                this._popoverMenu.getPopover().getLayer().setAlignment(this.props.alignh);\n            }\n        ;\n        ;\n            if (((this.props.disabled !== r.disabled))) {\n                if (this.props.disabled) {\n                    this._popoverMenu.disable();\n                }\n                 else this._popoverMenu.enable();\n            ;\n            }\n        ;\n        ;\n        },\n        getFirstChild: function() {\n            var r = this.props.children;\n            return ((Array.isArray(r) ? r[0] : r));\n        },\n        getButtonSize: function() {\n            var r = this.getFirstChild();\n            return ((r && r.getButtonSize()));\n        },\n        render: function() {\n            var r = this.getFirstChild();\n            r.props.className = o(((r.props.className || \"\")), \"-cx-PRIVATE-uiPopover__trigger\");\n            return this.transferPropsTo(h({\n                alignv: \"middle\",\n                className: \"uiPopover\",\n                ref: \"root\",\n                disabled: null\n            }, this.props.children));\n        },\n        componentWillUnmount: function() {\n            if (this._menuSubscriptions) {\n                this._menuSubscriptions.release();\n                this._menuSubscriptions = null;\n            }\n        ;\n        ;\n        },\n        _createMenu: function(r) {\n            var s = new r.ctor(r.menuitems, r.config);\n            this._menuSubscriptions = new m();\n            if (r.onItemClick) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"itemclick\", r.onItemClick));\n            }\n        ;\n        ;\n            if (r.onChange) {\n                this._menuSubscriptions.addSubscriptions(s.subscribe(\"change\", r.onChange));\n            }\n        ;\n        ;\n            if (this.props.onShow) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"show\", this.props.onShow));\n            }\n        ;\n        ;\n            if (this.props.onHide) {\n                this._menuSubscriptions.addSubscriptions(this._popover.subscribe(\"hide\", this.props.onHide));\n            }\n        ;\n        ;\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"ReactMenu\", [\"Menu\",\"MenuItem\",\"MenuSelectableItem\",\"MenuTheme\",\"SelectableMenu\",\"cx\",\"flattenArray\",\"merge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Menu\"), h = b(\"MenuItem\"), i = b(\"MenuSelectableItem\"), j = b(\"MenuTheme\"), k = b(\"SelectableMenu\"), l = b(\"cx\"), m = b(\"flattenArray\"), n = b(\"merge\"), o = Array.prototype.slice;\n    function p(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: g,\n            menuitems: m(((r || []))),\n            config: {\n                theme: j,\n                maxheight: ((q ? q.maxheight : null))\n            }\n        };\n        return n(s, q);\n    };\n;\n    p.SelectableMenu = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: k,\n            menuitems: m(r),\n            config: {\n                className: \"-cx-PUBLIC-abstractSelectableMenu__root\",\n                theme: j,\n                multiple: ((q && q.multiple)),\n                maxheight: ((q ? q.maxheight : null))\n            }\n        };\n        return n(s, q);\n    };\n    p.Item = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: h,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    p.SelectableItem = function(q, r) {\n        if (!Array.isArray(r)) {\n            r = o.call(arguments, 1);\n        }\n    ;\n    ;\n        var s = {\n            ctor: i,\n            reactChildren: r\n        };\n        return n(s, q);\n    };\n    e.exports = p;\n});\n__d(\"UFIOrderingModeSelector.react\", [\"InlineBlock.react\",\"Link.react\",\"LoadingIndicator.react\",\"React\",\"JSBNG__Image.react\",\"ReactMenu\",\"PopoverMenu.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"InlineBlock.react\"), h = b(\"Link.react\"), i = b(\"LoadingIndicator.react\"), j = b(\"React\"), k = b(\"JSBNG__Image.react\"), l = b(\"ReactMenu\"), m = b(\"PopoverMenu.react\"), n = b(\"cx\"), o = b(\"ix\"), p = l.SelectableMenu, q = l.SelectableItem, r = j.createClass({\n        displayName: \"UFIOrderingModeSelector\",\n        getInitialState: function() {\n            var s = null;\n            this.props.orderingmodes.map(function(t) {\n                if (t.selected) {\n                    s = t;\n                }\n            ;\n            ;\n            });\n            return {\n                selectedMode: s\n            };\n        },\n        onMenuItemClick: function(s, t) {\n            var u = t.JSBNG__item.getValue();\n            this.props.orderingmodes.map(function(v) {\n                if (((v.value === u))) {\n                    this.setState({\n                        selectedMode: v\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            this.props.onOrderChanged(u);\n        },\n        render: function() {\n            var s = null;\n            if (((this.props.currentOrderingMode != this.state.selectedMode.value))) {\n                s = i({\n                    className: \"UFIOrderingModeSelectorLoading\",\n                    color: \"white\",\n                    size: \"small\"\n                });\n            }\n        ;\n        ;\n            var t = p({\n                onItemClick: this.onMenuItemClick\n            }, this.props.orderingmodes.map(function(u) {\n                return (q({\n                    key: u.value,\n                    value: u.value,\n                    selected: ((u.value === this.state.selectedMode.value))\n                }, u.JSBNG__name));\n            }.bind(this)));\n            return (j.DOM.div({\n                className: \"UFIOrderingModeSelector\"\n            }, s, g(null, m({\n                className: \"UFIOrderingModeSelectorPopover\",\n                menu: t,\n                alignh: \"right\"\n            }, h(null, this.state.selectedMode.JSBNG__name, k({\n                className: \"UFIOrderingModeSelectorDownCaret\",\n                src: o(\"/images/ui/xhp/link/more/down_caret.gif\")\n            }))))));\n        }\n    });\n    e.exports = r;\n});\n__d(\"SwapButtonDEPRECATED\", [\"JSBNG__Event\",\"Arbiter\",\"copyProperties\",\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"JSBNG__CSS\");\n    function k(l, m, n) {\n        this._swapperButton = l;\n        this._swappeeButton = m;\n        g.listen(l, \"click\", this.swap.bind(this));\n        if (n) {\n            g.listen(m, \"click\", this.unswap.bind(this));\n        }\n    ;\n    ;\n        h.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", this.setFocusOnSwapper.bind(this), h.SUBSCRIBE_ALL);\n    };\n;\n    i(k.prototype, {\n        _swapperButton: null,\n        _swappeeButton: null,\n        swap: function(l) {\n            j.hide(this._swapperButton);\n            j.show(this._swappeeButton);\n            ((((l !== false)) && this._swappeeButton.JSBNG__focus()));\n        },\n        unswap: function(l) {\n            j.show(this._swapperButton);\n            j.hide(this._swappeeButton);\n            ((((l !== false)) && this._swapperButton.JSBNG__focus()));\n        },\n        toggle: function() {\n            j.toggle(this._swapperButton);\n            j.toggle(this._swappeeButton);\n        },\n        setFocusOnSwapper: function() {\n            this._swapperButton.JSBNG__focus();\n        }\n    });\n    e.exports = k;\n});\n__d(\"SubscribeButton\", [\"Arbiter\",\"AsyncRequest\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__Event\"), j = {\n        SUBSCRIBED: \"FollowingUser\",\n        UNSUBSCRIBED: \"UnfollowingUser\",\n        init: function(k, l, m, n, o, p) {\n            i.listen(l, \"click\", function() {\n                g.inform(j.SUBSCRIBED, {\n                    profile_id: n\n                });\n            });\n            g.subscribe(j.SUBSCRIBED, function(q, r) {\n                if (((n === r.profile_id))) {\n                    if (!o) {\n                        m.suppressNextMouseEnter();\n                    }\n                ;\n                ;\n                    k.swap();\n                    if (((p === true))) {\n                        new h().setURI(\"/ajax/profile/suggestions_on_following.php\").setData({\n                            profileid: n\n                        }).send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            g.subscribe(j.UNSUBSCRIBED, function(q, r) {\n                if (((n === r.profile_id))) {\n                    k.unswap();\n                    m.hideFlyout();\n                    g.inform(\"SubMenu/Reset\");\n                }\n            ;\n            ;\n            });\n        },\n        initUnsubscribe: function(k, l) {\n            i.listen(k, \"click\", function() {\n                g.inform.bind(g, j.UNSUBSCRIBED, {\n                    profile_id: l\n                }).defer();\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"Tour\", [\"Arbiter\",\"LayerDestroyOnHide\",\"LayerHideOnEscape\",\"copyProperties\",\"NavigationMessage\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"LayerDestroyOnHide\"), i = b(\"LayerHideOnEscape\"), j = b(\"copyProperties\"), k = b(\"NavigationMessage\");\n    function l() {\n        if (l._instance) {\n            l._instance.setTourComplete();\n        }\n    ;\n    ;\n        l._instance = this;\n    };\n;\n    j(l.prototype, {\n        tourStarted: false,\n        tourComplete: false,\n        _navigationBeginToken: null,\n        _pageLeaveToken: null,\n        steps: {\n        },\n        JSBNG__openDialog: null,\n        init: function() {\n            this._pageLeaveToken = g.subscribe(\"onload/exit\", this.handleLeavePage.bind(this));\n            this._navigationBeginToken = g.subscribe(k.NAVIGATION_BEGIN, this.handleTransition.bind(this));\n            this.steps = {\n            };\n            return this;\n        },\n        registerStep: function(m, n) {\n            m.disableBehavior(h);\n            m.disableBehavior(i);\n            this.steps[n] = m;\n            m.subscribe(\"show\", function() {\n                m.inform(\"tour-dialog-show\", m);\n            });\n            if (!this.getTourStarted()) {\n                this.setTourStart();\n            }\n        ;\n        ;\n        },\n        _unsubscribeSubscriptions: function() {\n            this._navigationBeginToken.unsubscribe();\n            this._pageLeaveToken.unsubscribe();\n        },\n        handleLeavePage: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTransition: function() {\n            this._unsubscribeSubscriptions();\n        },\n        handleTourStart: function() {\n        \n        },\n        handleTourStop: function() {\n        \n        },\n        handleTourComplete: function() {\n        \n        },\n        showStep: function(m) {\n            var n = this.steps[m];\n            if (!((this.JSBNG__openDialog == n))) {\n                this.hideOpenDialog();\n            }\n        ;\n        ;\n            if (!n) {\n                return;\n            }\n        ;\n        ;\n            this.JSBNG__openDialog = n;\n            n.show();\n        },\n        hideOpenDialog: function() {\n            if (this.JSBNG__openDialog) {\n                this.JSBNG__openDialog.hide();\n                this.JSBNG__openDialog = null;\n            }\n        ;\n        ;\n        },\n        getTourStarted: function() {\n            return this.tourStarted;\n        },\n        setTourStart: function() {\n            this.tourStarted = true;\n            this.handleTourStart();\n        },\n        setTourStop: function() {\n            this.tourStarted = false;\n            this.hideOpenDialog();\n            this.handleTourStop();\n        },\n        setTourComplete: function() {\n            if (this.tourComplete) {\n                return;\n            }\n        ;\n        ;\n            this.setTourStop();\n            this.tourComplete = true;\n            this.handleTourComplete();\n        },\n        hideStep: function(m) {\n            var n = this.steps[m];\n            ((n && n.hide()));\n        }\n    });\n    j(l, {\n        getInstance: function() {\n            return ((l._instance || (l._instance = new l())));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FutureSideNavItem\", [\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"$\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"copyProperties\"), m = b(\"createArrayFrom\");\n    function n(o, p) {\n        this.id = o.id;\n        this.up = p;\n        this.endpoint = o.endpoint;\n        this.type = o.type;\n        this.node = ((o.node || k(o.id)));\n        this.paths = ((o.path ? m(o.path) : []));\n        this.keys = ((o.key ? m(o.key) : []));\n        var q = this._findKeys(this.keys);\n        this.numericKey = ((q.numeric || this.keys[0]));\n        this.textKey = ((q.text || this.keys[0]));\n        this._pathPattern = this._buildRegex(this.paths);\n        this._keyPattern = this._buildRegex(this.keys);\n        this.hideLoading();\n        this.hideSelected();\n    };\n;\n    l(n.prototype, {\n        equals: function(o) {\n            return ((o && ((o.id === this.id))));\n        },\n        getLinkNode: function() {\n            return ((i.scry(this.node, \"a.JSBNG__item\")[0] || i.scry(this.node, \"a.subitem\")[0]));\n        },\n        matchPath: function(o) {\n            return this._matchInput(this._pathPattern, o);\n        },\n        matchKey: function(o) {\n            return this._matchInput(this._keyPattern, o);\n        },\n        _matchInput: function(o, p) {\n            var q = ((o && o.exec(p)));\n            return ((q && q.slice(1)));\n        },\n        getTop: function() {\n            return ((this.isTop() ? this : this.up.getTop()));\n        },\n        isTop: function(o) {\n            return !this.up;\n        },\n        setCount: function(o, p) {\n            return this._updateCount(o, true);\n        },\n        incrementCount: function(o, p) {\n            return this._updateCount(o, false);\n        },\n        _updateCount: function(o, p, q) {\n            var r = i.scry(this.node, \"span.count\")[0], s = ((r && i.scry(r, \"span.countValue\")[0]));\n            if (s) {\n                var t = ((p ? 0 : parseInt(i.getText(s), 10))), u = Math.max(0, ((t + o))), v = ((this.isTop() ? \"hidden\" : \"hiddenSubitem\"));\n                i.setContent(s, u);\n                ((q && h.conditionClass(this.node, v, !u)));\n                h.conditionClass(r, \"hidden_elem\", !u);\n                if (this.isTop()) {\n                    var w = i.scry(this.node, \"div.linkWrap\")[0];\n                    if (w) {\n                        h.conditionClass(w, \"noCount\", !u);\n                        h.conditionClass(w, \"hasCount\", u);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            g.inform(\"NavigationMessage.COUNT_UPDATE_DONE\");\n        },\n        showLoading: function() {\n            h.addClass(this.node, \"loading\");\n        },\n        hideLoading: function() {\n            h.removeClass(this.node, \"loading\");\n        },\n        showSelected: function() {\n            h.addClass(this.node, \"selectedItem\");\n            ((h.hasClass(this.node, \"hider\") && h.addClass(this._getExpanderParent(), \"expandedMode\")));\n        },\n        hideSelected: function() {\n            h.removeClass(this.node, \"selectedItem\");\n        },\n        showChildren: function() {\n            h.addClass(this.node, \"open\");\n        },\n        hideChildren: function() {\n            h.removeClass(this.node, \"open\");\n        },\n        _getExpanderParent: function() {\n            return j.byClass(this.node, \"expandableSideNav\");\n        },\n        _buildRegex: function(o) {\n            if (o.length) {\n                var p = o.map(function(q) {\n                    if (((typeof q === \"string\"))) {\n                        return q.replace(/([^a-z0-9_])/gi, \"\\\\$1\");\n                    }\n                     else if (((q && q.regex))) {\n                        return q.regex;\n                    }\n                    \n                ;\n                ;\n                });\n                return new RegExp(((((\"^(?:\" + p.join(\"|\"))) + \")$\")));\n            }\n        ;\n        ;\n        },\n        _findKeys: function(o) {\n            var p = /^(app|group|fl)_/, q = {\n            };\n            for (var r = 0; ((r < o.length)); r++) {\n                var s = p.test(o[r]);\n                if (((s && !q.numeric))) {\n                    q.numeric = o[r];\n                }\n                 else if (((!s && !q.text))) {\n                    q.text = o[r];\n                }\n                \n            ;\n            ;\n                if (((q.numeric && q.text))) {\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return q;\n        }\n    });\n    e.exports = n;\n});\n__d(\"FutureSideNavSection\", [\"Bootloader\",\"DOMQuery\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"DOMQuery\"), i = b(\"$\"), j = b(\"copyProperties\");\n    function k(l) {\n        this.id = l.id;\n        this.node = ((this.node || i(l.id)));\n        this.editEndpoint = l.editEndpoint;\n    };\n;\n    j(k.prototype, {\n        equals: function(l) {\n            return ((l && ((l.id === this.id))));\n        },\n        getEditorAsync: function(l) {\n            g.loadModules([\"SortableSideNav\",], function(m) {\n                var n = new m(h.JSBNG__find(this.node, \"ul.uiSideNav\"), this.editEndpoint);\n                l(n);\n            }.bind(this));\n        }\n    });\n    e.exports = k;\n});\n__d(\"FutureSideNav\", [\"Arbiter\",\"Bootloader\",\"ChannelConstants\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"FutureSideNavItem\",\"FutureSideNavSection\",\"NavigationMessage\",\"PageTransitions\",\"Parent\",\"Run\",\"SelectorDeprecated\",\"URI\",\"UserAgent\",\"Vector\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"ChannelConstants\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"FutureSideNavItem\"), n = b(\"FutureSideNavSection\"), o = b(\"NavigationMessage\"), p = b(\"PageTransitions\"), q = b(\"Parent\"), r = b(\"Run\"), s = b(\"SelectorDeprecated\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"Vector\"), w = b(\"copyProperties\"), x = b(\"createArrayFrom\");\n    function y() {\n        ((y.instance && y.instance.uninstall()));\n        y.instance = this;\n    };\n;\n    y.instance = null;\n    y.getInstance = function() {\n        return ((y.instance || new y()));\n    };\n    w(y.prototype, {\n        init: function(z, aa, ba) {\n            this.root = z;\n            this.items = {\n            };\n            this.sections = {\n            };\n            this.editor = null;\n            this.editing = false;\n            this.selected = null;\n            this.loading = null;\n            this.keyParam = \"sk\";\n            this.defaultKey = aa;\n            this.uri = t.getRequestURI();\n            this.ajaxPipe = ba;\n            this.ajaxPipeEndpoints = {\n            };\n            this.sidecol = true;\n            this._installed = true;\n            this._handlePageTransitions = true;\n            p.registerHandler(function(ca) {\n                return ((this._handlePageTransitions && this.handlePageTransition(ca)));\n            }.bind(this));\n            this._eventHandlers = [];\n            this._arbiterSubscriptions = [g.subscribe(o.NAVIGATION_COMPLETED, this.navigationComplete.bind(this)),g.subscribe(o.NAVIGATION_FAILED, this.navigationFailed.bind(this)),g.subscribe(o.NAVIGATION_COUNT_UPDATE, this.navigationCountUpdate.bind(this)),g.subscribe(o.NAVIGATION_SELECT, this.navigationSelect.bind(this)),g.subscribe(i.getArbiterType(\"nav_update_counts\"), this.navigationCountUpdateFromPresence.bind(this)),];\n            this._explicitHover = [];\n            this._ensureHover(\"sideNavItem\");\n            this._eventHandlers.push(l.listen(window, \"resize\", this._handleResize.bind(this)));\n            this._checkNarrow();\n            this._selectorSubscriptions = [];\n            ((window.Selector && this._selectorSubscriptions.push(s.subscribe([\"open\",\"close\",], function(ca, da) {\n                var ea = q.byClass(da.selector, \"sideNavItem\");\n                ((ea && j.conditionClass(ea, \"editMenuOpened\", ((ca === \"open\")))));\n            }))));\n            r.onLeave(this.uninstall.bind(this));\n            if (this._pendingSections) {\n                this._pendingSections.forEach(function(ca) {\n                    this.initSection.apply(this, ca);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _handleResize: (function() {\n            var z;\n            return function() {\n                ((z && JSBNG__clearTimeout(z)));\n                z = this._checkNarrow.bind(this).defer(200);\n            };\n        })(),\n        _checkNarrow: function() {\n            j.conditionClass(this.root, \"uiNarrowSideNav\", ((v.getElementPosition(this.root).x < 20)));\n        },\n        _ensureHover: function(z) {\n            if (((u.ie() < 8))) {\n                h.loadModules([\"ExplicitHover\",], function(aa) {\n                    this._explicitHover.push(new aa(this.root, z));\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        uninstall: function() {\n            if (this._installed) {\n                this._installed = false;\n                this._handlePageTransitions = false;\n                this._arbiterSubscriptions.forEach(g.unsubscribe);\n                this._selectorSubscriptions.forEach(function(z) {\n                    s.unsubscribe(z);\n                });\n                this._eventHandlers.forEach(function(z) {\n                    z.remove();\n                });\n                this._explicitHover.forEach(function(z) {\n                    z.uninstall();\n                });\n            }\n        ;\n        ;\n        },\n        initSection: function(z, aa) {\n            if (!this._installed) {\n                this._pendingSections = ((this._pendingSections || []));\n                this._pendingSections.push(arguments);\n                return;\n            }\n        ;\n        ;\n            this._initItems(aa);\n            this._initSection(z);\n        },\n        addItem: function(z, aa) {\n            this._initItem(z, aa);\n        },\n        _initItems: function(z) {\n            var aa = function(ba, ca) {\n                var da = this._initItem(ba, ca);\n                if (ba.children) {\n                    ba.children.forEach(function(ea) {\n                        aa(ea, da);\n                    });\n                }\n            ;\n            ;\n            }.bind(this);\n            x(z).forEach(function(ba) {\n                aa(ba, null);\n            });\n        },\n        _initItem: function(z, aa) {\n            var ba = this.items[z.id] = this._constructItem(z, aa);\n            if (((ba.equals(this.selected) || z.selected))) {\n                this.setSelected(ba);\n            }\n        ;\n        ;\n            var ca = ba.getLinkNode();\n            ((ca && this._eventHandlers.push(l.listen(ca, \"click\", function(JSBNG__event) {\n                return !this.editing;\n            }.bind(this)))));\n            return ba;\n        },\n        _initSection: function(z) {\n            var aa = this.sections[z.id] = this._constructSection(z);\n            this._eventHandlers.push(l.listen(aa.node, \"click\", this.handleSectionClick.bind(this, aa)));\n            k.scry(aa.node, \"div.bookmarksMenuButton\").forEach(j.show);\n            return aa;\n        },\n        _constructItem: function(z, aa) {\n            return new m(z, aa);\n        },\n        _constructSection: function(z) {\n            return new n(z);\n        },\n        handleSectionClick: function(z, JSBNG__event) {\n            var aa = this._getEventTarget(JSBNG__event, \"a\"), ba = this._getItemForNode(aa);\n            if (!aa) {\n                return;\n            }\n             else if (j.hasClass(aa.parentNode, \"uiMenuItem\")) {\n                this._handleMenuClick(z, ba, aa.parentNode, JSBNG__event);\n            }\n             else this._handleLinkClick(z, aa, JSBNG__event);\n            \n        ;\n        ;\n        },\n        _getEventTarget: function(JSBNG__event, z) {\n            var aa = JSBNG__event.getTarget();\n            if (((aa.tagName !== z.toUpperCase()))) {\n                return q.byTag(aa, z);\n            }\n             else return aa\n        ;\n        },\n        _handleMenuClick: function(z, aa, ba, JSBNG__event) {\n            if (j.hasClass(ba, \"rearrange\")) {\n                this.beginEdit(z);\n            }\n        ;\n        ;\n        },\n        _handleLinkClick: function(z, aa, JSBNG__event) {\n            if (j.hasClass(aa, \"navEditDone\")) {\n                ((this.editing ? this.endEdit() : this.beginEdit(z)));\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        getItem: function(z) {\n            if (this._isCurrentPath(z)) {\n                return this._getItemForKey(((this._getKey(z.getQueryData()) || this.defaultKey)));\n            }\n             else return this._getItemForPath(z.getPath())\n        ;\n        },\n        getNodeForKey: function(z) {\n            var aa = this._getItemForKey(z);\n            if (aa) {\n                return aa.node;\n            }\n        ;\n        ;\n        },\n        _isCurrentPath: function(z) {\n            return ((((z.getDomain() === this.uri.getDomain())) && ((z.getPath() === this.uri.getPath()))));\n        },\n        _getKey: function(z) {\n            return z[this.keyParam];\n        },\n        _getItemForNode: function(z) {\n            z = q.byClass(z, \"sideNavItem\");\n            return ((z && this.items[z.id]));\n        },\n        _getItemForKey: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchKey(z);\n            });\n        },\n        _getItemForPath: function(z) {\n            return this._findItem(function(aa) {\n                return aa.matchPath(z);\n            });\n        },\n        _findItem: function(z) {\n            {\n                var fin239keys = ((window.top.JSBNG_Replay.forInKeys)((this.items))), fin239i = (0);\n                var aa;\n                for (; (fin239i < fin239keys.length); (fin239i++)) {\n                    ((aa) = (fin239keys[fin239i]));\n                    {\n                        if (z(this.items[aa])) {\n                            return this.items[aa];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        removeItem: function(z) {\n            if (((z && this.items[z.id]))) {\n                k.remove(z.node);\n                delete this.items[z.id];\n            }\n        ;\n        ;\n        },\n        removeItemByKey: function(z) {\n            this.removeItem(this._getItemForKey(z));\n        },\n        moveItem: function(z, aa, ba) {\n            var ca = k.JSBNG__find(z.node, \"ul.uiSideNav\");\n            ((ba ? k.prependContent : k.appendContent))(ca, aa.node);\n        },\n        setLoading: function(z) {\n            ((this.loading && this.loading.hideLoading()));\n            this.loading = z;\n            ((this.loading && this.loading.showLoading()));\n        },\n        setSelected: function(z) {\n            this.setLoading(null);\n            if (this.selected) {\n                this.selected.hideSelected();\n                this.selected.getTop().hideChildren();\n            }\n        ;\n        ;\n            this.selected = z;\n            if (this.selected) {\n                this.selected.showSelected();\n                this.selected.getTop().showChildren();\n            }\n        ;\n        ;\n        },\n        handlePageTransition: function(z) {\n            var aa = this.getItem(z), ba = ((((aa && aa.endpoint)) && this._doPageTransition(aa, z)));\n            return ba;\n        },\n        _doPageTransition: function(z, aa) {\n            this.setLoading(z);\n            this._sendPageTransition(z.endpoint, w(this._getTransitionData(z, aa), aa.getQueryData()));\n            return true;\n        },\n        _sendPageTransition: function(z, aa) {\n            aa.endpoint = z;\n            g.inform(o.NAVIGATION_BEGIN, {\n                useAjaxPipe: this._useAjaxPipe(z),\n                params: aa\n            });\n        },\n        _getTransitionData: function(z, aa) {\n            var ba = {\n            };\n            ba.sidecol = this.sidecol;\n            ba.path = aa.getPath();\n            ba[this.keyParam] = z.textKey;\n            ba.key = z.textKey;\n            return ba;\n        },\n        _useAjaxPipe: function(z) {\n            return ((this.ajaxPipe || this.ajaxPipeEndpoints[z]));\n        },\n        navigationComplete: function() {\n            ((this.loading && this.setSelected(this.loading)));\n        },\n        navigationFailed: function() {\n            this.setLoading(null);\n        },\n        navigationSelect: function(z, aa) {\n            var ba = this._getItemForKey(this._getKey(aa));\n            if (aa.asLoading) {\n                this.setLoading(ba);\n            }\n             else this.setSelected(ba);\n        ;\n        ;\n        },\n        navigationCountUpdate: function(z, aa) {\n            var ba = this._getItemForKey(((aa && aa.key)));\n            if (ba) {\n                if (((typeof aa.count !== \"undefined\"))) {\n                    ba.setCount(aa.count, aa.hide);\n                }\n                 else if (((typeof aa.increment !== \"undefined\"))) {\n                    ba.incrementCount(aa.increment, aa.hide);\n                }\n                \n            ;\n            }\n        ;\n        ;\n        },\n        navigationCountUpdateFromPresence: function(z, aa) {\n            aa = aa.obj;\n            if (aa) {\n                if (((!aa.class_name || ((aa.class_name && j.hasClass(this.root, aa.class_name)))))) {\n                    if (aa.items) {\n                        for (var ba = 0; ((ba < aa.items.length)); ba++) {\n                            this.navigationCountUpdate(z, aa.items[ba]);\n                        ;\n                        };\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        beginEdit: function(z) {\n            if (!this.editing) {\n                this.editing = true;\n                j.addClass(this.root, \"editMode\");\n                this._updateTrackingData();\n                this._initEditor(z);\n            }\n        ;\n        ;\n        },\n        endEdit: function() {\n            if (this.editing) {\n                j.removeClass(this.root, \"editMode\");\n                ((this.editor && this.editor.endEdit()));\n                this.editor = null;\n                this.editing = false;\n                this._updateTrackingData();\n            }\n        ;\n        ;\n        },\n        _updateTrackingData: function(z) {\n            var aa = ((this.root.getAttribute(\"data-gt\") || \"{}\"));\n            try {\n                aa = JSON.parse(aa);\n                if (this.editing) {\n                    aa.editing = true;\n                }\n                 else delete aa.editing;\n            ;\n            ;\n                this.root.setAttribute(\"data-gt\", JSON.stringify(aa));\n            } catch (ba) {\n            \n            };\n        ;\n        },\n        _initEditor: function(z) {\n            z.getEditorAsync(function(aa) {\n                if (this.editing) {\n                    this.editor = aa;\n                    this.editor.beginEdit();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = y;\n});\n__d(\"PageFanning\", [\"Animation\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"FutureSideNav\",\"Parent\",\"URI\",\"$\",\"collectDataAttributes\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"FutureSideNav\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"$\"), o = b(\"collectDataAttributes\"), p = b(\"copyProperties\"), q = {\n        setFanStatus: function(s, t, u, v, w, x, y) {\n            var z = {\n                ft: {\n                }\n            };\n            if (s) {\n                z = {\n                    ft: o(s, [\"ft\",]).ft\n                };\n            }\n        ;\n        ;\n            w = ((w || function(ca) {\n                var da = ca.getPayload();\n                if (((!da || !s))) {\n                    return;\n                }\n            ;\n            ;\n                if (da.reload) {\n                    q.reloadOnFanStatusChanged(da.preserve_tab);\n                }\n                 else r(s, da);\n            ;\n            ;\n            }));\n            var aa = {\n                fbpage_id: t,\n                add: u,\n                reload: v\n            };\n            if (((y != null))) {\n                p(aa, y);\n            }\n        ;\n        ;\n            p(aa, z);\n            var ba = new h().setURI(\"/ajax/pages/fan_status.php\").setData(aa).setNectarModuleDataSafe(s).setHandler(w);\n            if (x) {\n                ba.setErrorHandler(x);\n            }\n        ;\n        ;\n            ba.send();\n            return false;\n        },\n        reloadOnFanStatusChanged: function(s) {\n            var t = m.getRequestURI();\n            if (s) {\n                var u = k.getInstance().selected.textKey;\n                if (((!t.getQueryData().sk && u))) {\n                    t.addQueryData({\n                        sk: u\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            window.JSBNG__location.href = t;\n        },\n        toggleLikeOnFanStatusChanged: function(s, t) {\n            var u = n(((\"liked_pages_like_action_\" + s))), v = n(((\"liked_pages_undo_action_\" + s)));\n            i.conditionClass(u, \"hidden_elem\", t);\n            i.conditionClass(v, \"hidden_elem\", !t);\n        },\n        informPageLikeButtonOnChange: function(s, t) {\n            var u = a.PageLikeButton;\n            if (u) {\n                if (t) {\n                    u.informLike(s);\n                    u.informLikeSuccess(s);\n                }\n                 else u.informUnlike(s);\n            ;\n            }\n        ;\n        ;\n        }\n    };\n    function r(s, t) {\n        var u = t.feedback;\n        if (!u) {\n            return;\n        }\n    ;\n    ;\n        if (l.byClass(s, \"fbTimelineEscapeSectionItem\")) {\n            s = ((l.byClass(s, \"fan_status_inactive\") || s));\n        }\n    ;\n    ;\n        var v = j.create(\"span\", {\n            className: \"fan_status_inactive\"\n        }, u);\n        s.parentNode.replaceChild(v, s);\n        var w = function() {\n            if (t.can_repeat_action) {\n                v.parentNode.replaceChild(s, v);\n            }\n        ;\n        ;\n        };\n        new g(v).duration(3000).checkpoint().to(\"backgroundColor\", \"#FFFFFF\").duration(1000).ondone(w).go();\n    };\n;\n    e.exports = q;\n});\n__d(\"PageLikeButton\", [\"Arbiter\",\"AsyncRequest\",\"AsyncResponse\",\"JSBNG__Event\",\"PageFanning\",\"SubscribeButton\",\"Tour\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"JSBNG__Event\"), k = b(\"PageFanning\"), l = b(\"SubscribeButton\"), m = b(\"Tour\"), n = b(\"URI\"), o = {\n        LIKED: \"liked\",\n        UNLIKED: \"unliked\",\n        LIKED_SUCCESS: \"liked_success\",\n        init: function(r, s, t, u, v, w, x, y, z, aa, ba) {\n            g.subscribe(o.LIKED, function(ca, da) {\n                if (((u === da.profile_id))) {\n                    if (!z) {\n                        t.suppressNextMouseEnter();\n                    }\n                ;\n                ;\n                    r.swap(ba);\n                }\n            ;\n            ;\n            });\n            g.subscribe(o.UNLIKED, function(ca, da) {\n                if (((u === da.profile_id))) {\n                    r.unswap(ba);\n                    t.hideFlyout();\n                }\n            ;\n            ;\n            });\n            if (y) {\n                g.subscribe(o.LIKED_SUCCESS, function(ca, da) {\n                    var ea = n.getRequestURI().getQueryData().app_data;\n                    if (((da.profile_id == u))) {\n                        new h().setURI(\"/ajax/pages/fetch_app_column.php\").setData({\n                            profile_id: u,\n                            tab_key: y,\n                            app_data: ea\n                        }).send();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            j.listen(s, \"click\", q.bind(null, u, v, w, x));\n        },\n        initCallout: function(r, s) {\n            var t = JSBNG__document.getElementById(\"pageActionLikeCalloutButton\");\n            j.listen(t, \"click\", q.bind(null, r, s, null, null));\n        },\n        initUnlike: function(r, s, t) {\n            j.listen(r, \"click\", function(JSBNG__event) {\n                p(JSBNG__event.getTarget(), s, false, function(u) {\n                    g.inform(o.LIKED, {\n                        profile_id: s\n                    });\n                    i.defaultErrorHandler(u);\n                }, t);\n                o.informUnlike(s);\n            });\n        },\n        informLike: function(r, s, t) {\n            var u = {\n                profile_id: r,\n                target: s,\n                origin: t\n            };\n            g.inform(o.LIKED, u);\n            g.inform(l.SUBSCRIBED, u);\n        },\n        informLikeSuccess: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform(o.LIKED_SUCCESS, s);\n        },\n        informUnlike: function(r) {\n            var s = {\n                profile_id: r\n            };\n            g.inform.bind(g, o.UNLIKED, s).defer();\n            g.inform.bind(g, l.UNSUBSCRIBED, s).defer();\n        }\n    };\n    function p(r, s, t, u, v, w, x) {\n        m.getInstance().hideStep(\"low_page_likes\");\n        k.setFanStatus(r, s, t, false, function() {\n            o.informLikeSuccess(s);\n        }, u, {\n            fan_origin: v,\n            fan_source: w,\n            cat: x\n        });\n    };\n;\n    function q(r, s, t, u, JSBNG__event) {\n        p(JSBNG__event.getTarget(), r, true, function(v) {\n            g.inform(o.UNLIKED, {\n                profile_id: r\n            });\n            i.defaultErrorHandler(v);\n        }, s, t, u);\n        o.informLike(r, JSBNG__event.getTarget(), s);\n    };\n;\n    e.exports = o;\n    a.PageLikeButton = o;\n});\n__d(\"legacy:PageLikeButton\", [\"PageLikeButton\",], function(a, b, c, d) {\n    a.PageLikeButton = b(\"PageLikeButton\");\n}, 3);\n__d(\"HoverButton\", [\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"URI\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n, o, p, q) {\n        this._button = n;\n        this._flyout = o;\n        this._flyoutAjaxify = q;\n        this._flyoutContent = p;\n        o.subscribe(\"show\", this._onShow.bind(this));\n        o.subscribe(\"hide\", this._onHide.bind(this));\n    };\n;\n    k(m.prototype, {\n        _button: null,\n        _flyout: null,\n        _flyoutAjaxify: null,\n        _flyoutContent: null,\n        showFlyoutBriefly: function() {\n            this.showFlyout();\n            this._flyout.hideFlyoutDelayed(5000);\n        },\n        showFlyout: function() {\n            this._flyout.showFlyout(this._button, true);\n            this._flyout.inform(\"show\", this._button);\n        },\n        hideFlyout: function() {\n            this._flyout.hideFlyout(true);\n            this._flyout.inform(\"hide\", this._button);\n        },\n        enableButton: function() {\n            this._flyout.initNode(this._button);\n        },\n        disableButton: function() {\n            this.hideFlyout();\n            this._flyout.deactivateNode(this._button);\n        },\n        _onShow: function(n, o) {\n            h.addClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if (((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\")))) {\n                h.addClass(o, \"selected\");\n            }\n        ;\n        ;\n            if (this._flyoutAjaxify) {\n                h.addClass(this._flyoutContent, \"async_saving\");\n                new g().setURI(new j(this._flyoutAjaxify)).setHandler(function(p) {\n                    h.removeClass(this._flyoutContent, \"async_saving\");\n                    i.setContent(this._flyoutContent, p.payload);\n                }.bind(this)).send();\n                this._flyoutAjaxify = null;\n            }\n        ;\n        ;\n        },\n        _onHide: function(n, o) {\n            h.removeClass(o, \"-cx-PUBLIC-uiHoverButton__selected\");\n            if (((h.hasClass(o, \"uiButton\") || h.hasClass(o, \"-cx-PRIVATE-uiButton__root\")))) {\n                h.removeClass(o, \"selected\");\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.hideFlyout();\n            this._flyout.destroy();\n        },\n        suppressNextMouseEnter: function() {\n            this._flyout.setActiveNode(this._button);\n        }\n    });\n    e.exports = m;\n});\n__d(\"legacy:ui-side-nav-future-js\", [\"FutureSideNav\",], function(a, b, c, d) {\n    a.FutureSideNav = b(\"FutureSideNav\");\n}, 3);");
// 12436
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o163,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yZ/r/JdjE3mVpxG6.js",o166);
// undefined
o163 = null;
// undefined
o166 = null;
// 12543
o69.readyState = 2;
// 12541
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o142,o167);
// undefined
o167 = null;
// 12547
o69.readyState = 3;
// 12545
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o142,o168);
// undefined
o168 = null;
// 12551
o69.readyState = 4;
// undefined
o69 = null;
// 12593
o171.toString = f81632121_1344;
// undefined
o171 = null;
// 12601
o172.hasOwnProperty = f81632121_1662;
// undefined
o172 = null;
// 12626
o173.hasOwnProperty = f81632121_1662;
// undefined
o173 = null;
// 12549
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o142,o169);
// undefined
o142 = null;
// undefined
o169 = null;
// 12719
o22.readyState = 2;
// 12717
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o140,o170);
// undefined
o170 = null;
// 12723
o22.readyState = 3;
// 12721
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o140,o174);
// undefined
o174 = null;
// 12727
o22.readyState = 4;
// undefined
o22 = null;
// 12769
o177.toString = f81632121_1344;
// undefined
o177 = null;
// 12777
o178.hasOwnProperty = f81632121_1662;
// undefined
o178 = null;
// 12802
o179.hasOwnProperty = f81632121_1662;
// undefined
o179 = null;
// 12725
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o140,o175);
// undefined
o140 = null;
// undefined
o175 = null;
// 12949
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 12986
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"e0RyX\",]);\n}\n;\n__d(\"PhotoSnowliftAds\", [\"Event\",\"copyProperties\",\"CSS\",\"csx\",\"DataStore\",\"DOM\",\"PhotoSessionLog\",\"UIPagelet\",\"URI\",\"Vector\",\"extendArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"csx\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"PhotoSessionLog\"), n = b(\"UIPagelet\"), o = b(\"URI\"), p = b(\"Vector\"), q = b(\"extendArray\"), r = {\n        DEFAULT_UNITS_REFRESH_RATE: 30000,\n        UNITS_REGISTER_DELAY: 1000,\n        root: null,\n        availableDimensions: null,\n        loadQuery: null,\n        lastLoadTime: 0,\n        minAds: 100,\n        units: null,\n        isLogAdData: null,\n        displayedCallback: null,\n        refreshUnitsRate: null,\n        position: null,\n        adsStatus: \"null\",\n        adsEvents: {\n        },\n        snowliftRedesign: false,\n        resetEvents: function() {\n            this.adsStatus = \"reset\";\n            this.adsEvents = {\n            };\n        },\n        addEvent: function(s, t) {\n            if (t) {\n                this.adsStatus = s;\n            };\n            var u = Date.now();\n            this.adsEvents[((s + \"_\") + u)] = u;\n        },\n        init: function(s, t, u, v) {\n            this.reset();\n            this.root = s;\n            this.snowlift = t;\n            this.minAds = u.min_ads;\n            this.displayedCallback = v;\n            this.addEvent(\"init\", true);\n            this.snowliftRedesign = u.snowlift_redesign;\n            this.refreshUnitsRate = r.DEFAULT_UNITS_REFRESH_RATE;\n            if (u.refresh_fast) {\n                this.refreshUnitsRate = u.refresh_rate;\n            };\n        },\n        reset: function() {\n            this.lastLoadTime = 0;\n            this.position = 0;\n            this.units = [];\n            this.resetEvents();\n            this.addEvent(\"reset\", true);\n        },\n        resize: function(s) {\n            this.availableDimensions = s;\n            this.loadQuery = this.snowlift.getLoadQuery();\n            this.processResize();\n        },\n        calculateUnitSizes: function(s, t, u) {\n            var v = {\n            };\n            s.forEach(function(w) {\n                var x = w.root.firstChild.offsetHeight;\n                w.units.forEach(function(z) {\n                    if ((!i.hasClass(z, \"hidden\") && !this.getIsHoldout(z))) {\n                        var aa = this.getHeight(z.firstChild, t);\n                        x -= aa;\n                    }\n                ;\n                }.bind(this));\n                var y = {\n                    height: x,\n                    visible: false\n                };\n                w.units.forEach(function(z) {\n                    var aa = this.getIsAds(z), ba = this.getHeight(z.firstChild, t), ca = this.getUnitId(z), da = this.getIsHoldout(z);\n                    if ((da && u)) {\n                        return\n                    };\n                    v[ca] = {\n                        height: ba,\n                        visible: false,\n                        priority: 0,\n                        is_ads: aa,\n                        is_holdout: da,\n                        section_ref: y\n                    };\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        calculateVisibleUnits: function(s, t, u) {\n            var v = 0, w = this.getUnitPriority(t);\n            w.forEach(function(x) {\n                if (t.hasOwnProperty(x)) {\n                    var y = t[x], z = y.height;\n                    if (!y.section_ref.visible) {\n                        z += y.section_ref.height;\n                    };\n                    y.height_below = (u - z);\n                    y.visible = ((y.height_below >= 0) && (z > 0));\n                    if (y.visible) {\n                        y.section_ref.visible = true;\n                        u -= z;\n                        v++;\n                    }\n                ;\n                }\n            ;\n            }.bind(this));\n            return t;\n        },\n        displayUnits: function(s, t) {\n            s.forEach(function(u) {\n                var v = false, w = true;\n                u.units.forEach(function(x) {\n                    var y = this.getUnitId(x), z = t[y];\n                    if (!z) {\n                        return\n                    };\n                    var aa = z.visible, ba = z.height_below, ca = z.is_ads;\n                    i.conditionClass(x, \"hidden\", !aa);\n                    if (((ca && aa) && w)) {\n                        var da = l.find(x, \"div.ego_unit\");\n                        i.addClass(da, \"ego_unit_no_top_border\");\n                        w = false;\n                    }\n                ;\n                    v = (v || aa);\n                    this.calcUnitStats(this.units[ca][y], aa, ba);\n                }.bind(this));\n                i.conditionClass(u.root, \"hidden\", !v);\n            }.bind(this));\n        },\n        getUnitsDisplayed: function(s, t) {\n            var u = 0;\n            s.forEach(function(v) {\n                v.units.forEach(function(w) {\n                    var x = this.getUnitId(w), y = t[x];\n                    if ((!y || !y.visible)) {\n                        return\n                    };\n                    u++;\n                }.bind(this));\n            }.bind(this));\n            return u;\n        },\n        getHeightsRequired: function(s, t) {\n            var u = 0, v = [];\n            s.forEach(function(w) {\n                var x = false;\n                w.units.forEach(function(y) {\n                    var z = this.getUnitId(y), aa = t[z];\n                    if (!aa) {\n                        return\n                    };\n                    u += aa.height;\n                    if (!x) {\n                        u += aa.section_ref.height;\n                        x = true;\n                    }\n                ;\n                    v.push(u);\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        getUnitPriority: function(s) {\n            var t = [], u = 0, v = 0;\n            for (var w in s) {\n                var x = s[w];\n                t.push(w);\n                var y = ((this.minAds + u) + v);\n                if (x.is_ads) {\n                    if ((v < this.minAds)) {\n                        y = v;\n                    };\n                    v++;\n                }\n                 else u++;\n            ;\n                x.priority = y;\n            };\n            t = t.sort(function(z, aa) {\n                var ba = s[z], ca = s[aa];\n                return (ba.priority - ca.priority);\n            }.bind(this));\n            return t;\n        },\n        updateUnitsStatus: function() {\n            var s = this.availableDimensions.x, t = this.availableDimensions.y, u = this.calculateUnitSizes(this.sections, s);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            for (var v in u) {\n                if (!u.hasOwnProperty(v)) {\n                    continue;\n                };\n                var w = u[v];\n                if ((!w.is_holdout || !w.visible)) {\n                    continue;\n                };\n                var x = this.units[1][v];\n                this.calcUnitStats(x, w.visible, w.height_below);\n            };\n            u = this.calculateUnitSizes(this.sections, s, true);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            this.displayUnits(this.sections, u);\n            if (this.displayedCallback) {\n                var y = this.getUnitsDisplayed(this.sections, u), z = this.getHeightsRequired(this.sections, u);\n                this.displayedCallback(y, z);\n            }\n        ;\n        },\n        calcUnitStats: function(s, t, u) {\n            var v = Date.now();\n            if (s.visible) {\n                s.totalTime += (v - s.lastShowTime);\n            };\n            if (((s.trackingCode !== null) && (s.totalTime >= this.UNITS_REGISTER_DELAY))) {\n                var w = s.trackingCode;\n                s.trackingCode = null;\n                this.registerImpression(w, s.registerUrl);\n            }\n        ;\n            s.visible = t;\n            s.heightBelow = u;\n            s.lastShowTime = v;\n        },\n        prepareResize: function() {\n            var s = function(t) {\n                var u = l.create(\"div\", {\n                    className: \"inner\"\n                }), v = l.create(\"div\", {\n                    className: \"wrapper\"\n                }, u);\n                l.replace(t, v);\n                l.setContent(u, t);\n                return v;\n            };\n            this.sections = l.scry(this.root, \"div.ego_section\").map(function(t) {\n                return {\n                    root: s(t),\n                    units: l.scry(t, \"div.ego_unit\").map(s)\n                };\n            });\n        },\n        processResize: function() {\n            if (((this.isLoading || (this.lastLoadTime === 0)) || (this.availableDimensions === null))) {\n                this.setLogData();\n                return;\n            }\n        ;\n            this.updateUnitsStatus();\n            this.setLogData();\n            var s = this.nextRegisterTime();\n            if ((s !== Infinity)) {\n                this.processResize.bind(this).defer(s, true);\n            };\n        },\n        setIsLogAdData: function(s) {\n            this.isLogAdData = s;\n            this.addEvent(\"setIsLogAdData\", false);\n            this.setLogData();\n        },\n        setLogData: function() {\n            var s = this.snowlift.getImageId();\n            if ((this.isLogAdData && s)) {\n                var t = p.getElementDimensions(this.snowlift.getImage()), u = p.getElementDimensions(this.snowlift.getRHCHeader()), v = p.getElementDimensions(this.snowlift.getRHCBody()), w = p.getElementDimensions(this.snowlift.getRHCFooter()), x = {\n                    query_set: this.snowlift.getLoadQuery().set,\n                    window_x: window.innerWidth,\n                    window_y: window.innerHeight,\n                    image_x: t.x,\n                    image_y: t.y,\n                    header_x: u.x,\n                    header_y: u.y,\n                    body_x: v.x,\n                    body_y: v.y,\n                    footer_x: w.x,\n                    footer_y: w.y,\n                    ads_below_space: this.getAdsBelowSpace(),\n                    time: Date.now(),\n                    adsStatus: this.adsStatus,\n                    adsEvents: this.adsEvents,\n                    refreshRate: this.refreshUnitsRate,\n                    position: this.position\n                };\n                m.updateAdData(s, x);\n            }\n        ;\n        },\n        getAdsBelowSpace: function() {\n            var s = [], t = this.units[1];\n            for (var u in t) {\n                if ((t.hasOwnProperty(u) && !this.getIsHoldout(this.getAdUnit(u)))) {\n                    s.push(t[u].heightBelow);\n                };\n            };\n            return s;\n        },\n        getIsAds: function(s) {\n            var t = l.scry(s, \"div.-cx-PUBLIC-fbAdUnit__root\");\n            return t.length;\n        },\n        getUnitId: function(s) {\n            if (this.getIsAds(s)) {\n                return this.getAdId(s);\n            }\n             else return this.getEgoId(s)\n        ;\n        },\n        getEgoId: function(s) {\n            var t = l.find(s, \"div.ego_unit\");\n            return t.getAttribute(\"data-ego-fbid\");\n        },\n        getAdData: function(s) {\n            var t = l.find(s, \"div.-cx-PUBLIC-fbAdUnit__root\"), u = t.getAttribute(\"data-ad\");\n            return ((u && JSON.parse(u)) || {\n            });\n        },\n        getAdId: function(s) {\n            return this.getAdData(s).adid;\n        },\n        getIsHoldout: function(s) {\n            return ((s && this.getIsAds(s)) && this.getAdData(s).holdout);\n        },\n        getAdUnit: function(s) {\n            if (!this.sections) {\n                return null\n            };\n            var t = [];\n            this.sections.forEach(function(v) {\n                q(t, v.units);\n            });\n            for (var u = 0; (u < t.length); u++) {\n                if ((this.getIsAds(t[u]) && (this.getAdId(t[u]) == s))) {\n                    return t[u]\n                };\n            };\n            return null;\n        },\n        nextRegisterTime: function() {\n            var s = Infinity, t = h(h({\n            }, this.units[0]), this.units[1]);\n            for (var u in t) {\n                if (t.hasOwnProperty(u)) {\n                    var v = t[u];\n                    if (((v.trackingCode !== null) && v.visible)) {\n                        s = Math.min(s, (this.UNITS_REGISTER_DELAY - v.totalTime));\n                    };\n                }\n            ;\n            };\n            return s;\n        },\n        getHeight: function(s, t) {\n            var u = k.get(s, \"height\");\n            if ((u && (u.x === t))) {\n                return u.y\n            };\n            return this.cacheHeight(s, t);\n        },\n        cacheHeight: function(s, t) {\n            var u = {\n                x: t,\n                y: s.offsetHeight\n            };\n            k.set(s, \"height\", u);\n            return u.y;\n        },\n        loadAdsAndEgo: function() {\n            this.resetEvents();\n            this.addEvent(\"adsRequested\", true);\n            this.position++;\n            var s = this.getCursorFBID(this.loadQuery);\n            n.loadFromEndpoint(\"WebEgoPane\", this.root, {\n                pid: 34,\n                data: [this.loadQuery.set,s,this.snowliftRedesign,this.snowlift.getOpaqueCursor(s),]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        getCursorFBID: function(s) {\n            if ((s.v !== undefined)) {\n                return s.v\n            };\n            if ((s.fbid !== undefined)) {\n                return s.fbid\n            };\n            return \"0\";\n        },\n        unitsLoaded: function(s, t) {\n            var u;\n            if (t) {\n                u = \"/ai.php\";\n                this.addEvent(\"adsLoaded\", true);\n            }\n             else {\n                u = \"/ajax/ei.php\";\n                this.addEvent(\"egoLoaded\", true);\n            }\n        ;\n            var v = {\n            };\n            for (var w in s) {\n                if (s.hasOwnProperty(w)) {\n                    v[w] = {\n                        trackingCode: s[w],\n                        totalTime: 0,\n                        lastShowTime: 0,\n                        heightBelow: -10000,\n                        visible: false,\n                        registerUrl: u\n                    };\n                };\n            };\n            this.units[t] = v;\n            if (t) {\n                this.waitForImages(this.imagesLoaded.bind(this));\n            };\n        },\n        imagesLoaded: function() {\n            this.prepareResize();\n            this.addEvent(\"imagesLoaded\", true);\n            this.lastLoadTime = Date.now();\n            this.isLoading = false;\n            this.processResize();\n            i.removeClass(this.root, \"loading\");\n        },\n        loadAdsFromUserActivity: function() {\n            var s = Date.now(), t = this.refreshUnitsRate;\n            if ((!this.isLoading && ((s - this.lastLoadTime) > t))) {\n                i.addClass(this.root, \"loading\");\n                this.isLoading = true;\n                this.loadAdsAndEgo();\n            }\n        ;\n        },\n        registerImpression: function(s, t) {\n            var u = l.create(\"iframe\", {\n                src: o(t).addQueryData({\n                    aed: s\n                }),\n                width: 0,\n                height: 0,\n                frameborder: 0,\n                scrolling: \"no\",\n                className: \"fbEmuTracking\"\n            });\n            u.setAttribute(\"aria-hidden\", \"true\");\n            l.appendContent(this.root, u);\n        },\n        waitForImages: function(s) {\n            var t = l.scry(this.root, \"img.img\"), u = t.length, v = u;\n            if ((v === 0)) {\n                s();\n            };\n            var w = function() {\n                v--;\n                if ((v === 0)) {\n                    s.defer();\n                };\n            };\n            for (var x = 0; (x < u); x++) {\n                var y = t[x];\n                if (y.complete) {\n                    w();\n                }\n                 else g.listen(y, {\n                    load: w,\n                    error: w,\n                    abort: w\n                });\n            ;\n            };\n        }\n    };\n    e.exports = r;\n});\n__d(\"PhotoSnowlift\", [\"function-extensions\",\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"collectDataAttributes\",\"CSS\",\"Dialog\",\"DOM\",\"DOMControl\",\"Event\",\"FullScreen\",\"Input\",\"ImageUtils\",\"Keys\",\"Layer\",\"LinkController\",\"Locale\",\"PageTransitions\",\"Parent\",\"PhotosConst\",\"PhotoSessionLog\",\"PhotoSnowliftAds\",\"PhotoStreamCache\",\"PhotosUtils\",\"PhotoViewer\",\"Rect\",\"ScrollableArea\",\"Style\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserAgent\",\"Vector\",\"$\",\"asyncCallback\",\"computeRelativeURI\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"emptyFunction\",\"ge\",\"goURI\",\"shield\",\"startsWith\",\"tx\",\"userAction\",\"Assert\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"collectDataAttributes\"), m = b(\"CSS\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMControl\"), q = b(\"Event\"), r = b(\"FullScreen\"), s = b(\"Input\"), t = b(\"ImageUtils\"), u = b(\"Keys\"), v = b(\"Layer\"), w = b(\"LinkController\"), x = b(\"Locale\"), y = b(\"PageTransitions\"), z = b(\"Parent\"), aa = b(\"PhotosConst\"), ba = b(\"PhotoSessionLog\"), ca = b(\"PhotoSnowliftAds\"), da = b(\"PhotoStreamCache\"), ea = b(\"PhotosUtils\"), fa = b(\"PhotoViewer\"), ga = b(\"Rect\"), ha = b(\"ScrollableArea\"), ia = b(\"Style\"), ja = b(\"Toggler\"), ka = b(\"UIPagelet\"), la = b(\"URI\"), ma = b(\"UserAgent\"), na = b(\"Vector\"), oa = b(\"$\"), pa = b(\"asyncCallback\"), qa = b(\"computeRelativeURI\"), ra = b(\"copyProperties\"), sa = b(\"createArrayFrom\"), ta = b(\"csx\"), ua = b(\"emptyFunction\"), va = b(\"ge\"), wa = b(\"goURI\"), xa = b(\"shield\"), ya = b(\"startsWith\"), za = b(\"tx\"), ab = b(\"userAction\"), bb = b(\"Assert\"), cb = 74, db = 75, eb = 70, fb = 76;\n    function gb() {\n        this.parent.construct(this);\n    };\n    ra(gb, {\n        STATE_ERROR: \"error\",\n        STATE_HTML: \"html\",\n        STATE_IMAGE_PIXELS: \"image_pixels\",\n        STATE_IMAGE_DATA: \"image\",\n        LOADING_TIMEOUT: 2000,\n        PAGER_FADE: 3000,\n        FULL_SCREEN_PADDING: 10,\n        STAGE_HIRES_MAX: {\n            x: 2048,\n            y: 2048\n        },\n        STAGE_NORMAL_MAX: {\n            x: 960,\n            y: 960\n        },\n        STAGE_MIN: {\n            x: 520,\n            y: 520\n        },\n        SIDEBAR_SIZE_MAX: 360,\n        STAGE_CHROME: {\n            x: 82,\n            y: 42\n        },\n        VIDEO_BOTTOM_BAR_SPACE: 40,\n        GOPREV_AREA: 120,\n        TIMELINE_STRETCH_WIDTH: 843,\n        TIMELINE_STRETCH_MIN: 480,\n        MIN_TAG_DISTANCE: 83,\n        PADDING_MIN: 40,\n        MIN_UFI_HEIGHT: 250,\n        COLLECTIONS_UNTAGGED_PHOTOS: 3,\n        PHOTOS_OF_YOU_SUGGESTIONS: 28,\n        MIN_ADS_VISIBLE: 1,\n        RESERVED_ADS_HEIGHT: 150,\n        _instance: null,\n        getInstance: function() {\n            if (!gb._instance) {\n                gb._instance = new gb();\n            };\n            return gb._instance;\n        },\n        initWithSpotlight: function(hb, ib) {\n            gb.getInstance().init(hb, ib);\n        },\n        touch: ua,\n        addPhotoFbids: function(hb, ib, jb, kb) {\n            gb.getInstance().addPhotoFbids(hb, ib, jb, kb);\n        },\n        setReachedLeftEnd: function() {\n            gb.getInstance().setReachedLeftEnd();\n        },\n        setReachedRightEnd: function() {\n            gb.getInstance().setReachedRightEnd();\n        },\n        attachFollowFlyout: function(hb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), hb);\n        },\n        attachSubscribeFlyout: function(hb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), hb);\n        },\n        attachTagger: function(hb) {\n            gb.getInstance().attachTagger(hb);\n        },\n        preload: function(hb, ib) {\n            gb.getInstance().preload(hb, ib);\n        },\n        bootstrap: function(hb, ib) {\n            if ((hb && la(hb).getQueryData().hasOwnProperty(\"share_id\"))) {\n                j.loadModules([\"SpotlightShareViewer\",], function(jb) {\n                    jb.bootstrap(hb, ib);\n                });\n                return;\n            }\n        ;\n            gb.getInstance().bootstrap(hb, ib);\n        },\n        closeRefresh: function() {\n            gb.getInstance().closeRefresh();\n        },\n        deletePhoto: function(hb) {\n            gb.getInstance().deletePhoto(hb);\n        },\n        getImage: function() {\n            return gb.getInstance().getImage();\n        },\n        getImageId: function() {\n            return gb.getInstance().getImageId();\n        },\n        getLoadQuery: function() {\n            return gb.getInstance().getLoadQuery();\n        },\n        getRHCBody: function() {\n            return gb.getInstance().getRHCBody();\n        },\n        getRHCFooter: function() {\n            return gb.getInstance().getRHCFooter();\n        },\n        getRHCHeader: function() {\n            return gb.getInstance().getRHCHeader();\n        },\n        getRoot: function() {\n            return gb.getInstance().getRoot();\n        },\n        likePhotoSkipConfirmation: function(hb) {\n            gb.getInstance().likePhotoSkipConfirmation(hb);\n        },\n        saveTagsFromPayload: function(hb) {\n            gb.getInstance().saveTagsFromPayload(hb);\n        },\n        saveTagsFromPayloadDelayed: function(hb) {\n            gb.saveTagsFromPayload.curry(hb).defer(2000);\n        },\n        handleServerError: function(hb, ib) {\n            gb.getInstance().handleServerError(hb, ib);\n        },\n        setVideoWarning: function(hb, ib) {\n            var jb = gb.getInstance(), kb = (\"video_warning_\" + hb);\n            if (!jb.videoWarnings) {\n                jb.videoWarnings = [];\n            };\n            jb.videoWarnings[kb] = ib;\n        },\n        storeFromData: function(hb) {\n            gb.getInstance().storeFromData(hb);\n        },\n        swapData: function() {\n            gb.getInstance().swapData();\n        },\n        touchMarkup: ua,\n        updateTotalCount: function(hb, ib, jb) {\n            gb.getInstance().updateTotalCount(hb, ib, jb);\n        },\n        setVideoRotateURI: function(hb) {\n            gb.getInstance().videoRotateURI = hb;\n        }\n    });\n    k.extend(gb, fa);\n    ra(gb.prototype, {\n        switchTimer: null,\n        imageRefreshTimer: null,\n        imageLoadingTimer: null,\n        lastPage: 0,\n        currentMinSize: null,\n        currentImageSize: null,\n        resetUriStack: true,\n        thumbSrc: null,\n        shouldStretch: false,\n        stageMax: gb.STAGE_NORMAL_MAX,\n        stageChrome: gb.STAGE_CHROME,\n        stagePagerPrev: null,\n        ua: null,\n        PhotoTagger: null,\n        showHover: false,\n        skipLikePhotoConfirmation: false,\n        isShowingLikePhotoConfirmation: false,\n        preload: function(hb, ib) {\n            j.loadModules([\"PhotoTagger\",\"Live\",\"PhotoTagApproval\",\"PhotoTags\",\"TagTokenizer\",\"fb-photos-snowlift-fullscreen-css\",], function(kb) {\n                this.PhotoTagger = kb;\n            }.bind(this));\n            var jb = this.getImageSrc(la(hb).getQueryData());\n            if (jb) {\n                (new Image()).src = jb;\n            };\n        },\n        bootstrap: function(hb, ib) {\n            if ((hb && la(hb).getQueryData().makeprofile)) {\n                this.enableCropperOnInit = true;\n                this.isUserProfilePic = la(hb).getQueryData().makeuserprofile;\n                this.isInProfilePicAlbum = la(hb).getQueryData().inprofilepicalbum;\n            }\n        ;\n            this.preload(hb, ib);\n            if (this.closeDirty) {\n                this.bootstrap.bind(this, hb, ib).defer();\n                return;\n            }\n        ;\n            ca.reset();\n            this.resetUriStack = true;\n            if (this.isOpen) {\n                if (this.openExplicitly) {\n                    this.closeCleanup();\n                    this.resetUriStack = false;\n                }\n                 else return\n            \n            };\n            this.ua = ab(\"snowlift\", ib).uai(\"open\");\n            this.returningToStart = false;\n            (this.loading && m.removeClass(this.loading, \"loading\"));\n            if (ib) {\n                m.addClass((this.loading = ib), \"loading\");\n                if (this.container) {\n                    var jb = z.byClass(ib, \"uiStreamStory\");\n                    if (jb) {\n                        this.container.setAttribute(\"data-ownerid\", jb.id);\n                    }\n                     else this.container.removeAttribute(\"data-ownerid\");\n                ;\n                }\n            ;\n                this.getThumbAndSize(ib);\n            }\n             else this.loading = null;\n        ;\n            g.inform(\"PhotoSnowlift.GO\", hb, g.BEHAVIOR_STATE);\n            this.loadFrameIfUninitialized();\n        },\n        getCurrentImageServerSizeDimensions: function() {\n            return this.stream.getCurrentImageData().dimensions;\n        },\n        getEventPrefix: function() {\n            return \"PhotoSnowlift\";\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: function() {\n            return \"snowlift\";\n        },\n        getViewerSource: function() {\n            return this.source;\n        },\n        getViewerSet: function() {\n            return this.stream.getPhotoSet();\n        },\n        getVersionConst: function() {\n            return aa.VIEWER_SNOWLIFT;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getImageId: function() {\n            return this.stream.getCursor();\n        },\n        getRHCHeader: function() {\n            return this.rhcHeader;\n        },\n        getRHCBody: function() {\n            return this.ufiForm;\n        },\n        getRHCFooter: function() {\n            return this.rhcFooter;\n        },\n        getLoadQuery: function() {\n            return this.loadQuery;\n        },\n        getCurrentPhotoInfo: function() {\n            var hb = this.stream.getCurrentImageData();\n            if (hb) {\n                return hb.info\n            };\n            return null;\n        },\n        getOwnerId: function() {\n            var hb = this.stream.getCurrentImageData();\n            if (hb) {\n                return hb.info.owner\n            };\n            return null;\n        },\n        getThumbAndSize: function(hb) {\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            var ib = la(hb.getAttribute(\"ajaxify\")).getQueryData();\n            if (!ib.size) {\n                return\n            };\n            var jb = na.deserialize(ib.size);\n            if ((!jb.x || !jb.y)) {\n                return\n            };\n            this.currentImageSize = jb;\n            if (((!m.hasClass(hb, \"uiMediaThumb\") && !m.hasClass(hb, \"uiPhotoThumb\")) && !m.hasClass(hb, \"uiScaledThumb\"))) {\n                return\n            };\n            if (hb.getAttribute(\"data-cropped\")) {\n                return\n            };\n            var kb = o.scry(hb, \"img\")[0], lb = o.scry(hb, \"i\")[0], mb = z.byAttribute(hb, \"data-size\");\n            this.shouldStretch = ((((((mb && this.currentImageSize) && kb) && (mb.getAttribute(\"data-size\") === \"2\")) && (this.currentImageSize.x > this.currentImageSize.y)) && (this.currentImageSize.x <= gb.TIMELINE_STRETCH_WIDTH)) && (kb.offsetWidth === gb.TIMELINE_STRETCH_WIDTH));\n            var nb;\n            if (kb) {\n                nb = kb.src;\n            }\n             else if (lb) {\n                nb = ia.get(lb, \"backgroundImage\").replace(/.*url\\(\"?([^\"]*)\"?\\).*/, \"$1\");\n            }\n             else return\n            \n        ;\n            this.thumbSrc = nb;\n        },\n        loadFrameIfUninitialized: function() {\n            if (this.root) {\n                return\n            };\n            new i(\"/ajax/photos/snowlift/init.php\").setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n        },\n        init: function(hb, ib) {\n            this.init = ua;\n            this.showHover = ib.pivot_hover;\n            ba.setEndMetrics(ib.pivot_end_metric);\n            this.enableSnowliftProfilePicCropper = ib.snowlift_profile_pic_cropper;\n            this.pagersOnKeyboardNav = ib.pagers_on_keyboard_nav;\n            this.hilitAllTagsAndBoxesOnHover = ib.snowlift_hover_shows_all_tags_and_faces;\n            this.fullscreen = r.isSupported();\n            this.showOGVideos = ib.og_videos;\n            this.resizeCommentsForAds = ib.resize_comments_for_ads;\n            if (this.resizeCommentsForAds) {\n                gb.STAGE_MIN.y = 600;\n            };\n            this.stageMax = gb.STAGE_HIRES_MAX;\n            this.spotlight = hb;\n            this.spotlight.subscribe(\"blur\", function() {\n                this.closingAction = ba.OUTSIDE;\n            }.bind(this));\n            this.spotlight.subscribe(\"hide\", xa(this.closeHandler, this));\n            this.spotlight.subscribe(\"key\", this.keyHandler.bind(this));\n            this.initializeNodes(this.spotlight.getRoot());\n            ca.init(this.sideAdUnit, this, ib, this.adsDisplayedCallback.bind(this));\n            this.inAdsDisplayedCallback = false;\n            this.lastAdsHeight = (this.resizeCommentsForAds ? gb.RESERVED_ADS_HEIGHT : 0);\n            if (!this.subscription) {\n                w.registerHandler(this.handleNavigateAway.bind(this));\n                this.subscription = g.subscribe(\"PhotoSnowlift.GO\", function(jb, kb) {\n                    this.openExplicitly = true;\n                    (this.loading && m.removeClass(this.loading, \"loading\"));\n                    this.open(kb);\n                }.bind(this));\n            }\n        ;\n            this.transitionHandlerRegistered = false;\n            this.returningToStart = false;\n            y.registerHandler(this.openHandler.bind(this));\n            this.openHandlerRegistered = true;\n            g.subscribe(\"PhotoTagApproval.HILITE_TAG\", this.onHiliteTag.bind(this));\n            g.subscribe(\"PhotoTagApproval.UPDATE_TAG_BOX\", this.onUpdateTagBox.bind(this));\n            if (this.fullscreen) {\n                r.subscribe(\"changed\", this.onFullScreenChange.bind(this));\n            };\n            this.redesign = ib.snowlift_redesign;\n        },\n        onFullScreenChange: function() {\n            var hb = r.isFullScreen();\n            m.conditionClass(document.body, \"fbPhotoSnowliftFullScreenMode\", hb);\n            if (hb) {\n                if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                    this.collapseRHC();\n                };\n                var ib = this.stream.getCurrentImageData();\n                if ((((ib && ib.url) && (this.image.src !== ib.url)) && this.shouldShowHiRes(ib))) {\n                    this.switchImage(ib.url);\n                };\n                this.adjustForResize();\n            }\n             else {\n                this.uncollapseRHC();\n                if ((ma.chrome() && !m.hasClass(this.root, \"fbPhotoSnowliftEditMode\"))) {\n                    this.page(0, false);\n                };\n                g.inform(\"reflow\");\n            }\n        ;\n            ja.hide();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            };\n        },\n        initializeNodes: function(hb) {\n            this.root = hb;\n            this.container = o.find(hb, \"div.fbPhotoSnowliftContainer\");\n            this.snowliftPopup = o.find(this.container, \"div.fbPhotoSnowliftPopup\");\n            this.rhc = o.find(this.snowliftPopup, \"div.rhc\");\n            this.rhcHeader = o.find(this.rhc, \"div.rhcHeader\");\n            this.rhcFooter = o.find(this.rhc, \"div.rhcFooter\");\n            this.ufiForm = o.find(this.rhc, \"form.fbPhotosSnowliftFeedbackForm\");\n            this.ufiInputContainer = o.find(this.rhc, \"div.fbPhotosSnowboxFeedbackInput\");\n            this.scroller = o.find(this.ufiForm, \"div.rhcScroller\");\n            this.scrollerBody = o.find(this.scroller, \"div.uiScrollableAreaBody\");\n            this.stageWrapper = o.find(this.snowliftPopup, \"div.stageWrapper\");\n            this.overlay = o.find(this.snowliftPopup, \"div.snowliftOverlay\");\n            this.errorBox = o.find(this.stageWrapper, \"div.stageError\");\n            this.image = o.find(this.stageWrapper, \"img.spotlight\");\n            this.stage = o.find(this.stageWrapper, \"div.stage\");\n            this.videoStage = o.find(this.stageWrapper, \"div.videoStage\");\n            this.prevPager = o.find(this.snowliftPopup, \"a.snowliftPager.prev\");\n            this.nextPager = o.find(this.snowliftPopup, \"a.snowliftPager.next\");\n            this.stageActions = o.find(hb, \"div.stageActions\");\n            this.buttonActions = o.find(this.stageActions, \"div.fbPhotosPhotoButtons\");\n            this.productMetadata = o.scry(this.rhc, \"div.fbPhotosSnowliftProductMetadata\").pop();\n            this.sideAdUnit = o.find(hb, \".-cx-PUBLIC-snowliftAds__root\");\n            g.inform(\"Amoeba/instrumentMulti\", [[this.container,\"snowlift\",],[this.rhc,\"rhc\",],[this.rhcHeader,\"rhc_header\",],[this.ufiForm,\"ufi_form\",],[this.ufiInputContainer,\"ufi_input\",],[this.prevPager,\"prev_pager\",],[this.nextPager,\"next_pager\",],[this.stageActions,\"stage_actions\",],[this.sideAdUnit,\"side_ads\",],], g.BEHAVIOR_PERSISTENT);\n            m.conditionClass(this.root, \"fullScreenAvailable\", this.fullscreen);\n        },\n        initializeScroller: function() {\n            this.initializeScroller = ua;\n            this.scrollableArea = ha.fromNative(this.scroller, {\n                fade: true,\n                persistent: true\n            });\n            var hb = function(event) {\n                var ib = q.$E(event).getTarget();\n                if (o.contains(this.ufiInputContainer, ib)) {\n                    var jb = p.getInstance(ib);\n                    if (jb) {\n                        this.scrollableArea.scrollToBottom();\n                        var kb = jb.subscribe(\"resize\", function() {\n                            var mb = this.scrollableArea.isScrolledToBottom();\n                            this.adjustScroller();\n                            (mb && this.scrollableArea.scrollToBottom());\n                        }.bind(this)), lb = q.listen(ib, \"blur\", function() {\n                            jb.unsubscribe(kb);\n                            lb.remove();\n                        });\n                    }\n                ;\n                }\n            ;\n            }.bind(this);\n            g.subscribe(\"ufi/changed\", function(ib, jb) {\n                if ((this.ufiForm === jb.form)) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            g.subscribe(\"ufi/comment\", function(ib, jb) {\n                if ((this.ufiForm === jb.form)) {\n                    this.adjustScrollerIfNecessary();\n                    if (jb.isranked) {\n                        this.scrollableArea.scrollToTop();\n                    }\n                     else this.scrollableArea.scrollToBottom();\n                ;\n                }\n            ;\n            }.bind(this));\n            q.listen(this.rhc, \"click\", function(event) {\n                var ib = event.getTarget();\n                if (((z.byTag(ib, \"a\") || z.byTag(ib, \"button\")) || o.isNodeOfType(ib, \"input\"))) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            g.subscribe([\"reflow\",\"CommentUFI.Pager\",], function() {\n                if (this.isOpen) {\n                    this.adjustScrollerIfNecessary();\n                };\n            }.bind(this));\n            q.listen(this.ufiForm, \"focusin\", hb);\n        },\n        openHandler: function(hb) {\n            if ((((((this.isOpen || (hb.getPath() != \"/photo.php\")) || this.returningToStart) || hb.getQueryData().closeTheater) || hb.getQueryData().permPage) || hb.getQueryData().makeprofile)) {\n                this.openHandlerRegistered = false;\n                return false;\n            }\n        ;\n            this.open(hb);\n            this._uriStack.push(la(hb).getQualifiedURI().toString());\n            y.transitionComplete(true);\n            return true;\n        },\n        getImageSrc: function(hb) {\n            if (hb.smallsrc) {\n                if (!hb.size) {\n                    return hb.smallsrc\n                };\n                var ib = na.deserialize(hb.size), jb = this.getStageSize(ib);\n                if (((jb.x <= gb.STAGE_NORMAL_MAX.x) && (jb.y <= gb.STAGE_NORMAL_MAX.y))) {\n                    return hb.smallsrc\n                };\n            }\n        ;\n            return hb.src;\n        },\n        open: function(hb) {\n            var ib = la(hb).getQueryData(), jb = this.getImageSrc(ib);\n            if (jb) {\n                delete ib.src;\n                delete ib.smallsrc;\n            }\n        ;\n            if (this.resetUriStack) {\n                this._uriStack = [];\n            };\n            if (!this.initialLoad) {\n                ib.firstLoad = true;\n                this.initialLoad = true;\n            }\n        ;\n            this.sessionID = Date.now();\n            this.sessionPhotosHilited = {\n            };\n            this.loadQuery = ra(ib, {\n                ssid: this.sessionID\n            });\n            this.isOpen = true;\n            this.pagersShown = false;\n            this.refreshOnClose = false;\n            this.hilitedTag = null;\n            this.loadingStates = {\n                image: false,\n                html: false\n            };\n            this.replaceUrl = false;\n            this.source = null;\n            this.saveTagSubscription = g.subscribe(\"PhotoTagger.SAVE_TAG\", this.onTagSaved.bind(this));\n            this.taggedPhotoIds = [];\n            this.stream = new da();\n            this.stream.init(aa.VIEWER_SNOWLIFT, \"PhotoViewerPagelet\", \"pagelet_photo_viewer\");\n            this.fetchInitialData();\n            this.setLoadingState(gb.STATE_HTML, true);\n            this.rhcCollapsed = false;\n            this._open(hb, jb);\n            if (this.enableSnowliftProfilePicCropper) {\n                j.loadModules([\"SnowliftPicCropper\",], function(kb) {\n                    this.cropper = kb.getInstance(this);\n                    this.cropper.init();\n                    if (this.enableCropperOnInit) {\n                        var lb = g.subscribe(\"PhotoSnowlift.SWITCH_IMAGE\", function() {\n                            if (this.isInProfilePicAlbum) {\n                                this.cropper.showPicInProfileAlbumDialog();\n                            }\n                             else this.cropper.enableCropping(this.isUserProfilePic);\n                        ;\n                            g.unsubscribe(lb);\n                        }.bind(this));\n                        this.enableCropperOnInit = false;\n                    }\n                ;\n                }.bind(this));\n            };\n            j.loadModules([\"PhotosButtonTooltips\",], function(kb) {\n                kb.init();\n            });\n        },\n        _open: function(hb, ib) {\n            this.createLoader(ib);\n            this.spotlight.show();\n            (this.ua && this.ua.add_event(\"frame\"));\n            g.inform(\"layer_shown\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.OPEN\");\n            this.stageHandlers = [q.listen(window, \"resize\", this.adjustForResize.bind(this)),q.listen(this.stageWrapper, \"click\", this.buttonListener.bind(this)),q.listen(this.stageWrapper, \"mouseleave\", function(event) {\n                var lb = event.getTarget();\n                if (!(((((((z.byClass(lb, \"snowliftOverlay\") || z.byClass(lb, \"fbPhotoSnowliftTagApproval\")) || z.byClass(lb, \"tagPointer\")) || z.byClass(lb, \"arrow\")) || z.byClass(lb, \"faceboxSuggestion\")) || z.byClass(lb, \"typeaheadWrapper\")) || z.byClass(lb, \"photoTagTypeahead\")))) {\n                    this.unhiliteAllTags();\n                };\n                this.hidePagers();\n            }.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hilitePagerOnMouseMove.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hiliteTagsOnMouseMove.bind(this)),q.listen(this.overlay, \"mouseenter\", this.unhiliteAllTags.bind(this)),];\n            this.stageHandlers.push(q.listen(this.container, \"click\", function(event) {\n                var lb = event.getTarget();\n                if (z.byClass(lb, \"rotateRight\")) {\n                    this.rotate(\"right\");\n                }\n                 else if (z.byClass(lb, \"rotateLeft\")) {\n                    this.rotate(\"left\");\n                }\n                 else if (z.byClass(lb, \"closeTheater\")) {\n                    if (r.isFullScreen()) {\n                        r.toggleFullScreen();\n                        return;\n                    }\n                ;\n                    this.closingAction = ba.X;\n                    this.closeHandler();\n                    return false;\n                }\n                 else if (this.fullscreen) {\n                    if (z.byClass(lb, \"fbPhotoSnowliftFullScreen\")) {\n                        this.toggleFullScreen();\n                    }\n                     else if (z.byClass(lb, \"fbPhotoSnowliftCollapse\")) {\n                        this.toggleCollapse();\n                    }\n                \n                }\n                \n                \n            ;\n            }.bind(this)));\n            var jb = va(\"fbPhotoSnowliftFeedback\");\n            if (jb) {\n                this.stageHandlers.push(q.listen(jb, \"click\", function(event) {\n                    var lb = event.getTarget();\n                    if ((z.byClass(lb, \"like_link\") || ((z.byClass(lb, \"UFILikeLink\") && z.byClass(lb, \"UIActionLinks\"))))) {\n                        this.toggleLikeButton();\n                    };\n                    var mb = z.byClass(event.getTarget(), \"uiUfiCollapsedComment\");\n                    if (mb) {\n                        m.addClass(mb, \"uiUfiCollapsedCommentToggle\");\n                    };\n                }.bind(this)));\n            };\n            var kb = va(\"fbPhotoSnowliftOnProfile\");\n            if (kb) {\n                this.stageHandlers.push(q.listen(kb, \"click\", function(event) {\n                    if (z.byClass(event.getTarget(), \"fbPhotoRemoveFromProfileLink\")) {\n                        this.refreshOnClose = true;\n                    };\n                }.bind(this)));\n            };\n            if (this.resetUriStack) {\n                this.startingURI = la.getMostRecentURI().addQueryData({\n                    closeTheater: 1\n                }).getUnqualifiedURI();\n            };\n            if (!ib) {\n                this.setLoadingState(gb.STATE_IMAGE_DATA, true);\n            };\n            if (!this.transitionHandlerRegistered) {\n                y.registerHandler(this.transitionHandler.bind(this));\n                this.transitionHandlerRegistered = true;\n            }\n        ;\n            ba.initLogging(ba.SNOWLIFT);\n            if (this.pivots) {\n                ba.setRelevantCount(this.pivots.relevantCount);\n            };\n        },\n        toggleFullScreen: function() {\n            var hb = r.toggleFullScreen(document.documentElement);\n            if (hb) {\n                var ib = this.stream.getCurrentImageData();\n                if ((((ib && ib.url) && (this.image.src !== ib.url)) && this.shouldShowHiRes(ib))) {\n                    (new Image()).src = ib.url;\n                };\n                ba.logEnterFullScreen(this.stream.getCursor());\n            }\n        ;\n        },\n        getStream: function() {\n            return this.stream;\n        },\n        fetchInitialData: function() {\n            (this.ua && this.ua.add_event(\"init_data\"));\n            this.stream.waitForInitData();\n            var hb = l(this.container, [\"ft\",]);\n            if ((((hb && hb.ft) && hb.ft.ei) && this.loadQuery)) {\n                this.loadQuery.ei = hb.ft.ei;\n            };\n            ka.loadFromEndpoint(\"PhotoViewerInitPagelet\", va(\"pagelet_photo_viewer_init\", this.root), this.loadQuery, {\n                usePipe: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n        },\n        toggleCollapse: function() {\n            if (this.rhcCollapsed) {\n                this.uncollapseRHC();\n            }\n             else this.collapseRHC();\n        ;\n        },\n        collapseRHC: function() {\n            this.rhcCollapsed = true;\n            m.addClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        uncollapseRHC: function() {\n            this.rhcCollapsed = false;\n            m.removeClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        closeHandler: function() {\n            if (!this.isOpen) {\n                return\n            };\n            this.closingAction = (this.closingAction || ba.ESC);\n            if ((la.getMostRecentURI().addQueryData({\n                closeTheater: 1\n            }).getUnqualifiedURI().toString() == this.startingURI.toString())) {\n                this.close();\n                return;\n            }\n        ;\n            this.returnToStartingURI(this.refreshOnClose);\n            this.close();\n        },\n        returnToStartingURI: function(hb, ib) {\n            if (!hb) {\n                if (ib) {\n                    this.squashNextTransition(wa.curry(ib));\n                }\n                 else this.squashNextTransition();\n            \n            };\n            this.returningToStart = true;\n            var jb = g.subscribe(\"page_transition\", (function() {\n                this.returningToStart = false;\n                jb.unsubscribe();\n            }).bind(this)), kb = (hb || isNaN(ma.opera())), lb = this._uriStack.length;\n            if ((kb && (lb < window.history.length))) {\n                window.history.go(-lb);\n            }\n             else {\n                var mb = this.startingURI, nb = new la(mb).removeQueryData(\"closeTheater\");\n                if (((mb.getQueryData().sk == \"approve\") && (mb.getPath() == \"/profile.php\"))) {\n                    nb.removeQueryData(\"highlight\");\n                    nb.removeQueryData(\"notif_t\");\n                }\n            ;\n                wa(nb);\n            }\n        ;\n        },\n        squashNextTransition: function(hb) {\n            this.squashNext = true;\n            y.registerHandler(function ib() {\n                if (this.squashNext) {\n                    this.squashNext = false;\n                    if (hb) {\n                        hb.defer();\n                    };\n                    y.transitionComplete(true);\n                    return true;\n                }\n            ;\n                return false;\n            }.bind(this), 7);\n        },\n        handleNavigateAway: function(hb) {\n            var ib = qa(y._most_recent_uri.getQualifiedURI(), hb.getAttribute(\"href\"));\n            if ((this.isOpen && ya(ib.getPath(), \"/hashtag/\"))) {\n                this.close();\n                y.transitionComplete(true);\n                this.squashNextTransition();\n                y.go(this.startingURI);\n                return true;\n            }\n        ;\n            if ((((this.isOpen && ((ib instanceof la))) && (ib.getUnqualifiedURI().toString() != this.startingURI.toString())) && (ib.getPath() != \"/photo.php\"))) {\n                if (!this.closingAction) {\n                    this.closingAction = ba.NAVIGATE;\n                };\n                this.returnToStartingURI(false, ib);\n                this.close();\n                return false;\n            }\n        ;\n            return true;\n        },\n        postProcessTaggedPhotos: function() {\n            if ((this.taggedPhotoIds && (this.taggedPhotoIds.length > 0))) {\n                var hb = null;\n                if ((this.source === gb.COLLECTIONS_UNTAGGED_PHOTOS)) {\n                    hb = \"/ajax/photos/photo/edit/skiptag/\";\n                }\n                 else if ((this.source === gb.PHOTOS_OF_YOU_SUGGESTIONS)) {\n                    hb = \"/ajax/photos/photo/add_to_star_grid/\";\n                }\n            ;\n                if (hb) {\n                    new i().setURI(hb).setAllowCrossPageTransition(true).setData({\n                        media_id: this.taggedPhotoIds\n                    }).send();\n                };\n            }\n        ;\n        },\n        onTagSaved: function(hb, ib) {\n            if (this.taggedPhotoIds) {\n                if (((this.source === gb.PHOTOS_OF_YOU_SUGGESTIONS) && !ib.self_tag)) {\n                    return\n                };\n                this.taggedPhotoIds.push(ib.photo_fbid);\n            }\n        ;\n        },\n        close: function() {\n            if (!this.isOpen) {\n                return\n            };\n            this.isOpen = false;\n            if (this.fullscreen) {\n                r.disableFullScreen();\n            };\n            ab(\"snowlift\").uai(\"close\");\n            (this.cropper && this.cropper.disableCropping());\n            this.spotlight.hide();\n            this.openExplicitly = false;\n            this.postProcessTaggedPhotos();\n            g.unsubscribe(this.saveTagSubscription);\n            this.taggedPhotoIds = [];\n            this.closeDirty = true;\n            this.closeCleanup.bind(this).defer();\n        },\n        closeCleanup: function() {\n            this.closeDirty = false;\n            m.removeClass(this.root, \"dataLoading\");\n            ba.logPhotoViews(this.closingAction);\n            this.destroy();\n            m.hide(this.errorBox);\n            m.hide(this.image);\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            this.shouldStretch = false;\n            this.resetUriStack = true;\n            m.removeClass(this.stageWrapper, \"showVideo\");\n            o.empty(this.videoStage);\n            this.uncollapseRHC();\n            this.currentMinSize = null;\n            this.rhcMinHeight = null;\n            this.setStagePagersState(\"reset\");\n            this.recacheData();\n            o.empty(this.sideAdUnit);\n            this.stream.destroy();\n            var hb = (this.closingAction === ba.NAVIGATE);\n            this.closingAction = null;\n            if (!this.openHandlerRegistered) {\n                y.registerHandler(this.openHandler.bind(this));\n                this.openHandlerRegistered = true;\n            }\n        ;\n            g.inform(\"layer_hidden\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.CLOSE\", hb);\n            this.root.setAttribute(\"aria-busy\", \"true\");\n        },\n        createLoader: function(hb) {\n            if ((this.currentImageSize === null)) {\n                this.adjustStageSize(gb.STAGE_MIN);\n            }\n             else {\n                var ib = this.getStageSize(this.currentImageSize);\n                ib = new na(Math.max(ib.x, gb.STAGE_MIN.x), Math.max(ib.y, gb.STAGE_MIN.y));\n                var jb = this.getImageSizeInStage(this.currentImageSize, ib);\n                if ((this.thumbSrc === null)) {\n                    this.adjustStageSize(jb);\n                }\n                 else this.useImage(o.create(\"img\", {\n                    className: \"spotlight\",\n                    alt: \"\",\n                    src: this.thumbSrc,\n                    style: {\n                        width: (jb.x + \"px\"),\n                        height: (jb.y + \"px\")\n                    }\n                }), jb, false);\n            ;\n            }\n        ;\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            if (hb) {\n                (function() {\n                    var kb = new Image(), lb = q.listen(kb, \"load\", pa(function() {\n                        if (!this.isOpen) {\n                            return\n                        };\n                        if ((!this.stream || !this.stream.errorInCurrent())) {\n                            this.switchImage(hb, this.currentImageSize);\n                            (this.ua && this.ua.add_event(\"image\"));\n                            this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n                        }\n                    ;\n                    }.bind(this), \"photo_theater\"));\n                    g.subscribeOnce(\"PhotoSnowlift.PAGE\", lb.remove.bind(lb));\n                    kb.src = hb;\n                }).bind(this).defer();\n            };\n            m.hide(this.stageActions);\n            this.setStagePagersState(\"disabled\");\n        },\n        initDataFetched: function(hb) {\n            ba.setPhotoSet(this.stream.getPhotoSet());\n            ba.setLogFbids(hb.logids);\n            var ib = this.stream.getCurrentImageData();\n            ba.addPhotoView(ib.info, this.shouldShowHiRes(ib), (this.fullscreen && r.isFullScreen()));\n            var jb = this.stream.getCurrentExtraData();\n            if ((jb && (jb.source !== undefined))) {\n                this.source = parseInt(jb.source, 10);\n                ba.setSource(this.source);\n            }\n        ;\n            if (!this.pageHandlers) {\n                this.pageHandlers = [q.listen(this.root, \"click\", this.pageListener.bind(this)),q.listen(this.root, \"mouseleave\", this.mouseLeaveListener.bind(this)),];\n            };\n            m.show(this.stageActions);\n            this.root.setAttribute(\"aria-busy\", \"false\");\n            this.isLoggedInViewer = hb.loggedin;\n            this.disableAdsForSession = (hb.disablesessionads || !this.isLoggedInViewer);\n            this.showFlashTags = !!hb.flashtags;\n            this.disableAds = (this.disableAdsForSession || hb.fromad);\n            this.loadAds();\n        },\n        adjustScrollerIfNecessary: function() {\n            clearTimeout(this.scrollerTimeout);\n            this.scrollerTimeout = this.adjustScroller.bind(this).defer();\n        },\n        adjustScroller: function(hb) {\n            clearTimeout(this.scrollerTimeout);\n            this.initializeScroller();\n            this.scrollableArea.resize();\n            var ib = na.getElementDimensions(this.rhc), jb = ib.y;\n            jb -= na.getElementDimensions(this.rhcHeader).y;\n            jb -= na.getElementDimensions(this.ufiInputContainer).y;\n            if (this.productMetadata) {\n                var kb = na.getElementDimensions(this.productMetadata);\n                if ((kb.x !== 0)) {\n                    jb -= kb.y;\n                };\n            }\n        ;\n            if ((hb == null)) {\n                hb = (this.resizeCommentsForAds ? this.lastAdsHeight : 0);\n            };\n            this.lastAdsHeight = hb;\n            this.rhcMinHeight = (ib.y - ((jb - gb.MIN_UFI_HEIGHT)));\n            jb = Math.max(0, jb);\n            var lb = na.getElementDimensions(this.scrollerBody).y, mb = Math.max(gb.MIN_UFI_HEIGHT, (jb - hb));\n            if ((lb >= mb)) {\n                ia.set(this.scroller, \"height\", (mb + \"px\"));\n                if ((jb > mb)) {\n                    m.removeClass(this.rhc, \"pinnedUfi\");\n                    jb -= mb;\n                }\n                 else {\n                    m.addClass(this.rhc, \"pinnedUfi\");\n                    jb = 0;\n                }\n            ;\n            }\n             else {\n                ia.set(this.scroller, \"height\", \"auto\");\n                m.removeClass(this.rhc, \"pinnedUfi\");\n                jb -= lb;\n            }\n        ;\n            var nb = o.scry(this.ufiInputContainer, \"li.UFIAddComment\");\n            if ((nb.length !== 0)) {\n                var ob = o.scry(this.scrollerBody, \"li.UFIComment.display\");\n                if ((ob.length === 0)) {\n                    m.addClass(nb[0], \"UFIFirstComponent\");\n                }\n                 else m.removeClass(nb[0], \"UFIFirstComponent\");\n            ;\n            }\n        ;\n            var pb = na.getElementDimensions(this.ufiInputContainer).y;\n            ia.set(this.ufiForm, \"padding-bottom\", (pb + \"px\"));\n            ca.resize(new na(ib.x, jb));\n            this.scrollableArea.adjustGripper();\n        },\n        adjustForResize: function() {\n            this.currentMinSize = null;\n            this.adjustStageSize();\n            this.adjustForNewData();\n        },\n        shouldShowHiRes: function(hb) {\n            if ((!hb || !hb.smallurl)) {\n                return false\n            };\n            var ib = this.getStageSize(hb.dimensions), jb = this.getImageSizeInStage(hb.dimensions, ib);\n            return (((jb.x > gb.STAGE_NORMAL_MAX.x) || (jb.y > gb.STAGE_NORMAL_MAX.y)));\n        },\n        getImageURL: function(hb) {\n            if (hb.video) {\n                return null;\n            }\n             else if ((hb.smallurl && !this.shouldShowHiRes(hb))) {\n                return hb.smallurl\n            }\n        ;\n            return hb.url;\n        },\n        getImageDimensions: function(hb) {\n            if ((hb.smalldims && ((!this.shouldShowHiRes(hb) || (this.image.src === hb.smallurl))))) {\n                return hb.smalldims\n            };\n            return hb.dimensions;\n        },\n        getStageSize: function(hb, ib) {\n            var jb = na.getViewportDimensions(), kb = new na(hb.x, hb.y);\n            if (ib) {\n                kb = new na(Math.max(hb.x, ib.x), Math.max(hb.y, ib.y));\n            };\n            var lb, mb;\n            if ((this.fullscreen && r.isFullScreen())) {\n                return new na(((this.rhcCollapsed ? screen.width : (screen.width - gb.SIDEBAR_SIZE_MAX))), (screen.height - (gb.FULL_SCREEN_PADDING * 2)));\n            }\n             else {\n                lb = Math.min(kb.x, this.stageMax.x, (((jb.x - gb.SIDEBAR_SIZE_MAX) - gb.STAGE_CHROME.x)));\n                mb = Math.min(kb.y, this.stageMax.y, (jb.y - gb.STAGE_CHROME.y));\n            }\n        ;\n            if (((lb === 0) && (mb === 0))) {\n                return new na(0, 0)\n            };\n            var nb = (lb / mb), ob = (kb.x / kb.y);\n            if ((nb < ob)) {\n                return new na(lb, Math.round((lb / ob)))\n            };\n            return new na(Math.round((mb * ob)), mb);\n        },\n        getImageSizeInStage: function(hb, ib) {\n            var jb = hb.x, kb = hb.y;\n            if (((jb >= ib.x) || (kb >= ib.y))) {\n                var lb = (ib.x / ib.y), mb = (jb / kb);\n                if ((lb < mb)) {\n                    jb = ib.x;\n                    kb = Math.round((jb / mb));\n                }\n                 else if ((lb > mb)) {\n                    kb = ib.y;\n                    jb = Math.round((kb * mb));\n                }\n                 else {\n                    jb = ib.x;\n                    kb = ib.y;\n                }\n                \n            ;\n            }\n        ;\n            return new na(jb, kb);\n        },\n        adjustStageSize: function(hb) {\n            var ib = this.currentImageSize;\n            if (hb) {\n                ib = hb;\n            }\n             else {\n                var jb = (this.stream && this.stream.getCurrentImageData());\n                if (jb) {\n                    ib = this.getImageDimensions(jb);\n                };\n            }\n        ;\n            if (!ib) {\n                return\n            };\n            this.currentImageSize = ib;\n            var kb = 0;\n            if (((((this.shouldStretch && !this.getVideoOnStage()) && (ib.x > ib.y)) && (ib.x <= gb.TIMELINE_STRETCH_WIDTH)) && (ib.x >= gb.TIMELINE_STRETCH_MIN))) {\n                ib.y = Math.round(((ib.y * gb.TIMELINE_STRETCH_WIDTH) / ib.x));\n                ib.x = gb.TIMELINE_STRETCH_WIDTH;\n            }\n             else if (this.getVideoOnStage()) {\n                kb = (gb.VIDEO_BOTTOM_BAR_SPACE * 2);\n            }\n        ;\n            var lb = this.getStageSize(ib, this.currentMinSize);\n            if (!this.currentMinSize) {\n                this.currentMinSize = new na(0, 0);\n            };\n            if (!this.rhcMinHeight) {\n                this.rhcMinHeight = 0;\n            };\n            this.currentMinSize = new na(Math.max(lb.x, gb.STAGE_MIN.x, this.currentMinSize.x), Math.max(lb.y, gb.STAGE_MIN.y, this.currentMinSize.y));\n            var mb = this.getImageSizeInStage(ib, this.currentMinSize), nb = (this.currentMinSize.x - mb.x), ob = (this.currentMinSize.y - mb.y);\n            if (((nb > 0) && (nb < gb.PADDING_MIN))) {\n                this.currentMinSize.x -= nb;\n            }\n             else if (((ob > 0) && (ob < gb.PADDING_MIN))) {\n                this.currentMinSize.y -= ob;\n            }\n        ;\n            var pb = o.scry(this.productMetadata, \"#fbPhotoSnowliftTaggedProducts .taggee\");\n            if (pb.length) {\n                this.currentMinSize.y = Math.max(this.currentMinSize.y, this.rhcMinHeight);\n            };\n            var qb = (this.currentMinSize.x + gb.SIDEBAR_SIZE_MAX);\n            if (this.rhcCollapsed) {\n                qb = this.currentMinSize.x;\n            };\n            this.snowliftPopup.style.cssText = (((((\"width:\" + qb) + \"px;\") + \"height:\") + this.currentMinSize.y) + \"px;\");\n            var rb = ((this.currentMinSize.y - kb) + \"px\");\n            if ((ma.firefox() || (ma.ie() < 8))) {\n                var sb = ia.get(this.stageWrapper, \"font-size\");\n                if ((ma.ie() && (sb.indexOf(\"px\") < 0))) {\n                    var tb = o.create(\"div\");\n                    tb.style.fontSize = sb;\n                    tb.style.height = \"1em\";\n                    sb = tb.style.pixelHeight;\n                }\n            ;\n                rb = (((((this.currentMinSize.y - kb)) / parseFloat(sb))) + \"em\");\n            }\n        ;\n            this.stageWrapper.style.cssText = (((((\"width:\" + this.currentMinSize.x) + \"px;\") + \"line-height:\") + rb) + \";\");\n            if ((ma.ie() < 8)) {\n                ia.set(this.root, \"height\", (na.getViewportDimensions().y + \"px\"));\n                ia.set(this.container, \"min-height\", (((this.currentMinSize.y + gb.STAGE_CHROME.y)) + \"px\"));\n            }\n        ;\n            this.image.style.cssText = (((((\"width:\" + mb.x) + \"px;\") + \"height:\") + mb.y) + \"px;\");\n            var ub = this.getTagger();\n            if (ub) {\n                ub.repositionTagger();\n            };\n            this.adjustScrollerIfNecessary();\n        },\n        adjustForNewData: function() {\n            if (!this.image) {\n                return\n            };\n            var hb = o.scry(this.stage, \"div.tagsWrapper\")[0], ib = na.getElementDimensions(this.image);\n            if (hb) {\n                ia.set(hb, \"width\", (ib.x + \"px\"));\n                ia.set(hb, \"height\", (ib.y + \"px\"));\n                if ((ma.ie() <= 7)) {\n                    var jb = o.scry(this.root, \"div.tagContainer\")[0];\n                    if (jb) {\n                        m.conditionClass(hb, \"ie7VerticalFix\", (na.getElementDimensions(jb).y > ib.y));\n                    };\n                }\n            ;\n            }\n        ;\n        },\n        adsDisplayedCallback: function(hb, ib) {\n            var jb = ((((this.resizeCommentsForAds && !this.inAdsDisplayedCallback) && !this.disableAds) && (gb.MIN_ADS_VISIBLE > 0)) && (ib.length >= gb.MIN_ADS_VISIBLE));\n            if (jb) {\n                var kb = ib[(gb.MIN_ADS_VISIBLE - 1)], lb = ((hb < gb.MIN_ADS_VISIBLE) || (kb != gb.RESERVED_ADS_HEIGHT));\n                if (lb) {\n                    this.inAdsDisplayedCallback = true;\n                    this.adjustScroller(kb);\n                    this.inAdsDisplayedCallback = false;\n                }\n            ;\n            }\n        ;\n        },\n        setLoadingState: function(hb, ib) {\n            switch (hb) {\n              case gb.STATE_IMAGE_PIXELS:\n                m.conditionClass(this.root, \"imagePixelsLoading\", ib);\n                break;\n              case gb.STATE_IMAGE_DATA:\n                this.loadingStates[hb] = ib;\n                m.conditionClass(this.root, \"imageLoading\", ib);\n                break;\n              case gb.STATE_HTML:\n                this.loadingStates[hb] = ib;\n                m.conditionClass(this.root, \"dataLoading\", ib);\n                this.rhc.setAttribute(\"aria-busy\", (ib ? \"true\" : \"false\"));\n                break;\n            };\n        },\n        destroy: function() {\n            this.stageHandlers.forEach(function(hb) {\n                hb.remove();\n            });\n            if (this.pageHandlers) {\n                this.pageHandlers.forEach(function(hb) {\n                    hb.remove();\n                });\n                this.pageHandlers = null;\n            }\n        ;\n        },\n        checkState: function(hb) {\n            if (((hb != gb.STATE_ERROR) && !this.loadingStates[hb])) {\n                return\n            };\n            switch (hb) {\n              case gb.STATE_IMAGE_DATA:\n                var ib = this.stream.getCurrentImageData();\n                if (ib) {\n                    var jb = this.getImageURL(ib);\n                    if (jb) {\n                        this.switchImage(jb, null, true);\n                    }\n                     else if (ib.video) {\n                        this.switchVideo(ib.video, true);\n                    }\n                ;\n                    this.setLoadingState(hb, false);\n                }\n            ;\n                break;\n              case gb.STATE_HTML:\n                if (this.stream.getCurrentHtml()) {\n                    this.swapData();\n                    this.showPagers(gb.PAGER_FADE);\n                    this.setLoadingState(hb, false);\n                }\n            ;\n                break;\n              default:\n                if (this.stream.errorInCurrent()) {\n                    m.hide(this.image);\n                    m.show(this.errorBox);\n                }\n            ;\n                break;\n            };\n        },\n        buttonListener: function(event) {\n            var hb = event.getTarget(), ib = Date.now();\n            if (z.byClass(hb, \"fbPhotoTagApprovalBox\")) {\n                return\n            };\n            if (z.byClass(hb, \"fbPhotosCornerWantButton\")) {\n                event.stop();\n                return;\n            }\n        ;\n            if (((ib - this.lastPage) < 350)) {\n                return\n            };\n            if (z.byClass(hb, \"fbPhotosPhotoLike\")) {\n                this.likePhoto();\n            }\n             else if (z.byClass(hb, \"tagApproveIgnore\")) {\n                this.updateTagBox(event, hb);\n            }\n        ;\n        },\n        likePhoto: function() {\n            ba.addButtonLike();\n            var hb = oa(\"fbPhotoSnowliftFeedback\"), ib = o.scry(hb, \"button.like_link\")[0];\n            if (!ib) {\n                if (this.redesign) {\n                    ib = o.scry(this.root, \"a.-cx-PUBLIC-fbEntstreamCollapsedUFI__likelink\")[0];\n                }\n                 else ib = o.scry(hb, \"a.UFILikeLink\")[0];\n            \n            };\n            var jb = ib.getAttribute(\"href\");\n            if (r.isFullScreen()) {\n                if (ma.chrome()) {\n                    ib.setAttribute(\"href\", \"javascript:;\");\n                }\n            };\n            ib.click();\n            ib.setAttribute(\"href\", jb);\n        },\n        toggleLikeButton: function() {\n            var hb = o.scry(this.buttonActions, \"a.fbPhotosPhotoLike\")[0];\n            if (hb) {\n                var ib = o.find(this.root, \".likeCount\"), jb = o.find(ib, \".likeCountNum\");\n                if (ib) {\n                    if (m.hasClass(hb, \"viewerLikesThis\")) {\n                        o.setContent(jb, (parseInt(jb.textContent, 10) - 1));\n                    }\n                     else o.setContent(jb, (parseInt(jb.textContent, 10) + 1));\n                \n                };\n                m.toggleClass(hb, \"viewerLikesThis\");\n                m.removeClass(hb, \"viewerAlreadyLikedThis\");\n            }\n        ;\n        },\n        likePhotoWithKey: function() {\n            if (this.isShowingLikePhotoConfirmation) {\n                return\n            };\n            if (this.skipLikePhotoConfirmation) {\n                this.likePhoto();\n            }\n             else h.send(new i(\"/photos/confirm_like.php\"), function(hb) {\n                this.isShowingLikePhotoConfirmation = true;\n                hb.subscribe(\"confirm\", this.onCloseLikePhotoConfirmDialog.bind(this));\n                hb.subscribe(\"cancel\", this.onCloseLikePhotoConfirmDialog.bind(this));\n            }.bind(this));\n        ;\n            return false;\n        },\n        likePhotoSkipConfirmation: function(hb) {\n            this.skipLikePhotoConfirmation = hb;\n            this.likePhoto();\n        },\n        onCloseLikePhotoConfirmDialog: function() {\n            this.isShowingLikePhotoConfirmation = false;\n        },\n        updateTagBox: function(hb, ib) {\n            this.unhiliteAllTags();\n            var jb = va(hb);\n            if (!jb) {\n                return\n            };\n            m.addClass(jb, \"tagBox\");\n            m.addClass(jb, \"tagBoxPendingResponse\");\n            m.removeClass(jb, \"tagBoxPending\");\n            m.hide(o.find(jb, \"span.tagForm\"));\n            if (ib) {\n                m.show(o.find(jb, \"span.tagApproved\"));\n            }\n             else m.show(o.find(jb, \"span.tagIgnored\"));\n        ;\n        },\n        rotate: function(hb) {\n            var ib = this.stream.getCursor();\n            if (this.getVideoOnStage()) {\n                var jb = (((hb == \"left\")) ? 270 : 90);\n                bb.isTruthy(this.videoRotateURI, \"Video rotate URI not set.\");\n                j.loadModules([\"VideoRotate\",], function(lb) {\n                    new lb(ib, this.videoRotateURI).motionRotate(jb);\n                }.bind(this));\n                return;\n            }\n        ;\n            var kb = ra({\n                fbid: ib,\n                opaquecursor: this.stream.getOpaqueCursor(ib),\n                cs_ver: aa.VIEWER_SNOWLIFT\n            }, this.stream.getPhotoSetQuery());\n            kb[hb] = 1;\n            this.setLoadingState(gb.STATE_IMAGE_DATA, true);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            m.hide(this.image);\n            new i(\"/ajax/photos/photo/rotate/\").setAllowCrossPageTransition(true).setData(kb).setErrorHandler(this.rotationError.bind(this, ib)).setFinallyHandler(this.rotationComplete.bind(this, ib)).setMethod(\"POST\").setReadOnly(false).send();\n        },\n        rotationComplete: function(hb, ib) {\n            if ((hb == this.stream.getCursor())) {\n                this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                this.swapData();\n            }\n        ;\n        },\n        rotationError: function(hb, ib) {\n            if ((hb == this.stream.getCursor())) {\n                this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                j.loadModules([\"AsyncResponse\",], function(jb) {\n                    jb.defaultErrorHandler(ib);\n                });\n            }\n        ;\n        },\n        saveTagsFromPayload: function(hb) {\n            this.storeFromData(hb);\n            if (((\"data\" in hb) && (this.stream.getCursor() in hb.data))) {\n                this.swapData();\n            };\n        },\n        saveEdit: function() {\n            if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                return\n            };\n            j.loadModules([\"PhotoInlineEditor\",\"Form\",], function(hb, ib) {\n                var jb = hb.getInstance(this.getViewerConst());\n                (jb && ib.bootstrap(jb.getForm().controller));\n            }.bind(this));\n        },\n        mouseLeaveListener: function(event) {\n            this.unhiliteAllTags();\n            this.reHilitePendingTag();\n        },\n        hilitePagerOnMouseMove: function(event) {\n            var hb = na.getEventPosition(event), ib = na.getElementPosition(this.stage);\n            if (x.isRTL()) {\n                var jb = na.getElementDimensions(this.stage);\n                this.stagePagerPrev = ((jb.x - ((hb.x - ib.x))) < gb.GOPREV_AREA);\n            }\n             else this.stagePagerPrev = ((hb.x - ib.x) < gb.GOPREV_AREA);\n        ;\n            m.conditionClass(this.prevPager, \"hilightPager\", this.stagePagerPrev);\n            m.conditionClass(this.nextPager, \"hilightPager\", !this.stagePagerPrev);\n            var kb, lb = event.getTarget();\n            if (((!z.byClass(lb, \"snowliftOverlay\") && !z.byClass(lb, \"bottomBarActions\")) && !z.byClass(lb, \"snowliftPager\"))) {\n                kb = gb.PAGER_FADE;\n            };\n            this.showPagers(kb);\n        },\n        showPagers: function(hb) {\n            clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"active\");\n            if ((typeof hb !== \"undefined\")) {\n                this.fadePagerTimer = this.hidePagers.bind(this).defer(hb);\n            };\n        },\n        hidePagers: function() {\n            var hb = o.scry(this.getRoot(), \".fbPhotosPhotoActionsMenu\")[0];\n            if (hb) {\n                return\n            };\n            clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"inactive\");\n        },\n        getTagger: function() {\n            if (!this.PhotoTagger) {\n                return null\n            };\n            var hb = this.PhotoTagger.getInstance(aa.VIEWER_SNOWLIFT);\n            if ((!hb || !hb.tagHoverFacebox)) {\n                return null\n            };\n            return hb;\n        },\n        hiliteAllBoxes: function() {\n            o.scry(this.stage, \"div.tagsWrapper div.faceBox\").forEach(function(hb) {\n                m.addClass(hb, \"otherActive\");\n            });\n        },\n        flashAllTags: function() {\n            var hb = this.stream.getCurrentImageData().info.fbid;\n            if (this.sessionPhotosHilited[hb]) {\n                return\n            };\n            o.scry(this.stage, \"div.tagsWrapper div.tagBox\").forEach(function(ib) {\n                m.addClass(ib, \"hover\");\n            });\n            this.sessionPhotosHilited[hb] = true;\n            this.unhiliteTimer = this.unhiliteAllTags.bind(this).defer(2000, true);\n        },\n        unhiliteAllTags: function() {\n            clearTimeout(this.unhiliteTimer);\n            o.scry(this.stage, \"div.tagsWrapper div.hover\").forEach(function(ib) {\n                m.removeClass(ib, \"hover\");\n            });\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                o.scry(this.stage, \"div.tagsWrapper div.otherActive\").forEach(function(ib) {\n                    m.removeClass(ib, \"otherActive\");\n                });\n            };\n            this.hilitedTag = null;\n            if (!m.hasClass(this.root, \"taggingMode\")) {\n                var hb = this.getTagger();\n                if (hb) {\n                    hb.hideTagger();\n                    hb.setCurrentFacebox(null);\n                }\n            ;\n            }\n        ;\n        },\n        switchHilitedTags: function(hb, ib) {\n            if ((this.switchTimer !== null)) {\n                clearTimeout(this.switchTimer);\n                this.switchTimer = null;\n            }\n        ;\n            this.unhiliteAllTags();\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                this.hiliteAllBoxes();\n            };\n            var jb = va(hb);\n            if (jb) {\n                this.hilitedTag = hb;\n                if ((!m.hasClass(this.root, \"taggingMode\") && ea.isFacebox(this.hilitedTag))) {\n                    var kb = this.getTagger();\n                    if (kb) {\n                        m.addClass(jb, \"hover\");\n                        var lb = kb.getFacebox(hb);\n                        kb.setCurrentFacebox(lb);\n                        if (lb) {\n                            kb.addTagFromFacebox(lb);\n                        };\n                    }\n                ;\n                }\n                 else m.addClass(jb, \"hover\");\n            ;\n                if (((m.hasClass(jb, \"tagBoxPending\") && !m.hasClass(jb, \"showPendingTagName\")) && (ib === true))) {\n                    o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\").forEach(function(mb) {\n                        m.removeClass(mb, \"showPendingTagName\");\n                    });\n                    m.addClass(jb, \"showPendingTagName\");\n                }\n            ;\n            }\n        ;\n        },\n        reHilitePendingTag: function() {\n            var hb = va(this.hilitedTag);\n            if ((hb && m.hasClass(hb, \"showPendingTagName\"))) {\n                return\n            };\n            var ib = o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\")[0];\n            if (ib) {\n                this.switchHilitedTags(ib.id);\n            };\n        },\n        hiliteTagsOnMouseMove: function(event) {\n            if ((!this.stream.getCurrentExtraData() || this.getVideoOnStage())) {\n                return\n            };\n            if ((this.switchTimer !== null)) {\n                return\n            };\n            var hb = event.getTarget();\n            if (((((((z.byClass(hb, \"snowliftOverlay\") || z.byClass(hb, \"fbPhotoSnowliftTagApproval\")) || z.byClass(hb, \"tagPointer\")) || z.byClass(hb, \"arrow\")) || z.byClass(hb, \"faceboxSuggestion\")) || z.byClass(hb, \"typeaheadWrapper\")) || z.byClass(hb, \"photoTagTypeahead\"))) {\n                return\n            };\n            var ib = z.byClass(hb, \"tagBoxPending\"), jb = false;\n            if (this.hilitedTag) {\n                var kb = va(this.hilitedTag);\n                jb = (kb && m.hasClass(kb, \"tagBoxPending\"));\n            }\n        ;\n            var lb = ((((!this.hilitedTag && ib)) || ((!jb && ib))));\n            if (lb) {\n                this.switchHilitedTags(ib.id);\n                return;\n            }\n        ;\n            if ((ib && ((ib.id == this.hilitedTag)))) {\n                return\n            };\n            var mb = 250, nb = ea.absoluteToNormalizedPosition(this.image, na.getEventPosition(event));\n            if (this.currentTagHasPrecedence(nb)) {\n                return\n            };\n            var ob = ea.getNearestBox(this.stream.getCurrentExtraData().tagRects, nb);\n            if (!ob) {\n                if (!jb) {\n                    this.unhiliteAllTags();\n                    this.reHilitePendingTag();\n                }\n            ;\n                return;\n            }\n        ;\n            var pb = null;\n            if (jb) {\n                var qb = {\n                };\n                qb[this.hilitedTag] = this.stream.getCurrentExtraData().tagRects[this.hilitedTag];\n                pb = ea.getNearestBox(qb, nb);\n            }\n        ;\n            if (((pb !== null) && jb)) {\n                return\n            };\n            if ((this.hilitedTag != ob)) {\n                if (jb) {\n                    this.switchTimer = this.switchHilitedTags.bind(this, ob).defer(mb);\n                }\n                 else {\n                    if (this.showHover) {\n                        if (!this.seenTags) {\n                            this.seenTags = [];\n                        };\n                        if (!this.seenTags[ob]) {\n                            ba.addFaceTagImpression();\n                            this.seenTags[ob] = true;\n                        }\n                    ;\n                    }\n                ;\n                    this.switchHilitedTags(ob);\n                }\n            \n            };\n        },\n        currentTagHasPrecedence: function(hb) {\n            if (!this.hilitedTag) {\n                return false\n            };\n            if ((this.stream.getCurrentExtraData().tagRects[this.hilitedTag] === undefined)) {\n                this.hilitedTag = null;\n                return false;\n            }\n        ;\n            var ib = this.stream.getCurrentExtraData().tagRects[this.hilitedTag], jb = new ga((ib.t + ((ib.h() / 2))), ib.r, (ib.b + ((ea.isFacebox(this.hilitedTag) ? 10 : 0))), ib.l, ib.domain);\n            return jb.contains(hb);\n        },\n        getVideoOnStage: function() {\n            var hb = (this.stream && this.stream.getCurrentImageData());\n            return (hb && hb.video);\n        },\n        shouldPageOnAction: function(hb, ib) {\n            if ((!this.isOpen || this.isShowingLikePhotoConfirmation)) {\n                return false\n            };\n            var jb = (o.isNode(ib) && (((z.byClass(ib, \"snowliftPager\") || z.byClass(ib, \"stagePagers\")) || z.byClass(ib, \"pivotPageColumn\")))), kb = (o.isNode(ib) && z.byClass(ib, \"stage\")), lb = m.hasClass(ib, \"faceBox\"), mb = ((((((((kb && m.hasClass(this.root, \"taggingMode\"))) || z.byClass(ib, \"tagBoxPending\")) || z.byClass(ib, \"tagBoxPendingResponse\")) || z.byClass(ib, \"fbPhotoTagApprovalBox\")) || z.byClass(ib, \"tag\")) || ((this.cropper && this.cropper.croppingMode))));\n            if (mb) {\n                return false\n            };\n            return (((((((hb == u.LEFT) || (hb == u.RIGHT)) || (hb == cb)) || (hb == db)) || ((!m.hasClass(this.root, \"taggingMode\") && lb))) || jb) || kb);\n        },\n        keyHandler: function(hb, event) {\n            if ((event.getModifiers().any || (v.getTopmostLayer() !== this.spotlight))) {\n                return true\n            };\n            switch (q.getKeyCode(event)) {\n              case u.LEFT:\n            \n              case u.RIGHT:\n            \n              case cb:\n            \n              case db:\n                if (!this.pagersOnKeyboardNav) {\n                    this.showPagers(gb.PAGER_FADE);\n                };\n                this.pageListener(event);\n                return false;\n              case eb:\n                return this.toggleFullScreen();\n              case fb:\n                return this.likePhotoWithKey();\n            };\n        },\n        shouldHandlePendingTag: function(event) {\n            var hb = this.getTagger();\n            if (!hb.tags.length) {\n                return false\n            };\n            var ib = ea.absoluteToNormalizedPosition(this.getImage(), na.getEventPosition(event)), jb = hb.findNearestTag(ib);\n            if ((!jb || !m.hasClass(jb.node, \"tagBoxPending\"))) {\n                return false\n            };\n            g.inform(\"PhotoTagApproval.PENDING_TAG_PHOTO_CLICK\", {\n                id: jb.id,\n                version: this.getVersionConst()\n            });\n            return true;\n        },\n        pageListener: function(event) {\n            var hb = q.getKeyCode(event), ib = event.getTarget();\n            if (!this.shouldPageOnAction(hb, ib)) {\n                return\n            };\n            if (this.shouldHandlePendingTag(event)) {\n                return\n            };\n            var jb = 0;\n            if (((hb == u.RIGHT) || (hb == db))) {\n                jb = 1;\n                ba.setPagingAction(\"key_right\");\n            }\n             else if (((hb == u.LEFT) || (hb == cb))) {\n                jb = -1;\n                ba.setPagingAction(\"key_left\");\n            }\n             else if (z.byClass(ib, \"next\")) {\n                jb = 1;\n                ba.setPagingAction(\"click_next\");\n            }\n             else if (z.byClass(ib, \"prev\")) {\n                jb = -1;\n                ba.setPagingAction(\"click_prev\");\n            }\n             else if (!this.stagePagerPrev) {\n                jb = 1;\n                ba.setPagingAction(\"click_stage\");\n            }\n             else {\n                jb = -1;\n                ba.setPagingAction(\"click_stage_back\");\n            }\n            \n            \n            \n            \n        ;\n            var kb = o.scry(this.ufiForm, \"input.mentionsHidden\"), lb = false;\n            for (var mb = 0; (mb < kb.length); mb++) {\n                if (!s.isEmpty(kb[mb])) {\n                    lb = true;\n                    break;\n                }\n            ;\n            };\n            if (((lb || m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) || ((this.cropper && this.cropper.croppingMode)))) {\n                this.warnLeavePage(jb);\n            }\n             else {\n                this.page(jb, (ma.chrome() && r.isFullScreen()));\n                ab(\"snowlift\", ib, event).uai(ba.pagingAction);\n            }\n        ;\n        },\n        warnLeavePage: function(hb) {\n            new n().setTitle(\"Are you sure you want to leave this page?\").setBody(\"You have unsaved changes that will be lost if you leave the page.\").setButtons([{\n                name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: this.page.bind(this, hb)\n            },{\n                name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        getUsesOpaqueCursor: function() {\n            return this.stream.getUsesOpaqueCursor();\n        },\n        getOpaqueCursor: function(hb) {\n            return this.stream.getOpaqueCursor(hb);\n        },\n        setReachedLeftEnd: function() {\n            this.stream.setReachedLeftEnd();\n        },\n        setReachedRightEnd: function() {\n            this.stream.setReachedRightEnd();\n        },\n        page: function(hb, ib) {\n            if ((!this.stream.isValidMovement(hb) || !this.stream.nonCircularPhotoSetCanPage(hb))) {\n                this.showPagers(gb.PAGER_FADE);\n                return;\n            }\n        ;\n            this.lastPage = Date.now();\n            this.unhiliteAllTags();\n            this.seenTags = [];\n            var jb = this.getVideoOnStage();\n            if (jb) {\n                this.switchVideo(jb, false);\n            };\n            if ((this.pivots && this.pivots.page(hb))) {\n                return\n            };\n            g.inform(\"PhotoSnowlift.PAGE\");\n            ja.hide();\n            this.recacheData();\n            this.stream.moveCursor(hb);\n            m.hide(this.image);\n            if (this.stream.errorInCurrent()) {\n                this.setLoadingState(gb.STATE_HTML, true);\n                m.show(this.errorBox);\n                return;\n            }\n        ;\n            var kb = this.stream.getCurrentImageData();\n            if (kb) {\n                var lb = this.getImageURL(kb);\n                if (lb) {\n                    this.switchImage(lb, null, true);\n                }\n                 else if (kb.video) {\n                    this.switchVideo(kb.video, true);\n                }\n            ;\n                if (!ib) {\n                    this.replaceUrl = true;\n                    wa(kb.info.permalink);\n                }\n            ;\n                this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n            }\n             else {\n                this.setLoadingState(gb.STATE_IMAGE_PIXELS, true);\n                this.setLoadingState(gb.STATE_IMAGE_DATA, true);\n            }\n        ;\n            if (this.stream.getCurrentHtml()) {\n                this.swapData();\n            }\n             else this.setLoadingState(gb.STATE_HTML, true);\n        ;\n            this.disableAds = this.disableAdsForSession;\n            this.loadAds();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            };\n            this.setLeftAndRightPagersState();\n        },\n        logImpressionDetailsForPhoto: function() {\n            var hb = [].concat(o.scry(oa(\"fbPhotoSnowliftTagList\"), \"input.photoImpressionDetails\"), o.scry(oa(\"fbPhotoSnowliftFeedback\"), \"input.photoImpressionDetails\"));\n            if ((hb.length === 0)) {\n                return\n            };\n            var ib = {\n            };\n            for (var jb = 0; (jb < hb.length); jb++) {\n                ib[hb[jb].name] = hb[jb].value;;\n            };\n            if (this.getVideoOnStage()) {\n                ib.width = 0;\n                ib.height = 0;\n            }\n             else {\n                var kb = this.getImageDimensions(this.stream.getCurrentImageData());\n                ib.width = kb.x;\n                ib.height = kb.y;\n            }\n        ;\n            ba.addDetailData(this.stream.getCursor(), ib);\n            ca.setIsLogAdData(true);\n        },\n        loadAds: function() {\n            if (this.disableAds) {\n                return\n            };\n            ca.loadAdsFromUserActivity();\n        },\n        transitionHandler: function(hb) {\n            if ((((hb.getQueryData().closeTheater || hb.getQueryData().permPage) || hb.getQueryData().makeprofile) || this.returningToStart)) {\n                if (this.isOpen) {\n                    this.close();\n                };\n                this.transitionHandlerRegistered = false;\n                return false;\n            }\n        ;\n            if (this.replaceUrl) {\n                this.replaceUrl = false;\n                this._uriStack.push(hb.getQualifiedURI().toString());\n                y.transitionComplete(true);\n                return true;\n            }\n        ;\n            var ib = this._uriStack.length;\n            if (((ib >= 2) && (this._uriStack[(ib - 2)] == hb.getQualifiedURI().toString()))) {\n                this._uriStack.pop();\n            };\n            var jb = this.stream.getCursorForURI(hb.getUnqualifiedURI().toString());\n            if (jb) {\n                var kb = this.stream.getRelativeMovement(jb);\n                this.page(kb, true);\n                y.transitionComplete(false);\n                return true;\n            }\n        ;\n            if (this.isOpen) {\n                y.transitionComplete(true);\n                this.close();\n                return true;\n            }\n        ;\n            this.transitionHandlerRegistered = false;\n            return false;\n        },\n        recacheData: function() {\n            if (!this.loadingStates.html) {\n                var hb = this.stream.getCurrentHtml();\n                for (var ib in hb) {\n                    hb[ib] = sa(oa(ib).childNodes);\n                    o.empty(oa(ib));\n                };\n            }\n        ;\n        },\n        reloadIfTimeout: function() {\n            if (!t.hasLoaded(this.image)) {\n                var hb = this.makeNewImage(this.image.src, true);\n                q.listen(hb, \"load\", this.useImage.bind(this, hb, null, true));\n            }\n        ;\n        },\n        useImage: function(hb, ib, jb) {\n            if ((jb && t.hasLoaded(this.image))) {\n                return\n            };\n            o.replace(this.image, hb);\n            this.image = hb;\n            g.inform(\"Amoeba/instrument\", [this.image,\"image\",], g.BEHAVIOR_PERSISTENT);\n            this.adjustStageSize(ib);\n        },\n        makeNewImage: function(hb, ib) {\n            if (this.imageLoadingTimer) {\n                clearTimeout(this.imageLoadingTimer);\n                this.imageLoadingTimer = null;\n            }\n             else if (!ib) {\n                this.imageRefreshTimer = setTimeout(this.reloadIfTimeout.bind(this), gb.LOADING_TIMEOUT);\n            }\n        ;\n            var jb = o.create(\"img\", {\n                className: \"spotlight\",\n                alt: \"\"\n            });\n            jb.setAttribute(\"aria-describedby\", \"fbPhotosSnowliftCaption\");\n            jb.setAttribute(\"aria-busy\", \"true\");\n            q.listen(jb, \"load\", pa(function() {\n                clearTimeout(this.imageRefreshTimer);\n                this.image.setAttribute(\"aria-busy\", \"false\");\n                this.setLoadingState(this.STATE_IMAGE_PIXELS, false);\n                (function() {\n                    if (this.isOpen) {\n                        this.adjustStageSize();\n                        this.adjustForNewData();\n                    }\n                ;\n                }).bind(this).defer();\n            }.bind(this), \"photo_theater\"));\n            jb.src = hb;\n            return jb;\n        },\n        switchImage: function(hb, ib, jb) {\n            m.hide(this.image);\n            m.hide(this.errorBox);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            var kb = (this.stream && this.stream.getCurrentImageData());\n            if (kb) {\n                ba.addPhotoView(kb.info, this.shouldShowHiRes(kb), (this.fullscreen && r.isFullScreen()));\n            };\n            this.useImage(this.makeNewImage(hb, false), ib, false);\n            if (jb) {\n                this.stream.preloadImages(this.shouldShowHiRes(kb));\n            };\n            if ((this.cropper && this.cropper.croppingMode)) {\n                this.cropper.resetPhoto();\n            };\n            g.inform(\"PhotoSnowlift.SWITCH_IMAGE\");\n        },\n        switchVideo: function(hb, ib) {\n            var jb = (\"swf_\" + hb);\n            if (ib) {\n                m.addClass(this.stageWrapper, \"showVideo\");\n                var kb = o.create(\"div\", {\n                    className: \"videoStageContainer\"\n                });\n                o.appendContent(this.videoStage, kb);\n                kb.id = hb;\n                if ((window[jb] && !va(jb))) {\n                    window[jb].write(hb);\n                };\n                var lb = (\"video_warning_\" + hb), mb = va(hb);\n                if (!this.videoWarnings) {\n                    this.videoWarnings = [];\n                };\n                if ((mb && this.videoWarnings[lb])) {\n                    o.setContent(mb, this.videoWarnings[lb]);\n                };\n                this.adjustStageSizeForVideo.bind(this, jb).defer();\n            }\n             else {\n                (window[jb] && window[jb].addVariable(\"video_autoplay\", 0));\n                (this.videoLoadTimer && clearTimeout(this.videoLoadTimer));\n                o.empty(this.videoStage);\n                m.removeClass(this.stageWrapper, \"showVideo\");\n            }\n        ;\n        },\n        checkVideoStatus: function(hb) {\n            if (this.videoLoadTimer) {\n                clearTimeout(this.videoLoadTimer);\n            };\n            var ib = this.getVideoOnStage();\n            if (!ib) {\n                return;\n            }\n             else {\n                var jb = (\"swf_\" + ib);\n                if ((hb !== jb)) {\n                    return\n                };\n                this.adjustStageSizeForVideo(hb);\n            }\n        ;\n        },\n        adjustStageSizeForVideo: function(hb) {\n            var ib = va(hb);\n            if (!ib) {\n                this.videoLoadTimer = setTimeout(this.checkVideoStatus.bind(this, hb), 200);\n            }\n             else this.adjustStageSize(new na(ib.width, ib.height));\n        ;\n        },\n        handleServerError: function(hb, ib) {\n            o.setContent(this.errorBox, hb);\n            this.storeFromData(ib);\n        },\n        swapData: function() {\n            var hb, ib = this.stream.getCurrentHtml();\n            if (ib) {\n                this.setLoadingState(gb.STATE_HTML, false);\n                for (var jb in ib) {\n                    hb = va(jb);\n                    (hb && o.setContent(hb, ib[jb]));\n                };\n                g.inform(\"PhotoSnowlift.DATA_CHANGE\", this.stream.getCurrentImageData().info, g.BEHAVIOR_STATE);\n                if (this.stream.getCurrentExtraData()) {\n                    g.inform(\"PhotoSnowlift.EXTRA_DATA_CHANGE\", this.stream.getCurrentExtraData(), g.BEHAVIOR_STATE);\n                };\n            }\n        ;\n            this.adjustScroller();\n            this.adjustStageSize();\n            this.scrollableArea.showScrollbar(false);\n            this.adjustForNewData();\n            this.logImpressionDetailsForPhoto();\n            if (this.showFlashTags) {\n                this.flashAllTags();\n            };\n        },\n        updateTotalCount: function(hb, ib, jb) {\n            var kb = this.stream.getCurrentHtml();\n            if (kb) {\n                var lb = oa(\"fbPhotoSnowliftPositionAndCount\");\n                o.replace(lb, jb);\n                lb = jb;\n                m.show(lb);\n                var mb = \"fbPhotoSnowliftPositionAndCount\";\n                kb[mb] = sa(lb.childNodes);\n            }\n        ;\n            this.stream.setTotalCount(hb);\n            this.stream.setFirstCursorIndex(ib);\n        },\n        addPhotoFbids: function(hb, ib, jb, kb) {\n            if (((kb && this.sessionID) && (kb != this.sessionID))) {\n                return\n            };\n            var lb = (this.stream.getCursor() === null);\n            this.stream.attachToFbidsList(hb, ib, jb);\n            if ((jb && lb)) {\n                this.page(0, true);\n            };\n            if ((this.pivots && jb)) {\n                this.pivots.setCycleCount(this.stream.calculateDistance(this.stream.getCursor(), this.stream.firstCursor));\n            };\n            if ((!this.pagersShown && this.stream.canPage())) {\n                this.setStagePagersState(\"ready\");\n            };\n            this.setLeftAndRightPagersState();\n        },\n        attachTagger: function(hb) {\n            o.appendContent(this.stageActions, hb);\n        },\n        storeFromData: function(hb) {\n            if (!this.isOpen) {\n                return\n            };\n            if (((hb.ssid && this.sessionID) && (this.sessionID != hb.ssid))) {\n                return\n            };\n            var ib = this.stream.storeToCache(hb);\n            if ((\"error\" in ib)) {\n                this.checkState(gb.STATE_ERROR);\n                return;\n            }\n        ;\n            if ((\"init\" in ib)) {\n                this.initDataFetched(ib.init);\n                if (this.openExplicitly) {\n                    this.replaceUrl = true;\n                    wa(this.stream.getCurrentImageData().info.permalink);\n                }\n            ;\n                if (this.stream.canPage()) {\n                    this.setStagePagersState(\"ready\");\n                };\n                this.setLeftAndRightPagersState();\n                (this.ua && this.ua.add_event(\"ufi\"));\n            }\n        ;\n            if ((\"image\" in ib)) {\n                this.checkState(gb.STATE_IMAGE_DATA);\n            };\n            if ((\"data\" in ib)) {\n                this.checkState(gb.STATE_HTML);\n            };\n        },\n        setLeftAndRightPagersState: function() {\n            if (this.stream.isNonCircularPhotoSet()) {\n                m.conditionClass(this.root, \"disableLeft\", !this.stream.nonCircularPhotoSetCanPage(-1));\n                m.conditionClass(this.root, \"disableRight\", !this.stream.nonCircularPhotoSetCanPage(1));\n            }\n        ;\n        },\n        setStagePagersState: function(hb) {\n            switch (hb) {\n              case \"ready\":\n                m.addClass(this.root, \"pagingReady\");\n                this.pagersShown = true;\n                (this.ua && this.ua.add_event(\"arrows\"));\n                return;\n              case \"active\":\n                m.addClass(this.root, \"pagingActivated\");\n                return;\n              case \"inactive\":\n                m.removeClass(this.root, \"pagingActivated\");\n                return;\n              case \"disabled\":\n            \n              case \"reset\":\n                m.removeClass(this.root, \"pagingReady\");\n                return;\n            };\n        },\n        deletePhoto: function(hb) {\n            this.closeRefresh();\n        },\n        closeRefresh: function() {\n            this.refreshOnClose = true;\n            this.closeHandler();\n        },\n        onHiliteTag: function(hb, ib) {\n            if ((ib.version != aa.VIEWER_SNOWLIFT)) {\n                return\n            };\n            var jb = ib.tag;\n            if (jb) {\n                this.switchHilitedTags(jb, true);\n            };\n        },\n        onUpdateTagBox: function(hb, ib) {\n            if ((ib.version == aa.VIEWER_SNOWLIFT)) {\n                this.updateTagBox(ib.id, ib.approve);\n            };\n        }\n    });\n    e.exports = gb;\n});\n__d(\"Spotlight\", [\"JSXDOM\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"DOM\",\"Layer\",\"LayerAutoFocus\",\"LayerTabIsolation\",\"ModalLayer\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"DOM\"), l = b(\"Layer\"), m = b(\"LayerAutoFocus\"), n = b(\"LayerTabIsolation\"), o = b(\"ModalLayer\"), p = b(\"Vector\"), q = b(\"copyProperties\"), r = b(\"csx\"), s = b(\"cx\");\n    function t(v, w) {\n        this.parent.construct(this, v, w);\n        this.stageMinSize = new p(0, 0);\n        this.stagePadding = new p(0, 0);\n    };\n    j.extend(t, l);\n    q(t.prototype, i, {\n        stageMinSize: null,\n        stagePadding: null,\n        _buildWrapper: function(v, w) {\n            return (g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__root -cx-PRIVATE-ModalLayer__dark\"\n            }, g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__container\"\n            }, w)));\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([u,m,n,o,]);\n        },\n        getContentRoot: function() {\n            if (!this._content) {\n                this._content = k.find(this.getRoot(), \"div.-cx-PRIVATE-uiSpotlight__content\");\n            };\n            return this._content;\n        },\n        configure: function(v) {\n            if (v.stageMinSize) {\n                this.stageMinSize = v.stageMinSize;\n            };\n            if (v.stagePadding) {\n                this.stagePadding = v.stagePadding;\n            };\n        },\n        onContentLoaded: function() {\n            this.inform(\"content-load\");\n        },\n        updatePermalink: function(v) {\n            this.inform(\"permalinkchange\", v);\n        }\n    });\n    function u(v) {\n        this._layer = v;\n    };\n    q(u.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(v, w) {\n                if ((v === \"show\")) {\n                    h.inform(\"layer_shown\", {\n                        type: \"Spotlight\"\n                    });\n                }\n                 else h.inform(\"layer_hidden\", {\n                    type: \"Spotlight\"\n                });\n            ;\n            });\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        }\n    });\n    e.exports = t;\n});");
// 12987
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s96db0ff9943622b0163880becbaeeb6725dde055");
// 12991
o62.style = o176;
// undefined
o62 = null;
// undefined
o176 = null;
// 12988
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"e0RyX\",]);\n}\n;\n;\n__d(\"PhotoSnowliftAds\", [\"JSBNG__Event\",\"copyProperties\",\"JSBNG__CSS\",\"csx\",\"DataStore\",\"DOM\",\"PhotoSessionLog\",\"UIPagelet\",\"URI\",\"Vector\",\"extendArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"JSBNG__CSS\"), j = b(\"csx\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"PhotoSessionLog\"), n = b(\"UIPagelet\"), o = b(\"URI\"), p = b(\"Vector\"), q = b(\"extendArray\"), r = {\n        DEFAULT_UNITS_REFRESH_RATE: 30000,\n        UNITS_REGISTER_DELAY: 1000,\n        root: null,\n        availableDimensions: null,\n        loadQuery: null,\n        lastLoadTime: 0,\n        minAds: 100,\n        units: null,\n        isLogAdData: null,\n        displayedCallback: null,\n        refreshUnitsRate: null,\n        position: null,\n        adsStatus: \"null\",\n        adsEvents: {\n        },\n        snowliftRedesign: false,\n        resetEvents: function() {\n            this.adsStatus = \"reset\";\n            this.adsEvents = {\n            };\n        },\n        addEvent: function(s, t) {\n            if (t) {\n                this.adsStatus = s;\n            }\n        ;\n        ;\n            var u = JSBNG__Date.now();\n            this.adsEvents[((((s + \"_\")) + u))] = u;\n        },\n        init: function(s, t, u, v) {\n            this.reset();\n            this.root = s;\n            this.snowlift = t;\n            this.minAds = u.min_ads;\n            this.displayedCallback = v;\n            this.addEvent(\"init\", true);\n            this.snowliftRedesign = u.snowlift_redesign;\n            this.refreshUnitsRate = r.DEFAULT_UNITS_REFRESH_RATE;\n            if (u.refresh_fast) {\n                this.refreshUnitsRate = u.refresh_rate;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            this.lastLoadTime = 0;\n            this.position = 0;\n            this.units = [];\n            this.resetEvents();\n            this.addEvent(\"reset\", true);\n        },\n        resize: function(s) {\n            this.availableDimensions = s;\n            this.loadQuery = this.snowlift.getLoadQuery();\n            this.processResize();\n        },\n        calculateUnitSizes: function(s, t, u) {\n            var v = {\n            };\n            s.forEach(function(w) {\n                var x = w.root.firstChild.offsetHeight;\n                w.units.forEach(function(z) {\n                    if (((!i.hasClass(z, \"hidden\") && !this.getIsHoldout(z)))) {\n                        var aa = this.getHeight(z.firstChild, t);\n                        x -= aa;\n                    }\n                ;\n                ;\n                }.bind(this));\n                var y = {\n                    height: x,\n                    visible: false\n                };\n                w.units.forEach(function(z) {\n                    var aa = this.getIsAds(z), ba = this.getHeight(z.firstChild, t), ca = this.getUnitId(z), da = this.getIsHoldout(z);\n                    if (((da && u))) {\n                        return;\n                    }\n                ;\n                ;\n                    v[ca] = {\n                        height: ba,\n                        visible: false,\n                        priority: 0,\n                        is_ads: aa,\n                        is_holdout: da,\n                        section_ref: y\n                    };\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        calculateVisibleUnits: function(s, t, u) {\n            var v = 0, w = this.getUnitPriority(t);\n            w.forEach(function(x) {\n                if (t.hasOwnProperty(x)) {\n                    var y = t[x], z = y.height;\n                    if (!y.section_ref.visible) {\n                        z += y.section_ref.height;\n                    }\n                ;\n                ;\n                    y.height_below = ((u - z));\n                    y.visible = ((((y.height_below >= 0)) && ((z > 0))));\n                    if (y.visible) {\n                        y.section_ref.visible = true;\n                        u -= z;\n                        v++;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            return t;\n        },\n        displayUnits: function(s, t) {\n            s.forEach(function(u) {\n                var v = false, w = true;\n                u.units.forEach(function(x) {\n                    var y = this.getUnitId(x), z = t[y];\n                    if (!z) {\n                        return;\n                    }\n                ;\n                ;\n                    var aa = z.visible, ba = z.height_below, ca = z.is_ads;\n                    i.conditionClass(x, \"hidden\", !aa);\n                    if (((((ca && aa)) && w))) {\n                        var da = l.JSBNG__find(x, \"div.ego_unit\");\n                        i.addClass(da, \"ego_unit_no_top_border\");\n                        w = false;\n                    }\n                ;\n                ;\n                    v = ((v || aa));\n                    this.calcUnitStats(this.units[ca][y], aa, ba);\n                }.bind(this));\n                i.conditionClass(u.root, \"hidden\", !v);\n            }.bind(this));\n        },\n        getUnitsDisplayed: function(s, t) {\n            var u = 0;\n            s.forEach(function(v) {\n                v.units.forEach(function(w) {\n                    var x = this.getUnitId(w), y = t[x];\n                    if (((!y || !y.visible))) {\n                        return;\n                    }\n                ;\n                ;\n                    u++;\n                }.bind(this));\n            }.bind(this));\n            return u;\n        },\n        getHeightsRequired: function(s, t) {\n            var u = 0, v = [];\n            s.forEach(function(w) {\n                var x = false;\n                w.units.forEach(function(y) {\n                    var z = this.getUnitId(y), aa = t[z];\n                    if (!aa) {\n                        return;\n                    }\n                ;\n                ;\n                    u += aa.height;\n                    if (!x) {\n                        u += aa.section_ref.height;\n                        x = true;\n                    }\n                ;\n                ;\n                    v.push(u);\n                }.bind(this));\n            }.bind(this));\n            return v;\n        },\n        getUnitPriority: function(s) {\n            var t = [], u = 0, v = 0;\n            {\n                var fin240keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin240i = (0);\n                var w;\n                for (; (fin240i < fin240keys.length); (fin240i++)) {\n                    ((w) = (fin240keys[fin240i]));\n                    {\n                        var x = s[w];\n                        t.push(w);\n                        var y = ((((this.minAds + u)) + v));\n                        if (x.is_ads) {\n                            if (((v < this.minAds))) {\n                                y = v;\n                            }\n                        ;\n                        ;\n                            v++;\n                        }\n                         else u++;\n                    ;\n                    ;\n                        x.priority = y;\n                    };\n                };\n            };\n        ;\n            t = t.sort(function(z, aa) {\n                var ba = s[z], ca = s[aa];\n                return ((ba.priority - ca.priority));\n            }.bind(this));\n            return t;\n        },\n        updateUnitsStatus: function() {\n            var s = this.availableDimensions.x, t = this.availableDimensions.y, u = this.calculateUnitSizes(this.sections, s);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            {\n                var fin241keys = ((window.top.JSBNG_Replay.forInKeys)((u))), fin241i = (0);\n                var v;\n                for (; (fin241i < fin241keys.length); (fin241i++)) {\n                    ((v) = (fin241keys[fin241i]));\n                    {\n                        if (!u.hasOwnProperty(v)) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var w = u[v];\n                        if (((!w.is_holdout || !w.visible))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var x = this.units[1][v];\n                        this.calcUnitStats(x, w.visible, w.height_below);\n                    };\n                };\n            };\n        ;\n            u = this.calculateUnitSizes(this.sections, s, true);\n            u = this.calculateVisibleUnits(this.sections, u, t);\n            this.displayUnits(this.sections, u);\n            if (this.displayedCallback) {\n                var y = this.getUnitsDisplayed(this.sections, u), z = this.getHeightsRequired(this.sections, u);\n                this.displayedCallback(y, z);\n            }\n        ;\n        ;\n        },\n        calcUnitStats: function(s, t, u) {\n            var v = JSBNG__Date.now();\n            if (s.visible) {\n                s.totalTime += ((v - s.lastShowTime));\n            }\n        ;\n        ;\n            if (((((s.trackingCode !== null)) && ((s.totalTime >= this.UNITS_REGISTER_DELAY))))) {\n                var w = s.trackingCode;\n                s.trackingCode = null;\n                this.registerImpression(w, s.registerUrl);\n            }\n        ;\n        ;\n            s.visible = t;\n            s.heightBelow = u;\n            s.lastShowTime = v;\n        },\n        prepareResize: function() {\n            var s = function(t) {\n                var u = l.create(\"div\", {\n                    className: \"JSBNG__inner\"\n                }), v = l.create(\"div\", {\n                    className: \"wrapper\"\n                }, u);\n                l.replace(t, v);\n                l.setContent(u, t);\n                return v;\n            };\n            this.sections = l.scry(this.root, \"div.ego_section\").map(function(t) {\n                return {\n                    root: s(t),\n                    units: l.scry(t, \"div.ego_unit\").map(s)\n                };\n            });\n        },\n        processResize: function() {\n            if (((((this.isLoading || ((this.lastLoadTime === 0)))) || ((this.availableDimensions === null))))) {\n                this.setLogData();\n                return;\n            }\n        ;\n        ;\n            this.updateUnitsStatus();\n            this.setLogData();\n            var s = this.nextRegisterTime();\n            if (((s !== Infinity))) {\n                this.processResize.bind(this).defer(s, true);\n            }\n        ;\n        ;\n        },\n        setIsLogAdData: function(s) {\n            this.isLogAdData = s;\n            this.addEvent(\"setIsLogAdData\", false);\n            this.setLogData();\n        },\n        setLogData: function() {\n            var s = this.snowlift.getImageId();\n            if (((this.isLogAdData && s))) {\n                var t = p.getElementDimensions(this.snowlift.getImage()), u = p.getElementDimensions(this.snowlift.getRHCHeader()), v = p.getElementDimensions(this.snowlift.getRHCBody()), w = p.getElementDimensions(this.snowlift.getRHCFooter()), x = {\n                    query_set: this.snowlift.getLoadQuery().set,\n                    window_x: window.JSBNG__innerWidth,\n                    window_y: window.JSBNG__innerHeight,\n                    image_x: t.x,\n                    image_y: t.y,\n                    header_x: u.x,\n                    header_y: u.y,\n                    body_x: v.x,\n                    body_y: v.y,\n                    footer_x: w.x,\n                    footer_y: w.y,\n                    ads_below_space: this.getAdsBelowSpace(),\n                    time: JSBNG__Date.now(),\n                    adsStatus: this.adsStatus,\n                    adsEvents: this.adsEvents,\n                    refreshRate: this.refreshUnitsRate,\n                    position: this.position\n                };\n                m.updateAdData(s, x);\n            }\n        ;\n        ;\n        },\n        getAdsBelowSpace: function() {\n            var s = [], t = this.units[1];\n            {\n                var fin242keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin242i = (0);\n                var u;\n                for (; (fin242i < fin242keys.length); (fin242i++)) {\n                    ((u) = (fin242keys[fin242i]));\n                    {\n                        if (((t.hasOwnProperty(u) && !this.getIsHoldout(this.getAdUnit(u))))) {\n                            s.push(t[u].heightBelow);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getIsAds: function(s) {\n            var t = l.scry(s, \"div.-cx-PUBLIC-fbAdUnit__root\");\n            return t.length;\n        },\n        getUnitId: function(s) {\n            if (this.getIsAds(s)) {\n                return this.getAdId(s);\n            }\n             else return this.getEgoId(s)\n        ;\n        },\n        getEgoId: function(s) {\n            var t = l.JSBNG__find(s, \"div.ego_unit\");\n            return t.getAttribute(\"data-ego-fbid\");\n        },\n        getAdData: function(s) {\n            var t = l.JSBNG__find(s, \"div.-cx-PUBLIC-fbAdUnit__root\"), u = t.getAttribute(\"data-ad\");\n            return ((((u && JSON.parse(u))) || {\n            }));\n        },\n        getAdId: function(s) {\n            return this.getAdData(s).adid;\n        },\n        getIsHoldout: function(s) {\n            return ((((s && this.getIsAds(s))) && this.getAdData(s).holdout));\n        },\n        getAdUnit: function(s) {\n            if (!this.sections) {\n                return null;\n            }\n        ;\n        ;\n            var t = [];\n            this.sections.forEach(function(v) {\n                q(t, v.units);\n            });\n            for (var u = 0; ((u < t.length)); u++) {\n                if (((this.getIsAds(t[u]) && ((this.getAdId(t[u]) == s))))) {\n                    return t[u];\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        nextRegisterTime: function() {\n            var s = Infinity, t = h(h({\n            }, this.units[0]), this.units[1]);\n            {\n                var fin243keys = ((window.top.JSBNG_Replay.forInKeys)((t))), fin243i = (0);\n                var u;\n                for (; (fin243i < fin243keys.length); (fin243i++)) {\n                    ((u) = (fin243keys[fin243i]));\n                    {\n                        if (t.hasOwnProperty(u)) {\n                            var v = t[u];\n                            if (((((v.trackingCode !== null)) && v.visible))) {\n                                s = Math.min(s, ((this.UNITS_REGISTER_DELAY - v.totalTime)));\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return s;\n        },\n        getHeight: function(s, t) {\n            var u = k.get(s, \"height\");\n            if (((u && ((u.x === t))))) {\n                return u.y;\n            }\n        ;\n        ;\n            return this.cacheHeight(s, t);\n        },\n        cacheHeight: function(s, t) {\n            var u = {\n                x: t,\n                y: s.offsetHeight\n            };\n            k.set(s, \"height\", u);\n            return u.y;\n        },\n        loadAdsAndEgo: function() {\n            this.resetEvents();\n            this.addEvent(\"adsRequested\", true);\n            this.position++;\n            var s = this.getCursorFBID(this.loadQuery);\n            n.loadFromEndpoint(\"WebEgoPane\", this.root, {\n                pid: 34,\n                data: [this.loadQuery.set,s,this.snowliftRedesign,this.snowlift.getOpaqueCursor(s),]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        getCursorFBID: function(s) {\n            if (((s.v !== undefined))) {\n                return s.v;\n            }\n        ;\n        ;\n            if (((s.fbid !== undefined))) {\n                return s.fbid;\n            }\n        ;\n        ;\n            return \"0\";\n        },\n        unitsLoaded: function(s, t) {\n            var u;\n            if (t) {\n                u = \"/ai.php\";\n                this.addEvent(\"adsLoaded\", true);\n            }\n             else {\n                u = \"/ajax/ei.php\";\n                this.addEvent(\"egoLoaded\", true);\n            }\n        ;\n        ;\n            var v = {\n            };\n            {\n                var fin244keys = ((window.top.JSBNG_Replay.forInKeys)((s))), fin244i = (0);\n                var w;\n                for (; (fin244i < fin244keys.length); (fin244i++)) {\n                    ((w) = (fin244keys[fin244i]));\n                    {\n                        if (s.hasOwnProperty(w)) {\n                            v[w] = {\n                                trackingCode: s[w],\n                                totalTime: 0,\n                                lastShowTime: 0,\n                                heightBelow: -10000,\n                                visible: false,\n                                registerUrl: u\n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.units[t] = v;\n            if (t) {\n                this.waitForImages(this.imagesLoaded.bind(this));\n            }\n        ;\n        ;\n        },\n        imagesLoaded: function() {\n            this.prepareResize();\n            this.addEvent(\"imagesLoaded\", true);\n            this.lastLoadTime = JSBNG__Date.now();\n            this.isLoading = false;\n            this.processResize();\n            i.removeClass(this.root, \"loading\");\n        },\n        loadAdsFromUserActivity: function() {\n            var s = JSBNG__Date.now(), t = this.refreshUnitsRate;\n            if (((!this.isLoading && ((((s - this.lastLoadTime)) > t))))) {\n                i.addClass(this.root, \"loading\");\n                this.isLoading = true;\n                this.loadAdsAndEgo();\n            }\n        ;\n        ;\n        },\n        registerImpression: function(s, t) {\n            var u = l.create(\"div\", {\n                src: o(t).addQueryData({\n                    aed: s\n                }),\n                width: 0,\n                height: 0,\n                frameborder: 0,\n                scrolling: \"no\",\n                className: \"fbEmuTracking\"\n            });\n            u.setAttribute(\"aria-hidden\", \"true\");\n            l.appendContent(this.root, u);\n        },\n        waitForImages: function(s) {\n            var t = l.scry(this.root, \"img.img\"), u = t.length, v = u;\n            if (((v === 0))) {\n                s();\n            }\n        ;\n        ;\n            var w = function() {\n                v--;\n                if (((v === 0))) {\n                    s.defer();\n                }\n            ;\n            ;\n            };\n            for (var x = 0; ((x < u)); x++) {\n                var y = t[x];\n                if (y.complete) {\n                    w();\n                }\n                 else g.listen(y, {\n                    load: w,\n                    error: w,\n                    abort: w\n                });\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = r;\n});\n__d(\"PhotoSnowlift\", [\"function-extensions\",\"Arbiter\",\"AsyncDialog\",\"AsyncRequest\",\"Bootloader\",\"Class\",\"collectDataAttributes\",\"JSBNG__CSS\",\"Dialog\",\"DOM\",\"DOMControl\",\"JSBNG__Event\",\"FullScreen\",\"Input\",\"ImageUtils\",\"Keys\",\"Layer\",\"LinkController\",\"Locale\",\"PageTransitions\",\"Parent\",\"PhotosConst\",\"PhotoSessionLog\",\"PhotoSnowliftAds\",\"PhotoStreamCache\",\"PhotosUtils\",\"PhotoViewer\",\"JSBNG__Rect\",\"ScrollableArea\",\"Style\",\"Toggler\",\"UIPagelet\",\"URI\",\"UserAgent\",\"Vector\",\"$\",\"asyncCallback\",\"computeRelativeURI\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"emptyFunction\",\"ge\",\"goURI\",\"shield\",\"startsWith\",\"tx\",\"userAction\",\"Assert\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"AsyncDialog\"), i = b(\"AsyncRequest\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"collectDataAttributes\"), m = b(\"JSBNG__CSS\"), n = b(\"Dialog\"), o = b(\"DOM\"), p = b(\"DOMControl\"), q = b(\"JSBNG__Event\"), r = b(\"FullScreen\"), s = b(\"Input\"), t = b(\"ImageUtils\"), u = b(\"Keys\"), v = b(\"Layer\"), w = b(\"LinkController\"), x = b(\"Locale\"), y = b(\"PageTransitions\"), z = b(\"Parent\"), aa = b(\"PhotosConst\"), ba = b(\"PhotoSessionLog\"), ca = b(\"PhotoSnowliftAds\"), da = b(\"PhotoStreamCache\"), ea = b(\"PhotosUtils\"), fa = b(\"PhotoViewer\"), ga = b(\"JSBNG__Rect\"), ha = b(\"ScrollableArea\"), ia = b(\"Style\"), ja = b(\"Toggler\"), ka = b(\"UIPagelet\"), la = b(\"URI\"), ma = b(\"UserAgent\"), na = b(\"Vector\"), oa = b(\"$\"), pa = b(\"asyncCallback\"), qa = b(\"computeRelativeURI\"), ra = b(\"copyProperties\"), sa = b(\"createArrayFrom\"), ta = b(\"csx\"), ua = b(\"emptyFunction\"), va = b(\"ge\"), wa = b(\"goURI\"), xa = b(\"shield\"), ya = b(\"startsWith\"), za = b(\"tx\"), ab = b(\"userAction\"), bb = b(\"Assert\"), cb = 74, db = 75, eb = 70, fb = 76;\n    function gb() {\n        this.parent.construct(this);\n    };\n;\n    ra(gb, {\n        STATE_ERROR: \"error\",\n        STATE_HTML: \"html\",\n        STATE_IMAGE_PIXELS: \"image_pixels\",\n        STATE_IMAGE_DATA: \"image\",\n        LOADING_TIMEOUT: 2000,\n        PAGER_FADE: 3000,\n        FULL_SCREEN_PADDING: 10,\n        STAGE_HIRES_MAX: {\n            x: 2048,\n            y: 2048\n        },\n        STAGE_NORMAL_MAX: {\n            x: 960,\n            y: 960\n        },\n        STAGE_MIN: {\n            x: 520,\n            y: 520\n        },\n        SIDEBAR_SIZE_MAX: 360,\n        STAGE_CHROME: {\n            x: 82,\n            y: 42\n        },\n        VIDEO_BOTTOM_BAR_SPACE: 40,\n        GOPREV_AREA: 120,\n        TIMELINE_STRETCH_WIDTH: 843,\n        TIMELINE_STRETCH_MIN: 480,\n        MIN_TAG_DISTANCE: 83,\n        PADDING_MIN: 40,\n        MIN_UFI_HEIGHT: 250,\n        COLLECTIONS_UNTAGGED_PHOTOS: 3,\n        PHOTOS_OF_YOU_SUGGESTIONS: 28,\n        MIN_ADS_VISIBLE: 1,\n        RESERVED_ADS_HEIGHT: 150,\n        _instance: null,\n        getInstance: function() {\n            if (!gb._instance) {\n                gb._instance = new gb();\n            }\n        ;\n        ;\n            return gb._instance;\n        },\n        initWithSpotlight: function(hb, ib) {\n            gb.getInstance().init(hb, ib);\n        },\n        touch: ua,\n        addPhotoFbids: function(hb, ib, jb, kb) {\n            gb.getInstance().addPhotoFbids(hb, ib, jb, kb);\n        },\n        setReachedLeftEnd: function() {\n            gb.getInstance().setReachedLeftEnd();\n        },\n        setReachedRightEnd: function() {\n            gb.getInstance().setReachedRightEnd();\n        },\n        attachFollowFlyout: function(hb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), hb);\n        },\n        attachSubscribeFlyout: function(hb) {\n            o.insertAfter(oa(\"fbPhotoSnowliftSubscribe\"), hb);\n        },\n        attachTagger: function(hb) {\n            gb.getInstance().attachTagger(hb);\n        },\n        preload: function(hb, ib) {\n            gb.getInstance().preload(hb, ib);\n        },\n        bootstrap: function(hb, ib) {\n            if (((hb && la(hb).getQueryData().hasOwnProperty(\"share_id\")))) {\n                j.loadModules([\"SpotlightShareViewer\",], function(jb) {\n                    jb.bootstrap(hb, ib);\n                });\n                return;\n            }\n        ;\n        ;\n            gb.getInstance().bootstrap(hb, ib);\n        },\n        closeRefresh: function() {\n            gb.getInstance().closeRefresh();\n        },\n        deletePhoto: function(hb) {\n            gb.getInstance().deletePhoto(hb);\n        },\n        getImage: function() {\n            return gb.getInstance().getImage();\n        },\n        getImageId: function() {\n            return gb.getInstance().getImageId();\n        },\n        getLoadQuery: function() {\n            return gb.getInstance().getLoadQuery();\n        },\n        getRHCBody: function() {\n            return gb.getInstance().getRHCBody();\n        },\n        getRHCFooter: function() {\n            return gb.getInstance().getRHCFooter();\n        },\n        getRHCHeader: function() {\n            return gb.getInstance().getRHCHeader();\n        },\n        getRoot: function() {\n            return gb.getInstance().getRoot();\n        },\n        likePhotoSkipConfirmation: function(hb) {\n            gb.getInstance().likePhotoSkipConfirmation(hb);\n        },\n        saveTagsFromPayload: function(hb) {\n            gb.getInstance().saveTagsFromPayload(hb);\n        },\n        saveTagsFromPayloadDelayed: function(hb) {\n            gb.saveTagsFromPayload.curry(hb).defer(2000);\n        },\n        handleServerError: function(hb, ib) {\n            gb.getInstance().handleServerError(hb, ib);\n        },\n        setVideoWarning: function(hb, ib) {\n            var jb = gb.getInstance(), kb = ((\"video_warning_\" + hb));\n            if (!jb.videoWarnings) {\n                jb.videoWarnings = [];\n            }\n        ;\n        ;\n            jb.videoWarnings[kb] = ib;\n        },\n        storeFromData: function(hb) {\n            gb.getInstance().storeFromData(hb);\n        },\n        swapData: function() {\n            gb.getInstance().swapData();\n        },\n        touchMarkup: ua,\n        updateTotalCount: function(hb, ib, jb) {\n            gb.getInstance().updateTotalCount(hb, ib, jb);\n        },\n        setVideoRotateURI: function(hb) {\n            gb.getInstance().videoRotateURI = hb;\n        }\n    });\n    k.extend(gb, fa);\n    ra(gb.prototype, {\n        switchTimer: null,\n        imageRefreshTimer: null,\n        imageLoadingTimer: null,\n        lastPage: 0,\n        currentMinSize: null,\n        currentImageSize: null,\n        resetUriStack: true,\n        thumbSrc: null,\n        shouldStretch: false,\n        stageMax: gb.STAGE_NORMAL_MAX,\n        stageChrome: gb.STAGE_CHROME,\n        stagePagerPrev: null,\n        ua: null,\n        PhotoTagger: null,\n        showHover: false,\n        skipLikePhotoConfirmation: false,\n        isShowingLikePhotoConfirmation: false,\n        preload: function(hb, ib) {\n            j.loadModules([\"PhotoTagger\",\"Live\",\"PhotoTagApproval\",\"PhotoTags\",\"TagTokenizer\",\"fb-photos-snowlift-fullscreen-css\",], function(kb) {\n                this.PhotoTagger = kb;\n            }.bind(this));\n            var jb = this.getImageSrc(la(hb).getQueryData());\n            if (jb) {\n                (new JSBNG__Image()).src = jb;\n            }\n        ;\n        ;\n        },\n        bootstrap: function(hb, ib) {\n            if (((hb && la(hb).getQueryData().makeprofile))) {\n                this.enableCropperOnInit = true;\n                this.isUserProfilePic = la(hb).getQueryData().makeuserprofile;\n                this.isInProfilePicAlbum = la(hb).getQueryData().inprofilepicalbum;\n            }\n        ;\n        ;\n            this.preload(hb, ib);\n            if (this.closeDirty) {\n                this.bootstrap.bind(this, hb, ib).defer();\n                return;\n            }\n        ;\n        ;\n            ca.reset();\n            this.resetUriStack = true;\n            if (this.isOpen) {\n                if (this.openExplicitly) {\n                    this.closeCleanup();\n                    this.resetUriStack = false;\n                }\n                 else return\n            ;\n            }\n        ;\n        ;\n            this.ua = ab(\"snowlift\", ib).uai(\"open\");\n            this.returningToStart = false;\n            ((this.loading && m.removeClass(this.loading, \"loading\")));\n            if (ib) {\n                m.addClass((this.loading = ib), \"loading\");\n                if (this.container) {\n                    var jb = z.byClass(ib, \"uiStreamStory\");\n                    if (jb) {\n                        this.container.setAttribute(\"data-ownerid\", jb.id);\n                    }\n                     else this.container.removeAttribute(\"data-ownerid\");\n                ;\n                ;\n                }\n            ;\n            ;\n                this.getThumbAndSize(ib);\n            }\n             else this.loading = null;\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.GO\", hb, g.BEHAVIOR_STATE);\n            this.loadFrameIfUninitialized();\n        },\n        getCurrentImageServerSizeDimensions: function() {\n            return this.stream.getCurrentImageData().dimensions;\n        },\n        getEventPrefix: function() {\n            return \"PhotoSnowlift\";\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        getSourceString: function() {\n            return \"snowlift\";\n        },\n        getViewerSource: function() {\n            return this.source;\n        },\n        getViewerSet: function() {\n            return this.stream.getPhotoSet();\n        },\n        getVersionConst: function() {\n            return aa.VIEWER_SNOWLIFT;\n        },\n        getImage: function() {\n            return this.image;\n        },\n        getImageId: function() {\n            return this.stream.getCursor();\n        },\n        getRHCHeader: function() {\n            return this.rhcHeader;\n        },\n        getRHCBody: function() {\n            return this.ufiForm;\n        },\n        getRHCFooter: function() {\n            return this.rhcFooter;\n        },\n        getLoadQuery: function() {\n            return this.loadQuery;\n        },\n        getCurrentPhotoInfo: function() {\n            var hb = this.stream.getCurrentImageData();\n            if (hb) {\n                return hb.info;\n            }\n        ;\n        ;\n            return null;\n        },\n        getOwnerId: function() {\n            var hb = this.stream.getCurrentImageData();\n            if (hb) {\n                return hb.info.owner;\n            }\n        ;\n        ;\n            return null;\n        },\n        getThumbAndSize: function(hb) {\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            var ib = la(hb.getAttribute(\"ajaxify\")).getQueryData();\n            if (!ib.size) {\n                return;\n            }\n        ;\n        ;\n            var jb = na.deserialize(ib.size);\n            if (((!jb.x || !jb.y))) {\n                return;\n            }\n        ;\n        ;\n            this.currentImageSize = jb;\n            if (((((!m.hasClass(hb, \"uiMediaThumb\") && !m.hasClass(hb, \"uiPhotoThumb\"))) && !m.hasClass(hb, \"uiScaledThumb\")))) {\n                return;\n            }\n        ;\n        ;\n            if (hb.getAttribute(\"data-cropped\")) {\n                return;\n            }\n        ;\n        ;\n            var kb = o.scry(hb, \"img\")[0], lb = o.scry(hb, \"i\")[0], mb = z.byAttribute(hb, \"data-size\");\n            this.shouldStretch = ((((((((((((mb && this.currentImageSize)) && kb)) && ((mb.getAttribute(\"data-size\") === \"2\")))) && ((this.currentImageSize.x > this.currentImageSize.y)))) && ((this.currentImageSize.x <= gb.TIMELINE_STRETCH_WIDTH)))) && ((kb.offsetWidth === gb.TIMELINE_STRETCH_WIDTH))));\n            var nb;\n            if (kb) {\n                nb = kb.src;\n            }\n             else if (lb) {\n                nb = ia.get(lb, \"backgroundImage\").replace(/.*url\\(\"?([^\"]*)\"?\\).*/, \"$1\");\n            }\n             else return\n            \n        ;\n            this.thumbSrc = nb;\n        },\n        loadFrameIfUninitialized: function() {\n            if (this.root) {\n                return;\n            }\n        ;\n        ;\n            new i(\"/ajax/photos/snowlift/init.php\").setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n        },\n        init: function(hb, ib) {\n            this.init = ua;\n            this.showHover = ib.pivot_hover;\n            ba.setEndMetrics(ib.pivot_end_metric);\n            this.enableSnowliftProfilePicCropper = ib.snowlift_profile_pic_cropper;\n            this.pagersOnKeyboardNav = ib.pagers_on_keyboard_nav;\n            this.hilitAllTagsAndBoxesOnHover = ib.snowlift_hover_shows_all_tags_and_faces;\n            this.fullscreen = r.isSupported();\n            this.showOGVideos = ib.og_videos;\n            this.resizeCommentsForAds = ib.resize_comments_for_ads;\n            if (this.resizeCommentsForAds) {\n                gb.STAGE_MIN.y = 600;\n            }\n        ;\n        ;\n            this.stageMax = gb.STAGE_HIRES_MAX;\n            this.spotlight = hb;\n            this.spotlight.subscribe(\"JSBNG__blur\", function() {\n                this.closingAction = ba.OUTSIDE;\n            }.bind(this));\n            this.spotlight.subscribe(\"hide\", xa(this.closeHandler, this));\n            this.spotlight.subscribe(\"key\", this.keyHandler.bind(this));\n            this.initializeNodes(this.spotlight.getRoot());\n            ca.init(this.sideAdUnit, this, ib, this.adsDisplayedCallback.bind(this));\n            this.inAdsDisplayedCallback = false;\n            this.lastAdsHeight = ((this.resizeCommentsForAds ? gb.RESERVED_ADS_HEIGHT : 0));\n            if (!this.subscription) {\n                w.registerHandler(this.handleNavigateAway.bind(this));\n                this.subscription = g.subscribe(\"PhotoSnowlift.GO\", function(jb, kb) {\n                    this.openExplicitly = true;\n                    ((this.loading && m.removeClass(this.loading, \"loading\")));\n                    this.open(kb);\n                }.bind(this));\n            }\n        ;\n        ;\n            this.transitionHandlerRegistered = false;\n            this.returningToStart = false;\n            y.registerHandler(this.openHandler.bind(this));\n            this.openHandlerRegistered = true;\n            g.subscribe(\"PhotoTagApproval.HILITE_TAG\", this.onHiliteTag.bind(this));\n            g.subscribe(\"PhotoTagApproval.UPDATE_TAG_BOX\", this.onUpdateTagBox.bind(this));\n            if (this.fullscreen) {\n                r.subscribe(\"changed\", this.onFullScreenChange.bind(this));\n            }\n        ;\n        ;\n            this.redesign = ib.snowlift_redesign;\n        },\n        onFullScreenChange: function() {\n            var hb = r.isFullScreen();\n            m.conditionClass(JSBNG__document.body, \"fbPhotoSnowliftFullScreenMode\", hb);\n            if (hb) {\n                if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                    this.collapseRHC();\n                }\n            ;\n            ;\n                var ib = this.stream.getCurrentImageData();\n                if (((((((ib && ib.url)) && ((this.image.src !== ib.url)))) && this.shouldShowHiRes(ib)))) {\n                    this.switchImage(ib.url);\n                }\n            ;\n            ;\n                this.adjustForResize();\n            }\n             else {\n                this.uncollapseRHC();\n                if (((ma.chrome() && !m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")))) {\n                    this.page(0, false);\n                }\n            ;\n            ;\n                g.inform(\"reflow\");\n            }\n        ;\n        ;\n            ja.hide();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n        },\n        initializeNodes: function(hb) {\n            this.root = hb;\n            this.container = o.JSBNG__find(hb, \"div.fbPhotoSnowliftContainer\");\n            this.snowliftPopup = o.JSBNG__find(this.container, \"div.fbPhotoSnowliftPopup\");\n            this.rhc = o.JSBNG__find(this.snowliftPopup, \"div.rhc\");\n            this.rhcHeader = o.JSBNG__find(this.rhc, \"div.rhcHeader\");\n            this.rhcFooter = o.JSBNG__find(this.rhc, \"div.rhcFooter\");\n            this.ufiForm = o.JSBNG__find(this.rhc, \"form.fbPhotosSnowliftFeedbackForm\");\n            this.ufiInputContainer = o.JSBNG__find(this.rhc, \"div.fbPhotosSnowboxFeedbackInput\");\n            this.scroller = o.JSBNG__find(this.ufiForm, \"div.rhcScroller\");\n            this.scrollerBody = o.JSBNG__find(this.scroller, \"div.uiScrollableAreaBody\");\n            this.stageWrapper = o.JSBNG__find(this.snowliftPopup, \"div.stageWrapper\");\n            this.overlay = o.JSBNG__find(this.snowliftPopup, \"div.snowliftOverlay\");\n            this.errorBox = o.JSBNG__find(this.stageWrapper, \"div.stageError\");\n            this.image = o.JSBNG__find(this.stageWrapper, \"img.spotlight\");\n            this.stage = o.JSBNG__find(this.stageWrapper, \"div.stage\");\n            this.videoStage = o.JSBNG__find(this.stageWrapper, \"div.videoStage\");\n            this.prevPager = o.JSBNG__find(this.snowliftPopup, \"a.snowliftPager.prev\");\n            this.nextPager = o.JSBNG__find(this.snowliftPopup, \"a.snowliftPager.next\");\n            this.stageActions = o.JSBNG__find(hb, \"div.stageActions\");\n            this.buttonActions = o.JSBNG__find(this.stageActions, \"div.fbPhotosPhotoButtons\");\n            this.productMetadata = o.scry(this.rhc, \"div.fbPhotosSnowliftProductMetadata\").pop();\n            this.sideAdUnit = o.JSBNG__find(hb, \".-cx-PUBLIC-snowliftAds__root\");\n            g.inform(\"Amoeba/instrumentMulti\", [[this.container,\"snowlift\",],[this.rhc,\"rhc\",],[this.rhcHeader,\"rhc_header\",],[this.ufiForm,\"ufi_form\",],[this.ufiInputContainer,\"ufi_input\",],[this.prevPager,\"prev_pager\",],[this.nextPager,\"next_pager\",],[this.stageActions,\"stage_actions\",],[this.sideAdUnit,\"side_ads\",],], g.BEHAVIOR_PERSISTENT);\n            m.conditionClass(this.root, \"fullScreenAvailable\", this.fullscreen);\n        },\n        initializeScroller: function() {\n            this.initializeScroller = ua;\n            this.scrollableArea = ha.fromNative(this.scroller, {\n                fade: true,\n                persistent: true\n            });\n            var hb = function(JSBNG__event) {\n                var ib = q.$E(JSBNG__event).getTarget();\n                if (o.contains(this.ufiInputContainer, ib)) {\n                    var jb = p.getInstance(ib);\n                    if (jb) {\n                        this.scrollableArea.scrollToBottom();\n                        var kb = jb.subscribe(\"resize\", function() {\n                            var mb = this.scrollableArea.isScrolledToBottom();\n                            this.adjustScroller();\n                            ((mb && this.scrollableArea.scrollToBottom()));\n                        }.bind(this)), lb = q.listen(ib, \"JSBNG__blur\", function() {\n                            jb.unsubscribe(kb);\n                            lb.remove();\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this);\n            g.subscribe(\"ufi/changed\", function(ib, jb) {\n                if (((this.ufiForm === jb.form))) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            g.subscribe(\"ufi/comment\", function(ib, jb) {\n                if (((this.ufiForm === jb.form))) {\n                    this.adjustScrollerIfNecessary();\n                    if (jb.isranked) {\n                        this.scrollableArea.scrollToTop();\n                    }\n                     else this.scrollableArea.scrollToBottom();\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            q.listen(this.rhc, \"click\", function(JSBNG__event) {\n                var ib = JSBNG__event.getTarget();\n                if (((((z.byTag(ib, \"a\") || z.byTag(ib, \"button\"))) || o.isNodeOfType(ib, \"input\")))) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            g.subscribe([\"reflow\",\"CommentUFI.Pager\",], function() {\n                if (this.isOpen) {\n                    this.adjustScrollerIfNecessary();\n                }\n            ;\n            ;\n            }.bind(this));\n            q.listen(this.ufiForm, \"focusin\", hb);\n        },\n        openHandler: function(hb) {\n            if (((((((((((this.isOpen || ((hb.getPath() != \"/photo.php\")))) || this.returningToStart)) || hb.getQueryData().closeTheater)) || hb.getQueryData().permPage)) || hb.getQueryData().makeprofile))) {\n                this.openHandlerRegistered = false;\n                return false;\n            }\n        ;\n        ;\n            this.open(hb);\n            this._uriStack.push(la(hb).getQualifiedURI().toString());\n            y.transitionComplete(true);\n            return true;\n        },\n        getImageSrc: function(hb) {\n            if (hb.smallsrc) {\n                if (!hb.size) {\n                    return hb.smallsrc;\n                }\n            ;\n            ;\n                var ib = na.deserialize(hb.size), jb = this.getStageSize(ib);\n                if (((((jb.x <= gb.STAGE_NORMAL_MAX.x)) && ((jb.y <= gb.STAGE_NORMAL_MAX.y))))) {\n                    return hb.smallsrc;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return hb.src;\n        },\n        open: function(hb) {\n            var ib = la(hb).getQueryData(), jb = this.getImageSrc(ib);\n            if (jb) {\n                delete ib.src;\n                delete ib.smallsrc;\n            }\n        ;\n        ;\n            if (this.resetUriStack) {\n                this._uriStack = [];\n            }\n        ;\n        ;\n            if (!this.initialLoad) {\n                ib.firstLoad = true;\n                this.initialLoad = true;\n            }\n        ;\n        ;\n            this.sessionID = JSBNG__Date.now();\n            this.sessionPhotosHilited = {\n            };\n            this.loadQuery = ra(ib, {\n                ssid: this.sessionID\n            });\n            this.isOpen = true;\n            this.pagersShown = false;\n            this.refreshOnClose = false;\n            this.hilitedTag = null;\n            this.loadingStates = {\n                image: false,\n                html: false\n            };\n            this.replaceUrl = false;\n            this.source = null;\n            this.saveTagSubscription = g.subscribe(\"PhotoTagger.SAVE_TAG\", this.onTagSaved.bind(this));\n            this.taggedPhotoIds = [];\n            this.stream = new da();\n            this.stream.init(aa.VIEWER_SNOWLIFT, \"PhotoViewerPagelet\", \"pagelet_photo_viewer\");\n            this.fetchInitialData();\n            this.setLoadingState(gb.STATE_HTML, true);\n            this.rhcCollapsed = false;\n            this._open(hb, jb);\n            if (this.enableSnowliftProfilePicCropper) {\n                j.loadModules([\"SnowliftPicCropper\",], function(kb) {\n                    this.cropper = kb.getInstance(this);\n                    this.cropper.init();\n                    if (this.enableCropperOnInit) {\n                        var lb = g.subscribe(\"PhotoSnowlift.SWITCH_IMAGE\", function() {\n                            if (this.isInProfilePicAlbum) {\n                                this.cropper.showPicInProfileAlbumDialog();\n                            }\n                             else this.cropper.enableCropping(this.isUserProfilePic);\n                        ;\n                        ;\n                            g.unsubscribe(lb);\n                        }.bind(this));\n                        this.enableCropperOnInit = false;\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n        ;\n        ;\n            j.loadModules([\"PhotosButtonTooltips\",], function(kb) {\n                kb.init();\n            });\n        },\n        _open: function(hb, ib) {\n            this.createLoader(ib);\n            this.spotlight.show();\n            ((this.ua && this.ua.add_event(\"frame\")));\n            g.inform(\"layer_shown\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.OPEN\");\n            this.stageHandlers = [q.listen(window, \"resize\", this.adjustForResize.bind(this)),q.listen(this.stageWrapper, \"click\", this.buttonListener.bind(this)),q.listen(this.stageWrapper, \"mouseleave\", function(JSBNG__event) {\n                var lb = JSBNG__event.getTarget();\n                if (!((((((((((((z.byClass(lb, \"snowliftOverlay\") || z.byClass(lb, \"fbPhotoSnowliftTagApproval\"))) || z.byClass(lb, \"tagPointer\"))) || z.byClass(lb, \"arrow\"))) || z.byClass(lb, \"faceboxSuggestion\"))) || z.byClass(lb, \"typeaheadWrapper\"))) || z.byClass(lb, \"photoTagTypeahead\")))) {\n                    this.unhiliteAllTags();\n                }\n            ;\n            ;\n                this.hidePagers();\n            }.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hilitePagerOnMouseMove.bind(this)),q.listen(this.stageWrapper, \"mousemove\", this.hiliteTagsOnMouseMove.bind(this)),q.listen(this.overlay, \"mouseenter\", this.unhiliteAllTags.bind(this)),];\n            this.stageHandlers.push(q.listen(this.container, \"click\", function(JSBNG__event) {\n                var lb = JSBNG__event.getTarget();\n                if (z.byClass(lb, \"rotateRight\")) {\n                    this.rotate(\"right\");\n                }\n                 else if (z.byClass(lb, \"rotateLeft\")) {\n                    this.rotate(\"left\");\n                }\n                 else if (z.byClass(lb, \"closeTheater\")) {\n                    if (r.isFullScreen()) {\n                        r.toggleFullScreen();\n                        return;\n                    }\n                ;\n                ;\n                    this.closingAction = ba.X;\n                    this.closeHandler();\n                    return false;\n                }\n                 else if (this.fullscreen) {\n                    if (z.byClass(lb, \"fbPhotoSnowliftFullScreen\")) {\n                        this.toggleFullScreen();\n                    }\n                     else if (z.byClass(lb, \"fbPhotoSnowliftCollapse\")) {\n                        this.toggleCollapse();\n                    }\n                    \n                ;\n                }\n                \n                \n                \n            ;\n            ;\n            }.bind(this)));\n            var jb = va(\"fbPhotoSnowliftFeedback\");\n            if (jb) {\n                this.stageHandlers.push(q.listen(jb, \"click\", function(JSBNG__event) {\n                    var lb = JSBNG__event.getTarget();\n                    if (((z.byClass(lb, \"like_link\") || ((z.byClass(lb, \"UFILikeLink\") && z.byClass(lb, \"UIActionLinks\")))))) {\n                        this.toggleLikeButton();\n                    }\n                ;\n                ;\n                    var mb = z.byClass(JSBNG__event.getTarget(), \"uiUfiCollapsedComment\");\n                    if (mb) {\n                        m.addClass(mb, \"uiUfiCollapsedCommentToggle\");\n                    }\n                ;\n                ;\n                }.bind(this)));\n            }\n        ;\n        ;\n            var kb = va(\"fbPhotoSnowliftOnProfile\");\n            if (kb) {\n                this.stageHandlers.push(q.listen(kb, \"click\", function(JSBNG__event) {\n                    if (z.byClass(JSBNG__event.getTarget(), \"fbPhotoRemoveFromProfileLink\")) {\n                        this.refreshOnClose = true;\n                    }\n                ;\n                ;\n                }.bind(this)));\n            }\n        ;\n        ;\n            if (this.resetUriStack) {\n                this.startingURI = la.getMostRecentURI().addQueryData({\n                    closeTheater: 1\n                }).getUnqualifiedURI();\n            }\n        ;\n        ;\n            if (!ib) {\n                this.setLoadingState(gb.STATE_IMAGE_DATA, true);\n            }\n        ;\n        ;\n            if (!this.transitionHandlerRegistered) {\n                y.registerHandler(this.transitionHandler.bind(this));\n                this.transitionHandlerRegistered = true;\n            }\n        ;\n        ;\n            ba.initLogging(ba.SNOWLIFT);\n            if (this.pivots) {\n                ba.setRelevantCount(this.pivots.relevantCount);\n            }\n        ;\n        ;\n        },\n        toggleFullScreen: function() {\n            var hb = r.toggleFullScreen(JSBNG__document.documentElement);\n            if (hb) {\n                var ib = this.stream.getCurrentImageData();\n                if (((((((ib && ib.url)) && ((this.image.src !== ib.url)))) && this.shouldShowHiRes(ib)))) {\n                    (new JSBNG__Image()).src = ib.url;\n                }\n            ;\n            ;\n                ba.logEnterFullScreen(this.stream.getCursor());\n            }\n        ;\n        ;\n        },\n        getStream: function() {\n            return this.stream;\n        },\n        fetchInitialData: function() {\n            ((this.ua && this.ua.add_event(\"init_data\")));\n            this.stream.waitForInitData();\n            var hb = l(this.container, [\"ft\",]);\n            if (((((((hb && hb.ft)) && hb.ft.ei)) && this.loadQuery))) {\n                this.loadQuery.ei = hb.ft.ei;\n            }\n        ;\n        ;\n            ka.loadFromEndpoint(\"PhotoViewerInitPagelet\", va(\"pagelet_photo_viewer_init\", this.root), this.loadQuery, {\n                usePipe: true,\n                jsNonblock: true,\n                crossPage: true\n            });\n        },\n        toggleCollapse: function() {\n            if (this.rhcCollapsed) {\n                this.uncollapseRHC();\n            }\n             else this.collapseRHC();\n        ;\n        ;\n        },\n        collapseRHC: function() {\n            this.rhcCollapsed = true;\n            m.addClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        uncollapseRHC: function() {\n            this.rhcCollapsed = false;\n            m.removeClass(this.root, \"collapseRHC\");\n            this.adjustForResize();\n        },\n        closeHandler: function() {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            this.closingAction = ((this.closingAction || ba.ESC));\n            if (((la.getMostRecentURI().addQueryData({\n                closeTheater: 1\n            }).getUnqualifiedURI().toString() == this.startingURI.toString()))) {\n                this.close();\n                return;\n            }\n        ;\n        ;\n            this.returnToStartingURI(this.refreshOnClose);\n            this.close();\n        },\n        returnToStartingURI: function(hb, ib) {\n            if (!hb) {\n                if (ib) {\n                    this.squashNextTransition(wa.curry(ib));\n                }\n                 else this.squashNextTransition();\n            ;\n            }\n        ;\n        ;\n            this.returningToStart = true;\n            var jb = g.subscribe(\"page_transition\", (function() {\n                this.returningToStart = false;\n                jb.unsubscribe();\n            }).bind(this)), kb = ((hb || isNaN(ma.JSBNG__opera()))), lb = this._uriStack.length;\n            if (((kb && ((lb < window.JSBNG__history.length))))) {\n                window.JSBNG__history.go(-lb);\n            }\n             else {\n                var mb = this.startingURI, nb = new la(mb).removeQueryData(\"closeTheater\");\n                if (((((mb.getQueryData().sk == \"approve\")) && ((mb.getPath() == \"/profile.php\"))))) {\n                    nb.removeQueryData(\"highlight\");\n                    nb.removeQueryData(\"notif_t\");\n                }\n            ;\n            ;\n                wa(nb);\n            }\n        ;\n        ;\n        },\n        squashNextTransition: function(hb) {\n            this.squashNext = true;\n            y.registerHandler(function ib() {\n                if (this.squashNext) {\n                    this.squashNext = false;\n                    if (hb) {\n                        hb.defer();\n                    }\n                ;\n                ;\n                    y.transitionComplete(true);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n            }.bind(this), 7);\n        },\n        handleNavigateAway: function(hb) {\n            var ib = qa(y._most_recent_uri.getQualifiedURI(), hb.getAttribute(\"href\"));\n            if (((this.isOpen && ya(ib.getPath(), \"/hashtag/\")))) {\n                this.close();\n                y.transitionComplete(true);\n                this.squashNextTransition();\n                y.go(this.startingURI);\n                return true;\n            }\n        ;\n        ;\n            if (((((((this.isOpen && ((ib instanceof la)))) && ((ib.getUnqualifiedURI().toString() != this.startingURI.toString())))) && ((ib.getPath() != \"/photo.php\"))))) {\n                if (!this.closingAction) {\n                    this.closingAction = ba.NAVIGATE;\n                }\n            ;\n            ;\n                this.returnToStartingURI(false, ib);\n                this.close();\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        postProcessTaggedPhotos: function() {\n            if (((this.taggedPhotoIds && ((this.taggedPhotoIds.length > 0))))) {\n                var hb = null;\n                if (((this.source === gb.COLLECTIONS_UNTAGGED_PHOTOS))) {\n                    hb = \"/ajax/photos/photo/edit/skiptag/\";\n                }\n                 else if (((this.source === gb.PHOTOS_OF_YOU_SUGGESTIONS))) {\n                    hb = \"/ajax/photos/photo/add_to_star_grid/\";\n                }\n                \n            ;\n            ;\n                if (hb) {\n                    new i().setURI(hb).setAllowCrossPageTransition(true).setData({\n                        media_id: this.taggedPhotoIds\n                    }).send();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        onTagSaved: function(hb, ib) {\n            if (this.taggedPhotoIds) {\n                if (((((this.source === gb.PHOTOS_OF_YOU_SUGGESTIONS)) && !ib.self_tag))) {\n                    return;\n                }\n            ;\n            ;\n                this.taggedPhotoIds.push(ib.photo_fbid);\n            }\n        ;\n        ;\n        },\n        close: function() {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            this.isOpen = false;\n            if (this.fullscreen) {\n                r.disableFullScreen();\n            }\n        ;\n        ;\n            ab(\"snowlift\").uai(\"close\");\n            ((this.cropper && this.cropper.disableCropping()));\n            this.spotlight.hide();\n            this.openExplicitly = false;\n            this.postProcessTaggedPhotos();\n            g.unsubscribe(this.saveTagSubscription);\n            this.taggedPhotoIds = [];\n            this.closeDirty = true;\n            this.closeCleanup.bind(this).defer();\n        },\n        closeCleanup: function() {\n            this.closeDirty = false;\n            m.removeClass(this.root, \"dataLoading\");\n            ba.logPhotoViews(this.closingAction);\n            this.destroy();\n            m.hide(this.errorBox);\n            m.hide(this.image);\n            this.currentImageSize = null;\n            this.thumbSrc = null;\n            this.shouldStretch = false;\n            this.resetUriStack = true;\n            m.removeClass(this.stageWrapper, \"showVideo\");\n            o.empty(this.videoStage);\n            this.uncollapseRHC();\n            this.currentMinSize = null;\n            this.rhcMinHeight = null;\n            this.setStagePagersState(\"reset\");\n            this.recacheData();\n            o.empty(this.sideAdUnit);\n            this.stream.destroy();\n            var hb = ((this.closingAction === ba.NAVIGATE));\n            this.closingAction = null;\n            if (!this.openHandlerRegistered) {\n                y.registerHandler(this.openHandler.bind(this));\n                this.openHandlerRegistered = true;\n            }\n        ;\n        ;\n            g.inform(\"layer_hidden\", {\n                type: \"PhotoSnowlift\"\n            });\n            g.inform(\"PhotoSnowlift.CLOSE\", hb);\n            this.root.setAttribute(\"aria-busy\", \"true\");\n        },\n        createLoader: function(hb) {\n            if (((this.currentImageSize === null))) {\n                this.adjustStageSize(gb.STAGE_MIN);\n            }\n             else {\n                var ib = this.getStageSize(this.currentImageSize);\n                ib = new na(Math.max(ib.x, gb.STAGE_MIN.x), Math.max(ib.y, gb.STAGE_MIN.y));\n                var jb = this.getImageSizeInStage(this.currentImageSize, ib);\n                if (((this.thumbSrc === null))) {\n                    this.adjustStageSize(jb);\n                }\n                 else this.useImage(o.create(\"img\", {\n                    className: \"spotlight\",\n                    alt: \"\",\n                    src: this.thumbSrc,\n                    style: {\n                        width: ((jb.x + \"px\")),\n                        height: ((jb.y + \"px\"))\n                    }\n                }), jb, false);\n            ;\n            ;\n            }\n        ;\n        ;\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            if (hb) {\n                (function() {\n                    var kb = new JSBNG__Image(), lb = q.listen(kb, \"load\", pa(function() {\n                        if (!this.isOpen) {\n                            return;\n                        }\n                    ;\n                    ;\n                        if (((!this.stream || !this.stream.errorInCurrent()))) {\n                            this.switchImage(hb, this.currentImageSize);\n                            ((this.ua && this.ua.add_event(\"image\")));\n                            this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n                        }\n                    ;\n                    ;\n                    }.bind(this), \"photo_theater\"));\n                    g.subscribeOnce(\"PhotoSnowlift.PAGE\", lb.remove.bind(lb));\n                    kb.src = hb;\n                }).bind(this).defer();\n            }\n        ;\n        ;\n            m.hide(this.stageActions);\n            this.setStagePagersState(\"disabled\");\n        },\n        initDataFetched: function(hb) {\n            ba.setPhotoSet(this.stream.getPhotoSet());\n            ba.setLogFbids(hb.logids);\n            var ib = this.stream.getCurrentImageData();\n            ba.addPhotoView(ib.info, this.shouldShowHiRes(ib), ((this.fullscreen && r.isFullScreen())));\n            var jb = this.stream.getCurrentExtraData();\n            if (((jb && ((jb.source !== undefined))))) {\n                this.source = parseInt(jb.source, 10);\n                ba.setSource(this.source);\n            }\n        ;\n        ;\n            if (!this.pageHandlers) {\n                this.pageHandlers = [q.listen(this.root, \"click\", this.pageListener.bind(this)),q.listen(this.root, \"mouseleave\", this.mouseLeaveListener.bind(this)),];\n            }\n        ;\n        ;\n            m.show(this.stageActions);\n            this.root.setAttribute(\"aria-busy\", \"false\");\n            this.isLoggedInViewer = hb.loggedin;\n            this.disableAdsForSession = ((hb.disablesessionads || !this.isLoggedInViewer));\n            this.showFlashTags = !!hb.flashtags;\n            this.disableAds = ((this.disableAdsForSession || hb.fromad));\n            this.loadAds();\n        },\n        adjustScrollerIfNecessary: function() {\n            JSBNG__clearTimeout(this.scrollerTimeout);\n            this.scrollerTimeout = this.adjustScroller.bind(this).defer();\n        },\n        adjustScroller: function(hb) {\n            JSBNG__clearTimeout(this.scrollerTimeout);\n            this.initializeScroller();\n            this.scrollableArea.resize();\n            var ib = na.getElementDimensions(this.rhc), jb = ib.y;\n            jb -= na.getElementDimensions(this.rhcHeader).y;\n            jb -= na.getElementDimensions(this.ufiInputContainer).y;\n            if (this.productMetadata) {\n                var kb = na.getElementDimensions(this.productMetadata);\n                if (((kb.x !== 0))) {\n                    jb -= kb.y;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((hb == null))) {\n                hb = ((this.resizeCommentsForAds ? this.lastAdsHeight : 0));\n            }\n        ;\n        ;\n            this.lastAdsHeight = hb;\n            this.rhcMinHeight = ((ib.y - ((jb - gb.MIN_UFI_HEIGHT))));\n            jb = Math.max(0, jb);\n            var lb = na.getElementDimensions(this.scrollerBody).y, mb = Math.max(gb.MIN_UFI_HEIGHT, ((jb - hb)));\n            if (((lb >= mb))) {\n                ia.set(this.scroller, \"height\", ((mb + \"px\")));\n                if (((jb > mb))) {\n                    m.removeClass(this.rhc, \"pinnedUfi\");\n                    jb -= mb;\n                }\n                 else {\n                    m.addClass(this.rhc, \"pinnedUfi\");\n                    jb = 0;\n                }\n            ;\n            ;\n            }\n             else {\n                ia.set(this.scroller, \"height\", \"auto\");\n                m.removeClass(this.rhc, \"pinnedUfi\");\n                jb -= lb;\n            }\n        ;\n        ;\n            var nb = o.scry(this.ufiInputContainer, \"li.UFIAddComment\");\n            if (((nb.length !== 0))) {\n                var ob = o.scry(this.scrollerBody, \"li.UFIComment.display\");\n                if (((ob.length === 0))) {\n                    m.addClass(nb[0], \"UFIFirstComponent\");\n                }\n                 else m.removeClass(nb[0], \"UFIFirstComponent\");\n            ;\n            ;\n            }\n        ;\n        ;\n            var pb = na.getElementDimensions(this.ufiInputContainer).y;\n            ia.set(this.ufiForm, \"padding-bottom\", ((pb + \"px\")));\n            ca.resize(new na(ib.x, jb));\n            this.scrollableArea.adjustGripper();\n        },\n        adjustForResize: function() {\n            this.currentMinSize = null;\n            this.adjustStageSize();\n            this.adjustForNewData();\n        },\n        shouldShowHiRes: function(hb) {\n            if (((!hb || !hb.smallurl))) {\n                return false;\n            }\n        ;\n        ;\n            var ib = this.getStageSize(hb.dimensions), jb = this.getImageSizeInStage(hb.dimensions, ib);\n            return ((((jb.x > gb.STAGE_NORMAL_MAX.x)) || ((jb.y > gb.STAGE_NORMAL_MAX.y))));\n        },\n        getImageURL: function(hb) {\n            if (hb.video) {\n                return null;\n            }\n             else if (((hb.smallurl && !this.shouldShowHiRes(hb)))) {\n                return hb.smallurl;\n            }\n            \n        ;\n        ;\n            return hb.url;\n        },\n        getImageDimensions: function(hb) {\n            if (((hb.smalldims && ((!this.shouldShowHiRes(hb) || ((this.image.src === hb.smallurl))))))) {\n                return hb.smalldims;\n            }\n        ;\n        ;\n            return hb.dimensions;\n        },\n        getStageSize: function(hb, ib) {\n            var jb = na.getViewportDimensions(), kb = new na(hb.x, hb.y);\n            if (ib) {\n                kb = new na(Math.max(hb.x, ib.x), Math.max(hb.y, ib.y));\n            }\n        ;\n        ;\n            var lb, mb;\n            if (((this.fullscreen && r.isFullScreen()))) {\n                return new na(((this.rhcCollapsed ? JSBNG__screen.width : ((JSBNG__screen.width - gb.SIDEBAR_SIZE_MAX)))), ((JSBNG__screen.height - ((gb.FULL_SCREEN_PADDING * 2)))));\n            }\n             else {\n                lb = Math.min(kb.x, this.stageMax.x, ((((jb.x - gb.SIDEBAR_SIZE_MAX)) - gb.STAGE_CHROME.x)));\n                mb = Math.min(kb.y, this.stageMax.y, ((jb.y - gb.STAGE_CHROME.y)));\n            }\n        ;\n        ;\n            if (((((lb === 0)) && ((mb === 0))))) {\n                return new na(0, 0);\n            }\n        ;\n        ;\n            var nb = ((lb / mb)), ob = ((kb.x / kb.y));\n            if (((nb < ob))) {\n                return new na(lb, Math.round(((lb / ob))));\n            }\n        ;\n        ;\n            return new na(Math.round(((mb * ob))), mb);\n        },\n        getImageSizeInStage: function(hb, ib) {\n            var jb = hb.x, kb = hb.y;\n            if (((((jb >= ib.x)) || ((kb >= ib.y))))) {\n                var lb = ((ib.x / ib.y)), mb = ((jb / kb));\n                if (((lb < mb))) {\n                    jb = ib.x;\n                    kb = Math.round(((jb / mb)));\n                }\n                 else if (((lb > mb))) {\n                    kb = ib.y;\n                    jb = Math.round(((kb * mb)));\n                }\n                 else {\n                    jb = ib.x;\n                    kb = ib.y;\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            return new na(jb, kb);\n        },\n        adjustStageSize: function(hb) {\n            var ib = this.currentImageSize;\n            if (hb) {\n                ib = hb;\n            }\n             else {\n                var jb = ((this.stream && this.stream.getCurrentImageData()));\n                if (jb) {\n                    ib = this.getImageDimensions(jb);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            this.currentImageSize = ib;\n            var kb = 0;\n            if (((((((((this.shouldStretch && !this.getVideoOnStage())) && ((ib.x > ib.y)))) && ((ib.x <= gb.TIMELINE_STRETCH_WIDTH)))) && ((ib.x >= gb.TIMELINE_STRETCH_MIN))))) {\n                ib.y = Math.round(((((ib.y * gb.TIMELINE_STRETCH_WIDTH)) / ib.x)));\n                ib.x = gb.TIMELINE_STRETCH_WIDTH;\n            }\n             else if (this.getVideoOnStage()) {\n                kb = ((gb.VIDEO_BOTTOM_BAR_SPACE * 2));\n            }\n            \n        ;\n        ;\n            var lb = this.getStageSize(ib, this.currentMinSize);\n            if (!this.currentMinSize) {\n                this.currentMinSize = new na(0, 0);\n            }\n        ;\n        ;\n            if (!this.rhcMinHeight) {\n                this.rhcMinHeight = 0;\n            }\n        ;\n        ;\n            this.currentMinSize = new na(Math.max(lb.x, gb.STAGE_MIN.x, this.currentMinSize.x), Math.max(lb.y, gb.STAGE_MIN.y, this.currentMinSize.y));\n            var mb = this.getImageSizeInStage(ib, this.currentMinSize), nb = ((this.currentMinSize.x - mb.x)), ob = ((this.currentMinSize.y - mb.y));\n            if (((((nb > 0)) && ((nb < gb.PADDING_MIN))))) {\n                this.currentMinSize.x -= nb;\n            }\n             else if (((((ob > 0)) && ((ob < gb.PADDING_MIN))))) {\n                this.currentMinSize.y -= ob;\n            }\n            \n        ;\n        ;\n            var pb = o.scry(this.productMetadata, \"#fbPhotoSnowliftTaggedProducts .taggee\");\n            if (pb.length) {\n                this.currentMinSize.y = Math.max(this.currentMinSize.y, this.rhcMinHeight);\n            }\n        ;\n        ;\n            var qb = ((this.currentMinSize.x + gb.SIDEBAR_SIZE_MAX));\n            if (this.rhcCollapsed) {\n                qb = this.currentMinSize.x;\n            }\n        ;\n        ;\n            this.snowliftPopup.style.cssText = ((((((((((\"width:\" + qb)) + \"px;\")) + \"height:\")) + this.currentMinSize.y)) + \"px;\"));\n            var rb = ((((this.currentMinSize.y - kb)) + \"px\"));\n            if (((ma.firefox() || ((ma.ie() < 8))))) {\n                var sb = ia.get(this.stageWrapper, \"font-size\");\n                if (((ma.ie() && ((sb.indexOf(\"px\") < 0))))) {\n                    var tb = o.create(\"div\");\n                    tb.style.fontSize = sb;\n                    tb.style.height = \"1em\";\n                    sb = tb.style.pixelHeight;\n                }\n            ;\n            ;\n                rb = ((((((this.currentMinSize.y - kb)) / parseFloat(sb))) + \"em\"));\n            }\n        ;\n        ;\n            this.stageWrapper.style.cssText = ((((((((((\"width:\" + this.currentMinSize.x)) + \"px;\")) + \"line-height:\")) + rb)) + \";\"));\n            if (((ma.ie() < 8))) {\n                ia.set(this.root, \"height\", ((na.getViewportDimensions().y + \"px\")));\n                ia.set(this.container, \"min-height\", ((((this.currentMinSize.y + gb.STAGE_CHROME.y)) + \"px\")));\n            }\n        ;\n        ;\n            this.image.style.cssText = ((((((((((\"width:\" + mb.x)) + \"px;\")) + \"height:\")) + mb.y)) + \"px;\"));\n            var ub = this.getTagger();\n            if (ub) {\n                ub.repositionTagger();\n            }\n        ;\n        ;\n            this.adjustScrollerIfNecessary();\n        },\n        adjustForNewData: function() {\n            if (!this.image) {\n                return;\n            }\n        ;\n        ;\n            var hb = o.scry(this.stage, \"div.tagsWrapper\")[0], ib = na.getElementDimensions(this.image);\n            if (hb) {\n                ia.set(hb, \"width\", ((ib.x + \"px\")));\n                ia.set(hb, \"height\", ((ib.y + \"px\")));\n                if (((ma.ie() <= 7))) {\n                    var jb = o.scry(this.root, \"div.tagContainer\")[0];\n                    if (jb) {\n                        m.conditionClass(hb, \"ie7VerticalFix\", ((na.getElementDimensions(jb).y > ib.y)));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        adsDisplayedCallback: function(hb, ib) {\n            var jb = ((((((((this.resizeCommentsForAds && !this.inAdsDisplayedCallback)) && !this.disableAds)) && ((gb.MIN_ADS_VISIBLE > 0)))) && ((ib.length >= gb.MIN_ADS_VISIBLE))));\n            if (jb) {\n                var kb = ib[((gb.MIN_ADS_VISIBLE - 1))], lb = ((((hb < gb.MIN_ADS_VISIBLE)) || ((kb != gb.RESERVED_ADS_HEIGHT))));\n                if (lb) {\n                    this.inAdsDisplayedCallback = true;\n                    this.adjustScroller(kb);\n                    this.inAdsDisplayedCallback = false;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        setLoadingState: function(hb, ib) {\n            switch (hb) {\n              case gb.STATE_IMAGE_PIXELS:\n                m.conditionClass(this.root, \"imagePixelsLoading\", ib);\n                break;\n              case gb.STATE_IMAGE_DATA:\n                this.loadingStates[hb] = ib;\n                m.conditionClass(this.root, \"imageLoading\", ib);\n                break;\n              case gb.STATE_HTML:\n                this.loadingStates[hb] = ib;\n                m.conditionClass(this.root, \"dataLoading\", ib);\n                this.rhc.setAttribute(\"aria-busy\", ((ib ? \"true\" : \"false\")));\n                break;\n            };\n        ;\n        },\n        destroy: function() {\n            this.stageHandlers.forEach(function(hb) {\n                hb.remove();\n            });\n            if (this.pageHandlers) {\n                this.pageHandlers.forEach(function(hb) {\n                    hb.remove();\n                });\n                this.pageHandlers = null;\n            }\n        ;\n        ;\n        },\n        checkState: function(hb) {\n            if (((((hb != gb.STATE_ERROR)) && !this.loadingStates[hb]))) {\n                return;\n            }\n        ;\n        ;\n            switch (hb) {\n              case gb.STATE_IMAGE_DATA:\n                var ib = this.stream.getCurrentImageData();\n                if (ib) {\n                    var jb = this.getImageURL(ib);\n                    if (jb) {\n                        this.switchImage(jb, null, true);\n                    }\n                     else if (ib.video) {\n                        this.switchVideo(ib.video, true);\n                    }\n                    \n                ;\n                ;\n                    this.setLoadingState(hb, false);\n                }\n            ;\n            ;\n                break;\n              case gb.STATE_HTML:\n                if (this.stream.getCurrentHtml()) {\n                    this.swapData();\n                    this.showPagers(gb.PAGER_FADE);\n                    this.setLoadingState(hb, false);\n                }\n            ;\n            ;\n                break;\n              default:\n                if (this.stream.errorInCurrent()) {\n                    m.hide(this.image);\n                    m.show(this.errorBox);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n        },\n        buttonListener: function(JSBNG__event) {\n            var hb = JSBNG__event.getTarget(), ib = JSBNG__Date.now();\n            if (z.byClass(hb, \"fbPhotoTagApprovalBox\")) {\n                return;\n            }\n        ;\n        ;\n            if (z.byClass(hb, \"fbPhotosCornerWantButton\")) {\n                JSBNG__event.JSBNG__stop();\n                return;\n            }\n        ;\n        ;\n            if (((((ib - this.lastPage)) < 350))) {\n                return;\n            }\n        ;\n        ;\n            if (z.byClass(hb, \"fbPhotosPhotoLike\")) {\n                this.likePhoto();\n            }\n             else if (z.byClass(hb, \"tagApproveIgnore\")) {\n                this.updateTagBox(JSBNG__event, hb);\n            }\n            \n        ;\n        ;\n        },\n        likePhoto: function() {\n            ba.addButtonLike();\n            var hb = oa(\"fbPhotoSnowliftFeedback\"), ib = o.scry(hb, \"button.like_link\")[0];\n            if (!ib) {\n                if (this.redesign) {\n                    ib = o.scry(this.root, \"a.-cx-PUBLIC-fbEntstreamCollapsedUFI__likelink\")[0];\n                }\n                 else ib = o.scry(hb, \"a.UFILikeLink\")[0];\n            ;\n            }\n        ;\n        ;\n            var jb = ib.getAttribute(\"href\");\n            if (r.isFullScreen()) {\n                if (ma.chrome()) {\n                    ib.setAttribute(\"href\", \"javascript:;\");\n                }\n            ;\n            }\n        ;\n        ;\n            ib.click();\n            ib.setAttribute(\"href\", jb);\n        },\n        toggleLikeButton: function() {\n            var hb = o.scry(this.buttonActions, \"a.fbPhotosPhotoLike\")[0];\n            if (hb) {\n                var ib = o.JSBNG__find(this.root, \".likeCount\"), jb = o.JSBNG__find(ib, \".likeCountNum\");\n                if (ib) {\n                    if (m.hasClass(hb, \"viewerLikesThis\")) {\n                        o.setContent(jb, ((parseInt(jb.textContent, 10) - 1)));\n                    }\n                     else o.setContent(jb, ((parseInt(jb.textContent, 10) + 1)));\n                ;\n                }\n            ;\n            ;\n                m.toggleClass(hb, \"viewerLikesThis\");\n                m.removeClass(hb, \"viewerAlreadyLikedThis\");\n            }\n        ;\n        ;\n        },\n        likePhotoWithKey: function() {\n            if (this.isShowingLikePhotoConfirmation) {\n                return;\n            }\n        ;\n        ;\n            if (this.skipLikePhotoConfirmation) {\n                this.likePhoto();\n            }\n             else h.send(new i(\"/photos/confirm_like.php\"), function(hb) {\n                this.isShowingLikePhotoConfirmation = true;\n                hb.subscribe(\"JSBNG__confirm\", this.onCloseLikePhotoConfirmDialog.bind(this));\n                hb.subscribe(\"cancel\", this.onCloseLikePhotoConfirmDialog.bind(this));\n            }.bind(this));\n        ;\n        ;\n            return false;\n        },\n        likePhotoSkipConfirmation: function(hb) {\n            this.skipLikePhotoConfirmation = hb;\n            this.likePhoto();\n        },\n        onCloseLikePhotoConfirmDialog: function() {\n            this.isShowingLikePhotoConfirmation = false;\n        },\n        updateTagBox: function(hb, ib) {\n            this.unhiliteAllTags();\n            var jb = va(hb);\n            if (!jb) {\n                return;\n            }\n        ;\n        ;\n            m.addClass(jb, \"tagBox\");\n            m.addClass(jb, \"tagBoxPendingResponse\");\n            m.removeClass(jb, \"tagBoxPending\");\n            m.hide(o.JSBNG__find(jb, \"span.tagForm\"));\n            if (ib) {\n                m.show(o.JSBNG__find(jb, \"span.tagApproved\"));\n            }\n             else m.show(o.JSBNG__find(jb, \"span.tagIgnored\"));\n        ;\n        ;\n        },\n        rotate: function(hb) {\n            var ib = this.stream.getCursor();\n            if (this.getVideoOnStage()) {\n                var jb = ((((hb == \"left\")) ? 270 : 90));\n                bb.isTruthy(this.videoRotateURI, \"Video rotate URI not set.\");\n                j.loadModules([\"VideoRotate\",], function(lb) {\n                    new lb(ib, this.videoRotateURI).motionRotate(jb);\n                }.bind(this));\n                return;\n            }\n        ;\n        ;\n            var kb = ra({\n                fbid: ib,\n                opaquecursor: this.stream.getOpaqueCursor(ib),\n                cs_ver: aa.VIEWER_SNOWLIFT\n            }, this.stream.getPhotoSetQuery());\n            kb[hb] = 1;\n            this.setLoadingState(gb.STATE_IMAGE_DATA, true);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            m.hide(this.image);\n            new i(\"/ajax/photos/photo/rotate/\").setAllowCrossPageTransition(true).setData(kb).setErrorHandler(this.rotationError.bind(this, ib)).setFinallyHandler(this.rotationComplete.bind(this, ib)).setMethod(\"POST\").setReadOnly(false).send();\n        },\n        rotationComplete: function(hb, ib) {\n            if (((hb == this.stream.getCursor()))) {\n                this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                this.swapData();\n            }\n        ;\n        ;\n        },\n        rotationError: function(hb, ib) {\n            if (((hb == this.stream.getCursor()))) {\n                this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n                this.switchImage(this.getImageURL(this.stream.getCurrentImageData()));\n                j.loadModules([\"AsyncResponse\",], function(jb) {\n                    jb.defaultErrorHandler(ib);\n                });\n            }\n        ;\n        ;\n        },\n        saveTagsFromPayload: function(hb) {\n            this.storeFromData(hb);\n            if (((((\"data\" in hb)) && ((this.stream.getCursor() in hb.data))))) {\n                this.swapData();\n            }\n        ;\n        ;\n        },\n        saveEdit: function() {\n            if (!m.hasClass(this.root, \"fbPhotoSnowliftEditMode\")) {\n                return;\n            }\n        ;\n        ;\n            j.loadModules([\"PhotoInlineEditor\",\"Form\",], function(hb, ib) {\n                var jb = hb.getInstance(this.getViewerConst());\n                ((jb && ib.bootstrap(jb.getForm().controller)));\n            }.bind(this));\n        },\n        mouseLeaveListener: function(JSBNG__event) {\n            this.unhiliteAllTags();\n            this.reHilitePendingTag();\n        },\n        hilitePagerOnMouseMove: function(JSBNG__event) {\n            var hb = na.getEventPosition(JSBNG__event), ib = na.getElementPosition(this.stage);\n            if (x.isRTL()) {\n                var jb = na.getElementDimensions(this.stage);\n                this.stagePagerPrev = ((((jb.x - ((hb.x - ib.x)))) < gb.GOPREV_AREA));\n            }\n             else this.stagePagerPrev = ((((hb.x - ib.x)) < gb.GOPREV_AREA));\n        ;\n        ;\n            m.conditionClass(this.prevPager, \"hilightPager\", this.stagePagerPrev);\n            m.conditionClass(this.nextPager, \"hilightPager\", !this.stagePagerPrev);\n            var kb, lb = JSBNG__event.getTarget();\n            if (((((!z.byClass(lb, \"snowliftOverlay\") && !z.byClass(lb, \"bottomBarActions\"))) && !z.byClass(lb, \"snowliftPager\")))) {\n                kb = gb.PAGER_FADE;\n            }\n        ;\n        ;\n            this.showPagers(kb);\n        },\n        showPagers: function(hb) {\n            JSBNG__clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"active\");\n            if (((typeof hb !== \"undefined\"))) {\n                this.fadePagerTimer = this.hidePagers.bind(this).defer(hb);\n            }\n        ;\n        ;\n        },\n        hidePagers: function() {\n            var hb = o.scry(this.getRoot(), \".fbPhotosPhotoActionsMenu\")[0];\n            if (hb) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__clearTimeout(this.fadePagerTimer);\n            this.setStagePagersState(\"inactive\");\n        },\n        getTagger: function() {\n            if (!this.PhotoTagger) {\n                return null;\n            }\n        ;\n        ;\n            var hb = this.PhotoTagger.getInstance(aa.VIEWER_SNOWLIFT);\n            if (((!hb || !hb.tagHoverFacebox))) {\n                return null;\n            }\n        ;\n        ;\n            return hb;\n        },\n        hiliteAllBoxes: function() {\n            o.scry(this.stage, \"div.tagsWrapper div.faceBox\").forEach(function(hb) {\n                m.addClass(hb, \"otherActive\");\n            });\n        },\n        flashAllTags: function() {\n            var hb = this.stream.getCurrentImageData().info.fbid;\n            if (this.sessionPhotosHilited[hb]) {\n                return;\n            }\n        ;\n        ;\n            o.scry(this.stage, \"div.tagsWrapper div.tagBox\").forEach(function(ib) {\n                m.addClass(ib, \"hover\");\n            });\n            this.sessionPhotosHilited[hb] = true;\n            this.unhiliteTimer = this.unhiliteAllTags.bind(this).defer(2000, true);\n        },\n        unhiliteAllTags: function() {\n            JSBNG__clearTimeout(this.unhiliteTimer);\n            o.scry(this.stage, \"div.tagsWrapper div.hover\").forEach(function(ib) {\n                m.removeClass(ib, \"hover\");\n            });\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                o.scry(this.stage, \"div.tagsWrapper div.otherActive\").forEach(function(ib) {\n                    m.removeClass(ib, \"otherActive\");\n                });\n            }\n        ;\n        ;\n            this.hilitedTag = null;\n            if (!m.hasClass(this.root, \"taggingMode\")) {\n                var hb = this.getTagger();\n                if (hb) {\n                    hb.hideTagger();\n                    hb.setCurrentFacebox(null);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        switchHilitedTags: function(hb, ib) {\n            if (((this.switchTimer !== null))) {\n                JSBNG__clearTimeout(this.switchTimer);\n                this.switchTimer = null;\n            }\n        ;\n        ;\n            this.unhiliteAllTags();\n            if (this.hilitAllTagsAndBoxesOnHover) {\n                this.hiliteAllBoxes();\n            }\n        ;\n        ;\n            var jb = va(hb);\n            if (jb) {\n                this.hilitedTag = hb;\n                if (((!m.hasClass(this.root, \"taggingMode\") && ea.isFacebox(this.hilitedTag)))) {\n                    var kb = this.getTagger();\n                    if (kb) {\n                        m.addClass(jb, \"hover\");\n                        var lb = kb.getFacebox(hb);\n                        kb.setCurrentFacebox(lb);\n                        if (lb) {\n                            kb.addTagFromFacebox(lb);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n                 else m.addClass(jb, \"hover\");\n            ;\n            ;\n                if (((((m.hasClass(jb, \"tagBoxPending\") && !m.hasClass(jb, \"showPendingTagName\"))) && ((ib === true))))) {\n                    o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\").forEach(function(mb) {\n                        m.removeClass(mb, \"showPendingTagName\");\n                    });\n                    m.addClass(jb, \"showPendingTagName\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        reHilitePendingTag: function() {\n            var hb = va(this.hilitedTag);\n            if (((hb && m.hasClass(hb, \"showPendingTagName\")))) {\n                return;\n            }\n        ;\n        ;\n            var ib = o.scry(this.stage, \"div.tagsWrapper div.showPendingTagName\")[0];\n            if (ib) {\n                this.switchHilitedTags(ib.id);\n            }\n        ;\n        ;\n        },\n        hiliteTagsOnMouseMove: function(JSBNG__event) {\n            if (((!this.stream.getCurrentExtraData() || this.getVideoOnStage()))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.switchTimer !== null))) {\n                return;\n            }\n        ;\n        ;\n            var hb = JSBNG__event.getTarget();\n            if (((((((((((((z.byClass(hb, \"snowliftOverlay\") || z.byClass(hb, \"fbPhotoSnowliftTagApproval\"))) || z.byClass(hb, \"tagPointer\"))) || z.byClass(hb, \"arrow\"))) || z.byClass(hb, \"faceboxSuggestion\"))) || z.byClass(hb, \"typeaheadWrapper\"))) || z.byClass(hb, \"photoTagTypeahead\")))) {\n                return;\n            }\n        ;\n        ;\n            var ib = z.byClass(hb, \"tagBoxPending\"), jb = false;\n            if (this.hilitedTag) {\n                var kb = va(this.hilitedTag);\n                jb = ((kb && m.hasClass(kb, \"tagBoxPending\")));\n            }\n        ;\n        ;\n            var lb = ((((!this.hilitedTag && ib)) || ((!jb && ib))));\n            if (lb) {\n                this.switchHilitedTags(ib.id);\n                return;\n            }\n        ;\n        ;\n            if (((ib && ((ib.id == this.hilitedTag))))) {\n                return;\n            }\n        ;\n        ;\n            var mb = 250, nb = ea.absoluteToNormalizedPosition(this.image, na.getEventPosition(JSBNG__event));\n            if (this.currentTagHasPrecedence(nb)) {\n                return;\n            }\n        ;\n        ;\n            var ob = ea.getNearestBox(this.stream.getCurrentExtraData().tagRects, nb);\n            if (!ob) {\n                if (!jb) {\n                    this.unhiliteAllTags();\n                    this.reHilitePendingTag();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var pb = null;\n            if (jb) {\n                var qb = {\n                };\n                qb[this.hilitedTag] = this.stream.getCurrentExtraData().tagRects[this.hilitedTag];\n                pb = ea.getNearestBox(qb, nb);\n            }\n        ;\n        ;\n            if (((((pb !== null)) && jb))) {\n                return;\n            }\n        ;\n        ;\n            if (((this.hilitedTag != ob))) {\n                if (jb) {\n                    this.switchTimer = this.switchHilitedTags.bind(this, ob).defer(mb);\n                }\n                 else {\n                    if (this.showHover) {\n                        if (!this.seenTags) {\n                            this.seenTags = [];\n                        }\n                    ;\n                    ;\n                        if (!this.seenTags[ob]) {\n                            ba.addFaceTagImpression();\n                            this.seenTags[ob] = true;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    this.switchHilitedTags(ob);\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        currentTagHasPrecedence: function(hb) {\n            if (!this.hilitedTag) {\n                return false;\n            }\n        ;\n        ;\n            if (((this.stream.getCurrentExtraData().tagRects[this.hilitedTag] === undefined))) {\n                this.hilitedTag = null;\n                return false;\n            }\n        ;\n        ;\n            var ib = this.stream.getCurrentExtraData().tagRects[this.hilitedTag], jb = new ga(((ib.t + ((ib.h() / 2)))), ib.r, ((ib.b + ((ea.isFacebox(this.hilitedTag) ? 10 : 0)))), ib.l, ib.domain);\n            return jb.contains(hb);\n        },\n        getVideoOnStage: function() {\n            var hb = ((this.stream && this.stream.getCurrentImageData()));\n            return ((hb && hb.video));\n        },\n        shouldPageOnAction: function(hb, ib) {\n            if (((!this.isOpen || this.isShowingLikePhotoConfirmation))) {\n                return false;\n            }\n        ;\n        ;\n            var jb = ((o.isNode(ib) && ((((z.byClass(ib, \"snowliftPager\") || z.byClass(ib, \"stagePagers\"))) || z.byClass(ib, \"pivotPageColumn\"))))), kb = ((o.isNode(ib) && z.byClass(ib, \"stage\"))), lb = m.hasClass(ib, \"faceBox\"), mb = ((((((((((((kb && m.hasClass(this.root, \"taggingMode\"))) || z.byClass(ib, \"tagBoxPending\"))) || z.byClass(ib, \"tagBoxPendingResponse\"))) || z.byClass(ib, \"fbPhotoTagApprovalBox\"))) || z.byClass(ib, \"tag\"))) || ((this.cropper && this.cropper.croppingMode))));\n            if (mb) {\n                return false;\n            }\n        ;\n        ;\n            return ((((((((((((((hb == u.LEFT)) || ((hb == u.RIGHT)))) || ((hb == cb)))) || ((hb == db)))) || ((!m.hasClass(this.root, \"taggingMode\") && lb)))) || jb)) || kb));\n        },\n        keyHandler: function(hb, JSBNG__event) {\n            if (((JSBNG__event.getModifiers().any || ((v.getTopmostLayer() !== this.spotlight))))) {\n                return true;\n            }\n        ;\n        ;\n            switch (q.getKeyCode(JSBNG__event)) {\n              case u.LEFT:\n            \n              case u.RIGHT:\n            \n              case cb:\n            \n              case db:\n                if (!this.pagersOnKeyboardNav) {\n                    this.showPagers(gb.PAGER_FADE);\n                }\n            ;\n            ;\n                this.pageListener(JSBNG__event);\n                return false;\n              case eb:\n                return this.toggleFullScreen();\n              case fb:\n                return this.likePhotoWithKey();\n            };\n        ;\n        },\n        shouldHandlePendingTag: function(JSBNG__event) {\n            var hb = this.getTagger();\n            if (!hb.tags.length) {\n                return false;\n            }\n        ;\n        ;\n            var ib = ea.absoluteToNormalizedPosition(this.getImage(), na.getEventPosition(JSBNG__event)), jb = hb.findNearestTag(ib);\n            if (((!jb || !m.hasClass(jb.node, \"tagBoxPending\")))) {\n                return false;\n            }\n        ;\n        ;\n            g.inform(\"PhotoTagApproval.PENDING_TAG_PHOTO_CLICK\", {\n                id: jb.id,\n                version: this.getVersionConst()\n            });\n            return true;\n        },\n        pageListener: function(JSBNG__event) {\n            var hb = q.getKeyCode(JSBNG__event), ib = JSBNG__event.getTarget();\n            if (!this.shouldPageOnAction(hb, ib)) {\n                return;\n            }\n        ;\n        ;\n            if (this.shouldHandlePendingTag(JSBNG__event)) {\n                return;\n            }\n        ;\n        ;\n            var jb = 0;\n            if (((((hb == u.RIGHT)) || ((hb == db))))) {\n                jb = 1;\n                ba.setPagingAction(\"key_right\");\n            }\n             else if (((((hb == u.LEFT)) || ((hb == cb))))) {\n                jb = -1;\n                ba.setPagingAction(\"key_left\");\n            }\n             else if (z.byClass(ib, \"next\")) {\n                jb = 1;\n                ba.setPagingAction(\"click_next\");\n            }\n             else if (z.byClass(ib, \"prev\")) {\n                jb = -1;\n                ba.setPagingAction(\"click_prev\");\n            }\n             else if (!this.stagePagerPrev) {\n                jb = 1;\n                ba.setPagingAction(\"click_stage\");\n            }\n             else {\n                jb = -1;\n                ba.setPagingAction(\"click_stage_back\");\n            }\n            \n            \n            \n            \n        ;\n        ;\n            var kb = o.scry(this.ufiForm, \"input.mentionsHidden\"), lb = false;\n            for (var mb = 0; ((mb < kb.length)); mb++) {\n                if (!s.isEmpty(kb[mb])) {\n                    lb = true;\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            if (((((lb || m.hasClass(this.root, \"fbPhotoSnowliftEditMode\"))) || ((this.cropper && this.cropper.croppingMode))))) {\n                this.warnLeavePage(jb);\n            }\n             else {\n                this.page(jb, ((ma.chrome() && r.isFullScreen())));\n                ab(\"snowlift\", ib, JSBNG__event).uai(ba.pagingAction);\n            }\n        ;\n        ;\n        },\n        warnLeavePage: function(hb) {\n            new n().setTitle(\"Are you sure you want to leave this page?\").setBody(\"You have unsaved changes that will be lost if you leave the page.\").setButtons([{\n                JSBNG__name: \"leave_page\",\n                label: \"Leave this Page\",\n                handler: this.page.bind(this, hb)\n            },{\n                JSBNG__name: \"continue_editing\",\n                label: \"Stay on this Page\",\n                className: \"inputaux\"\n            },]).setModal(true).show();\n        },\n        getUsesOpaqueCursor: function() {\n            return this.stream.getUsesOpaqueCursor();\n        },\n        getOpaqueCursor: function(hb) {\n            return this.stream.getOpaqueCursor(hb);\n        },\n        setReachedLeftEnd: function() {\n            this.stream.setReachedLeftEnd();\n        },\n        setReachedRightEnd: function() {\n            this.stream.setReachedRightEnd();\n        },\n        page: function(hb, ib) {\n            if (((!this.stream.isValidMovement(hb) || !this.stream.nonCircularPhotoSetCanPage(hb)))) {\n                this.showPagers(gb.PAGER_FADE);\n                return;\n            }\n        ;\n        ;\n            this.lastPage = JSBNG__Date.now();\n            this.unhiliteAllTags();\n            this.seenTags = [];\n            var jb = this.getVideoOnStage();\n            if (jb) {\n                this.switchVideo(jb, false);\n            }\n        ;\n        ;\n            if (((this.pivots && this.pivots.page(hb)))) {\n                return;\n            }\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.PAGE\");\n            ja.hide();\n            this.recacheData();\n            this.stream.moveCursor(hb);\n            m.hide(this.image);\n            if (this.stream.errorInCurrent()) {\n                this.setLoadingState(gb.STATE_HTML, true);\n                m.show(this.errorBox);\n                return;\n            }\n        ;\n        ;\n            var kb = this.stream.getCurrentImageData();\n            if (kb) {\n                var lb = this.getImageURL(kb);\n                if (lb) {\n                    this.switchImage(lb, null, true);\n                }\n                 else if (kb.video) {\n                    this.switchVideo(kb.video, true);\n                }\n                \n            ;\n            ;\n                if (!ib) {\n                    this.replaceUrl = true;\n                    wa(kb.info.permalink);\n                }\n            ;\n            ;\n                this.setLoadingState(gb.STATE_IMAGE_DATA, false);\n            }\n             else {\n                this.setLoadingState(gb.STATE_IMAGE_PIXELS, true);\n                this.setLoadingState(gb.STATE_IMAGE_DATA, true);\n            }\n        ;\n        ;\n            if (this.stream.getCurrentHtml()) {\n                this.swapData();\n            }\n             else this.setLoadingState(gb.STATE_HTML, true);\n        ;\n        ;\n            this.disableAds = this.disableAdsForSession;\n            this.loadAds();\n            if (this.cropper) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n            this.setLeftAndRightPagersState();\n        },\n        logImpressionDetailsForPhoto: function() {\n            var hb = [].concat(o.scry(oa(\"fbPhotoSnowliftTagList\"), \"input.photoImpressionDetails\"), o.scry(oa(\"fbPhotoSnowliftFeedback\"), \"input.photoImpressionDetails\"));\n            if (((hb.length === 0))) {\n                return;\n            }\n        ;\n        ;\n            var ib = {\n            };\n            for (var jb = 0; ((jb < hb.length)); jb++) {\n                ib[hb[jb].JSBNG__name] = hb[jb].value;\n            ;\n            };\n        ;\n            if (this.getVideoOnStage()) {\n                ib.width = 0;\n                ib.height = 0;\n            }\n             else {\n                var kb = this.getImageDimensions(this.stream.getCurrentImageData());\n                ib.width = kb.x;\n                ib.height = kb.y;\n            }\n        ;\n        ;\n            ba.addDetailData(this.stream.getCursor(), ib);\n            ca.setIsLogAdData(true);\n        },\n        loadAds: function() {\n            if (this.disableAds) {\n                return;\n            }\n        ;\n        ;\n            ca.loadAdsFromUserActivity();\n        },\n        transitionHandler: function(hb) {\n            if (((((((hb.getQueryData().closeTheater || hb.getQueryData().permPage)) || hb.getQueryData().makeprofile)) || this.returningToStart))) {\n                if (this.isOpen) {\n                    this.close();\n                }\n            ;\n            ;\n                this.transitionHandlerRegistered = false;\n                return false;\n            }\n        ;\n        ;\n            if (this.replaceUrl) {\n                this.replaceUrl = false;\n                this._uriStack.push(hb.getQualifiedURI().toString());\n                y.transitionComplete(true);\n                return true;\n            }\n        ;\n        ;\n            var ib = this._uriStack.length;\n            if (((((ib >= 2)) && ((this._uriStack[((ib - 2))] == hb.getQualifiedURI().toString()))))) {\n                this._uriStack.pop();\n            }\n        ;\n        ;\n            var jb = this.stream.getCursorForURI(hb.getUnqualifiedURI().toString());\n            if (jb) {\n                var kb = this.stream.getRelativeMovement(jb);\n                this.page(kb, true);\n                y.transitionComplete(false);\n                return true;\n            }\n        ;\n        ;\n            if (this.isOpen) {\n                y.transitionComplete(true);\n                this.close();\n                return true;\n            }\n        ;\n        ;\n            this.transitionHandlerRegistered = false;\n            return false;\n        },\n        recacheData: function() {\n            if (!this.loadingStates.html) {\n                var hb = this.stream.getCurrentHtml();\n                {\n                    var fin245keys = ((window.top.JSBNG_Replay.forInKeys)((hb))), fin245i = (0);\n                    var ib;\n                    for (; (fin245i < fin245keys.length); (fin245i++)) {\n                        ((ib) = (fin245keys[fin245i]));\n                        {\n                            hb[ib] = sa(oa(ib).childNodes);\n                            o.empty(oa(ib));\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        },\n        reloadIfTimeout: function() {\n            if (!t.hasLoaded(this.image)) {\n                var hb = this.makeNewImage(this.image.src, true);\n                q.listen(hb, \"load\", this.useImage.bind(this, hb, null, true));\n            }\n        ;\n        ;\n        },\n        useImage: function(hb, ib, jb) {\n            if (((jb && t.hasLoaded(this.image)))) {\n                return;\n            }\n        ;\n        ;\n            o.replace(this.image, hb);\n            this.image = hb;\n            g.inform(\"Amoeba/instrument\", [this.image,\"image\",], g.BEHAVIOR_PERSISTENT);\n            this.adjustStageSize(ib);\n        },\n        makeNewImage: function(hb, ib) {\n            if (this.imageLoadingTimer) {\n                JSBNG__clearTimeout(this.imageLoadingTimer);\n                this.imageLoadingTimer = null;\n            }\n             else if (!ib) {\n                this.imageRefreshTimer = JSBNG__setTimeout(this.reloadIfTimeout.bind(this), gb.LOADING_TIMEOUT);\n            }\n            \n        ;\n        ;\n            var jb = o.create(\"img\", {\n                className: \"spotlight\",\n                alt: \"\"\n            });\n            jb.setAttribute(\"aria-describedby\", \"fbPhotosSnowliftCaption\");\n            jb.setAttribute(\"aria-busy\", \"true\");\n            q.listen(jb, \"load\", pa(function() {\n                JSBNG__clearTimeout(this.imageRefreshTimer);\n                this.image.setAttribute(\"aria-busy\", \"false\");\n                this.setLoadingState(this.STATE_IMAGE_PIXELS, false);\n                (function() {\n                    if (this.isOpen) {\n                        this.adjustStageSize();\n                        this.adjustForNewData();\n                    }\n                ;\n                ;\n                }).bind(this).defer();\n            }.bind(this), \"photo_theater\"));\n            jb.src = hb;\n            return jb;\n        },\n        switchImage: function(hb, ib, jb) {\n            m.hide(this.image);\n            m.hide(this.errorBox);\n            this.setLoadingState(this.STATE_IMAGE_PIXELS, true);\n            var kb = ((this.stream && this.stream.getCurrentImageData()));\n            if (kb) {\n                ba.addPhotoView(kb.info, this.shouldShowHiRes(kb), ((this.fullscreen && r.isFullScreen())));\n            }\n        ;\n        ;\n            this.useImage(this.makeNewImage(hb, false), ib, false);\n            if (jb) {\n                this.stream.preloadImages(this.shouldShowHiRes(kb));\n            }\n        ;\n        ;\n            if (((this.cropper && this.cropper.croppingMode))) {\n                this.cropper.resetPhoto();\n            }\n        ;\n        ;\n            g.inform(\"PhotoSnowlift.SWITCH_IMAGE\");\n        },\n        switchVideo: function(hb, ib) {\n            var jb = ((\"swf_\" + hb));\n            if (ib) {\n                m.addClass(this.stageWrapper, \"showVideo\");\n                var kb = o.create(\"div\", {\n                    className: \"videoStageContainer\"\n                });\n                o.appendContent(this.videoStage, kb);\n                kb.id = hb;\n                if (((window[jb] && !va(jb)))) {\n                    window[jb].write(hb);\n                }\n            ;\n            ;\n                var lb = ((\"video_warning_\" + hb)), mb = va(hb);\n                if (!this.videoWarnings) {\n                    this.videoWarnings = [];\n                }\n            ;\n            ;\n                if (((mb && this.videoWarnings[lb]))) {\n                    o.setContent(mb, this.videoWarnings[lb]);\n                }\n            ;\n            ;\n                this.adjustStageSizeForVideo.bind(this, jb).defer();\n            }\n             else {\n                ((window[jb] && window[jb].addVariable(\"video_autoplay\", 0)));\n                ((this.videoLoadTimer && JSBNG__clearTimeout(this.videoLoadTimer)));\n                o.empty(this.videoStage);\n                m.removeClass(this.stageWrapper, \"showVideo\");\n            }\n        ;\n        ;\n        },\n        checkVideoStatus: function(hb) {\n            if (this.videoLoadTimer) {\n                JSBNG__clearTimeout(this.videoLoadTimer);\n            }\n        ;\n        ;\n            var ib = this.getVideoOnStage();\n            if (!ib) {\n                return;\n            }\n             else {\n                var jb = ((\"swf_\" + ib));\n                if (((hb !== jb))) {\n                    return;\n                }\n            ;\n            ;\n                this.adjustStageSizeForVideo(hb);\n            }\n        ;\n        ;\n        },\n        adjustStageSizeForVideo: function(hb) {\n            var ib = va(hb);\n            if (!ib) {\n                this.videoLoadTimer = JSBNG__setTimeout(this.checkVideoStatus.bind(this, hb), 200);\n            }\n             else this.adjustStageSize(new na(ib.width, ib.height));\n        ;\n        ;\n        },\n        handleServerError: function(hb, ib) {\n            o.setContent(this.errorBox, hb);\n            this.storeFromData(ib);\n        },\n        swapData: function() {\n            var hb, ib = this.stream.getCurrentHtml();\n            if (ib) {\n                this.setLoadingState(gb.STATE_HTML, false);\n                {\n                    var fin246keys = ((window.top.JSBNG_Replay.forInKeys)((ib))), fin246i = (0);\n                    var jb;\n                    for (; (fin246i < fin246keys.length); (fin246i++)) {\n                        ((jb) = (fin246keys[fin246i]));\n                        {\n                            hb = va(jb);\n                            ((hb && o.setContent(hb, ib[jb])));\n                        };\n                    };\n                };\n            ;\n                g.inform(\"PhotoSnowlift.DATA_CHANGE\", this.stream.getCurrentImageData().info, g.BEHAVIOR_STATE);\n                if (this.stream.getCurrentExtraData()) {\n                    g.inform(\"PhotoSnowlift.EXTRA_DATA_CHANGE\", this.stream.getCurrentExtraData(), g.BEHAVIOR_STATE);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.adjustScroller();\n            this.adjustStageSize();\n            this.scrollableArea.showScrollbar(false);\n            this.adjustForNewData();\n            this.logImpressionDetailsForPhoto();\n            if (this.showFlashTags) {\n                this.flashAllTags();\n            }\n        ;\n        ;\n        },\n        updateTotalCount: function(hb, ib, jb) {\n            var kb = this.stream.getCurrentHtml();\n            if (kb) {\n                var lb = oa(\"fbPhotoSnowliftPositionAndCount\");\n                o.replace(lb, jb);\n                lb = jb;\n                m.show(lb);\n                var mb = \"fbPhotoSnowliftPositionAndCount\";\n                kb[mb] = sa(lb.childNodes);\n            }\n        ;\n        ;\n            this.stream.setTotalCount(hb);\n            this.stream.setFirstCursorIndex(ib);\n        },\n        addPhotoFbids: function(hb, ib, jb, kb) {\n            if (((((kb && this.sessionID)) && ((kb != this.sessionID))))) {\n                return;\n            }\n        ;\n        ;\n            var lb = ((this.stream.getCursor() === null));\n            this.stream.attachToFbidsList(hb, ib, jb);\n            if (((jb && lb))) {\n                this.page(0, true);\n            }\n        ;\n        ;\n            if (((this.pivots && jb))) {\n                this.pivots.setCycleCount(this.stream.calculateDistance(this.stream.getCursor(), this.stream.firstCursor));\n            }\n        ;\n        ;\n            if (((!this.pagersShown && this.stream.canPage()))) {\n                this.setStagePagersState(\"ready\");\n            }\n        ;\n        ;\n            this.setLeftAndRightPagersState();\n        },\n        attachTagger: function(hb) {\n            o.appendContent(this.stageActions, hb);\n        },\n        storeFromData: function(hb) {\n            if (!this.isOpen) {\n                return;\n            }\n        ;\n        ;\n            if (((((hb.ssid && this.sessionID)) && ((this.sessionID != hb.ssid))))) {\n                return;\n            }\n        ;\n        ;\n            var ib = this.stream.storeToCache(hb);\n            if (((\"error\" in ib))) {\n                this.checkState(gb.STATE_ERROR);\n                return;\n            }\n        ;\n        ;\n            if (((\"init\" in ib))) {\n                this.initDataFetched(ib.init);\n                if (this.openExplicitly) {\n                    this.replaceUrl = true;\n                    wa(this.stream.getCurrentImageData().info.permalink);\n                }\n            ;\n            ;\n                if (this.stream.canPage()) {\n                    this.setStagePagersState(\"ready\");\n                }\n            ;\n            ;\n                this.setLeftAndRightPagersState();\n                ((this.ua && this.ua.add_event(\"ufi\")));\n            }\n        ;\n        ;\n            if (((\"image\" in ib))) {\n                this.checkState(gb.STATE_IMAGE_DATA);\n            }\n        ;\n        ;\n            if (((\"data\" in ib))) {\n                this.checkState(gb.STATE_HTML);\n            }\n        ;\n        ;\n        },\n        setLeftAndRightPagersState: function() {\n            if (this.stream.isNonCircularPhotoSet()) {\n                m.conditionClass(this.root, \"disableLeft\", !this.stream.nonCircularPhotoSetCanPage(-1));\n                m.conditionClass(this.root, \"disableRight\", !this.stream.nonCircularPhotoSetCanPage(1));\n            }\n        ;\n        ;\n        },\n        setStagePagersState: function(hb) {\n            switch (hb) {\n              case \"ready\":\n                m.addClass(this.root, \"pagingReady\");\n                this.pagersShown = true;\n                ((this.ua && this.ua.add_event(\"arrows\")));\n                return;\n              case \"active\":\n                m.addClass(this.root, \"pagingActivated\");\n                return;\n              case \"inactive\":\n                m.removeClass(this.root, \"pagingActivated\");\n                return;\n              case \"disabled\":\n            \n              case \"reset\":\n                m.removeClass(this.root, \"pagingReady\");\n                return;\n            };\n        ;\n        },\n        deletePhoto: function(hb) {\n            this.closeRefresh();\n        },\n        closeRefresh: function() {\n            this.refreshOnClose = true;\n            this.closeHandler();\n        },\n        onHiliteTag: function(hb, ib) {\n            if (((ib.version != aa.VIEWER_SNOWLIFT))) {\n                return;\n            }\n        ;\n        ;\n            var jb = ib.tag;\n            if (jb) {\n                this.switchHilitedTags(jb, true);\n            }\n        ;\n        ;\n        },\n        onUpdateTagBox: function(hb, ib) {\n            if (((ib.version == aa.VIEWER_SNOWLIFT))) {\n                this.updateTagBox(ib.id, ib.approve);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = gb;\n});\n__d(\"Spotlight\", [\"JSXDOM\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"DOM\",\"Layer\",\"LayerAutoFocus\",\"LayerTabIsolation\",\"ModalLayer\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"DOM\"), l = b(\"Layer\"), m = b(\"LayerAutoFocus\"), n = b(\"LayerTabIsolation\"), o = b(\"ModalLayer\"), p = b(\"Vector\"), q = b(\"copyProperties\"), r = b(\"csx\"), s = b(\"cx\");\n    function t(v, w) {\n        this.parent.construct(this, v, w);\n        this.stageMinSize = new p(0, 0);\n        this.stagePadding = new p(0, 0);\n    };\n;\n    j.extend(t, l);\n    q(t.prototype, i, {\n        stageMinSize: null,\n        stagePadding: null,\n        _buildWrapper: function(v, w) {\n            return (g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__root -cx-PRIVATE-ModalLayer__dark\"\n            }, g.div({\n                className: \"-cx-PRIVATE-uiSpotlight__container\"\n            }, w)));\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([u,m,n,o,]);\n        },\n        getContentRoot: function() {\n            if (!this._content) {\n                this._content = k.JSBNG__find(this.getRoot(), \"div.-cx-PRIVATE-uiSpotlight__content\");\n            }\n        ;\n        ;\n            return this._content;\n        },\n        configure: function(v) {\n            if (v.stageMinSize) {\n                this.stageMinSize = v.stageMinSize;\n            }\n        ;\n        ;\n            if (v.stagePadding) {\n                this.stagePadding = v.stagePadding;\n            }\n        ;\n        ;\n        },\n        onContentLoaded: function() {\n            this.inform(\"content-load\");\n        },\n        updatePermalink: function(v) {\n            this.inform(\"permalinkchange\", v);\n        }\n    });\n    function u(v) {\n        this._layer = v;\n    };\n;\n    q(u.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe([\"show\",\"hide\",], function(v, w) {\n                if (((v === \"show\"))) {\n                    h.inform(\"layer_shown\", {\n                        type: \"Spotlight\"\n                    });\n                }\n                 else h.inform(\"layer_hidden\", {\n                    type: \"Spotlight\"\n                });\n            ;\n            ;\n            });\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        }\n    });\n    e.exports = t;\n});");
// 13130
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o25,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ya/r/pKyqR8GP59i.js",o180);
// undefined
o25 = null;
// undefined
o180 = null;
// 13135
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"OYzUx\",]);\n}\n;\n__d(\"ComposerXAttachmentBootstrap\", [\"CSS\",\"Form\",\"Parent\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Form\"), i = b(\"Parent\"), j = b(\"URI\"), k = b(\"cx\"), l = [], m = {\n        bootstrap: function(n) {\n            m.load(i.byTag(n, \"form\"), n.getAttribute(\"data-endpoint\"));\n        },\n        load: function(n, o, p) {\n            var q = j(o).addQueryData({\n                composerurihash: m.getURIHash(o)\n            });\n            g.conditionClass(n, \"-cx-PRIVATE-fbComposerAttachment__hidespinner\", p);\n            var r = i.byClass(n, \"-cx-PRIVATE-fbComposer__attachmentform\");\n            g.removeClass(r, \"async_saving\");\n            h.setDisabled(n, false);\n            n.action = q.toString();\n            h.bootstrap(n);\n        },\n        getURIHash: function(n) {\n            if ((n === \"initial\")) {\n                return \"initial\"\n            };\n            var o = l.indexOf(n);\n            if ((o !== -1)) {\n                return (o + \"\");\n            }\n             else {\n                o = l.length;\n                l[o] = n;\n                return (o + \"\");\n            }\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ComposerXStore\", [\"function-extensions\",\"Arbiter\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ge\"), i = {\n    };\n    function j(l, m) {\n        return (((\"ComposerX/\" + l) + \"/\") + m);\n    };\n    var k = {\n        set: function(l, m, n) {\n            if (!i[l]) {\n                i[l] = {\n                };\n            };\n            i[l][m] = n;\n            g.inform(j(l, m), {\n            }, g.BEHAVIOR_STATE);\n        },\n        get: function(l, m) {\n            if (i[l]) {\n                return i[l][m]\n            };\n            return null;\n        },\n        getAllForComposer: function(l) {\n            return (i[l] || {\n            });\n        },\n        waitForComponents: function(l, m, n) {\n            g.registerCallback(n, m.map(j.curry(l)));\n        }\n    };\n    g.subscribe(\"page_transition\", function() {\n        for (var l in i) {\n            if (!h(l)) {\n                delete i[l];\n            };\n        };\n    });\n    e.exports = k;\n});\n__d(\"ComposerX\", [\"Arbiter\",\"ComposerXAttachmentBootstrap\",\"ComposerXStore\",\"CSS\",\"DOM\",\"DOMQuery\",\"copyProperties\",\"csx\",\"cx\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXAttachmentBootstrap\"), i = b(\"ComposerXStore\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"getObjectValues\"), q = \"any\";\n    function r(s) {\n        this._root = s;\n        this._composerID = s.id;\n        this._attachments = {\n        };\n        this._attachmentFetchForm = l.find(s, \".-cx-PRIVATE-fbComposer__attachmentform\");\n        this._resetSubscription = g.subscribe(\"composer/publish\", function(t, u) {\n            if ((u.composer_id === this._composerID)) {\n                this.reset();\n            };\n        }.bind(this));\n    };\n    m(r.prototype, {\n        _endpointHashToShow: q,\n        _lastFetchEndpoint: \"\",\n        _initialAttachmentEndpoint: \"\",\n        getAttachment: function(s, t) {\n            var u = h.getURIHash(s);\n            this._endpointHashToShow = u;\n            var v = this._attachments[u];\n            if (v) {\n                this._showAttachmentAfterComponentsLoaded(u);\n            }\n             else this.fetchAttachmentData(s, t);\n        ;\n        },\n        fetchAttachmentData: function(s, t) {\n            var u = h.getURIHash(s);\n            if (this._attachments[u]) {\n                return\n            };\n            if ((s !== this._lastFetchEndpoint)) {\n                h.load(this._attachmentFetchForm, s, t);\n                this._lastFetchEndpoint = s;\n            }\n        ;\n        },\n        setAttachment: function(s, t, u, v) {\n            this._setupAttachment(s, t, u, v);\n            this._showAttachmentAfterComponentsLoaded(s);\n        },\n        setInitialAttachment: function(s, t, u, v) {\n            var w = h.getURIHash(s);\n            this._setupAttachment(w, t, u, v);\n            this._initialAttachmentEndpoint = s;\n            if (!this._currentInstance) {\n                this._showAttachmentAfterComponentsLoaded(w);\n            };\n        },\n        setComponent: function(s, t) {\n            if (!i.get(this._composerID, s)) {\n                i.set(this._composerID, s, t);\n                k.appendContent(this._attachmentFetchForm, k.create(\"input\", {\n                    type: \"hidden\",\n                    name: \"loaded_components[]\",\n                    value: s\n                }));\n            }\n        ;\n        },\n        reset: function() {\n            if (this._currentInstance) {\n                this._currentInstance.cleanup();\n                this._currentInstance = null;\n            }\n        ;\n            for (var s in this._attachments) {\n                this._attachments[s].instance.reset();;\n            };\n            var t = i.getAllForComposer(this._composerID);\n            p(t).forEach(function(u) {\n                if (u.reset) {\n                    u.reset(u);\n                };\n            });\n            this.getAttachment(this._initialAttachmentEndpoint);\n            g.inform(\"composer/reset\");\n        },\n        destroy: function() {\n            if (this._resetSubscription) {\n                this._resetSubscription.unsubscribe();\n                this._resetSubscription = null;\n            }\n        ;\n        },\n        addPlaceholders: function(s, t) {\n            var u;\n            for (var v in this._attachments) {\n                u = this._attachments[v];\n                if ((u.instance === s)) {\n                    t.forEach(function(w) {\n                        u.placeholders.push(w);\n                        u.required_components.push(w.component_name);\n                    });\n                    break;\n                }\n            ;\n            };\n            if ((this._currentInstance === s)) {\n                this._fillPlaceholders(t);\n            };\n        },\n        _setupAttachment: function(s, t, u, v) {\n            t.setComposerID(this._composerID);\n            this._attachments[s] = {\n                instance: t,\n                placeholders: u,\n                required_components: v\n            };\n            var w = l.find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), x = t.getRoot();\n            if ((x.parentNode !== w)) {\n                j.hide(x);\n                k.appendContent(w, x);\n            }\n        ;\n        },\n        _showAttachment: function(s, t, u) {\n            if ((this._currentInstance === s)) {\n                return\n            };\n            if ((this._endpointHashToShow === q)) {\n                this._endpointHashToShow = null;\n            }\n             else if ((this._endpointHashToShow !== t)) {\n                return\n            }\n        ;\n            if (this._currentInstance) {\n                if (!this._currentInstance.canSwitchAway()) {\n                    return\n                };\n                this._currentInstance.cleanup();\n            }\n        ;\n            this._currentInstance = s;\n            var v = l.find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), w = v.childNodes, x = s.getRoot();\n            for (var y = 0; (y < w.length); y++) {\n                if ((w[y] !== x)) {\n                    j.hide(w[y]);\n                };\n            };\n            j.show(x);\n            this._fillPlaceholders(u);\n            var z = h.getURIHash(this._initialAttachmentEndpoint), aa = (t === z);\n            s.initWithComponents(aa);\n            this._setAttachmentSelectedClass(s.attachmentClassName);\n            g.inform(\"composer/initializedAttachment\", {\n                composerRoot: this._root,\n                isInitial: aa\n            });\n        },\n        _showAttachmentAfterComponentsLoaded: function(s) {\n            var t = this._attachments[s];\n            i.waitForComponents(this._composerID, t.required_components, this._showAttachment.bind(this, t.instance, s, t.placeholders));\n        },\n        _fillPlaceholders: function(s) {\n            s.forEach(function(t) {\n                var u = i.get(this._composerID, t.component_name);\n                if ((t.element !== u.element.parentNode)) {\n                    k.setContent(t.element, u.element);\n                };\n            }.bind(this));\n        },\n        _setAttachmentSelectedClass: function(s) {\n            var t = l.scry(this._root, \".-cx-PUBLIC-fbComposerAttachment__selected\")[0], u;\n            if (t) {\n                j.removeClass(t, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                u = l.scry(t, \"*[aria-pressed=\\\"true\\\"]\")[0];\n                if (u) {\n                    u.setAttribute(\"aria-pressed\", \"false\");\n                };\n            }\n        ;\n            if (s) {\n                var v = l.scry(this._root, (\".\" + s))[0];\n                if (v) {\n                    j.addClass(v, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                    u = l.scry(v, \"*[aria-pressed=\\\"false\\\"]\")[0];\n                    if (u) {\n                        u.setAttribute(\"aria-pressed\", \"true\");\n                    };\n                }\n            ;\n            }\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerXAttachment\", [\"ComposerXStore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ComposerXStore\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n    h(j.prototype, {\n        getRoot: i,\n        initWithComponents: function(k) {\n        \n        },\n        cleanup: i,\n        reset: i,\n        attachmentClassName: \"\",\n        getComponent: function(k) {\n            return g.get(this._composerID, k);\n        },\n        canSwitchAway: i.thatReturnsTrue,\n        setComposerID: function(k) {\n            this._composerID = k;\n        },\n        allowOGTagPreview: function() {\n            return false;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXController\", [\"Arbiter\",\"ComposerX\",\"ComposerXAttachmentBootstrap\",\"Parent\",\"$\",\"cx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerX\"), i = b(\"ComposerXAttachmentBootstrap\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = b(\"ge\"), o = {\n    };\n    function p(r) {\n        var s = j.byClass(k(r), \"-cx-PRIVATE-fbComposer__root\"), t = s.id;\n        if (!o[t]) {\n            o[t] = new h(s);\n        };\n        return o[t];\n    };\n    var q = {\n        getAttachment: function(r, s, t) {\n            var u = p(r);\n            u.getAttachment(s, t);\n        },\n        fetchAttachmentData: function(r, s, t) {\n            p(r).fetchAttachmentData(s, t);\n        },\n        setAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setAttachment(s, t, u, v);\n        },\n        setInitialAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setInitialAttachment(s, t, u, v);\n        },\n        setComponent: function(r, s, t) {\n            var u = p(r);\n            u.setComponent(s, t);\n        },\n        reset: function(r) {\n            var s = p(r);\n            s.reset();\n        },\n        holdTheMarkup: m,\n        getEndpoint: function(r, s, t) {\n            var u = p(r);\n            i.load(u._attachmentFetchForm, s, t);\n        },\n        addPlaceholders: function(r, s, t) {\n            var u = p(r);\n            u.addPlaceholders(s, t);\n        }\n    };\n    i.bootstrap = function(r) {\n        q.getAttachment(r, r.getAttribute(\"data-endpoint\"));\n    };\n    g.subscribe(\"page_transition\", function() {\n        for (var r in o) {\n            if (!n(r)) {\n                o[r].destroy();\n                delete o[r];\n            }\n        ;\n        };\n    });\n    e.exports = q;\n});\n__d(\"DragDropFileUpload\", [], function(a, b, c, d, e, f) {\n    f.isSupported = function() {\n        return (typeof (FileList) !== \"undefined\");\n    };\n});\n__d(\"DocumentDragDrop\", [\"Event\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMQuery\",\"DragDropFileUpload\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DragDropFileUpload\"), m = b(\"emptyFunction\"), n = b(\"getObjectValues\"), o = {\n    }, p = 0;\n    function q() {\n        p = 0;\n        n(o).forEach(function(t) {\n            i.removeClass(t.element, t.className);\n            h.inform(\"dragleave\", {\n                element: t.element\n            });\n        });\n    };\n    function r() {\n        if (!l.isSupported()) {\n            return\n        };\n        g.listen(document, \"dragenter\", function(u) {\n            if ((p === 0)) {\n                n(o).forEach(function(v) {\n                    i.addClass(v.element, v.className);\n                    h.inform(\"dragenter\", {\n                        element: v.element,\n                        event: u\n                    });\n                });\n            };\n            p++;\n        });\n        g.listen(document, \"dragleave\", function(u) {\n            p--;\n            if ((p === 0)) {\n                q();\n            };\n        });\n        g.listen(document, \"drop\", function(u) {\n            var v = u.getTarget();\n            if (k.isNodeOfType(u.getTarget(), \"input\")) {\n                if ((v.type === \"file\")) {\n                    return\n                }\n            };\n            u.prevent();\n        });\n        g.listen(document, \"dragover\", g.prevent);\n        var t = null;\n        document.addEventListener(\"dragover\", function() {\n            (t && clearTimeout(t));\n            t = setTimeout(q, 839);\n        }, true);\n        r = m;\n    };\n    var s = {\n        registerStatusElement: function(t, u) {\n            r();\n            o[j.getID(t)] = {\n                element: t,\n                className: u\n            };\n        },\n        removeStatusElement: function(t) {\n            var u = j.getID(t), v = o[u];\n            i.removeClass(v.element, v.className);\n            delete o[u];\n        }\n    };\n    e.exports = s;\n});\n__d(\"DragDropTarget\", [\"Event\",\"CSS\",\"DocumentDragDrop\",\"DragDropFileUpload\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DocumentDragDrop\"), j = b(\"DragDropFileUpload\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this._element = n;\n        this._listeners = [];\n        this._statusElem = n;\n        this._dragEnterCount = 0;\n        this._enabled = false;\n    };\n    k(m.prototype, {\n        _onFilesDropCallback: l,\n        _onURLDropCallback: l,\n        _onPlainTextDropCallback: l,\n        _onDropCallback: l,\n        _fileFilterFn: l.thatReturnsArgument,\n        setOnFilesDropCallback: function(n) {\n            this._onFilesDropCallback = n;\n            return this;\n        },\n        setOnURLDropCallback: function(n) {\n            this._onURLDropCallback = n;\n            return this;\n        },\n        setOnPlainTextDropCallback: function(n) {\n            this._onPlainTextDropCallback = n;\n            return this;\n        },\n        setOnDropCallback: function(n) {\n            this._onDropCallback = n;\n            return this;\n        },\n        enable: function() {\n            if (!j.isSupported()) {\n                return this\n            };\n            i.registerStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            this._listeners.push(g.listen(this._element, \"dragenter\", this._onDragEnter.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragleave\", this._onDragLeave.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragover\", g.kill));\n            this._listeners.push(g.listen(this._element, \"drop\", function(n) {\n                this._dragEnterCount = 0;\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n                var o = {\n                }, p = false, q = this._fileFilterFn(n.dataTransfer.files);\n                if (q.length) {\n                    this._onFilesDropCallback(q, n);\n                    o.files = q;\n                    p = true;\n                }\n            ;\n                var r = (n.dataTransfer.getData(\"url\") || n.dataTransfer.getData(\"text/uri-list\"));\n                if (r) {\n                    this._onURLDropCallback(r, n);\n                    o.url = r;\n                    p = true;\n                }\n            ;\n                var s = n.dataTransfer.getData(\"text/plain\");\n                if (s) {\n                    this._onPlainTextDropCallback(s, n);\n                    o.plainText = s;\n                    p = true;\n                }\n            ;\n                if (p) {\n                    this._onDropCallback(o, n);\n                };\n                n.kill();\n            }.bind(this)));\n            this._enabled = true;\n            return this;\n        },\n        disable: function() {\n            if (!this._enabled) {\n                return this\n            };\n            i.removeStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            h.removeClass(this._statusElem, \"fbDropReady\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n            h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            this._enabled = false;\n            return this;\n        },\n        setFileFilter: function(n) {\n            this._fileFilterFn = n;\n            return this;\n        },\n        setStatusElement: function(n) {\n            this._statusElem = n;\n            return this;\n        },\n        _onDragEnter: function(n) {\n            if ((this._dragEnterCount === 0)) {\n                var o = n.dataTransfer.items, p = false;\n                for (var q = 0; (q < o.length); q++) {\n                    if (!o[q].type.match(\"image/*\")) {\n                        p = true;\n                        break;\n                    }\n                ;\n                };\n                h.addClass(this._statusElem, \"fbDropReady\");\n                if (p) {\n                    h.addClass(this._statusElem, \"fbDropReadyLink\");\n                }\n                 else if ((o.length > 1)) {\n                    h.addClass(this._statusElem, \"fbDropReadyPhotos\");\n                }\n                 else h.addClass(this._statusElem, \"fbDropReadyPhoto\");\n                \n            ;\n            }\n        ;\n            this._dragEnterCount++;\n        },\n        _onDragLeave: function() {\n            this._dragEnterCount = Math.max((this._dragEnterCount - 1), 0);\n            if ((this._dragEnterCount === 0)) {\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ComposerXDragDrop\", [\"Arbiter\",\"ComposerXController\",\"CSS\",\"DragDropTarget\",\"DOMQuery\",\"Parent\",\"URI\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXController\"), i = b(\"CSS\"), j = b(\"DragDropTarget\"), k = b(\"DOMQuery\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = \"/ajax/composerx/attachment/media/upload/\", r = \"/ajax/composerx/attachment/link/scraper/\", s = function(u) {\n        u();\n    };\n    function t(u, v, w, x) {\n        this._root = u;\n        this._composerID = v;\n        this._targetID = w;\n        x = (x || s);\n        this._dragdrop = new j(u).setOnFilesDropCallback(function(y) {\n            x(this._uploadFiles.bind(this, y));\n        }.bind(this)).setFileFilter(t.filterImages).enable();\n        t.handleDragEnterAndLeave(u);\n        g.subscribe(\"composer/deactivateDragdrop\", function() {\n            this.deactivate();\n        }.bind(this));\n        g.subscribe(\"composer/reactivateDragdrop\", function() {\n            this.reactivate();\n        }.bind(this));\n    };\n    n(t, {\n        handleDragEnterAndLeave: function(u) {\n            var v = k.scry(l.byClass(u, \"-cx-PRIVATE-fbComposer__root\"), \".-cx-PUBLIC-fbComposerAttachment__nub\");\n            g.subscribe(\"dragenter\", function(w, x) {\n                if ((u == x.element)) {\n                    v.forEach(i.hide);\n                };\n            });\n            g.subscribe(\"dragleave\", function(w, x) {\n                if ((u == x.element)) {\n                    v.forEach(i.show);\n                };\n            });\n        },\n        filterImages: function(u) {\n            var v = [];\n            for (var w = 0; (w < u.length); w++) {\n                if (u[w].type.match(\"image/*\")) {\n                    v.push(u[w]);\n                };\n            };\n            return v;\n        }\n    });\n    n(t.prototype, {\n        enableURLDropping: function() {\n            this._dragdrop.setOnURLDropCallback(this._onURLDrop.bind(this));\n        },\n        deactivate: function() {\n            this._dragdrop.disable();\n        },\n        reactivate: function() {\n            this._dragdrop.enable();\n        },\n        _uploadFiles: function(u) {\n            h.getAttachment(this._root, q);\n            g.inform(((\"ComposerXFilesStore/filesDropped/\" + this._composerID) + \"/mediaupload\"), {\n                files: u\n            }, g.BEHAVIOR_PERSISTENT);\n        },\n        _onURLDrop: function(u) {\n            var v = new m(r);\n            v.addQueryData({\n                scrape_url: encodeURIComponent(u)\n            });\n            h.getAttachment(this._root, v.toString());\n        }\n    });\n    e.exports = t;\n});\n__d(\"curry\", [\"bind\",], function(a, b, c, d, e, f) {\n    var g = b(\"bind\"), h = g(null, g, null);\n    e.exports = h;\n});\n__d(\"Popover\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualLayer\",\"ContextualLayerHideOnScroll\",\"CSS\",\"DataStore\",\"DOM\",\"Focus\",\"Keys\",\"KeyStatus\",\"LayerHideOnEscape\",\"Toggler\",\"copyProperties\",\"curry\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerHideOnScroll\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Focus\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"LayerHideOnEscape\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"curry\");\n    s.subscribe([\"show\",\"hide\",], function(w, x) {\n        var y = m.get(x.getActive(), \"Popover\");\n        if (y) {\n            if ((w === \"show\")) {\n                y.showLayer();\n            }\n             else y.hideLayer();\n        \n        };\n    });\n    function v(w, x, y, z) {\n        this._root = w;\n        this._triggerElem = x;\n        this._behaviors = y;\n        this._config = (z || {\n        });\n        this._disabled = !!this._config.disabled;\n        this._listeners = [];\n        if ((!this._disabled && (((x.nodeName !== \"A\") || (x.rel !== \"toggle\"))))) {\n            this._setupClickListener();\n        };\n        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\n            };\n        },\n        showLayer: function() {\n            this.ensureInit();\n            this._layer.show();\n            s.show(this._root);\n            l.addClass(this._root, \"selected\");\n            this.inform(\"show\");\n            this._triggerElem.setAttribute(\"aria-expanded\", \"true\");\n        },\n        getLayer: function() {\n            return this._layer;\n        },\n        hideLayer: function() {\n            this._layer.hide();\n            this._triggerElem.setAttribute(\"aria-expanded\", \"false\");\n        },\n        isShown: function() {\n            return (this._layer && this._layer.isShown());\n        },\n        setLayerContent: function(w) {\n            this.ensureInit();\n            this._layer.setContent(w);\n        },\n        _init: function() {\n            var w = new j({\n                context: this._triggerElem,\n                position: \"below\"\n            }, n.create(\"div\"));\n            w.enableBehaviors([k,r,]);\n            s.createInstance(w.getRoot()).setSticky(false);\n            w.subscribe(\"hide\", this._onLayerHide.bind(this));\n            (this._behaviors && w.enableBehaviors(this._behaviors));\n            this._layer = w;\n            if (this._config.alignh) {\n                this._layer.setAlignment(this._config.alignh);\n            };\n            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\n            };\n            this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        _onLayerHide: function() {\n            s.hide(this._root);\n            l.removeClass(this._root, \"selected\");\n            this.inform(\"hide\");\n            if ((q.getKeyDownCode() === p.ESC)) {\n                o.set(this._triggerElem);\n            };\n        },\n        enable: function() {\n            if (!this._disabled) {\n                return\n            };\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return\n            };\n            if (this.isShown()) {\n                this.hideLayer();\n            };\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            if ((this._triggerElem.getAttribute(\"rel\") === \"toggle\")) {\n                this._triggerElem.removeAttribute(\"rel\");\n            };\n            this._disabled = true;\n        },\n        _setupClickListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"click\", u(s.bootstrap, this._triggerElem)));\n        },\n        _setupKeyListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"keydown\", this._handleKeyEvent.bind(this)));\n        },\n        _handleKeyEvent: function(event) {\n            if (event.getModifiers().any) {\n                return\n            };\n            switch (g.getKeyCode(event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n            event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ARIA\"), k = b(\"BehaviorsMixin\"), l = b(\"Focus\"), m = b(\"Keys\"), n = b(\"KeyStatus\"), o = b(\"copyProperties\");\n    function p(q, r, s, t) {\n        this._popover = q;\n        this._triggerElem = r;\n        this._initialMenu = s;\n        q.subscribe(\"init\", this._onLayerInit.bind(this));\n        q.subscribe(\"show\", this._onPopoverShow.bind(this));\n        q.subscribe(\"hide\", this._onPopoverHide.bind(this));\n        g.listen(this._triggerElem, \"keydown\", this._handleKeyEventOnTrigger.bind(this));\n        (t && this.enableBehaviors(t));\n    };\n    o(p.prototype, i, k);\n    o(p.prototype, {\n        _popoverShown: false,\n        setMenu: function(q) {\n            this._menu = q;\n            var r = q.getRoot();\n            this._popover.setLayerContent(r);\n            q.subscribe(\"done\", this._onMenuDone.bind(this));\n            if (this._popoverShown) {\n                this._menu.onShow();\n            };\n            j.owns(this._triggerElem, r);\n            this.inform(\"setMenu\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        getPopover: function() {\n            return this._popover;\n        },\n        getTriggerElem: function() {\n            return this._triggerElem;\n        },\n        getMenu: function() {\n            return this._menu;\n        },\n        _onLayerInit: function() {\n            this.setMenu(this._initialMenu);\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _onPopoverShow: function() {\n            if (this._menu) {\n                this._menu.onShow();\n            };\n            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\n            };\n            this._popoverShown = false;\n        },\n        _handleKeyEvent: function(q, r) {\n            var s = g.getKeyCode(r);\n            if ((s === m.TAB)) {\n                this._popover.hideLayer();\n                l.set(this._triggerElem);\n                return;\n            }\n        ;\n            if (r.getModifiers().any) {\n                return\n            };\n            switch (s) {\n              case m.RETURN:\n                return;\n              case m.UP:\n            \n              case m.DOWN:\n                this._menu.handleKeydown(s, r);\n                break;\n              default:\n                if ((this._menu.handleKeydown(s, r) === false)) {\n                    this._menu.blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n                break;\n            };\n            r.prevent();\n        },\n        _handleKeyEventOnTrigger: function(q) {\n            var r = g.getKeyCode(q);\n            switch (r) {\n              case m.DOWN:\n            \n              case m.UP:\n                break;\n              default:\n                var s = String.fromCharCode(r).toLowerCase();\n                if (!/^\\s?$/.test(s)) {\n                    this._popover.showLayer();\n                    this._menu.blur();\n                    if ((this._menu.handleKeydown(r, q) === false)) {\n                        this._popover.hideLayer();\n                        l.set(this._triggerElem);\n                    }\n                ;\n                }\n            ;\n            };\n        },\n        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\n            };\n        },\n        enable: function() {\n            this._popover.enable();\n        },\n        disable: function() {\n            this._popover.disable();\n        }\n    });\n    e.exports = p;\n});\n__d(\"PopoverAsyncMenu\", [\"Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"AsyncRequest\"), i = b(\"Class\"), j = b(\"PopoverMenu\"), k = b(\"copyProperties\"), l = {\n    }, m = 0;\n    function n(o, p, q, r, s) {\n        this._endpoint = r;\n        this._loadingMenu = q;\n        this._instanceId = m++;\n        l[this._instanceId] = this;\n        this._mouseoverListener = g.listen(p, \"mouseover\", this._fetchMenu.bind(this));\n        this.parent.construct(this, o, p, null, s);\n    };\n    n.setMenu = function(o, p) {\n        l[o].setMenu(p);\n    };\n    n.getInstance = function(o) {\n        return l[o];\n    };\n    i.extend(n, j);\n    k(n.prototype, {\n        _fetched: false,\n        _mouseoverListener: null,\n        _onLayerInit: function() {\n            if (!this._menu) {\n                this.setMenu(this._loadingMenu);\n            };\n            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return\n            };\n            new h().setURI(this._endpoint).setData({\n                pmid: this._instanceId\n            }).send();\n            this._fetched = true;\n            if (this._mouseoverListener) {\n                this._mouseoverListener.remove();\n                this._mouseoverListener = null;\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"PopoverMenuInterface\", [\"ArbiterMixin\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        blur: i,\n        handleKeydown: i.thatReturnsFalse,\n        done: function() {\n            this.inform(\"done\");\n        }\n    });\n    e.exports = j;\n});\n__d(\"PopoverMenuOverlappingBorder\", [\"CSS\",\"DOM\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"shield\");\n    function m(n) {\n        this._popoverMenu = n;\n        this._popover = n.getPopover();\n        this._triggerElem = n.getTriggerElem();\n    };\n    j(m.prototype, {\n        _shortBorder: null,\n        _setMenuSubscription: null,\n        _showSubscription: null,\n        _menuSubscription: null,\n        enable: function() {\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", l(this._onSetMenu, this));\n        },\n        disable: function() {\n            this._popoverMenu.unsubscribe(this._setMenuSubscription);\n            this._setMenuSubscription = null;\n            this._removeBorderSubscriptions();\n            this._removeShortBorder();\n        },\n        _onSetMenu: function() {\n            this._removeBorderSubscriptions();\n            this._menu = this._popoverMenu.getMenu();\n            this._renderShortBorder(this._menu.getRoot());\n            this._showSubscription = this._popover.subscribe(\"show\", l(this._updateBorder, this));\n            this._menuSubscription = this._menu.subscribe([\"change\",\"resize\",], l(Function.prototype.defer, l(this._updateBorder, this)));\n            this._updateBorder();\n        },\n        _updateBorder: function() {\n            var n = this._menu.getRoot(), o = this._triggerElem.offsetWidth, p = Math.max((n.offsetWidth - o), 0);\n            i.set(this._shortBorder, \"width\", (p + \"px\"));\n        },\n        _renderShortBorder: function(n) {\n            this._shortBorder = h.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__shortborder\"\n            });\n            h.appendContent(n, this._shortBorder);\n            g.addClass(n, \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n        },\n        _removeShortBorder: function() {\n            if (this._shortBorder) {\n                h.remove(this._shortBorder);\n                this._shortBorder = null;\n                g.removeClass(this._popoverMenu.getMenu().getRoot(), \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n            }\n        ;\n        },\n        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"Menu\", [\"CSS\",\"Class\",\"DataStore\",\"DOM\",\"Event\",\"Keys\",\"Parent\",\"PopoverMenuInterface\",\"ScrollableArea\",\"Style\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Class\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"PopoverMenuInterface\"), o = b(\"ScrollableArea\"), p = b(\"Style\"), q = b(\"copyProperties\"), r = b(\"cx\");\n    function s(t, u) {\n        this.parent.construct(this);\n        this._items = [];\n        for (var v = 0; (v < t.length); v++) {\n            this._items[v] = new t[v].ctor(t[v]);;\n        };\n        this._config = (u || {\n        });\n        this._theme = (u.theme || {\n        });\n    };\n    h.extend(s, n);\n    q(s.prototype, {\n        _focused: null,\n        _root: null,\n        addItem: function(t) {\n            this._addItem(t);\n        },\n        addItemBefore: function(t, u) {\n            this._addItem(t, u, false);\n        },\n        addItemAfter: function(t, u) {\n            this._addItem(t, u, true);\n        },\n        _addItem: function(t, u, v) {\n            var w = this._items.indexOf(t);\n            if ((w >= 0)) {\n                var x = (v ? -1 : 1);\n                if ((this._items[(w + x)] == u)) {\n                    return\n                };\n                this._items.splice(w, 1);\n            }\n        ;\n            if (u) {\n                w = this._items.indexOf(u);\n                if ((w < 0)) {\n                    throw new Error(\"reference item must already be in the menu\")\n                };\n                if (v) {\n                    w++;\n                };\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            };\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if ((u < 0)) {\n                return\n            };\n            this._items.splice(u, 1);\n            (this._root && j.remove(t.getRoot()));\n        },\n        forEachItem: function(t) {\n            this._items.forEach(t);\n        },\n        getItemAt: function(t) {\n            return (this._items[t] || null);\n        },\n        getRoot: function() {\n            if (!this._root) {\n                this._render();\n            };\n            return this._root;\n        },\n        onShow: function() {\n            if (this._config.maxheight) {\n                if (!this._scrollableArea) {\n                    this._scrollableArea = o.fromNative(this._scrollableElems.root, {\n                        fade: true\n                    });\n                }\n                 else this._scrollableArea.resize();\n            \n            };\n            this.focusAnItem();\n        },\n        onHide: function() {\n            this.blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        blur: function() {\n            if (this._focused) {\n                this._focused.blur();\n                this._focused = null;\n                this.inform(\"blur\");\n            }\n        ;\n        },\n        handleKeydown: function(t, u) {\n            var v = this._items.indexOf(this._focused);\n            switch (t) {\n              case l.UP:\n            \n              case l.DOWN:\n                var w = ((t === l.UP) ? -1 : 1);\n                if ((v !== -1)) {\n                    return this._attemptFocus((v + w), w);\n                }\n                 else if ((t === l.UP)) {\n                    return this._attemptFocus((this._items.length - 1), -1);\n                }\n                 else return this._attemptFocus(0, 1)\n                \n            ;\n                break;\n              case l.SPACE:\n                if ((this._items.indexOf(this._focused) !== -1)) {\n                    this._handleItemClick(this._focused, u);\n                    return true;\n                }\n            ;\n                return false;\n              default:\n                var x = String.fromCharCode(t).toLowerCase(), y;\n                for (var z = (v + 1); (z < this._items.length); z++) {\n                    y = this._items[z].getAccessKey();\n                    if ((y && (y.charAt(0).toLowerCase() === x))) {\n                        if (this._focusItem(this._items[z])) {\n                            return true\n                        }\n                    };\n                };\n                return false;\n            };\n        },\n        _render: function() {\n            this._ul = j.create(\"ul\", {\n                className: \"-cx-PUBLIC-abstractMenu__menu\"\n            });\n            this._ul.setAttribute(\"role\", \"menu\");\n            this._items.forEach(function(v) {\n                this._insertItem(v, null);\n            }.bind(this));\n            k.listen(this._ul, \"click\", this._handleClick.bind(this));\n            k.listen(this._ul, \"mouseover\", this._handleMouseOver.bind(this));\n            k.listen(this._ul, \"mouseout\", this._handleMouseOut.bind(this));\n            var t = this._ul;\n            if (this._config.maxheight) {\n                this._scrollableElems = o.renderDOM();\n                j.setContent(this._scrollableElems.content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", (this._config.maxheight + \"px\"));\n            }\n        ;\n            var u = ((\"-cx-PUBLIC-abstractMenu__wrapper\" + ((this._config.className ? (\" \" + this._config.className) : \"\"))) + ((this._theme.className ? (\" \" + this._theme.className) : \"\")));\n            this._root = j.create(\"div\", {\n                className: u\n            }, j.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__border\"\n            }, t));\n            (this._config.id && this._root.setAttribute(\"id\", this._config.id));\n            this.inform(\"rendered\", this._root);\n        },\n        _needsDefaultBehavior: function(t) {\n            if ((t.isDefaultRequested && t.isDefaultRequested())) {\n                var u = m.byTag(t.getTarget(), \"a\"), v = (u && u.getAttribute(\"href\"));\n                return (v && (v[0] !== \"#\"));\n            }\n        ;\n            return false;\n        },\n        _handleClick: function(t) {\n            if (!this._needsDefaultBehavior(t)) {\n                var u = this._getItemInstance(t.getTarget());\n                if (u) {\n                    return this._handleItemClick(u, t)\n                };\n            }\n        ;\n        },\n        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                item: t,\n                event: u\n            });\n            if (t.hasAction()) {\n                this.done();\n            };\n            return t.handleClick();\n        },\n        _handleMouseOver: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            (u && this._focusItem(u, true));\n        },\n        _handleMouseOut: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            if ((u && (this._focused === u))) {\n                this.blur();\n            };\n        },\n        _insertItem: function(t, u, v) {\n            var w = t.getRoot();\n            g.addClass(w, \"__MenuItem\");\n            i.set(w, \"MenuItem\", t);\n            if (u) {\n                var x = (v ? j.insertAfter : j.insertBefore);\n                x(u.getRoot(), w);\n            }\n             else j.appendContent(this._ul, w);\n        ;\n        },\n        _attemptFocus: function(t, u) {\n            var v = this.getItemAt(t);\n            if (v) {\n                if (this._focusItem(v)) {\n                    return true;\n                }\n                 else return this._attemptFocus((t + u), u)\n            \n            };\n            return false;\n        },\n        _focusItem: function(t, u) {\n            if ((t.focus(u) !== false)) {\n                if ((this._focused !== t)) {\n                    this.blur();\n                    this._focused = t;\n                    this.inform(\"focus\");\n                }\n            ;\n                return true;\n            }\n        ;\n            return false;\n        },\n        _getItemInstance: function(t) {\n            var u = m.byClass(t, \"__MenuItem\");\n            return (u ? i.get(u, \"MenuItem\") : null);\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuItemInterface\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i() {\n    \n    };\n    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            };\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        focus: h.thatReturnsFalse,\n        blur: h.thatReturnsFalse,\n        handleClick: h.thatReturnsFalse\n    });\n    e.exports = i;\n});\n__d(\"MenuItemBase\", [\"Class\",\"DOM\",\"HTML\",\"MenuItemInterface\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"MenuItemInterface\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n) {\n        this.parent.construct(this);\n        this._data = n;\n    };\n    g.extend(m, j);\n    k(m.prototype, {\n        render: function() {\n            var n = \"-cx-PUBLIC-abstractMenuItem__root\";\n            if (this._data.className) {\n                n += (\" \" + this._data.className);\n            };\n            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            for (var p in this._data) {\n                if ((p.indexOf(\"data-\") === 0)) {\n                    o[p] = this._data[p];\n                };\n            };\n            return h.create(\"li\", o, this._renderItemContent());\n        },\n        _renderItemContent: function() {\n            return i(this._data.markup).getNodes();\n        }\n    });\n    e.exports = m;\n});\n__d(\"MenuItem\", [\"Class\",\"CSS\",\"DOM\",\"MenuItemBase\",\"React\",\"copyProperties\",\"cx\",\"emptyFunction\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MenuItemBase\"), k = b(\"React\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = b(\"emptyFunction\"), o = b(\"startsWith\"), p = [\"href\",\"rel\",\"ajaxify\",\"target\",];\n    function q(t, u) {\n        var v = {\n        };\n        p.forEach(function(w) {\n            if ((w in u)) {\n                v[w] = u[w];\n            };\n        });\n        i.setAttributes(t, v);\n    };\n    function r(t) {\n        p.forEach(function(u) {\n            t.removeAttribute(u);\n        });\n    };\n    function s(t) {\n        this.parent.construct(this, t);\n        this._disabled = !!this._data.disabled;\n    };\n    g.extend(s, j);\n    l(s.prototype, {\n        getValue: function() {\n            return this._data.value;\n        },\n        getAccessKey: function() {\n            return (this._data.label && this._data.label.charAt(0));\n        },\n        hasAction: n.thatReturnsTrue,\n        focus: function(t) {\n            if ((this.isDisabled() || !this._root.offsetParent)) {\n                return false\n            };\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            (t || this._anchor.focus());\n        },\n        blur: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.removeClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"false\");\n        },\n        handleClick: function() {\n            if (this.isDisabled()) {\n                return false\n            };\n            if ((typeof this._onclickHandler === \"function\")) {\n                return this._onclickHandler()\n            };\n            return true;\n        },\n        setOnClickHandler: function(t) {\n            this._onclickHandler = t;\n        },\n        _renderItemContent: function() {\n            this._anchor = i.create(\"a\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__anchor\",\n                tabIndex: (this.isDisabled() ? -1 : 0)\n            });\n            if (this._data.reactChildren) {\n                k.renderComponent(k.DOM.span({\n                    className: \"-cx-PUBLIC-abstractMenuItem__label\"\n                }, this._data.reactChildren), this._anchor);\n                this._data.label = (this._anchor.innerText || this._anchor.textContent);\n            }\n             else i.setContent(this._anchor, i.create(\"span\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__label\"\n            }, (this._data.markup || this._data.label)));\n        ;\n            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"-cx-PUBLIC-abstractMenuItem__hasicon\");\n            }\n        ;\n            if (!this.isDisabled()) {\n                q(this._anchor, this._data);\n            };\n            for (var t in this._data) {\n                if (((typeof t === \"string\") && o(t, \"data-\"))) {\n                    this._anchor.setAttribute(t, this._data[t]);\n                };\n            };\n            this._anchor.setAttribute(\"role\", \"menuitem\");\n            this._anchor.setAttribute(\"title\", this._data.title);\n            return this._anchor;\n        },\n        isDisabled: function() {\n            return this._disabled;\n        },\n        enable: function() {\n            q(this._anchor, this._data);\n            this._anchor.tabIndex = 0;\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = false;\n        },\n        disable: function() {\n            r(this._anchor);\n            this._anchor.tabIndex = -1;\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = true;\n        },\n        render: function() {\n            var t = this.parent.render();\n            if (this._data.disabled) {\n                h.addClass(t, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            };\n            return t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuSelectableItem\", [\"Class\",\"CSS\",\"MenuItem\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"MenuItem\"), j = b(\"copyProperties\"), k = b(\"cx\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this._selected = !!this._data.selected;\n    };\n    g.extend(l, i);\n    j(l.prototype, {\n        _selected: false,\n        getLabel: function() {\n            return this._data.label;\n        },\n        getIcon: function() {\n            return this._data.icon;\n        },\n        isSelected: function() {\n            return this._selected;\n        },\n        select: function() {\n            if (this.isDisabled()) {\n                return false\n            };\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = true;\n        },\n        deselect: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = false;\n        },\n        render: function() {\n            var m = this.parent.render();\n            if (this._data.selected) {\n                h.addClass(m, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            };\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"SelectableMenu\", [\"Class\",\"Menu\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"Menu\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\");\n    function l(o, p) {\n        this.parent.construct(this, o, p);\n    };\n    function m(o) {\n        return ((o.select && o.deselect) && o.isSelected);\n    };\n    function n(o) {\n        return (m(o) && o.isSelected());\n    };\n    g.extend(l, h);\n    j(l.prototype, {\n        focusAnItem: function() {\n            for (var o = 0; (o < this._items.length); o++) {\n                if (n(this._items[o])) {\n                    if ((this._focusItem(this._items[o]) !== false)) {\n                        return true\n                    }\n                };\n            };\n            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\n            };\n            var p = k(o);\n            this._items.forEach(function(q) {\n                if (m(q)) {\n                    if (i(p, q.getValue())) {\n                        q.select();\n                    }\n                     else if (n(q)) {\n                        q.deselect();\n                    }\n                \n                };\n            });\n            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p)\n            };\n            var q = this.inform(\"itemclick\", {\n                item: o,\n                event: p\n            });\n            if (q) {\n                return\n            };\n            if (this._config.multiple) {\n                var r = (n(o) ? o.deselect() : o.select());\n                if ((r !== false)) {\n                    this.inform(\"change\", this._getSelection());\n                };\n            }\n             else {\n                if (!n(o)) {\n                    if ((o.select() !== false)) {\n                        this._items.forEach(function(s) {\n                            if ((n(s) && (s !== o))) {\n                                s.deselect();\n                            };\n                        });\n                        this.inform(\"change\", this._getSelection());\n                    }\n                \n                };\n                this.done();\n            }\n        ;\n            return o.handleClick();\n        },\n        _getSelection: function() {\n            var o = [];\n            this._items.forEach(function(p) {\n                if (n(p)) {\n                    o.push({\n                        label: p.getLabel(),\n                        value: p.getValue(),\n                        item: p\n                    });\n                };\n            });\n            if (!this._config.multiple) {\n                o = o[0];\n            };\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"PopoverLoadingMenu\", [\"Class\",\"DOM\",\"PopoverMenuInterface\",\"copyProperties\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"PopoverMenuInterface\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"joinClasses\");\n    function m(n) {\n        this.parent.construct(this);\n        this._config = (n || {\n        });\n        this._theme = (n.theme || {\n        });\n    };\n    g.extend(m, i);\n    j(m.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = h.create(\"div\", {\n                    className: l(\"-cx-PUBLIC-abstractMenu__wrapper\", this._config.className, this._theme.className)\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__border\"\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__menu -cx-PUBLIC-abstractLoadingMenu__root\"\n                }, h.create(\"span\", {\n                    className: \"-cx-PUBLIC-abstractLoadingMenu__spinner\"\n                }))));\n            };\n            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualLayerAsyncRelative\", [\"Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\n    };\n    h(j.prototype, {\n        _layerSubscription: null,\n        _listener: null,\n        enable: function() {\n            this._layerSubscription = this._layer.subscribe(\"show\", this._attachListener.bind(this));\n            if (this._layer.isShown()) {\n                this._attachListener();\n            };\n        },\n        disable: function() {\n            this._layerSubscription.unsubscribe();\n            this._layerSubscription = null;\n            if (this._listener) {\n                this._listener.remove();\n                this._listener = null;\n            }\n        ;\n        },\n        _attachListener: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._onclick.bind(this));\n        },\n        _onclick: function(k) {\n            var l = i.byTag(k.getTarget(), \"A\");\n            if (!l) {\n                return\n            };\n            var m = l.getAttribute(\"ajaxify\"), n = l.href, o = (m || n);\n            if (((l.rel === \"async\") || (l.rel === \"async-post\"))) {\n                d([\"AsyncRequest\",], function(p) {\n                    p.bootstrap(o, this._layer.getContext(), (l.rel === \"async-post\"));\n                }.bind(this));\n                return false;\n            }\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"HoverFlyout\", [\"Arbiter\",\"ArbiterMixin\",\"DataStore\",\"Event\",\"Keys\",\"arrayContains\",\"copyProperties\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"DataStore\"), j = b(\"Event\"), k = b(\"Keys\"), l = b(\"arrayContains\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\"), o = b(\"shield\");\n    function p(q, r, s, t) {\n        if (q) {\n            this._showDelay = s;\n            this._hideDelay = t;\n            this.init(q);\n            if (r) {\n                this.initNode(r);\n            };\n        }\n    ;\n        g.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", o(this.hideFlyout, this), g.SUBSCRIBE_ALL);\n    };\n    m(p.prototype, h, {\n        init: function(q) {\n            this._flyout = q;\n            this._showDelay = (this._showDelay || 0);\n            this._hideDelay = (this._hideDelay || 100);\n            this._showTimeout = null;\n            this._hideTimeout = null;\n            this._flyoutSubscriptions = [this._flyout.subscribe(\"mouseenter\", this._onFlyoutMouseEnter.bind(this)),this._flyout.subscribe(\"mouseleave\", o(this.hideFlyout, this)),];\n            this._nodes = [];\n            this._dataStoreUnique = ((\"HoverFlyout_\" + Date.now()) + \"_listeners\");\n            return this;\n        },\n        initNode: function(q) {\n            if (l(this._nodes, q)) {\n                return this\n            };\n            this._nodes.push(q);\n            i.set(q, this._dataStoreUnique, [j.listen(q, \"mouseenter\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"mouseleave\", o(this.hideFlyout, this)),j.listen(q, \"click\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"keydown\", this._onNodeKeyEscape.bind(this)),]);\n            return this;\n        },\n        deactivateNode: function(q) {\n            var r = i.get(q, this._dataStoreUnique);\n            if (r) {\n                while (r.length) {\n                    r.pop().remove();;\n                }\n            };\n            n(this._nodes, q);\n        },\n        setShowDelay: function(q) {\n            this._showDelay = q;\n            return this;\n        },\n        setHideDelay: function(q) {\n            this._hideDelay = q;\n            return this;\n        },\n        showFlyout: function(q, r) {\n            this.setActiveNode(q);\n            if (r) {\n                this._flyout.setContext(q).show();\n                this.inform(\"show\", q);\n            }\n             else this._showTimeout = this.showFlyout.bind(this, q, true).defer(this._showDelay);\n        ;\n            return this;\n        },\n        hideFlyout: function(q) {\n            clearTimeout(this._showTimeout);\n            if (q) {\n                this._flyout.hide();\n                (this._activeNode && this.inform(\"hide\", this._activeNode));\n                this._activeNode = null;\n            }\n             else this._hideTimeout = this.hideFlyout.bind(this, true).defer(this._hideDelay);\n        ;\n        },\n        hideFlyoutDelayed: function(q) {\n            clearTimeout(this._showTimeout);\n            clearTimeout(this._hideTimeout);\n            this._hideTimeout = this.hideFlyout.bind(this, true).defer(q);\n        },\n        getActiveNode: function() {\n            return this._activeNode;\n        },\n        setActiveNode: function(q) {\n            clearTimeout(this._hideTimeout);\n            if ((this._activeNode && (this._activeNode !== q))) {\n                this.hideFlyout(true);\n            };\n            this._activeNode = q;\n            return this;\n        },\n        clearNodes: function() {\n            for (var q = this._nodes.length; (q > 0); q--) {\n                this.deactivateNode(this._nodes[(q - 1)]);;\n            };\n        },\n        destroy: function() {\n            while (this._flyoutSubscriptions.length) {\n                this._flyout.unsubscribe(this._flyoutSubscriptions.pop());;\n            };\n            this.clearNodes();\n        },\n        _onNodeMouseEnter: function(q) {\n            if ((this._activeNode === q)) {\n                clearTimeout(this._hideTimeout);\n            }\n             else this.showFlyout(q);\n        ;\n        },\n        _onFlyoutMouseEnter: function() {\n            clearTimeout(this._hideTimeout);\n        },\n        _onNodeKeyEscape: function(event) {\n            if ((j.getKeyCode(event) === k.ESC)) {\n                (this._activeNode && this.inform(\"hide\", this._activeNode));\n                this._activeNode = null;\n            }\n        ;\n        }\n    });\n    e.exports = (a.HoverFlyout || p);\n});");
// 13136
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s3b31c8884df9af5961b1fe9f6e6838b6210fcc05");
// 13137
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"OYzUx\",]);\n}\n;\n;\n__d(\"ComposerXAttachmentBootstrap\", [\"JSBNG__CSS\",\"Form\",\"Parent\",\"URI\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"Form\"), i = b(\"Parent\"), j = b(\"URI\"), k = b(\"cx\"), l = [], m = {\n        bootstrap: function(n) {\n            m.load(i.byTag(n, \"form\"), n.getAttribute(\"data-endpoint\"));\n        },\n        load: function(n, o, p) {\n            var q = j(o).addQueryData({\n                composerurihash: m.getURIHash(o)\n            });\n            g.conditionClass(n, \"-cx-PRIVATE-fbComposerAttachment__hidespinner\", p);\n            var r = i.byClass(n, \"-cx-PRIVATE-fbComposer__attachmentform\");\n            g.removeClass(r, \"async_saving\");\n            h.setDisabled(n, false);\n            n.action = q.toString();\n            h.bootstrap(n);\n        },\n        getURIHash: function(n) {\n            if (((n === \"initial\"))) {\n                return \"initial\";\n            }\n        ;\n        ;\n            var o = l.indexOf(n);\n            if (((o !== -1))) {\n                return ((o + \"\"));\n            }\n             else {\n                o = l.length;\n                l[o] = n;\n                return ((o + \"\"));\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ComposerXStore\", [\"function-extensions\",\"Arbiter\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ge\"), i = {\n    };\n    function j(l, m) {\n        return ((((((\"ComposerX/\" + l)) + \"/\")) + m));\n    };\n;\n    var k = {\n        set: function(l, m, n) {\n            if (!i[l]) {\n                i[l] = {\n                };\n            }\n        ;\n        ;\n            i[l][m] = n;\n            g.inform(j(l, m), {\n            }, g.BEHAVIOR_STATE);\n        },\n        get: function(l, m) {\n            if (i[l]) {\n                return i[l][m];\n            }\n        ;\n        ;\n            return null;\n        },\n        getAllForComposer: function(l) {\n            return ((i[l] || {\n            }));\n        },\n        waitForComponents: function(l, m, n) {\n            g.registerCallback(n, m.map(j.curry(l)));\n        }\n    };\n    g.subscribe(\"page_transition\", function() {\n        {\n            var fin247keys = ((window.top.JSBNG_Replay.forInKeys)((i))), fin247i = (0);\n            var l;\n            for (; (fin247i < fin247keys.length); (fin247i++)) {\n                ((l) = (fin247keys[fin247i]));\n                {\n                    if (!h(l)) {\n                        delete i[l];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = k;\n});\n__d(\"ComposerX\", [\"Arbiter\",\"ComposerXAttachmentBootstrap\",\"ComposerXStore\",\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"copyProperties\",\"csx\",\"cx\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXAttachmentBootstrap\"), i = b(\"ComposerXStore\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"copyProperties\"), n = b(\"csx\"), o = b(\"cx\"), p = b(\"getObjectValues\"), q = \"any\";\n    function r(s) {\n        this._root = s;\n        this._composerID = s.id;\n        this._attachments = {\n        };\n        this._attachmentFetchForm = l.JSBNG__find(s, \".-cx-PRIVATE-fbComposer__attachmentform\");\n        this._resetSubscription = g.subscribe(\"composer/publish\", function(t, u) {\n            if (((u.composer_id === this._composerID))) {\n                this.reset();\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    m(r.prototype, {\n        _endpointHashToShow: q,\n        _lastFetchEndpoint: \"\",\n        _initialAttachmentEndpoint: \"\",\n        getAttachment: function(s, t) {\n            var u = h.getURIHash(s);\n            this._endpointHashToShow = u;\n            var v = this._attachments[u];\n            if (v) {\n                this._showAttachmentAfterComponentsLoaded(u);\n            }\n             else this.fetchAttachmentData(s, t);\n        ;\n        ;\n        },\n        fetchAttachmentData: function(s, t) {\n            var u = h.getURIHash(s);\n            if (this._attachments[u]) {\n                return;\n            }\n        ;\n        ;\n            if (((s !== this._lastFetchEndpoint))) {\n                h.load(this._attachmentFetchForm, s, t);\n                this._lastFetchEndpoint = s;\n            }\n        ;\n        ;\n        },\n        setAttachment: function(s, t, u, v) {\n            this._setupAttachment(s, t, u, v);\n            this._showAttachmentAfterComponentsLoaded(s);\n        },\n        setInitialAttachment: function(s, t, u, v) {\n            var w = h.getURIHash(s);\n            this._setupAttachment(w, t, u, v);\n            this._initialAttachmentEndpoint = s;\n            if (!this._currentInstance) {\n                this._showAttachmentAfterComponentsLoaded(w);\n            }\n        ;\n        ;\n        },\n        setComponent: function(s, t) {\n            if (!i.get(this._composerID, s)) {\n                i.set(this._composerID, s, t);\n                k.appendContent(this._attachmentFetchForm, k.create(\"input\", {\n                    type: \"hidden\",\n                    JSBNG__name: \"loaded_components[]\",\n                    value: s\n                }));\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            if (this._currentInstance) {\n                this._currentInstance.cleanup();\n                this._currentInstance = null;\n            }\n        ;\n        ;\n            {\n                var fin248keys = ((window.top.JSBNG_Replay.forInKeys)((this._attachments))), fin248i = (0);\n                var s;\n                for (; (fin248i < fin248keys.length); (fin248i++)) {\n                    ((s) = (fin248keys[fin248i]));\n                    {\n                        this._attachments[s].instance.reset();\n                    ;\n                    };\n                };\n            };\n        ;\n            var t = i.getAllForComposer(this._composerID);\n            p(t).forEach(function(u) {\n                if (u.reset) {\n                    u.reset(u);\n                }\n            ;\n            ;\n            });\n            this.getAttachment(this._initialAttachmentEndpoint);\n            g.inform(\"composer/reset\");\n        },\n        destroy: function() {\n            if (this._resetSubscription) {\n                this._resetSubscription.unsubscribe();\n                this._resetSubscription = null;\n            }\n        ;\n        ;\n        },\n        addPlaceholders: function(s, t) {\n            var u;\n            {\n                var fin249keys = ((window.top.JSBNG_Replay.forInKeys)((this._attachments))), fin249i = (0);\n                var v;\n                for (; (fin249i < fin249keys.length); (fin249i++)) {\n                    ((v) = (fin249keys[fin249i]));\n                    {\n                        u = this._attachments[v];\n                        if (((u.instance === s))) {\n                            t.forEach(function(w) {\n                                u.placeholders.push(w);\n                                u.required_components.push(w.component_name);\n                            });\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((this._currentInstance === s))) {\n                this._fillPlaceholders(t);\n            }\n        ;\n        ;\n        },\n        _setupAttachment: function(s, t, u, v) {\n            t.setComposerID(this._composerID);\n            this._attachments[s] = {\n                instance: t,\n                placeholders: u,\n                required_components: v\n            };\n            var w = l.JSBNG__find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), x = t.getRoot();\n            if (((x.parentNode !== w))) {\n                j.hide(x);\n                k.appendContent(w, x);\n            }\n        ;\n        ;\n        },\n        _showAttachment: function(s, t, u) {\n            if (((this._currentInstance === s))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._endpointHashToShow === q))) {\n                this._endpointHashToShow = null;\n            }\n             else if (((this._endpointHashToShow !== t))) {\n                return;\n            }\n            \n        ;\n        ;\n            if (this._currentInstance) {\n                if (!this._currentInstance.canSwitchAway()) {\n                    return;\n                }\n            ;\n            ;\n                this._currentInstance.cleanup();\n            }\n        ;\n        ;\n            this._currentInstance = s;\n            var v = l.JSBNG__find(this._root, \"div.-cx-PUBLIC-fbComposer__content\"), w = v.childNodes, x = s.getRoot();\n            for (var y = 0; ((y < w.length)); y++) {\n                if (((w[y] !== x))) {\n                    j.hide(w[y]);\n                }\n            ;\n            ;\n            };\n        ;\n            j.show(x);\n            this._fillPlaceholders(u);\n            var z = h.getURIHash(this._initialAttachmentEndpoint), aa = ((t === z));\n            s.initWithComponents(aa);\n            this._setAttachmentSelectedClass(s.attachmentClassName);\n            g.inform(\"composer/initializedAttachment\", {\n                composerRoot: this._root,\n                isInitial: aa\n            });\n        },\n        _showAttachmentAfterComponentsLoaded: function(s) {\n            var t = this._attachments[s];\n            i.waitForComponents(this._composerID, t.required_components, this._showAttachment.bind(this, t.instance, s, t.placeholders));\n        },\n        _fillPlaceholders: function(s) {\n            s.forEach(function(t) {\n                var u = i.get(this._composerID, t.component_name);\n                if (((t.element !== u.element.parentNode))) {\n                    k.setContent(t.element, u.element);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _setAttachmentSelectedClass: function(s) {\n            var t = l.scry(this._root, \".-cx-PUBLIC-fbComposerAttachment__selected\")[0], u;\n            if (t) {\n                j.removeClass(t, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                u = l.scry(t, \"*[aria-pressed=\\\"true\\\"]\")[0];\n                if (u) {\n                    u.setAttribute(\"aria-pressed\", \"false\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (s) {\n                var v = l.scry(this._root, ((\".\" + s)))[0];\n                if (v) {\n                    j.addClass(v, \"-cx-PUBLIC-fbComposerAttachment__selected\");\n                    u = l.scry(v, \"*[aria-pressed=\\\"false\\\"]\")[0];\n                    if (u) {\n                        u.setAttribute(\"aria-pressed\", \"true\");\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ComposerXAttachment\", [\"ComposerXStore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ComposerXStore\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, {\n        getRoot: i,\n        initWithComponents: function(k) {\n        \n        },\n        cleanup: i,\n        reset: i,\n        attachmentClassName: \"\",\n        getComponent: function(k) {\n            return g.get(this._composerID, k);\n        },\n        canSwitchAway: i.thatReturnsTrue,\n        setComposerID: function(k) {\n            this._composerID = k;\n        },\n        allowOGTagPreview: function() {\n            return false;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXController\", [\"Arbiter\",\"ComposerX\",\"ComposerXAttachmentBootstrap\",\"Parent\",\"$\",\"cx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerX\"), i = b(\"ComposerXAttachmentBootstrap\"), j = b(\"Parent\"), k = b(\"$\"), l = b(\"cx\"), m = b(\"emptyFunction\"), n = b(\"ge\"), o = {\n    };\n    function p(r) {\n        var s = j.byClass(k(r), \"-cx-PRIVATE-fbComposer__root\"), t = s.id;\n        if (!o[t]) {\n            o[t] = new h(s);\n        }\n    ;\n    ;\n        return o[t];\n    };\n;\n    var q = {\n        getAttachment: function(r, s, t) {\n            var u = p(r);\n            u.getAttachment(s, t);\n        },\n        fetchAttachmentData: function(r, s, t) {\n            p(r).fetchAttachmentData(s, t);\n        },\n        setAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setAttachment(s, t, u, v);\n        },\n        setInitialAttachment: function(r, s, t, u, v) {\n            var w = p(r);\n            w.setInitialAttachment(s, t, u, v);\n        },\n        setComponent: function(r, s, t) {\n            var u = p(r);\n            u.setComponent(s, t);\n        },\n        reset: function(r) {\n            var s = p(r);\n            s.reset();\n        },\n        holdTheMarkup: m,\n        getEndpoint: function(r, s, t) {\n            var u = p(r);\n            i.load(u._attachmentFetchForm, s, t);\n        },\n        addPlaceholders: function(r, s, t) {\n            var u = p(r);\n            u.addPlaceholders(s, t);\n        }\n    };\n    i.bootstrap = function(r) {\n        q.getAttachment(r, r.getAttribute(\"data-endpoint\"));\n    };\n    g.subscribe(\"page_transition\", function() {\n        {\n            var fin250keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin250i = (0);\n            var r;\n            for (; (fin250i < fin250keys.length); (fin250i++)) {\n                ((r) = (fin250keys[fin250i]));\n                {\n                    if (!n(r)) {\n                        o[r].destroy();\n                        delete o[r];\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    });\n    e.exports = q;\n});\n__d(\"DragDropFileUpload\", [], function(a, b, c, d, e, f) {\n    f.isSupported = function() {\n        return ((typeof (JSBNG__FileList) !== \"undefined\"));\n    };\n});\n__d(\"DocumentDragDrop\", [\"JSBNG__Event\",\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"DragDropFileUpload\",\"emptyFunction\",\"getObjectValues\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DragDropFileUpload\"), m = b(\"emptyFunction\"), n = b(\"getObjectValues\"), o = {\n    }, p = 0;\n    function q() {\n        p = 0;\n        n(o).forEach(function(t) {\n            i.removeClass(t.element, t.className);\n            h.inform(\"dragleave\", {\n                element: t.element\n            });\n        });\n    };\n;\n    function r() {\n        if (!l.isSupported()) {\n            return;\n        }\n    ;\n    ;\n        g.listen(JSBNG__document, \"dragenter\", function(u) {\n            if (((p === 0))) {\n                n(o).forEach(function(v) {\n                    i.addClass(v.element, v.className);\n                    h.inform(\"dragenter\", {\n                        element: v.element,\n                        JSBNG__event: u\n                    });\n                });\n            }\n        ;\n        ;\n            p++;\n        });\n        g.listen(JSBNG__document, \"dragleave\", function(u) {\n            p--;\n            if (((p === 0))) {\n                q();\n            }\n        ;\n        ;\n        });\n        g.listen(JSBNG__document, \"drop\", function(u) {\n            var v = u.getTarget();\n            if (k.isNodeOfType(u.getTarget(), \"input\")) {\n                if (((v.type === \"file\"))) {\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            u.prevent();\n        });\n        g.listen(JSBNG__document, \"dragover\", g.prevent);\n        var t = null;\n        JSBNG__document.JSBNG__addEventListener(\"dragover\", function() {\n            ((t && JSBNG__clearTimeout(t)));\n            t = JSBNG__setTimeout(q, 839);\n        }, true);\n        r = m;\n    };\n;\n    var s = {\n        registerStatusElement: function(t, u) {\n            r();\n            o[j.getID(t)] = {\n                element: t,\n                className: u\n            };\n        },\n        removeStatusElement: function(t) {\n            var u = j.getID(t), v = o[u];\n            i.removeClass(v.element, v.className);\n            delete o[u];\n        }\n    };\n    e.exports = s;\n});\n__d(\"DragDropTarget\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"DocumentDragDrop\",\"DragDropFileUpload\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"DocumentDragDrop\"), j = b(\"DragDropFileUpload\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\");\n    function m(n) {\n        this._element = n;\n        this._listeners = [];\n        this._statusElem = n;\n        this._dragEnterCount = 0;\n        this._enabled = false;\n    };\n;\n    k(m.prototype, {\n        _onFilesDropCallback: l,\n        _onURLDropCallback: l,\n        _onPlainTextDropCallback: l,\n        _onDropCallback: l,\n        _fileFilterFn: l.thatReturnsArgument,\n        setOnFilesDropCallback: function(n) {\n            this._onFilesDropCallback = n;\n            return this;\n        },\n        setOnURLDropCallback: function(n) {\n            this._onURLDropCallback = n;\n            return this;\n        },\n        setOnPlainTextDropCallback: function(n) {\n            this._onPlainTextDropCallback = n;\n            return this;\n        },\n        setOnDropCallback: function(n) {\n            this._onDropCallback = n;\n            return this;\n        },\n        enable: function() {\n            if (!j.isSupported()) {\n                return this;\n            }\n        ;\n        ;\n            i.registerStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            this._listeners.push(g.listen(this._element, \"dragenter\", this._onDragEnter.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragleave\", this._onDragLeave.bind(this)));\n            this._listeners.push(g.listen(this._element, \"dragover\", g.kill));\n            this._listeners.push(g.listen(this._element, \"drop\", function(n) {\n                this._dragEnterCount = 0;\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n                var o = {\n                }, p = false, q = this._fileFilterFn(n.dataTransfer.files);\n                if (q.length) {\n                    this._onFilesDropCallback(q, n);\n                    o.files = q;\n                    p = true;\n                }\n            ;\n            ;\n                var r = ((n.dataTransfer.getData(\"url\") || n.dataTransfer.getData(\"text/uri-list\")));\n                if (r) {\n                    this._onURLDropCallback(r, n);\n                    o.url = r;\n                    p = true;\n                }\n            ;\n            ;\n                var s = n.dataTransfer.getData(\"text/plain\");\n                if (s) {\n                    this._onPlainTextDropCallback(s, n);\n                    o.plainText = s;\n                    p = true;\n                }\n            ;\n            ;\n                if (p) {\n                    this._onDropCallback(o, n);\n                }\n            ;\n            ;\n                n.kill();\n            }.bind(this)));\n            this._enabled = true;\n            return this;\n        },\n        disable: function() {\n            if (!this._enabled) {\n                return this;\n            }\n        ;\n        ;\n            i.removeStatusElement(this._statusElem, \"fbWantsDragDrop\");\n            h.removeClass(this._statusElem, \"fbDropReady\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n            h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n            h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            this._enabled = false;\n            return this;\n        },\n        setFileFilter: function(n) {\n            this._fileFilterFn = n;\n            return this;\n        },\n        setStatusElement: function(n) {\n            this._statusElem = n;\n            return this;\n        },\n        _onDragEnter: function(n) {\n            if (((this._dragEnterCount === 0))) {\n                var o = n.dataTransfer.items, p = false;\n                for (var q = 0; ((q < o.length)); q++) {\n                    if (!o[q].type.match(\"image/*\")) {\n                        p = true;\n                        break;\n                    }\n                ;\n                ;\n                };\n            ;\n                h.addClass(this._statusElem, \"fbDropReady\");\n                if (p) {\n                    h.addClass(this._statusElem, \"fbDropReadyLink\");\n                }\n                 else if (((o.length > 1))) {\n                    h.addClass(this._statusElem, \"fbDropReadyPhotos\");\n                }\n                 else h.addClass(this._statusElem, \"fbDropReadyPhoto\");\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            this._dragEnterCount++;\n        },\n        _onDragLeave: function() {\n            this._dragEnterCount = Math.max(((this._dragEnterCount - 1)), 0);\n            if (((this._dragEnterCount === 0))) {\n                h.removeClass(this._statusElem, \"fbDropReady\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhoto\");\n                h.removeClass(this._statusElem, \"fbDropReadyPhotos\");\n                h.removeClass(this._statusElem, \"fbDropReadyLink\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ComposerXDragDrop\", [\"Arbiter\",\"ComposerXController\",\"JSBNG__CSS\",\"DragDropTarget\",\"DOMQuery\",\"Parent\",\"URI\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ComposerXController\"), i = b(\"JSBNG__CSS\"), j = b(\"DragDropTarget\"), k = b(\"DOMQuery\"), l = b(\"Parent\"), m = b(\"URI\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"cx\"), q = \"/ajax/composerx/attachment/media/upload/\", r = \"/ajax/composerx/attachment/link/scraper/\", s = function(u) {\n        u();\n    };\n    function t(u, v, w, x) {\n        this._root = u;\n        this._composerID = v;\n        this._targetID = w;\n        x = ((x || s));\n        this._dragdrop = new j(u).setOnFilesDropCallback(function(y) {\n            x(this._uploadFiles.bind(this, y));\n        }.bind(this)).setFileFilter(t.filterImages).enable();\n        t.handleDragEnterAndLeave(u);\n        g.subscribe(\"composer/deactivateDragdrop\", function() {\n            this.deactivate();\n        }.bind(this));\n        g.subscribe(\"composer/reactivateDragdrop\", function() {\n            this.reactivate();\n        }.bind(this));\n    };\n;\n    n(t, {\n        handleDragEnterAndLeave: function(u) {\n            var v = k.scry(l.byClass(u, \"-cx-PRIVATE-fbComposer__root\"), \".-cx-PUBLIC-fbComposerAttachment__nub\");\n            g.subscribe(\"dragenter\", function(w, x) {\n                if (((u == x.element))) {\n                    v.forEach(i.hide);\n                }\n            ;\n            ;\n            });\n            g.subscribe(\"dragleave\", function(w, x) {\n                if (((u == x.element))) {\n                    v.forEach(i.show);\n                }\n            ;\n            ;\n            });\n        },\n        filterImages: function(u) {\n            var v = [];\n            for (var w = 0; ((w < u.length)); w++) {\n                if (u[w].type.match(\"image/*\")) {\n                    v.push(u[w]);\n                }\n            ;\n            ;\n            };\n        ;\n            return v;\n        }\n    });\n    n(t.prototype, {\n        enableURLDropping: function() {\n            this._dragdrop.setOnURLDropCallback(this._onURLDrop.bind(this));\n        },\n        deactivate: function() {\n            this._dragdrop.disable();\n        },\n        reactivate: function() {\n            this._dragdrop.enable();\n        },\n        _uploadFiles: function(u) {\n            h.getAttachment(this._root, q);\n            g.inform(((((\"ComposerXFilesStore/filesDropped/\" + this._composerID)) + \"/mediaupload\")), {\n                files: u\n            }, g.BEHAVIOR_PERSISTENT);\n        },\n        _onURLDrop: function(u) {\n            var v = new m(r);\n            v.addQueryData({\n                scrape_url: encodeURIComponent(u)\n            });\n            h.getAttachment(this._root, v.toString());\n        }\n    });\n    e.exports = t;\n});\n__d(\"curry\", [\"bind\",], function(a, b, c, d, e, f) {\n    var g = b(\"bind\"), h = g(null, g, null);\n    e.exports = h;\n});\n__d(\"Popover\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ContextualLayer\",\"ContextualLayerHideOnScroll\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Focus\",\"Keys\",\"KeyStatus\",\"LayerHideOnEscape\",\"Toggler\",\"copyProperties\",\"curry\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ContextualLayer\"), k = b(\"ContextualLayerHideOnScroll\"), l = b(\"JSBNG__CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Focus\"), p = b(\"Keys\"), q = b(\"KeyStatus\"), r = b(\"LayerHideOnEscape\"), s = b(\"Toggler\"), t = b(\"copyProperties\"), u = b(\"curry\");\n    s.subscribe([\"show\",\"hide\",], function(w, x) {\n        var y = m.get(x.getActive(), \"Popover\");\n        if (y) {\n            if (((w === \"show\"))) {\n                y.showLayer();\n            }\n             else y.hideLayer();\n        ;\n        }\n    ;\n    ;\n    });\n    function v(w, x, y, z) {\n        this._root = w;\n        this._triggerElem = x;\n        this._behaviors = y;\n        this._config = ((z || {\n        }));\n        this._disabled = !!this._config.disabled;\n        this._listeners = [];\n        if (((!this._disabled && ((((x.nodeName !== \"A\")) || ((x.rel !== \"toggle\"))))))) {\n            this._setupClickListener();\n        }\n    ;\n    ;\n        this._setupKeyListener();\n        x.setAttribute(\"role\", \"button\");\n        m.set(w, \"Popover\", this);\n    };\n;\n    t(v.prototype, i, {\n        _layer: null,\n        ensureInit: function() {\n            if (!this._layer) {\n                this._init();\n            }\n        ;\n        ;\n        },\n        showLayer: function() {\n            this.ensureInit();\n            this._layer.show();\n            s.show(this._root);\n            l.addClass(this._root, \"selected\");\n            this.inform(\"show\");\n            this._triggerElem.setAttribute(\"aria-expanded\", \"true\");\n        },\n        getLayer: function() {\n            return this._layer;\n        },\n        hideLayer: function() {\n            this._layer.hide();\n            this._triggerElem.setAttribute(\"aria-expanded\", \"false\");\n        },\n        isShown: function() {\n            return ((this._layer && this._layer.isShown()));\n        },\n        setLayerContent: function(w) {\n            this.ensureInit();\n            this._layer.setContent(w);\n        },\n        _init: function() {\n            var w = new j({\n                context: this._triggerElem,\n                position: \"below\"\n            }, n.create(\"div\"));\n            w.enableBehaviors([k,r,]);\n            s.createInstance(w.getRoot()).setSticky(false);\n            w.subscribe(\"hide\", this._onLayerHide.bind(this));\n            ((this._behaviors && w.enableBehaviors(this._behaviors)));\n            this._layer = w;\n            if (this._config.alignh) {\n                this._layer.setAlignment(this._config.alignh);\n            }\n        ;\n        ;\n            if (this._config.layer_content) {\n                this._layer.setContent(this._config.layer_content);\n            }\n        ;\n        ;\n            this.inform(\"init\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        _onLayerHide: function() {\n            s.hide(this._root);\n            l.removeClass(this._root, \"selected\");\n            this.inform(\"hide\");\n            if (((q.getKeyDownCode() === p.ESC))) {\n                o.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            if (!this._disabled) {\n                return;\n            }\n        ;\n        ;\n            this._setupClickListener();\n            this._setupKeyListener();\n            this._disabled = false;\n        },\n        disable: function() {\n            if (this._disabled) {\n                return;\n            }\n        ;\n        ;\n            if (this.isShown()) {\n                this.hideLayer();\n            }\n        ;\n        ;\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (((this._triggerElem.getAttribute(\"rel\") === \"toggle\"))) {\n                this._triggerElem.removeAttribute(\"rel\");\n            }\n        ;\n        ;\n            this._disabled = true;\n        },\n        _setupClickListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"click\", u(s.bootstrap, this._triggerElem)));\n        },\n        _setupKeyListener: function() {\n            this._listeners.push(g.listen(this._triggerElem, \"keydown\", this._handleKeyEvent.bind(this)));\n        },\n        _handleKeyEvent: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (g.getKeyCode(JSBNG__event)) {\n              case p.DOWN:\n            \n              case p.UP:\n                s.bootstrap(this._triggerElem);\n                break;\n              default:\n                return;\n            };\n        ;\n            JSBNG__event.prevent();\n        }\n    });\n    e.exports = v;\n});\n__d(\"PopoverMenu\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"BehaviorsMixin\",\"Focus\",\"Keys\",\"KeyStatus\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"ARIA\"), k = b(\"BehaviorsMixin\"), l = b(\"Focus\"), m = b(\"Keys\"), n = b(\"KeyStatus\"), o = b(\"copyProperties\");\n    function p(q, r, s, t) {\n        this._popover = q;\n        this._triggerElem = r;\n        this._initialMenu = s;\n        q.subscribe(\"init\", this._onLayerInit.bind(this));\n        q.subscribe(\"show\", this._onPopoverShow.bind(this));\n        q.subscribe(\"hide\", this._onPopoverHide.bind(this));\n        g.listen(this._triggerElem, \"keydown\", this._handleKeyEventOnTrigger.bind(this));\n        ((t && this.enableBehaviors(t)));\n    };\n;\n    o(p.prototype, i, k);\n    o(p.prototype, {\n        _popoverShown: false,\n        setMenu: function(q) {\n            this._menu = q;\n            var r = q.getRoot();\n            this._popover.setLayerContent(r);\n            q.subscribe(\"done\", this._onMenuDone.bind(this));\n            if (this._popoverShown) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            j.owns(this._triggerElem, r);\n            this.inform(\"setMenu\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        getPopover: function() {\n            return this._popover;\n        },\n        getTriggerElem: function() {\n            return this._triggerElem;\n        },\n        getMenu: function() {\n            return this._menu;\n        },\n        _onLayerInit: function() {\n            this.setMenu(this._initialMenu);\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _onPopoverShow: function() {\n            if (this._menu) {\n                this._menu.onShow();\n            }\n        ;\n        ;\n            this._popoverShown = true;\n        },\n        _onPopoverHide: function() {\n            if (this._menu) {\n                this._menu.onHide();\n            }\n        ;\n        ;\n            this._popoverShown = false;\n        },\n        _handleKeyEvent: function(q, r) {\n            var s = g.getKeyCode(r);\n            if (((s === m.TAB))) {\n                this._popover.hideLayer();\n                l.set(this._triggerElem);\n                return;\n            }\n        ;\n        ;\n            if (r.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            switch (s) {\n              case m.RETURN:\n                return;\n              case m.UP:\n            \n              case m.DOWN:\n                this._menu.handleKeydown(s, r);\n                break;\n              default:\n                if (((this._menu.handleKeydown(s, r) === false))) {\n                    this._menu.JSBNG__blur();\n                    this._menu.handleKeydown(s, r);\n                }\n            ;\n            ;\n                break;\n            };\n        ;\n            r.prevent();\n        },\n        _handleKeyEventOnTrigger: function(q) {\n            var r = g.getKeyCode(q);\n            switch (r) {\n              case m.DOWN:\n            \n              case m.UP:\n                break;\n              default:\n                var s = String.fromCharCode(r).toLowerCase();\n                if (!/^\\s?$/.test(s)) {\n                    this._popover.showLayer();\n                    this._menu.JSBNG__blur();\n                    if (((this._menu.handleKeydown(r, q) === false))) {\n                        this._popover.hideLayer();\n                        l.set(this._triggerElem);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        _onMenuDone: function(q) {\n            this._popover.hideLayer.bind(this._popover).defer();\n            if (n.isKeyDown()) {\n                l.set(this._triggerElem);\n            }\n        ;\n        ;\n        },\n        enable: function() {\n            this._popover.enable();\n        },\n        disable: function() {\n            this._popover.disable();\n        }\n    });\n    e.exports = p;\n});\n__d(\"PopoverAsyncMenu\", [\"JSBNG__Event\",\"AsyncRequest\",\"Class\",\"PopoverMenu\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"AsyncRequest\"), i = b(\"Class\"), j = b(\"PopoverMenu\"), k = b(\"copyProperties\"), l = {\n    }, m = 0;\n    function n(o, p, q, r, s) {\n        this._endpoint = r;\n        this._loadingMenu = q;\n        this._instanceId = m++;\n        l[this._instanceId] = this;\n        this._mouseoverListener = g.listen(p, \"mouseover\", this._fetchMenu.bind(this));\n        this.parent.construct(this, o, p, null, s);\n    };\n;\n    n.setMenu = function(o, p) {\n        l[o].setMenu(p);\n    };\n    n.getInstance = function(o) {\n        return l[o];\n    };\n    i.extend(n, j);\n    k(n.prototype, {\n        _fetched: false,\n        _mouseoverListener: null,\n        _onLayerInit: function() {\n            if (!this._menu) {\n                this.setMenu(this._loadingMenu);\n            }\n        ;\n        ;\n            this._fetchMenu();\n            this._popover.getLayer().subscribe(\"key\", this._handleKeyEvent.bind(this));\n        },\n        _fetchMenu: function() {\n            if (this._fetched) {\n                return;\n            }\n        ;\n        ;\n            new h().setURI(this._endpoint).setData({\n                pmid: this._instanceId\n            }).send();\n            this._fetched = true;\n            if (this._mouseoverListener) {\n                this._mouseoverListener.remove();\n                this._mouseoverListener = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"PopoverMenuInterface\", [\"ArbiterMixin\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j() {\n    \n    };\n;\n    h(j.prototype, g, {\n        getRoot: i,\n        onShow: i,\n        onHide: i,\n        focusAnItem: i.thatReturnsFalse,\n        JSBNG__blur: i,\n        handleKeydown: i.thatReturnsFalse,\n        done: function() {\n            this.inform(\"done\");\n        }\n    });\n    e.exports = j;\n});\n__d(\"PopoverMenuOverlappingBorder\", [\"JSBNG__CSS\",\"DOM\",\"Style\",\"copyProperties\",\"cx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"shield\");\n    function m(n) {\n        this._popoverMenu = n;\n        this._popover = n.getPopover();\n        this._triggerElem = n.getTriggerElem();\n    };\n;\n    j(m.prototype, {\n        _shortBorder: null,\n        _setMenuSubscription: null,\n        _showSubscription: null,\n        _menuSubscription: null,\n        enable: function() {\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", l(this._onSetMenu, this));\n        },\n        disable: function() {\n            this._popoverMenu.unsubscribe(this._setMenuSubscription);\n            this._setMenuSubscription = null;\n            this._removeBorderSubscriptions();\n            this._removeShortBorder();\n        },\n        _onSetMenu: function() {\n            this._removeBorderSubscriptions();\n            this._menu = this._popoverMenu.getMenu();\n            this._renderShortBorder(this._menu.getRoot());\n            this._showSubscription = this._popover.subscribe(\"show\", l(this._updateBorder, this));\n            this._menuSubscription = this._menu.subscribe([\"change\",\"resize\",], l(Function.prototype.defer, l(this._updateBorder, this)));\n            this._updateBorder();\n        },\n        _updateBorder: function() {\n            var n = this._menu.getRoot(), o = this._triggerElem.offsetWidth, p = Math.max(((n.offsetWidth - o)), 0);\n            i.set(this._shortBorder, \"width\", ((p + \"px\")));\n        },\n        _renderShortBorder: function(n) {\n            this._shortBorder = h.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__shortborder\"\n            });\n            h.appendContent(n, this._shortBorder);\n            g.addClass(n, \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n        },\n        _removeShortBorder: function() {\n            if (this._shortBorder) {\n                h.remove(this._shortBorder);\n                this._shortBorder = null;\n                g.removeClass(this._popoverMenu.getMenu().getRoot(), \"-cx-PRIVATE-abstractMenuWithShortBorder__hasshortborder\");\n            }\n        ;\n        ;\n        },\n        _removeBorderSubscriptions: function() {\n            if (this._showSubscription) {\n                this._popover.unsubscribe(this._showSubscription);\n                this._showSubscription = null;\n            }\n        ;\n        ;\n            if (this._menuSubscription) {\n                this._menu.unsubscribe(this._menuSubscription);\n                this._menuSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = m;\n});\n__d(\"Menu\", [\"JSBNG__CSS\",\"Class\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Keys\",\"Parent\",\"PopoverMenuInterface\",\"ScrollableArea\",\"Style\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"Class\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"PopoverMenuInterface\"), o = b(\"ScrollableArea\"), p = b(\"Style\"), q = b(\"copyProperties\"), r = b(\"cx\");\n    function s(t, u) {\n        this.parent.construct(this);\n        this._items = [];\n        for (var v = 0; ((v < t.length)); v++) {\n            this._items[v] = new t[v].ctor(t[v]);\n        ;\n        };\n    ;\n        this._config = ((u || {\n        }));\n        this._theme = ((u.theme || {\n        }));\n    };\n;\n    h.extend(s, n);\n    q(s.prototype, {\n        _focused: null,\n        _root: null,\n        addItem: function(t) {\n            this._addItem(t);\n        },\n        addItemBefore: function(t, u) {\n            this._addItem(t, u, false);\n        },\n        addItemAfter: function(t, u) {\n            this._addItem(t, u, true);\n        },\n        _addItem: function(t, u, v) {\n            var w = this._items.indexOf(t);\n            if (((w >= 0))) {\n                var x = ((v ? -1 : 1));\n                if (((this._items[((w + x))] == u))) {\n                    return;\n                }\n            ;\n            ;\n                this._items.splice(w, 1);\n            }\n        ;\n        ;\n            if (u) {\n                w = this._items.indexOf(u);\n                if (((w < 0))) {\n                    throw new Error(\"reference item must already be in the menu\");\n                }\n            ;\n            ;\n                if (v) {\n                    w++;\n                }\n            ;\n            ;\n                this._items.splice(w, 0, t);\n            }\n             else this._items.push(t);\n        ;\n        ;\n            if (this._root) {\n                this._insertItem(t, u, v);\n            }\n        ;\n        ;\n        },\n        removeItem: function(t) {\n            var u = this._items.indexOf(t);\n            if (((u < 0))) {\n                return;\n            }\n        ;\n        ;\n            this._items.splice(u, 1);\n            ((this._root && j.remove(t.getRoot())));\n        },\n        forEachItem: function(t) {\n            this._items.forEach(t);\n        },\n        getItemAt: function(t) {\n            return ((this._items[t] || null));\n        },\n        getRoot: function() {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        onShow: function() {\n            if (this._config.maxheight) {\n                if (!this._scrollableArea) {\n                    this._scrollableArea = o.fromNative(this._scrollableElems.root, {\n                        fade: true\n                    });\n                }\n                 else this._scrollableArea.resize();\n            ;\n            }\n        ;\n        ;\n            this.focusAnItem();\n        },\n        onHide: function() {\n            this.JSBNG__blur();\n        },\n        focusAnItem: function() {\n            return this._attemptFocus(0, 1);\n        },\n        JSBNG__blur: function() {\n            if (this._focused) {\n                this._focused.JSBNG__blur();\n                this._focused = null;\n                this.inform(\"JSBNG__blur\");\n            }\n        ;\n        ;\n        },\n        handleKeydown: function(t, u) {\n            var v = this._items.indexOf(this._focused);\n            switch (t) {\n              case l.UP:\n            \n              case l.DOWN:\n                var w = ((((t === l.UP)) ? -1 : 1));\n                if (((v !== -1))) {\n                    return this._attemptFocus(((v + w)), w);\n                }\n                 else if (((t === l.UP))) {\n                    return this._attemptFocus(((this._items.length - 1)), -1);\n                }\n                 else return this._attemptFocus(0, 1)\n                \n            ;\n                break;\n              case l.SPACE:\n                if (((this._items.indexOf(this._focused) !== -1))) {\n                    this._handleItemClick(this._focused, u);\n                    return true;\n                }\n            ;\n            ;\n                return false;\n              default:\n                var x = String.fromCharCode(t).toLowerCase(), y;\n                for (var z = ((v + 1)); ((z < this._items.length)); z++) {\n                    y = this._items[z].getAccessKey();\n                    if (((y && ((y.charAt(0).toLowerCase() === x))))) {\n                        if (this._focusItem(this._items[z])) {\n                            return true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                };\n            ;\n                return false;\n            };\n        ;\n        },\n        _render: function() {\n            this._ul = j.create(\"ul\", {\n                className: \"-cx-PUBLIC-abstractMenu__menu\"\n            });\n            this._ul.setAttribute(\"role\", \"menu\");\n            this._items.forEach(function(v) {\n                this._insertItem(v, null);\n            }.bind(this));\n            k.listen(this._ul, \"click\", this._handleClick.bind(this));\n            k.listen(this._ul, \"mouseover\", this._handleMouseOver.bind(this));\n            k.listen(this._ul, \"mouseout\", this._handleMouseOut.bind(this));\n            var t = this._ul;\n            if (this._config.maxheight) {\n                this._scrollableElems = o.renderDOM();\n                j.setContent(this._scrollableElems.JSBNG__content, this._ul);\n                t = this._scrollableElems.root;\n                p.set(this._scrollableElems.wrap, \"max-height\", ((this._config.maxheight + \"px\")));\n            }\n        ;\n        ;\n            var u = ((((\"-cx-PUBLIC-abstractMenu__wrapper\" + ((this._config.className ? ((\" \" + this._config.className)) : \"\")))) + ((this._theme.className ? ((\" \" + this._theme.className)) : \"\"))));\n            this._root = j.create(\"div\", {\n                className: u\n            }, j.create(\"div\", {\n                className: \"-cx-PUBLIC-abstractMenu__border\"\n            }, t));\n            ((this._config.id && this._root.setAttribute(\"id\", this._config.id)));\n            this.inform(\"rendered\", this._root);\n        },\n        _needsDefaultBehavior: function(t) {\n            if (((t.isDefaultRequested && t.isDefaultRequested()))) {\n                var u = m.byTag(t.getTarget(), \"a\"), v = ((u && u.getAttribute(\"href\")));\n                return ((v && ((v[0] !== \"#\"))));\n            }\n        ;\n        ;\n            return false;\n        },\n        _handleClick: function(t) {\n            if (!this._needsDefaultBehavior(t)) {\n                var u = this._getItemInstance(t.getTarget());\n                if (u) {\n                    return this._handleItemClick(u, t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _handleItemClick: function(t, u) {\n            this.inform(\"itemclick\", {\n                JSBNG__item: t,\n                JSBNG__event: u\n            });\n            if (t.hasAction()) {\n                this.done();\n            }\n        ;\n        ;\n            return t.handleClick();\n        },\n        _handleMouseOver: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            ((u && this._focusItem(u, true)));\n        },\n        _handleMouseOut: function(t) {\n            var u = this._getItemInstance(t.getTarget());\n            if (((u && ((this._focused === u))))) {\n                this.JSBNG__blur();\n            }\n        ;\n        ;\n        },\n        _insertItem: function(t, u, v) {\n            var w = t.getRoot();\n            g.addClass(w, \"__MenuItem\");\n            i.set(w, \"MenuItem\", t);\n            if (u) {\n                var x = ((v ? j.insertAfter : j.insertBefore));\n                x(u.getRoot(), w);\n            }\n             else j.appendContent(this._ul, w);\n        ;\n        ;\n        },\n        _attemptFocus: function(t, u) {\n            var v = this.getItemAt(t);\n            if (v) {\n                if (this._focusItem(v)) {\n                    return true;\n                }\n                 else return this._attemptFocus(((t + u)), u)\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _focusItem: function(t, u) {\n            if (((t.JSBNG__focus(u) !== false))) {\n                if (((this._focused !== t))) {\n                    this.JSBNG__blur();\n                    this._focused = t;\n                    this.inform(\"JSBNG__focus\");\n                }\n            ;\n            ;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _getItemInstance: function(t) {\n            var u = m.byClass(t, \"__MenuItem\");\n            return ((u ? i.get(u, \"MenuItem\") : null));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuItemInterface\", [\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"emptyFunction\");\n    function i() {\n    \n    };\n;\n    g(i.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = this.render();\n            }\n        ;\n        ;\n            return this._root;\n        },\n        render: h,\n        getAccessKey: h,\n        hasAction: h.thatReturnsFalse,\n        JSBNG__focus: h.thatReturnsFalse,\n        JSBNG__blur: h.thatReturnsFalse,\n        handleClick: h.thatReturnsFalse\n    });\n    e.exports = i;\n});\n__d(\"MenuItemBase\", [\"Class\",\"DOM\",\"HTML\",\"MenuItemInterface\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"HTML\"), j = b(\"MenuItemInterface\"), k = b(\"copyProperties\"), l = b(\"cx\");\n    function m(n) {\n        this.parent.construct(this);\n        this._data = n;\n    };\n;\n    g.extend(m, j);\n    k(m.prototype, {\n        render: function() {\n            var n = \"-cx-PUBLIC-abstractMenuItem__root\";\n            if (this._data.className) {\n                n += ((\" \" + this._data.className));\n            }\n        ;\n        ;\n            var o = {\n                className: n,\n                \"aria-selected\": \"false\"\n            };\n            {\n                var fin251keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin251i = (0);\n                var p;\n                for (; (fin251i < fin251keys.length); (fin251i++)) {\n                    ((p) = (fin251keys[fin251i]));\n                    {\n                        if (((p.indexOf(\"data-\") === 0))) {\n                            o[p] = this._data[p];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return h.create(\"li\", o, this._renderItemContent());\n        },\n        _renderItemContent: function() {\n            return i(this._data.markup).getNodes();\n        }\n    });\n    e.exports = m;\n});\n__d(\"MenuItem\", [\"Class\",\"JSBNG__CSS\",\"DOM\",\"MenuItemBase\",\"React\",\"copyProperties\",\"cx\",\"emptyFunction\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"MenuItemBase\"), k = b(\"React\"), l = b(\"copyProperties\"), m = b(\"cx\"), n = b(\"emptyFunction\"), o = b(\"startsWith\"), p = [\"href\",\"rel\",\"ajaxify\",\"target\",];\n    function q(t, u) {\n        var v = {\n        };\n        p.forEach(function(w) {\n            if (((w in u))) {\n                v[w] = u[w];\n            }\n        ;\n        ;\n        });\n        i.setAttributes(t, v);\n    };\n;\n    function r(t) {\n        p.forEach(function(u) {\n            t.removeAttribute(u);\n        });\n    };\n;\n    function s(t) {\n        this.parent.construct(this, t);\n        this._disabled = !!this._data.disabled;\n    };\n;\n    g.extend(s, j);\n    l(s.prototype, {\n        getValue: function() {\n            return this._data.value;\n        },\n        getAccessKey: function() {\n            return ((this._data.label && this._data.label.charAt(0)));\n        },\n        hasAction: n.thatReturnsTrue,\n        JSBNG__focus: function(t) {\n            if (((this.isDisabled() || !this._root.offsetParent))) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.addClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"true\");\n            ((t || this._anchor.JSBNG__focus()));\n        },\n        JSBNG__blur: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__highlighted\");\n            h.removeClass(this._root, \"selected\");\n            this._root.setAttribute(\"aria-selected\", \"false\");\n        },\n        handleClick: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            if (((typeof this._onclickHandler === \"function\"))) {\n                return this._onclickHandler();\n            }\n        ;\n        ;\n            return true;\n        },\n        setOnClickHandler: function(t) {\n            this._onclickHandler = t;\n        },\n        _renderItemContent: function() {\n            this._anchor = i.create(\"a\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__anchor\",\n                tabIndex: ((this.isDisabled() ? -1 : 0))\n            });\n            if (this._data.reactChildren) {\n                k.renderComponent(k.DOM.span({\n                    className: \"-cx-PUBLIC-abstractMenuItem__label\"\n                }, this._data.reactChildren), this._anchor);\n                this._data.label = ((this._anchor.innerText || this._anchor.textContent));\n            }\n             else i.setContent(this._anchor, i.create(\"span\", {\n                className: \"-cx-PUBLIC-abstractMenuItem__label\"\n            }, ((this._data.markup || this._data.label))));\n        ;\n        ;\n            if (this._data.icon) {\n                i.prependContent(this._anchor, this._data.icon);\n                h.addClass(this._anchor, \"-cx-PUBLIC-abstractMenuItem__hasicon\");\n            }\n        ;\n        ;\n            if (!this.isDisabled()) {\n                q(this._anchor, this._data);\n            }\n        ;\n        ;\n            {\n                var fin252keys = ((window.top.JSBNG_Replay.forInKeys)((this._data))), fin252i = (0);\n                var t;\n                for (; (fin252i < fin252keys.length); (fin252i++)) {\n                    ((t) = (fin252keys[fin252i]));\n                    {\n                        if (((((typeof t === \"string\")) && o(t, \"data-\")))) {\n                            this._anchor.setAttribute(t, this._data[t]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this._anchor.setAttribute(\"role\", \"menuitem\");\n            this._anchor.setAttribute(\"title\", this._data.title);\n            return this._anchor;\n        },\n        isDisabled: function() {\n            return this._disabled;\n        },\n        enable: function() {\n            q(this._anchor, this._data);\n            this._anchor.tabIndex = 0;\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = false;\n        },\n        disable: function() {\n            r(this._anchor);\n            this._anchor.tabIndex = -1;\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            this._disabled = true;\n        },\n        render: function() {\n            var t = this.parent.render();\n            if (this._data.disabled) {\n                h.addClass(t, \"-cx-PUBLIC-abstractMenuItem__disabled\");\n            }\n        ;\n        ;\n            return t;\n        }\n    });\n    e.exports = s;\n});\n__d(\"MenuSelectableItem\", [\"Class\",\"JSBNG__CSS\",\"MenuItem\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JSBNG__CSS\"), i = b(\"MenuItem\"), j = b(\"copyProperties\"), k = b(\"cx\");\n    function l(m) {\n        this.parent.construct(this, m);\n        this._selected = !!this._data.selected;\n    };\n;\n    g.extend(l, i);\n    j(l.prototype, {\n        _selected: false,\n        getLabel: function() {\n            return this._data.label;\n        },\n        getIcon: function() {\n            return this._data.icon;\n        },\n        isSelected: function() {\n            return this._selected;\n        },\n        select: function() {\n            if (this.isDisabled()) {\n                return false;\n            }\n        ;\n        ;\n            h.addClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = true;\n        },\n        deselect: function() {\n            h.removeClass(this._root, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            this._selected = false;\n        },\n        render: function() {\n            var m = this.parent.render();\n            if (this._data.selected) {\n                h.addClass(m, \"-cx-PUBLIC-abstractMenuItem__checked\");\n            }\n        ;\n        ;\n            return m;\n        }\n    });\n    e.exports = l;\n});\n__d(\"SelectableMenu\", [\"Class\",\"Menu\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"Menu\"), i = b(\"arrayContains\"), j = b(\"copyProperties\"), k = b(\"createArrayFrom\");\n    function l(o, p) {\n        this.parent.construct(this, o, p);\n    };\n;\n    function m(o) {\n        return ((((o.select && o.deselect)) && o.isSelected));\n    };\n;\n    function n(o) {\n        return ((m(o) && o.isSelected()));\n    };\n;\n    g.extend(l, h);\n    j(l.prototype, {\n        focusAnItem: function() {\n            for (var o = 0; ((o < this._items.length)); o++) {\n                if (n(this._items[o])) {\n                    if (((this._focusItem(this._items[o]) !== false))) {\n                        return true;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            return this.parent.focusAnItem();\n        },\n        setValue: function(o) {\n            if (!this._root) {\n                this._render();\n            }\n        ;\n        ;\n            var p = k(o);\n            this._items.forEach(function(q) {\n                if (m(q)) {\n                    if (i(p, q.getValue())) {\n                        q.select();\n                    }\n                     else if (n(q)) {\n                        q.deselect();\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n            });\n            this.inform(\"change\", this._getSelection());\n        },\n        _handleItemClick: function(o, p) {\n            if (!m(o)) {\n                return this.parent._handleItemClick(o, p);\n            }\n        ;\n        ;\n            var q = this.inform(\"itemclick\", {\n                JSBNG__item: o,\n                JSBNG__event: p\n            });\n            if (q) {\n                return;\n            }\n        ;\n        ;\n            if (this._config.multiple) {\n                var r = ((n(o) ? o.deselect() : o.select()));\n                if (((r !== false))) {\n                    this.inform(\"change\", this._getSelection());\n                }\n            ;\n            ;\n            }\n             else {\n                if (!n(o)) {\n                    if (((o.select() !== false))) {\n                        this._items.forEach(function(s) {\n                            if (((n(s) && ((s !== o))))) {\n                                s.deselect();\n                            }\n                        ;\n                        ;\n                        });\n                        this.inform(\"change\", this._getSelection());\n                    }\n                ;\n                }\n            ;\n            ;\n                this.done();\n            }\n        ;\n        ;\n            return o.handleClick();\n        },\n        _getSelection: function() {\n            var o = [];\n            this._items.forEach(function(p) {\n                if (n(p)) {\n                    o.push({\n                        label: p.getLabel(),\n                        value: p.getValue(),\n                        JSBNG__item: p\n                    });\n                }\n            ;\n            ;\n            });\n            if (!this._config.multiple) {\n                o = o[0];\n            }\n        ;\n        ;\n            return o;\n        }\n    });\n    e.exports = l;\n});\n__d(\"PopoverLoadingMenu\", [\"Class\",\"DOM\",\"PopoverMenuInterface\",\"copyProperties\",\"cx\",\"joinClasses\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"PopoverMenuInterface\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"joinClasses\");\n    function m(n) {\n        this.parent.construct(this);\n        this._config = ((n || {\n        }));\n        this._theme = ((n.theme || {\n        }));\n    };\n;\n    g.extend(m, i);\n    j(m.prototype, {\n        _root: null,\n        getRoot: function() {\n            if (!this._root) {\n                this._root = h.create(\"div\", {\n                    className: l(\"-cx-PUBLIC-abstractMenu__wrapper\", this._config.className, this._theme.className)\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__border\"\n                }, h.create(\"div\", {\n                    className: \"-cx-PUBLIC-abstractMenu__menu -cx-PUBLIC-abstractLoadingMenu__root\"\n                }, h.create(\"span\", {\n                    className: \"-cx-PUBLIC-abstractLoadingMenu__spinner\"\n                }))));\n            }\n        ;\n        ;\n            return this._root;\n        }\n    });\n    e.exports = m;\n});\n__d(\"ContextualLayerAsyncRelative\", [\"JSBNG__Event\",\"copyProperties\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"Parent\");\n    function j(k) {\n        this._layer = k;\n    };\n;\n    h(j.prototype, {\n        _layerSubscription: null,\n        _listener: null,\n        enable: function() {\n            this._layerSubscription = this._layer.subscribe(\"show\", this._attachListener.bind(this));\n            if (this._layer.isShown()) {\n                this._attachListener();\n            }\n        ;\n        ;\n        },\n        disable: function() {\n            this._layerSubscription.unsubscribe();\n            this._layerSubscription = null;\n            if (this._listener) {\n                this._listener.remove();\n                this._listener = null;\n            }\n        ;\n        ;\n        },\n        _attachListener: function() {\n            this._listener = g.listen(this._layer.getRoot(), \"click\", this._onclick.bind(this));\n        },\n        _onclick: function(k) {\n            var l = i.byTag(k.getTarget(), \"A\");\n            if (!l) {\n                return;\n            }\n        ;\n        ;\n            var m = l.getAttribute(\"ajaxify\"), n = l.href, o = ((m || n));\n            if (((((l.rel === \"async\")) || ((l.rel === \"async-post\"))))) {\n                d([\"AsyncRequest\",], function(p) {\n                    p.bootstrap(o, this._layer.getContext(), ((l.rel === \"async-post\")));\n                }.bind(this));\n                return false;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"HoverFlyout\", [\"Arbiter\",\"ArbiterMixin\",\"DataStore\",\"JSBNG__Event\",\"Keys\",\"arrayContains\",\"copyProperties\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"DataStore\"), j = b(\"JSBNG__Event\"), k = b(\"Keys\"), l = b(\"arrayContains\"), m = b(\"copyProperties\"), n = b(\"removeFromArray\"), o = b(\"shield\");\n    function p(q, r, s, t) {\n        if (q) {\n            this._showDelay = s;\n            this._hideDelay = t;\n            this.init(q);\n            if (r) {\n                this.initNode(r);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        g.subscribe(\"SwapButtonDEPRECATED/focusOnJoinButton\", o(this.hideFlyout, this), g.SUBSCRIBE_ALL);\n    };\n;\n    m(p.prototype, h, {\n        init: function(q) {\n            this._flyout = q;\n            this._showDelay = ((this._showDelay || 0));\n            this._hideDelay = ((this._hideDelay || 100));\n            this._showTimeout = null;\n            this._hideTimeout = null;\n            this._flyoutSubscriptions = [this._flyout.subscribe(\"mouseenter\", this._onFlyoutMouseEnter.bind(this)),this._flyout.subscribe(\"mouseleave\", o(this.hideFlyout, this)),];\n            this._nodes = [];\n            this._dataStoreUnique = ((((\"HoverFlyout_\" + JSBNG__Date.now())) + \"_listeners\"));\n            return this;\n        },\n        initNode: function(q) {\n            if (l(this._nodes, q)) {\n                return this;\n            }\n        ;\n        ;\n            this._nodes.push(q);\n            i.set(q, this._dataStoreUnique, [j.listen(q, \"mouseenter\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"mouseleave\", o(this.hideFlyout, this)),j.listen(q, \"click\", this._onNodeMouseEnter.bind(this, q)),j.listen(q, \"keydown\", this._onNodeKeyEscape.bind(this)),]);\n            return this;\n        },\n        deactivateNode: function(q) {\n            var r = i.get(q, this._dataStoreUnique);\n            if (r) {\n                while (r.length) {\n                    r.pop().remove();\n                ;\n                };\n            }\n        ;\n        ;\n            n(this._nodes, q);\n        },\n        setShowDelay: function(q) {\n            this._showDelay = q;\n            return this;\n        },\n        setHideDelay: function(q) {\n            this._hideDelay = q;\n            return this;\n        },\n        showFlyout: function(q, r) {\n            this.setActiveNode(q);\n            if (r) {\n                this._flyout.setContext(q).show();\n                this.inform(\"show\", q);\n            }\n             else this._showTimeout = this.showFlyout.bind(this, q, true).defer(this._showDelay);\n        ;\n        ;\n            return this;\n        },\n        hideFlyout: function(q) {\n            JSBNG__clearTimeout(this._showTimeout);\n            if (q) {\n                this._flyout.hide();\n                ((this._activeNode && this.inform(\"hide\", this._activeNode)));\n                this._activeNode = null;\n            }\n             else this._hideTimeout = this.hideFlyout.bind(this, true).defer(this._hideDelay);\n        ;\n        ;\n        },\n        hideFlyoutDelayed: function(q) {\n            JSBNG__clearTimeout(this._showTimeout);\n            JSBNG__clearTimeout(this._hideTimeout);\n            this._hideTimeout = this.hideFlyout.bind(this, true).defer(q);\n        },\n        getActiveNode: function() {\n            return this._activeNode;\n        },\n        setActiveNode: function(q) {\n            JSBNG__clearTimeout(this._hideTimeout);\n            if (((this._activeNode && ((this._activeNode !== q))))) {\n                this.hideFlyout(true);\n            }\n        ;\n        ;\n            this._activeNode = q;\n            return this;\n        },\n        clearNodes: function() {\n            for (var q = this._nodes.length; ((q > 0)); q--) {\n                this.deactivateNode(this._nodes[((q - 1))]);\n            ;\n            };\n        ;\n        },\n        destroy: function() {\n            while (this._flyoutSubscriptions.length) {\n                this._flyout.unsubscribe(this._flyoutSubscriptions.pop());\n            ;\n            };\n        ;\n            this.clearNodes();\n        },\n        _onNodeMouseEnter: function(q) {\n            if (((this._activeNode === q))) {\n                JSBNG__clearTimeout(this._hideTimeout);\n            }\n             else this.showFlyout(q);\n        ;\n        ;\n        },\n        _onFlyoutMouseEnter: function() {\n            JSBNG__clearTimeout(this._hideTimeout);\n        },\n        _onNodeKeyEscape: function(JSBNG__event) {\n            if (((j.getKeyCode(JSBNG__event) === k.ESC))) {\n                ((this._activeNode && this.inform(\"hide\", this._activeNode)));\n                this._activeNode = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = ((a.HoverFlyout || p));\n});");
// 13342
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o164,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/bD9K1YDrR29.js",o165);
// undefined
o164 = null;
// undefined
o165 = null;
// 13347
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"xfhln\",]);\n}\n;\n__d(\"ComposerXEmptyAttachment\", [\"Class\",\"ComposerXAttachment\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"ComposerXAttachment\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.parent.construct(this);\n        this._root = k;\n        if (l) {\n            this.attachmentClassName = l;\n        };\n    };\n    g.extend(j, h);\n    i(j.prototype, {\n        getRoot: function() {\n            return this._root;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXDatepickerIconReset\", [\"CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbTimelineBackdatedComposer__datepickericonselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n    e.exports = i;\n});\n__d(\"TimelineCommentsLoader\", [\"Event\",\"CommentPrelude\",\"CSS\",\"DOM\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CommentPrelude\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"emptyFunction\"), m = {\n        init: function() {\n            m.init = l;\n            g.listen(document.body, \"click\", function(n) {\n                var o = k.byClass(n.getTarget(), \"fbTimelineFeedbackCommentLoader\");\n                if (o) {\n                    n.kill();\n                    h.click(o, false);\n                    var p = k.byTag(o, \"form\"), q = j.scry(p, \"li.uiUfiViewAll input\");\n                    if (!q.length) {\n                        q = j.scry(p, \"li.fbUfiViewPrevious input\");\n                    };\n                    if (!q.length) {\n                        q = j.scry(p, \"a.UFIPagerLink\");\n                    };\n                    q[0].click();\n                    i.show(j.find(p, \"li.uiUfiComments\"));\n                    i.removeClass(o, \"fbTimelineFeedbackCommentLoader\");\n                }\n            ;\n            });\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineCapsule\", [\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"Parent\",\"TimelineConstants\",\"TimelineLegacySections\",\"UserAgent\",\"Vector\",\"$\",\"createArrayFrom\",\"csx\",\"isEmpty\",\"queryThenMutateDOM\",\"requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DOMScroll\"), m = b(\"Parent\"), n = b(\"TimelineConstants\"), o = b(\"TimelineLegacySections\"), p = b(\"UserAgent\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"createArrayFrom\"), t = b(\"csx\"), u = b(\"isEmpty\"), v = b(\"queryThenMutateDOM\"), w = b(\"requestAnimationFrame\"), x = (function() {\n        var y = 45, z = 15, aa = \"use\", ba = \"update\", ca = {\n        }, da = {\n        };\n        function ea(ra) {\n            return h.hasClass(ra, \"fbTimelineBalancer\");\n        };\n        function fa(ra) {\n            return ra.getAttribute(\"data-spine\");\n        };\n        function ga(ra) {\n            return h.hasClass(ra, \"placeholderUnit\");\n        };\n        function ha(ra, sa) {\n            if (sa) {\n                return ((i.get(n.DS_SIDEORG, ra.id) || ra.getAttribute(\"data-side\")))\n            };\n            return ra.getAttribute(\"data-side\");\n        };\n        var ia = function(ra, sa) {\n            if ((p.ie() <= 6)) {\n                ia = function(ta, ua) {\n                    i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                    ta.setAttribute(\"data-side\", ua);\n                    h.removeClass(ta, \"leftColumn\");\n                    h.removeClass(ta, \"rightColumn\");\n                    h.addClass(ta, ((ua == \"l\") ? \"leftColumn\" : \"rightColumn\"));\n                };\n            }\n             else ia = function(ta, ua) {\n                i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                ta.setAttribute(\"data-side\", ua);\n            };\n        ;\n            ia(ra, sa);\n        };\n        function ja(ra) {\n            return ra.getAttribute(\"data-size\");\n        };\n        function ka(ra) {\n            if (((h.hasClass(ra, \"fbTimelineOneColumn\") && ra.prevSibling) && h.hasClass(ra.prevSibling, \"fbTimelineOneColumn\"))) {\n                return (z * 2)\n            };\n            if (h.hasClass(ra, \"fbTimelineIndeterminateContent\")) {\n                return 0\n            };\n            return z;\n        };\n        function la(ra, sa) {\n            var ta = 0;\n            if ((h.shown(ra) && !h.hasClass(ra, \"placeholderUnit\"))) {\n                if ((sa === aa)) {\n                    ta = i.get(n.DS_HEIGHT, ra.id, null);\n                    if ((ta === null)) {\n                        ta = ra.getAttribute(\"data-calculatedheight\");\n                    };\n                }\n                 else ta = (ra.offsetHeight + ka(ra));\n            \n            };\n            if (((sa === aa) && (ta === null))) {\n                ta = 300;\n            };\n            i.set(n.DS_HEIGHT, ra.id, parseInt(ta, 10));\n        };\n        function ma(ra) {\n            var sa = i.get(n.DS_HEIGHT, ra.id, null);\n            return sa;\n        };\n        function na(ra, sa) {\n            if ((ja(sa) == \"2\")) {\n                return 0;\n            }\n             else if ((ha(sa) == \"r\")) {\n                return (ra + ma(sa));\n            }\n             else return (ra - ma(sa))\n            \n        ;\n        };\n        function oa(ra) {\n            k.scry(ra, \".-cx-PUBLIC-timelineOneColMin__endmarker\").forEach(function(sa) {\n                var ta = sa.getAttribute(\"data-endmarker\"), ua = sa.getAttribute(\"data-pageindex\"), va = function() {\n                    if (!sa.parentNode) {\n                        return\n                    };\n                    i.set(n.DS_LOADED, ra.id, ua);\n                    j.remove(sa);\n                    g.inform(n.SECTION_FULLY_LOADED, {\n                        scrubberKey: ta,\n                        pageIndex: ua,\n                        capsuleID: ra.id,\n                        childCount: ra.childNodes.length\n                    });\n                };\n                if (o.get(ta)) {\n                    va();\n                }\n                 else var wa = g.subscribe(n.SECTION_REGISTERED, function(xa, ya) {\n                    if ((ya.scrubberKey === ta)) {\n                        va();\n                        wa.unsubscribe();\n                    }\n                ;\n                })\n            ;\n            });\n            g.inform(\"TimelineCapsule/balanced\", {\n                capsule: ra\n            });\n        };\n        function pa(ra) {\n            if (u(ca[ra.id])) {\n                return\n            };\n            var sa = (ea(ra) ? ra.firstChild : ra), ta = sa.childNodes.length, ua = {\n            }, va = {\n            }, wa, xa = z, ya = z, za, ab = [];\n            for (var bb = 0; (bb < ta); bb++) {\n                wa = sa.childNodes[bb];\n                if (h.hasClass(wa, \"fbTimelineUnit\")) {\n                    za = k.scry(wa, \"div.timelineUnitContainer\")[0];\n                    if (za) {\n                        va[wa.id] = za.getAttribute(\"data-time\");\n                    };\n                    if ((!ga(wa) && h.shown(wa))) {\n                        if ((ja(wa) == \"2\")) {\n                            ua[wa.id] = Math.max(xa, ya);\n                            xa = ya = (ua[wa.id] + ma(wa));\n                        }\n                         else if ((ha(wa) == \"r\")) {\n                            ua[wa.id] = ya;\n                            ya += ma(wa);\n                        }\n                         else {\n                            ua[wa.id] = xa;\n                            xa += ma(wa);\n                        }\n                        \n                    ;\n                        if (((ha(wa, true) == \"l\") || (ja(wa) == \"2\"))) {\n                            ab.push(wa.id);\n                        };\n                    }\n                ;\n                }\n            ;\n            };\n            for (bb = 0; (bb < (ab.length - 1)); ++bb) {\n                var cb = ab[bb], db = ab[(bb + 1)], eb = (ua[cb] + y), fb = ua[db];\n                for (var gb in ca[ra.id]) {\n                    if ((eb > fb)) {\n                        break;\n                    };\n                    var hb = ca[ra.id][gb];\n                    if (h.shown(hb)) {\n                        continue;\n                    };\n                    if (((va[gb] <= va[cb]) && (va[gb] > va[db]))) {\n                        hb.style.top = (eb + \"px\");\n                        eb += y;\n                        h.show(hb);\n                    }\n                ;\n                };\n            };\n        };\n        function qa(ra, sa) {\n            var ta = m.byAttribute(ra, \"data-size\");\n            if (ta) {\n                if (h.hasClass(ra.parentNode, \"timelineReportContent\")) {\n                    sa(ra);\n                }\n                 else sa(ta);\n            ;\n                x.balanceCapsule(m.byClass(ta, \"fbTimelineCapsule\"));\n            }\n        ;\n        };\n        return {\n            removeUnit: function(ra) {\n                qa(ra, function(sa) {\n                    j.remove(sa);\n                });\n            },\n            hideUnit: function(ra) {\n                qa(ra, function(sa) {\n                    h.addClass(sa, \"fbTimelineColumnHidden\");\n                });\n            },\n            undoHideUnit: function(ra, sa) {\n                j.remove(m.byClass(sa, \"hiddenText\"));\n                qa(ra, function(ta) {\n                    h.removeClass(ta, \"fbTimelineColumnHidden\");\n                });\n            },\n            unplacehold: function(ra) {\n                var sa = r(ra);\n                sa.style.top = null;\n                h.removeClass(sa, \"visiblePlaceholder\");\n                h.removeClass(sa, \"placeholder\");\n                var ta = m.byClass(sa, \"fbTimelineCapsule\");\n                delete ca[ta.id][ra];\n                x.balanceCapsule(ta);\n            },\n            scrollToCapsule: function(ra) {\n                if (!da.hasOwnProperty(ra.id)) {\n                    var sa = q.getElementPosition(ra.parentNode);\n                    l.scrollTo(new q(q.getScrollPosition().x, (sa.y - n.SUBSECTION_SCROLL_TO_OFFSET), \"document\"));\n                    da[ra.id] = true;\n                }\n            ;\n            },\n            balanceCapsuleFromChild: function(ra, sa) {\n                x.balanceCapsule(m.byClass(ra, \"fbTimelineCapsule\"), sa);\n            },\n            balanceCapsuleDeferred: function(ra, sa) {\n                x.balanceCapsule.curry(ra, sa).defer();\n            },\n            balanceCapsule: function(ra, sa) {\n                if ((!ra || !ra.childNodes)) {\n                    return\n                };\n                var ta = 0, ua, va = document.createDocumentFragment(), wa = [], xa = [], ya = [], za = false, ab = (sa && sa.heights_action);\n                if ((sa && sa.tail_balance)) {\n                    i.set(n.DS_TAILBALANCE, ra.id, sa.tail_balance);\n                };\n                if (((ab !== ba) && ((p.chrome() || p.webkit())))) {\n                    h.toggleClass(ra, \"webkitFix\");\n                };\n                for (var bb = 0; (bb < ra.childNodes.length); bb++) {\n                    ua = ra.childNodes[bb];\n                    if (fa(ua)) {\n                        continue;\n                    }\n                     else if (ea(ua)) {\n                        s(ua.firstChild.childNodes).forEach(function(jb) {\n                            la(jb, ab);\n                        });\n                        continue;\n                    }\n                    \n                ;\n                    la(ua, ab);\n                    if ((ha(ua, true) == \"r\")) {\n                        xa.push(ua);\n                    }\n                     else wa.push(ua);\n                ;\n                    ya.push(ua);\n                    if ((ja(ua) != \"2\")) {\n                        if (((((ta > 0) && (ha(ua) == \"r\"))) || (((ta < 0) && (ha(ua) == \"l\"))))) {\n                            za = true;\n                        }\n                    };\n                    ta = na(ta, ua);\n                };\n                var cb = [], db = [], eb = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    var kb = s(jb.firstChild.childNodes);\n                    if (jb.getAttribute(\"data-nonunits\")) {\n                        eb = eb.concat(kb);\n                    }\n                     else if ((ha(jb) == \"left\")) {\n                        cb = cb.concat(kb);\n                    }\n                     else if ((ha(jb) == \"right\")) {\n                        db = db.concat(kb);\n                    }\n                    \n                ;\n                });\n                if (za) {\n                    ra.style.minHeight = ra.offsetHeight;\n                    wa.forEach(function(jb) {\n                        if ((ja(jb) != \"2\")) {\n                            ia(jb, \"l\");\n                        };\n                    });\n                    xa.forEach(function(jb) {\n                        if ((ja(jb) != \"2\")) {\n                            ia(jb, \"r\");\n                        };\n                    });\n                    var fb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, wa));\n                    fb.setAttribute(\"data-side\", \"left\");\n                    j.prependContent(ra, fb);\n                    cb = wa.concat(cb);\n                    var gb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, xa));\n                    gb.setAttribute(\"data-side\", \"right\");\n                    j.prependContent(ra, gb);\n                    db = xa.concat(db);\n                    ta = 0;\n                }\n            ;\n                while (eb.length) {\n                    va.appendChild(eb.shift());;\n                };\n                while (((((ta >= 0) && cb.length)) || (((ta < 0) && db.length)))) {\n                    if ((ta >= 0)) {\n                        ua = cb.shift();\n                    }\n                     else ua = db.shift();\n                ;\n                    va.appendChild(ua);\n                    ta = na(ta, ua);\n                };\n                ra.appendChild(va);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    if (!jb.firstChild.childNodes.length) {\n                        j.remove(jb);\n                    };\n                });\n                var hb = (((sa && sa.tail_balance)) || i.get(n.DS_TAILBALANCE, ra.id));\n                if (hb) {\n                    ta = x.tailBalance(ra, ta, hb);\n                };\n                if (za) {\n                    ya.forEach(function(jb) {\n                        if ((jb.parentNode !== ra)) {\n                            ra.appendChild(jb);\n                            ta = na(ta, jb);\n                        }\n                    ;\n                    });\n                    ra.style.minHeight = null;\n                }\n            ;\n                var ib = m.byClass(ra, \"fbTimelineSection\");\n                if (ib) {\n                    i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib.id, ta);\n                };\n                ca[ra.id] = {\n                };\n                k.scry(ra, \"li.placeholderUnit\").forEach(function(jb) {\n                    ca[ra.id][jb.id] = jb;\n                });\n                pa(ra);\n                oa(ra);\n                if ((ab === aa)) {\n                    sa.heights_action = ba;\n                    w(function() {\n                        w(x.balanceCapsule.curry(ra, sa));\n                    });\n                }\n            ;\n            },\n            tailBalance: function(ra, sa, ta) {\n                if (!ra) {\n                    return sa\n                };\n                var ua = [], va = [], wa = [], xa = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    var ab = s(za.firstChild.childNodes);\n                    if (za.getAttribute(\"data-nonunits\")) {\n                        xa = xa.concat(ab);\n                    }\n                     else if ((ha(za) == \"left\")) {\n                        va = va.concat(ab);\n                    }\n                     else if ((ha(za) == \"right\")) {\n                        wa = wa.concat(ab);\n                    }\n                    \n                ;\n                    ua = ua.concat(ab);\n                });\n                if (((((ta == n.FIXED_SIDE_RIGHT) && va.length)) || (((ta == n.FIXED_SIDE_LEFT) && wa.length)))) {\n                    return sa\n                };\n                var ya = document.createDocumentFragment();\n                if (ua) {\n                    while (ua.length) {\n                        if ((ta != n.FIXED_SIDE_NONE)) {\n                            if ((ja(ua[0]) != \"2\")) {\n                                if ((sa >= 0)) {\n                                    ia(ua[0], \"l\");\n                                }\n                                 else ia(ua[0], \"r\");\n                            \n                            }\n                        };\n                        sa = na(sa, ua[0]);\n                        ya.appendChild(ua.shift());\n                    }\n                };\n                ra.appendChild(ya);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    if (!za.firstChild.childNodes.length) {\n                        j.remove(za);\n                    };\n                });\n                return sa;\n            },\n            loadTwoColumnUnits: function(ra) {\n                var sa = r(ra);\n                v(function() {\n                    var ta = m.byClass(sa, \"fbTimelineSection\");\n                    if (ta) {\n                        var ua = k.find(sa, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\"), va = k.find(sa, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\"), wa = (va.offsetHeight - ua.offsetHeight);\n                        i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ta.id, wa);\n                    }\n                ;\n                }, oa.curry(sa));\n            }\n        };\n    })();\n    e.exports = (a.TimelineCapsule || x);\n});\n__d(\"TimelineCapsuleUtilities\", [\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = {\n        setFirstUnit: function(i) {\n            var j = true;\n            for (var k = 0; (k < i.childNodes.length); ++k) {\n                var l = i.childNodes[k];\n                if ((l.id.indexOf(\"tl_unit_\") === 0)) {\n                    if (j) {\n                        j = false;\n                        g.addClass(l, \"firstUnit\");\n                    }\n                     else {\n                        g.removeClass(l, \"firstUnit\");\n                        break;\n                    }\n                \n                };\n            };\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineUnitSelector\", [\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Parent\"), i = {\n        getUnitsWithTime: function(j) {\n            return g.scry(j, \"div.timelineUnitContainer\").filter(function(k) {\n                return (((h.byClass(k, \"fbTimelineCapsule\") === j) && k.getAttribute(\"data-time\")));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"TimelineComposerUtilities\", [\"Event\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineUnitSelector\",\"Vector\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"TimelineUnitSelector\"), o = b(\"Vector\"), p = b(\"cx\"), q = b(\"csx\"), r = (86400 * 31), s = 86400000, t = {\n        listenToSetEstimatedDate: function(u, v) {\n            return h.subscribe(\"ComposerXTimelineTagger/init\", function(w, x) {\n                if (l.contains(u, x.datePickerElement)) {\n                    t.setEstimatedDate(x.datePickerInstance, v());\n                    x.composerTimelineTagger.switchToTagger(\"date\");\n                }\n            ;\n            });\n        },\n        listenToSetEstimatedDateOld: function(u, v) {\n            return h.subscribe(\"TimelineBackdatedComposerTagger/initialized\", function(event, w) {\n                if ((w.composer === u)) {\n                    w.date_picker.subscribe(\"initialized\", function(x, y) {\n                        t.setEstimatedDate(y, v());\n                    });\n                };\n            });\n        },\n        listenToPublish: function(u, v) {\n            if (u.root) {\n                u = u.root;\n            };\n            return h.subscribe(\"composer/publish\", function(event, w) {\n                if ((w.composer_id === u.id)) {\n                    i.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                        x.publish(w);\n                        (v && v());\n                    });\n                };\n            });\n        },\n        listenToAnotherComposerOpen: function(u, v) {\n            return h.subscribe(\"composer/mutate\", function(w, x) {\n                if ((x !== u)) {\n                    v();\n                };\n            });\n        },\n        listenToCancel: function(u, v) {\n            return g.listen(u, \"click\", function(event) {\n                if (m.byClass(event.getTarget(), \"-cx-PRIVATE-fbTimelineComposer__cancelbutton\")) {\n                    v();\n                };\n            });\n        },\n        listenToCancelOld: function(u, v) {\n            return g.listen(u, \"click\", function(event) {\n                (m.byClass(event.getTarget(), \"cancelBtn\") && v());\n            });\n        },\n        hidePlaceIfAttachmentsTooTall: function(u) {\n            var v = l.find(u, \".-cx-PRIVATE-fbComposer__attachmentform\"), w = o.getElementDimensions(v).y;\n            if ((w > 50)) {\n                j.hide(l.find(v, \".-cx-PRIVATE-fbComposerAttachment__place\"));\n            };\n        },\n        hidePlaceIfAttachmentsTooTallOld: function(u) {\n            var v = k.find(u, \"ul.fbTimelineComposerAttachments\"), w = o.getElementDimensions(v).y;\n            if ((w > 50)) {\n                var x = m.byTag(k.scry(v, \"span.placeAttachment\")[0], \"li\");\n                (x && j.hide(x));\n            }\n        ;\n        },\n        setEstimatedDate: function(u, v) {\n            var w, x;\n            if ((v && j.hasClass(v, \"fbTimelineCapsule\"))) {\n                w = v.getAttribute(\"data-start\");\n                x = v.getAttribute(\"data-end\");\n                if ((w && x)) {\n                    var y = new Date((x * 1000)), z = new Date();\n                    if ((y > z)) {\n                        u.setDate(z.getFullYear(), (z.getMonth() + 1), z.getDate());\n                    }\n                     else if (((x - w) > (2 * r))) {\n                        u.setDate(y.getFullYear());\n                    }\n                     else u.setDate(y.getFullYear(), (y.getMonth() + 1));\n                    \n                ;\n                }\n            ;\n                return;\n            }\n        ;\n            var aa = m.byClass(v, \"fbTimelineCapsule\");\n            if (aa) {\n                w = aa.getAttribute(\"data-start\");\n                x = aa.getAttribute(\"data-end\");\n                var ba = o.getElementPosition(v).y, ca = [x,null,], da = [w,null,], ea = n.getUnitsWithTime(aa);\n                for (var fa = 0; (fa < ea.length); fa++) {\n                    var ga = ea[fa], ha = k.scry(ga.parentNode, \".spinePointer\")[0];\n                    if (!ha) {\n                        continue;\n                    };\n                    var ia = o.getElementPosition(ha).y;\n                    if ((ia <= ba)) {\n                        if ((!ca[1] || (ia > ca[1]))) {\n                            ca = [ga.getAttribute(\"data-time\"),ia,];\n                        };\n                    }\n                     else if ((!da[1] || (ia < da[1]))) {\n                        da = [ga.getAttribute(\"data-time\"),ia,];\n                    }\n                ;\n                };\n                if (((ca[0] !== null) && (da[0] !== null))) {\n                    var ja = (Math.round((((parseInt(ca[0], 10) + parseInt(da[0], 10))) / 2)) * 1000);\n                    ja = Math.min((new Date() - s), ja);\n                    u.setDateWithTimestamp(ja);\n                }\n            ;\n            }\n        ;\n        },\n        showMLEFlyout: function(u) {\n            var v = (k.scry(document, \"a.fbTimelineSpine\").length === 0), w = function(x) {\n                x.showMLEFlyout(u);\n            };\n            if (v) {\n                i.loadModules([\"TimelineSpinelessComposer\",], w);\n            }\n             else i.loadModules([\"TimelineComposer\",], w);\n        ;\n        }\n    };\n    e.exports = t;\n});\n__d(\"TimelineComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineCapsule\",\"TimelineCapsuleUtilities\",\"TimelineComposerUtilities\",\"$\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineCapsule\"), n = b(\"TimelineCapsuleUtilities\"), o = b(\"TimelineComposerUtilities\"), p = b(\"$\"), q = b(\"cx\"), r;\n    function s(x) {\n        if ((x.isScheduledPost || x.isOGPost)) {\n            return\n        };\n        if (!x.streamStory) {\n            window.location.reload();\n            return;\n        }\n    ;\n        if (x.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(z) {\n                z.publish(x);\n            });\n            return;\n        }\n    ;\n        var y = w.renderCapsuleBasedStory(r, x.streamStory);\n        g.inform(\"TimelineComposer/on_after_publish\", y, g.BEHAVIOR_PERSISTENT);\n    };\n    function t() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\");\n        return j.find(x, \".spinePointer\");\n    };\n    function u(x) {\n        var y = v();\n        i.show(y);\n        var z = x.subscribe(\"hide\", function() {\n            i.hide(y);\n            x.unsubscribe(z);\n        });\n    };\n    function v() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\"), y = j.scry(x, \"div.composerVeil\");\n        if ((y.length !== 1)) {\n            y = j.appendContent(x, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        };\n        return y[0];\n    };\n    var w = {\n        init: function(x) {\n            r = p(x);\n            var y = g.subscribe(\"composer/publish\", function(event, z) {\n                if ((z.composer_id === r.id)) {\n                    s(z);\n                };\n            });\n            l.onLeave(y.unsubscribe.bind(y));\n            if (i.hasClass(r, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                o.hidePlaceIfAttachmentsTooTall(r);\n            }\n             else o.hidePlaceIfAttachmentsTooTallOld(r);\n        ;\n        },\n        showMLEFlyout: function(x) {\n            x.setContext(t()).show();\n            u(x);\n        },\n        renderCapsuleBasedStory: function(x, y) {\n            var z = k.byClass(x, \"fbTimelineCapsule\");\n            if (!z) {\n                return\n            };\n            var aa = k.byClass(x, \"timelineUnitContainer\").parentNode;\n            if (aa.nextSibling.getAttribute(\"data-spine\")) {\n                aa = aa.nextSibling;\n            };\n            var ba = j.insertAfter(aa, y)[0];\n            h.loadModules([\"Animation\",], function(ca) {\n                new ca(ba.firstChild).from(\"backgroundColor\", \"#fff8dd\").to(\"backgroundColor\", \"#fff\").duration(2000).ease(ca.ease.both).go();\n            });\n            n.setFirstUnit(z);\n            m.balanceCapsule(z);\n            return ba;\n        }\n    };\n    e.exports = (a.TimelineComposer || w);\n});\n__d(\"TimelineContentLoader\", [\"Event\",\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"DOMScroll\",\"OnVisible\",\"ScrollingPager\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"TimelineSmartInsert\",\"TimelineURI\",\"UIPagelet\",\"UserAgent\",\"Vector\",\"$\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"debounce\",\"ge\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMScroll\"), l = b(\"OnVisible\"), m = b(\"ScrollingPager\"), n = b(\"TimelineConstants\"), o = b(\"TimelineController\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineSmartInsert\"), r = b(\"TimelineURI\"), s = b(\"UIPagelet\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"$\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"createArrayFrom\"), z = b(\"csx\"), aa = b(\"debounce\"), ba = b(\"ge\"), ca = b(\"startsWith\"), da = b(\"tx\"), ea = b(\"userAction\"), fa = false, ga = false, ha, ia = null, ja = {\n    }, ka = [], la = [], ma = [], na = {\n    }, oa = {\n    }, pa = {\n    }, qa = {\n    }, ra = null, sa = null, ta = false, ua = null;\n    function va(eb, fb, gb, hb, ib) {\n        this.node = eb;\n        this.loaded = hb;\n        this.canScrollLoad = true;\n        this.canUnload = (fb != db.RECENT);\n        this.scrubberKey = fb;\n        this.historicUnitCount = ib;\n        this._pageletLoadData = gb;\n        this._expandPageletLoadData = {\n        };\n        this.rightColumnFinished = false;\n    };\n    x(va.prototype, {\n        load: function(eb, fb) {\n            if (this.loaded) {\n                return\n            };\n            var gb = this._pageletLoadData;\n            h.inform(n.SECTION_LOADING, {\n                data: gb,\n                scrubberKey: this.scrubberKey\n            });\n            this.loaded = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            var hb = \"ProfileTimelineSectionPagelet\", ib = (this.scrubberKey == db.WAY_BACK);\n            if (ib) {\n                hb = \"ProfileTimelineRemainingYearsPagelet\";\n            };\n            gb.time_cutoff = db.getTimeCutoff();\n            gb.highlight_unit_data = eb;\n            gb.parent_key = this.parentKey;\n            gb.force_no_friend_activity = ta;\n            i.addClass(this.node, \"fbTimelineSectionLoading\");\n            if (gb.combine_sections) {\n                i.addClass(this.node, \"combinedSections\");\n            };\n            if ((this.canUnload && ga)) {\n                var jb = this.node.firstChild.cloneNode(true);\n                i.hide(jb);\n                j.insertAfter(this.node, jb);\n            }\n             else this.canScrollLoad = false;\n        ;\n            var kb = null;\n            if ((fb && !mb)) {\n                var lb = this.node;\n                lb.style.minHeight = (window.innerHeight + \"px\");\n                kb = function() {\n                    lb.style.minHeight = null;\n                };\n            }\n        ;\n            var mb = (gb.combine_sections && ib);\n            pa[this.scrubberKey] = s.loadFromEndpoint(hb, (mb ? (gb.unit_container_id + \"_left\") : this.node.id), gb, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true,\n                append: mb,\n                finallyHandler: kb\n            });\n            cb(this.scrubberKey);\n        },\n        preload: function() {\n            i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            var eb = j.find(this.node, \"span.sectionLabel\");\n            if (eb.getAttribute(\"data-original-label\")) {\n                j.setContent(eb, eb.getAttribute(\"data-original-label\"));\n                eb.removeAttribute(\"data-original-label\");\n            }\n        ;\n        },\n        unload: function() {\n            if ((!this.loaded || !this.canUnload)) {\n                return\n            };\n            this.loaded = false;\n            (pa[this.scrubberKey] && pa[this.scrubberKey].cancel());\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            if ((this.node.nextSibling && i.hasClass(this.node.nextSibling, \"fbTimelineSection\"))) {\n                j.setContent(this.node, this.node.nextSibling);\n                i.show(this.node.firstChild);\n            }\n             else j.empty(this.node);\n        ;\n            this.deactivateScrollLoad();\n        },\n        activateScrollLoad: function() {\n            this.canScrollLoad = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            (oa[this.scrubberKey] && oa[this.scrubberKey].reset());\n        },\n        deactivateScrollLoad: function() {\n            if (!this.loaded) {\n                this.canScrollLoad = false;\n                i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n                i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n                (oa[this.scrubberKey] && oa[this.scrubberKey].remove());\n            }\n        ;\n        },\n        setExpandLoadData: function(eb) {\n            this._expandPageletLoadData = eb;\n            return this;\n        },\n        appendData: function(eb) {\n            x(this._pageleLoadData, eb);\n            return this;\n        },\n        expandSubSections: function() {\n            if (this.subSections.length) {\n                db.navigateToSection(this.subSections[0].scrubberKey);\n            };\n        },\n        expand: function(eb) {\n            if (!this.loaded) {\n                return\n            };\n            sa.add_event((\"expand_\" + this.scrubberKey));\n            var fb = j.find(this.node, \".fbTimelineSectionExpander\");\n            i.addClass(fb.firstChild, \"async_saving\");\n            (eb && i.addClass(eb, \"async_saving\"));\n            this._expandPageletLoadData.time_cutoff = db.getTimeCutoff();\n            db.navigateToSection(this.scrubberKey);\n            j.scry(this.node, \".fbTimelineCapsule\").forEach(j.remove);\n            this._expandPageletLoadData.new_expand = true;\n            (pa[this.scrubberKey] && pa[this.scrubberKey].cancel());\n            pa[this.scrubberKey] = s.loadFromEndpoint(\"ProfileTimelineSectionPagelet\", fb.id, this._expandPageletLoadData, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true\n            });\n        },\n        isPermalinkPeriod: function() {\n            return this._pageletLoadData.is_permalink_period;\n        }\n    });\n    function wa() {\n        if (fa) {\n            return\n        };\n        o.register(o.CONTENT, db);\n        sa = ea(\"timeline\").uai(\"init\", \"scrubber\", false);\n        fa = true;\n        if ((t.ie() <= 7)) {\n            ga = true;\n        };\n    };\n    var xa = aa(function(eb, fb, gb) {\n        var hb = p.get(eb).historicUnitCount;\n        fb -= hb;\n        gb -= 1;\n        if ((((hb == -1) || (gb <= 0)) || (fb < 0))) {\n            return\n        };\n        var ib = db.getNextSectionKey(eb);\n        if (ib) {\n            p.get(ib).load();\n            xa(ib, fb, gb);\n        }\n    ;\n    }, 500);\n    function ya(eb, fb, gb, hb) {\n        var ib = db.getNextSectionKey(fb);\n        if (ib) {\n            oa[ib] = new l(eb, za.curry(ib, eb), false, (gb || 1000));\n        }\n         else if ((fb !== db.WAY_BACK)) {\n            hb = (hb ? hb : 0);\n            if ((hb > 80)) {\n                return null\n            };\n            ya.curry(eb, fb, gb, (hb + 1)).defer(250);\n        }\n        \n    ;\n    };\n    function za(eb, fb) {\n        var gb = p.get(eb);\n        if ((gb && gb.canScrollLoad)) {\n            sa.add_event((\"scroll_load_\" + eb));\n            if (ga) {\n                gb.preload();\n            }\n             else {\n                gb.load();\n                if (ua) {\n                    xa(eb, ua.required_units, ua.max_parallelism);\n                };\n            }\n        ;\n            (fb && j.remove(fb));\n        }\n    ;\n    };\n    function ab() {\n        var eb, fb, gb = false;\n        for (var hb = 0; (hb < ka.length); hb++) {\n            var ib = ka[hb];\n            if (!ib) {\n                continue;\n            };\n            var jb = p.get(ib);\n            if ((jb && ((jb.canScrollLoad || jb.loaded)))) {\n                if (!jb.loaded) {\n                    i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n                    i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n                }\n            ;\n                if ((eb && fb)) {\n                    bb(eb, fb);\n                    if (gb) {\n                        eb.deactivateScrollLoad();\n                    };\n                    gb = true;\n                }\n            ;\n                eb = null;\n                fb = null;\n                continue;\n            }\n             else if (eb) {\n                fb = jb;\n                jb.deactivateScrollLoad();\n            }\n             else {\n                eb = jb;\n                if (gb) {\n                    jb.activateScrollLoad();\n                };\n            }\n            \n        ;\n            i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n        };\n    };\n    function bb(eb, fb) {\n        i.removeClass(fb.node, \"fbTimelineTimePeriodUnexpanded\");\n        i.addClass(fb.node, \"fbTimelineTimePeriodSuppressed\");\n        var gb = j.find(eb.node, \"span.sectionLabel\"), hb = j.find(fb.node, \"span.sectionLabel\");\n        if (!hb.getAttribute(\"data-original-label\")) {\n            hb.setAttribute(\"data-original-label\", j.getText(hb));\n        };\n        if (((gb.getAttribute(\"data-month\") && hb.getAttribute(\"data-month\")) && (gb.getAttribute(\"data-year\") == hb.getAttribute(\"data-year\")))) {\n            j.setContent(hb, da._(\"Show {month1} - {month2} {year}\", {\n                month1: hb.getAttribute(\"data-month\"),\n                month2: gb.getAttribute(\"data-month\"),\n                year: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else if ((gb.getAttribute(\"data-year\") !== hb.getAttribute(\"data-year\"))) {\n            j.setContent(hb, da._(\"Show {year1} - {year2}\", {\n                year1: hb.getAttribute(\"data-year\"),\n                year2: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else j.setContent(hb, da._(\"Show {year}\", {\n            year: hb.getAttribute(\"data-year\")\n        }));\n        \n    ;\n    };\n    function cb(eb) {\n        if (ga) {\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                };\n                if ((gb != eb)) {\n                    var hb = p.get(gb);\n                    if ((hb.loaded && hb.canUnload)) {\n                        hb.unload();\n                    };\n                }\n            ;\n            }\n        };\n        ab();\n    };\n    var db = {\n        WAY_BACK: \"way_back\",\n        RECENT: \"recent\",\n        HEADER_SCROLL_CUTOFF: 80,\n        CURRENT_SECTION_OFFSET: 150,\n        FOOTER_HEIGHT: 60,\n        registerTimePeriod: function(eb, fb, gb, hb, ib, jb, kb) {\n            wa();\n            if (w(ma, fb)) {\n                return\n            };\n            if (la) {\n                x(gb, la);\n            };\n            var lb = new va(eb, fb, gb, hb, kb);\n            if (!ib) {\n                ka[jb] = fb;\n                ja[fb] = true;\n            }\n             else {\n                lb.parentKey = ib;\n                p.get(ib).subSections = (p.get(ib).subSections || []);\n                p.get(ib).subSections[jb] = lb;\n            }\n        ;\n            p.set(fb, lb);\n            db.checkCurrentSectionChange();\n            h.inform(n.SECTION_REGISTERED, {\n                scrubberKey: fb\n            });\n        },\n        reset: function() {\n            for (var eb in oa) {\n                oa[eb].remove();;\n            };\n            for (var fb in pa) {\n                (pa[fb] && pa[fb].cancel());;\n            };\n            for (var gb in qa) {\n                qa[gb].unsubscribe();\n                delete qa[gb];\n            };\n            (ha && ha.unsubscribe());\n            ha = null;\n            p.removeAll();\n            ia = null;\n            ja = {\n            };\n            ka = [];\n            la = [];\n            ma = [];\n            na = {\n            };\n            oa = {\n            };\n            pa = {\n            };\n            ra = null;\n            sa = null;\n            ta = false;\n            fa = false;\n        },\n        checkCurrentSectionChange: function() {\n            var eb = db.getCurrentSection(), fb = (ia && ia.scrubberKey);\n            if (((eb && (eb.scrubberKey !== fb)) && !eb.isPermalinkPeriod())) {\n                ia = eb;\n                var gb = eb.scrubberKey, hb = eb.parentKey;\n                if (!hb) {\n                    hb = gb;\n                    gb = null;\n                }\n            ;\n                o.sectionHasChanged(hb, gb);\n            }\n        ;\n        },\n        setTimeCutoff: function(eb) {\n            ra = eb;\n        },\n        getTimeCutoff: function() {\n            return ra;\n        },\n        setParallelLoadConfig: function(eb) {\n            ua = eb;\n        },\n        getCurrentSection: function() {\n            var eb = {\n            }, fb = p.getAll();\n            for (var gb in fb) {\n                var hb = fb[gb];\n                if ((!hb.loaded || na[hb.scrubberKey])) {\n                    continue;\n                };\n                var ib = u.getElementPosition(hb.node, \"viewport\").y;\n                if ((hb.scrubberKey == \"recent\")) {\n                    ib--;\n                };\n                if ((ib < db.CURRENT_SECTION_OFFSET)) {\n                    eb[ib] = hb;\n                };\n            };\n            var jb = Math.max.apply(null, Object.keys(eb)), kb = (jb == -Infinity);\n            if (!kb) {\n                return eb[jb];\n            }\n             else if (ka[0]) {\n                return p.get(ka[0])\n            }\n        ;\n            return null;\n        },\n        capsuleForCurrentSection: function() {\n            var eb = db.getCurrentSection();\n            return (eb && j.scry(eb.node, \".fbTimelineCapsule\")[0]);\n        },\n        enableScrollLoad: function(eb, fb, gb, hb) {\n            eb = v(eb);\n            var ib = j.scry(eb.parentNode, \".fbTimelineCapsule\")[0];\n            if (!ib) {\n                return\n            };\n            if ((gb === null)) {\n                ya(eb, fb, hb);\n            }\n             else o.runOnceWhenSectionFullyLoaded(ya.curry(eb, fb, hb), fb, gb);\n        ;\n        },\n        enableScrollLoadOnClick: function(eb, fb, gb) {\n            eb = v(eb);\n            g.listen(eb, \"click\", function(hb) {\n                hb.prevent();\n                db.enableScrollLoad(eb, fb, null, gb);\n            });\n        },\n        expandSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expand();\n            });\n        },\n        expandSubSectionsOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expandSubSections();\n            });\n        },\n        getNextSectionKey: function(eb) {\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                if ((ka[fb] == eb)) {\n                    while (((fb < (ka.length - 1)) && !ka[(fb + 1)])) {\n                        fb++;;\n                    };\n                    return ka[(fb + 1)];\n                }\n            ;\n            };\n            var gb = p.get(eb);\n            if ((!gb || !gb.parentKey)) {\n                return\n            };\n            var hb = p.get(gb.parentKey);\n            if (!hb) {\n                return\n            };\n            for (var ib = 0; (ib < (hb.subSections.length - 1)); ib++) {\n                if ((hb.subSections[ib].scrubberKey == eb)) {\n                    return hb.subSections[(ib + 1)].scrubberKey\n                };\n            };\n        },\n        hideSection: function(eb) {\n            var fb = p.get(eb);\n            (fb && i.hide(j.find(fb.node, \".fbTimelineSection\")));\n            var gb = o.getCurrentScrubber();\n            if (gb) {\n                var hb = o.getCurrentScrubber().getNav(eb);\n                (hb && i.hide(hb));\n            }\n        ;\n            var ib = o.getCurrentStickyHeaderNav();\n            (ib && ib.removeTimePeriod(eb));\n            na[eb] = true;\n        },\n        loadSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).load();\n            });\n        },\n        removeSection: function(eb) {\n            for (var fb in ka) {\n                if ((ka[fb] == eb)) {\n                    ka[fb] = null;\n                    break;\n                }\n            ;\n            };\n            p.remove(eb);\n            delete ja[eb];\n            if ((eb in oa)) {\n                oa[eb].remove();\n                delete oa[eb];\n            }\n        ;\n            var gb = o.getCurrentStickyHeaderNav();\n            (gb && gb.removeTimePeriod(eb));\n            ma.push(eb);\n        },\n        removeSectionParent: function(eb) {\n            j.remove(v(eb).parentNode);\n        },\n        navigateToSection: function(eb, fb, gb) {\n            sa.add_event((\"nav_\" + eb));\n            fb = !!fb;\n            var hb = eb, ib = p.get(eb);\n            if (!ib) {\n                return\n            };\n            if (!ib.loaded) {\n                q.enable();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineShowOlderSections\").forEach(j.remove);\n            }\n        ;\n            if (!ja[eb]) {\n                ib.node.style.minHeight = (u.getViewportDimensions().y + \"px\");\n                var jb = h.subscribe(n.SECTION_FULLY_LOADED, function(rb, sb) {\n                    if ((sb.scrubberKey === eb)) {\n                        ib.node.style.minHeight = \"\";\n                        jb.unsubscribe();\n                    }\n                ;\n                });\n                hb = ib.parentKey;\n                var kb = p.get(hb).node;\n                if (!i.hasClass(kb, \"fbTimelineSectionExpanded\")) {\n                    k.scrollTo(kb, 0);\n                    i.addClass(kb, \"fbTimelineSectionExpanded\");\n                    j.scry(kb, \".fbTimelineCapsule\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineSectionExpandPager\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineContentHeader\").forEach(j.remove);\n                    j.scry(kb, \".-cx-PRIVATE-fbTimelineOneColumnHeader__header\").forEach(function(rb) {\n                        if (!rb.getAttribute(\"data-subsection\")) {\n                            j.remove(rb);\n                        };\n                    });\n                }\n            ;\n                var lb = db.getNextSectionKey(hb);\n                if ((lb && oa[lb])) {\n                    oa[lb].setBuffer(0);\n                };\n            }\n        ;\n            for (var mb = 0; (mb < ka.length); mb++) {\n                var nb = ka[mb];\n                if (!nb) {\n                    continue;\n                };\n                if ((nb == hb)) {\n                    break;\n                };\n                p.get(nb).deactivateScrollLoad();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineSectionExpandPager\").forEach(function(rb) {\n                    var sb = m.getInstance(rb.id);\n                    (sb && sb.removeOnVisible());\n                });\n            };\n            db.adjustContentPadding();\n            ib.load(gb, true);\n            ab();\n            var ob = u.getScrollPosition().x, pb = u.getElementPosition(ib.node).y;\n            if (!fb) {\n                var qb = (ja[eb] ? n.SCROLL_TO_OFFSET : n.SUBSECTION_SCROLL_TO_OFFSET);\n                k.scrollTo(new u(ob, (pb - qb), \"document\"), true, false, false, function() {\n                    var rb = u.getElementPosition(ib.node).y;\n                    k.scrollTo(new u(ob, (rb - qb), \"document\"), false);\n                    var sb = j.scry(ib.node, \"h3.uiHeaderTitle\")[0];\n                    if (sb) {\n                        sb.tabIndex = 0;\n                        sb.focus();\n                    }\n                ;\n                });\n            }\n        ;\n        },\n        adjustContentPadding: function() {\n            var eb = ba(\"timeline_tab_content\");\n            if (!eb) {\n                return\n            };\n            if (o.isOneColumnMinimal()) {\n                return\n            };\n            var fb = (o.getCurrentKey() || r.TIMELINE_KEY);\n            if ((fb !== r.TIMELINE_KEY)) {\n                return\n            };\n            var gb = (ka.length - 1), hb = p.get(ka[gb]);\n            eb.style.paddingBottom = ((hb && hb.loaded) ? null : ((((u.getViewportDimensions().y - db.CURRENT_SECTION_OFFSET) - db.HEADER_SCROLL_CUTOFF) - db.FOOTER_HEIGHT) + \"px\"));\n        },\n        adjustContentPaddingAfterLoad: function(eb, fb) {\n            o.runOnceWhenSectionFullyLoaded(db.adjustContentPadding, eb, fb);\n        },\n        appendContentAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(j.appendContent.curry(v(eb), fb), gb, \"0\");\n        },\n        markSectionAsLoaded: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                (ba(eb) && i.removeClass(v(eb).parentNode, \"fbTimelineSectionLoading\"));\n            }, fb, gb);\n        },\n        suppressSectionsAbove: function(eb) {\n            var fb, gb;\n            for (var hb = 0; (hb < ka.length); hb++) {\n                var ib = ka[hb];\n                if (!ib) {\n                    continue;\n                };\n                fb = p.get(ib).node;\n                gb = null;\n                if ((y(eb.parentNode.children).indexOf(eb) <= y(fb.parentNode.children).indexOf(fb))) {\n                    gb = ib;\n                    break;\n                }\n            ;\n                p.get(ib).deactivateScrollLoad();\n            };\n            if (gb) {\n                db.navigateToSection(gb, true);\n            };\n        },\n        forceNoFriendActivity: function() {\n            ta = true;\n        },\n        removeDupes: function(eb) {\n            var fb = ba(eb);\n            if (!fb) {\n                return\n            };\n            var gb = j.scry(fb, \"li.fbTimelineUnit\"), hb = {\n            };\n            for (var ib = 0; (ib < gb.length); ib++) {\n                var jb = gb[ib];\n                if ((jb.id && ca(jb.id, \"tl_unit_\"))) {\n                    var kb = jb.id.substring(8, jb.id.length), lb = (((jb.getAttribute(\"data-unit\") == \"ExperienceSummaryUnit\") ? jb.getAttribute(\"data-time\") : 1));\n                    if ((hb.hasOwnProperty(kb) && (hb[kb] == lb))) {\n                        jb.id = (\"dupe_unit_\" + Math.random());\n                        jb.className = \"hidden_elem\";\n                    }\n                     else hb[kb] = lb;\n                ;\n                }\n            ;\n            };\n        },\n        removeLoadingState: function(eb) {\n            (ba(eb) && i.removeClass(v(eb), \"fbTimelineSectionLoading\"));\n        },\n        setExpandLoadDataForSection: function(eb, fb) {\n            var gb = p.get(eb);\n            (gb && gb.setExpandLoadData(fb));\n        },\n        appendSectionDataForAllSections: function(eb) {\n            la = eb;\n            for (var fb = 0; (fb < (ka.length - 1)); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                };\n                var hb = p.get(gb);\n                (hb && hb.appendData(eb));\n            };\n        },\n        updatePagerAfterLoad: function(eb, fb, gb, hb, ib) {\n            var jb = m.getInstance(eb.firstChild.id);\n            if (!jb) {\n                qa[eb.firstChild.id] = h.subscribe(m.REGISTERED, function(kb, lb) {\n                    qa[eb.firstChild.id].unsubscribe();\n                    delete qa[eb.firstChild.id];\n                    if ((lb.id === eb.firstChild.id)) {\n                        db.updatePagerAfterLoad(eb, fb, gb, hb, ib);\n                    };\n                });\n                return;\n            }\n        ;\n            o.runOnceWhenSectionFullyLoaded(function() {\n                i.removeClass(eb, \"fbTimelineHiddenPager\");\n                jb.checkBuffer();\n            }, gb, hb);\n            if (ib) {\n                o.runOnceWhenSectionFullyLoaded(o.adjustScrollingPagerBuffer.curry(eb.firstChild.id, fb), gb, hb);\n            };\n        },\n        showAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                var hb = ba(eb);\n                (hb && i.show(hb));\n            }, fb, gb);\n        },\n        repositionDialog: function(eb) {\n            h.subscribe(n.SECTION_LOADED, function() {\n                eb.updatePosition();\n            });\n        },\n        rightColumnFinished: function(eb) {\n            var fb = p.get(eb);\n            fb.rightColumnFinished = true;\n        },\n        registerUnrankedGroup: function(eb, fb) {\n            g.listen(eb, \"click\", function(event) {\n                o.unrankedWasClicked();\n                var gb = eb.offsetHeight;\n                j.remove(eb.parentNode);\n                i.removeClass(fb, \"hidden_elem\");\n                var hb = fb.offsetHeight;\n                fb.style.height = (gb + \"px\");\n                fb.style.height = (hb + \"px\");\n                return true;\n            });\n        }\n    };\n    e.exports = db;\n});\n__d(\"TimelineLogging\", [\"TimelineController\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"TimelineController\"), h = b(\"reportData\"), i = false, j = 0, k = null, l = null, m = {\n        init: function(n) {\n            if (i) {\n                return\n            };\n            j = n;\n            g.register(g.LOGGING, this);\n        },\n        reset: function() {\n            i = false;\n            j = 0;\n            k = null;\n        },\n        log: function(n, o) {\n            o.profile_id = j;\n            h(n, {\n                gt: o\n            });\n        },\n        logSectionChange: function(n, o) {\n            var p = {\n                timeline_section_change: 1,\n                key: n\n            };\n            if ((k && (n == k))) {\n                p.timeline_scrubber = 1;\n                k = null;\n            }\n        ;\n            if ((l && (n == l))) {\n                p.sticky_header_nav = 1;\n                l = null;\n            }\n        ;\n            m.log(\"timeline\", p);\n        },\n        logScrubberClick: function(n) {\n            k = n;\n        },\n        logStickyHeaderNavClick: function(n) {\n            l = n;\n        },\n        logUnrankedClick: function() {\n            var n = {\n                timeline_unranked: 1\n            };\n            m.log(\"timeline\", n);\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineStickyHeaderComposerX\", [\"Event\",\"Arbiter\",\"Bootloader\",\"CSS\",\"ComposerXController\",\"DOMQuery\",\"Parent\",\"Run\",\"TimelineComposerUtilities\",\"TimelineContentLoader\",\"TimelineStickyHeader\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"ComposerXController\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"Run\"), o = b(\"TimelineComposerUtilities\"), p = b(\"TimelineContentLoader\"), q = b(\"TimelineStickyHeader\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\");\n    function v(x) {\n        return (x && m.byClass(x.getContext(), \"-cx-PRIVATE-fbTimelineStickyHeaderComposer__root\"));\n    };\n    function w(x) {\n        this._composerRoot = x;\n        this._tokens = [o.listenToSetEstimatedDate(this._composerRoot, p.capsuleForCurrentSection),o.listenToPublish(this._composerRoot, this._close.bind(this)),h.subscribe(\"PhotoSnowlift.OPEN\", this._close.bind(this)),h.subscribe(\"TimelineMLE/mleFlyoutShown\", function(y, z) {\n            if ((v(z) === this._composerRoot)) {\n                k.reset(this._composerRoot);\n            };\n        }.bind(this)),h.subscribe(\"composer/initializedAttachment\", function(y, z) {\n            if ((z.composerRoot === this._composerRoot)) {\n                this._registerClickToDismiss();\n                if (!z.isInitial) {\n                    this._closeMLE();\n                };\n            }\n             else this._close();\n        ;\n        }.bind(this)),h.subscribe(q.ADJUST_WIDTH, this._toggleNarrowMode.bind(this)),];\n        this._clickCancelToken = o.listenToCancel(this._composerRoot, this._close.bind(this));\n        n.onLeave(function() {\n            while (this._tokens.length) {\n                this._tokens.pop().unsubscribe();;\n            };\n            this._clearClickDismissToken();\n            if (this._clickCancelToken) {\n                this._clickCancelToken.remove();\n                this._clickCancelToken = null;\n            }\n        ;\n        }.bind(this));\n    };\n    s(w.prototype, {\n        _toggleNarrowMode: function(event, x) {\n            i.loadModules([\"Tooltip\",], function(y) {\n                var z = (r.getElementDimensions(x).x > 400), aa = l.scry(this._composerRoot, \".-cx-PUBLIC-fbComposerAttachment__link\");\n                j.conditionClass(this._composerRoot, \"-cx-PRIVATE-fbTimelineStickyHeaderComposer__narrow\", z);\n                for (var ba = 0; (ba < aa.length); ba++) {\n                    var ca = aa[ba], da = l.getText(ca);\n                    if (z) {\n                        y.set(ca, da);\n                    }\n                     else y.remove(ca);\n                ;\n                };\n            }.bind(this));\n            return false;\n        },\n        _registerClickToDismiss: function() {\n            var x = j.hasClass(l.find(this._composerRoot, \".-cx-PRIVATE-fbComposerAttachment__mle\"), \"-cx-PUBLIC-fbComposerAttachment__selected\");\n            if (!x) {\n                this._clearClickDismissToken();\n                return;\n            }\n        ;\n            this._clickDismissToken = g.listen(document.body, \"click\", function(y) {\n                var z = m.byClass(y.getTarget(), \"-cx-PRIVATE-fbTimelineStickyHeaderComposer__root\");\n                if (!z) {\n                    this._close();\n                    this._clearClickDismissToken();\n                }\n            ;\n            }.bind(this));\n        },\n        _clearClickDismissToken: function() {\n            if (this._clickDismissToken) {\n                this._clickDismissToken.remove();\n                this._clickDismissToken = null;\n            }\n        ;\n        },\n        _close: function() {\n            this._clearClickDismissToken();\n            this._closeMLE();\n            k.reset(this._composerRoot);\n        },\n        _closeMLE: function() {\n            i.loadModules([\"TimelineMLE\",], function(x) {\n                var y = x.getFlyout();\n                if ((v(y) === this._composerRoot)) {\n                    x.hideFlyout();\n                };\n            }.bind(this));\n        }\n    });\n    e.exports = w;\n});\n__d(\"TimelineSpinelessComposer\", [\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineComposer\",\"TimelineComposerUtilities\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineComposer\"), n = b(\"TimelineComposerUtilities\"), o = b(\"csx\"), p = b(\"cx\"), q;\n    function r(w) {\n        if ((w.isScheduledPost || w.isOGPost)) {\n            return\n        };\n        if (!w.streamStory) {\n            window.location.reload();\n            return;\n        }\n    ;\n        if (w.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                x.publish(w);\n            });\n            return;\n        }\n    ;\n        m.renderCapsuleBasedStory(q, w.streamStory);\n    };\n    function s() {\n        return j.find(k.byClass(q, \"fbTimelineComposerCapsule\"), \"div.-cx-PRIVATE-fbTimelineComposerAttachment__mleflyoutpointer\");\n    };\n    function t(w) {\n        var x = u();\n        i.show(x);\n        var y = w.subscribe(\"hide\", function() {\n            i.hide(x);\n            w.unsubscribe(y);\n        });\n    };\n    function u() {\n        var w = k.byClass(q, \"fbTimelineComposerCapsule\"), x = j.scry(w, \"div.composerVeil\");\n        if ((x.length !== 1)) {\n            x = j.appendContent(w, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        };\n        return x[0];\n    };\n    var v = {\n        init: function(w) {\n            q = w;\n            var x = g.subscribe(\"composer/publish\", function(event, y) {\n                if ((y.composer_id === q.id)) {\n                    r(y);\n                };\n            });\n            l.onLeave(x.unsubscribe.bind(x));\n            if (i.hasClass(q, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                n.hidePlaceIfAttachmentsTooTall(q);\n            }\n             else n.hidePlaceIfAttachmentsTooTallOld(q);\n        ;\n        },\n        showMLEFlyout: function(w) {\n            w.setContext(s()).show();\n            t(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"TimelineStickyRightColumn\", [\"Arbiter\",\"CSS\",\"DOMQuery\",\"Event\",\"PhotoSnowlift\",\"Run\",\"Style\",\"TimelineContentLoader\",\"Vector\",\"UserAgent\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOMQuery\"), j = b(\"Event\"), k = b(\"PhotoSnowlift\"), l = b(\"Run\"), m = b(\"Style\"), n = b(\"TimelineContentLoader\"), o = b(\"Vector\"), p = b(\"UserAgent\"), q = b(\"csx\"), r = b(\"queryThenMutateDOM\"), s = 100, t = 15, u = 15, v = 71, w = false, x = null, y = null, z, aa, ba, ca, da, ea, fa, ga;\n    function ha() {\n        if (k.getInstance().isOpen) {\n            return\n        };\n        z = n.getCurrentSection();\n        if ((!z || !z.rightColumnFinished)) {\n            return\n        };\n        var pa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\")[0], qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        aa = (pa ? pa.offsetHeight : 0);\n        ba = (qa ? qa.offsetHeight : 0);\n        ca = o.getViewportDimensions().y;\n        fa = (pa ? o.getElementPosition(pa).y : 0);\n        ga = (document.body.clientWidth < document.body.scrollWidth);\n    };\n    function ia() {\n        if (k.getInstance().isOpen) {\n            return\n        };\n        if ((y && (y !== z))) {\n            var pa = i.scry(y.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n            if (pa) {\n                ka(pa, \"\", \"\", \"\");\n            };\n        }\n    ;\n        var qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!qa) {\n            return\n        };\n        if (ga) {\n            ka(qa, \"\", \"\", \"\");\n            return;\n        }\n    ;\n        if ((!z || !z.rightColumnFinished)) {\n            return\n        };\n        ja(z);\n        y = (h.hasClass(qa, \"fixed_always\") ? z : null);\n    };\n    function ja(pa) {\n        if (((ba >= aa) || (aa <= ca))) {\n            return\n        };\n        ea = da;\n        da = o.getScrollPosition().y;\n        var qa, ra = i.scry(pa.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!ra) {\n            return\n        };\n        if ((da <= (fa - la()))) {\n            ka(ra, \"\", \"\", \"\");\n            return;\n        }\n    ;\n        if (((aa + fa) <= (da + Math.min((ba + la()), ((ca - u) - v))))) {\n            ka(ra, \"absolute\", \"\", (u + \"px\"));\n            return;\n        }\n    ;\n        if ((ba > ((ca - u) - la()))) {\n            if ((da < ea)) {\n                var sa = false;\n                if ((ra.style.position === \"absolute\")) {\n                    if (((ra.style.top !== \"\") && (((da + la()) - fa) <= parseInt(ra.style.top, 10)))) {\n                        sa = true;\n                    }\n                     else if (((ra.style.bottom !== \"\") && (da <= ((((fa + aa) - la())) - ba)))) {\n                        sa = true;\n                    }\n                \n                };\n                if (sa) {\n                    ka(ra, \"fixed\", (la() + \"px\"), \"\");\n                    return;\n                }\n                 else if (((ra.style.position === \"absolute\") && ra.style.top)) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if ((parseInt(ra.style.top, 10) >= la())) {\n                        return\n                    };\n                    qa = ((da - fa) - ((ba - ((ca - v)))));\n                    if (ea) {\n                        qa += (ea - da);\n                    };\n                    ka(ra, \"absolute\", (qa + \"px\"), \"\");\n                    return;\n                }\n                \n                \n            ;\n            }\n             else {\n                var ta = false;\n                if (((ra.style.position === \"absolute\") || (((ra.style.position === \"\") && !h.hasClass(ra, \"fixed_always\"))))) {\n                    qa = (ra.style.top ? parseInt(ra.style.top, 10) : 0);\n                    if (((da + ca) >= (((fa + qa) + ba) + v))) {\n                        ta = true;\n                    };\n                }\n            ;\n                if (ta) {\n                    qa = (((ca - ba) - u) - v);\n                    ka(ra, \"fixed\", (qa + \"px\"), \"\");\n                    return;\n                }\n                 else if ((da == ea)) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if ((parseInt(ra.style.top, 10) >= la())) {\n                        qa = ((da - fa) + la());\n                        if (ea) {\n                            qa += (ea - da);\n                        };\n                        ka(ra, \"absolute\", (qa + \"px\"), \"\");\n                        return;\n                    }\n                ;\n                }\n                 else if ((ra.style.position === \"absolute\")) {\n                    return\n                }\n                \n                \n            ;\n            }\n        ;\n        }\n         else ka(ra, \"fixed\", (la() + \"px\"), \"\");\n    ;\n    };\n    function ka(pa, qa, ra, sa) {\n        m.set(pa, \"bottom\", sa);\n        if ((qa === \"fixed\")) {\n            h.addClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", \"\");\n        }\n         else {\n            h.removeClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", qa);\n        }\n    ;\n        m.set(pa, \"top\", ra);\n        g.inform(\"reflow\");\n    };\n    function la() {\n        return (h.hasClass(document.documentElement, \"tinyViewport\") ? t : s);\n    };\n    function ma() {\n        r(ha, ia);\n    };\n    function na() {\n        w = false;\n        y = null;\n        while (x.length) {\n            x.pop().remove();;\n        };\n        x = null;\n    };\n    var oa = {\n        init: function() {\n            if ((w || (p.ie() < 8))) {\n                return\n            };\n            w = true;\n            x = [j.listen(window, \"scroll\", ma),j.listen(window, \"resize\", ma),];\n            l.onLeave(na);\n        },\n        adjust: function() {\n            if (w) {\n                ha();\n                ia();\n            }\n        ;\n        }\n    };\n    e.exports = oa;\n});\n__d(\"TimelineProfileQuestionsUnit\", [\"CSS\",\"Event\",\"Parent\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"Event\"), i = b(\"Parent\"), j = b(\"tidyEvent\"), k = null, l = {\n        COLLAPSED: \"collapsedUnit\",\n        UNIT: \"fbTimelineUnit\"\n    };\n    function m(n, o, p, q) {\n        this.$TimelineProfileQuestionsUnit0 = n;\n        this.$TimelineProfileQuestionsUnit1 = o;\n        this.$TimelineProfileQuestionsUnit2 = p;\n        this.$TimelineProfileQuestionsUnit3 = q;\n        this.$TimelineProfileQuestionsUnit4();\n        (k && k.$TimelineProfileQuestionsUnit5());\n        k = this;\n    };\n    m.prototype.$TimelineProfileQuestionsUnit5 = function() {\n        (this.$TimelineProfileQuestionsUnit6 && this.$TimelineProfileQuestionsUnit6.remove());\n        this.$TimelineProfileQuestionsUnit6 = null;\n    };\n    m.prototype.$TimelineProfileQuestionsUnit4 = function() {\n        if (this.$TimelineProfileQuestionsUnit3.isCollapsed) {\n            return\n        };\n        this.$TimelineProfileQuestionsUnit6 = h.listen(this.$TimelineProfileQuestionsUnit1, \"click\", this.$TimelineProfileQuestionsUnit7.bind(this));\n        j(this.$TimelineProfileQuestionsUnit6);\n    };\n    m.prototype.$TimelineProfileQuestionsUnit7 = function() {\n        if (!this.$TimelineProfileQuestionsUnit2) {\n            return\n        };\n        var n = i.byClass(this.$TimelineProfileQuestionsUnit0, l.UNIT);\n        g.toggle(this.$TimelineProfileQuestionsUnit2);\n        var o = !g.shown(this.$TimelineProfileQuestionsUnit2);\n        g.conditionClass(n, l.COLLAPSED, o);\n    };\n    m.updateElements = function(n, o) {\n        if (!k) {\n            return\n        };\n        k.$TimelineProfileQuestionsUnit5();\n        k.$TimelineProfileQuestionsUnit1 = n;\n        k.$TimelineProfileQuestionsUnit2 = o;\n        k.$TimelineProfileQuestionsUnit4();\n    };\n    e.exports = m;\n});");
// 13348
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sc344fd856451d82954e184ab8fd081f4e1937e29");
// 13349
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"xfhln\",]);\n}\n;\n;\n__d(\"ComposerXEmptyAttachment\", [\"Class\",\"ComposerXAttachment\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"ComposerXAttachment\"), i = b(\"copyProperties\");\n    function j(k, l) {\n        this.parent.construct(this);\n        this._root = k;\n        if (l) {\n            this.attachmentClassName = l;\n        }\n    ;\n    ;\n    };\n;\n    g.extend(j, h);\n    i(j.prototype, {\n        getRoot: function() {\n            return this._root;\n        }\n    });\n    e.exports = j;\n});\n__d(\"ComposerXDatepickerIconReset\", [\"JSBNG__CSS\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"cx\");\n    function i(j) {\n        g.removeClass(j.element, \"-cx-PUBLIC-fbTimelineBackdatedComposer__datepickericonselected\");\n        g.removeClass(j.element, \"-cx-PUBLIC-fbComposerXTagger__controlopen\");\n    };\n;\n    e.exports = i;\n});\n__d(\"TimelineCommentsLoader\", [\"JSBNG__Event\",\"CommentPrelude\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"CommentPrelude\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"emptyFunction\"), m = {\n        init: function() {\n            m.init = l;\n            g.listen(JSBNG__document.body, \"click\", function(n) {\n                var o = k.byClass(n.getTarget(), \"fbTimelineFeedbackCommentLoader\");\n                if (o) {\n                    n.kill();\n                    h.click(o, false);\n                    var p = k.byTag(o, \"form\"), q = j.scry(p, \"li.uiUfiViewAll input\");\n                    if (!q.length) {\n                        q = j.scry(p, \"li.fbUfiViewPrevious input\");\n                    }\n                ;\n                ;\n                    if (!q.length) {\n                        q = j.scry(p, \"a.UFIPagerLink\");\n                    }\n                ;\n                ;\n                    q[0].click();\n                    i.show(j.JSBNG__find(p, \"li.uiUfiComments\"));\n                    i.removeClass(o, \"fbTimelineFeedbackCommentLoader\");\n                }\n            ;\n            ;\n            });\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineCapsule\", [\"Arbiter\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"Parent\",\"TimelineConstants\",\"TimelineLegacySections\",\"UserAgent\",\"Vector\",\"$\",\"createArrayFrom\",\"csx\",\"isEmpty\",\"queryThenMutateDOM\",\"JSBNG__requestAnimationFrame\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DOMScroll\"), m = b(\"Parent\"), n = b(\"TimelineConstants\"), o = b(\"TimelineLegacySections\"), p = b(\"UserAgent\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"createArrayFrom\"), t = b(\"csx\"), u = b(\"isEmpty\"), v = b(\"queryThenMutateDOM\"), w = b(\"JSBNG__requestAnimationFrame\"), x = (function() {\n        var y = 45, z = 15, aa = \"use\", ba = \"update\", ca = {\n        }, da = {\n        };\n        function ea(ra) {\n            return h.hasClass(ra, \"fbTimelineBalancer\");\n        };\n    ;\n        function fa(ra) {\n            return ra.getAttribute(\"data-spine\");\n        };\n    ;\n        function ga(ra) {\n            return h.hasClass(ra, \"placeholderUnit\");\n        };\n    ;\n        function ha(ra, sa) {\n            if (sa) {\n                return ((i.get(n.DS_SIDEORG, ra.id) || ra.getAttribute(\"data-side\")));\n            }\n        ;\n        ;\n            return ra.getAttribute(\"data-side\");\n        };\n    ;\n        var ia = function(ra, sa) {\n            if (((p.ie() <= 6))) {\n                ia = function(ta, ua) {\n                    i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                    ta.setAttribute(\"data-side\", ua);\n                    h.removeClass(ta, \"leftColumn\");\n                    h.removeClass(ta, \"rightColumn\");\n                    h.addClass(ta, ((((ua == \"l\")) ? \"leftColumn\" : \"rightColumn\")));\n                };\n            }\n             else ia = function(ta, ua) {\n                i.set(n.DS_SIDEORG, ta.id, ha(ta, true));\n                ta.setAttribute(\"data-side\", ua);\n            };\n        ;\n        ;\n            ia(ra, sa);\n        };\n        function ja(ra) {\n            return ra.getAttribute(\"data-size\");\n        };\n    ;\n        function ka(ra) {\n            if (((((h.hasClass(ra, \"fbTimelineOneColumn\") && ra.prevSibling)) && h.hasClass(ra.prevSibling, \"fbTimelineOneColumn\")))) {\n                return ((z * 2));\n            }\n        ;\n        ;\n            if (h.hasClass(ra, \"fbTimelineIndeterminateContent\")) {\n                return 0;\n            }\n        ;\n        ;\n            return z;\n        };\n    ;\n        function la(ra, sa) {\n            var ta = 0;\n            if (((h.shown(ra) && !h.hasClass(ra, \"placeholderUnit\")))) {\n                if (((sa === aa))) {\n                    ta = i.get(n.DS_HEIGHT, ra.id, null);\n                    if (((ta === null))) {\n                        ta = ra.getAttribute(\"data-calculatedheight\");\n                    }\n                ;\n                ;\n                }\n                 else ta = ((ra.offsetHeight + ka(ra)));\n            ;\n            }\n        ;\n        ;\n            if (((((sa === aa)) && ((ta === null))))) {\n                ta = 300;\n            }\n        ;\n        ;\n            i.set(n.DS_HEIGHT, ra.id, parseInt(ta, 10));\n        };\n    ;\n        function ma(ra) {\n            var sa = i.get(n.DS_HEIGHT, ra.id, null);\n            return sa;\n        };\n    ;\n        function na(ra, sa) {\n            if (((ja(sa) == \"2\"))) {\n                return 0;\n            }\n             else if (((ha(sa) == \"r\"))) {\n                return ((ra + ma(sa)));\n            }\n             else return ((ra - ma(sa)))\n            \n        ;\n        };\n    ;\n        function oa(ra) {\n            k.scry(ra, \".-cx-PUBLIC-timelineOneColMin__endmarker\").forEach(function(sa) {\n                var ta = sa.getAttribute(\"data-endmarker\"), ua = sa.getAttribute(\"data-pageindex\"), va = function() {\n                    if (!sa.parentNode) {\n                        return;\n                    }\n                ;\n                ;\n                    i.set(n.DS_LOADED, ra.id, ua);\n                    j.remove(sa);\n                    g.inform(n.SECTION_FULLY_LOADED, {\n                        scrubberKey: ta,\n                        pageIndex: ua,\n                        capsuleID: ra.id,\n                        childCount: ra.childNodes.length\n                    });\n                };\n                if (o.get(ta)) {\n                    va();\n                }\n                 else var wa = g.subscribe(n.SECTION_REGISTERED, function(xa, ya) {\n                    if (((ya.scrubberKey === ta))) {\n                        va();\n                        wa.unsubscribe();\n                    }\n                ;\n                ;\n                })\n            ;\n            });\n            g.inform(\"TimelineCapsule/balanced\", {\n                capsule: ra\n            });\n        };\n    ;\n        function pa(ra) {\n            if (u(ca[ra.id])) {\n                return;\n            }\n        ;\n        ;\n            var sa = ((ea(ra) ? ra.firstChild : ra)), ta = sa.childNodes.length, ua = {\n            }, va = {\n            }, wa, xa = z, ya = z, za, ab = [];\n            for (var bb = 0; ((bb < ta)); bb++) {\n                wa = sa.childNodes[bb];\n                if (h.hasClass(wa, \"fbTimelineUnit\")) {\n                    za = k.scry(wa, \"div.timelineUnitContainer\")[0];\n                    if (za) {\n                        va[wa.id] = za.getAttribute(\"data-time\");\n                    }\n                ;\n                ;\n                    if (((!ga(wa) && h.shown(wa)))) {\n                        if (((ja(wa) == \"2\"))) {\n                            ua[wa.id] = Math.max(xa, ya);\n                            xa = ya = ((ua[wa.id] + ma(wa)));\n                        }\n                         else if (((ha(wa) == \"r\"))) {\n                            ua[wa.id] = ya;\n                            ya += ma(wa);\n                        }\n                         else {\n                            ua[wa.id] = xa;\n                            xa += ma(wa);\n                        }\n                        \n                    ;\n                    ;\n                        if (((((ha(wa, true) == \"l\")) || ((ja(wa) == \"2\"))))) {\n                            ab.push(wa.id);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n            for (bb = 0; ((bb < ((ab.length - 1)))); ++bb) {\n                var cb = ab[bb], db = ab[((bb + 1))], eb = ((ua[cb] + y)), fb = ua[db];\n                {\n                    var fin253keys = ((window.top.JSBNG_Replay.forInKeys)((ca[ra.id]))), fin253i = (0);\n                    var gb;\n                    for (; (fin253i < fin253keys.length); (fin253i++)) {\n                        ((gb) = (fin253keys[fin253i]));\n                        {\n                            if (((eb > fb))) {\n                                break;\n                            }\n                        ;\n                        ;\n                            var hb = ca[ra.id][gb];\n                            if (h.shown(hb)) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            if (((((va[gb] <= va[cb])) && ((va[gb] > va[db]))))) {\n                                hb.style.JSBNG__top = ((eb + \"px\"));\n                                eb += y;\n                                h.show(hb);\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            };\n        ;\n        };\n    ;\n        function qa(ra, sa) {\n            var ta = m.byAttribute(ra, \"data-size\");\n            if (ta) {\n                if (h.hasClass(ra.parentNode, \"timelineReportContent\")) {\n                    sa(ra);\n                }\n                 else sa(ta);\n            ;\n            ;\n                x.balanceCapsule(m.byClass(ta, \"fbTimelineCapsule\"));\n            }\n        ;\n        ;\n        };\n    ;\n        return {\n            removeUnit: function(ra) {\n                qa(ra, function(sa) {\n                    j.remove(sa);\n                });\n            },\n            hideUnit: function(ra) {\n                qa(ra, function(sa) {\n                    h.addClass(sa, \"fbTimelineColumnHidden\");\n                });\n            },\n            undoHideUnit: function(ra, sa) {\n                j.remove(m.byClass(sa, \"hiddenText\"));\n                qa(ra, function(ta) {\n                    h.removeClass(ta, \"fbTimelineColumnHidden\");\n                });\n            },\n            unplacehold: function(ra) {\n                var sa = r(ra);\n                sa.style.JSBNG__top = null;\n                h.removeClass(sa, \"visiblePlaceholder\");\n                h.removeClass(sa, \"placeholder\");\n                var ta = m.byClass(sa, \"fbTimelineCapsule\");\n                delete ca[ta.id][ra];\n                x.balanceCapsule(ta);\n            },\n            scrollToCapsule: function(ra) {\n                if (!da.hasOwnProperty(ra.id)) {\n                    var sa = q.getElementPosition(ra.parentNode);\n                    l.JSBNG__scrollTo(new q(q.getScrollPosition().x, ((sa.y - n.SUBSECTION_SCROLL_TO_OFFSET)), \"JSBNG__document\"));\n                    da[ra.id] = true;\n                }\n            ;\n            ;\n            },\n            balanceCapsuleFromChild: function(ra, sa) {\n                x.balanceCapsule(m.byClass(ra, \"fbTimelineCapsule\"), sa);\n            },\n            balanceCapsuleDeferred: function(ra, sa) {\n                x.balanceCapsule.curry(ra, sa).defer();\n            },\n            balanceCapsule: function(ra, sa) {\n                if (((!ra || !ra.childNodes))) {\n                    return;\n                }\n            ;\n            ;\n                var ta = 0, ua, va = JSBNG__document.createDocumentFragment(), wa = [], xa = [], ya = [], za = false, ab = ((sa && sa.heights_action));\n                if (((sa && sa.tail_balance))) {\n                    i.set(n.DS_TAILBALANCE, ra.id, sa.tail_balance);\n                }\n            ;\n            ;\n                if (((((ab !== ba)) && ((p.chrome() || p.webkit()))))) {\n                    h.toggleClass(ra, \"webkitFix\");\n                }\n            ;\n            ;\n                for (var bb = 0; ((bb < ra.childNodes.length)); bb++) {\n                    ua = ra.childNodes[bb];\n                    if (fa(ua)) {\n                        continue;\n                    }\n                     else if (ea(ua)) {\n                        s(ua.firstChild.childNodes).forEach(function(jb) {\n                            la(jb, ab);\n                        });\n                        continue;\n                    }\n                    \n                ;\n                ;\n                    la(ua, ab);\n                    if (((ha(ua, true) == \"r\"))) {\n                        xa.push(ua);\n                    }\n                     else wa.push(ua);\n                ;\n                ;\n                    ya.push(ua);\n                    if (((ja(ua) != \"2\"))) {\n                        if (((((((ta > 0)) && ((ha(ua) == \"r\")))) || ((((ta < 0)) && ((ha(ua) == \"l\"))))))) {\n                            za = true;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                    ta = na(ta, ua);\n                };\n            ;\n                var cb = [], db = [], eb = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    var kb = s(jb.firstChild.childNodes);\n                    if (jb.getAttribute(\"data-nonunits\")) {\n                        eb = eb.concat(kb);\n                    }\n                     else if (((ha(jb) == \"left\"))) {\n                        cb = cb.concat(kb);\n                    }\n                     else if (((ha(jb) == \"right\"))) {\n                        db = db.concat(kb);\n                    }\n                    \n                    \n                ;\n                ;\n                });\n                if (za) {\n                    ra.style.minHeight = ra.offsetHeight;\n                    wa.forEach(function(jb) {\n                        if (((ja(jb) != \"2\"))) {\n                            ia(jb, \"l\");\n                        }\n                    ;\n                    ;\n                    });\n                    xa.forEach(function(jb) {\n                        if (((ja(jb) != \"2\"))) {\n                            ia(jb, \"r\");\n                        }\n                    ;\n                    ;\n                    });\n                    var fb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, wa));\n                    fb.setAttribute(\"data-side\", \"left\");\n                    j.prependContent(ra, fb);\n                    cb = wa.concat(cb);\n                    var gb = j.create(\"li\", {\n                        className: \"fbTimelineBalancer\"\n                    }, j.create(\"ol\", null, xa));\n                    gb.setAttribute(\"data-side\", \"right\");\n                    j.prependContent(ra, gb);\n                    db = xa.concat(db);\n                    ta = 0;\n                }\n            ;\n            ;\n                while (eb.length) {\n                    va.appendChild(eb.shift());\n                ;\n                };\n            ;\n                while (((((((ta >= 0)) && cb.length)) || ((((ta < 0)) && db.length))))) {\n                    if (((ta >= 0))) {\n                        ua = cb.shift();\n                    }\n                     else ua = db.shift();\n                ;\n                ;\n                    va.appendChild(ua);\n                    ta = na(ta, ua);\n                };\n            ;\n                ra.appendChild(va);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(jb) {\n                    if (!jb.firstChild.childNodes.length) {\n                        j.remove(jb);\n                    }\n                ;\n                ;\n                });\n                var hb = ((((sa && sa.tail_balance)) || i.get(n.DS_TAILBALANCE, ra.id)));\n                if (hb) {\n                    ta = x.tailBalance(ra, ta, hb);\n                }\n            ;\n            ;\n                if (za) {\n                    ya.forEach(function(jb) {\n                        if (((jb.parentNode !== ra))) {\n                            ra.appendChild(jb);\n                            ta = na(ta, jb);\n                        }\n                    ;\n                    ;\n                    });\n                    ra.style.minHeight = null;\n                }\n            ;\n            ;\n                var ib = m.byClass(ra, \"fbTimelineSection\");\n                if (ib) {\n                    i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ib.id, ta);\n                }\n            ;\n            ;\n                ca[ra.id] = {\n                };\n                k.scry(ra, \"li.placeholderUnit\").forEach(function(jb) {\n                    ca[ra.id][jb.id] = jb;\n                });\n                pa(ra);\n                oa(ra);\n                if (((ab === aa))) {\n                    sa.heights_action = ba;\n                    w(function() {\n                        w(x.balanceCapsule.curry(ra, sa));\n                    });\n                }\n            ;\n            ;\n            },\n            tailBalance: function(ra, sa, ta) {\n                if (!ra) {\n                    return sa;\n                }\n            ;\n            ;\n                var ua = [], va = [], wa = [], xa = [];\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    var ab = s(za.firstChild.childNodes);\n                    if (za.getAttribute(\"data-nonunits\")) {\n                        xa = xa.concat(ab);\n                    }\n                     else if (((ha(za) == \"left\"))) {\n                        va = va.concat(ab);\n                    }\n                     else if (((ha(za) == \"right\"))) {\n                        wa = wa.concat(ab);\n                    }\n                    \n                    \n                ;\n                ;\n                    ua = ua.concat(ab);\n                });\n                if (((((((ta == n.FIXED_SIDE_RIGHT)) && va.length)) || ((((ta == n.FIXED_SIDE_LEFT)) && wa.length))))) {\n                    return sa;\n                }\n            ;\n            ;\n                var ya = JSBNG__document.createDocumentFragment();\n                if (ua) {\n                    while (ua.length) {\n                        if (((ta != n.FIXED_SIDE_NONE))) {\n                            if (((ja(ua[0]) != \"2\"))) {\n                                if (((sa >= 0))) {\n                                    ia(ua[0], \"l\");\n                                }\n                                 else ia(ua[0], \"r\");\n                            ;\n                            }\n                        ;\n                        }\n                    ;\n                    ;\n                        sa = na(sa, ua[0]);\n                        ya.appendChild(ua.shift());\n                    };\n                }\n            ;\n            ;\n                ra.appendChild(ya);\n                k.scry(ra, \"li.fbTimelineBalancer\").forEach(function(za) {\n                    if (!za.firstChild.childNodes.length) {\n                        j.remove(za);\n                    }\n                ;\n                ;\n                });\n                return sa;\n            },\n            loadTwoColumnUnits: function(ra) {\n                var sa = r(ra);\n                v(function() {\n                    var ta = m.byClass(sa, \"fbTimelineSection\");\n                    if (ta) {\n                        var ua = k.JSBNG__find(sa, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\"), va = k.JSBNG__find(sa, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\"), wa = ((va.offsetHeight - ua.offsetHeight));\n                        i.set(n.DS_COLUMN_HEIGHT_DIFFERENTIAL, ta.id, wa);\n                    }\n                ;\n                ;\n                }, oa.curry(sa));\n            }\n        };\n    })();\n    e.exports = ((a.TimelineCapsule || x));\n});\n__d(\"TimelineCapsuleUtilities\", [\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = {\n        setFirstUnit: function(i) {\n            var j = true;\n            for (var k = 0; ((k < i.childNodes.length)); ++k) {\n                var l = i.childNodes[k];\n                if (((l.id.indexOf(\"tl_unit_\") === 0))) {\n                    if (j) {\n                        j = false;\n                        g.addClass(l, \"firstUnit\");\n                    }\n                     else {\n                        g.removeClass(l, \"firstUnit\");\n                        break;\n                    }\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = h;\n});\n__d(\"TimelineUnitSelector\", [\"DOMQuery\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"Parent\"), i = {\n        getUnitsWithTime: function(j) {\n            return g.scry(j, \"div.timelineUnitContainer\").filter(function(k) {\n                return ((((h.byClass(k, \"fbTimelineCapsule\") === j)) && k.getAttribute(\"data-time\")));\n            });\n        }\n    };\n    e.exports = i;\n});\n__d(\"TimelineComposerUtilities\", [\"JSBNG__Event\",\"Arbiter\",\"Bootloader\",\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineUnitSelector\",\"Vector\",\"cx\",\"csx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"TimelineUnitSelector\"), o = b(\"Vector\"), p = b(\"cx\"), q = b(\"csx\"), r = ((86400 * 31)), s = 86400000, t = {\n        listenToSetEstimatedDate: function(u, v) {\n            return h.subscribe(\"ComposerXTimelineTagger/init\", function(w, x) {\n                if (l.contains(u, x.datePickerElement)) {\n                    t.setEstimatedDate(x.datePickerInstance, v());\n                    x.composerTimelineTagger.switchToTagger(\"date\");\n                }\n            ;\n            ;\n            });\n        },\n        listenToSetEstimatedDateOld: function(u, v) {\n            return h.subscribe(\"TimelineBackdatedComposerTagger/initialized\", function(JSBNG__event, w) {\n                if (((w.composer === u))) {\n                    w.date_picker.subscribe(\"initialized\", function(x, y) {\n                        t.setEstimatedDate(y, v());\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        listenToPublish: function(u, v) {\n            if (u.root) {\n                u = u.root;\n            }\n        ;\n        ;\n            return h.subscribe(\"composer/publish\", function(JSBNG__event, w) {\n                if (((w.composer_id === u.id))) {\n                    i.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                        x.publish(w);\n                        ((v && v()));\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        listenToAnotherComposerOpen: function(u, v) {\n            return h.subscribe(\"composer/mutate\", function(w, x) {\n                if (((x !== u))) {\n                    v();\n                }\n            ;\n            ;\n            });\n        },\n        listenToCancel: function(u, v) {\n            return g.listen(u, \"click\", function(JSBNG__event) {\n                if (m.byClass(JSBNG__event.getTarget(), \"-cx-PRIVATE-fbTimelineComposer__cancelbutton\")) {\n                    v();\n                }\n            ;\n            ;\n            });\n        },\n        listenToCancelOld: function(u, v) {\n            return g.listen(u, \"click\", function(JSBNG__event) {\n                ((m.byClass(JSBNG__event.getTarget(), \"cancelBtn\") && v()));\n            });\n        },\n        hidePlaceIfAttachmentsTooTall: function(u) {\n            var v = l.JSBNG__find(u, \".-cx-PRIVATE-fbComposer__attachmentform\"), w = o.getElementDimensions(v).y;\n            if (((w > 50))) {\n                j.hide(l.JSBNG__find(v, \".-cx-PRIVATE-fbComposerAttachment__place\"));\n            }\n        ;\n        ;\n        },\n        hidePlaceIfAttachmentsTooTallOld: function(u) {\n            var v = k.JSBNG__find(u, \"ul.fbTimelineComposerAttachments\"), w = o.getElementDimensions(v).y;\n            if (((w > 50))) {\n                var x = m.byTag(k.scry(v, \"span.placeAttachment\")[0], \"li\");\n                ((x && j.hide(x)));\n            }\n        ;\n        ;\n        },\n        setEstimatedDate: function(u, v) {\n            var w, x;\n            if (((v && j.hasClass(v, \"fbTimelineCapsule\")))) {\n                w = v.getAttribute(\"data-start\");\n                x = v.getAttribute(\"data-end\");\n                if (((w && x))) {\n                    var y = new JSBNG__Date(((x * 1000))), z = new JSBNG__Date();\n                    if (((y > z))) {\n                        u.setDate(z.getFullYear(), ((z.getMonth() + 1)), z.getDate());\n                    }\n                     else if (((((x - w)) > ((2 * r))))) {\n                        u.setDate(y.getFullYear());\n                    }\n                     else u.setDate(y.getFullYear(), ((y.getMonth() + 1)));\n                    \n                ;\n                ;\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            var aa = m.byClass(v, \"fbTimelineCapsule\");\n            if (aa) {\n                w = aa.getAttribute(\"data-start\");\n                x = aa.getAttribute(\"data-end\");\n                var ba = o.getElementPosition(v).y, ca = [x,null,], da = [w,null,], ea = n.getUnitsWithTime(aa);\n                for (var fa = 0; ((fa < ea.length)); fa++) {\n                    var ga = ea[fa], ha = k.scry(ga.parentNode, \".spinePointer\")[0];\n                    if (!ha) {\n                        continue;\n                    }\n                ;\n                ;\n                    var ia = o.getElementPosition(ha).y;\n                    if (((ia <= ba))) {\n                        if (((!ca[1] || ((ia > ca[1]))))) {\n                            ca = [ga.getAttribute(\"data-time\"),ia,];\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((!da[1] || ((ia < da[1]))))) {\n                        da = [ga.getAttribute(\"data-time\"),ia,];\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n                if (((((ca[0] !== null)) && ((da[0] !== null))))) {\n                    var ja = ((Math.round(((((parseInt(ca[0], 10) + parseInt(da[0], 10))) / 2))) * 1000));\n                    ja = Math.min(((new JSBNG__Date() - s)), ja);\n                    u.setDateWithTimestamp(ja);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        showMLEFlyout: function(u) {\n            var v = ((k.scry(JSBNG__document, \"a.fbTimelineSpine\").length === 0)), w = function(x) {\n                x.showMLEFlyout(u);\n            };\n            if (v) {\n                i.loadModules([\"TimelineSpinelessComposer\",], w);\n            }\n             else i.loadModules([\"TimelineComposer\",], w);\n        ;\n        ;\n        }\n    };\n    e.exports = t;\n});\n__d(\"TimelineComposer\", [\"Arbiter\",\"Bootloader\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineCapsule\",\"TimelineCapsuleUtilities\",\"TimelineComposerUtilities\",\"$\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineCapsule\"), n = b(\"TimelineCapsuleUtilities\"), o = b(\"TimelineComposerUtilities\"), p = b(\"$\"), q = b(\"cx\"), r;\n    function s(x) {\n        if (((x.isScheduledPost || x.isOGPost))) {\n            return;\n        }\n    ;\n    ;\n        if (!x.streamStory) {\n            window.JSBNG__location.reload();\n            return;\n        }\n    ;\n    ;\n        if (x.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(z) {\n                z.publish(x);\n            });\n            return;\n        }\n    ;\n    ;\n        var y = w.renderCapsuleBasedStory(r, x.streamStory);\n        g.inform(\"TimelineComposer/on_after_publish\", y, g.BEHAVIOR_PERSISTENT);\n    };\n;\n    function t() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\");\n        return j.JSBNG__find(x, \".spinePointer\");\n    };\n;\n    function u(x) {\n        var y = v();\n        i.show(y);\n        var z = x.subscribe(\"hide\", function() {\n            i.hide(y);\n            x.unsubscribe(z);\n        });\n    };\n;\n    function v() {\n        var x = k.byClass(r, \"fbTimelineTwoColumn\"), y = j.scry(x, \"div.composerVeil\");\n        if (((y.length !== 1))) {\n            y = j.appendContent(x, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        }\n    ;\n    ;\n        return y[0];\n    };\n;\n    var w = {\n        init: function(x) {\n            r = p(x);\n            var y = g.subscribe(\"composer/publish\", function(JSBNG__event, z) {\n                if (((z.composer_id === r.id))) {\n                    s(z);\n                }\n            ;\n            ;\n            });\n            l.onLeave(y.unsubscribe.bind(y));\n            if (i.hasClass(r, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                o.hidePlaceIfAttachmentsTooTall(r);\n            }\n             else o.hidePlaceIfAttachmentsTooTallOld(r);\n        ;\n        ;\n        },\n        showMLEFlyout: function(x) {\n            x.setContext(t()).show();\n            u(x);\n        },\n        renderCapsuleBasedStory: function(x, y) {\n            var z = k.byClass(x, \"fbTimelineCapsule\");\n            if (!z) {\n                return;\n            }\n        ;\n        ;\n            var aa = k.byClass(x, \"timelineUnitContainer\").parentNode;\n            if (aa.nextSibling.getAttribute(\"data-spine\")) {\n                aa = aa.nextSibling;\n            }\n        ;\n        ;\n            var ba = j.insertAfter(aa, y)[0];\n            h.loadModules([\"Animation\",], function(ca) {\n                new ca(ba.firstChild).from(\"backgroundColor\", \"#fff8dd\").to(\"backgroundColor\", \"#fff\").duration(2000).ease(ca.ease.both).go();\n            });\n            n.setFirstUnit(z);\n            m.balanceCapsule(z);\n            return ba;\n        }\n    };\n    e.exports = ((a.TimelineComposer || w));\n});\n__d(\"TimelineContentLoader\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"DOMScroll\",\"OnVisible\",\"ScrollingPager\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"TimelineSmartInsert\",\"TimelineURI\",\"UIPagelet\",\"UserAgent\",\"Vector\",\"$\",\"arrayContains\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"debounce\",\"ge\",\"startsWith\",\"tx\",\"userAction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"DOMScroll\"), l = b(\"OnVisible\"), m = b(\"ScrollingPager\"), n = b(\"TimelineConstants\"), o = b(\"TimelineController\"), p = b(\"TimelineLegacySections\"), q = b(\"TimelineSmartInsert\"), r = b(\"TimelineURI\"), s = b(\"UIPagelet\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"$\"), w = b(\"arrayContains\"), x = b(\"copyProperties\"), y = b(\"createArrayFrom\"), z = b(\"csx\"), aa = b(\"debounce\"), ba = b(\"ge\"), ca = b(\"startsWith\"), da = b(\"tx\"), ea = b(\"userAction\"), fa = false, ga = false, ha, ia = null, ja = {\n    }, ka = [], la = [], ma = [], na = {\n    }, oa = {\n    }, pa = {\n    }, qa = {\n    }, ra = null, sa = null, ta = false, ua = null;\n    function va(eb, fb, gb, hb, ib) {\n        this.node = eb;\n        this.loaded = hb;\n        this.canScrollLoad = true;\n        this.canUnload = ((fb != db.RECENT));\n        this.scrubberKey = fb;\n        this.historicUnitCount = ib;\n        this._pageletLoadData = gb;\n        this._expandPageletLoadData = {\n        };\n        this.rightColumnFinished = false;\n    };\n;\n    x(va.prototype, {\n        load: function(eb, fb) {\n            if (this.loaded) {\n                return;\n            }\n        ;\n        ;\n            var gb = this._pageletLoadData;\n            h.inform(n.SECTION_LOADING, {\n                data: gb,\n                scrubberKey: this.scrubberKey\n            });\n            this.loaded = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            var hb = \"ProfileTimelineSectionPagelet\", ib = ((this.scrubberKey == db.WAY_BACK));\n            if (ib) {\n                hb = \"ProfileTimelineRemainingYearsPagelet\";\n            }\n        ;\n        ;\n            gb.time_cutoff = db.getTimeCutoff();\n            gb.highlight_unit_data = eb;\n            gb.parent_key = this.parentKey;\n            gb.force_no_friend_activity = ta;\n            i.addClass(this.node, \"fbTimelineSectionLoading\");\n            if (gb.combine_sections) {\n                i.addClass(this.node, \"combinedSections\");\n            }\n        ;\n        ;\n            if (((this.canUnload && ga))) {\n                var jb = this.node.firstChild.cloneNode(true);\n                i.hide(jb);\n                j.insertAfter(this.node, jb);\n            }\n             else this.canScrollLoad = false;\n        ;\n        ;\n            var kb = null;\n            if (((fb && !mb))) {\n                var lb = this.node;\n                lb.style.minHeight = ((window.JSBNG__innerHeight + \"px\"));\n                kb = function() {\n                    lb.style.minHeight = null;\n                };\n            }\n        ;\n        ;\n            var mb = ((gb.combine_sections && ib));\n            pa[this.scrubberKey] = s.loadFromEndpoint(hb, ((mb ? ((gb.unit_container_id + \"_left\")) : this.node.id)), gb, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true,\n                append: mb,\n                finallyHandler: kb\n            });\n            cb(this.scrubberKey);\n        },\n        preload: function() {\n            i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            var eb = j.JSBNG__find(this.node, \"span.sectionLabel\");\n            if (eb.getAttribute(\"data-original-label\")) {\n                j.setContent(eb, eb.getAttribute(\"data-original-label\"));\n                eb.removeAttribute(\"data-original-label\");\n            }\n        ;\n        ;\n        },\n        unload: function() {\n            if (((!this.loaded || !this.canUnload))) {\n                return;\n            }\n        ;\n        ;\n            this.loaded = false;\n            ((pa[this.scrubberKey] && pa[this.scrubberKey].cancel()));\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            if (((this.node.nextSibling && i.hasClass(this.node.nextSibling, \"fbTimelineSection\")))) {\n                j.setContent(this.node, this.node.nextSibling);\n                i.show(this.node.firstChild);\n            }\n             else j.empty(this.node);\n        ;\n        ;\n            this.deactivateScrollLoad();\n        },\n        activateScrollLoad: function() {\n            this.canScrollLoad = true;\n            i.removeClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n            ((oa[this.scrubberKey] && oa[this.scrubberKey].reset()));\n        },\n        deactivateScrollLoad: function() {\n            if (!this.loaded) {\n                this.canScrollLoad = false;\n                i.removeClass(this.node, \"fbTimelineTimePeriodUnexpanded\");\n                i.addClass(this.node, \"fbTimelineTimePeriodSuppressed\");\n                ((oa[this.scrubberKey] && oa[this.scrubberKey].remove()));\n            }\n        ;\n        ;\n        },\n        setExpandLoadData: function(eb) {\n            this._expandPageletLoadData = eb;\n            return this;\n        },\n        appendData: function(eb) {\n            x(this._pageleLoadData, eb);\n            return this;\n        },\n        expandSubSections: function() {\n            if (this.subSections.length) {\n                db.navigateToSection(this.subSections[0].scrubberKey);\n            }\n        ;\n        ;\n        },\n        expand: function(eb) {\n            if (!this.loaded) {\n                return;\n            }\n        ;\n        ;\n            sa.add_event(((\"expand_\" + this.scrubberKey)));\n            var fb = j.JSBNG__find(this.node, \".fbTimelineSectionExpander\");\n            i.addClass(fb.firstChild, \"async_saving\");\n            ((eb && i.addClass(eb, \"async_saving\")));\n            this._expandPageletLoadData.time_cutoff = db.getTimeCutoff();\n            db.navigateToSection(this.scrubberKey);\n            j.scry(this.node, \".fbTimelineCapsule\").forEach(j.remove);\n            this._expandPageletLoadData.new_expand = true;\n            ((pa[this.scrubberKey] && pa[this.scrubberKey].cancel()));\n            pa[this.scrubberKey] = s.loadFromEndpoint(\"ProfileTimelineSectionPagelet\", fb.id, this._expandPageletLoadData, {\n                usePipe: true,\n                jsNonblock: true,\n                constHeight: true\n            });\n        },\n        isPermalinkPeriod: function() {\n            return this._pageletLoadData.is_permalink_period;\n        }\n    });\n    function wa() {\n        if (fa) {\n            return;\n        }\n    ;\n    ;\n        o.register(o.CONTENT, db);\n        sa = ea(\"timeline\").uai(\"init\", \"scrubber\", false);\n        fa = true;\n        if (((t.ie() <= 7))) {\n            ga = true;\n        }\n    ;\n    ;\n    };\n;\n    var xa = aa(function(eb, fb, gb) {\n        var hb = p.get(eb).historicUnitCount;\n        fb -= hb;\n        gb -= 1;\n        if (((((((hb == -1)) || ((gb <= 0)))) || ((fb < 0))))) {\n            return;\n        }\n    ;\n    ;\n        var ib = db.getNextSectionKey(eb);\n        if (ib) {\n            p.get(ib).load();\n            xa(ib, fb, gb);\n        }\n    ;\n    ;\n    }, 500);\n    function ya(eb, fb, gb, hb) {\n        var ib = db.getNextSectionKey(fb);\n        if (ib) {\n            oa[ib] = new l(eb, za.curry(ib, eb), false, ((gb || 1000)));\n        }\n         else if (((fb !== db.WAY_BACK))) {\n            hb = ((hb ? hb : 0));\n            if (((hb > 80))) {\n                return null;\n            }\n        ;\n        ;\n            ya.curry(eb, fb, gb, ((hb + 1))).defer(250);\n        }\n        \n    ;\n    ;\n    };\n;\n    function za(eb, fb) {\n        var gb = p.get(eb);\n        if (((gb && gb.canScrollLoad))) {\n            sa.add_event(((\"scroll_load_\" + eb)));\n            if (ga) {\n                gb.preload();\n            }\n             else {\n                gb.load();\n                if (ua) {\n                    xa(eb, ua.required_units, ua.max_parallelism);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((fb && j.remove(fb)));\n        }\n    ;\n    ;\n    };\n;\n    function ab() {\n        var eb, fb, gb = false;\n        for (var hb = 0; ((hb < ka.length)); hb++) {\n            var ib = ka[hb];\n            if (!ib) {\n                continue;\n            }\n        ;\n        ;\n            var jb = p.get(ib);\n            if (((jb && ((jb.canScrollLoad || jb.loaded))))) {\n                if (!jb.loaded) {\n                    i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n                    i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n                }\n            ;\n            ;\n                if (((eb && fb))) {\n                    bb(eb, fb);\n                    if (gb) {\n                        eb.deactivateScrollLoad();\n                    }\n                ;\n                ;\n                    gb = true;\n                }\n            ;\n            ;\n                eb = null;\n                fb = null;\n                continue;\n            }\n             else if (eb) {\n                fb = jb;\n                jb.deactivateScrollLoad();\n            }\n             else {\n                eb = jb;\n                if (gb) {\n                    jb.activateScrollLoad();\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            i.removeClass(jb.node, \"fbTimelineTimePeriodSuppressed\");\n            i.addClass(jb.node, \"fbTimelineTimePeriodUnexpanded\");\n        };\n    ;\n    };\n;\n    function bb(eb, fb) {\n        i.removeClass(fb.node, \"fbTimelineTimePeriodUnexpanded\");\n        i.addClass(fb.node, \"fbTimelineTimePeriodSuppressed\");\n        var gb = j.JSBNG__find(eb.node, \"span.sectionLabel\"), hb = j.JSBNG__find(fb.node, \"span.sectionLabel\");\n        if (!hb.getAttribute(\"data-original-label\")) {\n            hb.setAttribute(\"data-original-label\", j.getText(hb));\n        }\n    ;\n    ;\n        if (((((gb.getAttribute(\"data-month\") && hb.getAttribute(\"data-month\"))) && ((gb.getAttribute(\"data-year\") == hb.getAttribute(\"data-year\")))))) {\n            j.setContent(hb, da._(\"Show {month1} - {month2} {year}\", {\n                month1: hb.getAttribute(\"data-month\"),\n                month2: gb.getAttribute(\"data-month\"),\n                year: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else if (((gb.getAttribute(\"data-year\") !== hb.getAttribute(\"data-year\")))) {\n            j.setContent(hb, da._(\"Show {year1} - {year2}\", {\n                year1: hb.getAttribute(\"data-year\"),\n                year2: gb.getAttribute(\"data-year\")\n            }));\n        }\n         else j.setContent(hb, da._(\"Show {year}\", {\n            year: hb.getAttribute(\"data-year\")\n        }));\n        \n    ;\n    ;\n    };\n;\n    function cb(eb) {\n        if (ga) {\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                }\n            ;\n            ;\n                if (((gb != eb))) {\n                    var hb = p.get(gb);\n                    if (((hb.loaded && hb.canUnload))) {\n                        hb.unload();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        }\n    ;\n    ;\n        ab();\n    };\n;\n    var db = {\n        WAY_BACK: \"way_back\",\n        RECENT: \"recent\",\n        HEADER_SCROLL_CUTOFF: 80,\n        CURRENT_SECTION_OFFSET: 150,\n        FOOTER_HEIGHT: 60,\n        registerTimePeriod: function(eb, fb, gb, hb, ib, jb, kb) {\n            wa();\n            if (w(ma, fb)) {\n                return;\n            }\n        ;\n        ;\n            if (la) {\n                x(gb, la);\n            }\n        ;\n        ;\n            var lb = new va(eb, fb, gb, hb, kb);\n            if (!ib) {\n                ka[jb] = fb;\n                ja[fb] = true;\n            }\n             else {\n                lb.parentKey = ib;\n                p.get(ib).subSections = ((p.get(ib).subSections || []));\n                p.get(ib).subSections[jb] = lb;\n            }\n        ;\n        ;\n            p.set(fb, lb);\n            db.checkCurrentSectionChange();\n            h.inform(n.SECTION_REGISTERED, {\n                scrubberKey: fb\n            });\n        },\n        reset: function() {\n            {\n                var fin254keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin254i = (0);\n                var eb;\n                for (; (fin254i < fin254keys.length); (fin254i++)) {\n                    ((eb) = (fin254keys[fin254i]));\n                    {\n                        oa[eb].remove();\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin255keys = ((window.top.JSBNG_Replay.forInKeys)((pa))), fin255i = (0);\n                var fb;\n                for (; (fin255i < fin255keys.length); (fin255i++)) {\n                    ((fb) = (fin255keys[fin255i]));\n                    {\n                        ((pa[fb] && pa[fb].cancel()));\n                    ;\n                    };\n                };\n            };\n        ;\n            {\n                var fin256keys = ((window.top.JSBNG_Replay.forInKeys)((qa))), fin256i = (0);\n                var gb;\n                for (; (fin256i < fin256keys.length); (fin256i++)) {\n                    ((gb) = (fin256keys[fin256i]));\n                    {\n                        qa[gb].unsubscribe();\n                        delete qa[gb];\n                    };\n                };\n            };\n        ;\n            ((ha && ha.unsubscribe()));\n            ha = null;\n            p.removeAll();\n            ia = null;\n            ja = {\n            };\n            ka = [];\n            la = [];\n            ma = [];\n            na = {\n            };\n            oa = {\n            };\n            pa = {\n            };\n            ra = null;\n            sa = null;\n            ta = false;\n            fa = false;\n        },\n        checkCurrentSectionChange: function() {\n            var eb = db.getCurrentSection(), fb = ((ia && ia.scrubberKey));\n            if (((((eb && ((eb.scrubberKey !== fb)))) && !eb.isPermalinkPeriod()))) {\n                ia = eb;\n                var gb = eb.scrubberKey, hb = eb.parentKey;\n                if (!hb) {\n                    hb = gb;\n                    gb = null;\n                }\n            ;\n            ;\n                o.sectionHasChanged(hb, gb);\n            }\n        ;\n        ;\n        },\n        setTimeCutoff: function(eb) {\n            ra = eb;\n        },\n        getTimeCutoff: function() {\n            return ra;\n        },\n        setParallelLoadConfig: function(eb) {\n            ua = eb;\n        },\n        getCurrentSection: function() {\n            var eb = {\n            }, fb = p.getAll();\n            {\n                var fin257keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin257i = (0);\n                var gb;\n                for (; (fin257i < fin257keys.length); (fin257i++)) {\n                    ((gb) = (fin257keys[fin257i]));\n                    {\n                        var hb = fb[gb];\n                        if (((!hb.loaded || na[hb.scrubberKey]))) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        var ib = u.getElementPosition(hb.node, \"viewport\").y;\n                        if (((hb.scrubberKey == \"recent\"))) {\n                            ib--;\n                        }\n                    ;\n                    ;\n                        if (((ib < db.CURRENT_SECTION_OFFSET))) {\n                            eb[ib] = hb;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var jb = Math.max.apply(null, Object.keys(eb)), kb = ((jb == -Infinity));\n            if (!kb) {\n                return eb[jb];\n            }\n             else if (ka[0]) {\n                return p.get(ka[0]);\n            }\n            \n        ;\n        ;\n            return null;\n        },\n        capsuleForCurrentSection: function() {\n            var eb = db.getCurrentSection();\n            return ((eb && j.scry(eb.node, \".fbTimelineCapsule\")[0]));\n        },\n        enableScrollLoad: function(eb, fb, gb, hb) {\n            eb = v(eb);\n            var ib = j.scry(eb.parentNode, \".fbTimelineCapsule\")[0];\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            if (((gb === null))) {\n                ya(eb, fb, hb);\n            }\n             else o.runOnceWhenSectionFullyLoaded(ya.curry(eb, fb, hb), fb, gb);\n        ;\n        ;\n        },\n        enableScrollLoadOnClick: function(eb, fb, gb) {\n            eb = v(eb);\n            g.listen(eb, \"click\", function(hb) {\n                hb.prevent();\n                db.enableScrollLoad(eb, fb, null, gb);\n            });\n        },\n        expandSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expand();\n            });\n        },\n        expandSubSectionsOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).expandSubSections();\n            });\n        },\n        getNextSectionKey: function(eb) {\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                if (((ka[fb] == eb))) {\n                    while (((((fb < ((ka.length - 1)))) && !ka[((fb + 1))]))) {\n                        fb++;\n                    ;\n                    };\n                ;\n                    return ka[((fb + 1))];\n                }\n            ;\n            ;\n            };\n        ;\n            var gb = p.get(eb);\n            if (((!gb || !gb.parentKey))) {\n                return;\n            }\n        ;\n        ;\n            var hb = p.get(gb.parentKey);\n            if (!hb) {\n                return;\n            }\n        ;\n        ;\n            for (var ib = 0; ((ib < ((hb.subSections.length - 1)))); ib++) {\n                if (((hb.subSections[ib].scrubberKey == eb))) {\n                    return hb.subSections[((ib + 1))].scrubberKey;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        hideSection: function(eb) {\n            var fb = p.get(eb);\n            ((fb && i.hide(j.JSBNG__find(fb.node, \".fbTimelineSection\"))));\n            var gb = o.getCurrentScrubber();\n            if (gb) {\n                var hb = o.getCurrentScrubber().getNav(eb);\n                ((hb && i.hide(hb)));\n            }\n        ;\n        ;\n            var ib = o.getCurrentStickyHeaderNav();\n            ((ib && ib.removeTimePeriod(eb)));\n            na[eb] = true;\n        },\n        loadSectionOnClick: function(eb, fb) {\n            g.listen(eb, \"click\", function(gb) {\n                gb.prevent();\n                p.get(fb).load();\n            });\n        },\n        removeSection: function(eb) {\n            {\n                var fin258keys = ((window.top.JSBNG_Replay.forInKeys)((ka))), fin258i = (0);\n                var fb;\n                for (; (fin258i < fin258keys.length); (fin258i++)) {\n                    ((fb) = (fin258keys[fin258i]));\n                    {\n                        if (((ka[fb] == eb))) {\n                            ka[fb] = null;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            p.remove(eb);\n            delete ja[eb];\n            if (((eb in oa))) {\n                oa[eb].remove();\n                delete oa[eb];\n            }\n        ;\n        ;\n            var gb = o.getCurrentStickyHeaderNav();\n            ((gb && gb.removeTimePeriod(eb)));\n            ma.push(eb);\n        },\n        removeSectionParent: function(eb) {\n            j.remove(v(eb).parentNode);\n        },\n        navigateToSection: function(eb, fb, gb) {\n            sa.add_event(((\"nav_\" + eb)));\n            fb = !!fb;\n            var hb = eb, ib = p.get(eb);\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            if (!ib.loaded) {\n                q.enable();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineShowOlderSections\").forEach(j.remove);\n            }\n        ;\n        ;\n            if (!ja[eb]) {\n                ib.node.style.minHeight = ((u.getViewportDimensions().y + \"px\"));\n                var jb = h.subscribe(n.SECTION_FULLY_LOADED, function(rb, sb) {\n                    if (((sb.scrubberKey === eb))) {\n                        ib.node.style.minHeight = \"\";\n                        jb.unsubscribe();\n                    }\n                ;\n                ;\n                });\n                hb = ib.parentKey;\n                var kb = p.get(hb).node;\n                if (!i.hasClass(kb, \"fbTimelineSectionExpanded\")) {\n                    k.JSBNG__scrollTo(kb, 0);\n                    i.addClass(kb, \"fbTimelineSectionExpanded\");\n                    j.scry(kb, \".fbTimelineCapsule\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineSectionExpandPager\").forEach(j.remove);\n                    j.scry(kb, \"div.fbTimelineContentHeader\").forEach(j.remove);\n                    j.scry(kb, \".-cx-PRIVATE-fbTimelineOneColumnHeader__header\").forEach(function(rb) {\n                        if (!rb.getAttribute(\"data-subsection\")) {\n                            j.remove(rb);\n                        }\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n                var lb = db.getNextSectionKey(hb);\n                if (((lb && oa[lb]))) {\n                    oa[lb].setBuffer(0);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            for (var mb = 0; ((mb < ka.length)); mb++) {\n                var nb = ka[mb];\n                if (!nb) {\n                    continue;\n                }\n            ;\n            ;\n                if (((nb == hb))) {\n                    break;\n                }\n            ;\n            ;\n                p.get(nb).deactivateScrollLoad();\n                j.scry(v(\"timeline_tab_content\"), \".fbTimelineSectionExpandPager\").forEach(function(rb) {\n                    var sb = m.getInstance(rb.id);\n                    ((sb && sb.removeOnVisible()));\n                });\n            };\n        ;\n            db.adjustContentPadding();\n            ib.load(gb, true);\n            ab();\n            var ob = u.getScrollPosition().x, pb = u.getElementPosition(ib.node).y;\n            if (!fb) {\n                var qb = ((ja[eb] ? n.SCROLL_TO_OFFSET : n.SUBSECTION_SCROLL_TO_OFFSET));\n                k.JSBNG__scrollTo(new u(ob, ((pb - qb)), \"JSBNG__document\"), true, false, false, function() {\n                    var rb = u.getElementPosition(ib.node).y;\n                    k.JSBNG__scrollTo(new u(ob, ((rb - qb)), \"JSBNG__document\"), false);\n                    var sb = j.scry(ib.node, \"h3.uiHeaderTitle\")[0];\n                    if (sb) {\n                        sb.tabIndex = 0;\n                        sb.JSBNG__focus();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        },\n        adjustContentPadding: function() {\n            var eb = ba(\"timeline_tab_content\");\n            if (!eb) {\n                return;\n            }\n        ;\n        ;\n            if (o.isOneColumnMinimal()) {\n                return;\n            }\n        ;\n        ;\n            var fb = ((o.getCurrentKey() || r.TIMELINE_KEY));\n            if (((fb !== r.TIMELINE_KEY))) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((ka.length - 1)), hb = p.get(ka[gb]);\n            eb.style.paddingBottom = ((((hb && hb.loaded)) ? null : ((((((((u.getViewportDimensions().y - db.CURRENT_SECTION_OFFSET)) - db.HEADER_SCROLL_CUTOFF)) - db.FOOTER_HEIGHT)) + \"px\"))));\n        },\n        adjustContentPaddingAfterLoad: function(eb, fb) {\n            o.runOnceWhenSectionFullyLoaded(db.adjustContentPadding, eb, fb);\n        },\n        appendContentAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(j.appendContent.curry(v(eb), fb), gb, \"0\");\n        },\n        markSectionAsLoaded: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                ((ba(eb) && i.removeClass(v(eb).parentNode, \"fbTimelineSectionLoading\")));\n            }, fb, gb);\n        },\n        suppressSectionsAbove: function(eb) {\n            var fb, gb;\n            for (var hb = 0; ((hb < ka.length)); hb++) {\n                var ib = ka[hb];\n                if (!ib) {\n                    continue;\n                }\n            ;\n            ;\n                fb = p.get(ib).node;\n                gb = null;\n                if (((y(eb.parentNode.children).indexOf(eb) <= y(fb.parentNode.children).indexOf(fb)))) {\n                    gb = ib;\n                    break;\n                }\n            ;\n            ;\n                p.get(ib).deactivateScrollLoad();\n            };\n        ;\n            if (gb) {\n                db.navigateToSection(gb, true);\n            }\n        ;\n        ;\n        },\n        forceNoFriendActivity: function() {\n            ta = true;\n        },\n        removeDupes: function(eb) {\n            var fb = ba(eb);\n            if (!fb) {\n                return;\n            }\n        ;\n        ;\n            var gb = j.scry(fb, \"li.fbTimelineUnit\"), hb = {\n            };\n            for (var ib = 0; ((ib < gb.length)); ib++) {\n                var jb = gb[ib];\n                if (((jb.id && ca(jb.id, \"tl_unit_\")))) {\n                    var kb = jb.id.substring(8, jb.id.length), lb = ((((jb.getAttribute(\"data-unit\") == \"ExperienceSummaryUnit\")) ? jb.getAttribute(\"data-time\") : 1));\n                    if (((hb.hasOwnProperty(kb) && ((hb[kb] == lb))))) {\n                        jb.id = ((\"dupe_unit_\" + Math.JSBNG__random()));\n                        jb.className = \"hidden_elem\";\n                    }\n                     else hb[kb] = lb;\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        removeLoadingState: function(eb) {\n            ((ba(eb) && i.removeClass(v(eb), \"fbTimelineSectionLoading\")));\n        },\n        setExpandLoadDataForSection: function(eb, fb) {\n            var gb = p.get(eb);\n            ((gb && gb.setExpandLoadData(fb)));\n        },\n        appendSectionDataForAllSections: function(eb) {\n            la = eb;\n            for (var fb = 0; ((fb < ((ka.length - 1)))); fb++) {\n                var gb = ka[fb];\n                if (!gb) {\n                    continue;\n                }\n            ;\n            ;\n                var hb = p.get(gb);\n                ((hb && hb.appendData(eb)));\n            };\n        ;\n        },\n        updatePagerAfterLoad: function(eb, fb, gb, hb, ib) {\n            var jb = m.getInstance(eb.firstChild.id);\n            if (!jb) {\n                qa[eb.firstChild.id] = h.subscribe(m.REGISTERED, function(kb, lb) {\n                    qa[eb.firstChild.id].unsubscribe();\n                    delete qa[eb.firstChild.id];\n                    if (((lb.id === eb.firstChild.id))) {\n                        db.updatePagerAfterLoad(eb, fb, gb, hb, ib);\n                    }\n                ;\n                ;\n                });\n                return;\n            }\n        ;\n        ;\n            o.runOnceWhenSectionFullyLoaded(function() {\n                i.removeClass(eb, \"fbTimelineHiddenPager\");\n                jb.checkBuffer();\n            }, gb, hb);\n            if (ib) {\n                o.runOnceWhenSectionFullyLoaded(o.adjustScrollingPagerBuffer.curry(eb.firstChild.id, fb), gb, hb);\n            }\n        ;\n        ;\n        },\n        showAfterLoad: function(eb, fb, gb) {\n            o.runOnceWhenSectionFullyLoaded(function() {\n                var hb = ba(eb);\n                ((hb && i.show(hb)));\n            }, fb, gb);\n        },\n        repositionDialog: function(eb) {\n            h.subscribe(n.SECTION_LOADED, function() {\n                eb.updatePosition();\n            });\n        },\n        rightColumnFinished: function(eb) {\n            var fb = p.get(eb);\n            fb.rightColumnFinished = true;\n        },\n        registerUnrankedGroup: function(eb, fb) {\n            g.listen(eb, \"click\", function(JSBNG__event) {\n                o.unrankedWasClicked();\n                var gb = eb.offsetHeight;\n                j.remove(eb.parentNode);\n                i.removeClass(fb, \"hidden_elem\");\n                var hb = fb.offsetHeight;\n                fb.style.height = ((gb + \"px\"));\n                fb.style.height = ((hb + \"px\"));\n                return true;\n            });\n        }\n    };\n    e.exports = db;\n});\n__d(\"TimelineLogging\", [\"TimelineController\",\"reportData\",], function(a, b, c, d, e, f) {\n    var g = b(\"TimelineController\"), h = b(\"reportData\"), i = false, j = 0, k = null, l = null, m = {\n        init: function(n) {\n            if (i) {\n                return;\n            }\n        ;\n        ;\n            j = n;\n            g.register(g.LOGGING, this);\n        },\n        reset: function() {\n            i = false;\n            j = 0;\n            k = null;\n        },\n        log: function(n, o) {\n            o.profile_id = j;\n            h(n, {\n                gt: o\n            });\n        },\n        logSectionChange: function(n, o) {\n            var p = {\n                timeline_section_change: 1,\n                key: n\n            };\n            if (((k && ((n == k))))) {\n                p.timeline_scrubber = 1;\n                k = null;\n            }\n        ;\n        ;\n            if (((l && ((n == l))))) {\n                p.sticky_header_nav = 1;\n                l = null;\n            }\n        ;\n        ;\n            m.log(\"timeline\", p);\n        },\n        logScrubberClick: function(n) {\n            k = n;\n        },\n        logStickyHeaderNavClick: function(n) {\n            l = n;\n        },\n        logUnrankedClick: function() {\n            var n = {\n                timeline_unranked: 1\n            };\n            m.log(\"timeline\", n);\n        }\n    };\n    e.exports = m;\n});\n__d(\"TimelineStickyHeaderComposerX\", [\"JSBNG__Event\",\"Arbiter\",\"Bootloader\",\"JSBNG__CSS\",\"ComposerXController\",\"DOMQuery\",\"Parent\",\"Run\",\"TimelineComposerUtilities\",\"TimelineContentLoader\",\"TimelineStickyHeader\",\"Vector\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"JSBNG__CSS\"), k = b(\"ComposerXController\"), l = b(\"DOMQuery\"), m = b(\"Parent\"), n = b(\"Run\"), o = b(\"TimelineComposerUtilities\"), p = b(\"TimelineContentLoader\"), q = b(\"TimelineStickyHeader\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\");\n    function v(x) {\n        return ((x && m.byClass(x.getContext(), \"-cx-PRIVATE-fbTimelineStickyHeaderComposer__root\")));\n    };\n;\n    function w(x) {\n        this._composerRoot = x;\n        this._tokens = [o.listenToSetEstimatedDate(this._composerRoot, p.capsuleForCurrentSection),o.listenToPublish(this._composerRoot, this._close.bind(this)),h.subscribe(\"PhotoSnowlift.OPEN\", this._close.bind(this)),h.subscribe(\"TimelineMLE/mleFlyoutShown\", function(y, z) {\n            if (((v(z) === this._composerRoot))) {\n                k.reset(this._composerRoot);\n            }\n        ;\n        ;\n        }.bind(this)),h.subscribe(\"composer/initializedAttachment\", function(y, z) {\n            if (((z.composerRoot === this._composerRoot))) {\n                this._registerClickToDismiss();\n                if (!z.isInitial) {\n                    this._closeMLE();\n                }\n            ;\n            ;\n            }\n             else this._close();\n        ;\n        ;\n        }.bind(this)),h.subscribe(q.ADJUST_WIDTH, this._toggleNarrowMode.bind(this)),];\n        this._clickCancelToken = o.listenToCancel(this._composerRoot, this._close.bind(this));\n        n.onLeave(function() {\n            while (this._tokens.length) {\n                this._tokens.pop().unsubscribe();\n            ;\n            };\n        ;\n            this._clearClickDismissToken();\n            if (this._clickCancelToken) {\n                this._clickCancelToken.remove();\n                this._clickCancelToken = null;\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    s(w.prototype, {\n        _toggleNarrowMode: function(JSBNG__event, x) {\n            i.loadModules([\"Tooltip\",], function(y) {\n                var z = ((r.getElementDimensions(x).x > 400)), aa = l.scry(this._composerRoot, \".-cx-PUBLIC-fbComposerAttachment__link\");\n                j.conditionClass(this._composerRoot, \"-cx-PRIVATE-fbTimelineStickyHeaderComposer__narrow\", z);\n                for (var ba = 0; ((ba < aa.length)); ba++) {\n                    var ca = aa[ba], da = l.getText(ca);\n                    if (z) {\n                        y.set(ca, da);\n                    }\n                     else y.remove(ca);\n                ;\n                ;\n                };\n            ;\n            }.bind(this));\n            return false;\n        },\n        _registerClickToDismiss: function() {\n            var x = j.hasClass(l.JSBNG__find(this._composerRoot, \".-cx-PRIVATE-fbComposerAttachment__mle\"), \"-cx-PUBLIC-fbComposerAttachment__selected\");\n            if (!x) {\n                this._clearClickDismissToken();\n                return;\n            }\n        ;\n        ;\n            this._clickDismissToken = g.listen(JSBNG__document.body, \"click\", function(y) {\n                var z = m.byClass(y.getTarget(), \"-cx-PRIVATE-fbTimelineStickyHeaderComposer__root\");\n                if (!z) {\n                    this._close();\n                    this._clearClickDismissToken();\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _clearClickDismissToken: function() {\n            if (this._clickDismissToken) {\n                this._clickDismissToken.remove();\n                this._clickDismissToken = null;\n            }\n        ;\n        ;\n        },\n        _close: function() {\n            this._clearClickDismissToken();\n            this._closeMLE();\n            k.reset(this._composerRoot);\n        },\n        _closeMLE: function() {\n            i.loadModules([\"TimelineMLE\",], function(x) {\n                var y = x.getFlyout();\n                if (((v(y) === this._composerRoot))) {\n                    x.hideFlyout();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = w;\n});\n__d(\"TimelineSpinelessComposer\", [\"Arbiter\",\"Bootloader\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"Run\",\"TimelineComposer\",\"TimelineComposerUtilities\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Bootloader\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"Parent\"), l = b(\"Run\"), m = b(\"TimelineComposer\"), n = b(\"TimelineComposerUtilities\"), o = b(\"csx\"), p = b(\"cx\"), q;\n    function r(w) {\n        if (((w.isScheduledPost || w.isOGPost))) {\n            return;\n        }\n    ;\n    ;\n        if (!w.streamStory) {\n            window.JSBNG__location.reload();\n            return;\n        }\n    ;\n    ;\n        if (w.backdatedTime) {\n            h.loadModules([\"TimelineStoryPublisher\",], function(x) {\n                x.publish(w);\n            });\n            return;\n        }\n    ;\n    ;\n        m.renderCapsuleBasedStory(q, w.streamStory);\n    };\n;\n    function s() {\n        return j.JSBNG__find(k.byClass(q, \"fbTimelineComposerCapsule\"), \"div.-cx-PRIVATE-fbTimelineComposerAttachment__mleflyoutpointer\");\n    };\n;\n    function t(w) {\n        var x = u();\n        i.show(x);\n        var y = w.subscribe(\"hide\", function() {\n            i.hide(x);\n            w.unsubscribe(y);\n        });\n    };\n;\n    function u() {\n        var w = k.byClass(q, \"fbTimelineComposerCapsule\"), x = j.scry(w, \"div.composerVeil\");\n        if (((x.length !== 1))) {\n            x = j.appendContent(w, j.create(\"div\", {\n                className: \"composerVeil hidden_elem\"\n            }));\n        }\n    ;\n    ;\n        return x[0];\n    };\n;\n    var v = {\n        init: function(w) {\n            q = w;\n            var x = g.subscribe(\"composer/publish\", function(JSBNG__event, y) {\n                if (((y.composer_id === q.id))) {\n                    r(y);\n                }\n            ;\n            ;\n            });\n            l.onLeave(x.unsubscribe.bind(x));\n            if (i.hasClass(q, \"-cx-PRIVATE-fbTimelineComposer__root\")) {\n                n.hidePlaceIfAttachmentsTooTall(q);\n            }\n             else n.hidePlaceIfAttachmentsTooTallOld(q);\n        ;\n        ;\n        },\n        showMLEFlyout: function(w) {\n            w.setContext(s()).show();\n            t(w);\n        }\n    };\n    e.exports = v;\n});\n__d(\"TimelineStickyRightColumn\", [\"Arbiter\",\"JSBNG__CSS\",\"DOMQuery\",\"JSBNG__Event\",\"PhotoSnowlift\",\"Run\",\"Style\",\"TimelineContentLoader\",\"Vector\",\"UserAgent\",\"csx\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOMQuery\"), j = b(\"JSBNG__Event\"), k = b(\"PhotoSnowlift\"), l = b(\"Run\"), m = b(\"Style\"), n = b(\"TimelineContentLoader\"), o = b(\"Vector\"), p = b(\"UserAgent\"), q = b(\"csx\"), r = b(\"queryThenMutateDOM\"), s = 100, t = 15, u = 15, v = 71, w = false, x = null, y = null, z, aa, ba, ca, da, ea, fa, ga;\n    function ha() {\n        if (k.getInstance().isOpen) {\n            return;\n        }\n    ;\n    ;\n        z = n.getCurrentSection();\n        if (((!z || !z.rightColumnFinished))) {\n            return;\n        }\n    ;\n    ;\n        var pa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__leftcapsule\")[0], qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        aa = ((pa ? pa.offsetHeight : 0));\n        ba = ((qa ? qa.offsetHeight : 0));\n        ca = o.getViewportDimensions().y;\n        fa = ((pa ? o.getElementPosition(pa).y : 0));\n        ga = ((JSBNG__document.body.clientWidth < JSBNG__document.body.scrollWidth));\n    };\n;\n    function ia() {\n        if (k.getInstance().isOpen) {\n            return;\n        }\n    ;\n    ;\n        if (((y && ((y !== z))))) {\n            var pa = i.scry(y.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n            if (pa) {\n                ka(pa, \"\", \"\", \"\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var qa = i.scry(z.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!qa) {\n            return;\n        }\n    ;\n    ;\n        if (ga) {\n            ka(qa, \"\", \"\", \"\");\n            return;\n        }\n    ;\n    ;\n        if (((!z || !z.rightColumnFinished))) {\n            return;\n        }\n    ;\n    ;\n        ja(z);\n        y = ((h.hasClass(qa, \"fixed_always\") ? z : null));\n    };\n;\n    function ja(pa) {\n        if (((((ba >= aa)) || ((aa <= ca))))) {\n            return;\n        }\n    ;\n    ;\n        ea = da;\n        da = o.getScrollPosition().y;\n        var qa, ra = i.scry(pa.node, \".-cx-PUBLIC-timelineOneColMin__rightcapsule\")[0];\n        if (!ra) {\n            return;\n        }\n    ;\n    ;\n        if (((da <= ((fa - la()))))) {\n            ka(ra, \"\", \"\", \"\");\n            return;\n        }\n    ;\n    ;\n        if (((((aa + fa)) <= ((da + Math.min(((ba + la())), ((((ca - u)) - v)))))))) {\n            ka(ra, \"absolute\", \"\", ((u + \"px\")));\n            return;\n        }\n    ;\n    ;\n        if (((ba > ((((ca - u)) - la()))))) {\n            if (((da < ea))) {\n                var sa = false;\n                if (((ra.style.position === \"absolute\"))) {\n                    if (((((ra.style.JSBNG__top !== \"\")) && ((((((da + la())) - fa)) <= parseInt(ra.style.JSBNG__top, 10)))))) {\n                        sa = true;\n                    }\n                     else if (((((ra.style.bottom !== \"\")) && ((da <= ((((((fa + aa)) - la())) - ba))))))) {\n                        sa = true;\n                    }\n                    \n                ;\n                }\n            ;\n            ;\n                if (sa) {\n                    ka(ra, \"fixed\", ((la() + \"px\")), \"\");\n                    return;\n                }\n                 else if (((((ra.style.position === \"absolute\")) && ra.style.JSBNG__top))) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if (((parseInt(ra.style.JSBNG__top, 10) >= la()))) {\n                        return;\n                    }\n                ;\n                ;\n                    qa = ((((da - fa)) - ((ba - ((ca - v))))));\n                    if (ea) {\n                        qa += ((ea - da));\n                    }\n                ;\n                ;\n                    ka(ra, \"absolute\", ((qa + \"px\")), \"\");\n                    return;\n                }\n                \n                \n            ;\n            ;\n            }\n             else {\n                var ta = false;\n                if (((((ra.style.position === \"absolute\")) || ((((ra.style.position === \"\")) && !h.hasClass(ra, \"fixed_always\")))))) {\n                    qa = ((ra.style.JSBNG__top ? parseInt(ra.style.JSBNG__top, 10) : 0));\n                    if (((((da + ca)) >= ((((((fa + qa)) + ba)) + v))))) {\n                        ta = true;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (ta) {\n                    qa = ((((((ca - ba)) - u)) - v));\n                    ka(ra, \"fixed\", ((qa + \"px\")), \"\");\n                    return;\n                }\n                 else if (((da == ea))) {\n                    return;\n                }\n                 else if (h.hasClass(ra, \"fixed_always\")) {\n                    if (((parseInt(ra.style.JSBNG__top, 10) >= la()))) {\n                        qa = ((((da - fa)) + la()));\n                        if (ea) {\n                            qa += ((ea - da));\n                        }\n                    ;\n                    ;\n                        ka(ra, \"absolute\", ((qa + \"px\")), \"\");\n                        return;\n                    }\n                ;\n                ;\n                }\n                 else if (((ra.style.position === \"absolute\"))) {\n                    return;\n                }\n                \n                \n                \n            ;\n            ;\n            }\n        ;\n        ;\n        }\n         else ka(ra, \"fixed\", ((la() + \"px\")), \"\");\n    ;\n    ;\n    };\n;\n    function ka(pa, qa, ra, sa) {\n        m.set(pa, \"bottom\", sa);\n        if (((qa === \"fixed\"))) {\n            h.addClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", \"\");\n        }\n         else {\n            h.removeClass(pa, \"fixed_always\");\n            m.set(pa, \"position\", qa);\n        }\n    ;\n    ;\n        m.set(pa, \"JSBNG__top\", ra);\n        g.inform(\"reflow\");\n    };\n;\n    function la() {\n        return ((h.hasClass(JSBNG__document.documentElement, \"tinyViewport\") ? t : s));\n    };\n;\n    function ma() {\n        r(ha, ia);\n    };\n;\n    function na() {\n        w = false;\n        y = null;\n        while (x.length) {\n            x.pop().remove();\n        ;\n        };\n    ;\n        x = null;\n    };\n;\n    var oa = {\n        init: function() {\n            if (((w || ((p.ie() < 8))))) {\n                return;\n            }\n        ;\n        ;\n            w = true;\n            x = [j.listen(window, \"JSBNG__scroll\", ma),j.listen(window, \"resize\", ma),];\n            l.onLeave(na);\n        },\n        adjust: function() {\n            if (w) {\n                ha();\n                ia();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = oa;\n});\n__d(\"TimelineProfileQuestionsUnit\", [\"JSBNG__CSS\",\"JSBNG__Event\",\"Parent\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"JSBNG__Event\"), i = b(\"Parent\"), j = b(\"tidyEvent\"), k = null, l = {\n        COLLAPSED: \"collapsedUnit\",\n        UNIT: \"fbTimelineUnit\"\n    };\n    function m(n, o, p, q) {\n        this.$TimelineProfileQuestionsUnit0 = n;\n        this.$TimelineProfileQuestionsUnit1 = o;\n        this.$TimelineProfileQuestionsUnit2 = p;\n        this.$TimelineProfileQuestionsUnit3 = q;\n        this.$TimelineProfileQuestionsUnit4();\n        ((k && k.$TimelineProfileQuestionsUnit5()));\n        k = this;\n    };\n;\n    m.prototype.$TimelineProfileQuestionsUnit5 = function() {\n        ((this.$TimelineProfileQuestionsUnit6 && this.$TimelineProfileQuestionsUnit6.remove()));\n        this.$TimelineProfileQuestionsUnit6 = null;\n    };\n    m.prototype.$TimelineProfileQuestionsUnit4 = function() {\n        if (this.$TimelineProfileQuestionsUnit3.isCollapsed) {\n            return;\n        }\n    ;\n    ;\n        this.$TimelineProfileQuestionsUnit6 = h.listen(this.$TimelineProfileQuestionsUnit1, \"click\", this.$TimelineProfileQuestionsUnit7.bind(this));\n        j(this.$TimelineProfileQuestionsUnit6);\n    };\n    m.prototype.$TimelineProfileQuestionsUnit7 = function() {\n        if (!this.$TimelineProfileQuestionsUnit2) {\n            return;\n        }\n    ;\n    ;\n        var n = i.byClass(this.$TimelineProfileQuestionsUnit0, l.UNIT);\n        g.toggle(this.$TimelineProfileQuestionsUnit2);\n        var o = !g.shown(this.$TimelineProfileQuestionsUnit2);\n        g.conditionClass(n, l.COLLAPSED, o);\n    };\n    m.updateElements = function(n, o) {\n        if (!k) {\n            return;\n        }\n    ;\n    ;\n        k.$TimelineProfileQuestionsUnit5();\n        k.$TimelineProfileQuestionsUnit1 = n;\n        k.$TimelineProfileQuestionsUnit2 = o;\n        k.$TimelineProfileQuestionsUnit4();\n    };\n    e.exports = m;\n});");
// 13543
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o89,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yV/r/qrynZd4S1j9.js",o90);
// undefined
o89 = null;
// undefined
o90 = null;
// 13613
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"4kgAq\",]);\n}\n;\n__d(\"AdsCurrency\", [\"AdsCurrencyConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrencyConfig\").currencies;\n    function h(m) {\n        if (g[m]) {\n            return g[m][0]\n        };\n        return null;\n    };\n    function i(m) {\n        if (g[m]) {\n            return g[m][1]\n        };\n        return null;\n    };\n    function j(m) {\n        if (g[m]) {\n            return (1 * g[m][2])\n        };\n        return 1;\n    };\n    var k = [];\n    for (var l in g) {\n        if (g.hasOwnProperty(l)) {\n            k.push(l);\n        };\n    };\n    f.getFormat = h;\n    f.getSymbol = i;\n    f.getOffset = j;\n    f.currencyMapKeys = k;\n});\n__d(\"ads-lib-formatters\", [\"AdsCurrency\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrency\"), h = \"USD\";\n    function i(t, u, v) {\n        t = (t || \"\");\n        v = (v || \"\");\n        u = ((typeof u === \"undefined\") ? t.length : u);\n        return ((t.length > u) ? ((t.substr(0, (u - v.length)) + v)) : t);\n    };\n    function j(t, u) {\n        if (((u === undefined) || (u === null))) {\n            u = \"\";\n        };\n        return function(v) {\n            return (!v ? u : i(v, t, \"...\"));\n        };\n    };\n    function k(t, u, v, w) {\n        if ((t === \"N/A\")) {\n            return t\n        };\n        t = (t || 0);\n        v = (v || \"\");\n        w = (w || \".\");\n        t = ((u !== null) ? l(t, u) : (t + \"\"));\n        var x = t.split(\".\"), y = x[0], z = x[1], aa = \"\", ba = /(\\d)(\\d\\d\\d)($|\\D)/, ca = ((\"$1\" + v) + \"$2$3\");\n        while (((aa = y.replace(ba, ca)) != y)) {\n            y = aa;;\n        };\n        var da = y;\n        if (z) {\n            da += (w + z);\n        };\n        return da;\n    };\n    function l(t, u) {\n        var v = Math.pow(10, u);\n        t = ((Math.round((t * v)) / v) + \"\");\n        if (!u) {\n            return t\n        };\n        var w = t.indexOf(\".\"), x = 0;\n        if ((w == -1)) {\n            t += \".\";\n            x = u;\n        }\n         else x = (u - (((t.length - w) - 1)));\n    ;\n        for (var y = 0, z = x; (y < z); y++) {\n            t += \"0\";;\n        };\n        return t;\n    };\n    function m(t) {\n        return function(u) {\n            return k(u, (t || 0), \",\", \".\");\n        };\n    };\n    function n(t, u) {\n        var v = ((u === false) ? 1 : 100);\n        return function(w) {\n            return (k((w * v), (t || 0), \",\", \".\") + \"%\");\n        };\n    };\n    var o = {\n    };\n    function p(t, u, v) {\n        if ((t === undefined)) {\n            t = 2;\n        };\n        if ((v === undefined)) {\n            v = false;\n        };\n        u = (u || h);\n        var w = ((((u + \"-\") + t) + \"-\") + v);\n        if (!o[w]) {\n            var x = (g.getFormat(u) || g.getFormat(h)), y = (g.getSymbol(u) || g.getSymbol(h)), z = (g.getOffset(u) || g.getOffset(h));\n            x = x.replace(\"{symbol}\", y);\n            o[w] = function(aa) {\n                if (v) {\n                    aa = (aa / z);\n                };\n                if (!((aa + \"\")).match(/^\\-?[\\d\\.,]*$/)) {\n                    return \"N/A\"\n                };\n                var ba = k(aa, t, \",\", \".\");\n                return x.replace(\"{amount}\", ba);\n            };\n        }\n    ;\n        return o[w];\n    };\n    function q(t) {\n        t = ((t + \"\")).trim().replace(/^[^\\d]*\\-/, \"\\u0002\");\n        if (!(((/^\\u0002?(\\d+,\\d*){2,}$/.test(t)) || (/^\\u0002?(\\d+\\.\\d*){2,}$/.test(t))))) {\n            t = t.replace(/[\\.,](\\d*\\D*)$/, \"\\u0001$1\");\n        };\n        t = t.replace(/[^0-9\\u0001\\u0002]/g, \"\").replace(\"\\u0001\", \".\").replace(\"\\u0002\", \"-\");\n        return (+t || 0);\n    };\n    function r() {\n        return function(t) {\n            return (k(t, 0, \",\", \".\") + \"%\");\n        };\n    };\n    function s(t) {\n        var u = t.currency(), v = ((t.offset() == 100) ? 2 : 0);\n        return p(v, u);\n    };\n    f.createTextTruncator = j;\n    f.chopString = i;\n    f.parseNumber = q;\n    f.formatNumber = k;\n    f.createNumberFormatter = m;\n    f.createPercentFormatter = n;\n    f.createMoneyFormatter = p;\n    f.createMoneyFormatterForAccount = s;\n    f.createInflationFormatter = r;\n});\n__d(\"PopoverMenuShowOnHover\", [\"Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._popoverMenu = j;\n        this._listeners = [];\n    };\n    h(i.prototype, {\n        enable: function() {\n            this._attachMouseListeners(this._popoverMenu.getTriggerElem());\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", this._onSetMenu.bind(this));\n        },\n        disable: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();;\n            };\n            if (this._setMenuSubscription) {\n                this._setMenuSubscription.unsubscribe();\n                this._setMenuSubscription = null;\n            }\n        ;\n        },\n        _onSetMenu: function() {\n            this._attachMouseListeners(this._popoverMenu.getMenu().getRoot());\n        },\n        _attachMouseListeners: function(j) {\n            var k = this._popoverMenu.getPopover();\n            this._listeners.push(g.listen(j, \"mouseenter\", k.showLayer.bind(k)), g.listen(j, \"mouseleave\", k.hideLayer.bind(k)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TriggerablePageletLoader\", [\"function-extensions\",\"CSS\",\"Event\",\"OnVisible\",\"Run\",\"UIPagelet\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"CSS\"), h = b(\"Event\"), i = b(\"OnVisible\"), j = b(\"Run\"), k = b(\"UIPagelet\"), l = b(\"copyProperties\"), m = [];\n    function n(p) {\n        if (!m[p]) {\n            return\n        };\n        (m[p].__trigger && m[p].__trigger.remove());\n        delete m[p];\n    };\n    function o(p, q) {\n        this._disabledTriggerKeys = [];\n        this._pageletConfig = p;\n        this._loaded = false;\n        this._loading = false;\n        this._triggerKeys = [];\n        if (q) {\n            q.forEach(this.addTrigger.bind(this));\n        };\n        j.onLeave(this.destroy.bind(this));\n    };\n    l(o, {\n        removeTrigger: function(p) {\n            for (var q in m) {\n                if ((m[q] && (m[q].node === p))) {\n                    n(q);\n                };\n            };\n        },\n        TRIGGER_CLICK: \"click\",\n        TRIGGER_ONVISIBLE: \"onvisible\",\n        TRIGGER_NOW: \"now\"\n    });\n    l(o.prototype, {\n        addTrigger: function(p) {\n            p.__trigger = this._createTrigger(p);\n            m.push(p);\n            this._triggerKeys.push((m.length - 1));\n        },\n        destroy: function() {\n            this.removeTriggers();\n            if (this._pageletRequest) {\n                this._pageletRequest.cancel();\n                this._pageletRequest = null;\n                this._loading = false;\n                this._loaded = false;\n            }\n        ;\n        },\n        disableTriggers: function() {\n            this._triggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger.remove();\n                    this._disabledTriggerKeys.push(p);\n                }\n            ;\n            }.bind(this));\n        },\n        enableTriggers: function() {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            this._disabledTriggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger = this._createTrigger(m[p]);\n                };\n            }.bind(this));\n            this._disabledTriggerKeys.length = 0;\n        },\n        _createTrigger: function(p) {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            var q = this.onTrigger.bind(this, p);\n            switch (p.type) {\n              case o.TRIGGER_CLICK:\n                return h.listen(p.node, \"click\", function(r) {\n                    r.prevent();\n                    q();\n                });\n              case o.TRIGGER_ONVISIBLE:\n                return new i(p.node, q, p.onVisibleStrict, p.onVisibleBuffer);\n              case o.TRIGGER_NOW:\n                return q();\n              default:\n            \n            };\n        },\n        load: function(p) {\n            if ((this._loaded || this._loading)) {\n                return\n            };\n            this._loading = true;\n            this._loaded = false;\n            g.addClass(this._pageletConfig.node, \"async_saving\");\n            if ((p && p.node)) {\n                g.addClass(p.node, \"async_saving\");\n            };\n            var q = (this._pageletConfig.options || {\n            });\n            q.displayCallback = this.onLoad.bind(this, p);\n            if ((q.crossPage === undefined)) {\n                q.crossPage = true;\n            };\n            this._pageletRequest = k.loadFromEndpoint(this._pageletConfig.controller, this._pageletConfig.node, this._pageletConfig.data, q);\n        },\n        onLoad: function(p, q) {\n            this._loaded = true;\n            this._pageletRequest = null;\n            g.removeClass(this._pageletConfig.node, \"async_saving\");\n            if ((p && p.node)) {\n                g.removeClass(p.node, \"async_saving\");\n            };\n            if (this._pageletConfig.displayCallback) {\n                this._pageletConfig.displayCallback(q);\n            }\n             else q();\n        ;\n        },\n        onTrigger: function(p) {\n            (p.callback && p.callback(p));\n            if ((!this._loaded && !this._loading)) {\n                this.load(p);\n            };\n        },\n        removeTriggers: function(p) {\n            this._triggerKeys.forEach(function(q) {\n                if ((m[q] && ((!p || (m[q].type === p))))) {\n                    n(q);\n                };\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"OGCollectionAddDialog\", [\"AsyncRequest\",\"DataStore\",\"DOMQuery\",\"Form\",\"MenuDeprecated\",\"URI\",\"collectDataAttributes\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Form\"), k = b(\"MenuDeprecated\"), l = b(\"URI\"), m = b(\"collectDataAttributes\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"tidyEvent\"), q = \"OGCollectionAddDialog\";\n    function r(s, t, u, v, w) {\n        this._dialog = s;\n        this._surface = t;\n        this._endpoint = l(v);\n        this._loadEditMenu = w.loadEditMenu;\n        this._listener = h.get(String(u), q);\n        this._audienceSelector = i.find(this._dialog.getContent(), \".audienceSelector\");\n        this._menu = i.find(this._dialog.getContent(), \".-cx-PRIVATE-fbOGCollectionAddMenu__menu\");\n        k.register(this._menu);\n        this._menuSubscriptionToken = k.subscribe(\"select\", this._onMenuClick.bind(this));\n        p([this._dialog.subscribe(\"show\", this._onDialogShow.bind(this)),this._dialog.subscribe(\"hide\", this._onDialogHide.bind(this)),]);\n        this._dialog.show();\n    };\n    n(r, {\n        INSTANCE_KEY: q\n    });\n    n(r.prototype, {\n        _onDialogShow: function() {\n            this._listener.onDialogShow(this._dialog);\n        },\n        _onDialogHide: function() {\n            this._destroy();\n        },\n        _onMenuClick: function(s, t) {\n            if ((t.menu !== this._menu)) {\n                return\n            };\n            var u = t.item;\n            this._listener.onMenuClick(u);\n            var v = i.find(u, \".-cx-PRIVATE-fbOGCollectionAddMenu__collectiontoken\"), w = v.getAttribute(\"value\");\n            this._submitRequest(w);\n        },\n        _submitRequest: function(s) {\n            this._endpoint.addQueryData({\n                collection_token: s\n            });\n            this._dialog.hide();\n            this._request = new g(this._endpoint).setData(n(j.serialize(this._audienceSelector), {\n                action: \"add\",\n                load_edit_menu: this._loadEditMenu,\n                surface: this._surface\n            }, m(this._dialog.getContext(), [\"ft\",])));\n            this._request.send();\n        },\n        _destroy: function() {\n            this._listener.onDialogHide();\n            k.unsubscribe(this._menuSubscriptionToken);\n        }\n    });\n    e.exports = r;\n});\n__d(\"OGCollectionAddMenu\", [\"CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"Event\",\"OGCollectionAddDialog\",\"Parent\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Event\"), l = b(\"OGCollectionAddDialog\"), m = b(\"Parent\"), n = b(\"TidyArbiterMixin\"), o = b(\"copyProperties\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"ge\"), s = b(\"tidyEvent\");\n    function t(u, v, w, x, y, z) {\n        this._image = v;\n        this._container = w;\n        this._placeholder = x;\n        this._surface = y;\n        this._rateControl = i.scry(this._container.parentNode, \".-cx-PRIVATE-fbOGCollectionRateDialog__wrapperlink\")[0];\n        t.inform(\"addButton\", {\n            button: this._image,\n            root: this._container\n        });\n        s(k.listen(this._container, \"click\", function(aa) {\n            var ba = m.byClass(aa.getTarget(), \"-cx-PUBLIC-fbOGCollectionAddMenu__hoverimg\");\n            if ((this.isDialogShowing() && ba)) {\n                aa.kill();\n            };\n        }.bind(this)));\n        if ((this._surface === \"friend_timeline_lhc\")) {\n            this._handleAlwaysVisibleLHC();\n        };\n        h.set(String(u), l.INSTANCE_KEY, this);\n    };\n    o(t, n, {\n        initCallout: function(u, v, w) {\n            u.show();\n            var x = r(v), y = j.find(w, \".-cx-PRIVATE-fbOGCollectionAddMenu__linkwrapper\");\n            s(k.listen(x, \"click\", function(z) {\n                k.fire(y, \"click\");\n            }));\n        }\n    });\n    o(t.prototype, n, {\n        destroy: function() {\n            i.remove(this._container);\n            this._placeholder.destroy();\n        },\n        hide: function() {\n            g.hide(this._image);\n            this._placeholder.hide();\n        },\n        getParent: function() {\n            return this._container.parentNode;\n        },\n        insertMenuIntoDialog: function(u) {\n            this._placeholder.insertIntoDialog(u);\n        },\n        onMenuClick: function(u) {\n            var v = j.find(u, \".-cx-PRIVATE-fbOGCollectionAddMenu__showrate\");\n            this._showRate = (this._rateControl && v.getAttribute(\"value\"));\n            g.hide(this._image);\n            if (this._showRate) {\n                g.show(this._rateControl);\n                k.fire(this._rateControl, \"click\");\n            }\n             else g.show(this._placeholder.getIcon());\n        ;\n        },\n        onDialogShow: function(u) {\n            var v = j.find(u.getContent(), \".audienceSelector\");\n            g.addClass(this._image, \"openToggler\");\n            t.inform(\"menuOpened\", {\n                audienceSelector: v.parentNode\n            });\n            this._dialogShowing = true;\n        },\n        onDialogHide: function() {\n            g.removeClass(this._image, \"openToggler\");\n            this._dialogShowing = false;\n        },\n        isDialogShowing: function() {\n            return this._dialogShowing;\n        },\n        _handleAlwaysVisibleLHC: function() {\n            var u = m.byClass(this._container, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__container\"), v = m.byClass(u, \"-cx-PRIVATE-ogAppReport__root\");\n            if (g.hasClass(u, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\")) {\n                s([this._alwaysVisibleToken = k.listen(v, \"mouseenter\", function() {\n                    g.removeClass(u, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\");\n                    this._alwaysVisibleToken.remove();\n                }.bind(this)),]);\n            };\n        }\n    });\n    e.exports = t;\n});\n__d(\"MedleyPageletRequestData\", [\"Arbiter\",\"TidyArbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TidyArbiter\"), i = {\n    }, j = {\n        get: function() {\n            return i;\n        },\n        set: function(k) {\n            i = k;\n            h.inform(\"Medley/requestDataSet\", null, g.BEHAVIOR_STATE);\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineDynamicSection\", [\"Class\",\"DOM\",\"TimelineSection\",\"copyProperties\",\"cx\",\"ge\",\"TimelineDynamicSectionConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"TimelineSection\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"ge\"), m = b(\"TimelineDynamicSectionConfig\");\n    function n(o, p, q) {\n        this._controller = p;\n        this._data = null;\n        this._node = null;\n        this._triggerLoader = null;\n        this.parent.construct(this, o, o, q);\n    };\n    g.extend(n, i);\n    j(n.prototype, {\n        _createNode: function() {\n            return h.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineMedley__sectionwrapper\",\n                id: this.nodeID\n            }, [m.throbber.cloneNode(true),]);\n        },\n        getNode: function() {\n            if (!this._node) {\n                this._node = (l(this.nodeID) || this._createNode());\n            };\n            return this._node;\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineAppCollection\", [\"function-extensions\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"Event\",\"MedleyPageletRequestData\",\"NumberFormatConfig\",\"PageTransitions\",\"Parent\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineDynamicSection\",\"TimelineSection\",\"TriggerablePageletLoader\",\"TimelineDynamicSectionConfig\",\"copyProperties\",\"csx\",\"cx\",\"ads-lib-formatters\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"Event\"), l = b(\"MedleyPageletRequestData\"), m = b(\"NumberFormatConfig\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"TidyArbiter\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineDynamicSection\"), t = b(\"TimelineSection\"), u = b(\"TriggerablePageletLoader\"), v = b(\"TimelineDynamicSectionConfig\"), w = b(\"copyProperties\"), x = b(\"csx\"), y = b(\"cx\"), z = b(\"ads-lib-formatters\"), aa = b(\"ge\"), ba = 500, ca = 8;\n    function da(ha) {\n        var ia = aa(ga.getIDByToken(ha));\n        if (!ia) {\n            return\n        };\n        return i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0];\n    };\n    function ea(ha, ia) {\n        ((ia && !ia.isDefaultRequested()) && ia.prevent());\n        var ja = ha._parentSection, ka = ja._parentSection;\n        t.setActiveSectionID(ja.id);\n        ja.setActiveCollection(ha);\n        if ((ja._sk === ka._sk)) {\n            if (!h.hasClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\")) {\n                h.addClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                ka.freezeChildren();\n            }\n        ;\n            (ha._isFullyLoaded && ka.addSectionTeasers());\n        }\n    ;\n        if ((!ka.isMedleyView() && (ja._sk === ka._sk))) {\n            var la = ha.href;\n            n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), la);\n        }\n    ;\n    };\n    function fa(ha, ia) {\n        ia.data.overview = (ha._parentSection._sk !== ha._parentSection._parentSection._sk);\n        ia.data.cursor = null;\n        ea(ha);\n    };\n    function ga(ha, ia, ja, ka, la, ma) {\n        this._contentLoader = null;\n        this._isFrozen = false;\n        this._isFullyLoaded = false;\n        this._cursor = 0;\n        this._tabNode = ja;\n        this._tabCount = ((ka > 0) ? ka : 0);\n        this._token = ha;\n        this._ftid = null;\n        this.auxContent = null;\n        this.curationContent = null;\n        this._order = la;\n        this.href = ma;\n        this._sortContent = null;\n        this.refreshCount();\n        this.parent.construct(this, ga.getIDByToken(ha), ia);\n        if (!ja) {\n            return\n        };\n        if (aa(this.nodeID)) {\n            k.listen(ja, \"click\", ea.curry(this));\n        }\n         else this.createTriggerLoader.bind(this).defer();\n    ;\n    };\n    g.extend(ga, s);\n    w(ga, r, {\n        NEW_ITEM: \"TimelineAppCollection/newItem\",\n        ADDING_PLACEHOLDER: \"TimelineAppCollection/addingPlaceholder\",\n        addPlaceholderToCollection: function(ha, ia, ja) {\n            ja = ((typeof ja !== \"undefined\") ? ja : {\n            });\n            if (!ja.suppressCount) {\n                this.incrementCount(ga.getIDByToken(ha));\n            };\n            t.callWithSection(ga.getIDByToken(ha), function(ka) {\n                var la = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemtitle\")[0].cloneNode(true), ma = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemimage .img\")[0], na = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\")[0], oa = (na && na.getAttribute(\"data-obj\"));\n                if ((!la || !oa)) {\n                    return\n                };\n                ka.inform(ga.ADDING_PLACEHOLDER);\n                var pa = da(ha);\n                if (!pa) {\n                    return\n                };\n                var qa = i.scry(pa, ((\"[data-obj=\\\"\" + oa) + \"\\\"]\"))[0], ra = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__placeholderimage\"\n                });\n                if (ma) {\n                    p.set(ra, \"background-image\", ((\"url(\" + ma.src) + \")\"));\n                };\n                var sa = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__itemimage\"\n                }, [ra,]), ta = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__content\"\n                }, [la,]), ua = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\"\n                }, [sa,ta,]), va = i.create(\"li\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__item\",\n                    id: (\"collectionItemPlaceholder\" + oa)\n                }, [ua,]);\n                if ((qa && ja.replaceExistingElement)) {\n                    i.replace(qa.parentNode, va);\n                }\n                 else {\n                    if (qa) {\n                        i.remove(qa.parentNode);\n                    }\n                     else if ((ka.isOverview() && (pa.children.length >= ca))) {\n                        h.addClass(pa.children[(ca - 1)], \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n                    }\n                ;\n                    i.prependContent(pa, va);\n                }\n            ;\n            });\n        },\n        replaceItem: function(ha, ia, ja) {\n            var ka = o.byClass(ha, \"-cx-PUBLIC-fbTimelineCollectionGrid__root\"), la = i.scry(ka, ((\"div[data-obj=\\\"\" + ia) + \"\\\"]\"))[0];\n            if (la) {\n                ga.inform(ga.NEW_ITEM, {\n                    grid: ka,\n                    newItem: ja\n                });\n                i.replace(la.parentNode, ja);\n            }\n        ;\n        },\n        addItemToCollection: function(ha, ia, ja) {\n            var ka = aa(ja);\n            if (!ka) {\n                return\n            };\n            var la = i.scry(ka, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0], ma = la.parentNode.nextSibling;\n            if ((ma && h.hasClass(ma, \"-cx-PRIVATE-fbTimelineMedleyPager__root\"))) {\n                i.remove(la.lastChild);\n            };\n            this.inform(ga.NEW_ITEM, {\n                grid: la,\n                newItem: ha\n            });\n            var na = aa((\"collectionItemPlaceholder\" + ia));\n            if (na) {\n                i.replace(na, ha);\n                return;\n            }\n        ;\n            i.prependContent(la, ha);\n        },\n        createFromArray: function(ha) {\n            return ha.map(function(ia) {\n                return new ga(ia.token, ia.controller, ia.tab_node, ia.tab_count, ia.order, ia.href);\n            });\n        },\n        decrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                if ((ia._tabCount > 0)) {\n                    ia._tabCount--;\n                    ia.refreshCount();\n                    ia.flashCountIf();\n                }\n            ;\n            });\n        },\n        enableContentLoader: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.addContentLoader(ia, ja);\n            });\n        },\n        getIDByToken: function(ha) {\n            return (\"pagelet_timeline_app_collection_\" + ha);\n        },\n        incrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._tabCount++;\n                ia.refreshCount();\n                ia.flashCountIf();\n            });\n        },\n        registerAuxContent: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.registerAuxContent(ia);\n            });\n        },\n        registerAddCurationContent: function(ha, ia, ja, ka) {\n            t.callWithSection(ha, function(la) {\n                la.registerAddCurationContent(ia, ja, ka);\n            });\n        },\n        registerSortContent: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.registerSortContent(ia, ja);\n            });\n        },\n        setLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia.setIsLoaded(true);\n                ia._parentSection.inform(\"loaded\", ia);\n                ia._parentSection.unsetMinHeight();\n            });\n        },\n        setFullyLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._isFullyLoaded = true;\n                var ja = ia._parentSection;\n                ((ja._sk === ja._parentSection._sk) && ja._parentSection.addSectionTeasers());\n            });\n        },\n        setFTID: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.setFTID(ia);\n            });\n        },\n        switchToNullStateCurationContent: function(ha) {\n            t.callWithSection(ga.getIDByToken(ha), function(ia) {\n                ia.nullStateCurationContent();\n            });\n        }\n    });\n    w(ga.prototype, r, {\n        addContentLoader: function(ha, ia) {\n            this._cursor = ia;\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ja = {\n                    node: ha\n                };\n                if (h.hasClass(ha, \"-cx-PRIVATE-fbTimelineMedleyPager__root\")) {\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else if (this._isFrozen) {\n                    i.remove(ha);\n                    ja.node = v.pager.cloneNode(true);\n                    i.appendContent(this.getNode(), ja.node);\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else {\n                    ja.onVisibleBuffer = ba;\n                    ja.onVisibleStrict = true;\n                    ja.type = u.TRIGGER_ONVISIBLE;\n                }\n                \n            ;\n                if ((ja.type === u.TRIGGER_CLICK)) {\n                    ja.callback = t.setActiveSectionID.curry(this.id);\n                };\n                var ka = w({\n                    displayCallback: function(la) {\n                        i.remove(ja.node);\n                        la();\n                    },\n                    options: {\n                        append: true\n                    }\n                }, this.getDefaultPageletConfig());\n                ka.data.overview = this.isOverview();\n                this._triggerLoader = null;\n                this._contentLoader = new u(ka, [ja,]);\n            }.bind(this));\n        },\n        _createNode: function() {\n            var ha = this.parent._createNode();\n            ha.setAttribute(\"aria-role\", \"tabpanel\");\n            return ha;\n        },\n        createTriggerLoader: function() {\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ha = this.getDefaultPageletConfig(), ia = {\n                    callback: fa.curry(this, ha),\n                    node: this._tabNode,\n                    type: u.TRIGGER_CLICK\n                };\n                this._triggerLoader = new u(ha, [ia,]);\n            }.bind(this));\n        },\n        disableContentLoader: function() {\n            (this._contentLoader && this._contentLoader.disableTriggers());\n        },\n        enableContentLoader: function() {\n            var ha = (this._triggerLoader || this._contentLoader);\n            (ha && ha.enableTriggers());\n        },\n        freeze: function() {\n            this._isFrozen = true;\n            if ((!this._contentLoader || this._contentLoader._loading)) {\n                return\n            };\n            this._contentLoader.removeTriggers(u.TRIGGER_ONVISIBLE);\n            var ha = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            if (!ha.length) {\n                var ia = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\")[0];\n                (ia.length && this.addContentLoader(ia, this._cursor));\n            }\n        ;\n        },\n        getCount: function() {\n            return this._tabCount;\n        },\n        getDefaultPageletConfig: function() {\n            return {\n                controller: this._controller,\n                data: w({\n                    collection_token: this._token,\n                    cursor: this._cursor\n                }, l.get(), {\n                    ftid: this._ftid,\n                    order: this._order\n                }, {\n                    sk: this._parentSection._sk\n                }),\n                node: this.getNode()\n            };\n        },\n        getMedleySiteKey: function() {\n            return this._parentSection._parentSection._sk;\n        },\n        flashCountIf: function() {\n            if ((this._parentSection.getActiveCollection() != this)) {\n                h.addClass(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\");\n                setTimeout(h.removeClass.curry(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\"), 800);\n            }\n        ;\n        },\n        isOverview: function() {\n            return (this._parentSection._sk != this._parentSection._parentSection._sk);\n        },\n        registerAuxContent: function(ha) {\n            this.auxContent = ha;\n            if ((ha.nodeType == 11)) {\n                this.auxContent = i.create(\"span\", null, ha);\n            };\n            if ((this._parentSection._activeCollection !== this)) {\n                h.hide(this.auxContent);\n            };\n            this._parentSection.addAuxContent(this.auxContent);\n        },\n        registerAddCurationContent: function(ha, ia, ja) {\n            if (this.curationContent) {\n                return\n            };\n            this.curationContent = (((ha.nodeType == 11)) ? i.create(\"span\", null, ha) : ha);\n            this.curationContentState = ia;\n            this._parentSection.addCurationContent(this.curationContent, this, ja);\n        },\n        nullStateCurationContent: function() {\n            this._parentSection.nullStateCurationContent();\n        },\n        registerSortContent: function(ha, ia) {\n            (this._sortContent && i.remove(this._sortContent));\n            this._sortContent = ha;\n            ia.subscribeOnce(\"change\", function(ja, ka) {\n                i.setContent(i.find(ha, \".-cx-PRIVATE-fbTimelineCollectionSorting__menulabel\"), ka.label);\n                this._sort(ka.value);\n            }.bind(this));\n        },\n        refreshCount: function() {\n            if (!this._tabNode) {\n                return\n            };\n            var ha = j.find(this._tabNode, \".-cx-PRIVATE-fbTimelineAppSection__tabcount\");\n            if ((this._tabCount > 0)) {\n                i.setContent(ha, z.formatNumber(this._tabCount, 0, m.numberDelimiter, \"\"));\n            }\n             else i.setContent(ha, \"\");\n        ;\n        },\n        _resetContent: function() {\n            (this._contentLoader && this._contentLoader.destroy());\n            i.remove(this.getNode());\n            this._node = null;\n            i.appendContent(j.find(this._parentSection.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), this.getNode());\n            this.addContentLoader(j.find(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\"), 0);\n        },\n        setFTID: function(ha) {\n            this._ftid = ha;\n        },\n        _sort: function(ha) {\n            this._order = ha;\n            this._resetContent();\n            var ia = this._parentSection, ja = ia._parentSection;\n            if ((!ja.isMedleyView() && (ia._sk === ja._sk))) {\n                var ka = n.getCurrentURI();\n                ka.addQueryData({\n                    order: this._order\n                });\n                n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), ka);\n            }\n        ;\n        },\n        thaw: function() {\n            this._isFrozen = false;\n        },\n        getToken: function() {\n            return this._token;\n        }\n    });\n    e.exports = ga;\n});\n__d(\"TimelineAppSectionCuration\", [\"Animation\",\"AppSectionCurationState\",\"Arbiter\",\"AsyncSignal\",\"CSS\",\"DOM\",\"Ease\",\"Event\",\"OnVisible\",\"Parent\",\"Style\",\"TidyArbiterMixin\",\"TimelineSection\",\"copyProperties\",\"cx\",\"queryThenMutateDOM\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AppSectionCurationState\"), i = b(\"Arbiter\"), j = b(\"AsyncSignal\"), k = b(\"CSS\"), l = b(\"DOM\"), m = b(\"Ease\"), n = b(\"Event\"), o = b(\"OnVisible\"), p = b(\"Parent\"), q = b(\"Style\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineSection\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"queryThenMutateDOM\"), w = b(\"tidyEvent\"), x = 0, y = {\n    }, z = {\n    };\n    function aa(fa, ga, ha) {\n        var ia, ja, ka = (((ga != h.hide)) && ((ha != h.hide)));\n        v(function() {\n            ja = fa.offsetHeight;\n            ia = ((ga === h.hide) ? 0 : fa.firstChild.offsetHeight);\n        }, function() {\n            q.set(fa, \"height\", (ja + \"px\"));\n            q.set(fa, \"overflow\", \"hidden\");\n            (ia && k.addClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\"));\n            o.checkBuffer.defer();\n            var la = l.getID(fa);\n            (z[la] && z[la].stop());\n            z[la] = new g(fa).to(\"height\", ia).ondone(function() {\n                delete z[la];\n                if (ia) {\n                    q.set(fa, \"overflow\", \"\");\n                    q.set(fa.parentNode, \"overflow\", \"\");\n                }\n            ;\n                (!ia && k.removeClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\"));\n                i.inform(\"reflow\");\n            }).duration((Math.abs((ia - ja)) * ((ka ? 5 : 1.5)))).ease(m.sineOut).go();\n        });\n    };\n    function ba(fa, ga) {\n        if (fa) {\n            k.show(ga);\n            k.hide(fa);\n        }\n    ;\n    };\n    function ca(fa, ga) {\n        if (fa) {\n            k.show(fa);\n            k.hide(ga);\n        }\n    ;\n    };\n    function da(fa, ga) {\n        s.callWithSection(fa, function(ha) {\n            new j(\"/ajax/timeline/collections/app_recs/\", {\n                collection_token: ha.getActiveCollection().getToken(),\n                event_type: ga\n            }).send();\n        });\n    };\n    var ea = t({\n        addSection: function(fa, ga, ha) {\n            y[fa] = {\n                appClickLogged: false,\n                buttons: ga,\n                content: ha,\n                id: fa,\n                state: h.hide\n            };\n            q.set(ha, \"height\", \"0px\");\n            q.set(ha, \"overflow\", \"hidden\");\n            k.show(ha);\n            for (var ia in ga) {\n                w([n.listen(ga[ia].hide_button, \"click\", ea.informState.curry(h.hide, fa)),n.listen(ga[ia].show_button, \"click\", ea.informState.curry(ia, fa)),]);;\n            };\n            ea.register(fa, function(ja, ka, la, ma) {\n                new o(ha, aa.curry(ha, ja, ma), true, x);\n                for (var na in ga) {\n                    ca(ga[na].show_button, ga[na].hide_button);;\n                };\n                if (ga[ja]) {\n                    ba(ga[ja].show_button, ga[ja].hide_button);\n                };\n            });\n        },\n        informState: function(fa, ga) {\n            if ((y[ga] && (y[ga].state !== fa))) {\n                if (((fa === h.showApps) && !y[ga].appClickLogged)) {\n                    y[ga].appClickLogged = true;\n                    da(ga, \"add_apps_click\");\n                }\n            ;\n                var ha = y[ga].state;\n                y[ga].state = fa;\n                ea.inform(fa, {\n                    obj: y[ga],\n                    oldState: ha\n                });\n            }\n        ;\n        },\n        refreshState: function(fa, ga) {\n            ea.inform(fa, {\n                obj: y[ga],\n                oldState: fa\n            });\n        },\n        linkContent: function(fa, ga, ha) {\n            var ia = y[fa].buttons[h.showApps].show_button;\n            k.show(p.byClass(ia, \"hidden_elem\"));\n            new o(ia, function() {\n                if ((Math.floor((Math.random() * 100)) === 0)) {\n                    da(fa, \"add_apps_imp\");\n                };\n            }, true, x);\n            ea.register(fa, function(ja, ka, la, ma) {\n                if ((ja == h.showItems)) {\n                    if ((ma == h.showApps)) {\n                        q.set(y[fa].content.parentNode, \"overflow\", \"hidden\");\n                    };\n                    k.show(ga);\n                    k.hide(ha);\n                }\n                 else if ((ja == h.showApps)) {\n                    k.hide(ga);\n                    k.show(ha);\n                }\n                \n            ;\n            });\n        },\n        register: function(fa, ga) {\n            var ha = ea.subscribe([h.hide,h.showItems,h.showApps,], function(ia, ja) {\n                if ((ja.obj.id === fa)) {\n                    ga(ia, ja.obj, ha, ja.oldState);\n                };\n            });\n        },\n        getSectionState: function(fa) {\n            if (y[fa]) {\n                return y[fa].state\n            };\n        }\n    }, r);\n    e.exports = ea;\n});\n__d(\"TimelineMonitor\", [\"Arbiter\",\"Event\",\"Run\",\"Vector\",\"ViewportBounds\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"queryThenMutateDOM\"), n = {\n    }, o = {\n    }, p = 0, q = [], r = null, s = false;\n    function t() {\n        n = {\n        };\n        o = {\n        };\n        p = 0;\n        q.length = 0;\n        (r && r.remove());\n        r = null;\n        s = false;\n    };\n    function u() {\n        if (!r) {\n            r = h.listen(window, \"scroll\", z);\n        };\n        if (!s) {\n            i.onLeave(t);\n            s = true;\n        }\n    ;\n        z();\n    };\n    var v = [], w = [];\n    function x() {\n        q.forEach(function(ea) {\n            var fa = aa.getSection(ea);\n            if ((fa && (fa !== o[ea.id]))) {\n                o[ea.id] = fa;\n                v.push({\n                    section: fa\n                });\n            }\n        ;\n        });\n        var ba = (k.getTop() + j.getScrollPosition().y);\n        for (var ca in n) {\n            var da = n[ca];\n            if (((((ba >= da.boundary) && (p <= da.boundary))) || (((ba <= da.boundary) && (p >= da.boundary))))) {\n                n[ca].fromAbove = (p < ba);\n                w.push(n[ca]);\n            }\n        ;\n        };\n        p = ba;\n    };\n    function y() {\n        v.forEach(function(ba) {\n            g.inform(aa.SECTION_CHANGE, ba);\n        });\n        w.forEach(function(ba) {\n            g.inform(aa.BOUNDARY_PASSED, ba);\n        });\n        v.length = 0;\n        w.length = 0;\n    };\n    function z() {\n        m(x, y, \"TimelineMonitor/scroll\");\n    };\n    var aa = {\n        BOUNDARY_PASSED: \"TimelineMonitor/boundary\",\n        SECTION_CHANGE: \"TimelineMonitor/change\",\n        getSection: function(ba) {\n            var ca = (k.getTop() + j.getScrollPosition().y), da = ba.childSections.getHead();\n            while (da) {\n                if ((l(da.nodeID) && (ca < (j.getElementPosition(da.getNode()).y + j.getElementDimensions(da.getNode()).y)))) {\n                    return da\n                };\n                da = da.getNext();\n            };\n        },\n        monitorBoundary: function(ba, ca) {\n            ca = (ca || ba);\n            if ((!n[ca] || (n[ca].boundary !== ba))) {\n                n[ca] = {\n                    boundary: ba,\n                    id: ca\n                };\n                u();\n            }\n        ;\n        },\n        monitorSection: function(ba) {\n            o[ba.id] = null;\n            q.push(ba);\n            u();\n            return aa.getSection(ba);\n        },\n        poke: function(ba) {\n            z();\n        }\n    };\n    e.exports = aa;\n});\n__d(\"TimelineAppSection\", [\"AppSectionCurationState\",\"Arbiter\",\"Class\",\"CSS\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"JSLogger\",\"MedleyPageletRequestData\",\"PageletSet\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineAppCollection\",\"TimelineAppSectionCuration\",\"TimelineDynamicSection\",\"TimelineMonitor\",\"TimelineSection\",\"TimelineSmartInsert\",\"TriggerablePageletLoader\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"DOMScroll\"), n = b(\"JSLogger\"), o = b(\"MedleyPageletRequestData\"), p = b(\"PageletSet\"), q = b(\"Style\"), r = b(\"TidyArbiter\"), s = b(\"TidyArbiterMixin\"), t = b(\"TimelineAppCollection\"), u = b(\"TimelineAppSectionCuration\"), v = b(\"TimelineDynamicSection\"), w = b(\"TimelineMonitor\"), x = b(\"TimelineSection\"), y = b(\"TimelineSmartInsert\"), z = b(\"TriggerablePageletLoader\"), aa = b(\"ViewportBounds\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"ge\"), fa = b(\"tx\"), ga = 500, ha = 2, ia = 500, ja = 18, ka = \"-cx-PRIVATE-fbTimelineAppSection__tabscondensed\", la = \"-cx-PRIVATE-fbTimelineAppSection__activetab\", ma = k.create(\"div\", {\n        className: \"-cx-PRIVATE-fbTimelineAppSection__tabnub\"\n    });\n    function na() {\n        return k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdown\"\n        }, [k.create(\"a\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownlabel\",\n            href: \"#\"\n        }, \"More\"),k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\"\n        }),]);\n    };\n    var oa = n.create(\"collections\"), pa = {\n        notes: 295,\n        events: 345,\n        photos: 555,\n        app_quoraapp: 569,\n        friends: 603,\n        app_foodspotting: 621,\n        map: 621,\n        favorites: 645,\n        app_pinterestapp: 699,\n        app_instapp: 699,\n        books: 699,\n        movies: 699,\n        tv: 699,\n        music: 725\n    };\n    function qa(sa) {\n        return pa[sa.replace(\"pagelet_timeline_medley_\", \"\")];\n    };\n    function ra(sa, ta, ua, va) {\n        this.parent.construct(this, ra.getIDBySK(ta), sa, ua);\n        this._sk = ta;\n        this._title = va;\n    };\n    i.extend(ra, v);\n    ba(ra, {\n        createFromArray: function(sa) {\n            return sa.map(function(ta) {\n                return new ra(ta.controller, ta.sk, ta.label, ta.title);\n            });\n        },\n        getIDBySK: function(sa) {\n            return (\"pagelet_timeline_medley_\" + sa);\n        },\n        registerCollections: function(sa, ta, ua) {\n            x.callWithSection(ra.getIDBySK(sa), function(va) {\n                t.createFromArray(ta).forEach(va.appendSection.bind(va));\n                var wa = va.childSections.get(ua);\n                va.setActiveCollection(wa);\n                wa.setIsLoaded(true);\n            });\n        },\n        removeEmptyAppSection: function(sa) {\n            x.callWithSection(ra.getIDBySK(sa), function(ta) {\n                ta.remove();\n            });\n        }\n    }, s);\n    ba(ra.prototype, s, {\n        _createNode: function() {\n            var sa = this.parent._createNode();\n            sa.setAttribute(\"aria-labelledby\", (\"medley_header_\" + this._sk));\n            sa.setAttribute(\"aria-role\", \"region\");\n            k.prependContent(sa, k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__header\"\n            }, [this._title,k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__tabs\",\n                \"aria-role\": \"tablist\"\n            }),]));\n            this.resetMinHeight(sa);\n            return sa;\n        },\n        addAuxContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\")[0];\n            (ta && k.appendContent(ta, sa));\n            (this._activeCollection && this._checkTabDimensions(this._activeCollection));\n        },\n        nullStateCurationContent: function() {\n            if (!this._nullStateContent) {\n                return\n            };\n            var sa = l.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\");\n            k.replace(sa.firstChild, this._nullStateContent);\n        },\n        addCurationContent: function(sa, ta, ua) {\n            var va = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\")[0];\n            (va && k.appendContent(va, sa));\n            if (ua) {\n                this._nullStateContent = ua;\n            };\n            this._checkCurationContent(ta);\n        },\n        createTriggerLoader: function(sa) {\n            var ta = function(ua) {\n                this._parentSection._lastLoadedSection = this;\n                this.setIsLoaded(true);\n                y.enable();\n                y.run(this.getNode(), function() {\n                    ua();\n                    this.unsetMinHeight();\n                    w.poke(this._parentSection.id);\n                }.bind(this), \"viewport\");\n            }.bind(this);\n            r.subscribe(\"Medley/requestDataSet\", function() {\n                this._triggerLoader = new z({\n                    controller: this._controller,\n                    data: this.getData(),\n                    displayCallback: ta,\n                    options: {\n                        constHeight: true\n                    },\n                    node: this.getNode()\n                }, [{\n                    node: this.getNode(),\n                    onVisibleBuffer: ga,\n                    onVisibleStrict: true,\n                    type: (sa ? z.TRIGGER_NOW : z.TRIGGER_ONVISIBLE)\n                },]);\n            }.bind(this));\n        },\n        freeze: function() {\n            j.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            if ((ea(this.nodeID) && !this.isLoaded())) {\n                (this._triggerLoader && this._triggerLoader.disableTriggers());\n            };\n            this.freezeChildren();\n        },\n        getData: function() {\n            if (!this._data) {\n                this._data = ba({\n                    sk: this._sk\n                }, o.get(), {\n                    overview: (this._parentSection._sk !== this._sk)\n                });\n            };\n            return this._data;\n        },\n        getActiveCollection: function() {\n            return this._activeCollection;\n        },\n        remove: function() {\n            if (p.hasPagelet(this.id)) {\n                p.removePagelet(this.id);\n            };\n            k.remove(this.getNode());\n            this._parentSection.childSections.remove(this.id);\n        },\n        setActiveCollection: function(sa) {\n            if (((this._activeCollection === sa) || !sa._tabNode)) {\n                return\n            };\n            if (this._activeCollection) {\n                h.inform(\"TimelineSideAds/refresh\");\n                oa.log(\"change_collection\", {\n                    previous_collection: this._activeCollection.getToken(),\n                    new_collection: sa.getToken()\n                });\n                this.resetMinHeight();\n                this._activeCollection.disableContentLoader();\n                j.hide(this._activeCollection.getNode());\n                j.removeClass(this._activeCollection._tabNode, la);\n                k.scry(this._activeCollection._tabNode, \"div.-cx-PRIVATE-fbTimelineAppSection__tabnub\").forEach(k.remove);\n                k.appendContent(sa._tabNode, ma.cloneNode(true));\n                (this._activeCollection.auxContent && j.hide(this._activeCollection.auxContent));\n                (this._activeCollection.curationContent && j.hide(this._activeCollection.curationContent));\n                this._activeCollection._tabNode.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n            (sa.auxContent && j.show(sa.auxContent));\n            this._checkCurationContent(sa);\n            j.addClass(sa._tabNode, la);\n            this._checkTabDimensions(sa);\n            this._activeCollection = sa;\n            ra.inform(\"changeCollection\");\n            if (!ea(sa.nodeID)) {\n                k.appendContent(l.find(this.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), sa.getNode());\n            };\n            j.show(sa.getNode());\n            (sa.isLoaded() && this.unsetMinHeight());\n            sa._tabNode.setAttribute(\"aria-selected\", \"true\");\n            sa.enableContentLoader();\n        },\n        resetMinHeight: function(sa) {\n            (sa || (sa = this.getNode()));\n            var ta = (qa(this.id) || (sa.offsetHeight - ha));\n            ((ta > 0) && this._updateScrollAfterHeight(sa, ta));\n        },\n        scrollTo: function(sa, ta) {\n            var ua = aa.getElementPosition(this.getNode());\n            ua.y -= (sa || ja);\n            (ta && this._parentSection.toggleScrollLoad(false));\n            m.scrollTo(ua, ia, null, null, function() {\n                ua = aa.getElementPosition(this.getNode());\n                ua.y -= (sa || ja);\n                m.scrollTo(ua);\n                (ta && this._parentSection.toggleScrollLoad(true));\n            }.bind(this));\n        },\n        thaw: function() {\n            j.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            (this._triggerLoader && this._triggerLoader.enableTriggers());\n            this.thawChildren();\n        },\n        unsetMinHeight: function() {\n            this._updateScrollAfterHeight(this.getNode(), 0);\n        },\n        _updateScrollAfterHeight: function(sa, ta) {\n            q.set(sa, \"min-height\", (ta + \"px\"));\n            h.inform(\"reflow\");\n        },\n        _checkCurationContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcurationbutton\")[0];\n            if (ta) {\n                j.conditionShow(ta, sa.curationContent);\n                if (sa.curationContent) {\n                    j.show(sa.curationContent);\n                    if (sa.curationContentState) {\n                        u.informState(sa.curationContentState, this.id);\n                    };\n                }\n                 else u.informState(g.hide, this.id, g.showItems);\n            ;\n            }\n        ;\n        },\n        _getTabObj: function() {\n            if (!this._tabObj) {\n                this._tabObj = {\n                    aux: k.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\"),\n                    items: [],\n                    nav: k.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__navigation\"),\n                    tabs: k.find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tabs\"),\n                    width: 0\n                };\n                j.addClass(this._tabObj.tabs, \"-cx-PRIVATE-fbTimelineAppSection__tabsloaded\");\n            }\n        ;\n            return this._tabObj;\n        },\n        _checkTabDimensions: function(sa) {\n            var ta = this._getTabObj(), ua = (ta.nav.offsetWidth - ta.aux.offsetWidth);\n            if ((ua >= ta.width)) {\n                if ((!ta.hidden && ((ua - ta.tabs.offsetWidth) >= 0))) {\n                    return\n                };\n                j.removeClass(ta.tabs, ka);\n            }\n        ;\n            if ((ta.hidden && (sa._tabNode.parentNode === ta.overflow))) {\n                k.prependContent(ta.overflow, ta.dropdown.previousSibling);\n                k.insertBefore(ta.dropdown, sa._tabNode);\n            }\n        ;\n            if ((((ua - ta.tabs.offsetWidth) >= 0) && !ta.hidden)) {\n                return\n            };\n            var va = ta.items.length;\n            if ((va && ta.hidden)) {\n                for (var wa = 0; (wa < va); wa++) {\n                    k.appendContent(ta.tabs, ta.items[wa]);;\n                };\n                k.remove(ta.dropdown);\n            }\n        ;\n            j.conditionClass(ta.tabs, ka, ((ua - ta.tabs.offsetWidth) < 0));\n            ta.width = ua;\n            ta.hidden = 0;\n            if (((ua - ta.tabs.offsetWidth) >= 0)) {\n                return\n            };\n            if (!ta.dropdown) {\n                ta.dropdown = na();\n                ta.overflow = k.find(ta.dropdown, \".-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\");\n                ta.items = k.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tab\");\n                va = ta.items.length;\n            }\n        ;\n            k.appendContent(ta.tabs, ta.dropdown);\n            var xa = 0;\n            for (wa = (va - 1); ((wa > 0) && (xa <= 0)); wa--) {\n                if ((ta.items[wa] !== sa._tabNode)) {\n                    k.prependContent(ta.overflow, ta.items[wa]);\n                    xa = (ua - ta.tabs.offsetWidth);\n                    ta.hidden++;\n                }\n            ;\n            };\n        }\n    });\n    e.exports = ra;\n});\n__d(\"TimelineDrag\", [\"Event\",\"ArbiterMixin\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"Locale\"), j = b(\"Style\"), k = b(\"Vector\"), l = b(\"copyProperties\");\n    function m(n, o, p) {\n        p = (p || {\n        });\n        this._listenOn = p.listenOn;\n        this._offsetInput = o;\n        this._defaultOffset = p.default_offset;\n        this._killClicks = p.killClicks;\n        this._vertical = true;\n        this._RTLXSwitch = false;\n        this.setPicture(n, p);\n    };\n    l(m.prototype, h, {\n        setPicture: function(n, o) {\n            if (!n) {\n                return false\n            };\n            o = (o || {\n            });\n            this._picture = n;\n            this._defaultOffset = o.default_offset;\n            if (o.offsetInput) {\n                this._offsetInput = o.offsetInput;\n            };\n            if ((o.vertical !== undefined)) {\n                this._vertical = o.vertical;\n            };\n            if (o.height) {\n                this._containerHeight = o.height;\n            };\n            if (o.width) {\n                this._containerWidth = o.width;\n            };\n            if (this._vertical) {\n                this._offsetType = \"top\";\n                this._eventCoord = \"y\";\n            }\n             else {\n                this._RTLXSwitch = i.isRTL();\n                this._offsetType = \"left\";\n                this._eventCoord = \"x\";\n            }\n        ;\n            if (this._picture.complete) {\n                this._initialLoad();\n            }\n             else this._loadListener = g.listen(this._picture, \"load\", function() {\n                this._loadListener.remove();\n                this._initialLoad();\n            }.bind(this));\n        ;\n        },\n        destroy: function() {\n            this._stopDrag();\n            this._saveOffset();\n            (this._mousedown && this._mousedown.remove());\n            (this._onclick && this._onclick.remove());\n            (this._loadListener && this._loadListener.remove());\n        },\n        _initialLoad: function() {\n            var n = (this._listenOn ? this._listenOn : this._picture);\n            (this._mousedown && this._mousedown.remove());\n            this._mousedown = g.listen(n, \"mousedown\", this._onMouseDown.bind(this));\n            if (this._vertical) {\n                this._maxOffset = (this._containerHeight - this._picture.offsetHeight);\n            }\n             else this._maxOffset = (this._containerWidth - this._picture.offsetWidth);\n        ;\n            if ((this._defaultOffset !== undefined)) {\n                this._setOffset(this._defaultOffset);\n            };\n            (this._onclick && this._onclick.remove());\n            if (this._killClicks) {\n                this._onclick = g.listen(n, \"click\", this._onClick.bind(this));\n            };\n            this._saveOffset();\n        },\n        _onClick: function(event) {\n            event.kill();\n        },\n        _onMouseDown: function(event) {\n            var n = (parseInt(j.get(this._picture, this._offsetType), 10) || 0);\n            this._pictureStartDragOffset = (n - k.getEventPosition(event)[this._eventCoord]);\n            this._startDrag();\n            event.kill();\n        },\n        _startDrag: function() {\n            if (!this._dragStarted) {\n                this.inform(\"startdrag\", this);\n                this._dragTokens = [g.listen(document.documentElement, \"mouseup\", this._onMouseUp.bind(this)),g.listen(document.documentElement, \"mousemove\", this._onMouseMove.bind(this)),];\n                this._dragStarted = true;\n            }\n        ;\n        },\n        _saveOffset: function() {\n            var n = parseInt(j.get(this._picture, this._offsetType), 10);\n            if (this._RTLXSwitch) {\n                this._offsetInput.value = ((n + this._containerWidth) - this._picture.offsetWidth);\n            }\n             else this._offsetInput.value = n;\n        ;\n        },\n        _stopDrag: function() {\n            if (this._dragStarted) {\n                this.inform(\"stopdrag\", this);\n                this._dragStarted = false;\n                this._dragTokens.forEach(function(n) {\n                    n.remove();\n                });\n                this._saveOffset();\n            }\n        ;\n        },\n        _onMouseUp: function(event) {\n            this._stopDrag();\n            event.kill();\n        },\n        _setOffset: function(n) {\n            if (this._RTLXSwitch) {\n                n = Math.max(0, Math.min(n, -this._maxOffset));\n            }\n             else n = Math.min(0, Math.max(n, this._maxOffset));\n        ;\n            j.set(this._picture, this._offsetType, (n + \"px\"));\n        },\n        _onMouseMove: function(event) {\n            this._setOffset((this._pictureStartDragOffset + k.getEventPosition(event)[this._eventCoord]));\n            event.kill();\n        }\n    });\n    e.exports = m;\n});\n__d(\"TimelineCover\", [\"Arbiter\",\"Button\",\"CSS\",\"DOM\",\"HTML\",\"Parent\",\"DOMScroll\",\"TimelineController\",\"TimelineDrag\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Button\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"HTML\"), l = b(\"Parent\"), m = b(\"DOMScroll\"), n = b(\"TimelineController\"), o = b(\"TimelineDrag\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"ge\");\n    function v(w, x, y) {\n        this.root = r(\"fbProfileCover\");\n        if ((typeof x === \"object\")) {\n            this._coverHeight = x.cover_height;\n            this._coverWidth = x.cover_width;\n            this.previewing = x.previewing;\n            this._isLegacy = false;\n        }\n         else {\n            this._isLegacy = true;\n            this._coverHeight = x;\n            this.previewing = y;\n        }\n    ;\n        this._parentSection = l.byClass(this.root, \"fbTimelineSection\");\n        this.cover = j.find(this.root, \".cover\");\n        v.instance = this;\n        this.editing = false;\n        if (!this._parentSection) {\n            this._parentSection = l.byClass(this.root, \"fbEventHeader\");\n        };\n        if (this.previewing) {\n            this.editMode();\n            this.updateCoverImage(this.previewing);\n        }\n    ;\n    };\n    v.instance = null;\n    v.getInstance = function() {\n        return v.instance;\n    };\n    s(v.prototype, {\n        showLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.addClass(w, \"opaquedLoading\");\n            };\n        },\n        hideLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.removeClass(w, \"opaquedLoading\");\n            };\n        },\n        isCoverImageVerticalFlow: function(w) {\n            return !(w.style.height);\n        },\n        editMode: function() {\n            h.setEnabled(j.find(this.root, \"button.cancelButton\"), true);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), true);\n            this.hideLoadingIndicator();\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = j.scry(this._coverImage, \".coverWrap\")[0];\n            if (w) {\n                var x = j.find(w, \".coverPhotoImg\");\n                this._originalIsVertical = this.isCoverImageVerticalFlow(x);\n                this._originalOffset = p.get(x, (this._originalIsVertical ? \"top\" : \"left\"));\n            }\n        ;\n            i.addClass(this._parentSection, \"fbEditCover\");\n            m.scrollTo(this.root);\n            if (this.previewing) {\n                j.remove(this._coverImage);\n                i.show(this._coverImage);\n            }\n        ;\n            var y = j.scry(this._coverImage, \".coverPhotoImg\")[0];\n            if (y) {\n                this._createDragger();\n            };\n            this.editing = true;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"open\"\n            });\n        },\n        _exitEditMode: function() {\n            if (this._timelineDrag) {\n                this._timelineDrag.destroy();\n                this._timelineDrag = null;\n            }\n        ;\n            j.find(this.root, \"input.hiddenPhotoID\").value = null;\n            j.find(this.root, \"input.hiddenVideoID\").value = null;\n            h.setEnabled(j.find(this.root, \"button.cancelButton\"), false);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), false);\n            i.removeClass(this._parentSection, \"fbEditCover\");\n            this.hideLoadingIndicator();\n            this.previewing = false;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"closed\"\n            });\n        },\n        _createDragger: function(w) {\n            var x;\n            if (this._isLegacy) {\n                x = j.find(this.root, \"input.photoOffsetInput\");\n                this._originalIsVertical = true;\n            }\n             else {\n                var y = ((w === undefined) ? this._originalIsVertical : w);\n                x = (y ? j.find(this.root, \"input.photoOffsetYInput\") : j.find(this.root, \"input.photoOffsetXInput\"));\n            }\n        ;\n            this._timelineDrag = new o(j.find(this.root, \".coverImage .coverPhotoImg\"), x, {\n                height: this._coverHeight,\n                width: this._coverWidth,\n                listenOn: this.cover,\n                vertical: y,\n                killClicks: true\n            });\n        },\n        updateCoverImage: function(w, x, y) {\n            this.videoID = y;\n            if (x) {\n                this.editMode();\n            };\n            j.find(this.root, \"input.hiddenPhotoID\").value = w;\n            j.find(this.root, \"input.hiddenVideoID\").value = (y || null);\n            h.setEnabled(j.find(this.root, \"button.saveButton\"), true);\n            if (x) {\n                j.replace(j.find(this.root, \".coverImage\"), k(x));\n            };\n            var z = j.find(j.find(this.root, \".coverImage\"), \".coverPhotoImg\"), aa = this.isCoverImageVerticalFlow(z), ba;\n            if (this._isLegacy) {\n                ba = j.find(this.root, \"input.photoOffsetInput\");\n            }\n             else ba = (aa ? j.find(this.root, \"input.photoOffsetYInput\") : j.find(this.root, \"input.photoOffsetXInput\"));\n        ;\n            if (this._timelineDrag) {\n                this._timelineDrag.setPicture(z, {\n                    offsetInput: ba,\n                    vertical: aa\n                });\n            }\n             else this._createDragger(aa);\n        ;\n        },\n        cancelUpdate: function() {\n            j.remove(j.scry(this.root, \".coverImage\")[0]);\n            j.prependContent(this.cover, this._coverImage);\n            if ((this._originalOffset !== undefined)) {\n                p.set(j.find(this._coverImage, \".coverPhotoImg\"), (this._originalIsVertical ? \"top\" : \"left\"), this._originalOffset);\n            };\n            this._exitEditMode();\n        },\n        saveComplete: function() {\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = l.byClass(this.root, \"fbTimelineTopSectionBase\");\n            (w && i.removeClass(w, \"-cx-PRIVATE-fbTimelineLightHeader__nocover\"));\n            this._exitEditMode();\n        },\n        isInEditMode: function() {\n            return this.editing;\n        }\n    });\n    e.exports = v;\n});\n__d(\"TimelineCoverDisclaimer\", [\"Dialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\");\n    function h(i, j, k) {\n        if ((h.displayed === undefined)) {\n            h.displayed = true;\n        }\n         else return\n    ;\n        new g().setModal(true).setTitle(i).setBody(j).setButtonsMessage(k).setButtons(g.OK).show();\n    };\n    e.exports = h;\n});\n__d(\"legacy:TimelineCoverDisclaimer\", [\"TimelineCoverDisclaimer\",], function(a, b, c, d) {\n    a.TimelineCoverDisclaimer = b(\"TimelineCoverDisclaimer\");\n}, 3);\n__d(\"TimelineMedley\", [\"Class\",\"CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"PageTransitions\",\"TimelineAppSection\",\"TimelineDynamicSectionConfig\",\"TimelineMonitor\",\"TimelineSection\",\"URI\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMPosition\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"TimelineAppSection\"), n = b(\"TimelineDynamicSectionConfig\"), o = b(\"TimelineMonitor\"), p = b(\"TimelineSection\"), q = b(\"URI\"), r = b(\"ViewportBounds\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"ge\"), w = b(\"$\"), x = \"timeline-medley\", y = \"about\", z = 2, aa = false;\n    function ba(ea) {\n        var fa = (ea.getQueryData().sk || ea.getPath().split(\"/\")[2]);\n        return (n.skmapping[fa] || fa);\n    };\n    function ca(ea) {\n        if (ea.getQueryData().id) {\n            return ea.getQueryData.id\n        };\n        return ea.getPath().split(\"/\")[1];\n    };\n    function da(ea, fa, ga) {\n        this.parent.construct(this, x);\n        this.isOverview = (ea.length > 1);\n        n.breaker = ga.breaker;\n        m.createFromArray(ea).forEach(this.appendSection.bind(this));\n        o.monitorSection(this);\n        this._lastLoadedSection = this.childSections.get(m.getIDBySK(fa)).setIsLoaded(true);\n        p.setActiveSectionID(this._lastLoadedSection.id);\n        if ((aa && this.isMedleyView())) {\n            this.addSectionPlaceholders();\n        };\n        var ha = q.getNextURI();\n        this._vanity = ca(ha);\n        this._sk = ba(ha);\n        if (this.isOverview) {\n            l.registerHandler(this._transitionHandler.bind(this));\n        };\n    };\n    g.extend(da, p);\n    s(da, {\n        loadToSection: function(ea, fa) {\n            p.setActiveSectionID(ea);\n            p.callWithSection(x, function(ga) {\n                var ha = ga.childSections.getHead(), ia = 0;\n                while ((ha && (ha.id !== ea))) {\n                    ia++;\n                    ha = ha.getNext();\n                };\n                if (!ia) {\n                    return fa(ha)\n                };\n                ia--;\n                (ia && ga.addUpcomingSectionPlaceholders(ga.childSections.getHead(), ia));\n                ga.addSectionPlaceholder(ha, ha.getPrev(), true);\n                var ja = ha.subscribe(\"loaded\", function() {\n                    fa(ha);\n                    ja.unsubscribe();\n                });\n            });\n        },\n        scrollToSection: function(ea, fa, ga) {\n            p.callWithSection(ea, function(ha) {\n                ha.scrollTo(fa, ga);\n            });\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            p.callWithSection(x, function(fa) {\n                fa.toggleScrollLoad(ea);\n            });\n        }\n    });\n    s(da.prototype, {\n        addSectionTeasers: function() {\n            if (!this.isMedleyView()) {\n                h.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                this.thawChildren();\n                this.addSectionPlaceholders();\n                this.addSectionBreak();\n            }\n        ;\n        },\n        addUpcomingSectionPlaceholders: function(ea, fa) {\n            fa = (fa || z);\n            while (ea = ea.getNext()) {\n                if ((!this.addSectionPlaceholder(ea, ea.getPrev()) && (--fa <= 0))) {\n                    break;\n                };\n            };\n        },\n        addSectionPlaceholder: function(ea, fa, ga) {\n            if ((!ea.isLoaded() && v(ea.nodeID))) {\n                return false\n            };\n            if (!v(ea.nodeID)) {\n                i.insertAfter(fa.getNode(), ea.getNode());\n                ea.createTriggerLoader(ga);\n                return false;\n            }\n        ;\n            return true;\n        },\n        addSectionBreak: function() {\n            if (this._lastLoadedSection.getNext()) {\n                i.insertAfter(this.childSections.getHead().getNode(), n.breaker);\n            }\n             else i.remove(n.breaker);\n        ;\n        },\n        addSectionPlaceholders: function() {\n            this.addUpcomingSectionPlaceholders(this._lastLoadedSection);\n        },\n        getNode: function() {\n            return w(this.id);\n        },\n        isMedleyView: function() {\n            return (this._sk === y);\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            if (ea) {\n                this.thawChildren();\n                this.addSectionPlaceholders();\n            }\n             else this.freezeChildren();\n        ;\n        },\n        _transitionHandler: function(ea) {\n            if ((ca(ea) !== this._vanity)) {\n                return false\n            };\n            var fa = ba(ea);\n            if (!fa) {\n                return false\n            };\n            if ((fa === y)) {\n                return false;\n            }\n             else {\n                var ga = ea.getQueryData();\n                if (!ga.next_cursor) {\n                    return false\n                };\n                var ha = this.childSections.getHead();\n                while (ha) {\n                    if ((ha._sk === fa)) {\n                        if ((!ha._activeCollection && !k.scry(ha._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\")[0])) {\n                            return false\n                        };\n                        this._transitionToSection.bind(this, ha, ga).defer();\n                        return true;\n                    }\n                ;\n                    ha = ha.getNext();\n                };\n            }\n        ;\n            return false;\n        },\n        _transitionToSection: function(ea, fa) {\n            var ga = (j.getElementPosition(ea.getNode()).y - r.getTop());\n            i.scry(ea.getNode(), \".-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\").forEach(function(ja) {\n                h.removeClass(ja, \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n            });\n            this._sk = ea._sk;\n            p.setActiveSectionID(ea.id);\n            ea.thaw();\n            h.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n            this.freezeChildren();\n            var ha = k.find(ea._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            ea._activeCollection.addContentLoader(ha, fa.next_cursor);\n            ea._activeCollection._contentLoader.load({\n                node: ha\n            });\n            var ia = this.childSections.getHead();\n            while ((ia && (ia.id !== ea.id))) {\n                ia.remove();\n                ia = this.childSections.getHead();\n            };\n            p.inform(\"Medley/transitionToSection\", ea.id);\n            ea.scrollTo(((ga < 0) ? ga : 0));\n            l.transitionComplete();\n        }\n    });\n    e.exports = da;\n});\n__d(\"TimelineNavLight\", [\"CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineSection\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"Parent\"), k = b(\"TimelineSection\"), l = b(\"csx\"), m = b(\"cx\");\n    function n(o) {\n        var p = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__activeitem\")[0], q = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__item\"), r = j.byClass(o, \"-cx-PRIVATE-fbTimelineLightHeader__navwrapper\").offsetWidth, s = q[(q.length - 1)];\n        if (((s.offsetLeft + s.offsetWidth) > r)) {\n            g.addClass(o, \"-cx-PRIVATE-fbTimelineNavLight__navminimal\");\n        };\n        for (var t = (q.length - 1); (t > 1); t--) {\n            if (((q[t].offsetLeft + q[t].offsetWidth) > r)) {\n                h.remove(q[t]);\n            }\n             else break;\n        ;\n        };\n        var u = \"-cx-PUBLIC-fbTimelineLightHeader__loading\";\n        g.removeClass(j.byClass(o, u), u);\n        k.subscribe(\"Medley/transitionToSection\", function(v, w) {\n            if ((p && (w === p.getAttribute(\"data-medley-id\")))) {\n                return\n            };\n            (p && g.removeClass(p, \"-cx-PRIVATE-fbTimelineNavLight__activeitem\"));\n            for (var x = 0; (x < q.length); ++x) {\n                if ((q[x].getAttribute(\"data-medley-id\") === w)) {\n                    g.addClass(q[x], \"-cx-PRIVATE-fbTimelineNavLight__activeitem\");\n                    p = q[x];\n                    return;\n                }\n            ;\n            };\n        });\n    };\n    e.exports = n;\n});\n__d(\"TimelineOGCollectionAddSelector\", [\"AsyncRequest\",\"DOM\",\"Form\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DOM\"), i = b(\"Form\"), j = b(\"TidyArbiterMixin\"), k = b(\"copyProperties\"), l = b(\"csx\"), m = b(\"tidyEvent\");\n    function n(o, p, q, r) {\n        this._endpoint = q;\n        this._button = o;\n        this._buttonParent = o.parentNode;\n        this._audienceSelector = r;\n        var s = h.find(o, \".-cx-PUBLIC-fbTimelineAddSelector__menubutton\");\n        n.inform(\"addButton\", {\n            button: s,\n            root: this._buttonParent\n        });\n        m([p.getMenu().subscribe(\"rendered\", function(t, u) {\n            n.inform(\"menuOpened\", {\n                audienceSelector: r\n            });\n            h.appendContent(h.find(u, \".-cx-PUBLIC-abstractMenu__border\"), r);\n        }),p.subscribe(\"itemselected\", this._onChange.bind(this)),]);\n    };\n    k(n, j);\n    k(n.prototype, j, {\n        _onChange: function(o, p) {\n            var q = p.getValue(), r = (this.inform(\"addedToCollection\", q) || {\n            });\n            new g(this._endpoint).setData(k(i.serialize(this._audienceSelector), r, {\n                action: \"add\",\n                collection_token: q,\n                mechanism: \"add_selector\"\n            })).send();\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineCurationNUXController\", [\"AppSectionCurationState\",\"AsyncRequest\",\"CSS\",\"DOM\",\"Event\",\"OGCollectionAddMenu\",\"TimelineOGCollectionAddSelector\",\"URI\",\"$\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"OGCollectionAddMenu\"), m = b(\"TimelineOGCollectionAddSelector\"), n = b(\"URI\"), o = b(\"$\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\"), s = 5, t = \"pagelet_timeline_medley_movies\", u = 165, v, w, x, y, z, aa, ba = [], ca = {\n        reports: 0,\n        about: 1,\n        section: 2,\n        section_privacy: 3,\n        add_button: 4,\n        privacy: 5,\n        0: \"reports\",\n        1: \"about\",\n        2: \"section\",\n        3: \"section_privacy\",\n        4: \"add_button\",\n        5: \"privacy\"\n    };\n    function da() {\n        ba.forEach(function(na) {\n            (na.button && na.button.setAttribute(\"data-hover\", \"tooltip\"));\n            (na.listener && na.listener.remove());\n        });\n        ba.length = 0;\n    };\n    function ea(na) {\n        if (z[na]) {\n            z[na].destroy();\n            delete z[na];\n            ((na === \"add_button\") && da());\n        }\n    ;\n        ((aa[na] && aa[na].parentNode) && j.remove(aa[na]));\n    };\n    function fa(na) {\n        if (!i.hasClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\")) {\n            i.addClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\");\n            d([\"Animation\",], function(oa) {\n                new oa(na).to(\"opacity\", 0).duration(300).ease(oa.ease.end).hide().go();\n            });\n        }\n    ;\n    };\n    function ga(na) {\n        ha(na);\n        var oa = (ca[na] + 1);\n        (oa && ia(ca[oa]));\n    };\n    function ha(na) {\n        new h(\"/ajax/timeline/collections/tour/curation/\").setAllowCrossPageTransition(true).setData({\n            step: na\n        }).send();\n        ea(na);\n    };\n    function ia(na) {\n        y = na;\n        switch (na) {\n          case \"reports\":\n            d([\"TimelineController\",], function(oa) {\n                oa.runOnceWhenSectionFullyLoaded(function() {\n                    ka(j.find(o(\"timeline_tab_content\"), \".-cx-PUBLIC-timelineOneColMin__rightcapsulecontainer\"), na);\n                }, \"recent\", \"0\");\n            });\n            break;\n          case \"about\":\n            v = j.scry(o(\"fbTimelineHeadline\"), \".-cx-PRIVATE-fbTimelineNavLight__item\")[1];\n            w = r(k.listen(v, \"click\", function() {\n                v = null;\n                w.remove();\n                y = \"section\";\n            }));\n            ka(v, na);\n            break;\n          case \"section\":\n            if (v) {\n                n(v.getAttribute(\"href\")).go();\n                v = null;\n                (w && w.remove());\n            }\n             else d([\"OnVisible\",\"TimelineMedley\",], function(oa, pa) {\n                j.appendContent(j.find(o(\"pagelet_timeline_main_column\"), \".-cx-PRIVATE-fbTimelineMedley__maincolumn\"), aa.section);\n                r(k.listen(aa.section, \"click\", function() {\n                    pa.scrollToSection(t, u, 1);\n                    fa(aa.section);\n                }));\n                pa.loadToSection(t, function() {\n                    ka(o(t), na);\n                    var qa = new oa(o(t), function() {\n                        fa(aa.section);\n                        qa.remove();\n                    }, false, -u);\n                });\n            });\n        ;\n            break;\n          case \"section_privacy\":\n            d([\"TimelineAppSectionCuration\",], function(oa) {\n                oa.informState(g.showItems, t);\n                ka(j.scry(o(t), \".audienceSelector\")[0], na);\n            });\n            break;\n          case \"privacy\":\n            k.fire(x, \"click\");\n            break;\n        };\n    };\n    function ja(na, oa) {\n        if (z.add_button) {\n            var pa = j.scry(oa, \"[data-hover]\")[0];\n            ba.push({\n                button: pa,\n                listener: r(k.listen(na, \"mouseenter\", function() {\n                    x = na;\n                    ka(na, \"add_button\");\n                }))\n            });\n            (pa && pa.removeAttribute(\"data-hover\"));\n        }\n    ;\n    };\n    function ka(na, oa) {\n        if (z[oa]) {\n            z[oa].setContext(na).setOffsetX(5).show();\n            if ((oa === \"privacy\")) {\n                ea(\"add_button\");\n            };\n        }\n    ;\n    };\n    function la(na, oa, pa) {\n        var qa = pa.getAttribute(\"data-action\");\n        if (((qa === \"next\") || (qa === \"done\"))) {\n            ga(na);\n        }\n         else ha(na);\n    ;\n    };\n    var ma = {\n        init: function(na) {\n            var oa = na.next_step, pa = ca[oa];\n            z = na.dialogs;\n            aa = (na.links ? na.links : []);\n            da();\n            if (((oa === \"section\") && (oa !== y))) {\n                ea(\"section\");\n                ea(\"section_privacy\");\n                pa += 2;\n                oa = ca[pa];\n            }\n        ;\n            for (var qa in z) {\n                r(z[qa].subscribe(\"button\", la.curry(qa)));;\n            };\n            if (z.add_button) {\n                var ra = (na.isViewingSelf ? m : l);\n                r([ra.subscribe(\"menuOpened\", function(sa, ta) {\n                    ka.curry(j.find(ta.audienceSelector, \".audienceSelector\"), \"privacy\").defer(s);\n                }),ra.subscribe(\"addButton\", function(sa, ta) {\n                    ja.curry(ta.button, ta.root).defer(s);\n                }),]);\n            }\n        ;\n            if ((na.isViewingSelf && (pa < ca.add_button))) {\n                ia(oa);\n            };\n        }\n    };\n    e.exports = ma;\n});\n__d(\"legacy:TimelineCover\", [\"TimelineCover\",], function(a, b, c, d) {\n    a.TimelineCover = b(\"TimelineCover\");\n}, 3);\n__d(\"SubMenu\", [\"Event\",\"Arbiter\",\"copyProperties\",\"CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"CSS\");\n    function k() {\n    \n    };\n    i(k.prototype, {\n        _subMenu: null,\n        _mainMenu: null,\n        _forward: null,\n        _backward: null,\n        init: function(l, m, n, o) {\n            this._subMenu = l;\n            this._mainMenu = m;\n            this._forward = n;\n            this._backward = o;\n            h.subscribe(\"SubMenu/Reset\", this._goToMainMenu.bind(this));\n            g.listen(n, \"click\", this._goToSubMenu.bind(this));\n            g.listen(o, \"click\", this._goToMainMenu.bind(this));\n        },\n        initAsyncChildMenu: function(l) {\n            g.listen(this._forward, \"click\", function() {\n                this._goToSubMenu();\n                l.load();\n            }.bind(this));\n        },\n        _goToMainMenu: function() {\n            j.hide(this._subMenu);\n            j.show(this._mainMenu);\n        },\n        _goToSubMenu: function() {\n            j.hide(this._mainMenu);\n            j.show(this._subMenu);\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:ui-submenu\", [\"SubMenu\",], function(a, b, c, d) {\n    a.SubMenu = b(\"SubMenu\");\n}, 3);\n__d(\"AsyncMenu\", [\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k, l) {\n        this._uri = k;\n        this._elem = l;\n    };\n    h(j.prototype, {\n        _uri: null,\n        _elem: null,\n        load: function() {\n            this.load = i;\n            g.bootstrap(this._uri, this._elem);\n        }\n    });\n    e.exports = j;\n});");
// 13614
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sb3e3abb1c5dce931ace6dab818dc7b49b630189b");
// 13615
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"4kgAq\",]);\n}\n;\n;\n__d(\"AdsCurrency\", [\"AdsCurrencyConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrencyConfig\").currencies;\n    function h(m) {\n        if (g[m]) {\n            return g[m][0];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function i(m) {\n        if (g[m]) {\n            return g[m][1];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function j(m) {\n        if (g[m]) {\n            return ((1 * g[m][2]));\n        }\n    ;\n    ;\n        return 1;\n    };\n;\n    var k = [];\n    {\n        var fin259keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin259i = (0);\n        var l;\n        for (; (fin259i < fin259keys.length); (fin259i++)) {\n            ((l) = (fin259keys[fin259i]));\n            {\n                if (g.hasOwnProperty(l)) {\n                    k.push(l);\n                }\n            ;\n            ;\n            };\n        };\n    };\n;\n    f.getFormat = h;\n    f.getSymbol = i;\n    f.getOffset = j;\n    f.currencyMapKeys = k;\n});\n__d(\"ads-lib-formatters\", [\"AdsCurrency\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdsCurrency\"), h = \"USD\";\n    function i(t, u, v) {\n        t = ((t || \"\"));\n        v = ((v || \"\"));\n        u = ((((typeof u === \"undefined\")) ? t.length : u));\n        return ((((t.length > u)) ? ((t.substr(0, ((u - v.length))) + v)) : t));\n    };\n;\n    function j(t, u) {\n        if (((((u === undefined)) || ((u === null))))) {\n            u = \"\";\n        }\n    ;\n    ;\n        return function(v) {\n            return ((!v ? u : i(v, t, \"...\")));\n        };\n    };\n;\n    function k(t, u, v, w) {\n        if (((t === \"N/A\"))) {\n            return t;\n        }\n    ;\n    ;\n        t = ((t || 0));\n        v = ((v || \"\"));\n        w = ((w || \".\"));\n        t = ((((u !== null)) ? l(t, u) : ((t + \"\"))));\n        var x = t.split(\".\"), y = x[0], z = x[1], aa = \"\", ba = /(\\d)(\\d\\d\\d)($|\\D)/, ca = ((((\"$1\" + v)) + \"$2$3\"));\n        while ((((aa = y.replace(ba, ca)) != y))) {\n            y = aa;\n        ;\n        };\n    ;\n        var da = y;\n        if (z) {\n            da += ((w + z));\n        }\n    ;\n    ;\n        return da;\n    };\n;\n    function l(t, u) {\n        var v = Math.pow(10, u);\n        t = ((((Math.round(((t * v))) / v)) + \"\"));\n        if (!u) {\n            return t;\n        }\n    ;\n    ;\n        var w = t.indexOf(\".\"), x = 0;\n        if (((w == -1))) {\n            t += \".\";\n            x = u;\n        }\n         else x = ((u - ((((t.length - w)) - 1))));\n    ;\n    ;\n        for (var y = 0, z = x; ((y < z)); y++) {\n            t += \"0\";\n        ;\n        };\n    ;\n        return t;\n    };\n;\n    function m(t) {\n        return function(u) {\n            return k(u, ((t || 0)), \",\", \".\");\n        };\n    };\n;\n    function n(t, u) {\n        var v = ((((u === false)) ? 1 : 100));\n        return function(w) {\n            return ((k(((w * v)), ((t || 0)), \",\", \".\") + \"%\"));\n        };\n    };\n;\n    var o = {\n    };\n    function p(t, u, v) {\n        if (((t === undefined))) {\n            t = 2;\n        }\n    ;\n    ;\n        if (((v === undefined))) {\n            v = false;\n        }\n    ;\n    ;\n        u = ((u || h));\n        var w = ((((((((u + \"-\")) + t)) + \"-\")) + v));\n        if (!o[w]) {\n            var x = ((g.getFormat(u) || g.getFormat(h))), y = ((g.getSymbol(u) || g.getSymbol(h))), z = ((g.getOffset(u) || g.getOffset(h)));\n            x = x.replace(\"{symbol}\", y);\n            o[w] = function(aa) {\n                if (v) {\n                    aa = ((aa / z));\n                }\n            ;\n            ;\n                if (!((aa + \"\")).match(/^\\-?[\\d\\.,]*$/)) {\n                    return \"N/A\";\n                }\n            ;\n            ;\n                var ba = k(aa, t, \",\", \".\");\n                return x.replace(\"{amount}\", ba);\n            };\n        }\n    ;\n    ;\n        return o[w];\n    };\n;\n    function q(t) {\n        t = ((t + \"\")).trim().replace(/^[^\\d]*\\-/, \"\\u0002\");\n        if (!(((/^\\u0002?(\\d+,\\d*){2,}$/.test(t)) || (/^\\u0002?(\\d+\\.\\d*){2,}$/.test(t))))) {\n            t = t.replace(/[\\.,](\\d*\\D*)$/, \"\\u0001$1\");\n        }\n    ;\n    ;\n        t = t.replace(/[^0-9\\u0001\\u0002]/g, \"\").replace(\"\\u0001\", \".\").replace(\"\\u0002\", \"-\");\n        return ((+t || 0));\n    };\n;\n    function r() {\n        return function(t) {\n            return ((k(t, 0, \",\", \".\") + \"%\"));\n        };\n    };\n;\n    function s(t) {\n        var u = t.currency(), v = ((((t.offset() == 100)) ? 2 : 0));\n        return p(v, u);\n    };\n;\n    f.createTextTruncator = j;\n    f.chopString = i;\n    f.parseNumber = q;\n    f.formatNumber = k;\n    f.createNumberFormatter = m;\n    f.createPercentFormatter = n;\n    f.createMoneyFormatter = p;\n    f.createMoneyFormatterForAccount = s;\n    f.createInflationFormatter = r;\n});\n__d(\"PopoverMenuShowOnHover\", [\"JSBNG__Event\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._popoverMenu = j;\n        this._listeners = [];\n    };\n;\n    h(i.prototype, {\n        enable: function() {\n            this._attachMouseListeners(this._popoverMenu.getTriggerElem());\n            this._setMenuSubscription = this._popoverMenu.subscribe(\"setMenu\", this._onSetMenu.bind(this));\n        },\n        disable: function() {\n            while (this._listeners.length) {\n                this._listeners.pop().remove();\n            ;\n            };\n        ;\n            if (this._setMenuSubscription) {\n                this._setMenuSubscription.unsubscribe();\n                this._setMenuSubscription = null;\n            }\n        ;\n        ;\n        },\n        _onSetMenu: function() {\n            this._attachMouseListeners(this._popoverMenu.getMenu().getRoot());\n        },\n        _attachMouseListeners: function(j) {\n            var k = this._popoverMenu.getPopover();\n            this._listeners.push(g.listen(j, \"mouseenter\", k.showLayer.bind(k)), g.listen(j, \"mouseleave\", k.hideLayer.bind(k)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"TriggerablePageletLoader\", [\"function-extensions\",\"JSBNG__CSS\",\"JSBNG__Event\",\"OnVisible\",\"Run\",\"UIPagelet\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSBNG__CSS\"), h = b(\"JSBNG__Event\"), i = b(\"OnVisible\"), j = b(\"Run\"), k = b(\"UIPagelet\"), l = b(\"copyProperties\"), m = [];\n    function n(p) {\n        if (!m[p]) {\n            return;\n        }\n    ;\n    ;\n        ((m[p].__trigger && m[p].__trigger.remove()));\n        delete m[p];\n    };\n;\n    function o(p, q) {\n        this._disabledTriggerKeys = [];\n        this._pageletConfig = p;\n        this._loaded = false;\n        this._loading = false;\n        this._triggerKeys = [];\n        if (q) {\n            q.forEach(this.addTrigger.bind(this));\n        }\n    ;\n    ;\n        j.onLeave(this.destroy.bind(this));\n    };\n;\n    l(o, {\n        removeTrigger: function(p) {\n            {\n                var fin260keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin260i = (0);\n                var q;\n                for (; (fin260i < fin260keys.length); (fin260i++)) {\n                    ((q) = (fin260keys[fin260i]));\n                    {\n                        if (((m[q] && ((m[q].node === p))))) {\n                            n(q);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        TRIGGER_CLICK: \"click\",\n        TRIGGER_ONVISIBLE: \"onvisible\",\n        TRIGGER_NOW: \"now\"\n    });\n    l(o.prototype, {\n        addTrigger: function(p) {\n            p.__trigger = this._createTrigger(p);\n            m.push(p);\n            this._triggerKeys.push(((m.length - 1)));\n        },\n        destroy: function() {\n            this.removeTriggers();\n            if (this._pageletRequest) {\n                this._pageletRequest.cancel();\n                this._pageletRequest = null;\n                this._loading = false;\n                this._loaded = false;\n            }\n        ;\n        ;\n        },\n        disableTriggers: function() {\n            this._triggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger.remove();\n                    this._disabledTriggerKeys.push(p);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        enableTriggers: function() {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._disabledTriggerKeys.forEach(function(p) {\n                if (m[p]) {\n                    m[p].__trigger = this._createTrigger(m[p]);\n                }\n            ;\n            ;\n            }.bind(this));\n            this._disabledTriggerKeys.length = 0;\n        },\n        _createTrigger: function(p) {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            var q = this.onTrigger.bind(this, p);\n            switch (p.type) {\n              case o.TRIGGER_CLICK:\n                return h.listen(p.node, \"click\", function(r) {\n                    r.prevent();\n                    q();\n                });\n              case o.TRIGGER_ONVISIBLE:\n                return new i(p.node, q, p.onVisibleStrict, p.onVisibleBuffer);\n              case o.TRIGGER_NOW:\n                return q();\n              default:\n            \n            };\n        ;\n        },\n        load: function(p) {\n            if (((this._loaded || this._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._loading = true;\n            this._loaded = false;\n            g.addClass(this._pageletConfig.node, \"async_saving\");\n            if (((p && p.node))) {\n                g.addClass(p.node, \"async_saving\");\n            }\n        ;\n        ;\n            var q = ((this._pageletConfig.options || {\n            }));\n            q.displayCallback = this.onLoad.bind(this, p);\n            if (((q.crossPage === undefined))) {\n                q.crossPage = true;\n            }\n        ;\n        ;\n            this._pageletRequest = k.loadFromEndpoint(this._pageletConfig.controller, this._pageletConfig.node, this._pageletConfig.data, q);\n        },\n        onLoad: function(p, q) {\n            this._loaded = true;\n            this._pageletRequest = null;\n            g.removeClass(this._pageletConfig.node, \"async_saving\");\n            if (((p && p.node))) {\n                g.removeClass(p.node, \"async_saving\");\n            }\n        ;\n        ;\n            if (this._pageletConfig.displayCallback) {\n                this._pageletConfig.displayCallback(q);\n            }\n             else q();\n        ;\n        ;\n        },\n        onTrigger: function(p) {\n            ((p.callback && p.callback(p)));\n            if (((!this._loaded && !this._loading))) {\n                this.load(p);\n            }\n        ;\n        ;\n        },\n        removeTriggers: function(p) {\n            this._triggerKeys.forEach(function(q) {\n                if (((m[q] && ((!p || ((m[q].type === p))))))) {\n                    n(q);\n                }\n            ;\n            ;\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"OGCollectionAddDialog\", [\"AsyncRequest\",\"DataStore\",\"DOMQuery\",\"Form\",\"MenuDeprecated\",\"URI\",\"collectDataAttributes\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"DOMQuery\"), j = b(\"Form\"), k = b(\"MenuDeprecated\"), l = b(\"URI\"), m = b(\"collectDataAttributes\"), n = b(\"copyProperties\"), o = b(\"csx\"), p = b(\"tidyEvent\"), q = \"OGCollectionAddDialog\";\n    function r(s, t, u, v, w) {\n        this._dialog = s;\n        this._surface = t;\n        this._endpoint = l(v);\n        this._loadEditMenu = w.loadEditMenu;\n        this._listener = h.get(String(u), q);\n        this._audienceSelector = i.JSBNG__find(this._dialog.getContent(), \".audienceSelector\");\n        this._menu = i.JSBNG__find(this._dialog.getContent(), \".-cx-PRIVATE-fbOGCollectionAddMenu__menu\");\n        k.register(this._menu);\n        this._menuSubscriptionToken = k.subscribe(\"select\", this._onMenuClick.bind(this));\n        p([this._dialog.subscribe(\"show\", this._onDialogShow.bind(this)),this._dialog.subscribe(\"hide\", this._onDialogHide.bind(this)),]);\n        this._dialog.show();\n    };\n;\n    n(r, {\n        INSTANCE_KEY: q\n    });\n    n(r.prototype, {\n        _onDialogShow: function() {\n            this._listener.onDialogShow(this._dialog);\n        },\n        _onDialogHide: function() {\n            this._destroy();\n        },\n        _onMenuClick: function(s, t) {\n            if (((t.menu !== this._menu))) {\n                return;\n            }\n        ;\n        ;\n            var u = t.JSBNG__item;\n            this._listener.onMenuClick(u);\n            var v = i.JSBNG__find(u, \".-cx-PRIVATE-fbOGCollectionAddMenu__collectiontoken\"), w = v.getAttribute(\"value\");\n            this._submitRequest(w);\n        },\n        _submitRequest: function(s) {\n            this._endpoint.addQueryData({\n                collection_token: s\n            });\n            this._dialog.hide();\n            this._request = new g(this._endpoint).setData(n(j.serialize(this._audienceSelector), {\n                action: \"add\",\n                load_edit_menu: this._loadEditMenu,\n                surface: this._surface\n            }, m(this._dialog.getContext(), [\"ft\",])));\n            this._request.send();\n        },\n        _destroy: function() {\n            this._listener.onDialogHide();\n            k.unsubscribe(this._menuSubscriptionToken);\n        }\n    });\n    e.exports = r;\n});\n__d(\"OGCollectionAddMenu\", [\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"DOMQuery\",\"JSBNG__Event\",\"OGCollectionAddDialog\",\"Parent\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"JSBNG__Event\"), l = b(\"OGCollectionAddDialog\"), m = b(\"Parent\"), n = b(\"TidyArbiterMixin\"), o = b(\"copyProperties\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"ge\"), s = b(\"tidyEvent\");\n    function t(u, v, w, x, y, z) {\n        this._image = v;\n        this._container = w;\n        this._placeholder = x;\n        this._surface = y;\n        this._rateControl = i.scry(this._container.parentNode, \".-cx-PRIVATE-fbOGCollectionRateDialog__wrapperlink\")[0];\n        t.inform(\"addButton\", {\n            button: this._image,\n            root: this._container\n        });\n        s(k.listen(this._container, \"click\", function(aa) {\n            var ba = m.byClass(aa.getTarget(), \"-cx-PUBLIC-fbOGCollectionAddMenu__hoverimg\");\n            if (((this.isDialogShowing() && ba))) {\n                aa.kill();\n            }\n        ;\n        ;\n        }.bind(this)));\n        if (((this._surface === \"friend_timeline_lhc\"))) {\n            this._handleAlwaysVisibleLHC();\n        }\n    ;\n    ;\n        h.set(String(u), l.INSTANCE_KEY, this);\n    };\n;\n    o(t, n, {\n        initCallout: function(u, v, w) {\n            u.show();\n            var x = r(v), y = j.JSBNG__find(w, \".-cx-PRIVATE-fbOGCollectionAddMenu__linkwrapper\");\n            s(k.listen(x, \"click\", function(z) {\n                k.fire(y, \"click\");\n            }));\n        }\n    });\n    o(t.prototype, n, {\n        destroy: function() {\n            i.remove(this._container);\n            this._placeholder.destroy();\n        },\n        hide: function() {\n            g.hide(this._image);\n            this._placeholder.hide();\n        },\n        getParent: function() {\n            return this._container.parentNode;\n        },\n        insertMenuIntoDialog: function(u) {\n            this._placeholder.insertIntoDialog(u);\n        },\n        onMenuClick: function(u) {\n            var v = j.JSBNG__find(u, \".-cx-PRIVATE-fbOGCollectionAddMenu__showrate\");\n            this._showRate = ((this._rateControl && v.getAttribute(\"value\")));\n            g.hide(this._image);\n            if (this._showRate) {\n                g.show(this._rateControl);\n                k.fire(this._rateControl, \"click\");\n            }\n             else g.show(this._placeholder.getIcon());\n        ;\n        ;\n        },\n        onDialogShow: function(u) {\n            var v = j.JSBNG__find(u.getContent(), \".audienceSelector\");\n            g.addClass(this._image, \"openToggler\");\n            t.inform(\"menuOpened\", {\n                audienceSelector: v.parentNode\n            });\n            this._dialogShowing = true;\n        },\n        onDialogHide: function() {\n            g.removeClass(this._image, \"openToggler\");\n            this._dialogShowing = false;\n        },\n        isDialogShowing: function() {\n            return this._dialogShowing;\n        },\n        _handleAlwaysVisibleLHC: function() {\n            var u = m.byClass(this._container, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__container\"), v = m.byClass(u, \"-cx-PRIVATE-ogAppReport__root\");\n            if (g.hasClass(u, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\")) {\n                s([this._alwaysVisibleToken = k.listen(v, \"mouseenter\", function() {\n                    g.removeClass(u, \"-cx-PUBLIC-fbOGCollectionItemAddCuration__alwaysvisible\");\n                    this._alwaysVisibleToken.remove();\n                }.bind(this)),]);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"MedleyPageletRequestData\", [\"Arbiter\",\"TidyArbiter\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"TidyArbiter\"), i = {\n    }, j = {\n        get: function() {\n            return i;\n        },\n        set: function(k) {\n            i = k;\n            h.inform(\"Medley/requestDataSet\", null, g.BEHAVIOR_STATE);\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineDynamicSection\", [\"Class\",\"DOM\",\"TimelineSection\",\"copyProperties\",\"cx\",\"ge\",\"TimelineDynamicSectionConfig\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DOM\"), i = b(\"TimelineSection\"), j = b(\"copyProperties\"), k = b(\"cx\"), l = b(\"ge\"), m = b(\"TimelineDynamicSectionConfig\");\n    function n(o, p, q) {\n        this._controller = p;\n        this._data = null;\n        this._node = null;\n        this._triggerLoader = null;\n        this.parent.construct(this, o, o, q);\n    };\n;\n    g.extend(n, i);\n    j(n.prototype, {\n        _createNode: function() {\n            return h.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineMedley__sectionwrapper\",\n                id: this.nodeID\n            }, [m.throbber.cloneNode(true),]);\n        },\n        getNode: function() {\n            if (!this._node) {\n                this._node = ((l(this.nodeID) || this._createNode()));\n            }\n        ;\n        ;\n            return this._node;\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineAppCollection\", [\"function-extensions\",\"Class\",\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"JSBNG__Event\",\"MedleyPageletRequestData\",\"NumberFormatConfig\",\"PageTransitions\",\"Parent\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineDynamicSection\",\"TimelineSection\",\"TriggerablePageletLoader\",\"TimelineDynamicSectionConfig\",\"copyProperties\",\"csx\",\"cx\",\"ads-lib-formatters\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"DOMQuery\"), k = b(\"JSBNG__Event\"), l = b(\"MedleyPageletRequestData\"), m = b(\"NumberFormatConfig\"), n = b(\"PageTransitions\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"TidyArbiter\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineDynamicSection\"), t = b(\"TimelineSection\"), u = b(\"TriggerablePageletLoader\"), v = b(\"TimelineDynamicSectionConfig\"), w = b(\"copyProperties\"), x = b(\"csx\"), y = b(\"cx\"), z = b(\"ads-lib-formatters\"), aa = b(\"ge\"), ba = 500, ca = 8;\n    function da(ha) {\n        var ia = aa(ga.getIDByToken(ha));\n        if (!ia) {\n            return;\n        }\n    ;\n    ;\n        return i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0];\n    };\n;\n    function ea(ha, ia) {\n        ((((ia && !ia.isDefaultRequested())) && ia.prevent()));\n        var ja = ha._parentSection, ka = ja._parentSection;\n        t.setActiveSectionID(ja.id);\n        ja.setActiveCollection(ha);\n        if (((ja._sk === ka._sk))) {\n            if (!h.hasClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\")) {\n                h.addClass(ka.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                ka.freezeChildren();\n            }\n        ;\n        ;\n            ((ha._isFullyLoaded && ka.addSectionTeasers()));\n        }\n    ;\n    ;\n        if (((!ka.isMedleyView() && ((ja._sk === ka._sk))))) {\n            var la = ha.href;\n            n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), la);\n        }\n    ;\n    ;\n    };\n;\n    function fa(ha, ia) {\n        ia.data.overview = ((ha._parentSection._sk !== ha._parentSection._parentSection._sk));\n        ia.data.cursor = null;\n        ea(ha);\n    };\n;\n    function ga(ha, ia, ja, ka, la, ma) {\n        this._contentLoader = null;\n        this._isFrozen = false;\n        this._isFullyLoaded = false;\n        this._cursor = 0;\n        this._tabNode = ja;\n        this._tabCount = ((((ka > 0)) ? ka : 0));\n        this._token = ha;\n        this._ftid = null;\n        this.auxContent = null;\n        this.curationContent = null;\n        this._order = la;\n        this.href = ma;\n        this._sortContent = null;\n        this.refreshCount();\n        this.parent.construct(this, ga.getIDByToken(ha), ia);\n        if (!ja) {\n            return;\n        }\n    ;\n    ;\n        if (aa(this.nodeID)) {\n            k.listen(ja, \"click\", ea.curry(this));\n        }\n         else this.createTriggerLoader.bind(this).defer();\n    ;\n    ;\n    };\n;\n    g.extend(ga, s);\n    w(ga, r, {\n        NEW_ITEM: \"TimelineAppCollection/newItem\",\n        ADDING_PLACEHOLDER: \"TimelineAppCollection/addingPlaceholder\",\n        addPlaceholderToCollection: function(ha, ia, ja) {\n            ja = ((((typeof ja !== \"undefined\")) ? ja : {\n            }));\n            if (!ja.suppressCount) {\n                this.incrementCount(ga.getIDByToken(ha));\n            }\n        ;\n        ;\n            t.callWithSection(ga.getIDByToken(ha), function(ka) {\n                var la = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemtitle\")[0].cloneNode(true), ma = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__itemimage .img\")[0], na = i.scry(ia, \".-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\")[0], oa = ((na && na.getAttribute(\"data-obj\")));\n                if (((!la || !oa))) {\n                    return;\n                }\n            ;\n            ;\n                ka.inform(ga.ADDING_PLACEHOLDER);\n                var pa = da(ha);\n                if (!pa) {\n                    return;\n                }\n            ;\n            ;\n                var qa = i.scry(pa, ((((\"[data-obj=\\\"\" + oa)) + \"\\\"]\")))[0], ra = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__placeholderimage\"\n                });\n                if (ma) {\n                    p.set(ra, \"background-image\", ((((\"url(\" + ma.src)) + \")\")));\n                }\n            ;\n            ;\n                var sa = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__itemimage\"\n                }, [ra,]), ta = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__content\"\n                }, [la,]), ua = i.create(\"div\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__containerwrap\"\n                }, [sa,ta,]), va = i.create(\"li\", {\n                    className: \"-cx-PUBLIC-fbTimelineCollectionGrid__item\",\n                    id: ((\"collectionItemPlaceholder\" + oa))\n                }, [ua,]);\n                if (((qa && ja.replaceExistingElement))) {\n                    i.replace(qa.parentNode, va);\n                }\n                 else {\n                    if (qa) {\n                        i.remove(qa.parentNode);\n                    }\n                     else if (((ka.isOverview() && ((pa.children.length >= ca))))) {\n                        h.addClass(pa.children[((ca - 1))], \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n                    }\n                    \n                ;\n                ;\n                    i.prependContent(pa, va);\n                }\n            ;\n            ;\n            });\n        },\n        replaceItem: function(ha, ia, ja) {\n            var ka = o.byClass(ha, \"-cx-PUBLIC-fbTimelineCollectionGrid__root\"), la = i.scry(ka, ((((\"div[data-obj=\\\"\" + ia)) + \"\\\"]\")))[0];\n            if (la) {\n                ga.inform(ga.NEW_ITEM, {\n                    grid: ka,\n                    newItem: ja\n                });\n                i.replace(la.parentNode, ja);\n            }\n        ;\n        ;\n        },\n        addItemToCollection: function(ha, ia, ja) {\n            var ka = aa(ja);\n            if (!ka) {\n                return;\n            }\n        ;\n        ;\n            var la = i.scry(ka, \".-cx-PUBLIC-fbTimelineCollectionGrid__root\")[0], ma = la.parentNode.nextSibling;\n            if (((ma && h.hasClass(ma, \"-cx-PRIVATE-fbTimelineMedleyPager__root\")))) {\n                i.remove(la.lastChild);\n            }\n        ;\n        ;\n            this.inform(ga.NEW_ITEM, {\n                grid: la,\n                newItem: ha\n            });\n            var na = aa(((\"collectionItemPlaceholder\" + ia)));\n            if (na) {\n                i.replace(na, ha);\n                return;\n            }\n        ;\n        ;\n            i.prependContent(la, ha);\n        },\n        createFromArray: function(ha) {\n            return ha.map(function(ia) {\n                return new ga(ia.token, ia.controller, ia.tab_node, ia.tab_count, ia.order, ia.href);\n            });\n        },\n        decrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                if (((ia._tabCount > 0))) {\n                    ia._tabCount--;\n                    ia.refreshCount();\n                    ia.flashCountIf();\n                }\n            ;\n            ;\n            });\n        },\n        enableContentLoader: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.addContentLoader(ia, ja);\n            });\n        },\n        getIDByToken: function(ha) {\n            return ((\"pagelet_timeline_app_collection_\" + ha));\n        },\n        incrementCount: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._tabCount++;\n                ia.refreshCount();\n                ia.flashCountIf();\n            });\n        },\n        registerAuxContent: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.registerAuxContent(ia);\n            });\n        },\n        registerAddCurationContent: function(ha, ia, ja, ka) {\n            t.callWithSection(ha, function(la) {\n                la.registerAddCurationContent(ia, ja, ka);\n            });\n        },\n        registerSortContent: function(ha, ia, ja) {\n            t.callWithSection(ha, function(ka) {\n                ka.registerSortContent(ia, ja);\n            });\n        },\n        setLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia.setIsLoaded(true);\n                ia._parentSection.inform(\"loaded\", ia);\n                ia._parentSection.unsetMinHeight();\n            });\n        },\n        setFullyLoaded: function(ha) {\n            t.callWithSection(ha, function(ia) {\n                ia._isFullyLoaded = true;\n                var ja = ia._parentSection;\n                ((((ja._sk === ja._parentSection._sk)) && ja._parentSection.addSectionTeasers()));\n            });\n        },\n        setFTID: function(ha, ia) {\n            t.callWithSection(ha, function(ja) {\n                ja.setFTID(ia);\n            });\n        },\n        switchToNullStateCurationContent: function(ha) {\n            t.callWithSection(ga.getIDByToken(ha), function(ia) {\n                ia.nullStateCurationContent();\n            });\n        }\n    });\n    w(ga.prototype, r, {\n        addContentLoader: function(ha, ia) {\n            this._cursor = ia;\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ja = {\n                    node: ha\n                };\n                if (h.hasClass(ha, \"-cx-PRIVATE-fbTimelineMedleyPager__root\")) {\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else if (this._isFrozen) {\n                    i.remove(ha);\n                    ja.node = v.pager.cloneNode(true);\n                    i.appendContent(this.getNode(), ja.node);\n                    ja.type = u.TRIGGER_CLICK;\n                }\n                 else {\n                    ja.onVisibleBuffer = ba;\n                    ja.onVisibleStrict = true;\n                    ja.type = u.TRIGGER_ONVISIBLE;\n                }\n                \n            ;\n            ;\n                if (((ja.type === u.TRIGGER_CLICK))) {\n                    ja.callback = t.setActiveSectionID.curry(this.id);\n                }\n            ;\n            ;\n                var ka = w({\n                    displayCallback: function(la) {\n                        i.remove(ja.node);\n                        la();\n                    },\n                    options: {\n                        append: true\n                    }\n                }, this.getDefaultPageletConfig());\n                ka.data.overview = this.isOverview();\n                this._triggerLoader = null;\n                this._contentLoader = new u(ka, [ja,]);\n            }.bind(this));\n        },\n        _createNode: function() {\n            var ha = this.parent._createNode();\n            ha.setAttribute(\"aria-role\", \"tabpanel\");\n            return ha;\n        },\n        createTriggerLoader: function() {\n            q.subscribe(\"Medley/requestDataSet\", function() {\n                var ha = this.getDefaultPageletConfig(), ia = {\n                    callback: fa.curry(this, ha),\n                    node: this._tabNode,\n                    type: u.TRIGGER_CLICK\n                };\n                this._triggerLoader = new u(ha, [ia,]);\n            }.bind(this));\n        },\n        disableContentLoader: function() {\n            ((this._contentLoader && this._contentLoader.disableTriggers()));\n        },\n        enableContentLoader: function() {\n            var ha = ((this._triggerLoader || this._contentLoader));\n            ((ha && ha.enableTriggers()));\n        },\n        freeze: function() {\n            this._isFrozen = true;\n            if (((!this._contentLoader || this._contentLoader._loading))) {\n                return;\n            }\n        ;\n        ;\n            this._contentLoader.removeTriggers(u.TRIGGER_ONVISIBLE);\n            var ha = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            if (!ha.length) {\n                var ia = j.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\")[0];\n                ((ia.length && this.addContentLoader(ia, this._cursor)));\n            }\n        ;\n        ;\n        },\n        getCount: function() {\n            return this._tabCount;\n        },\n        getDefaultPageletConfig: function() {\n            return {\n                controller: this._controller,\n                data: w({\n                    collection_token: this._token,\n                    cursor: this._cursor\n                }, l.get(), {\n                    ftid: this._ftid,\n                    order: this._order\n                }, {\n                    sk: this._parentSection._sk\n                }),\n                node: this.getNode()\n            };\n        },\n        getMedleySiteKey: function() {\n            return this._parentSection._parentSection._sk;\n        },\n        flashCountIf: function() {\n            if (((this._parentSection.getActiveCollection() != this))) {\n                h.addClass(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\");\n                JSBNG__setTimeout(h.removeClass.curry(this._tabNode, \"-cx-PRIVATE-fbTimelineAppSection__tabhightlight\"), 800);\n            }\n        ;\n        ;\n        },\n        isOverview: function() {\n            return ((this._parentSection._sk != this._parentSection._parentSection._sk));\n        },\n        registerAuxContent: function(ha) {\n            this.auxContent = ha;\n            if (((ha.nodeType == 11))) {\n                this.auxContent = i.create(\"span\", null, ha);\n            }\n        ;\n        ;\n            if (((this._parentSection._activeCollection !== this))) {\n                h.hide(this.auxContent);\n            }\n        ;\n        ;\n            this._parentSection.addAuxContent(this.auxContent);\n        },\n        registerAddCurationContent: function(ha, ia, ja) {\n            if (this.curationContent) {\n                return;\n            }\n        ;\n        ;\n            this.curationContent = ((((ha.nodeType == 11)) ? i.create(\"span\", null, ha) : ha));\n            this.curationContentState = ia;\n            this._parentSection.addCurationContent(this.curationContent, this, ja);\n        },\n        nullStateCurationContent: function() {\n            this._parentSection.nullStateCurationContent();\n        },\n        registerSortContent: function(ha, ia) {\n            ((this._sortContent && i.remove(this._sortContent)));\n            this._sortContent = ha;\n            ia.subscribeOnce(\"change\", function(ja, ka) {\n                i.setContent(i.JSBNG__find(ha, \".-cx-PRIVATE-fbTimelineCollectionSorting__menulabel\"), ka.label);\n                this._sort(ka.value);\n            }.bind(this));\n        },\n        refreshCount: function() {\n            if (!this._tabNode) {\n                return;\n            }\n        ;\n        ;\n            var ha = j.JSBNG__find(this._tabNode, \".-cx-PRIVATE-fbTimelineAppSection__tabcount\");\n            if (((this._tabCount > 0))) {\n                i.setContent(ha, z.formatNumber(this._tabCount, 0, m.numberDelimiter, \"\"));\n            }\n             else i.setContent(ha, \"\");\n        ;\n        ;\n        },\n        _resetContent: function() {\n            ((this._contentLoader && this._contentLoader.destroy()));\n            i.remove(this.getNode());\n            this._node = null;\n            i.appendContent(j.JSBNG__find(this._parentSection.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), this.getNode());\n            this.addContentLoader(j.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineMedley__throbber\"), 0);\n        },\n        setFTID: function(ha) {\n            this._ftid = ha;\n        },\n        _sort: function(ha) {\n            this._order = ha;\n            this._resetContent();\n            var ia = this._parentSection, ja = ia._parentSection;\n            if (((!ja.isMedleyView() && ((ia._sk === ja._sk))))) {\n                var ka = n.getCurrentURI();\n                ka.addQueryData({\n                    order: this._order\n                });\n                n.rewriteCurrentURI(n.getCurrentURI().getUnqualifiedURI(), ka);\n            }\n        ;\n        ;\n        },\n        thaw: function() {\n            this._isFrozen = false;\n        },\n        getToken: function() {\n            return this._token;\n        }\n    });\n    e.exports = ga;\n});\n__d(\"TimelineAppSectionCuration\", [\"Animation\",\"AppSectionCurationState\",\"Arbiter\",\"AsyncSignal\",\"JSBNG__CSS\",\"DOM\",\"Ease\",\"JSBNG__Event\",\"OnVisible\",\"Parent\",\"Style\",\"TidyArbiterMixin\",\"TimelineSection\",\"copyProperties\",\"cx\",\"queryThenMutateDOM\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"AppSectionCurationState\"), i = b(\"Arbiter\"), j = b(\"AsyncSignal\"), k = b(\"JSBNG__CSS\"), l = b(\"DOM\"), m = b(\"Ease\"), n = b(\"JSBNG__Event\"), o = b(\"OnVisible\"), p = b(\"Parent\"), q = b(\"Style\"), r = b(\"TidyArbiterMixin\"), s = b(\"TimelineSection\"), t = b(\"copyProperties\"), u = b(\"cx\"), v = b(\"queryThenMutateDOM\"), w = b(\"tidyEvent\"), x = 0, y = {\n    }, z = {\n    };\n    function aa(fa, ga, ha) {\n        var ia, ja, ka = ((((ga != h.hide)) && ((ha != h.hide))));\n        v(function() {\n            ja = fa.offsetHeight;\n            ia = ((((ga === h.hide)) ? 0 : fa.firstChild.offsetHeight));\n        }, function() {\n            q.set(fa, \"height\", ((ja + \"px\")));\n            q.set(fa, \"overflow\", \"hidden\");\n            ((ia && k.addClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\")));\n            o.checkBuffer.defer();\n            var la = l.getID(fa);\n            ((z[la] && z[la].JSBNG__stop()));\n            z[la] = new g(fa).to(\"height\", ia).ondone(function() {\n                delete z[la];\n                if (ia) {\n                    q.set(fa, \"overflow\", \"\");\n                    q.set(fa.parentNode, \"overflow\", \"\");\n                }\n            ;\n            ;\n                ((!ia && k.removeClass(fa.parentNode, \"-cx-PUBLIC-fbTimelineAppSection__curationopen\")));\n                i.inform(\"reflow\");\n            }).duration(((Math.abs(((ia - ja))) * ((ka ? 5 : 1.5))))).ease(m.sineOut).go();\n        });\n    };\n;\n    function ba(fa, ga) {\n        if (fa) {\n            k.show(ga);\n            k.hide(fa);\n        }\n    ;\n    ;\n    };\n;\n    function ca(fa, ga) {\n        if (fa) {\n            k.show(fa);\n            k.hide(ga);\n        }\n    ;\n    ;\n    };\n;\n    function da(fa, ga) {\n        s.callWithSection(fa, function(ha) {\n            new j(\"/ajax/timeline/collections/app_recs/\", {\n                collection_token: ha.getActiveCollection().getToken(),\n                event_type: ga\n            }).send();\n        });\n    };\n;\n    var ea = t({\n        addSection: function(fa, ga, ha) {\n            y[fa] = {\n                appClickLogged: false,\n                buttons: ga,\n                JSBNG__content: ha,\n                id: fa,\n                state: h.hide\n            };\n            q.set(ha, \"height\", \"0px\");\n            q.set(ha, \"overflow\", \"hidden\");\n            k.show(ha);\n            {\n                var fin261keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin261i = (0);\n                var ia;\n                for (; (fin261i < fin261keys.length); (fin261i++)) {\n                    ((ia) = (fin261keys[fin261i]));\n                    {\n                        w([n.listen(ga[ia].hide_button, \"click\", ea.informState.curry(h.hide, fa)),n.listen(ga[ia].show_button, \"click\", ea.informState.curry(ia, fa)),]);\n                    ;\n                    };\n                };\n            };\n        ;\n            ea.register(fa, function(ja, ka, la, ma) {\n                new o(ha, aa.curry(ha, ja, ma), true, x);\n                {\n                    var fin262keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin262i = (0);\n                    var na;\n                    for (; (fin262i < fin262keys.length); (fin262i++)) {\n                        ((na) = (fin262keys[fin262i]));\n                        {\n                            ca(ga[na].show_button, ga[na].hide_button);\n                        ;\n                        };\n                    };\n                };\n            ;\n                if (ga[ja]) {\n                    ba(ga[ja].show_button, ga[ja].hide_button);\n                }\n            ;\n            ;\n            });\n        },\n        informState: function(fa, ga) {\n            if (((y[ga] && ((y[ga].state !== fa))))) {\n                if (((((fa === h.showApps)) && !y[ga].appClickLogged))) {\n                    y[ga].appClickLogged = true;\n                    da(ga, \"add_apps_click\");\n                }\n            ;\n            ;\n                var ha = y[ga].state;\n                y[ga].state = fa;\n                ea.inform(fa, {\n                    obj: y[ga],\n                    oldState: ha\n                });\n            }\n        ;\n        ;\n        },\n        refreshState: function(fa, ga) {\n            ea.inform(fa, {\n                obj: y[ga],\n                oldState: fa\n            });\n        },\n        linkContent: function(fa, ga, ha) {\n            var ia = y[fa].buttons[h.showApps].show_button;\n            k.show(p.byClass(ia, \"hidden_elem\"));\n            new o(ia, function() {\n                if (((Math.floor(((Math.JSBNG__random() * 100))) === 0))) {\n                    da(fa, \"add_apps_imp\");\n                }\n            ;\n            ;\n            }, true, x);\n            ea.register(fa, function(ja, ka, la, ma) {\n                if (((ja == h.showItems))) {\n                    if (((ma == h.showApps))) {\n                        q.set(y[fa].JSBNG__content.parentNode, \"overflow\", \"hidden\");\n                    }\n                ;\n                ;\n                    k.show(ga);\n                    k.hide(ha);\n                }\n                 else if (((ja == h.showApps))) {\n                    k.hide(ga);\n                    k.show(ha);\n                }\n                \n            ;\n            ;\n            });\n        },\n        register: function(fa, ga) {\n            var ha = ea.subscribe([h.hide,h.showItems,h.showApps,], function(ia, ja) {\n                if (((ja.obj.id === fa))) {\n                    ga(ia, ja.obj, ha, ja.oldState);\n                }\n            ;\n            ;\n            });\n        },\n        getSectionState: function(fa) {\n            if (y[fa]) {\n                return y[fa].state;\n            }\n        ;\n        ;\n        }\n    }, r);\n    e.exports = ea;\n});\n__d(\"TimelineMonitor\", [\"Arbiter\",\"JSBNG__Event\",\"Run\",\"Vector\",\"ViewportBounds\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"Vector\"), k = b(\"ViewportBounds\"), l = b(\"ge\"), m = b(\"queryThenMutateDOM\"), n = {\n    }, o = {\n    }, p = 0, q = [], r = null, s = false;\n    function t() {\n        n = {\n        };\n        o = {\n        };\n        p = 0;\n        q.length = 0;\n        ((r && r.remove()));\n        r = null;\n        s = false;\n    };\n;\n    function u() {\n        if (!r) {\n            r = h.listen(window, \"JSBNG__scroll\", z);\n        }\n    ;\n    ;\n        if (!s) {\n            i.onLeave(t);\n            s = true;\n        }\n    ;\n    ;\n        z();\n    };\n;\n    var v = [], w = [];\n    function x() {\n        q.forEach(function(ea) {\n            var fa = aa.getSection(ea);\n            if (((fa && ((fa !== o[ea.id]))))) {\n                o[ea.id] = fa;\n                v.push({\n                    section: fa\n                });\n            }\n        ;\n        ;\n        });\n        var ba = ((k.getTop() + j.getScrollPosition().y));\n        {\n            var fin263keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin263i = (0);\n            var ca;\n            for (; (fin263i < fin263keys.length); (fin263i++)) {\n                ((ca) = (fin263keys[fin263i]));\n                {\n                    var da = n[ca];\n                    if (((((((ba >= da.boundary)) && ((p <= da.boundary)))) || ((((ba <= da.boundary)) && ((p >= da.boundary))))))) {\n                        n[ca].fromAbove = ((p < ba));\n                        w.push(n[ca]);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        p = ba;\n    };\n;\n    function y() {\n        v.forEach(function(ba) {\n            g.inform(aa.SECTION_CHANGE, ba);\n        });\n        w.forEach(function(ba) {\n            g.inform(aa.BOUNDARY_PASSED, ba);\n        });\n        v.length = 0;\n        w.length = 0;\n    };\n;\n    function z() {\n        m(x, y, \"TimelineMonitor/scroll\");\n    };\n;\n    var aa = {\n        BOUNDARY_PASSED: \"TimelineMonitor/boundary\",\n        SECTION_CHANGE: \"TimelineMonitor/change\",\n        getSection: function(ba) {\n            var ca = ((k.getTop() + j.getScrollPosition().y)), da = ba.childSections.getHead();\n            while (da) {\n                if (((l(da.nodeID) && ((ca < ((j.getElementPosition(da.getNode()).y + j.getElementDimensions(da.getNode()).y))))))) {\n                    return da;\n                }\n            ;\n            ;\n                da = da.getNext();\n            };\n        ;\n        },\n        monitorBoundary: function(ba, ca) {\n            ca = ((ca || ba));\n            if (((!n[ca] || ((n[ca].boundary !== ba))))) {\n                n[ca] = {\n                    boundary: ba,\n                    id: ca\n                };\n                u();\n            }\n        ;\n        ;\n        },\n        monitorSection: function(ba) {\n            o[ba.id] = null;\n            q.push(ba);\n            u();\n            return aa.getSection(ba);\n        },\n        poke: function(ba) {\n            z();\n        }\n    };\n    e.exports = aa;\n});\n__d(\"TimelineAppSection\", [\"AppSectionCurationState\",\"Arbiter\",\"Class\",\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"DOMScroll\",\"JSLogger\",\"MedleyPageletRequestData\",\"PageletSet\",\"Style\",\"TidyArbiter\",\"TidyArbiterMixin\",\"TimelineAppCollection\",\"TimelineAppSectionCuration\",\"TimelineDynamicSection\",\"TimelineMonitor\",\"TimelineSection\",\"TimelineSmartInsert\",\"TriggerablePageletLoader\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"DOMQuery\"), m = b(\"DOMScroll\"), n = b(\"JSLogger\"), o = b(\"MedleyPageletRequestData\"), p = b(\"PageletSet\"), q = b(\"Style\"), r = b(\"TidyArbiter\"), s = b(\"TidyArbiterMixin\"), t = b(\"TimelineAppCollection\"), u = b(\"TimelineAppSectionCuration\"), v = b(\"TimelineDynamicSection\"), w = b(\"TimelineMonitor\"), x = b(\"TimelineSection\"), y = b(\"TimelineSmartInsert\"), z = b(\"TriggerablePageletLoader\"), aa = b(\"ViewportBounds\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"ge\"), fa = b(\"tx\"), ga = 500, ha = 2, ia = 500, ja = 18, ka = \"-cx-PRIVATE-fbTimelineAppSection__tabscondensed\", la = \"-cx-PRIVATE-fbTimelineAppSection__activetab\", ma = k.create(\"div\", {\n        className: \"-cx-PRIVATE-fbTimelineAppSection__tabnub\"\n    });\n    function na() {\n        return k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdown\"\n        }, [k.create(\"a\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownlabel\",\n            href: \"#\"\n        }, \"More\"),k.create(\"span\", {\n            className: \"-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\"\n        }),]);\n    };\n;\n    var oa = n.create(\"collections\"), pa = {\n        notes: 295,\n        events: 345,\n        photos: 555,\n        app_quoraapp: 569,\n        friends: 603,\n        app_foodspotting: 621,\n        map: 621,\n        favorites: 645,\n        app_pinterestapp: 699,\n        app_instapp: 699,\n        books: 699,\n        movies: 699,\n        tv: 699,\n        music: 725\n    };\n    function qa(sa) {\n        return pa[sa.replace(\"pagelet_timeline_medley_\", \"\")];\n    };\n;\n    function ra(sa, ta, ua, va) {\n        this.parent.construct(this, ra.getIDBySK(ta), sa, ua);\n        this._sk = ta;\n        this._title = va;\n    };\n;\n    i.extend(ra, v);\n    ba(ra, {\n        createFromArray: function(sa) {\n            return sa.map(function(ta) {\n                return new ra(ta.controller, ta.sk, ta.label, ta.title);\n            });\n        },\n        getIDBySK: function(sa) {\n            return ((\"pagelet_timeline_medley_\" + sa));\n        },\n        registerCollections: function(sa, ta, ua) {\n            x.callWithSection(ra.getIDBySK(sa), function(va) {\n                t.createFromArray(ta).forEach(va.appendSection.bind(va));\n                var wa = va.childSections.get(ua);\n                va.setActiveCollection(wa);\n                wa.setIsLoaded(true);\n            });\n        },\n        removeEmptyAppSection: function(sa) {\n            x.callWithSection(ra.getIDBySK(sa), function(ta) {\n                ta.remove();\n            });\n        }\n    }, s);\n    ba(ra.prototype, s, {\n        _createNode: function() {\n            var sa = this.parent._createNode();\n            sa.setAttribute(\"aria-labelledby\", ((\"medley_header_\" + this._sk)));\n            sa.setAttribute(\"aria-role\", \"region\");\n            k.prependContent(sa, k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__header\"\n            }, [this._title,k.create(\"div\", {\n                className: \"-cx-PRIVATE-fbTimelineAppSection__tabs\",\n                \"aria-role\": \"tablist\"\n            }),]));\n            this.resetMinHeight(sa);\n            return sa;\n        },\n        addAuxContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\")[0];\n            ((ta && k.appendContent(ta, sa)));\n            ((this._activeCollection && this._checkTabDimensions(this._activeCollection)));\n        },\n        nullStateCurationContent: function() {\n            if (!this._nullStateContent) {\n                return;\n            }\n        ;\n        ;\n            var sa = l.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\");\n            k.replace(sa.firstChild, this._nullStateContent);\n        },\n        addCurationContent: function(sa, ta, ua) {\n            var va = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcuration\")[0];\n            ((va && k.appendContent(va, sa)));\n            if (ua) {\n                this._nullStateContent = ua;\n            }\n        ;\n        ;\n            this._checkCurationContent(ta);\n        },\n        createTriggerLoader: function(sa) {\n            var ta = function(ua) {\n                this._parentSection._lastLoadedSection = this;\n                this.setIsLoaded(true);\n                y.enable();\n                y.run(this.getNode(), function() {\n                    ua();\n                    this.unsetMinHeight();\n                    w.poke(this._parentSection.id);\n                }.bind(this), \"viewport\");\n            }.bind(this);\n            r.subscribe(\"Medley/requestDataSet\", function() {\n                this._triggerLoader = new z({\n                    controller: this._controller,\n                    data: this.getData(),\n                    displayCallback: ta,\n                    options: {\n                        constHeight: true\n                    },\n                    node: this.getNode()\n                }, [{\n                    node: this.getNode(),\n                    onVisibleBuffer: ga,\n                    onVisibleStrict: true,\n                    type: ((sa ? z.TRIGGER_NOW : z.TRIGGER_ONVISIBLE))\n                },]);\n            }.bind(this));\n        },\n        freeze: function() {\n            j.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            if (((ea(this.nodeID) && !this.isLoaded()))) {\n                ((this._triggerLoader && this._triggerLoader.disableTriggers()));\n            }\n        ;\n        ;\n            this.freezeChildren();\n        },\n        getData: function() {\n            if (!this._data) {\n                this._data = ba({\n                    sk: this._sk\n                }, o.get(), {\n                    overview: ((this._parentSection._sk !== this._sk))\n                });\n            }\n        ;\n        ;\n            return this._data;\n        },\n        getActiveCollection: function() {\n            return this._activeCollection;\n        },\n        remove: function() {\n            if (p.hasPagelet(this.id)) {\n                p.removePagelet(this.id);\n            }\n        ;\n        ;\n            k.remove(this.getNode());\n            this._parentSection.childSections.remove(this.id);\n        },\n        setActiveCollection: function(sa) {\n            if (((((this._activeCollection === sa)) || !sa._tabNode))) {\n                return;\n            }\n        ;\n        ;\n            if (this._activeCollection) {\n                h.inform(\"TimelineSideAds/refresh\");\n                oa.log(\"change_collection\", {\n                    previous_collection: this._activeCollection.getToken(),\n                    new_collection: sa.getToken()\n                });\n                this.resetMinHeight();\n                this._activeCollection.disableContentLoader();\n                j.hide(this._activeCollection.getNode());\n                j.removeClass(this._activeCollection._tabNode, la);\n                k.scry(this._activeCollection._tabNode, \"div.-cx-PRIVATE-fbTimelineAppSection__tabnub\").forEach(k.remove);\n                k.appendContent(sa._tabNode, ma.cloneNode(true));\n                ((this._activeCollection.auxContent && j.hide(this._activeCollection.auxContent)));\n                ((this._activeCollection.curationContent && j.hide(this._activeCollection.curationContent)));\n                this._activeCollection._tabNode.setAttribute(\"aria-selected\", \"false\");\n            }\n        ;\n        ;\n            ((sa.auxContent && j.show(sa.auxContent)));\n            this._checkCurationContent(sa);\n            j.addClass(sa._tabNode, la);\n            this._checkTabDimensions(sa);\n            this._activeCollection = sa;\n            ra.inform(\"changeCollection\");\n            if (!ea(sa.nodeID)) {\n                k.appendContent(l.JSBNG__find(this.getNode(), \"div.-cx-PRIVATE-fbTimelineAppSection__collectionswrapper\"), sa.getNode());\n            }\n        ;\n        ;\n            j.show(sa.getNode());\n            ((sa.isLoaded() && this.unsetMinHeight()));\n            sa._tabNode.setAttribute(\"aria-selected\", \"true\");\n            sa.enableContentLoader();\n        },\n        resetMinHeight: function(sa) {\n            ((sa || (sa = this.getNode())));\n            var ta = ((qa(this.id) || ((sa.offsetHeight - ha))));\n            ((((ta > 0)) && this._updateScrollAfterHeight(sa, ta)));\n        },\n        JSBNG__scrollTo: function(sa, ta) {\n            var ua = aa.getElementPosition(this.getNode());\n            ua.y -= ((sa || ja));\n            ((ta && this._parentSection.toggleScrollLoad(false)));\n            m.JSBNG__scrollTo(ua, ia, null, null, function() {\n                ua = aa.getElementPosition(this.getNode());\n                ua.y -= ((sa || ja));\n                m.JSBNG__scrollTo(ua);\n                ((ta && this._parentSection.toggleScrollLoad(true)));\n            }.bind(this));\n        },\n        thaw: function() {\n            j.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__frozensection\");\n            ((this._triggerLoader && this._triggerLoader.enableTriggers()));\n            this.thawChildren();\n        },\n        unsetMinHeight: function() {\n            this._updateScrollAfterHeight(this.getNode(), 0);\n        },\n        _updateScrollAfterHeight: function(sa, ta) {\n            q.set(sa, \"min-height\", ((ta + \"px\")));\n            h.inform(\"reflow\");\n        },\n        _checkCurationContent: function(sa) {\n            var ta = l.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__addcurationbutton\")[0];\n            if (ta) {\n                j.conditionShow(ta, sa.curationContent);\n                if (sa.curationContent) {\n                    j.show(sa.curationContent);\n                    if (sa.curationContentState) {\n                        u.informState(sa.curationContentState, this.id);\n                    }\n                ;\n                ;\n                }\n                 else u.informState(g.hide, this.id, g.showItems);\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _getTabObj: function() {\n            if (!this._tabObj) {\n                this._tabObj = {\n                    aux: k.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__aux\"),\n                    items: [],\n                    nav: k.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__navigation\"),\n                    tabs: k.JSBNG__find(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tabs\"),\n                    width: 0\n                };\n                j.addClass(this._tabObj.tabs, \"-cx-PRIVATE-fbTimelineAppSection__tabsloaded\");\n            }\n        ;\n        ;\n            return this._tabObj;\n        },\n        _checkTabDimensions: function(sa) {\n            var ta = this._getTabObj(), ua = ((ta.nav.offsetWidth - ta.aux.offsetWidth));\n            if (((ua >= ta.width))) {\n                if (((!ta.hidden && ((((ua - ta.tabs.offsetWidth)) >= 0))))) {\n                    return;\n                }\n            ;\n            ;\n                j.removeClass(ta.tabs, ka);\n            }\n        ;\n        ;\n            if (((ta.hidden && ((sa._tabNode.parentNode === ta.overflow))))) {\n                k.prependContent(ta.overflow, ta.dropdown.previousSibling);\n                k.insertBefore(ta.dropdown, sa._tabNode);\n            }\n        ;\n        ;\n            if (((((((ua - ta.tabs.offsetWidth)) >= 0)) && !ta.hidden))) {\n                return;\n            }\n        ;\n        ;\n            var va = ta.items.length;\n            if (((va && ta.hidden))) {\n                for (var wa = 0; ((wa < va)); wa++) {\n                    k.appendContent(ta.tabs, ta.items[wa]);\n                ;\n                };\n            ;\n                k.remove(ta.dropdown);\n            }\n        ;\n        ;\n            j.conditionClass(ta.tabs, ka, ((((ua - ta.tabs.offsetWidth)) < 0)));\n            ta.width = ua;\n            ta.hidden = 0;\n            if (((((ua - ta.tabs.offsetWidth)) >= 0))) {\n                return;\n            }\n        ;\n        ;\n            if (!ta.dropdown) {\n                ta.dropdown = na();\n                ta.overflow = k.JSBNG__find(ta.dropdown, \".-cx-PRIVATE-fbTimelineAppSection__tabdropdownoverflow\");\n                ta.items = k.scry(this.getNode(), \".-cx-PRIVATE-fbTimelineAppSection__tab\");\n                va = ta.items.length;\n            }\n        ;\n        ;\n            k.appendContent(ta.tabs, ta.dropdown);\n            var xa = 0;\n            for (wa = ((va - 1)); ((((wa > 0)) && ((xa <= 0)))); wa--) {\n                if (((ta.items[wa] !== sa._tabNode))) {\n                    k.prependContent(ta.overflow, ta.items[wa]);\n                    xa = ((ua - ta.tabs.offsetWidth));\n                    ta.hidden++;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    });\n    e.exports = ra;\n});\n__d(\"TimelineDrag\", [\"JSBNG__Event\",\"ArbiterMixin\",\"Locale\",\"Style\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"Locale\"), j = b(\"Style\"), k = b(\"Vector\"), l = b(\"copyProperties\");\n    function m(n, o, p) {\n        p = ((p || {\n        }));\n        this._listenOn = p.listenOn;\n        this._offsetInput = o;\n        this._defaultOffset = p.default_offset;\n        this._killClicks = p.killClicks;\n        this._vertical = true;\n        this._RTLXSwitch = false;\n        this.setPicture(n, p);\n    };\n;\n    l(m.prototype, h, {\n        setPicture: function(n, o) {\n            if (!n) {\n                return false;\n            }\n        ;\n        ;\n            o = ((o || {\n            }));\n            this._picture = n;\n            this._defaultOffset = o.default_offset;\n            if (o.offsetInput) {\n                this._offsetInput = o.offsetInput;\n            }\n        ;\n        ;\n            if (((o.vertical !== undefined))) {\n                this._vertical = o.vertical;\n            }\n        ;\n        ;\n            if (o.height) {\n                this._containerHeight = o.height;\n            }\n        ;\n        ;\n            if (o.width) {\n                this._containerWidth = o.width;\n            }\n        ;\n        ;\n            if (this._vertical) {\n                this._offsetType = \"JSBNG__top\";\n                this._eventCoord = \"y\";\n            }\n             else {\n                this._RTLXSwitch = i.isRTL();\n                this._offsetType = \"left\";\n                this._eventCoord = \"x\";\n            }\n        ;\n        ;\n            if (this._picture.complete) {\n                this._initialLoad();\n            }\n             else this._loadListener = g.listen(this._picture, \"load\", function() {\n                this._loadListener.remove();\n                this._initialLoad();\n            }.bind(this));\n        ;\n        ;\n        },\n        destroy: function() {\n            this._stopDrag();\n            this._saveOffset();\n            ((this._mousedown && this._mousedown.remove()));\n            ((this._onclick && this._onclick.remove()));\n            ((this._loadListener && this._loadListener.remove()));\n        },\n        _initialLoad: function() {\n            var n = ((this._listenOn ? this._listenOn : this._picture));\n            ((this._mousedown && this._mousedown.remove()));\n            this._mousedown = g.listen(n, \"mousedown\", this._onMouseDown.bind(this));\n            if (this._vertical) {\n                this._maxOffset = ((this._containerHeight - this._picture.offsetHeight));\n            }\n             else this._maxOffset = ((this._containerWidth - this._picture.offsetWidth));\n        ;\n        ;\n            if (((this._defaultOffset !== undefined))) {\n                this._setOffset(this._defaultOffset);\n            }\n        ;\n        ;\n            ((this._onclick && this._onclick.remove()));\n            if (this._killClicks) {\n                this._onclick = g.listen(n, \"click\", this._onClick.bind(this));\n            }\n        ;\n        ;\n            this._saveOffset();\n        },\n        _onClick: function(JSBNG__event) {\n            JSBNG__event.kill();\n        },\n        _onMouseDown: function(JSBNG__event) {\n            var n = ((parseInt(j.get(this._picture, this._offsetType), 10) || 0));\n            this._pictureStartDragOffset = ((n - k.getEventPosition(JSBNG__event)[this._eventCoord]));\n            this._startDrag();\n            JSBNG__event.kill();\n        },\n        _startDrag: function() {\n            if (!this._dragStarted) {\n                this.inform(\"startdrag\", this);\n                this._dragTokens = [g.listen(JSBNG__document.documentElement, \"mouseup\", this._onMouseUp.bind(this)),g.listen(JSBNG__document.documentElement, \"mousemove\", this._onMouseMove.bind(this)),];\n                this._dragStarted = true;\n            }\n        ;\n        ;\n        },\n        _saveOffset: function() {\n            var n = parseInt(j.get(this._picture, this._offsetType), 10);\n            if (this._RTLXSwitch) {\n                this._offsetInput.value = ((((n + this._containerWidth)) - this._picture.offsetWidth));\n            }\n             else this._offsetInput.value = n;\n        ;\n        ;\n        },\n        _stopDrag: function() {\n            if (this._dragStarted) {\n                this.inform(\"stopdrag\", this);\n                this._dragStarted = false;\n                this._dragTokens.forEach(function(n) {\n                    n.remove();\n                });\n                this._saveOffset();\n            }\n        ;\n        ;\n        },\n        _onMouseUp: function(JSBNG__event) {\n            this._stopDrag();\n            JSBNG__event.kill();\n        },\n        _setOffset: function(n) {\n            if (this._RTLXSwitch) {\n                n = Math.max(0, Math.min(n, -this._maxOffset));\n            }\n             else n = Math.min(0, Math.max(n, this._maxOffset));\n        ;\n        ;\n            j.set(this._picture, this._offsetType, ((n + \"px\")));\n        },\n        _onMouseMove: function(JSBNG__event) {\n            this._setOffset(((this._pictureStartDragOffset + k.getEventPosition(JSBNG__event)[this._eventCoord])));\n            JSBNG__event.kill();\n        }\n    });\n    e.exports = m;\n});\n__d(\"TimelineCover\", [\"Arbiter\",\"Button\",\"JSBNG__CSS\",\"DOM\",\"HTML\",\"Parent\",\"DOMScroll\",\"TimelineController\",\"TimelineDrag\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"cx\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Button\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"HTML\"), l = b(\"Parent\"), m = b(\"DOMScroll\"), n = b(\"TimelineController\"), o = b(\"TimelineDrag\"), p = b(\"Style\"), q = b(\"Vector\"), r = b(\"$\"), s = b(\"copyProperties\"), t = b(\"cx\"), u = b(\"ge\");\n    function v(w, x, y) {\n        this.root = r(\"fbProfileCover\");\n        if (((typeof x === \"object\"))) {\n            this._coverHeight = x.cover_height;\n            this._coverWidth = x.cover_width;\n            this.previewing = x.previewing;\n            this._isLegacy = false;\n        }\n         else {\n            this._isLegacy = true;\n            this._coverHeight = x;\n            this.previewing = y;\n        }\n    ;\n    ;\n        this._parentSection = l.byClass(this.root, \"fbTimelineSection\");\n        this.cover = j.JSBNG__find(this.root, \".cover\");\n        v.instance = this;\n        this.editing = false;\n        if (!this._parentSection) {\n            this._parentSection = l.byClass(this.root, \"fbEventHeader\");\n        }\n    ;\n    ;\n        if (this.previewing) {\n            this.editMode();\n            this.updateCoverImage(this.previewing);\n        }\n    ;\n    ;\n    };\n;\n    v.instance = null;\n    v.getInstance = function() {\n        return v.instance;\n    };\n    s(v.prototype, {\n        showLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.addClass(w, \"opaquedLoading\");\n            }\n        ;\n        ;\n        },\n        hideLoadingIndicator: function() {\n            var w = u(\"fbCoverImageContainer\");\n            if (w) {\n                i.removeClass(w, \"opaquedLoading\");\n            }\n        ;\n        ;\n        },\n        isCoverImageVerticalFlow: function(w) {\n            return !(w.style.height);\n        },\n        editMode: function() {\n            h.setEnabled(j.JSBNG__find(this.root, \"button.cancelButton\"), true);\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), true);\n            this.hideLoadingIndicator();\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = j.scry(this._coverImage, \".coverWrap\")[0];\n            if (w) {\n                var x = j.JSBNG__find(w, \".coverPhotoImg\");\n                this._originalIsVertical = this.isCoverImageVerticalFlow(x);\n                this._originalOffset = p.get(x, ((this._originalIsVertical ? \"JSBNG__top\" : \"left\")));\n            }\n        ;\n        ;\n            i.addClass(this._parentSection, \"fbEditCover\");\n            m.JSBNG__scrollTo(this.root);\n            if (this.previewing) {\n                j.remove(this._coverImage);\n                i.show(this._coverImage);\n            }\n        ;\n        ;\n            var y = j.scry(this._coverImage, \".coverPhotoImg\")[0];\n            if (y) {\n                this._createDragger();\n            }\n        ;\n        ;\n            this.editing = true;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"open\"\n            });\n        },\n        _exitEditMode: function() {\n            if (this._timelineDrag) {\n                this._timelineDrag.destroy();\n                this._timelineDrag = null;\n            }\n        ;\n        ;\n            j.JSBNG__find(this.root, \"input.hiddenPhotoID\").value = null;\n            j.JSBNG__find(this.root, \"input.hiddenVideoID\").value = null;\n            h.setEnabled(j.JSBNG__find(this.root, \"button.cancelButton\"), false);\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), false);\n            i.removeClass(this._parentSection, \"fbEditCover\");\n            this.hideLoadingIndicator();\n            this.previewing = false;\n            g.inform(\"CoverPhotoEdit\", {\n                sender: this,\n                state: \"JSBNG__closed\"\n            });\n        },\n        _createDragger: function(w) {\n            var x;\n            if (this._isLegacy) {\n                x = j.JSBNG__find(this.root, \"input.photoOffsetInput\");\n                this._originalIsVertical = true;\n            }\n             else {\n                var y = ((((w === undefined)) ? this._originalIsVertical : w));\n                x = ((y ? j.JSBNG__find(this.root, \"input.photoOffsetYInput\") : j.JSBNG__find(this.root, \"input.photoOffsetXInput\")));\n            }\n        ;\n        ;\n            this._timelineDrag = new o(j.JSBNG__find(this.root, \".coverImage .coverPhotoImg\"), x, {\n                height: this._coverHeight,\n                width: this._coverWidth,\n                listenOn: this.cover,\n                vertical: y,\n                killClicks: true\n            });\n        },\n        updateCoverImage: function(w, x, y) {\n            this.videoID = y;\n            if (x) {\n                this.editMode();\n            }\n        ;\n        ;\n            j.JSBNG__find(this.root, \"input.hiddenPhotoID\").value = w;\n            j.JSBNG__find(this.root, \"input.hiddenVideoID\").value = ((y || null));\n            h.setEnabled(j.JSBNG__find(this.root, \"button.saveButton\"), true);\n            if (x) {\n                j.replace(j.JSBNG__find(this.root, \".coverImage\"), k(x));\n            }\n        ;\n        ;\n            var z = j.JSBNG__find(j.JSBNG__find(this.root, \".coverImage\"), \".coverPhotoImg\"), aa = this.isCoverImageVerticalFlow(z), ba;\n            if (this._isLegacy) {\n                ba = j.JSBNG__find(this.root, \"input.photoOffsetInput\");\n            }\n             else ba = ((aa ? j.JSBNG__find(this.root, \"input.photoOffsetYInput\") : j.JSBNG__find(this.root, \"input.photoOffsetXInput\")));\n        ;\n        ;\n            if (this._timelineDrag) {\n                this._timelineDrag.setPicture(z, {\n                    offsetInput: ba,\n                    vertical: aa\n                });\n            }\n             else this._createDragger(aa);\n        ;\n        ;\n        },\n        cancelUpdate: function() {\n            j.remove(j.scry(this.root, \".coverImage\")[0]);\n            j.prependContent(this.cover, this._coverImage);\n            if (((this._originalOffset !== undefined))) {\n                p.set(j.JSBNG__find(this._coverImage, \".coverPhotoImg\"), ((this._originalIsVertical ? \"JSBNG__top\" : \"left\")), this._originalOffset);\n            }\n        ;\n        ;\n            this._exitEditMode();\n        },\n        saveComplete: function() {\n            this._coverImage = j.scry(this.root, \".coverImage\")[0];\n            var w = l.byClass(this.root, \"fbTimelineTopSectionBase\");\n            ((w && i.removeClass(w, \"-cx-PRIVATE-fbTimelineLightHeader__nocover\")));\n            this._exitEditMode();\n        },\n        isInEditMode: function() {\n            return this.editing;\n        }\n    });\n    e.exports = v;\n});\n__d(\"TimelineCoverDisclaimer\", [\"Dialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Dialog\");\n    function h(i, j, k) {\n        if (((h.displayed === undefined))) {\n            h.displayed = true;\n        }\n         else return\n    ;\n        new g().setModal(true).setTitle(i).setBody(j).setButtonsMessage(k).setButtons(g.OK).show();\n    };\n;\n    e.exports = h;\n});\n__d(\"legacy:TimelineCoverDisclaimer\", [\"TimelineCoverDisclaimer\",], function(a, b, c, d) {\n    a.TimelineCoverDisclaimer = b(\"TimelineCoverDisclaimer\");\n}, 3);\n__d(\"TimelineMedley\", [\"Class\",\"JSBNG__CSS\",\"DOM\",\"DOMPosition\",\"DOMQuery\",\"PageTransitions\",\"TimelineAppSection\",\"TimelineDynamicSectionConfig\",\"TimelineMonitor\",\"TimelineSection\",\"URI\",\"ViewportBounds\",\"copyProperties\",\"csx\",\"cx\",\"ge\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"DOMPosition\"), k = b(\"DOMQuery\"), l = b(\"PageTransitions\"), m = b(\"TimelineAppSection\"), n = b(\"TimelineDynamicSectionConfig\"), o = b(\"TimelineMonitor\"), p = b(\"TimelineSection\"), q = b(\"URI\"), r = b(\"ViewportBounds\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"cx\"), v = b(\"ge\"), w = b(\"$\"), x = \"timeline-medley\", y = \"about\", z = 2, aa = false;\n    function ba(ea) {\n        var fa = ((ea.getQueryData().sk || ea.getPath().split(\"/\")[2]));\n        return ((n.skmapping[fa] || fa));\n    };\n;\n    function ca(ea) {\n        if (ea.getQueryData().id) {\n            return ea.getQueryData.id;\n        }\n    ;\n    ;\n        return ea.getPath().split(\"/\")[1];\n    };\n;\n    function da(ea, fa, ga) {\n        this.parent.construct(this, x);\n        this.isOverview = ((ea.length > 1));\n        n.breaker = ga.breaker;\n        m.createFromArray(ea).forEach(this.appendSection.bind(this));\n        o.monitorSection(this);\n        this._lastLoadedSection = this.childSections.get(m.getIDBySK(fa)).setIsLoaded(true);\n        p.setActiveSectionID(this._lastLoadedSection.id);\n        if (((aa && this.isMedleyView()))) {\n            this.addSectionPlaceholders();\n        }\n    ;\n    ;\n        var ha = q.getNextURI();\n        this._vanity = ca(ha);\n        this._sk = ba(ha);\n        if (this.isOverview) {\n            l.registerHandler(this._transitionHandler.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    g.extend(da, p);\n    s(da, {\n        loadToSection: function(ea, fa) {\n            p.setActiveSectionID(ea);\n            p.callWithSection(x, function(ga) {\n                var ha = ga.childSections.getHead(), ia = 0;\n                while (((ha && ((ha.id !== ea))))) {\n                    ia++;\n                    ha = ha.getNext();\n                };\n            ;\n                if (!ia) {\n                    return fa(ha);\n                }\n            ;\n            ;\n                ia--;\n                ((ia && ga.addUpcomingSectionPlaceholders(ga.childSections.getHead(), ia)));\n                ga.addSectionPlaceholder(ha, ha.getPrev(), true);\n                var ja = ha.subscribe(\"loaded\", function() {\n                    fa(ha);\n                    ja.unsubscribe();\n                });\n            });\n        },\n        scrollToSection: function(ea, fa, ga) {\n            p.callWithSection(ea, function(ha) {\n                ha.JSBNG__scrollTo(fa, ga);\n            });\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            p.callWithSection(x, function(fa) {\n                fa.toggleScrollLoad(ea);\n            });\n        }\n    });\n    s(da.prototype, {\n        addSectionTeasers: function() {\n            if (!this.isMedleyView()) {\n                h.removeClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n                this.thawChildren();\n                this.addSectionPlaceholders();\n                this.addSectionBreak();\n            }\n        ;\n        ;\n        },\n        addUpcomingSectionPlaceholders: function(ea, fa) {\n            fa = ((fa || z));\n            while (ea = ea.getNext()) {\n                if (((!this.addSectionPlaceholder(ea, ea.getPrev()) && ((--fa <= 0))))) {\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n        },\n        addSectionPlaceholder: function(ea, fa, ga) {\n            if (((!ea.isLoaded() && v(ea.nodeID)))) {\n                return false;\n            }\n        ;\n        ;\n            if (!v(ea.nodeID)) {\n                i.insertAfter(fa.getNode(), ea.getNode());\n                ea.createTriggerLoader(ga);\n                return false;\n            }\n        ;\n        ;\n            return true;\n        },\n        addSectionBreak: function() {\n            if (this._lastLoadedSection.getNext()) {\n                i.insertAfter(this.childSections.getHead().getNode(), n.breaker);\n            }\n             else i.remove(n.breaker);\n        ;\n        ;\n        },\n        addSectionPlaceholders: function() {\n            this.addUpcomingSectionPlaceholders(this._lastLoadedSection);\n        },\n        getNode: function() {\n            return w(this.id);\n        },\n        isMedleyView: function() {\n            return ((this._sk === y));\n        },\n        toggleScrollLoad: function(ea) {\n            aa = ea;\n            if (ea) {\n                this.thawChildren();\n                this.addSectionPlaceholders();\n            }\n             else this.freezeChildren();\n        ;\n        ;\n        },\n        _transitionHandler: function(ea) {\n            if (((ca(ea) !== this._vanity))) {\n                return false;\n            }\n        ;\n        ;\n            var fa = ba(ea);\n            if (!fa) {\n                return false;\n            }\n        ;\n        ;\n            if (((fa === y))) {\n                return false;\n            }\n             else {\n                var ga = ea.getQueryData();\n                if (!ga.next_cursor) {\n                    return false;\n                }\n            ;\n            ;\n                var ha = this.childSections.getHead();\n                while (ha) {\n                    if (((ha._sk === fa))) {\n                        if (((!ha._activeCollection && !k.scry(ha._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\")[0]))) {\n                            return false;\n                        }\n                    ;\n                    ;\n                        this._transitionToSection.bind(this, ha, ga).defer();\n                        return true;\n                    }\n                ;\n                ;\n                    ha = ha.getNext();\n                };\n            ;\n            }\n        ;\n        ;\n            return false;\n        },\n        _transitionToSection: function(ea, fa) {\n            var ga = ((j.getElementPosition(ea.getNode()).y - r.getTop()));\n            i.scry(ea.getNode(), \".-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\").forEach(function(ja) {\n                h.removeClass(ja, \"-cx-PRIVATE-fbTimelineCollectionGrid__overflowitem\");\n            });\n            this._sk = ea._sk;\n            p.setActiveSectionID(ea.id);\n            ea.thaw();\n            h.addClass(this.getNode(), \"-cx-PRIVATE-fbTimelineMedley__permafrost\");\n            this.freezeChildren();\n            var ha = k.JSBNG__find(ea._activeCollection.getNode(), \".-cx-PRIVATE-fbTimelineMedleyPager__root\");\n            ea._activeCollection.addContentLoader(ha, fa.next_cursor);\n            ea._activeCollection._contentLoader.load({\n                node: ha\n            });\n            var ia = this.childSections.getHead();\n            while (((ia && ((ia.id !== ea.id))))) {\n                ia.remove();\n                ia = this.childSections.getHead();\n            };\n        ;\n            p.inform(\"Medley/transitionToSection\", ea.id);\n            ea.JSBNG__scrollTo(((((ga < 0)) ? ga : 0)));\n            l.transitionComplete();\n        }\n    });\n    e.exports = da;\n});\n__d(\"TimelineNavLight\", [\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"Parent\",\"TimelineSection\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = b(\"DOMQuery\"), j = b(\"Parent\"), k = b(\"TimelineSection\"), l = b(\"csx\"), m = b(\"cx\");\n    function n(o) {\n        var p = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__activeitem\")[0], q = i.scry(o, \".-cx-PRIVATE-fbTimelineNavLight__item\"), r = j.byClass(o, \"-cx-PRIVATE-fbTimelineLightHeader__navwrapper\").offsetWidth, s = q[((q.length - 1))];\n        if (((((s.offsetLeft + s.offsetWidth)) > r))) {\n            g.addClass(o, \"-cx-PRIVATE-fbTimelineNavLight__navminimal\");\n        }\n    ;\n    ;\n        for (var t = ((q.length - 1)); ((t > 1)); t--) {\n            if (((((q[t].offsetLeft + q[t].offsetWidth)) > r))) {\n                h.remove(q[t]);\n            }\n             else break;\n        ;\n        ;\n        };\n    ;\n        var u = \"-cx-PUBLIC-fbTimelineLightHeader__loading\";\n        g.removeClass(j.byClass(o, u), u);\n        k.subscribe(\"Medley/transitionToSection\", function(v, w) {\n            if (((p && ((w === p.getAttribute(\"data-medley-id\")))))) {\n                return;\n            }\n        ;\n        ;\n            ((p && g.removeClass(p, \"-cx-PRIVATE-fbTimelineNavLight__activeitem\")));\n            for (var x = 0; ((x < q.length)); ++x) {\n                if (((q[x].getAttribute(\"data-medley-id\") === w))) {\n                    g.addClass(q[x], \"-cx-PRIVATE-fbTimelineNavLight__activeitem\");\n                    p = q[x];\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n        });\n    };\n;\n    e.exports = n;\n});\n__d(\"TimelineOGCollectionAddSelector\", [\"AsyncRequest\",\"DOM\",\"Form\",\"TidyArbiterMixin\",\"copyProperties\",\"csx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DOM\"), i = b(\"Form\"), j = b(\"TidyArbiterMixin\"), k = b(\"copyProperties\"), l = b(\"csx\"), m = b(\"tidyEvent\");\n    function n(o, p, q, r) {\n        this._endpoint = q;\n        this._button = o;\n        this._buttonParent = o.parentNode;\n        this._audienceSelector = r;\n        var s = h.JSBNG__find(o, \".-cx-PUBLIC-fbTimelineAddSelector__menubutton\");\n        n.inform(\"addButton\", {\n            button: s,\n            root: this._buttonParent\n        });\n        m([p.getMenu().subscribe(\"rendered\", function(t, u) {\n            n.inform(\"menuOpened\", {\n                audienceSelector: r\n            });\n            h.appendContent(h.JSBNG__find(u, \".-cx-PUBLIC-abstractMenu__border\"), r);\n        }),p.subscribe(\"itemselected\", this._onChange.bind(this)),]);\n    };\n;\n    k(n, j);\n    k(n.prototype, j, {\n        _onChange: function(o, p) {\n            var q = p.getValue(), r = ((this.inform(\"addedToCollection\", q) || {\n            }));\n            new g(this._endpoint).setData(k(i.serialize(this._audienceSelector), r, {\n                action: \"add\",\n                collection_token: q,\n                mechanism: \"add_selector\"\n            })).send();\n        }\n    });\n    e.exports = n;\n});\n__d(\"TimelineCurationNUXController\", [\"AppSectionCurationState\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"OGCollectionAddMenu\",\"TimelineOGCollectionAddSelector\",\"URI\",\"$\",\"csx\",\"cx\",\"tidyEvent\",], function(a, b, c, d, e, f) {\n    var g = b(\"AppSectionCurationState\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"OGCollectionAddMenu\"), m = b(\"TimelineOGCollectionAddSelector\"), n = b(\"URI\"), o = b(\"$\"), p = b(\"csx\"), q = b(\"cx\"), r = b(\"tidyEvent\"), s = 5, t = \"pagelet_timeline_medley_movies\", u = 165, v, w, x, y, z, aa, ba = [], ca = {\n        reports: 0,\n        about: 1,\n        section: 2,\n        section_privacy: 3,\n        add_button: 4,\n        privacy: 5,\n        0: \"reports\",\n        1: \"about\",\n        2: \"section\",\n        3: \"section_privacy\",\n        4: \"add_button\",\n        5: \"privacy\"\n    };\n    function da() {\n        ba.forEach(function(na) {\n            ((na.button && na.button.setAttribute(\"data-hover\", \"tooltip\")));\n            ((na.listener && na.listener.remove()));\n        });\n        ba.length = 0;\n    };\n;\n    function ea(na) {\n        if (z[na]) {\n            z[na].destroy();\n            delete z[na];\n            ((((na === \"add_button\")) && da()));\n        }\n    ;\n    ;\n        ((((aa[na] && aa[na].parentNode)) && j.remove(aa[na])));\n    };\n;\n    function fa(na) {\n        if (!i.hasClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\")) {\n            i.addClass(na, \"-cx-PRIVATE-fbTimelineCurationNUX__fadingout\");\n            d([\"Animation\",], function(oa) {\n                new oa(na).to(\"opacity\", 0).duration(300).ease(oa.ease.end).hide().go();\n            });\n        }\n    ;\n    ;\n    };\n;\n    function ga(na) {\n        ha(na);\n        var oa = ((ca[na] + 1));\n        ((oa && ia(ca[oa])));\n    };\n;\n    function ha(na) {\n        new h(\"/ajax/timeline/collections/tour/curation/\").setAllowCrossPageTransition(true).setData({\n            step: na\n        }).send();\n        ea(na);\n    };\n;\n    function ia(na) {\n        y = na;\n        switch (na) {\n          case \"reports\":\n            d([\"TimelineController\",], function(oa) {\n                oa.runOnceWhenSectionFullyLoaded(function() {\n                    ka(j.JSBNG__find(o(\"timeline_tab_content\"), \".-cx-PUBLIC-timelineOneColMin__rightcapsulecontainer\"), na);\n                }, \"recent\", \"0\");\n            });\n            break;\n          case \"about\":\n            v = j.scry(o(\"fbTimelineHeadline\"), \".-cx-PRIVATE-fbTimelineNavLight__item\")[1];\n            w = r(k.listen(v, \"click\", function() {\n                v = null;\n                w.remove();\n                y = \"section\";\n            }));\n            ka(v, na);\n            break;\n          case \"section\":\n            if (v) {\n                n(v.getAttribute(\"href\")).go();\n                v = null;\n                ((w && w.remove()));\n            }\n             else d([\"OnVisible\",\"TimelineMedley\",], function(oa, pa) {\n                j.appendContent(j.JSBNG__find(o(\"pagelet_timeline_main_column\"), \".-cx-PRIVATE-fbTimelineMedley__maincolumn\"), aa.section);\n                r(k.listen(aa.section, \"click\", function() {\n                    pa.scrollToSection(t, u, 1);\n                    fa(aa.section);\n                }));\n                pa.loadToSection(t, function() {\n                    ka(o(t), na);\n                    var qa = new oa(o(t), function() {\n                        fa(aa.section);\n                        qa.remove();\n                    }, false, -u);\n                });\n            });\n        ;\n        ;\n            break;\n          case \"section_privacy\":\n            d([\"TimelineAppSectionCuration\",], function(oa) {\n                oa.informState(g.showItems, t);\n                ka(j.scry(o(t), \".audienceSelector\")[0], na);\n            });\n            break;\n          case \"privacy\":\n            k.fire(x, \"click\");\n            break;\n        };\n    ;\n    };\n;\n    function ja(na, oa) {\n        if (z.add_button) {\n            var pa = j.scry(oa, \"[data-hover]\")[0];\n            ba.push({\n                button: pa,\n                listener: r(k.listen(na, \"mouseenter\", function() {\n                    x = na;\n                    ka(na, \"add_button\");\n                }))\n            });\n            ((pa && pa.removeAttribute(\"data-hover\")));\n        }\n    ;\n    ;\n    };\n;\n    function ka(na, oa) {\n        if (z[oa]) {\n            z[oa].setContext(na).setOffsetX(5).show();\n            if (((oa === \"privacy\"))) {\n                ea(\"add_button\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function la(na, oa, pa) {\n        var qa = pa.getAttribute(\"data-action\");\n        if (((((qa === \"next\")) || ((qa === \"done\"))))) {\n            ga(na);\n        }\n         else ha(na);\n    ;\n    ;\n    };\n;\n    var ma = {\n        init: function(na) {\n            var oa = na.next_step, pa = ca[oa];\n            z = na.dialogs;\n            aa = ((na.links ? na.links : []));\n            da();\n            if (((((oa === \"section\")) && ((oa !== y))))) {\n                ea(\"section\");\n                ea(\"section_privacy\");\n                pa += 2;\n                oa = ca[pa];\n            }\n        ;\n        ;\n            {\n                var fin264keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin264i = (0);\n                var qa;\n                for (; (fin264i < fin264keys.length); (fin264i++)) {\n                    ((qa) = (fin264keys[fin264i]));\n                    {\n                        r(z[qa].subscribe(\"button\", la.curry(qa)));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (z.add_button) {\n                var ra = ((na.isViewingSelf ? m : l));\n                r([ra.subscribe(\"menuOpened\", function(sa, ta) {\n                    ka.curry(j.JSBNG__find(ta.audienceSelector, \".audienceSelector\"), \"privacy\").defer(s);\n                }),ra.subscribe(\"addButton\", function(sa, ta) {\n                    ja.curry(ta.button, ta.root).defer(s);\n                }),]);\n            }\n        ;\n        ;\n            if (((na.isViewingSelf && ((pa < ca.add_button))))) {\n                ia(oa);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ma;\n});\n__d(\"legacy:TimelineCover\", [\"TimelineCover\",], function(a, b, c, d) {\n    a.TimelineCover = b(\"TimelineCover\");\n}, 3);\n__d(\"SubMenu\", [\"JSBNG__Event\",\"Arbiter\",\"copyProperties\",\"JSBNG__CSS\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"copyProperties\"), j = b(\"JSBNG__CSS\");\n    function k() {\n    \n    };\n;\n    i(k.prototype, {\n        _subMenu: null,\n        _mainMenu: null,\n        _forward: null,\n        _backward: null,\n        init: function(l, m, n, o) {\n            this._subMenu = l;\n            this._mainMenu = m;\n            this._forward = n;\n            this._backward = o;\n            h.subscribe(\"SubMenu/Reset\", this._goToMainMenu.bind(this));\n            g.listen(n, \"click\", this._goToSubMenu.bind(this));\n            g.listen(o, \"click\", this._goToMainMenu.bind(this));\n        },\n        initAsyncChildMenu: function(l) {\n            g.listen(this._forward, \"click\", function() {\n                this._goToSubMenu();\n                l.load();\n            }.bind(this));\n        },\n        _goToMainMenu: function() {\n            j.hide(this._subMenu);\n            j.show(this._mainMenu);\n        },\n        _goToSubMenu: function() {\n            j.hide(this._mainMenu);\n            j.show(this._subMenu);\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:ui-submenu\", [\"SubMenu\",], function(a, b, c, d) {\n    a.SubMenu = b(\"SubMenu\");\n}, 3);\n__d(\"AsyncMenu\", [\"AsyncRequest\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"copyProperties\"), i = b(\"emptyFunction\");\n    function j(k, l) {\n        this._uri = k;\n        this._elem = l;\n    };\n;\n    h(j.prototype, {\n        _uri: null,\n        _elem: null,\n        load: function() {\n            this.load = i;\n            g.bootstrap(this._uri, this._elem);\n        }\n    });\n    e.exports = j;\n});");
// 13744
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o186,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y6/r/UTKDDtdCpTB.js",o187);
// undefined
o186 = null;
// undefined
o187 = null;
// 13878
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 13894
o63.readyState = 2;
// 13892
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o76,o17);
// undefined
o17 = null;
// 13898
o63.readyState = 3;
// 13896
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o76,o40);
// undefined
o40 = null;
// 13902
o63.readyState = 4;
// undefined
o63 = null;
// 13943
o43.toString = f81632121_1344;
// undefined
o43 = null;
// 14042
o16.scrollTop = 900;
// 13900
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o76,o41);
// undefined
o76 = null;
// undefined
o41 = null;
// 14210
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"R940f\",]);\n}\n;\n__d(\"StickyController\", [\"Event\",\"CSS\",\"Style\",\"Vector\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"queryThenMutateDOM\");\n    function m(n, o, p, q) {\n        this._element = n;\n        this._marginTop = o;\n        this._onchange = p;\n        this._proxy = (q || n.parentNode);\n        this._boundQueryOnScroll = this._queryOnScroll.bind(this);\n        this._boundMutateOnScroll = this._mutateOnScroll.bind(this);\n    };\n    k(m.prototype, {\n        handleScroll: function() {\n            l(this._boundQueryOnScroll, this._boundMutateOnScroll);\n        },\n        _queryOnScroll: function() {\n            this._shouldFix = (j.getElementPosition(this._proxy, \"viewport\").y <= this._marginTop);\n        },\n        _mutateOnScroll: function() {\n            var n = this._shouldFix;\n            if ((this.isFixed() !== n)) {\n                i.set(this._element, \"top\", (n ? (this._marginTop + \"px\") : \"\"));\n                h.conditionClass(this._element, \"fixed_elem\", n);\n                (this._onchange && this._onchange(n));\n            }\n        ;\n        },\n        start: function() {\n            if (this._event) {\n                return\n            };\n            this._event = g.listen(window, \"scroll\", this.handleScroll.bind(this));\n            this.handleScroll.bind(this).defer();\n        },\n        stop: function() {\n            (this._event && this._event.remove());\n            this._event = null;\n        },\n        isFixed: function() {\n            return h.hasClass(this._element, \"fixed_elem\");\n        }\n    });\n    e.exports = m;\n});\n__d(\"PhotoMultiPhotosThumb\", [\"Event\",\"function-extensions\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Style\"), i = 1200, j = {\n        init: function(k, l) {\n            var m = null, n = 0;\n            function o(q) {\n                n = q;\n                l.forEach(function(r, s) {\n                    h.set(r, \"opacity\", ((s === q) ? 1 : 0));\n                });\n            };\n            function p() {\n                o((((n + 1)) % l.length));\n                m = p.defer(i);\n            };\n            g.listen(k, \"mouseenter\", function() {\n                if (m) {\n                    return\n                };\n                n = 0;\n                p();\n            });\n            g.listen(k, \"mouseleave\", function() {\n                o(0);\n                window.clearTimeout(m);\n                m = null;\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineSideAds\", [\"function-extensions\",\"Arbiter\",\"CSS\",\"DOM\",\"EgoAdsObjectSet\",\"Event\",\"StickyController\",\"TimelineConstants\",\"TimelineController\",\"UIPagelet\",\"URI\",\"Vector\",\"cx\",\"csx\",\"debounce\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"EgoAdsObjectSet\"), k = b(\"Event\"), l = b(\"StickyController\"), m = b(\"TimelineConstants\"), n = b(\"TimelineController\"), o = b(\"UIPagelet\"), p = b(\"URI\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"debounce\"), u = b(\"ge\"), v = 3, w = 4, x = 75, y = \"data-height\", z = 30000, aa = 0, ba = false, ca, da, ea, fa, ga, ha = new j(), ia, ja = false, ka, la = Infinity, ma = 5, na = false, oa, pa, qa, ra, sa, ta, ua = false, va = [], wa;\n    function xa(ub, vb, wb) {\n        var xb = 0;\n        if (vb) {\n            xb += vb.getHeight();\n        };\n        if ((!cb() && !xb)) {\n            return\n        };\n        ub -= xb;\n        var yb = 0;\n        for (var zb = 0; (zb < wb); zb++) {\n            yb += lb(zb);;\n        };\n        if (vb) {\n            if ((ub < yb)) {\n                ub += vb.fold((yb - ub));\n            }\n             else if ((ub > yb)) {\n                ub -= vb.unfold((ub - yb));\n            }\n        \n        };\n        return ub;\n    };\n    function ya() {\n        var ub = da.cloneNode(true);\n        ub.id = \"\";\n        var vb = new j();\n        vb.init(i.scry(ub, \"div.ego_unit\"));\n        var wb = true;\n        vb.forEach(function(xb) {\n            if (wb) {\n                wb = false;\n            }\n             else i.remove(xb);\n        ;\n        });\n        h.addClass(ub, \"fixed_elem\");\n        return ub;\n    };\n    function za() {\n        ga = undefined;\n        if (!n.pageHasScrubber(ia)) {\n            db(ma);\n            gb();\n        }\n         else if (pa) {\n            eb(da, false);\n            var ub = qa;\n            (qa && i.remove(qa));\n            qa = ya();\n            if (ub) {\n                rb();\n            };\n            db(((n.sidebarInitialized() && ja) ? w : v));\n            gb();\n            if (!ka) {\n                var vb = n.getCurrentScrubber();\n                if (vb) {\n                    qb(vb.getRoot(), vb.getOffset());\n                };\n            }\n        ;\n            (ka && ka.start());\n        }\n         else tb.adjustAdsToFit();\n        \n    ;\n    };\n    function ab() {\n        if (qa) {\n            i.remove(qa);\n            qa = null;\n        }\n    ;\n        if (ka) {\n            ka.stop();\n            ka = null;\n        }\n    ;\n        if (cb()) {\n            h.conditionClass(da, \"fixed_elem\", !pa);\n            h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__topaligned\", !n.pageHasScrubber(ia));\n        }\n         else h.conditionClass(da, \"fixed_elem\", (!pa && n.pageHasScrubber(ia)));\n    ;\n    };\n    function bb(ub) {\n        var vb = q.getViewportDimensions().y, wb = n.getCurrentScrubber(), xb = (wb ? wb.getOffset() : m.SCRUBBER_DEFAULT_OFFSET), yb = ((vb - xb) - x);\n        if ((wb || cb())) {\n            return xa(yb, wb, ub)\n        };\n    };\n    function cb() {\n        return n.fixedAds();\n    };\n    function db(ub) {\n        fa = Math.min(ub, ha.getCount());\n        ha.forEach(function(vb, wb) {\n            eb(vb, (wb >= fa));\n        });\n        eb(da, (fa === 0));\n    };\n    function eb(ub, vb) {\n        h.conditionClass(ub, \"-cx-PRIVATE-fbTimelineStyleAds__offscreen\", vb);\n        ub.setAttribute(\"aria-hidden\", (vb ? \"true\" : \"false\"));\n    };\n    function fb(ub) {\n        var vb = i.find(ha.getUnit(ub), \"div.-cx-PUBLIC-fbAdUnit__root\"), wb = vb.getAttribute(\"data-ad\");\n        return JSON.parse(wb).adid;\n    };\n    function gb() {\n        ib();\n        hb();\n    };\n    function hb() {\n        var ub;\n        if ((ga !== undefined)) {\n            ub = ha.getHoldoutAdIDsForSpace(ga, mb);\n        }\n         else ub = ha.getHoldoutAdIDsForNumAds(fa);\n    ;\n        if (ub) {\n            ub.forEach(jb);\n        };\n    };\n    function ib() {\n        if (!ra) {\n            return\n        };\n        for (var ub = (fa - 1); (ub >= 0); --ub) {\n            if (((ka && ka.isFixed()) && ((((ub !== 0)) || ((qa && !h.shown(qa))))))) {\n                continue;\n            };\n            var vb = fb(ub);\n            if (!ra[vb]) {\n                return\n            };\n            jb(vb);\n        };\n    };\n    function jb(ub) {\n        if (!ra[ub]) {\n            return\n        };\n        var vb = i.create(\"iframe\", {\n            src: p(\"/ai.php\").addQueryData({\n                aed: ra[ub]\n            }),\n            width: 0,\n            height: 0,\n            frameborder: 0,\n            scrolling: \"no\",\n            className: \"fbEmuTracking\"\n        });\n        vb.setAttribute(\"aria-hidden\", \"true\");\n        i.appendContent(da, vb);\n        delete ra[ub];\n    };\n    function kb(ub) {\n        var vb = 0;\n        while (((ub > 0) && (vb < ma))) {\n            ub -= lb(vb);\n            if ((ub >= 0)) {\n                vb++;\n            };\n        };\n        return vb;\n    };\n    function lb(ub) {\n        var vb = ha.getUnit(ub);\n        if (!vb) {\n            return 0\n        };\n        return mb(vb);\n    };\n    function mb(ub) {\n        if (!ub.getAttribute(y)) {\n            nb(ub);\n        };\n        return parseInt(ub.getAttribute(y), 10);\n    };\n    function nb(ub) {\n        ub.setAttribute(y, ub.offsetHeight);\n    };\n    function ob() {\n        for (var ub = 0; (ub < ha.getCount()); ub++) {\n            var vb = ha.getUnit(ub);\n            if (!vb) {\n                continue;\n            };\n            nb(vb);\n        };\n    };\n    function pb() {\n        var ub = i.scry(da, \"div.ego_unit\");\n        ha.init(ub);\n        var vb = ub.length;\n        if (!vb) {\n            return\n        };\n        h.addClass(ha.getUnit(0), \"ego_unit_no_top_border\");\n        na = vb;\n        za();\n        var wb = function(xb) {\n            nb(xb);\n            na = --vb;\n            tb.adjustAdsToFit();\n            if (!na) {\n                la = Date.now();\n            };\n        };\n        ub.forEach(function(xb) {\n            function yb() {\n                wb.curry(xb).defer();\n            };\n            var zb = i.scry(xb, \"img.img\")[0];\n            if (!zb) {\n                return\n            };\n            if (zb.complete) {\n                yb();\n            }\n             else k.listen(zb, {\n                load: yb,\n                error: yb,\n                abort: yb\n            });\n        ;\n        });\n    };\n    function qb(ub, vb) {\n        ka = new l(ub, vb, function(wb) {\n            if (wb) {\n                rb();\n            }\n             else {\n                i.remove(qa);\n                gb();\n            }\n        ;\n        });\n        if (qa) {\n            ka.start();\n        };\n    };\n    function rb() {\n        i.insertAfter(da, qa);\n        sb();\n    };\n    function sb() {\n        h.conditionShow(qa, ((lb(0) <= bb(1)) && !h.hasClass(document.documentElement, \"tinyViewport\")));\n    };\n    var tb = {\n        init: function(ub, vb, wb) {\n            if (ba) {\n                return\n            };\n            ma = wb.max_ads;\n            ca = wb.refresh_delay;\n            z = wb.refresh_threshold;\n            ba = true;\n            ea = vb;\n            da = ub;\n            tb.adjustAdsType(n.shouldShowWideAds());\n            sa = g.subscribe([\"UFI/CommentAddedActive\",\"UFI/CommentDeletedActive\",\"UFI/LikeActive\",\"Curation/Action\",\"ProfileBrowser/LoadMoreContent\",\"Ads/NewContentDisplayed\",], tb.loadAdsIfEnoughTimePassed);\n            ta = g.subscribe(\"TimelineSideAds/refresh\", tb.forceReloadAds);\n            wa = t(tb.loadAdsIfEnoughTimePassed, ca, this, true);\n            if (wb.mouse_move) {\n                va.push(k.listen(window, \"mousemove\", wa));\n                va.push(k.listen(window, \"scroll\", wa));\n                va.push(k.listen(window, \"resize\", wa));\n            }\n        ;\n            n.register(n.ADS, tb);\n        },\n        setShortMode: function(ub) {\n            pa = ub;\n        },\n        start: function(ub) {\n            ra = ub;\n            oa = null;\n            pb();\n        },\n        updateCurrentKey: function(ub) {\n            if ((ub == ia)) {\n                return\n            };\n            ia = ub;\n            ab();\n        },\n        loadAds: function(ub) {\n            if ((na || oa)) {\n                return\n            };\n            la = Infinity;\n            oa = o.loadFromEndpoint(\"WebEgoPane\", da.id, {\n                pid: 33,\n                data: [ea,(\"timeline_\" + ub),(pa ? w : ma),++aa,false,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        registerScrubber: function(ub) {\n            if (pa) {\n                qb(ub.getRoot(), ub.getOffset());\n            };\n            (!oa && tb.adjustAdsToFit());\n        },\n        loadAdsIfEnoughTimePassed: function() {\n            if (((((z && (((Date.now() - la) >= z))) && !h.hasClass(document.documentElement, \"tinyViewport\")) && ((!ka || ka.isFixed()))) && ((!ra || !ra[fb(0)])))) {\n                tb.loadAds(ia);\n            };\n            tb.adjustAdsToFit();\n        },\n        forceReloadAds: function() {\n            tb.loadAds(ia);\n        },\n        adjustAdsType: function(ub) {\n            if ((ub != ja)) {\n                h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub);\n                h.conditionClass(da, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub);\n                (qa && h.conditionClass(qa, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub));\n                (qa && h.conditionClass(qa, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub));\n                ja = ub;\n                ob();\n                tb.adjustAdsToFit();\n                var vb = u(\"rightColContent\");\n                if (vb) {\n                    h.conditionClass(vb, \"fbTimelineWideRightCol\", ub);\n                };\n            }\n        ;\n        },\n        adjustAdsToFit: function() {\n            if ((!da || ua)) {\n                return\n            };\n            ua = true;\n            var ub = (ja ? w : v);\n            if (pa) {\n                if ((ka && qa)) {\n                    ka.handleScroll();\n                    if (ka.isFixed()) {\n                        h.conditionShow(qa, ((lb(0) <= bb(1)) && !h.hasClass(document.documentElement, \"tinyViewport\")));\n                    }\n                     else db(ub);\n                ;\n                    gb();\n                }\n            ;\n            }\n             else {\n                var vb = bb(ub);\n                if ((typeof vb !== \"undefined\")) {\n                    ga = vb;\n                    db(kb(vb));\n                    if (!na) {\n                        gb();\n                    };\n                }\n            ;\n            }\n        ;\n            ua = false;\n        },\n        reset: function() {\n            (ka && ka.stop());\n            (oa && oa.cancel());\n            ha = new j();\n            ja = false;\n            da = null;\n            ka = null;\n            oa = null;\n            aa = 0;\n            na = null;\n            pa = null;\n            qa = null;\n            ia = null;\n            la = Infinity;\n            ba = false;\n            (sa && g.unsubscribe(sa));\n            sa = null;\n            (ta && g.unsubscribe(ta));\n            ta = null;\n            va.forEach(function(ub) {\n                ub.remove();\n            });\n            va = [];\n            (wa && wa.reset());\n        }\n    };\n    e.exports = (a.TimelineSideAds || tb);\n});\n__d(\"TimelineStickyHeader\", [\"Animation\",\"Arbiter\",\"Bootloader\",\"CSS\",\"DOM\",\"Style\",\"TimelineController\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"TimelineController\"), n = b(\"TimelineURI\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"$\"), r = b(\"ge\"), s = b(\"queryThenMutateDOM\"), t = 200, u = false, v = false, w, x, y, z, aa, ba, ca = {\n    }, da = {\n        VISIBLE: \"TimelineStickyHeader/visible\",\n        ADJUST_WIDTH: \"TimelineStickyHeader/adjustWidth\",\n        init: function(ea) {\n            if (u) {\n                return\n            };\n            u = true;\n            w = ea;\n            x = k.find(ea, \"div.name\");\n            y = k.find(ea, \"div.actions\");\n            v = j.hasClass(ea, \"fbTimelineStickyHeaderVisible\");\n            var fa = q(\"blueBar\"), ga, ha = false;\n            s(function() {\n                if (((fa.offsetTop && !r(\"page_admin_panel\")) && (m.getCurrentKey() !== n.TIMELINE_KEY))) {\n                    ga = o.getElementDimensions(fa).y;\n                    ha = true;\n                }\n            ;\n            }, function() {\n                if (ha) {\n                    i.loadModules([\"StickyController\",], function(ia) {\n                        new ia(ea, ga).start();\n                    });\n                }\n                 else j.addClass(ea, \"fixed_elem\");\n            ;\n                s(function() {\n                    aa = ea.offsetTop;\n                    ba = ea.scrollHeight;\n                }, function() {\n                    z = p.addTop(function() {\n                        return (v ? (aa + ba) : 0);\n                    });\n                }, \"TimelineStickyHeader/init\");\n                m.register(m.STICKY_HEADER, da);\n            }, \"TimelineStickyHeader/init\");\n        },\n        reset: function() {\n            u = false;\n            v = false;\n            w = null;\n            x = null;\n            y = null;\n            ca = {\n            };\n            z.remove();\n            z = null;\n        },\n        toggle: function(ea) {\n            if ((ea !== v)) {\n                var fa = (ea ? (aa - ba) : aa), ga = (ea ? aa : (aa - ba));\n                l.set(w, \"top\", (fa + \"px\"));\n                j.addClass(w, \"fbTimelineStickyHeaderAnimating\");\n                var ha = k.getID(w);\n                (ca[ha] && ca[ha].stop());\n                ca[ha] = new g(w).from(\"top\", fa).to(\"top\", ga).duration(t).ondone(function() {\n                    ca[ha] = null;\n                    j.conditionClass(w, \"fbTimelineStickyHeaderHidden\", !ea);\n                    w.setAttribute(\"aria-hidden\", (ea ? \"false\" : \"true\"));\n                    j.removeClass(w, \"fbTimelineStickyHeaderAnimating\");\n                    l.set(w, \"top\", \"\");\n                    h.inform(da.VISIBLE, ea);\n                }).go();\n                v = ea;\n            }\n        ;\n        },\n        adjustWidth: function() {\n            h.inform(da.ADJUST_WIDTH, x, h.BEHAVIOR_STATE);\n        },\n        getRoot: function() {\n            return w;\n        },\n        setActions: function(ea) {\n            if ((u && ea)) {\n                k.setContent(y, ea);\n                y = ea;\n            }\n        ;\n        }\n    };\n    e.exports = (a.TimelineStickyHeader || da);\n});\n__d(\"TimelineStickyHeaderNav\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ButtonGroup\",\"CSS\",\"DOM\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"SubscriptionsHandler\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"URI\",\"UserAgent\",\"Vector\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ButtonGroup\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"SelectorDeprecated\"), n = b(\"Style\"), o = b(\"SubscriptionsHandler\"), p = b(\"TimelineConstants\"), q = b(\"TimelineController\"), r = b(\"TimelineLegacySections\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"ge\"), w = b(\"tx\"), x = false, y, z, aa, ba, ca, da, ea, fa, ga, ha, ia, ja = {\n    }, ka = {\n    }, la = [], ma = false, na = [], oa = [], pa, qa = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function ra() {\n        var fb = m.getSelectorMenu(da);\n        pa.addSubscriptions(g.listen(fb, \"click\", sa), h.subscribe(p.SECTION_LOADED, wa));\n    };\n    function sa(event) {\n        var fb = l.byTag(event.getTarget(), \"a\");\n        if (fb) {\n            var gb = fb.getAttribute(\"data-key\");\n            q.stickyHeaderNavWasClicked(gb);\n            q.navigateToSection(gb);\n            event.prevent();\n        }\n    ;\n    };\n    function ta(fb, gb) {\n        var hb = m.getValue(gb);\n        if ((hb === \"allStories\")) {\n            r.get(fb).expandSubSections();\n        };\n        if ((hb !== \"activityLog\")) {\n            ua(gb);\n        };\n    };\n    function ua(fb) {\n        db(fb, \"highlights\");\n        db(fb, \"allStories\");\n        var gb = k.find(fb, \"li.separator\");\n        j.conditionShow(gb, gb.previousSibling);\n    };\n    function va(fb) {\n        if ((ga[fb] && !z.custom_subsection_menu)) {\n            ab(fb);\n        }\n         else xa();\n    ;\n        q.adjustStickyHeaderWidth();\n    };\n    function wa(fb, gb) {\n        var hb = gb.key;\n        if (ha[hb]) {\n            bb(hb);\n            va(hb);\n        }\n    ;\n    };\n    function xa() {\n        ba.hideItem(ea);\n    };\n    function ya(fb) {\n        var gb = fb.split(\"_\");\n        return qa[(gb.pop() - 1)];\n    };\n    function za(fb) {\n        var gb = fa[fb], hb = ga[fb];\n        if ((!gb && hb)) {\n            gb = fa[fb] = ea.cloneNode(true);\n            var ib = k.scry(gb, \"li.activityLog a\")[0];\n            if (ib) {\n                ib.href = s(ib.href).addQueryData({\n                    key: fb\n                });\n            };\n            var jb = q.getCurrentScrubber();\n            if (hb.length) {\n                j.show(k.find(gb, \"li.separator\"));\n            };\n            for (var kb = 0; (kb < hb.length); kb++) {\n                var lb = hb[kb].scrubberKey, mb = (jb ? jb.getLabelForSubnav(hb[kb].parentKey, lb) : mb = ya(lb));\n                if (mb) {\n                    cb(gb, {\n                        key: lb,\n                        label: mb\n                    });\n                };\n            };\n            pa.addSubscriptions(m.listen(gb, \"change\", ta.curry(fb, gb)), g.listen(gb, \"click\", sa));\n        }\n    ;\n        return gb;\n    };\n    function ab(fb) {\n        var gb = za(fb);\n        k.insertAfter(ea, gb);\n        j.hide(ea);\n        for (var hb in fa) {\n            var ib = fa[hb];\n            j.conditionShow(ib, (ib === gb));\n        };\n        ba.showItem(ea);\n    };\n    function bb(fb) {\n        ga[fb] = r.get(fb).subSections;\n    };\n    function cb(fb, gb) {\n        var hb = k.create(\"a\", {\n            href: \"#\",\n            rel: \"ignore\",\n            className: \"itemAnchor\",\n            tabIndex: 0\n        }, k.create(\"span\", {\n            className: \"itemLabel fsm\"\n        }, gb.label));\n        hb.setAttribute(\"data-key\", gb.key);\n        hb.setAttribute(\"aria-checked\", false);\n        var ib = k.create(\"li\", {\n            className: \"uiMenuItem uiMenuItemRadio uiSelectorOption\"\n        }, hb);\n        ib.setAttribute(\"data-label\", gb.label);\n        var jb = k.find(fb, \"ul.uiMenuInner\"), kb = k.create(\"option\", {\n            value: gb.key\n        }, gb.label), lb = k.find(fb, \"select\");\n        if ((gb.key === \"recent\")) {\n            k.prependContent(jb, ib);\n            k.insertAfter(lb.options[0], kb);\n        }\n         else {\n            k.appendContent(jb, ib);\n            k.appendContent(lb, kb);\n        }\n    ;\n    };\n    function db(fb, gb) {\n        var hb = k.scry(fb, \"li.uiMenuItem\");\n        if (!hb) {\n            return\n        };\n        for (var ib = 0; (ib < hb.length); ib++) {\n            var jb = hb[ib];\n            if ((j.hasClass(jb, gb) || (jb.firstChild.getAttribute(\"data-key\") == gb))) {\n                k.remove(jb);\n                break;\n            }\n        ;\n        };\n        var kb = k.find(fb, \"select\"), lb = k.scry(kb, \"option\");\n        for (ib = 0; (ib < lb.length); ib++) {\n            if ((lb[ib].value === gb)) {\n                k.remove(lb[ib]);\n                return;\n            }\n        ;\n        };\n    };\n    var eb = {\n        init: function(fb, gb) {\n            if (x) {\n                return\n            };\n            x = true;\n            y = fb;\n            z = (gb || {\n            });\n            ca = k.find(y, \"div.pageMenu\");\n            da = k.find(y, \"div.sectionMenu\");\n            ea = k.find(y, \"div.subsectionMenu\");\n            ia = k.find(ca, \"li.uiMenuSeparator\");\n            ba = i.getInstance(ca);\n            pa = new o();\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            eb.adjustMenuHeights();\n            ra();\n            q.register(q.STICKY_HEADER_NAV, eb);\n            oa.forEach(function(hb) {\n                hb();\n            });\n        },\n        reset: function() {\n            x = false;\n            z = {\n            };\n            la = [];\n            ja = {\n            };\n            ka = {\n            };\n            ma = false;\n            na = [];\n            y = null;\n            ca = null;\n            da = null;\n            ea = null;\n            ia = null;\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            pa.release();\n        },\n        addTimePeriod: function(fb) {\n            var gb = q.getCurrentScrubber();\n            if (!gb) {\n                return\n            };\n            var hb = gb.getLabelForNav(fb);\n            if (!hb) {\n                return\n            };\n            cb(da, {\n                key: fb,\n                label: hb\n            });\n            var ib = k.find(da, \"ul.uiMenuInner\");\n            if (((fb === \"recent\") || (ib.children.length < 2))) {\n                m.setSelected(da, fb, true);\n            };\n        },\n        updateSection: function(fb, gb) {\n            if (gb) {\n                var hb = za(fb);\n                if (hb) {\n                    m.setSelected(hb, gb);\n                    ua(hb);\n                }\n                 else aa = fb;\n            ;\n            }\n             else {\n                ha[fb] = true;\n                bb(fb);\n            }\n        ;\n            m.setSelected(da, fb, true);\n            va(fb);\n        },\n        adjustMenuHeights: function() {\n            if ((t.ie() <= 7)) {\n                return\n            };\n            [ca,da,].forEach(function(fb) {\n                var gb = \"\";\n                if (!j.hasClass(document.documentElement, \"tinyViewport\")) {\n                    gb = ((u.getViewportDimensions().y - u.getElementDimensions(v(\"blueBar\")).y) - 80);\n                    gb += \"px\";\n                }\n            ;\n                n.set(k.find(fb, \"ul.uiMenuInner\"), \"maxHeight\", gb);\n            });\n        },\n        initPageMenu: function(fb, gb) {\n            if (!x) {\n                oa.push(eb.initPageMenu.curry(fb, gb));\n                return;\n            }\n        ;\n            function hb(ib, jb) {\n                ib.forEach(function(kb) {\n                    var lb = ka[kb] = k.create(\"li\");\n                    j.hide(lb);\n                    (jb ? k.insertBefore(ia, lb) : k.appendContent(k.find(ca, \"ul.uiMenuInner\"), lb));\n                });\n            };\n            hb(fb, true);\n            hb(gb, false);\n            ja.info = k.scry(ca, \"li\")[0];\n            la = gb;\n            ma = true;\n            if (na.length) {\n                na.forEach(function(ib) {\n                    eb.registerPageMenuItem(ib.key, ib.item);\n                });\n            };\n        },\n        registerPageMenuItem: function(fb, gb) {\n            if (!ma) {\n                na.push({\n                    key: fb,\n                    item: gb\n                });\n                return;\n            }\n        ;\n            if (ka[fb]) {\n                k.replace(ka[fb], gb);\n                ja[fb] = gb;\n                delete ka[fb];\n                if ((la.indexOf(fb) >= 0)) {\n                    j.show(ia);\n                };\n            }\n        ;\n        },\n        removeTimePeriod: function(fb) {\n            db(da, fb);\n        }\n    };\n    e.exports = eb;\n});\n__d(\"TimelineScrubber\", [\"Event\",\"CSS\",\"DOM\",\"Focus\",\"Keys\",\"Parent\",\"TimelineController\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Focus\"), k = b(\"Keys\"), l = b(\"Parent\"), m = b(\"TimelineController\"), n = b(\"Vector\"), o = b(\"copyProperties\");\n    function p(q) {\n        this._root = q;\n        this._navKeys = {\n        };\n        this._subNavKeys = {\n        };\n        this._rollups = {\n        };\n        this._rolledup = {\n        };\n        var r = q.childNodes;\n        this._currentNav = r[0];\n        for (var s = 0; (s < r.length); s++) {\n            var t = r[s].getAttribute(\"data-key\");\n            this._navKeys[t] = r[s];\n            var u = i.scry(r[s], \"ul\");\n            this._subNavKeys[t] = {\n            };\n            if (u.length) {\n                var v = u[0].childNodes;\n                for (var w = 0; (w < v.length); w++) {\n                    this._subNavKeys[t][v[w].getAttribute(\"data-key\")] = v[w];;\n                };\n            }\n        ;\n            var x = r[s].getAttribute(\"data-rollup\");\n            if (x) {\n                this._rollups[x] = (this._rollups[x] || []);\n                this._rollups[x].push(r[s]);\n            }\n        ;\n        };\n        this._clickListener = g.listen(this._root, \"click\", this._handleScrub.bind(this));\n        this._focusHandler = g.listen(this._root, \"keydown\", this._moveFocus.bind(this));\n        this._tabbableElement = i.scry(this._root, \"a\")[0];\n        h.show(this._root);\n        var y = (n.getViewportDimensions().y - this.SCRUBBER_NO_ADS_VERTICAL_BUFFER), z = this.getHeight();\n        if ((z > y)) {\n            this.fold((z - y));\n        };\n        m.register(m.SCRUBBER, this);\n        m.scrubberHasLoaded(this);\n    };\n    o(p.prototype, {\n        KEY_HEIGHT: 23,\n        SUBKEY_HEIGHT: 16,\n        OFFSET: 38,\n        SCRUBBER_NO_ADS_VERTICAL_BUFFER: 125,\n        reset: function() {\n            this._root = null;\n            this._navKeys = {\n            };\n            this._subNavKeys = {\n            };\n            this._rollups = {\n            };\n            this._rolledup = {\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNav: function(q) {\n            return this._navKeys[q];\n        },\n        getSubnav: function(q, r) {\n            return this._subNavKeys[q][r];\n        },\n        getHeight: function() {\n            return this._root.offsetHeight;\n        },\n        getLabelForNav: function(q) {\n            var r = this.getNav(q);\n            return (r && i.getText(i.scry(r, \"a\")[0]));\n        },\n        getLabelForSubnav: function(q, r) {\n            var s = this.getSubnav(q, r);\n            return (s && i.getText(i.scry(s, \"a\")[0]));\n        },\n        fold: function(q) {\n            return this._adjustFolding(q, true);\n        },\n        unfold: function(q) {\n            return this._adjustFolding(q, false);\n        },\n        getOffset: function() {\n            return ((this.OFFSET + ((h.hasClass(document.body, \"hasVoiceBar\") ? 26 : 0))) + ((h.hasClass(\"rightColContent\", \"pagesTimelineRightColumn\") ? 48 : 0)));\n        },\n        updateSection: function(q, r) {\n            if (!this._navKeys[q]) {\n                return\n            };\n            var s = this._navKeys[q].getAttribute(\"data-rollup\");\n            if ((this._currentRollup && (this._currentRollup != s))) {\n                h.removeClass(this._currentRollup, \"selected\");\n                h.removeClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                delete this._currentRollup;\n            }\n        ;\n            if ((s && this._rolledup[s])) {\n                var t = this._rolledup[s];\n                if (t.getAttribute(\"data-rollup\")) {\n                    this._currentRollup = t;\n                    h.addClass(this._currentRollup, \"selected\");\n                    h.addClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                }\n            ;\n            }\n        ;\n            (this._currentNav && h.removeClass(this._currentNav, \"selected\"));\n            (this._currentSubNav && h.removeClass(this._currentSubNav, \"selected\"));\n            this._currentNav = null;\n            this._currentSubNav = null;\n            if (this._navKeys[q]) {\n                this._currentNav = this._navKeys[q];\n                h.addClass(this._currentNav, \"selected\");\n                if ((this.decadesAreSelectable && this._navKeys[r])) {\n                    this._currentSubNav = this._navKeys[r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                 else if ((r && this._subNavKeys[q][r])) {\n                    this._currentSubNav = this._subNavKeys[q][r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                \n            ;\n            }\n        ;\n        },\n        _getRollupSize: function(q) {\n            var r = this._currentNav, s = (r && r.getAttribute(\"data-rollup\")), t = (this.KEY_HEIGHT * ((this._rollups[q].length - 1)));\n            if ((q == s)) {\n                t += (this.SUBKEY_HEIGHT * i.scry(r, \"li\").length);\n                t -= (this.SUBKEY_HEIGHT * ((this._rollups[q].length - 1)));\n            }\n        ;\n            return t;\n        },\n        _adjustFolding: function(q, r) {\n            var s = q, t = Object.keys(this._rollups);\n            while (((q > 0) && t.length)) {\n                var u = t[(r ? \"pop\" : \"shift\")]();\n                if ((!r == !this._rolledup[u])) {\n                    continue;\n                };\n                var v = this._getRollupSize(u);\n                if ((v <= 0)) {\n                    continue;\n                };\n                if ((!r && (v > q))) {\n                    break;\n                };\n                this[(r ? \"_collapseRollup\" : \"_expandRollup\")](u);\n                q -= v;\n            };\n            return (s - q);\n        },\n        _collapseRollup: function(q) {\n            var r = this._rollups[q];\n            if (((!r || (r.length < 2)) || this._rolledup[q])) {\n                return\n            };\n            var s = r[0].previousSibling, t = r[0], u = i.create(\"a\", {\n                href: t.firstChild.href,\n                rel: \"ignore\",\n                tabindex: \"-1\"\n            }, [q,]), v = i.create(\"ul\", {\n                className: \"clearfix\"\n            });\n            for (var w = 0; (w < r.length); w++) {\n                v.appendChild(r[w]);;\n            };\n            var x = i.create(\"li\", null, [u,v,]);\n            if (this.decadesAreSelectable) {\n                var y = r[(r.length - 1)], z = (t.getAttribute(\"data-key\") + y.getAttribute(\"data-key\"));\n                x.setAttribute(\"data-start\", y.getAttribute(\"data-start\"));\n                x.setAttribute(\"data-end\", t.getAttribute(\"data-end\"));\n                x.setAttribute(\"data-key\", z);\n                this._navKeys[z] = x;\n            }\n             else x.setAttribute(\"data-key\", t.getAttribute(\"data-key\"));\n        ;\n            x.setAttribute(\"data-rollup\", q);\n            if (s) {\n                i.insertAfter(s, x);\n            }\n             else i.prependContent(this._root, x);\n        ;\n            this._rolledup[q] = x;\n            this._checkSelection();\n            this._ensureFocusableElementIsVisible();\n        },\n        _expandRollup: function(q) {\n            if (!this._rolledup[q]) {\n                return\n            };\n            var r = this._rolledup[q], s = i.scry(r, \"ul\")[0], t = document.createDocumentFragment();\n            while (s.childNodes.length) {\n                t.appendChild(s.firstChild);;\n            };\n            i.replace(r, t);\n            this._rolledup[q] = false;\n            this._checkSelection();\n        },\n        _checkSelection: function() {\n            if (this._currentNav) {\n                var q = (this._currentSubNav && this._currentSubNav.getAttribute(\"data-key\"));\n                this.updateSection(this._currentNav.getAttribute(\"data-key\"), q);\n            }\n        ;\n        },\n        _handleScrub: function(event) {\n            var q = event.getModifiers();\n            if (((event.isMiddleClick() || q.access) || q.meta)) {\n                return true\n            };\n            var r = l.byTag(event.getTarget(), \"a\"), s = (r && l.byAttribute(r, \"data-key\"));\n            if (s) {\n                m.scrubberWasClicked(s.getAttribute(\"data-key\"));\n                m.navigateToSection(s.getAttribute(\"data-key\"));\n                return event.prevent();\n            }\n        ;\n        },\n        _ensureFocusableElementIsVisible: function() {\n            while (!((this._tabbableElement.offsetHeight || this._tabbableElement.offsetWidth))) {\n                this._tabbableElement.tabIndex = -1;\n                var q = l.byTag(l.byTag(this._tabbableElement, \"li\"), \"li\");\n                this._tabbableElement = i.scry(q, \"a\")[0];\n                this._tabbableElement.tabIndex = 0;\n            };\n        },\n        _moveFocus: function(event) {\n            if (event.getModifiers().any) {\n                return\n            };\n            var q = g.getKeyCode(event);\n            if (((q === k.UP) || (q === k.DOWN))) {\n                var r = i.scry(this._root, \"a\").filter(function(u) {\n                    return (u.offsetHeight || u.offsetWidth);\n                }), s = r.indexOf(this._tabbableElement);\n                if ((s != -1)) {\n                    var t = r[(s + (((q === k.UP) ? -1 : 1)))];\n                    if (t) {\n                        t.tabindex = 0;\n                        j.set(t);\n                        this._tabbableElement.tabindex = -1;\n                        this._tabbableElement = t;\n                        event.prevent();\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineMainScrubber\", [\"Arbiter\",\"Class\",\"CSS\",\"DOMQuery\",\"TimelineConstants\",\"TimelineController\",\"TimelineScrubber\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Class\"), i = b(\"CSS\"), j = b(\"DOMQuery\"), k = b(\"TimelineConstants\"), l = b(\"TimelineController\"), m = b(\"TimelineScrubber\"), n = b(\"copyProperties\");\n    function o(p) {\n        this.parent.construct(this, p);\n        this._subscribe = g.subscribe(k.SECTION_LOADED, function(q, r) {\n            var s = this._navKeys[r.key], t = (s && j.scry(s, \"ul\")[0]);\n            if (t) {\n                i.addClass(t, \"loaded\");\n                l.scrubberHasChangedState();\n                if (r.hideSubSections) {\n                    i.hide(t);\n                };\n            }\n        ;\n        }.bind(this));\n    };\n    h.extend(o, m);\n    n(o.prototype, {\n        reset: function() {\n            this.parent.reset();\n            (this._subscribe && this._subscribe.unsubscribe());\n        }\n    });\n    e.exports = o;\n});\n__d(\"legacy:TimelineMainScrubber\", [\"TimelineMainScrubber\",], function(a, b, c, d) {\n    a.TimelineMainScrubber = b(\"TimelineMainScrubber\");\n}, 3);\n__d(\"PubcontentPageTimelineChainingController\", [\"Arbiter\",\"AsyncRequest\",\"DOM\",\"PageLikeButton\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"PageLikeButton\"), k = \"fbSuggestionsPlaceHolder\", l = \"/ajax/pages/suggestions_on_liking.php\";\n    m.init = function(n) {\n        if (!this.$PubcontentPageTimelineChainingController0) {\n            this.$PubcontentPageTimelineChainingController0 = new m(n);\n        };\n    };\n    function m(n) {\n        this.likedPageIDs = {\n        };\n        this.config = n;\n        g.subscribe(j.LIKED, this.onLike.bind(this));\n    };\n    m.prototype.$PubcontentPageTimelineChainingController1 = function(n) {\n        var o = i.scry(document, (\"#\" + k));\n        if ((o.length === 0)) {\n            return null\n        };\n        return o[0];\n    };\n    m.prototype.onLike = function(n, o) {\n        if (((((o.profile_id && o.target) && o.origin) && (o.origin in this.config)) && !((o.profile_id in this.likedPageIDs)))) {\n            var p = this.$PubcontentPageTimelineChainingController1(o.target);\n            if (!p) {\n                return\n            };\n            this.likedPageIDs[o.profile_id] = true;\n            new h().setURI(l).setData({\n                pageid: o.profile_id\n            }).setRelativeTo(p).send();\n        }\n    ;\n    };\n    e.exports = m;\n});");
// 14211
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s192e4c65fed2df60c6d5a7035f8e22511b43113b");
// 14212
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"R940f\",]);\n}\n;\n;\n__d(\"StickyController\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"Style\",\"Vector\",\"copyProperties\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"Style\"), j = b(\"Vector\"), k = b(\"copyProperties\"), l = b(\"queryThenMutateDOM\");\n    function m(n, o, p, q) {\n        this._element = n;\n        this._marginTop = o;\n        this._onchange = p;\n        this._proxy = ((q || n.parentNode));\n        this._boundQueryOnScroll = this._queryOnScroll.bind(this);\n        this._boundMutateOnScroll = this._mutateOnScroll.bind(this);\n    };\n;\n    k(m.prototype, {\n        handleScroll: function() {\n            l(this._boundQueryOnScroll, this._boundMutateOnScroll);\n        },\n        _queryOnScroll: function() {\n            this._shouldFix = ((j.getElementPosition(this._proxy, \"viewport\").y <= this._marginTop));\n        },\n        _mutateOnScroll: function() {\n            var n = this._shouldFix;\n            if (((this.isFixed() !== n))) {\n                i.set(this._element, \"JSBNG__top\", ((n ? ((this._marginTop + \"px\")) : \"\")));\n                h.conditionClass(this._element, \"fixed_elem\", n);\n                ((this._onchange && this._onchange(n)));\n            }\n        ;\n        ;\n        },\n        start: function() {\n            if (this._event) {\n                return;\n            }\n        ;\n        ;\n            this._event = g.listen(window, \"JSBNG__scroll\", this.handleScroll.bind(this));\n            this.handleScroll.bind(this).defer();\n        },\n        JSBNG__stop: function() {\n            ((this._event && this._event.remove()));\n            this._event = null;\n        },\n        isFixed: function() {\n            return h.hasClass(this._element, \"fixed_elem\");\n        }\n    });\n    e.exports = m;\n});\n__d(\"PhotoMultiPhotosThumb\", [\"JSBNG__Event\",\"function-extensions\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Style\"), i = 1200, j = {\n        init: function(k, l) {\n            var m = null, n = 0;\n            function o(q) {\n                n = q;\n                l.forEach(function(r, s) {\n                    h.set(r, \"opacity\", ((((s === q)) ? 1 : 0)));\n                });\n            };\n        ;\n            function p() {\n                o(((((n + 1)) % l.length)));\n                m = p.defer(i);\n            };\n        ;\n            g.listen(k, \"mouseenter\", function() {\n                if (m) {\n                    return;\n                }\n            ;\n            ;\n                n = 0;\n                p();\n            });\n            g.listen(k, \"mouseleave\", function() {\n                o(0);\n                window.JSBNG__clearTimeout(m);\n                m = null;\n            });\n        }\n    };\n    e.exports = j;\n});\n__d(\"TimelineSideAds\", [\"function-extensions\",\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"EgoAdsObjectSet\",\"JSBNG__Event\",\"StickyController\",\"TimelineConstants\",\"TimelineController\",\"UIPagelet\",\"URI\",\"Vector\",\"cx\",\"csx\",\"debounce\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"EgoAdsObjectSet\"), k = b(\"JSBNG__Event\"), l = b(\"StickyController\"), m = b(\"TimelineConstants\"), n = b(\"TimelineController\"), o = b(\"UIPagelet\"), p = b(\"URI\"), q = b(\"Vector\"), r = b(\"cx\"), s = b(\"csx\"), t = b(\"debounce\"), u = b(\"ge\"), v = 3, w = 4, x = 75, y = \"data-height\", z = 30000, aa = 0, ba = false, ca, da, ea, fa, ga, ha = new j(), ia, ja = false, ka, la = Infinity, ma = 5, na = false, oa, pa, qa, ra, sa, ta, ua = false, va = [], wa;\n    function xa(ub, vb, wb) {\n        var xb = 0;\n        if (vb) {\n            xb += vb.getHeight();\n        }\n    ;\n    ;\n        if (((!cb() && !xb))) {\n            return;\n        }\n    ;\n    ;\n        ub -= xb;\n        var yb = 0;\n        for (var zb = 0; ((zb < wb)); zb++) {\n            yb += lb(zb);\n        ;\n        };\n    ;\n        if (vb) {\n            if (((ub < yb))) {\n                ub += vb.fold(((yb - ub)));\n            }\n             else if (((ub > yb))) {\n                ub -= vb.unfold(((ub - yb)));\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return ub;\n    };\n;\n    function ya() {\n        var ub = da.cloneNode(true);\n        ub.id = \"\";\n        var vb = new j();\n        vb.init(i.scry(ub, \"div.ego_unit\"));\n        var wb = true;\n        vb.forEach(function(xb) {\n            if (wb) {\n                wb = false;\n            }\n             else i.remove(xb);\n        ;\n        ;\n        });\n        h.addClass(ub, \"fixed_elem\");\n        return ub;\n    };\n;\n    function za() {\n        ga = undefined;\n        if (!n.pageHasScrubber(ia)) {\n            db(ma);\n            gb();\n        }\n         else if (pa) {\n            eb(da, false);\n            var ub = qa;\n            ((qa && i.remove(qa)));\n            qa = ya();\n            if (ub) {\n                rb();\n            }\n        ;\n        ;\n            db(((((n.sidebarInitialized() && ja)) ? w : v)));\n            gb();\n            if (!ka) {\n                var vb = n.getCurrentScrubber();\n                if (vb) {\n                    qb(vb.getRoot(), vb.getOffset());\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((ka && ka.start()));\n        }\n         else tb.adjustAdsToFit();\n        \n    ;\n    ;\n    };\n;\n    function ab() {\n        if (qa) {\n            i.remove(qa);\n            qa = null;\n        }\n    ;\n    ;\n        if (ka) {\n            ka.JSBNG__stop();\n            ka = null;\n        }\n    ;\n    ;\n        if (cb()) {\n            h.conditionClass(da, \"fixed_elem\", !pa);\n            h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__topaligned\", !n.pageHasScrubber(ia));\n        }\n         else h.conditionClass(da, \"fixed_elem\", ((!pa && n.pageHasScrubber(ia))));\n    ;\n    ;\n    };\n;\n    function bb(ub) {\n        var vb = q.getViewportDimensions().y, wb = n.getCurrentScrubber(), xb = ((wb ? wb.getOffset() : m.SCRUBBER_DEFAULT_OFFSET)), yb = ((((vb - xb)) - x));\n        if (((wb || cb()))) {\n            return xa(yb, wb, ub);\n        }\n    ;\n    ;\n    };\n;\n    function cb() {\n        return n.fixedAds();\n    };\n;\n    function db(ub) {\n        fa = Math.min(ub, ha.getCount());\n        ha.forEach(function(vb, wb) {\n            eb(vb, ((wb >= fa)));\n        });\n        eb(da, ((fa === 0)));\n    };\n;\n    function eb(ub, vb) {\n        h.conditionClass(ub, \"-cx-PRIVATE-fbTimelineStyleAds__offscreen\", vb);\n        ub.setAttribute(\"aria-hidden\", ((vb ? \"true\" : \"false\")));\n    };\n;\n    function fb(ub) {\n        var vb = i.JSBNG__find(ha.getUnit(ub), \"div.-cx-PUBLIC-fbAdUnit__root\"), wb = vb.getAttribute(\"data-ad\");\n        return JSON.parse(wb).adid;\n    };\n;\n    function gb() {\n        ib();\n        hb();\n    };\n;\n    function hb() {\n        var ub;\n        if (((ga !== undefined))) {\n            ub = ha.getHoldoutAdIDsForSpace(ga, mb);\n        }\n         else ub = ha.getHoldoutAdIDsForNumAds(fa);\n    ;\n    ;\n        if (ub) {\n            ub.forEach(jb);\n        }\n    ;\n    ;\n    };\n;\n    function ib() {\n        if (!ra) {\n            return;\n        }\n    ;\n    ;\n        for (var ub = ((fa - 1)); ((ub >= 0)); --ub) {\n            if (((((ka && ka.isFixed())) && ((((ub !== 0)) || ((qa && !h.shown(qa)))))))) {\n                continue;\n            }\n        ;\n        ;\n            var vb = fb(ub);\n            if (!ra[vb]) {\n                return;\n            }\n        ;\n        ;\n            jb(vb);\n        };\n    ;\n    };\n;\n    function jb(ub) {\n        if (!ra[ub]) {\n            return;\n        }\n    ;\n    ;\n        var vb = i.create(\"div\", {\n            src: p(\"/ai.php\").addQueryData({\n                aed: ra[ub]\n            }),\n            width: 0,\n            height: 0,\n            frameborder: 0,\n            scrolling: \"no\",\n            className: \"fbEmuTracking\"\n        });\n        vb.setAttribute(\"aria-hidden\", \"true\");\n        i.appendContent(da, vb);\n        delete ra[ub];\n    };\n;\n    function kb(ub) {\n        var vb = 0;\n        while (((((ub > 0)) && ((vb < ma))))) {\n            ub -= lb(vb);\n            if (((ub >= 0))) {\n                vb++;\n            }\n        ;\n        ;\n        };\n    ;\n        return vb;\n    };\n;\n    function lb(ub) {\n        var vb = ha.getUnit(ub);\n        if (!vb) {\n            return 0;\n        }\n    ;\n    ;\n        return mb(vb);\n    };\n;\n    function mb(ub) {\n        if (!ub.getAttribute(y)) {\n            nb(ub);\n        }\n    ;\n    ;\n        return parseInt(ub.getAttribute(y), 10);\n    };\n;\n    function nb(ub) {\n        ub.setAttribute(y, ub.offsetHeight);\n    };\n;\n    function ob() {\n        for (var ub = 0; ((ub < ha.getCount())); ub++) {\n            var vb = ha.getUnit(ub);\n            if (!vb) {\n                continue;\n            }\n        ;\n        ;\n            nb(vb);\n        };\n    ;\n    };\n;\n    function pb() {\n        var ub = i.scry(da, \"div.ego_unit\");\n        ha.init(ub);\n        var vb = ub.length;\n        if (!vb) {\n            return;\n        }\n    ;\n    ;\n        h.addClass(ha.getUnit(0), \"ego_unit_no_top_border\");\n        na = vb;\n        za();\n        var wb = function(xb) {\n            nb(xb);\n            na = --vb;\n            tb.adjustAdsToFit();\n            if (!na) {\n                la = JSBNG__Date.now();\n            }\n        ;\n        ;\n        };\n        ub.forEach(function(xb) {\n            function yb() {\n                wb.curry(xb).defer();\n            };\n        ;\n            var zb = i.scry(xb, \"img.img\")[0];\n            if (!zb) {\n                return;\n            }\n        ;\n        ;\n            if (zb.complete) {\n                yb();\n            }\n             else k.listen(zb, {\n                load: yb,\n                error: yb,\n                abort: yb\n            });\n        ;\n        ;\n        });\n    };\n;\n    function qb(ub, vb) {\n        ka = new l(ub, vb, function(wb) {\n            if (wb) {\n                rb();\n            }\n             else {\n                i.remove(qa);\n                gb();\n            }\n        ;\n        ;\n        });\n        if (qa) {\n            ka.start();\n        }\n    ;\n    ;\n    };\n;\n    function rb() {\n        i.insertAfter(da, qa);\n        sb();\n    };\n;\n    function sb() {\n        h.conditionShow(qa, ((((lb(0) <= bb(1))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))));\n    };\n;\n    var tb = {\n        init: function(ub, vb, wb) {\n            if (ba) {\n                return;\n            }\n        ;\n        ;\n            ma = wb.max_ads;\n            ca = wb.refresh_delay;\n            z = wb.refresh_threshold;\n            ba = true;\n            ea = vb;\n            da = ub;\n            tb.adjustAdsType(n.shouldShowWideAds());\n            sa = g.subscribe([\"UFI/CommentAddedActive\",\"UFI/CommentDeletedActive\",\"UFI/LikeActive\",\"Curation/Action\",\"ProfileBrowser/LoadMoreContent\",\"Ads/NewContentDisplayed\",], tb.loadAdsIfEnoughTimePassed);\n            ta = g.subscribe(\"TimelineSideAds/refresh\", tb.forceReloadAds);\n            wa = t(tb.loadAdsIfEnoughTimePassed, ca, this, true);\n            if (wb.mouse_move) {\n                va.push(k.listen(window, \"mousemove\", wa));\n                va.push(k.listen(window, \"JSBNG__scroll\", wa));\n                va.push(k.listen(window, \"resize\", wa));\n            }\n        ;\n        ;\n            n.register(n.ADS, tb);\n        },\n        setShortMode: function(ub) {\n            pa = ub;\n        },\n        start: function(ub) {\n            ra = ub;\n            oa = null;\n            pb();\n        },\n        updateCurrentKey: function(ub) {\n            if (((ub == ia))) {\n                return;\n            }\n        ;\n        ;\n            ia = ub;\n            ab();\n        },\n        loadAds: function(ub) {\n            if (((na || oa))) {\n                return;\n            }\n        ;\n        ;\n            la = Infinity;\n            oa = o.loadFromEndpoint(\"WebEgoPane\", da.id, {\n                pid: 33,\n                data: [ea,((\"timeline_\" + ub)),((pa ? w : ma)),++aa,false,]\n            }, {\n                crossPage: true,\n                bundle: false\n            });\n        },\n        registerScrubber: function(ub) {\n            if (pa) {\n                qb(ub.getRoot(), ub.getOffset());\n            }\n        ;\n        ;\n            ((!oa && tb.adjustAdsToFit()));\n        },\n        loadAdsIfEnoughTimePassed: function() {\n            if (((((((((z && ((((JSBNG__Date.now() - la)) >= z)))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))) && ((!ka || ka.isFixed())))) && ((!ra || !ra[fb(0)]))))) {\n                tb.loadAds(ia);\n            }\n        ;\n        ;\n            tb.adjustAdsToFit();\n        },\n        forceReloadAds: function() {\n            tb.loadAds(ia);\n        },\n        adjustAdsType: function(ub) {\n            if (((ub != ja))) {\n                h.conditionClass(da, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub);\n                h.conditionClass(da, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub);\n                ((qa && h.conditionClass(qa, \"-cx-PRIVATE-fbTimelineStyleAds__vertical\", !ub)));\n                ((qa && h.conditionClass(qa, \"-cx-PRIVATE-fbPageAdminUpsell__vertical\", !ub)));\n                ja = ub;\n                ob();\n                tb.adjustAdsToFit();\n                var vb = u(\"rightColContent\");\n                if (vb) {\n                    h.conditionClass(vb, \"fbTimelineWideRightCol\", ub);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        adjustAdsToFit: function() {\n            if (((!da || ua))) {\n                return;\n            }\n        ;\n        ;\n            ua = true;\n            var ub = ((ja ? w : v));\n            if (pa) {\n                if (((ka && qa))) {\n                    ka.handleScroll();\n                    if (ka.isFixed()) {\n                        h.conditionShow(qa, ((((lb(0) <= bb(1))) && !h.hasClass(JSBNG__document.documentElement, \"tinyViewport\"))));\n                    }\n                     else db(ub);\n                ;\n                ;\n                    gb();\n                }\n            ;\n            ;\n            }\n             else {\n                var vb = bb(ub);\n                if (((typeof vb !== \"undefined\"))) {\n                    ga = vb;\n                    db(kb(vb));\n                    if (!na) {\n                        gb();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ua = false;\n        },\n        reset: function() {\n            ((ka && ka.JSBNG__stop()));\n            ((oa && oa.cancel()));\n            ha = new j();\n            ja = false;\n            da = null;\n            ka = null;\n            oa = null;\n            aa = 0;\n            na = null;\n            pa = null;\n            qa = null;\n            ia = null;\n            la = Infinity;\n            ba = false;\n            ((sa && g.unsubscribe(sa)));\n            sa = null;\n            ((ta && g.unsubscribe(ta)));\n            ta = null;\n            va.forEach(function(ub) {\n                ub.remove();\n            });\n            va = [];\n            ((wa && wa.reset()));\n        }\n    };\n    e.exports = ((a.TimelineSideAds || tb));\n});\n__d(\"TimelineStickyHeader\", [\"Animation\",\"Arbiter\",\"Bootloader\",\"JSBNG__CSS\",\"DOM\",\"Style\",\"TimelineController\",\"TimelineURI\",\"Vector\",\"ViewportBounds\",\"$\",\"ge\",\"queryThenMutateDOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"Bootloader\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"TimelineController\"), n = b(\"TimelineURI\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"$\"), r = b(\"ge\"), s = b(\"queryThenMutateDOM\"), t = 200, u = false, v = false, w, x, y, z, aa, ba, ca = {\n    }, da = {\n        VISIBLE: \"TimelineStickyHeader/visible\",\n        ADJUST_WIDTH: \"TimelineStickyHeader/adjustWidth\",\n        init: function(ea) {\n            if (u) {\n                return;\n            }\n        ;\n        ;\n            u = true;\n            w = ea;\n            x = k.JSBNG__find(ea, \"div.JSBNG__name\");\n            y = k.JSBNG__find(ea, \"div.actions\");\n            v = j.hasClass(ea, \"fbTimelineStickyHeaderVisible\");\n            var fa = q(\"blueBar\"), ga, ha = false;\n            s(function() {\n                if (((((fa.offsetTop && !r(\"page_admin_panel\"))) && ((m.getCurrentKey() !== n.TIMELINE_KEY))))) {\n                    ga = o.getElementDimensions(fa).y;\n                    ha = true;\n                }\n            ;\n            ;\n            }, function() {\n                if (ha) {\n                    i.loadModules([\"StickyController\",], function(ia) {\n                        new ia(ea, ga).start();\n                    });\n                }\n                 else j.addClass(ea, \"fixed_elem\");\n            ;\n            ;\n                s(function() {\n                    aa = ea.offsetTop;\n                    ba = ea.scrollHeight;\n                }, function() {\n                    z = p.addTop(function() {\n                        return ((v ? ((aa + ba)) : 0));\n                    });\n                }, \"TimelineStickyHeader/init\");\n                m.register(m.STICKY_HEADER, da);\n            }, \"TimelineStickyHeader/init\");\n        },\n        reset: function() {\n            u = false;\n            v = false;\n            w = null;\n            x = null;\n            y = null;\n            ca = {\n            };\n            z.remove();\n            z = null;\n        },\n        toggle: function(ea) {\n            if (((ea !== v))) {\n                var fa = ((ea ? ((aa - ba)) : aa)), ga = ((ea ? aa : ((aa - ba))));\n                l.set(w, \"JSBNG__top\", ((fa + \"px\")));\n                j.addClass(w, \"fbTimelineStickyHeaderAnimating\");\n                var ha = k.getID(w);\n                ((ca[ha] && ca[ha].JSBNG__stop()));\n                ca[ha] = new g(w).from(\"JSBNG__top\", fa).to(\"JSBNG__top\", ga).duration(t).ondone(function() {\n                    ca[ha] = null;\n                    j.conditionClass(w, \"fbTimelineStickyHeaderHidden\", !ea);\n                    w.setAttribute(\"aria-hidden\", ((ea ? \"false\" : \"true\")));\n                    j.removeClass(w, \"fbTimelineStickyHeaderAnimating\");\n                    l.set(w, \"JSBNG__top\", \"\");\n                    h.inform(da.VISIBLE, ea);\n                }).go();\n                v = ea;\n            }\n        ;\n        ;\n        },\n        adjustWidth: function() {\n            h.inform(da.ADJUST_WIDTH, x, h.BEHAVIOR_STATE);\n        },\n        getRoot: function() {\n            return w;\n        },\n        setActions: function(ea) {\n            if (((u && ea))) {\n                k.setContent(y, ea);\n                y = ea;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = ((a.TimelineStickyHeader || da));\n});\n__d(\"TimelineStickyHeaderNav\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ButtonGroup\",\"JSBNG__CSS\",\"DOM\",\"Parent\",\"SelectorDeprecated\",\"Style\",\"SubscriptionsHandler\",\"TimelineConstants\",\"TimelineController\",\"TimelineLegacySections\",\"URI\",\"UserAgent\",\"Vector\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ButtonGroup\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Parent\"), m = b(\"SelectorDeprecated\"), n = b(\"Style\"), o = b(\"SubscriptionsHandler\"), p = b(\"TimelineConstants\"), q = b(\"TimelineController\"), r = b(\"TimelineLegacySections\"), s = b(\"URI\"), t = b(\"UserAgent\"), u = b(\"Vector\"), v = b(\"ge\"), w = b(\"tx\"), x = false, y, z, aa, ba, ca, da, ea, fa, ga, ha, ia, ja = {\n    }, ka = {\n    }, la = [], ma = false, na = [], oa = [], pa, qa = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",];\n    function ra() {\n        var fb = m.getSelectorMenu(da);\n        pa.addSubscriptions(g.listen(fb, \"click\", sa), h.subscribe(p.SECTION_LOADED, wa));\n    };\n;\n    function sa(JSBNG__event) {\n        var fb = l.byTag(JSBNG__event.getTarget(), \"a\");\n        if (fb) {\n            var gb = fb.getAttribute(\"data-key\");\n            q.stickyHeaderNavWasClicked(gb);\n            q.navigateToSection(gb);\n            JSBNG__event.prevent();\n        }\n    ;\n    ;\n    };\n;\n    function ta(fb, gb) {\n        var hb = m.getValue(gb);\n        if (((hb === \"allStories\"))) {\n            r.get(fb).expandSubSections();\n        }\n    ;\n    ;\n        if (((hb !== \"activityLog\"))) {\n            ua(gb);\n        }\n    ;\n    ;\n    };\n;\n    function ua(fb) {\n        db(fb, \"highlights\");\n        db(fb, \"allStories\");\n        var gb = k.JSBNG__find(fb, \"li.separator\");\n        j.conditionShow(gb, gb.previousSibling);\n    };\n;\n    function va(fb) {\n        if (((ga[fb] && !z.custom_subsection_menu))) {\n            ab(fb);\n        }\n         else xa();\n    ;\n    ;\n        q.adjustStickyHeaderWidth();\n    };\n;\n    function wa(fb, gb) {\n        var hb = gb.key;\n        if (ha[hb]) {\n            bb(hb);\n            va(hb);\n        }\n    ;\n    ;\n    };\n;\n    function xa() {\n        ba.hideItem(ea);\n    };\n;\n    function ya(fb) {\n        var gb = fb.split(\"_\");\n        return qa[((gb.pop() - 1))];\n    };\n;\n    function za(fb) {\n        var gb = fa[fb], hb = ga[fb];\n        if (((!gb && hb))) {\n            gb = fa[fb] = ea.cloneNode(true);\n            var ib = k.scry(gb, \"li.activityLog a\")[0];\n            if (ib) {\n                ib.href = s(ib.href).addQueryData({\n                    key: fb\n                });\n            }\n        ;\n        ;\n            var jb = q.getCurrentScrubber();\n            if (hb.length) {\n                j.show(k.JSBNG__find(gb, \"li.separator\"));\n            }\n        ;\n        ;\n            for (var kb = 0; ((kb < hb.length)); kb++) {\n                var lb = hb[kb].scrubberKey, mb = ((jb ? jb.getLabelForSubnav(hb[kb].parentKey, lb) : mb = ya(lb)));\n                if (mb) {\n                    cb(gb, {\n                        key: lb,\n                        label: mb\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            pa.addSubscriptions(m.listen(gb, \"change\", ta.curry(fb, gb)), g.listen(gb, \"click\", sa));\n        }\n    ;\n    ;\n        return gb;\n    };\n;\n    function ab(fb) {\n        var gb = za(fb);\n        k.insertAfter(ea, gb);\n        j.hide(ea);\n        {\n            var fin265keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin265i = (0);\n            var hb;\n            for (; (fin265i < fin265keys.length); (fin265i++)) {\n                ((hb) = (fin265keys[fin265i]));\n                {\n                    var ib = fa[hb];\n                    j.conditionShow(ib, ((ib === gb)));\n                };\n            };\n        };\n    ;\n        ba.showItem(ea);\n    };\n;\n    function bb(fb) {\n        ga[fb] = r.get(fb).subSections;\n    };\n;\n    function cb(fb, gb) {\n        var hb = k.create(\"a\", {\n            href: \"#\",\n            rel: \"ignore\",\n            className: \"itemAnchor\",\n            tabIndex: 0\n        }, k.create(\"span\", {\n            className: \"itemLabel fsm\"\n        }, gb.label));\n        hb.setAttribute(\"data-key\", gb.key);\n        hb.setAttribute(\"aria-checked\", false);\n        var ib = k.create(\"li\", {\n            className: \"uiMenuItem uiMenuItemRadio uiSelectorOption\"\n        }, hb);\n        ib.setAttribute(\"data-label\", gb.label);\n        var jb = k.JSBNG__find(fb, \"ul.uiMenuInner\"), kb = k.create(\"option\", {\n            value: gb.key\n        }, gb.label), lb = k.JSBNG__find(fb, \"select\");\n        if (((gb.key === \"recent\"))) {\n            k.prependContent(jb, ib);\n            k.insertAfter(lb.options[0], kb);\n        }\n         else {\n            k.appendContent(jb, ib);\n            k.appendContent(lb, kb);\n        }\n    ;\n    ;\n    };\n;\n    function db(fb, gb) {\n        var hb = k.scry(fb, \"li.uiMenuItem\");\n        if (!hb) {\n            return;\n        }\n    ;\n    ;\n        for (var ib = 0; ((ib < hb.length)); ib++) {\n            var jb = hb[ib];\n            if (((j.hasClass(jb, gb) || ((jb.firstChild.getAttribute(\"data-key\") == gb))))) {\n                k.remove(jb);\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        var kb = k.JSBNG__find(fb, \"select\"), lb = k.scry(kb, \"option\");\n        for (ib = 0; ((ib < lb.length)); ib++) {\n            if (((lb[ib].value === gb))) {\n                k.remove(lb[ib]);\n                return;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    var eb = {\n        init: function(fb, gb) {\n            if (x) {\n                return;\n            }\n        ;\n        ;\n            x = true;\n            y = fb;\n            z = ((gb || {\n            }));\n            ca = k.JSBNG__find(y, \"div.pageMenu\");\n            da = k.JSBNG__find(y, \"div.sectionMenu\");\n            ea = k.JSBNG__find(y, \"div.subsectionMenu\");\n            ia = k.JSBNG__find(ca, \"li.uiMenuSeparator\");\n            ba = i.getInstance(ca);\n            pa = new o();\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            eb.adjustMenuHeights();\n            ra();\n            q.register(q.STICKY_HEADER_NAV, eb);\n            oa.forEach(function(hb) {\n                hb();\n            });\n        },\n        reset: function() {\n            x = false;\n            z = {\n            };\n            la = [];\n            ja = {\n            };\n            ka = {\n            };\n            ma = false;\n            na = [];\n            y = null;\n            ca = null;\n            da = null;\n            ea = null;\n            ia = null;\n            fa = {\n            };\n            ga = {\n            };\n            ha = {\n            };\n            pa.release();\n        },\n        addTimePeriod: function(fb) {\n            var gb = q.getCurrentScrubber();\n            if (!gb) {\n                return;\n            }\n        ;\n        ;\n            var hb = gb.getLabelForNav(fb);\n            if (!hb) {\n                return;\n            }\n        ;\n        ;\n            cb(da, {\n                key: fb,\n                label: hb\n            });\n            var ib = k.JSBNG__find(da, \"ul.uiMenuInner\");\n            if (((((fb === \"recent\")) || ((ib.children.length < 2))))) {\n                m.setSelected(da, fb, true);\n            }\n        ;\n        ;\n        },\n        updateSection: function(fb, gb) {\n            if (gb) {\n                var hb = za(fb);\n                if (hb) {\n                    m.setSelected(hb, gb);\n                    ua(hb);\n                }\n                 else aa = fb;\n            ;\n            ;\n            }\n             else {\n                ha[fb] = true;\n                bb(fb);\n            }\n        ;\n        ;\n            m.setSelected(da, fb, true);\n            va(fb);\n        },\n        adjustMenuHeights: function() {\n            if (((t.ie() <= 7))) {\n                return;\n            }\n        ;\n        ;\n            [ca,da,].forEach(function(fb) {\n                var gb = \"\";\n                if (!j.hasClass(JSBNG__document.documentElement, \"tinyViewport\")) {\n                    gb = ((((u.getViewportDimensions().y - u.getElementDimensions(v(\"blueBar\")).y)) - 80));\n                    gb += \"px\";\n                }\n            ;\n            ;\n                n.set(k.JSBNG__find(fb, \"ul.uiMenuInner\"), \"maxHeight\", gb);\n            });\n        },\n        initPageMenu: function(fb, gb) {\n            if (!x) {\n                oa.push(eb.initPageMenu.curry(fb, gb));\n                return;\n            }\n        ;\n        ;\n            function hb(ib, jb) {\n                ib.forEach(function(kb) {\n                    var lb = ka[kb] = k.create(\"li\");\n                    j.hide(lb);\n                    ((jb ? k.insertBefore(ia, lb) : k.appendContent(k.JSBNG__find(ca, \"ul.uiMenuInner\"), lb)));\n                });\n            };\n        ;\n            hb(fb, true);\n            hb(gb, false);\n            ja.info = k.scry(ca, \"li\")[0];\n            la = gb;\n            ma = true;\n            if (na.length) {\n                na.forEach(function(ib) {\n                    eb.registerPageMenuItem(ib.key, ib.JSBNG__item);\n                });\n            }\n        ;\n        ;\n        },\n        registerPageMenuItem: function(fb, gb) {\n            if (!ma) {\n                na.push({\n                    key: fb,\n                    JSBNG__item: gb\n                });\n                return;\n            }\n        ;\n        ;\n            if (ka[fb]) {\n                k.replace(ka[fb], gb);\n                ja[fb] = gb;\n                delete ka[fb];\n                if (((la.indexOf(fb) >= 0))) {\n                    j.show(ia);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        removeTimePeriod: function(fb) {\n            db(da, fb);\n        }\n    };\n    e.exports = eb;\n});\n__d(\"TimelineScrubber\", [\"JSBNG__Event\",\"JSBNG__CSS\",\"DOM\",\"Focus\",\"Keys\",\"Parent\",\"TimelineController\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"Focus\"), k = b(\"Keys\"), l = b(\"Parent\"), m = b(\"TimelineController\"), n = b(\"Vector\"), o = b(\"copyProperties\");\n    function p(q) {\n        this._root = q;\n        this._navKeys = {\n        };\n        this._subNavKeys = {\n        };\n        this._rollups = {\n        };\n        this._rolledup = {\n        };\n        var r = q.childNodes;\n        this._currentNav = r[0];\n        for (var s = 0; ((s < r.length)); s++) {\n            var t = r[s].getAttribute(\"data-key\");\n            this._navKeys[t] = r[s];\n            var u = i.scry(r[s], \"ul\");\n            this._subNavKeys[t] = {\n            };\n            if (u.length) {\n                var v = u[0].childNodes;\n                for (var w = 0; ((w < v.length)); w++) {\n                    this._subNavKeys[t][v[w].getAttribute(\"data-key\")] = v[w];\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            var x = r[s].getAttribute(\"data-rollup\");\n            if (x) {\n                this._rollups[x] = ((this._rollups[x] || []));\n                this._rollups[x].push(r[s]);\n            }\n        ;\n        ;\n        };\n    ;\n        this._clickListener = g.listen(this._root, \"click\", this._handleScrub.bind(this));\n        this._focusHandler = g.listen(this._root, \"keydown\", this._moveFocus.bind(this));\n        this._tabbableElement = i.scry(this._root, \"a\")[0];\n        h.show(this._root);\n        var y = ((n.getViewportDimensions().y - this.SCRUBBER_NO_ADS_VERTICAL_BUFFER)), z = this.getHeight();\n        if (((z > y))) {\n            this.fold(((z - y)));\n        }\n    ;\n    ;\n        m.register(m.SCRUBBER, this);\n        m.scrubberHasLoaded(this);\n    };\n;\n    o(p.prototype, {\n        KEY_HEIGHT: 23,\n        SUBKEY_HEIGHT: 16,\n        OFFSET: 38,\n        SCRUBBER_NO_ADS_VERTICAL_BUFFER: 125,\n        reset: function() {\n            this._root = null;\n            this._navKeys = {\n            };\n            this._subNavKeys = {\n            };\n            this._rollups = {\n            };\n            this._rolledup = {\n            };\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getNav: function(q) {\n            return this._navKeys[q];\n        },\n        getSubnav: function(q, r) {\n            return this._subNavKeys[q][r];\n        },\n        getHeight: function() {\n            return this._root.offsetHeight;\n        },\n        getLabelForNav: function(q) {\n            var r = this.getNav(q);\n            return ((r && i.getText(i.scry(r, \"a\")[0])));\n        },\n        getLabelForSubnav: function(q, r) {\n            var s = this.getSubnav(q, r);\n            return ((s && i.getText(i.scry(s, \"a\")[0])));\n        },\n        fold: function(q) {\n            return this._adjustFolding(q, true);\n        },\n        unfold: function(q) {\n            return this._adjustFolding(q, false);\n        },\n        getOffset: function() {\n            return ((((this.OFFSET + ((h.hasClass(JSBNG__document.body, \"hasVoiceBar\") ? 26 : 0)))) + ((h.hasClass(\"rightColContent\", \"pagesTimelineRightColumn\") ? 48 : 0))));\n        },\n        updateSection: function(q, r) {\n            if (!this._navKeys[q]) {\n                return;\n            }\n        ;\n        ;\n            var s = this._navKeys[q].getAttribute(\"data-rollup\");\n            if (((this._currentRollup && ((this._currentRollup != s))))) {\n                h.removeClass(this._currentRollup, \"selected\");\n                h.removeClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                delete this._currentRollup;\n            }\n        ;\n        ;\n            if (((s && this._rolledup[s]))) {\n                var t = this._rolledup[s];\n                if (t.getAttribute(\"data-rollup\")) {\n                    this._currentRollup = t;\n                    h.addClass(this._currentRollup, \"selected\");\n                    h.addClass(i.scry(this._currentRollup, \"ul\")[0], \"loaded\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ((this._currentNav && h.removeClass(this._currentNav, \"selected\")));\n            ((this._currentSubNav && h.removeClass(this._currentSubNav, \"selected\")));\n            this._currentNav = null;\n            this._currentSubNav = null;\n            if (this._navKeys[q]) {\n                this._currentNav = this._navKeys[q];\n                h.addClass(this._currentNav, \"selected\");\n                if (((this.decadesAreSelectable && this._navKeys[r]))) {\n                    this._currentSubNav = this._navKeys[r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                 else if (((r && this._subNavKeys[q][r]))) {\n                    this._currentSubNav = this._subNavKeys[q][r];\n                    h.addClass(this._currentSubNav, \"selected\");\n                }\n                \n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _getRollupSize: function(q) {\n            var r = this._currentNav, s = ((r && r.getAttribute(\"data-rollup\"))), t = ((this.KEY_HEIGHT * ((this._rollups[q].length - 1))));\n            if (((q == s))) {\n                t += ((this.SUBKEY_HEIGHT * i.scry(r, \"li\").length));\n                t -= ((this.SUBKEY_HEIGHT * ((this._rollups[q].length - 1))));\n            }\n        ;\n        ;\n            return t;\n        },\n        _adjustFolding: function(q, r) {\n            var s = q, t = Object.keys(this._rollups);\n            while (((((q > 0)) && t.length))) {\n                var u = t[((r ? \"pop\" : \"shift\"))]();\n                if (((!r == !this._rolledup[u]))) {\n                    continue;\n                }\n            ;\n            ;\n                var v = this._getRollupSize(u);\n                if (((v <= 0))) {\n                    continue;\n                }\n            ;\n            ;\n                if (((!r && ((v > q))))) {\n                    break;\n                }\n            ;\n            ;\n                this[((r ? \"_collapseRollup\" : \"_expandRollup\"))](u);\n                q -= v;\n            };\n        ;\n            return ((s - q));\n        },\n        _collapseRollup: function(q) {\n            var r = this._rollups[q];\n            if (((((!r || ((r.length < 2)))) || this._rolledup[q]))) {\n                return;\n            }\n        ;\n        ;\n            var s = r[0].previousSibling, t = r[0], u = i.create(\"a\", {\n                href: t.firstChild.href,\n                rel: \"ignore\",\n                tabindex: \"-1\"\n            }, [q,]), v = i.create(\"ul\", {\n                className: \"clearfix\"\n            });\n            for (var w = 0; ((w < r.length)); w++) {\n                v.appendChild(r[w]);\n            ;\n            };\n        ;\n            var x = i.create(\"li\", null, [u,v,]);\n            if (this.decadesAreSelectable) {\n                var y = r[((r.length - 1))], z = ((t.getAttribute(\"data-key\") + y.getAttribute(\"data-key\")));\n                x.setAttribute(\"data-start\", y.getAttribute(\"data-start\"));\n                x.setAttribute(\"data-end\", t.getAttribute(\"data-end\"));\n                x.setAttribute(\"data-key\", z);\n                this._navKeys[z] = x;\n            }\n             else x.setAttribute(\"data-key\", t.getAttribute(\"data-key\"));\n        ;\n        ;\n            x.setAttribute(\"data-rollup\", q);\n            if (s) {\n                i.insertAfter(s, x);\n            }\n             else i.prependContent(this._root, x);\n        ;\n        ;\n            this._rolledup[q] = x;\n            this._checkSelection();\n            this._ensureFocusableElementIsVisible();\n        },\n        _expandRollup: function(q) {\n            if (!this._rolledup[q]) {\n                return;\n            }\n        ;\n        ;\n            var r = this._rolledup[q], s = i.scry(r, \"ul\")[0], t = JSBNG__document.createDocumentFragment();\n            while (s.childNodes.length) {\n                t.appendChild(s.firstChild);\n            ;\n            };\n        ;\n            i.replace(r, t);\n            this._rolledup[q] = false;\n            this._checkSelection();\n        },\n        _checkSelection: function() {\n            if (this._currentNav) {\n                var q = ((this._currentSubNav && this._currentSubNav.getAttribute(\"data-key\")));\n                this.updateSection(this._currentNav.getAttribute(\"data-key\"), q);\n            }\n        ;\n        ;\n        },\n        _handleScrub: function(JSBNG__event) {\n            var q = JSBNG__event.getModifiers();\n            if (((((JSBNG__event.isMiddleClick() || q.access)) || q.meta))) {\n                return true;\n            }\n        ;\n        ;\n            var r = l.byTag(JSBNG__event.getTarget(), \"a\"), s = ((r && l.byAttribute(r, \"data-key\")));\n            if (s) {\n                m.scrubberWasClicked(s.getAttribute(\"data-key\"));\n                m.navigateToSection(s.getAttribute(\"data-key\"));\n                return JSBNG__event.prevent();\n            }\n        ;\n        ;\n        },\n        _ensureFocusableElementIsVisible: function() {\n            while (!((this._tabbableElement.offsetHeight || this._tabbableElement.offsetWidth))) {\n                this._tabbableElement.tabIndex = -1;\n                var q = l.byTag(l.byTag(this._tabbableElement, \"li\"), \"li\");\n                this._tabbableElement = i.scry(q, \"a\")[0];\n                this._tabbableElement.tabIndex = 0;\n            };\n        ;\n        },\n        _moveFocus: function(JSBNG__event) {\n            if (JSBNG__event.getModifiers().any) {\n                return;\n            }\n        ;\n        ;\n            var q = g.getKeyCode(JSBNG__event);\n            if (((((q === k.UP)) || ((q === k.DOWN))))) {\n                var r = i.scry(this._root, \"a\").filter(function(u) {\n                    return ((u.offsetHeight || u.offsetWidth));\n                }), s = r.indexOf(this._tabbableElement);\n                if (((s != -1))) {\n                    var t = r[((s + ((((q === k.UP)) ? -1 : 1))))];\n                    if (t) {\n                        t.tabindex = 0;\n                        j.set(t);\n                        this._tabbableElement.tabindex = -1;\n                        this._tabbableElement = t;\n                        JSBNG__event.prevent();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = p;\n});\n__d(\"TimelineMainScrubber\", [\"Arbiter\",\"Class\",\"JSBNG__CSS\",\"DOMQuery\",\"TimelineConstants\",\"TimelineController\",\"TimelineScrubber\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Class\"), i = b(\"JSBNG__CSS\"), j = b(\"DOMQuery\"), k = b(\"TimelineConstants\"), l = b(\"TimelineController\"), m = b(\"TimelineScrubber\"), n = b(\"copyProperties\");\n    function o(p) {\n        this.parent.construct(this, p);\n        this._subscribe = g.subscribe(k.SECTION_LOADED, function(q, r) {\n            var s = this._navKeys[r.key], t = ((s && j.scry(s, \"ul\")[0]));\n            if (t) {\n                i.addClass(t, \"loaded\");\n                l.scrubberHasChangedState();\n                if (r.hideSubSections) {\n                    i.hide(t);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    h.extend(o, m);\n    n(o.prototype, {\n        reset: function() {\n            this.parent.reset();\n            ((this._subscribe && this._subscribe.unsubscribe()));\n        }\n    });\n    e.exports = o;\n});\n__d(\"legacy:TimelineMainScrubber\", [\"TimelineMainScrubber\",], function(a, b, c, d) {\n    a.TimelineMainScrubber = b(\"TimelineMainScrubber\");\n}, 3);\n__d(\"PubcontentPageTimelineChainingController\", [\"Arbiter\",\"AsyncRequest\",\"DOM\",\"PageLikeButton\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"DOM\"), j = b(\"PageLikeButton\"), k = \"fbSuggestionsPlaceHolder\", l = \"/ajax/pages/suggestions_on_liking.php\";\n    m.init = function(n) {\n        if (!this.$PubcontentPageTimelineChainingController0) {\n            this.$PubcontentPageTimelineChainingController0 = new m(n);\n        }\n    ;\n    ;\n    };\n    function m(n) {\n        this.likedPageIDs = {\n        };\n        this.config = n;\n        g.subscribe(j.LIKED, this.onLike.bind(this));\n    };\n;\n    m.prototype.$PubcontentPageTimelineChainingController1 = function(n) {\n        var o = i.scry(JSBNG__document, ((\"#\" + k)));\n        if (((o.length === 0))) {\n            return null;\n        }\n    ;\n    ;\n        return o[0];\n    };\n    m.prototype.onLike = function(n, o) {\n        if (((((((((o.profile_id && o.target)) && o.origin)) && ((o.origin in this.config)))) && !((o.profile_id in this.likedPageIDs))))) {\n            var p = this.$PubcontentPageTimelineChainingController1(o.target);\n            if (!p) {\n                return;\n            }\n        ;\n        ;\n            this.likedPageIDs[o.profile_id] = true;\n            new h().setURI(l).setData({\n                pageid: o.profile_id\n            }).setRelativeTo(p).send();\n        }\n    ;\n    ;\n    };\n    e.exports = m;\n});");
// 14734
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o88,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y4/r/kUk1EmwlmF-.js",o139);
// undefined
o88 = null;
// undefined
o139 = null;
// 15487
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"bmJBG\",]);\n}\n;\n__d(\"ChannelSubdomain\", [\"Cookie\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"JSLogger\"), i = h.create(\"channel\"), j = 7, k = null;\n    function l(o, p) {\n        var q = null, r = m(), s;\n        o--;\n        var t = Math.min(32, (j * o));\n        t = Math.max(t, 1);\n        var u = false;\n        for (var v = 0; (v < 32); v++) {\n            s = (((v + p)) % t);\n            if (!((r & ((1 << s))))) {\n                u = true;\n                break;\n            }\n        ;\n        };\n        if (u) {\n            k = s;\n            q = (k % j);\n            g.set(\"sub\", (r | ((1 << k))));\n        }\n         else {\n            k = -1;\n            q = null;\n            i.error(\"subdomain_overflow\", {\n                slot: k,\n                max: o\n            });\n        }\n    ;\n        return q;\n    };\n    function m() {\n        var o = (g.get(\"sub\") || 0);\n        o = parseInt(o, 10);\n        return (isNaN(o) ? 0 : o);\n    };\n    function n() {\n        if (((k !== null) && (k >= 0))) {\n            var o = (m() & ~((1 << k)));\n            if (o) {\n                g.set(\"sub\", o);\n            }\n             else g.clear(\"sub\");\n        ;\n        }\n    ;\n    };\n    e.exports = {\n        allocate: l,\n        clear: n\n    };\n});\n__d(\"DocRPC\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = {\n        _apis: {\n        },\n        _dispatch: function(i) {\n            var j;\n            try {\n                i = JSON.parse(i);\n            } catch (k) {\n                throw new Error(((\"DocRPC unparsable dispatch: \\\"\" + i) + \"\\\"\"));\n            };\n            if (h._apis.hasOwnProperty(i.api)) {\n                var l = h._apis[i.api];\n                if (l[i.method]) {\n                    j = g.applyWithGuard(l[i.method], l, i.args);\n                };\n            }\n        ;\n            if ((j === undefined)) {\n                j = null;\n            };\n            return JSON.stringify(j);\n        },\n        publish: function(i, j) {\n            h._apis[j] = i;\n        },\n        proxy: function(i, j, k) {\n            var l = {\n            };\n            k.forEach(function(m) {\n                l[m] = function() {\n                    var n = {\n                        api: j,\n                        method: m,\n                        args: Array.prototype.slice.call(arguments)\n                    }, o;\n                    try {\n                        if (i.closed) {\n                            throw new Error(\"DocRPC window closed\")\n                        };\n                        o = i.DocRPC._dispatch(JSON.stringify(n));\n                    } catch (p) {\n                        g.reportError(p);\n                        return;\n                    };\n                    if ((typeof (o) == \"string\")) {\n                        try {\n                            o = JSON.parse(o);\n                        } catch (p) {\n                            throw new Error(((((((\"DocRPC \" + j) + \".\") + m) + \" unparsable return: \\\"\") + o) + \"\\\"\"));\n                        }\n                    };\n                    return o;\n                };\n            });\n            return l;\n        }\n    };\n    e.exports = a.DocRPC = h;\n});\n__d(\"ChannelTransport\", [\"copyProperties\",\"bind\",\"AjaxRequest\",\"URI\",\"JSLogger\",\"DocRPC\",\"ChannelConstants\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"bind\"), i = b(\"AjaxRequest\"), j = b(\"URI\"), k = b(\"JSLogger\"), l = b(\"DocRPC\"), m = b(\"ChannelConstants\"), n = b(\"UserAgent\"), o = k.create(\"channel\");\n    function p() {\n        return (((1048576 * Math.random()) | 0)).toString(36);\n    };\n    function q(y, z) {\n        var aa = y.subdomain;\n        aa = ((aa === null) ? \"\" : ((aa + \"-\")));\n        var ba = new j(z).setDomain(((aa + y.host) + \".facebook.com\")).setPort(y.port).setSecure(j().isSecure());\n        return ba;\n    };\n    function r(y) {\n        var z = {\n            partition: y.partition,\n            cb: p()\n        }, aa = q(y, \"/p\").setQueryData(z);\n        o.log(\"start_p\", {\n            uri: aa.toString()\n        });\n        var ba = new i(\"GET\", aa);\n        if (i.supportsCORS()) {\n            ba.xhr.withCredentials = true;\n        };\n        var ca = function(da) {\n            o.log(\"finish_p\", {\n                xhr: (da.toJSON ? da.toJSON() : da)\n            });\n        };\n        ba.timeout = y.P_TIMEOUT;\n        ba.onError = ba.onSuccess = ca;\n        ba.send();\n    };\n    function s(y, z, aa) {\n        var ba = new Image(), ca = 0, da = function(ga) {\n            ba.abort();\n            return (ga ? z() : aa());\n        };\n        ba.onload = function() {\n            o.log(\"ping_ok\", {\n                duration: (Date.now() - ca)\n            });\n            da(true);\n        };\n        ba.onerror = function() {\n            r(y);\n            da(false);\n        };\n        var ea = setTimeout(ba.onerror, 10000, false);\n        ba.abort = function() {\n            if (ea) {\n                clearTimeout(ea);\n                ea = null;\n            }\n        ;\n            ba.onload = ba.onerror = null;\n        };\n        var fa = {\n            partition: y.partition,\n            cb: p()\n        };\n        ca = Date.now();\n        ba.src = q(y, \"/ping\").setQueryData(fa);\n        return ba;\n    };\n    function t(y, z, aa, ba) {\n        var ca = new Date(), da = ((((ca - y.userActive)) / 1000) | 0);\n        if ((da < 0)) {\n            o.warn(\"idle_regression\", {\n                idleTime: da,\n                now: ca.getTime(),\n                userActive: y.userActive\n            });\n        };\n        var ea = {\n            channel: y.user_channel,\n            seq: y.seq,\n            partition: y.partition,\n            clientid: y.sessionID,\n            cb: p(),\n            idle: da,\n            cap: 0\n        };\n        if ((da < 60)) {\n            ea.state = \"active\";\n        };\n        if (y.streamingCapable) {\n            ea.mode = \"stream\";\n            ea.format = \"json\";\n        }\n    ;\n        if (y.profile) {\n            ea.profile = y.profile;\n        };\n        if ((y.webrtcSupport && (((n.chrome() >= 24) || (n.firefox() >= 22))))) {\n            ea.cap = m.CAPABILITY_VOIP;\n        };\n        var fa = q(y, \"/pull\").setQueryData(ea), ga = new i(\"GET\", fa);\n        if (i.supportsCORS()) {\n            ga.xhr.withCredentials = true;\n        };\n        ga.timeout = (y.streamingCapable ? y.STREAMING_TIMEOUT : y.LONGPOLL_TIMEOUT);\n        ga.onJSON = z;\n        ga.onSuccess = aa;\n        ga.onError = function() {\n            var ha = ((((this.status == 12002) && (this._time >= y.MIN_12002_TIMEOUT))) || (((this.status == 504) && (this._time >= y.MIN_504_TIMEOUT)))), ia = (ha ? aa : ba);\n            return (ia && ia.apply(this, arguments));\n        };\n        ga.send();\n        y.inStreaming = y.streamingCapable;\n        return ga;\n    };\n    function u(y) {\n        this.manager = y;\n        ((this.init && this.init()));\n    };\n    function v(y) {\n        u.apply(this, arguments);\n    };\n    g(v.prototype, {\n        logName: \"CORS\",\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n            if ((y == \"init\")) {\n                setTimeout(h(this.manager, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), 3000, false);\n            };\n            if (!/pull|ping/.test(y)) {\n                return\n            };\n            var aa = this.manager;\n            if ((y == \"ping\")) {\n                this._request = s(z, h(aa, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if ((y == \"pull\")) {\n                this._request = t(z, h(aa, \"_processTransportData\", z.stateId), h(aa, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n        ;\n        }\n    });\n    function w(y) {\n        o.log(\"iframe_init_constructor\");\n        u.apply(this, arguments);\n        this._iframe = document.createElement(\"iframe\");\n        this._iframe.style.display = \"none\";\n        document.body.appendChild(this._iframe);\n        l.publish(this, \"outerTransport\");\n    };\n    g(w.prototype, {\n        logName: \"iframe\",\n        _initIframe: function(y) {\n            o.log(\"iframe_init_start\");\n            window.onchanneliframeready = function() {\n                o.log(\"iframe_resources\");\n                return y.resources;\n            };\n            window.onchanneliframeloaded = function() {\n                o.log(\"iframe_loaded\");\n            };\n            if (y) {\n                this._iframeURI = q(y, y.path);\n                if (y.bustIframe) {\n                    var z = {\n                        partition: y.partition,\n                        cb: p()\n                    };\n                    this._iframeURI.setQueryData(z);\n                }\n            ;\n            }\n             else this._iframeURI = \"about:blank\";\n        ;\n            this._iframeProxy = null;\n            try {\n                this._iframe.contentWindow.location.replace(this._iframeURI);\n                o.log(\"iframe_uri_set\");\n            } catch (aa) {\n                o.error(\"iframe_uri_set_error\", aa);\n                this.exitState({\n                    status: m.ERROR,\n                    stateId: y.stateId\n                }, (aa + \"\"));\n            };\n        },\n        enterState: function(y, z) {\n            if ((y == \"init\")) {\n                this._initIframe(z);\n            }\n             else if (/idle|ping|pull/.test(y)) {\n                if (this._iframeProxy) {\n                    this._iframeProxy.enterState.apply(this._iframeProxy, arguments);\n                }\n                 else if ((y != \"idle\")) {\n                    this.exitState({\n                        status: m.ERROR,\n                        stateId: z.stateId\n                    }, \"iframe not yet loaded\");\n                }\n            ;\n            }\n             else if ((y == \"shutdown\")) {\n                this._initIframe();\n            }\n            \n        ;\n        },\n        _processTransportData: function() {\n            this.manager._processTransportData.apply(this.manager, arguments);\n        },\n        exitState: function(y) {\n            if (((this.manager.state == \"init\") && (y.status == m.OK))) {\n                this._iframeProxy = l.proxy(this._iframe.contentWindow, \"innerTransport\", [\"enterState\",], ((this._iframeURI + \"\")).replace(/iframe.*/, \"\"));\n            };\n            if ((/ping|pull/.test(this.manager.state) && !this._iframeProxy)) {\n                return\n            };\n            this.manager.exitState.apply(this.manager, arguments);\n        }\n    });\n    function x() {\n        this.init = this.init.bind(this);\n        u.apply(this, arguments);\n    };\n    g(x.prototype, {\n        logName: \"iframe(inner)\",\n        init: function() {\n            l.publish(this, \"innerTransport\");\n            try {\n                var z = l.proxy(window.parent, \"outerTransport\", [\"_processTransportData\",\"exitState\",], top.DocRPC.origin);\n                g(this, z);\n                this.exitState({\n                    status: m.OK,\n                    stateId: 1000000\n                });\n            } catch (y) {\n                o.error(\"iframe_inner_init_error\", y);\n            };\n        },\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n            if ((y == \"ping\")) {\n                this._request = s(z, h(this, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if ((y == \"pull\")) {\n                this._request = t(z, h(this, \"_processTransportData\", z.stateId), h(this, \"exitState\", {\n                    status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n        ;\n        }\n    });\n    e.exports = {\n        getURI: q,\n        Transport: u,\n        CORSTransport: v,\n        IframeTransport: w,\n        IframeInnerTransport: x\n    };\n});\n__d(\"MovingStat\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        h = (h || 60000);\n        var i = {\n            t: new Date(),\n            count: 0,\n            v: 0\n        }, j = i, k = 0, l = 0;\n        function m() {\n            var n = (new Date() - h);\n            while (((j && j.next) && (j.t < n))) {\n                k -= j.v;\n                l -= j.count;\n                j = j.next;\n            };\n        };\n        this.add = function(n) {\n            k += n;\n            l++;\n            var o = new Date();\n            if (((o - i.t) < 1000)) {\n                i.v += n;\n                i.count++;\n            }\n             else {\n                i.next = {\n                    t: o,\n                    v: n,\n                    count: 1\n                };\n                i = i.next;\n                m();\n            }\n        ;\n        };\n        this.tally = function(n) {\n            n = (n || 1000);\n            m();\n            return {\n                sum: k,\n                count: l,\n                timeAverage: ((k * n) / h)\n            };\n        };\n    };\n    e.exports = g;\n});\n__d(\"ChannelManager\", [\"Event\",\"function-extensions\",\"AjaxRequest\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"ChannelInitialData\",\"ChannelSubdomain\",\"ChannelTransport\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"MovingStat\",\"PresenceCookieManager\",\"PresenceState\",\"PresenceUtil\",\"Run\",\"SystemEvents\",\"URI\",\"UserActivity\",\"copyProperties\",\"createArrayFrom\",\"ChatVisibility\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"AjaxRequest\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"ChannelConstants\"), l = b(\"ChannelInitialData\"), m = b(\"ChannelSubdomain\"), n = b(\"ChannelTransport\"), o = b(\"Env\"), p = b(\"FBAjaxRequest\"), q = b(\"JSLogger\"), r = b(\"MovingStat\"), s = b(\"PresenceCookieManager\"), t = b(\"PresenceState\"), u = b(\"PresenceUtil\"), v = b(\"Run\"), w = b(\"SystemEvents\"), x = b(\"URI\"), y = b(\"UserActivity\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"ChatVisibility\"), ca, da = q.create(\"channel\"), ea = null;\n    function fa(qa) {\n        ea = qa;\n    };\n    var ga = {\n        idle: {\n            ok: \"init!\"\n        },\n        init: {\n            ok: \"pull!\",\n            error: \"reconnect\",\n            sys_online: \"init\",\n            sys_timetravel: \"init\"\n        },\n        pull: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_missing: \"pull\",\n            error_msg_type: \"pull\",\n            refresh_0: \"reconnect\",\n            refresh_110: \"reconnect\",\n            refresh_111: \"reconnect\",\n            refresh_112: \"pull\",\n            refresh_113: \"pull\",\n            refresh_117: \"reconnect\"\n        },\n        ping: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_stale: \"reconnect!\"\n        },\n        reconnect: {\n            ok: \"init!\",\n            error: \"reconnect\",\n            sys_online: \"reconnect\",\n            sys_timetravel: \"reconnect\"\n        },\n        shutdown: {\n        },\n        _all: {\n            error_max: \"shutdown!\",\n            error_shutdown: \"shutdown!\",\n            sys_owner: \"reconnect\",\n            sys_nonowner: \"idle!\",\n            sys_online: \"ping\",\n            sys_offline: \"idle!\",\n            sys_timetravel: \"ping\"\n        }\n    }, ha = {\n        userActive: (ba.isOnline() ? Date.now() : 0),\n        sessionID: (((Math.random() * 2147483648) | 0)).toString(16),\n        streamingCapable: false,\n        inStreaming: false,\n        LONGPOLL_TIMEOUT: 60000,\n        STREAMING_TIMEOUT: 60000,\n        P_TIMEOUT: 30000,\n        IFRAME_LOAD_TIMEOUT: 30000,\n        MIN_RETRY_INTERVAL: 5000,\n        MAX_RETRY_INTERVAL: 30000,\n        MIN_12002_TIMEOUT: 9000,\n        MIN_504_TIMEOUT: 20000,\n        STALL_THRESHOLD: 180000,\n        JUMPSTART_THRESHOLD: 90000,\n        MIN_INIT_PROBE_DELAY: 3000,\n        INIT_PROBE_DELAY_RANDOMIZE_RANGE: 12000,\n        PROBE_DELAY: 60000,\n        PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n        PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n        STREAMING_EXIT_STATE_ON_CONTINUE: false\n    }, ia = 1, ja = {\n    }, ka = 0;\n    function la() {\n        return (j.lastSuccessTime ? Math.round((((Date.now() - j.lastSuccessTime)) / 1000)) : -1);\n    };\n    function ma() {\n        var qa = {\n        };\n        if (ca.getConfig(\"host\")) {\n            qa[ca.getConfig(\"user_channel\")] = ca.getConfig(\"seq\", 0);\n        };\n        return qa;\n    };\n    function na() {\n        var qa = Date.now(), ra = Date.now(), sa = {\n            total: 0\n        }, ta = \"idle\", ua = false;\n        w.subscribe([w.USER,w.ONLINE,w.TIME_TRAVEL,], function(xa, ya) {\n            pa(true);\n            ra = null;\n            ca.lastPullTime = Date.now();\n            var za;\n            switch (xa) {\n              case w.USER:\n                za = (w.isPageOwner() ? k.SYS_OWNER : k.SYS_NONOWNER);\n                break;\n              case w.ONLINE:\n                za = (ya ? k.SYS_ONLINE : k.SYS_OFFLINE);\n                break;\n              case w.TIME_TRAVEL:\n                za = k.SYS_TIMETRAVEL;\n                break;\n            };\n            ca.exitState({\n                status: za,\n                stateId: ia\n            });\n        });\n        var va = function(xa, ya) {\n            var za = Date.now(), ab;\n            if (ya) {\n                qa = za;\n                ab = (ya.nextState || ya.state);\n            }\n             else ab = ta;\n        ;\n            w.checkTimeTravel();\n            if (ra) {\n                var bb = Math.round((((za - ra)) / 1000));\n                if ((bb > 0)) {\n                    sa[ta] = (((sa[ta] || 0)) + bb);\n                    sa.total += bb;\n                }\n            ;\n            }\n        ;\n            ta = ab;\n            ra = za;\n            if (!xa) {\n                sa.lastSuccessTime = la();\n                sa.online = w.isOnline();\n                da.log(\"rollup\", sa);\n            }\n        ;\n        };\n        i.subscribe(k.ON_ENTER_STATE, va);\n        setInterval(va, 60000, false);\n        i.subscribe(q.DUMP_EVENT, function(xa, ya) {\n            ya.channelRollup = sa;\n        });\n        var wa = function() {\n            if ((ca.isShutdown() || ca.shouldIdle())) {\n                return\n            };\n            w.checkTimeTravel();\n            var xa = (Date.now() - ((ca.lastPullTime || o.start)));\n            if ((!ua && (xa > ha.STALL_THRESHOLD))) {\n                var ya = la();\n                da.error(\"stall\", {\n                    lastSuccessTime: ya,\n                    rollupState: ta\n                });\n                ua = true;\n            }\n        ;\n            var za = (Date.now() - qa);\n            if (((ca.state == \"pull\") && (za > ha.JUMPSTART_THRESHOLD))) {\n                qa = null;\n                da.warn(\"jumpstart\", {\n                    state: ca.state,\n                    dormant: za\n                });\n                ca.enterState(\"init\");\n            }\n        ;\n        };\n        setInterval(wa, 10000, false);\n    };\n    function oa() {\n        var qa = Date.now(), ra = 1;\n        function sa() {\n            setTimeout(sa, (ra * 1000), false);\n            var xa = ca.state;\n            if (((xa == \"idle\") && ca.shouldIdle())) {\n                return\n            };\n            da.bump(\"conn_t\", ra);\n            if ((xa == \"pull\")) {\n                da.bump(\"conn_t_pull\", ra);\n            };\n        };\n        sa();\n        var ta = [15,30,60,120,240,], ua = false, va = false;\n        function wa(xa) {\n            setTimeout(function() {\n                da.rate((\"pullenter_\" + xa), ua);\n                da.rate((\"pullexit_\" + xa), va);\n            }, (xa * 1000), false);\n        };\n        while (ta.length) {\n            wa(ta.shift());;\n        };\n        i.subscribe(k.ON_ENTER_STATE, function(xa, ya) {\n            if ((ya.state == \"pull\")) {\n                ua = true;\n            };\n            qa = Date.now();\n        });\n        i.subscribe(k.ON_EXIT_STATE, function(xa, ya) {\n            if (((ya.state != \"pull\") || !qa)) {\n                return\n            };\n            var za = \"other\";\n            if ((ya.status == k.OK)) {\n                va = true;\n                za = \"ok\";\n            }\n             else if ((ya.xhr && ya.xhr.errorType)) {\n                za = (/ar:(\\w+)/.test(ya.xhr.errorType) && RegExp.$1);\n            }\n             else if (/^sys_/.test(ya.status)) {\n                return\n            }\n            \n        ;\n            var ab = (((Date.now() - qa)) / 1000);\n            if ((ab < 0)) {\n                return;\n            }\n             else if ((ab > 3600)) {\n                ab = 3600;\n            }\n        ;\n            da.bump(\"conn_num\");\n            da.bump(\"conn_exit\", ab);\n            da.bump((\"conn_num_\" + za));\n            da.bump((\"conn_exit_\" + za), ab);\n        });\n    };\n    function pa(qa) {\n        if (qa) {\n            ka = 0;\n            ja = {\n            };\n        }\n         else ka++;\n    ;\n    };\n    ca = {\n        state: \"idle\",\n        nextState: null,\n        lastPullTime: Date.now(),\n        heartbeats: [],\n        setTestCallback: fa,\n        init: function(qa) {\n            this.init = function() {\n            \n            };\n            if ((typeof (y) != \"undefined\")) {\n                y.subscribe(function() {\n                    if (ba.isOnline()) {\n                        ha.userActive = Date.now();\n                    };\n                }.bind(this));\n            }\n             else da.error(\"user_activity_undefined\");\n        ;\n            s.register(\"ch\", ma);\n            var ra = this.getConfig(\"max_conn\", 2), sa = Math.floor((Math.random() * 32));\n            ha.subdomain = m.allocate(ra, sa);\n            if ((typeof window.onpageshow != \"undefined\")) {\n                g.listen(window, \"pagehide\", m.clear);\n            }\n             else v.onUnload(m.clear);\n        ;\n            this._transportRate = new r(30000);\n            var ta = (((h.supportsCORS() && !ha.forceIframe)) ? \"CORSTransport\" : \"IframeTransport\");\n            this.transport = new n[ta](this);\n            if (qa) {\n                this.enterState.apply(this, arguments);\n            };\n            i.subscribe(q.DUMP_EVENT, function(event, va) {\n                va.transportRate = this._transportRate.tally();\n                va.transportType = ta;\n                va.transportVersion = 2;\n            }.bind(this));\n            na();\n            oa();\n            if ((((ca.getConfig(\"tryStreaming\") && ca.getConfig(\"host\")) && h.supportsCORS()) && !ha.forceIframe)) {\n                var ua = (ha.MIN_INIT_PROBE_DELAY + (Math.random() * ha.INIT_PROBE_DELAY_RANDOMIZE_RANGE));\n                setTimeout(this._probeTest, ua, false);\n            }\n        ;\n        },\n        configure: function() {\n            var qa = aa(arguments);\n            da.log(\"configure\", qa);\n            qa.forEach(z.bind(null, ha));\n            i.inform(k.ON_CONFIG, this);\n        },\n        getConfig: function(qa, ra) {\n            return ((qa in ha) ? ha[qa] : ra);\n        },\n        isShutdown: function() {\n            return (this.state == \"shutdown\");\n        },\n        shouldIdle: function() {\n            return !((w.isPageOwner() && w.isOnline()));\n        },\n        _sendIframeError: function(qa) {\n            var ra = new j().setURI(\"/ajax/presence/reconnect.php\").setData({\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            }).setOption(\"suppressErrorHandlerWarning\", true).setOption(\"retries\", 1).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true);\n            (ra.specifiesWriteRequiredParams() && ra.send());\n        },\n        _getDelay: function() {\n            var qa = Math.min((ha.MIN_RETRY_INTERVAL * Math.pow(2, Math.max(0, (ka - 1)))), ha.MAX_RETRY_INTERVAL);\n            return ((qa * ((13517 + (Math.random() / 2)))) | 0);\n        },\n        enterState: function() {\n            if (this._inEnterState) {\n                da.warn(\"enterstate_recursion\");\n            };\n            this._inEnterState = true;\n            try {\n                this._enterState.apply(this, arguments);\n                this._inEnterState = false;\n            } catch (qa) {\n                this._inEnterState = false;\n                throw qa;\n            };\n        },\n        _enterState: function(qa) {\n            var ra = 0, sa = aa(arguments);\n            if (this.isShutdown()) {\n                return\n            };\n            if (((qa != \"idle!\") && this.shouldIdle())) {\n                return\n            };\n            ia++;\n            ha.stateId = ia;\n            clearTimeout(this._deferredTransition);\n            this._deferredTransition = null;\n            this.transport.enterState(\"idle\");\n            this.state = \"idle\";\n            this.nextState = null;\n            if (/!$/.test(qa)) {\n                var ta = this._transportRate.tally().timeAverage, ua = ca.getConfig(\"MAX_CHANNEL_STATES_PER_SEC\", 1);\n                if ((ta >= ua)) {\n                    if (!this._throttled) {\n                        this._throttled = true;\n                        da.warn(\"throttled\");\n                    }\n                ;\n                    da.bump(\"throttle\");\n                    ra = (1000 / ua);\n                }\n            ;\n            }\n             else if (!(/#$/.test(qa))) {\n                ra = this._getDelay();\n            }\n        ;\n            qa = qa.replace(/\\W*$/, \"\");\n            if (!ga[qa]) {\n                throw new Error((\"invalid state:\" + qa))\n            };\n            var va;\n            if ((ra <= 0)) {\n                va = {\n                    state: qa\n                };\n                this._transportRate.add(1);\n                this.state = qa;\n                var wa = this[(\"_enter_\" + this.state)];\n                if (wa) {\n                    sa.shift();\n                    wa.apply(this, sa);\n                }\n            ;\n                if (/init|idle|pull|ping/.test(this.state)) {\n                    if ((ha.streamingCapable && /pull/.test(this.state))) {\n                        this.heartbeats = [];\n                    };\n                    this.transport.enterState(this.state, ha);\n                    if ((this.state == \"ping\")) {\n                        va.url = n.getURI(ha).toString();\n                        va.port = (ha.port || \"undefined\");\n                    }\n                ;\n                }\n            ;\n            }\n             else {\n                this.state = \"idle\";\n                this.nextState = qa;\n                va = {\n                    state: this.state,\n                    delay: ra,\n                    nextState: qa\n                };\n                sa[0] = (qa + \"#\");\n                this._deferredTransition = (function() {\n                    this._deferredTransition = null;\n                    this.enterState.apply(this, sa);\n                }).bind(this).defer(ra, false);\n            }\n        ;\n            if (/pull/.test(qa)) {\n                va.client_id = ha.sessionID;\n                va.streaming = ha.inStreaming;\n            }\n        ;\n            da.log((\"enter_\" + this.state), va);\n            i.inform(k.ON_ENTER_STATE, va);\n        },\n        exitState: function(qa, ra) {\n            var sa = qa.stateId, ta = qa.status;\n            if ((this.isShutdown() || (sa < ia))) {\n                return\n            };\n            var ua = aa(arguments), va = this.state;\n            ua[0] = qa.status;\n            var wa = {\n                state: va,\n                status: ta\n            };\n            if (/pull/.test(va)) {\n                wa.client_id = ha.sessionID;\n                wa.streaming = ha.inStreaming;\n            }\n        ;\n            if ((/ping/.test(va) && (ta != k.OK))) {\n                wa.url = n.getURI(ha).toString();\n            };\n            if (this.nextState) {\n                wa.nextState = this.nextState;\n            };\n            if ((ra && ra.errorType)) {\n                wa.xhr = (ra.toJSON ? ra.toJSON() : ra);\n                delete wa.xhr.json;\n            }\n        ;\n            if ((ra && ra.json)) {\n                if (ra.json.t) {\n                    wa.t = ra.json.t;\n                };\n                if (ra.json.reason) {\n                    wa.reason = ra.json.reason;\n                };\n                if (ra.json.seq) {\n                    wa.seq = ra.json.seq;\n                };\n            }\n        ;\n            da.log((\"exit_\" + va), wa);\n            i.inform(k.ON_EXIT_STATE, wa);\n            var xa = this[(\"_exit_\" + va)];\n            if (xa) {\n                ta = (xa.apply(this, ua) || ta);\n            };\n            if ((ta != k.OK)) {\n                pa();\n                ja[va] = (((ja[va] || 0)) + 1);\n            }\n        ;\n            var ya = (ga[(this.nextState || va)][ta] || ga._all[ta]), za = (ya && ya.replace(/!*$/, \"\"));\n            if (!za) {\n                da.error(\"terminal_transition\", wa);\n                this._shutdownHint = k.HINT_INVALID_STATE;\n                ya = \"shutdown!\";\n            }\n        ;\n            this._lastState = va;\n            this._lastStatus = ta;\n            this.enterState(ya);\n        },\n        _processTransportData: function(qa, ra) {\n            var sa = ra.json, ta = sa.t;\n            if ((\"s\" in sa)) {\n                sa.seq = sa.s;\n                delete sa.s;\n            }\n        ;\n            var ua = ha.seq;\n            if ((\"seq\" in sa)) {\n                ha.seq = sa.seq;\n                t.doSync();\n            }\n        ;\n            switch (ta) {\n              case \"continue\":\n                if ((ha.inStreaming && (this.heartbeats.length < 1))) {\n                    ha.streamingCapable = false;\n                    da.log(\"switch_to_longpoll\");\n                    setTimeout(this._probeTest, ha.PROBE_DELAY, false);\n                }\n            ;\n                pa(true);\n                if ((!ha.inStreaming || ha.STREAMING_EXIT_STATE_ON_CONTINUE)) {\n                    this.exitState({\n                        status: k.OK,\n                        stateId: qa\n                    });\n                };\n                break;\n              case \"refresh\":\n            \n              case \"refreshDelay\":\n                this.exitState({\n                    status: (\"refresh_\" + ((sa.reason || 0))),\n                    stateId: qa\n                }, ra);\n                break;\n              case \"fullReload\":\n                s.clear();\n                da.log(\"invalid_history\");\n                i.inform(k.ON_INVALID_HISTORY);\n                this.exitState({\n                    status: k.ERROR_MISSING,\n                    stateId: qa\n                }, ra);\n                break;\n              case \"msg\":\n                var va, wa, xa, ya;\n                pa(true);\n                wa = sa.ms;\n                xa = (ha.seq - wa.length);\n                for (va = 0; (va < wa.length); va++, xa++) {\n                    if ((xa >= ua)) {\n                        ya = wa[va];\n                        if (ya.type) {\n                            if (((ya.type === \"messaging\") && ya.message)) {\n                                var za = (ya.unread_counts && ya.unread_counts.inbox);\n                                da.debug(\"message\", {\n                                    type: \"messaging\",\n                                    inbox_unread: za,\n                                    tid: ya.message.tid,\n                                    mid: ya.message.mid\n                                });\n                            }\n                             else if ((ya.type === \"m_messaging\")) {\n                                da.debug(\"message\", {\n                                    type: \"m_messaging\",\n                                    tid: ya.tid,\n                                    mid: ya.uuid\n                                });\n                            }\n                             else da.debug(\"message\", {\n                                type: ya.type\n                            });\n                            \n                        ;\n                            i.inform(k.getArbiterType(ya.type), {\n                                obj: ya\n                            });\n                        }\n                    ;\n                    }\n                     else da.warn(\"seq_regression\", {\n                        seq: xa,\n                        last_seq: ua,\n                        messages: wa.length\n                    });\n                ;\n                };\n                break;\n              case \"heartbeat\":\n                if (ha.inStreaming) {\n                    var ab = Date.now();\n                    if ((this.heartbeats.length > 0)) {\n                        var bb = (ab - this.heartbeats[(this.heartbeats.length - 1)]);\n                        da.log(\"heartbeat_interval\", {\n                            client_id: ha.sessionID,\n                            interval: bb\n                        });\n                    }\n                ;\n                    this.heartbeats.push(ab);\n                }\n            ;\n                break;\n              default:\n                da.error(\"unknown_msg_type\", {\n                    type: ta\n                });\n                break;\n            };\n        },\n        _enter_init: function() {\n            if ((ja.init >= ca.getConfig(\"MAX_INIT_FAILS\", 2))) {\n                return this.exitState.bind(this, {\n                    status: k.ERROR_MAX,\n                    stateId: ia\n                }).defer()\n            };\n            this._initTimer = this.exitState.bind(this, {\n                status: k.ERROR,\n                stateId: ia\n            }, \"timeout\").defer(ha.IFRAME_LOAD_TIMEOUT, false);\n        },\n        _enter_reconnect: function(qa) {\n            var ra = ia;\n            if (!u.hasUserCookie()) {\n                da.warn(\"no_user_cookie\");\n                (function() {\n                    ca._shutdownHint = k.HINT_AUTH;\n                    ca.exitState({\n                        status: k.ERROR_SHUTDOWN,\n                        stateId: ra\n                    });\n                }).defer();\n                return;\n            }\n        ;\n            var sa = {\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            };\n            if (o.fb_isb) {\n                sa.fb_isb = o.fb_isb;\n            };\n            if (ea) {\n                ea(sa);\n            };\n            var ta = new p(\"GET\", \"/ajax/presence/reconnect.php\", sa);\n            ta.onSuccess = (function() {\n                ca.configure(ta.json);\n                s.store();\n                this.exitState({\n                    status: k.OK,\n                    stateId: ra\n                });\n            }).bind(this);\n            ta.onError = (function() {\n                var ua = (ta.json && ta.json.error);\n                if (((ta.errorType == h.TRANSPORT_ERROR) || (ta.errorType == h.PROXY_ERROR))) {\n                    this._shutdownHint = k.HINT_CONN;\n                };\n                if ((ua && (ua == 1356007))) {\n                    this._shutdownHint = k.HINT_MAINT;\n                }\n                 else if ((((ua == 1357001) || (ua == 1357004)) || (ua == 1348009))) {\n                    this._shutdownHint = k.HINT_AUTH;\n                }\n                 else this._shutdownHint = null;\n                \n            ;\n                this.exitState({\n                    status: (this._shutdownHint ? k.ERROR_SHUTDOWN : k.ERROR),\n                    stateId: ra\n                }, ta);\n            }).bind(this);\n            ta.send();\n        },\n        _enter_shutdown: function() {\n            i.inform(k.ON_SHUTDOWN, {\n                reason: this._shutdownHint\n            });\n        },\n        _exit_init: function(qa) {\n            if (this._initTimer) {\n                this._initTimer = clearTimeout(this._initTimer);\n            };\n            if ((qa == k.ERROR_MAX)) {\n                this._sendIframeError(k.reason_IFrameLoadGiveUp);\n            };\n        },\n        _exit_pull: function(qa) {\n            if ((qa == k.OK)) {\n                this.lastPullTime = Date.now();\n            };\n        },\n        _exit_ping: function(qa) {\n            if ((qa == k.OK)) {\n                var ra = (Date.now() - ((this.lastPullTime || o.start)));\n                if ((ra > ha.STALL_THRESHOLD)) {\n                    return k.ERROR_STALE\n                };\n            }\n        ;\n        },\n        _probeTest: function() {\n            ha.streamingCapable = false;\n            var qa = [], ra = {\n                mode: \"stream\",\n                format: \"json\"\n            }, sa = new x(\"/probe\").setDomain((ha.host + \".facebook.com\")).setPort(ha.port).setSecure(x().isSecure()).setQueryData(ra), ta = new h(\"GET\", sa);\n            ta.onJSON = function(ua, va) {\n                if (((ua && ua.json) && (ua.json.t === \"heartbeat\"))) {\n                    qa.push(Date.now());\n                    if ((qa.length >= 2)) {\n                        var wa = (qa[1] - qa[0]);\n                        if (((wa >= ha.PROBE_HEARTBEATS_INTERVAL_LOW) && (wa <= ha.PROBE_HEARTBEATS_INTERVAL_HIGH))) {\n                            ha.streamingCapable = true;\n                            da.log(\"switch_to_streaming\");\n                        }\n                    ;\n                        da.log(\"probe_ok\", {\n                            time: wa\n                        });\n                    }\n                ;\n                }\n            ;\n            };\n            ta.onSuccess = function(ua) {\n                if ((qa.length != 2)) {\n                    ha.streamingCapable = false;\n                    da.error(\"probe_error\", {\n                        error: (\"beats.length = \" + qa.length)\n                    });\n                }\n            ;\n            };\n            ta.onError = function(ua) {\n                ha.streamingCapable = false;\n                da.error(\"probe_error\", ua);\n            };\n            da.log(\"probe_request\");\n            ta.send();\n        }\n    };\n    e.exports = ca;\n    if (l.channelConfig) {\n        ca.configure(l.channelConfig);\n        if (/shutdown/.test(l.state)) {\n            ca._shutdownHint = k[l.reason];\n        };\n        ca.init(l.state, l.reason);\n    }\n;\n});\n__d(\"ChannelConnection\", [\"Arbiter\",\"copyProperties\",\"ChatConfig\",\"Run\",\"SystemEvents\",\"ChannelConstants\",\"ChannelManager\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"ChatConfig\"), j = b(\"Run\"), k = b(\"SystemEvents\"), l = b(\"ChannelConstants\"), m = b(\"ChannelManager\"), n = b(\"JSLogger\"), o = n.create(\"channel_connection\"), p = null, q = null, r = null, s = null, t = 0, u = h(new g(), {\n        CONNECTED: \"chat-connection/connected\",\n        RECONNECTING: \"chat-connection/reconnecting\",\n        SHUTDOWN: \"chat-connection/shutdown\",\n        MUTE_WARNING: \"chat-connection/mute\",\n        UNMUTE_WARNING: \"chat-connection/unmute\"\n    });\n    function v() {\n        if (q) {\n            clearTimeout(q);\n            q = null;\n        }\n    ;\n    };\n    function w() {\n        v();\n        o.log(\"unmute_warning\");\n        u.inform(u.UNMUTE_WARNING);\n    };\n    function x(ba) {\n        v();\n        q = w.defer(ba, false);\n        o.log(\"mute_warning\", {\n            time: ba\n        });\n        u.inform(u.MUTE_WARNING);\n    };\n    function y() {\n        if (r) {\n            clearTimeout(r);\n            r = null;\n        }\n    ;\n    };\n    function z(ba, ca) {\n        y();\n        if (((ba === l.ON_ENTER_STATE) && (((ca.nextState || ca.state)) === \"pull\"))) {\n            if ((s !== u.CONNECTED)) {\n                o.log(\"connected\");\n                var da = !s;\n                s = u.CONNECTED;\n                t = 0;\n                u.inform(u.CONNECTED, {\n                    init: da\n                });\n            }\n        ;\n        }\n         else if (((ba === l.ON_ENTER_STATE) && (((((ca.nextState || ca.state)) === \"ping\") || ((!ca.nextState && (ca.state === \"idle\"))))))) {\n            r = (function() {\n                var ea = null;\n                if (!(((ca.state === \"idle\") && !ca.nextState))) {\n                    ea = ((ca.delay || 0));\n                };\n                o.log(\"reconnecting\", {\n                    delay: ea\n                });\n                if (u.disconnected()) {\n                    o.log(\"reconnecting_ui\", {\n                        delay: ea\n                    });\n                };\n                s = u.RECONNECTING;\n                (((ca.state === \"idle\")) && t++);\n                if ((t > 1)) {\n                    u.inform(u.RECONNECTING, ea);\n                }\n                 else if ((!ca.nextState && (ca.state === \"idle\"))) {\n                    z(ba, ca);\n                }\n            ;\n            }).defer(500, false);\n        }\n         else if ((ba === l.ON_SHUTDOWN)) {\n            o.log(\"shutdown\", {\n                reason: ca.reason\n            });\n            s = u.SHUTDOWN;\n            t = 0;\n            u.inform(u.SHUTDOWN, ca.reason);\n        }\n        \n        \n    ;\n    };\n    function aa(ba) {\n        if (((m.state === \"ping\") || m.isShutdown())) {\n            return\n        };\n        o.log(\"reconnect\", {\n            now: ba\n        });\n        u.inform(u.RECONNECTING, 0);\n        if (!!ba) {\n            if ((p !== null)) {\n                clearTimeout(p);\n                p = null;\n            }\n        ;\n            m.enterState(\"ping!\");\n        }\n         else if (!p) {\n            p = setTimeout(function() {\n                m.enterState(\"ping!\");\n                p = null;\n            }, i.get(\"channel_manual_reconnect_defer_msec\"), false);\n        }\n    ;\n    };\n    if (m.isShutdown()) {\n        z(l.ON_SHUTDOWN, m._shutdownHint);\n    }\n     else z(l.ON_ENTER_STATE, {\n        state: m.state,\n        nextState: m.nextState,\n        delay: 0\n    });\n;\n    g.subscribe([l.ON_ENTER_STATE,l.ON_SHUTDOWN,], z);\n    k.subscribe(k.TIME_TRAVEL, function() {\n        aa();\n        x(i.get(\"mute_warning_time_msec\"));\n    });\n    j.onBeforeUnload(y, false);\n    h(u, {\n        disconnected: function() {\n            return ((s === u.SHUTDOWN) || ((((s === u.RECONNECTING) && !q) && (t > 1))));\n        },\n        isShutdown: function() {\n            return (s === u.SHUTDOWN);\n        },\n        reconnect: aa,\n        unmuteWarning: w\n    });\n    e.exports = u;\n});\n__d(\"legacy:cookie\", [\"Cookie\",], function(a, b, c, d) {\n    var e = b(\"Cookie\");\n    a.getCookie = e.get;\n    a.setCookie = e.set;\n    a.clearCookie = e.clear;\n}, 3);\n__d(\"LayerHideOnSuccess\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._layer.hide.bind(this._layer));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = h;\n});\n__d(\"Overlay\", [\"Class\",\"CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerButtons\",\"LayerDestroyOnHide\",\"LayerFadeOnHide\",\"LayerFadeOnShow\",\"LayerFormHooks\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"LayerHideOnSuccess\",\"LayerHideOnTransition\",\"LayerTabIsolation\",\"LayerMouseHooks\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Layer\"), l = b(\"LayerButtons\"), m = b(\"LayerDestroyOnHide\"), n = b(\"LayerFadeOnHide\"), o = b(\"LayerFadeOnShow\"), p = b(\"LayerFormHooks\"), q = b(\"LayerHideOnBlur\"), r = b(\"LayerHideOnEscape\"), s = b(\"LayerHideOnSuccess\"), t = b(\"LayerHideOnTransition\"), u = b(\"LayerTabIsolation\"), v = b(\"LayerMouseHooks\"), w = b(\"copyProperties\");\n    function x(y, z) {\n        y = w({\n            buildWrapper: true\n        }, (y || {\n        }));\n        this._shouldBuildWrapper = y.buildWrapper;\n        this.parent.construct(this, y, z);\n    };\n    g.extend(x, k);\n    w(x.prototype, {\n        _configure: function(y, z) {\n            this.parent._configure(y, z);\n            var aa = this.getRoot();\n            this._overlay = (j.scry(aa, \"div.uiOverlay\")[0] || aa);\n            h.hide(aa);\n            j.appendContent(this.getInsertParent(), aa);\n            i.set(this._overlay, \"overlay\", this);\n            var ba = i.get(this._overlay, \"width\");\n            (ba && this.setWidth(ba));\n            if (this.setFixed) {\n                this.setFixed((i.get(this._overlay, \"fixed\") == \"true\"));\n            };\n            if ((i.get(this._overlay, \"fadeonshow\") != \"false\")) {\n                this.enableBehavior(o);\n            };\n            if ((i.get(this._overlay, \"fadeonhide\") != \"false\")) {\n                this.enableBehavior(n);\n            };\n            if ((i.get(this._overlay, \"hideonsuccess\") != \"false\")) {\n                this.enableBehavior(s);\n            };\n            if ((i.get(this._overlay, \"hideonblur\") == \"true\")) {\n                this.enableBehavior(q);\n            };\n            if ((i.get(this._overlay, \"destroyonhide\") != \"false\")) {\n                this.enableBehavior(m);\n            };\n            return this;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([l,p,v,r,t,u,]);\n        },\n        initWithoutBuildingWrapper: function() {\n            this._shouldBuildWrapper = false;\n            return this.init.apply(this, arguments);\n        },\n        _buildWrapper: function(y, z) {\n            z = this.parent._buildWrapper(y, z);\n            if (!this._shouldBuildWrapper) {\n                this._contentRoot = z;\n                return z;\n            }\n        ;\n            this._contentRoot = j.create(\"div\", {\n                className: \"uiOverlayContent\"\n            }, z);\n            return j.create(\"div\", {\n                className: \"uiOverlay\"\n            }, this._contentRoot);\n        },\n        getContentRoot: function() {\n            return this._contentRoot;\n        },\n        destroy: function() {\n            i.remove(this.getRoot(), \"overlay\");\n            this.parent.destroy();\n        }\n    });\n    e.exports = x;\n});\n__d(\"legacy:adware-scanner\", [\"AdwareScaner\",], function(a, b, c, d) {\n    a.AdwareScaner = b(\"AdwareScaner\");\n}, 3);\n__d(\"ContextualDialogFooterLink\", [\"Event\",\"copyProperties\",\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"CSS\"), j = b(\"DOM\");\n    function k(l) {\n        this._layer = l;\n    };\n    h(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var l = this._layer.getRoot(), m = j.scry(l, \".uiContextualDialogFooterLink\")[0], n = \"uiContextualDialogHoverFooterArrow\";\n            this._subscriptions = [g.listen(m, \"mouseenter\", i.addClass.curry(l, n)),g.listen(m, \"mouseleave\", i.removeClass.curry(l, n)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(l) {\n                l.remove();\n            });\n            this._subscriptions = null;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LegacyContextualDialog\", [\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"Bootloader\",\"Class\",\"ContextualDialogFooterLink\",\"ContextualThing\",\"CSS\",\"DataStore\",\"DOM\",\"Event\",\"Locale\",\"Overlay\",\"Parent\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"getOverlayZIndex\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ARIA\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ContextualDialogFooterLink\"), m = b(\"ContextualThing\"), n = b(\"CSS\"), o = b(\"DataStore\"), p = b(\"DOM\"), q = b(\"Event\"), r = b(\"Locale\"), s = b(\"Overlay\"), t = b(\"Parent\"), u = b(\"Style\"), v = b(\"Vector\"), w = b(\"$\"), x = b(\"copyProperties\"), y = b(\"getOverlayZIndex\"), z = b(\"shield\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n    k.extend(aa, s);\n    x(aa, h, {\n        ARROW_OFFSET: 15,\n        ARROW_LENGTH: 16,\n        ARROW_INSET: 22,\n        TOP_MARGIN: 50,\n        BOTTOM_MARGIN: 30,\n        LEFT_MARGIN: 15,\n        RIGHT_MARGIN: 30,\n        MIN_TOP_GAP: 5,\n        POSITION_TO_CLASS: {\n            above: \"uiContextualDialogAbove\",\n            below: \"uiContextualDialogBelow\",\n            left: \"uiContextualDialogLeft\",\n            right: \"uiContextualDialogRight\"\n        },\n        RIGHT_ALIGNED_CLASS: \"uiContextualDialogRightAligned\",\n        ARROW_CLASS: {\n            bottom: \"uiContextualDialogArrowBottom\",\n            top: \"uiContextualDialogArrowTop\",\n            right: \"uiContextualDialogArrowRight\",\n            left: \"uiContextualDialogArrowLeft\"\n        },\n        POSITION_TO_ARROW: {\n            above: \"bottom\",\n            below: \"top\",\n            left: \"right\",\n            right: \"left\"\n        },\n        getInstance: function(ba) {\n            var ca = o.get(ba, \"LegacyContextualDialog\");\n            if (!ca) {\n                var da = t.byClass(ba, \"uiOverlay\");\n                if (da) {\n                    ca = o.get(da, \"overlay\");\n                };\n            }\n        ;\n            return ca;\n        }\n    });\n    x(aa.prototype, {\n        _scrollListener: null,\n        _scrollParent: null,\n        _width: null,\n        _fixed: false,\n        _hasFooter: false,\n        _showSubscription: null,\n        _hideSubscription: null,\n        _setContextSubscription: null,\n        _resizeListener: null,\n        _reflowSubscription: null,\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            var da = this.getRoot(), ea = o.get.curry(da);\n            this.setAlignH(ea(\"alignh\", \"left\"));\n            this.setOffsetX(ea(\"offsetx\", 0));\n            this.setOffsetY(ea(\"offsety\", 0));\n            this.setPosition(ea(\"position\", \"above\"));\n            this._hasFooter = ea(\"hasfooter\", false);\n            if (this._hasFooter) {\n                var fa = p.scry(da, \".uiContextualDialogFooterLink\")[0];\n                (fa && this.enableBehavior(l));\n            }\n        ;\n            this._setContextSubscription = this.subscribe(\"beforeshow\", function() {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n                var ha = ea(\"context\");\n                if (ha) {\n                    this.setContext(w(ha));\n                }\n                 else {\n                    ha = ea(\"contextselector\");\n                    if (ha) {\n                        this.setContext(p.find(document, ha));\n                    };\n                }\n            ;\n            }.bind(this));\n            this._content = p.scry(da, \".uiContextualDialogContent\")[0];\n            if (this._content) {\n                this._content.setAttribute(\"role\", \"dialog\");\n                var ga = p.scry(this._content, \".legacyContextualDialogTitle\")[0];\n                if (ga) {\n                    this._content.setAttribute(\"aria-labelledby\", p.getID(ga));\n                };\n            }\n        ;\n            this._showSubscription = this.subscribe(\"show\", function() {\n                var ha = z(this.updatePosition, this);\n                this._resizeListener = q.listen(window, \"resize\", ha);\n                this._reflowSubscription = g.subscribe(\"reflow\", ha);\n                this._setupScrollListener(this._scrollParent);\n                m.register(da, this.context);\n                g.inform(\"layer_shown\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            this._hideSubscription = this.subscribe(\"hide\", function() {\n                this._teardownResizeAndReflowListeners();\n                this._teardownScrollListener();\n                g.inform(\"layer_hidden\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            return this;\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = this.parent._buildWrapper(ba, ca);\n            if (!this._shouldBuildWrapper) {\n                return da\n            };\n            n.addClass(da, \"uiContextualDialog\");\n            return p.create(\"div\", {\n                className: \"uiContextualDialogPositioner\"\n            }, da);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            return this;\n        },\n        setFixed: function(ba) {\n            ba = !!ba;\n            n.conditionClass(this.getRoot(), \"uiContextualDialogFixed\", ba);\n            this._fixed = ba;\n            return this;\n        },\n        setAlignH: function(ba) {\n            this.alignH = ba;\n            this._updateAlignmentClass();\n            (this._shown && this.updatePosition());\n            (this.position && this._updateArrow());\n            return this;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            return this.context;\n        },\n        setContext: function(ba) {\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n            ba = w(ba);\n            if ((this.context && (this.context != ba))) {\n                o.remove(this.context, \"LegacyContextualDialog\");\n            };\n            this.context = ba;\n            i.setPopup(this.getCausalElement(), this.getRoot());\n            var ca = t.byClass(ba, \"fbPhotoSnowlift\");\n            this.setInsertParent((ca || document.body));\n            if ((this._scrollListener && (this._scrollParent !== ca))) {\n                this._teardownScrollListener();\n                this._setupScrollListener(ca);\n            }\n        ;\n            this._scrollParent = ca;\n            var da = y(ba, this._insertParent);\n            u.set(this.getRoot(), \"z-index\", ((da > 200) ? da : \"\"));\n            o.set(this.context, \"LegacyContextualDialog\", this);\n            return this;\n        },\n        getCausalElement: function() {\n            return (this.parent.getCausalElement() || this.context);\n        },\n        listen: function(ba, ca) {\n            return q.listen(this.getRoot(), ba, ca);\n        },\n        setOffsetX: function(ba) {\n            this.offsetX = (parseInt(ba, 10) || 0);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setOffsetY: function(ba) {\n            this.offsetY = (parseInt(ba, 10) || 0);\n            (this._shown && this.updatePosition());\n            return this;\n        },\n        setPosition: function(ba) {\n            this.position = ba;\n            for (var ca in aa.POSITION_TO_CLASS) {\n                n.conditionClass(this.getRoot(), aa.POSITION_TO_CLASS[ca], (ba == ca));;\n            };\n            this._updateAlignmentClass();\n            (this._shown && this.updatePosition());\n            this._updateArrow();\n            return this;\n        },\n        updatePosition: function() {\n            if (!this.context) {\n                return false\n            };\n            if (this._width) {\n                u.set(this._overlay, \"width\", (this._width + \"px\"));\n            };\n            var ba = (this._fixed ? \"viewport\" : \"document\"), ca = v.getElementPosition(this.context, ba), da = this._scrollParent;\n            if (da) {\n                ca = ca.sub(v.getElementPosition(da, \"document\")).add(da.scrollLeft, da.scrollTop);\n            };\n            var ea = v.getElementDimensions(this.context), fa = ((this.position == \"above\") || (this.position == \"below\")), ga = r.isRTL();\n            if (((((this.position == \"right\") || ((fa && (this.alignH == \"right\"))))) != ga)) {\n                ca = ca.add(ea.x, 0);\n            };\n            if ((this.position == \"below\")) {\n                ca = ca.add(0, ea.y);\n            };\n            var ha = new v(0, 0);\n            if ((fa && (this.alignH == \"center\"))) {\n                ha = ha.add((((ea.x - this._width)) / 2), 0);\n            }\n             else {\n                var ia = (fa ? ea.x : ea.y), ja = (2 * aa.ARROW_INSET);\n                if ((ia < ja)) {\n                    var ka = ((ia / 2) - aa.ARROW_INSET);\n                    if ((fa && (((this.alignH == \"right\") != ga)))) {\n                        ka = -ka;\n                    };\n                    ha = ha.add((fa ? ka : 0), (fa ? 0 : ka));\n                }\n            ;\n            }\n        ;\n            ha = ha.add(this.offsetX, this.offsetY);\n            if (ga) {\n                ha = ha.mul(-1, 1);\n            };\n            ca = ca.add(ha);\n            if (this._fixed) {\n                ca = new v(ca.x, ca.y, \"document\");\n            };\n            ca.setElementPosition(this.getRoot());\n            this._adjustVerticalPosition();\n            this._adjustHorizontalPosition();\n            return true;\n        },\n        scrollTo: function() {\n            if (this.context) {\n                j.loadModules([\"DOMScroll\",], function(ba) {\n                    ba.scrollTo(this.context, true, true);\n                }.bind(this));\n            };\n        },\n        destroy: function() {\n            this.unsubscribe(this._showSubscription);\n            this.unsubscribe(this._hideSubscription);\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n            this._teardownScrollListener();\n            this._teardownResizeAndReflowListeners();\n            (this.context && o.remove(this.context, \"LegacyContextualDialog\"));\n            this.parent.destroy();\n        },\n        _adjustVerticalPosition: function() {\n            if (((this.position != \"left\") && (this.position != \"right\"))) {\n                u.set(this._overlay, \"top\", \"\");\n                return;\n            }\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").y, da = v.getElementDimensions(this._overlay).y, ea = v.getViewportDimensions().y, fa = Math.min(Math.max(ca, aa.MIN_TOP_GAP), aa.TOP_MARGIN), ga = Math.min(Math.max(0, (((ca + da) + aa.BOTTOM_MARGIN) - ea)), Math.max(-fa, (ca - fa)), (da - (2 * aa.ARROW_INSET)));\n            u.set(this._overlay, \"top\", (((-1 * ga)) + \"px\"));\n            u.set(this._arrow, \"top\", (aa.ARROW_OFFSET + \"px\"));\n            u.set(this._arrow, \"marginTop\", (ga + \"px\"));\n        },\n        _adjustHorizontalPosition: function() {\n            if (((((this.position != \"above\") && (this.position != \"below\"))) || (this.alignH != \"left\"))) {\n                u.set(this._overlay, \"left\", \"\");\n                u.set(this._overlay, \"right\", \"\");\n                return;\n            }\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").x, da = v.getElementDimensions(this._overlay).x, ea = v.getViewportDimensions().x, fa = r.isRTL(), ga;\n            if (!fa) {\n                ga = (((ca + da) + aa.RIGHT_MARGIN) - ea);\n            }\n             else ga = ((aa.LEFT_MARGIN + da) - ca);\n        ;\n            ga = Math.min(Math.max(0, ga), (da - (2 * aa.ARROW_INSET)));\n            u.set(this._overlay, (fa ? \"right\" : \"left\"), ((-1 * ga) + \"px\"));\n            u.set(this._arrow, (fa ? \"right\" : \"left\"), (aa.ARROW_OFFSET + \"px\"));\n            u.set(this._arrow, (fa ? \"marginRight\" : \"marginLeft\"), (ga + \"px\"));\n        },\n        _updateArrow: function() {\n            var ba = 0;\n            if (((this.position == \"above\") || (this.position == \"below\"))) {\n                switch (this.alignH) {\n                  case \"center\":\n                    ba = 50;\n                    break;\n                  case \"right\":\n                    ba = 100;\n                    break;\n                }\n            };\n            this._renderArrow(aa.POSITION_TO_ARROW[this.position], ba);\n        },\n        _renderArrow: function(ba, ca) {\n            for (var da in aa.ARROW_CLASS) {\n                n.conditionClass(this._overlay, aa.ARROW_CLASS[da], (ba == da));;\n            };\n            n.conditionClass(this._overlay, \"uiContextualDialogWithFooterArrowBottom\", ((ba == \"bottom\") && this._hasFooter));\n            if ((ba == \"none\")) {\n                return\n            };\n            if (!this._arrow) {\n                this._arrow = p.create(\"i\", {\n                    className: \"uiContextualDialogArrow\"\n                });\n                p.appendContent(this._overlay, this._arrow);\n            }\n        ;\n            u.set(this._arrow, \"top\", \"\");\n            u.set(this._arrow, \"left\", \"\");\n            u.set(this._arrow, \"right\", \"\");\n            u.set(this._arrow, \"margin\", \"\");\n            var ea = ((ba == \"top\") || (ba == \"bottom\")), fa = (ea ? ((r.isRTL() ? \"right\" : \"left\")) : \"top\");\n            ca = (ca || 0);\n            u.set(this._arrow, fa, (ca + \"%\"));\n            var ga = (aa.ARROW_LENGTH + (aa.ARROW_OFFSET * 2)), ha = -((((ga * ca) / 100) - aa.ARROW_OFFSET));\n            u.set(this._arrow, (\"margin-\" + fa), (ha + \"px\"));\n        },\n        _updateAlignmentClass: function() {\n            n.conditionClass(this.getRoot(), aa.RIGHT_ALIGNED_CLASS, ((((this.position == \"above\") || (this.position == \"below\"))) && (this.alignH == \"right\")));\n        },\n        _setupScrollListener: function(ba) {\n            this._scrollListener = q.listen((ba || window), \"scroll\", z(this._adjustVerticalPosition, this));\n        },\n        _teardownScrollListener: function() {\n            if (this._scrollListener) {\n                this._scrollListener.remove();\n                this._scrollListener = null;\n            }\n        ;\n        },\n        _teardownResizeAndReflowListeners: function() {\n            if (this._resizeListener) {\n                this._resizeListener.remove();\n                this._resizeListener = null;\n            }\n        ;\n            if (this._reflowSubscription) {\n                this._reflowSubscription.unsubscribe();\n                this._reflowSubscription = null;\n            }\n        ;\n        }\n    });\n    e.exports = aa;\n});");
// 15488
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s61ecca1a9a9fed1ca3dda5a5bf60e4b4dbc498fc");
// 15489
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"bmJBG\",]);\n}\n;\n;\n__d(\"ChannelSubdomain\", [\"Cookie\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"JSLogger\"), i = h.create(\"channel\"), j = 7, k = null;\n    function l(o, p) {\n        var q = null, r = m(), s;\n        o--;\n        var t = Math.min(32, ((j * o)));\n        t = Math.max(t, 1);\n        var u = false;\n        for (var v = 0; ((v < 32)); v++) {\n            s = ((((v + p)) % t));\n            if (!((r & ((1 << s))))) {\n                u = true;\n                break;\n            }\n        ;\n        ;\n        };\n    ;\n        if (u) {\n            k = s;\n            q = ((k % j));\n            g.set(\"sub\", ((r | ((1 << k)))));\n        }\n         else {\n            k = -1;\n            q = null;\n            i.error(\"subdomain_overflow\", {\n                slot: k,\n                max: o\n            });\n        }\n    ;\n    ;\n        return q;\n    };\n;\n    function m() {\n        var o = ((g.get(\"sub\") || 0));\n        o = parseInt(o, 10);\n        return ((isNaN(o) ? 0 : o));\n    };\n;\n    function n() {\n        if (((((k !== null)) && ((k >= 0))))) {\n            var o = ((m() & ~((1 << k))));\n            if (o) {\n                g.set(\"sub\", o);\n            }\n             else g.clear(\"sub\");\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    e.exports = {\n        allocate: l,\n        clear: n\n    };\n});\n__d(\"DocRPC\", [\"ErrorUtils\",], function(a, b, c, d, e, f) {\n    var g = b(\"ErrorUtils\"), h = {\n        _apis: {\n        },\n        _dispatch: function(i) {\n            var j;\n            try {\n                i = JSON.parse(i);\n            } catch (k) {\n                throw new Error(((((\"DocRPC unparsable dispatch: \\\"\" + i)) + \"\\\"\")));\n            };\n        ;\n            if (h._apis.hasOwnProperty(i.api)) {\n                var l = h._apis[i.api];\n                if (l[i.method]) {\n                    j = g.applyWithGuard(l[i.method], l, i.args);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((j === undefined))) {\n                j = null;\n            }\n        ;\n        ;\n            return JSON.stringify(j);\n        },\n        publish: function(i, j) {\n            h._apis[j] = i;\n        },\n        proxy: function(i, j, k) {\n            var l = {\n            };\n            k.forEach(function(m) {\n                l[m] = function() {\n                    var n = {\n                        api: j,\n                        method: m,\n                        args: Array.prototype.slice.call(arguments)\n                    }, o;\n                    try {\n                        if (i.JSBNG__closed) {\n                            throw new Error(\"DocRPC window closed\");\n                        }\n                    ;\n                    ;\n                        o = i.DocRPC._dispatch(JSON.stringify(n));\n                    } catch (p) {\n                        g.reportError(p);\n                        return;\n                    };\n                ;\n                    if (((typeof (o) == \"string\"))) {\n                        try {\n                            o = JSON.parse(o);\n                        } catch (p) {\n                            throw new Error(((((((((((((\"DocRPC \" + j)) + \".\")) + m)) + \" unparsable return: \\\"\")) + o)) + \"\\\"\")));\n                        };\n                    }\n                ;\n                ;\n                    return o;\n                };\n            });\n            return l;\n        }\n    };\n    e.exports = a.DocRPC = h;\n});\n__d(\"ChannelTransport\", [\"copyProperties\",\"bind\",\"AjaxRequest\",\"URI\",\"JSLogger\",\"DocRPC\",\"ChannelConstants\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"bind\"), i = b(\"AjaxRequest\"), j = b(\"URI\"), k = b(\"JSLogger\"), l = b(\"DocRPC\"), m = b(\"ChannelConstants\"), n = b(\"UserAgent\"), o = k.create(\"channel\");\n    function p() {\n        return ((((1048576 * Math.JSBNG__random())) | 0)).toString(36);\n    };\n;\n    function q(y, z) {\n        var aa = y.subdomain;\n        aa = ((((aa === null)) ? \"\" : ((aa + \"-\"))));\n        var ba = new j(z).setDomain(((((aa + y.host)) + \".facebook.com\"))).setPort(y.port).setSecure(j().isSecure());\n        return ba;\n    };\n;\n    function r(y) {\n        var z = {\n            partition: y.partition,\n            cb: p()\n        }, aa = q(y, \"/p\").setQueryData(z);\n        o.log(\"start_p\", {\n            uri: aa.toString()\n        });\n        var ba = new i(\"GET\", aa);\n        if (i.supportsCORS()) {\n            ba.xhr.withCredentials = true;\n        }\n    ;\n    ;\n        var ca = function(da) {\n            o.log(\"finish_p\", {\n                xhr: ((da.toJSON ? da.toJSON() : da))\n            });\n        };\n        ba.timeout = y.P_TIMEOUT;\n        ba.onError = ba.onSuccess = ca;\n        ba.send();\n    };\n;\n    function s(y, z, aa) {\n        var ba = new JSBNG__Image(), ca = 0, da = function(ga) {\n            ba.abort();\n            return ((ga ? z() : aa()));\n        };\n        ba.JSBNG__onload = function() {\n            o.log(\"ping_ok\", {\n                duration: ((JSBNG__Date.now() - ca))\n            });\n            da(true);\n        };\n        ba.JSBNG__onerror = function() {\n            r(y);\n            da(false);\n        };\n        var ea = JSBNG__setTimeout(ba.JSBNG__onerror, 10000, false);\n        ba.abort = function() {\n            if (ea) {\n                JSBNG__clearTimeout(ea);\n                ea = null;\n            }\n        ;\n        ;\n            ba.JSBNG__onload = ba.JSBNG__onerror = null;\n        };\n        var fa = {\n            partition: y.partition,\n            cb: p()\n        };\n        ca = JSBNG__Date.now();\n        ba.src = q(y, \"/ping\").setQueryData(fa);\n        return ba;\n    };\n;\n    function t(y, z, aa, ba) {\n        var ca = new JSBNG__Date(), da = ((((((ca - y.userActive)) / 1000)) | 0));\n        if (((da < 0))) {\n            o.warn(\"idle_regression\", {\n                idleTime: da,\n                now: ca.getTime(),\n                userActive: y.userActive\n            });\n        }\n    ;\n    ;\n        var ea = {\n            channel: y.user_channel,\n            seq: y.seq,\n            partition: y.partition,\n            clientid: y.sessionID,\n            cb: p(),\n            idle: da,\n            cap: 0\n        };\n        if (((da < 60))) {\n            ea.state = \"active\";\n        }\n    ;\n    ;\n        if (y.streamingCapable) {\n            ea.mode = \"stream\";\n            ea.format = \"json\";\n        }\n    ;\n    ;\n        if (y.profile) {\n            ea.profile = y.profile;\n        }\n    ;\n    ;\n        if (((y.webrtcSupport && ((((n.chrome() >= 24)) || ((n.firefox() >= 22))))))) {\n            ea.cap = m.CAPABILITY_VOIP;\n        }\n    ;\n    ;\n        var fa = q(y, \"/pull\").setQueryData(ea), ga = new i(\"GET\", fa);\n        if (i.supportsCORS()) {\n            ga.xhr.withCredentials = true;\n        }\n    ;\n    ;\n        ga.timeout = ((y.streamingCapable ? y.STREAMING_TIMEOUT : y.LONGPOLL_TIMEOUT));\n        ga.onJSON = z;\n        ga.onSuccess = aa;\n        ga.onError = function() {\n            var ha = ((((((this.JSBNG__status == 12002)) && ((this._time >= y.MIN_12002_TIMEOUT)))) || ((((this.JSBNG__status == 504)) && ((this._time >= y.MIN_504_TIMEOUT)))))), ia = ((ha ? aa : ba));\n            return ((ia && ia.apply(this, arguments)));\n        };\n        ga.send();\n        y.inStreaming = y.streamingCapable;\n        return ga;\n    };\n;\n    function u(y) {\n        this.manager = y;\n        ((this.init && this.init()));\n    };\n;\n    function v(y) {\n        u.apply(this, arguments);\n    };\n;\n    g(v.prototype, {\n        logName: \"CORS\",\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n        ;\n            if (((y == \"init\"))) {\n                JSBNG__setTimeout(h(this.manager, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), 3000, false);\n            }\n        ;\n        ;\n            if (!/pull|ping/.test(y)) {\n                return;\n            }\n        ;\n        ;\n            var aa = this.manager;\n            if (((y == \"ping\"))) {\n                this._request = s(z, h(aa, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if (((y == \"pull\"))) {\n                this._request = t(z, h(aa, \"_processTransportData\", z.stateId), h(aa, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(aa, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n            \n        ;\n        ;\n        }\n    });\n    function w(y) {\n        o.log(\"iframe_init_constructor\");\n        u.apply(this, arguments);\n        this._iframe = JSBNG__document.createElement(\"div\");\n        this._iframe.style.display = \"none\";\n        JSBNG__document.body.appendChild(this._iframe);\n        l.publish(this, \"outerTransport\");\n    };\n;\n    g(w.prototype, {\n        logName: \"div\",\n        _initIframe: function(y) {\n            o.log(\"iframe_init_start\");\n            window.onchanneliframeready = function() {\n                o.log(\"iframe_resources\");\n                return y.resources;\n            };\n            window.onchanneliframeloaded = function() {\n                o.log(\"iframe_loaded\");\n            };\n            if (y) {\n                this._iframeURI = q(y, y.path);\n                if (y.bustIframe) {\n                    var z = {\n                        partition: y.partition,\n                        cb: p()\n                    };\n                    this._iframeURI.setQueryData(z);\n                }\n            ;\n            ;\n            }\n             else this._iframeURI = \"about:blank\";\n        ;\n        ;\n            this._iframeProxy = null;\n            try {\n                this._iframe.contentWindow.JSBNG__location.replace(this._iframeURI);\n                o.log(\"iframe_uri_set\");\n            } catch (aa) {\n                o.error(\"iframe_uri_set_error\", aa);\n                this.exitState({\n                    JSBNG__status: m.ERROR,\n                    stateId: y.stateId\n                }, ((aa + \"\")));\n            };\n        ;\n        },\n        enterState: function(y, z) {\n            if (((y == \"init\"))) {\n                this._initIframe(z);\n            }\n             else if (/idle|ping|pull/.test(y)) {\n                if (this._iframeProxy) {\n                    this._iframeProxy.enterState.apply(this._iframeProxy, arguments);\n                }\n                 else if (((y != \"idle\"))) {\n                    this.exitState({\n                        JSBNG__status: m.ERROR,\n                        stateId: z.stateId\n                    }, \"iframe not yet loaded\");\n                }\n                \n            ;\n            ;\n            }\n             else if (((y == \"shutdown\"))) {\n                this._initIframe();\n            }\n            \n            \n        ;\n        ;\n        },\n        _processTransportData: function() {\n            this.manager._processTransportData.apply(this.manager, arguments);\n        },\n        exitState: function(y) {\n            if (((((this.manager.state == \"init\")) && ((y.JSBNG__status == m.OK))))) {\n                this._iframeProxy = l.proxy(this._iframe.contentWindow, \"innerTransport\", [\"enterState\",], ((this._iframeURI + \"\")).replace(/iframe.*/, \"\"));\n            }\n        ;\n        ;\n            if (((/ping|pull/.test(this.manager.state) && !this._iframeProxy))) {\n                return;\n            }\n        ;\n        ;\n            this.manager.exitState.apply(this.manager, arguments);\n        }\n    });\n    function x() {\n        this.init = this.init.bind(this);\n        u.apply(this, arguments);\n    };\n;\n    g(x.prototype, {\n        logName: \"iframe(inner)\",\n        init: function() {\n            l.publish(this, \"innerTransport\");\n            try {\n                var z = l.proxy(window.parent, \"outerTransport\", [\"_processTransportData\",\"exitState\",], JSBNG__top.DocRPC.origin);\n                g(this, z);\n                this.exitState({\n                    JSBNG__status: m.OK,\n                    stateId: 1000000\n                });\n            } catch (y) {\n                o.error(\"iframe_inner_init_error\", y);\n            };\n        ;\n        },\n        enterState: function(y, z) {\n            if (this._request) {\n                this._request.abort();\n                this._request = null;\n            }\n        ;\n        ;\n            if (((y == \"ping\"))) {\n                this._request = s(z, h(this, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n             else if (((y == \"pull\"))) {\n                this._request = t(z, h(this, \"_processTransportData\", z.stateId), h(this, \"exitState\", {\n                    JSBNG__status: m.OK,\n                    stateId: z.stateId\n                }), h(this, \"exitState\", {\n                    JSBNG__status: m.ERROR,\n                    stateId: z.stateId\n                }));\n            }\n            \n        ;\n        ;\n        }\n    });\n    e.exports = {\n        getURI: q,\n        Transport: u,\n        CORSTransport: v,\n        IframeTransport: w,\n        IframeInnerTransport: x\n    };\n});\n__d(\"MovingStat\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        h = ((h || 60000));\n        var i = {\n            t: new JSBNG__Date(),\n            count: 0,\n            v: 0\n        }, j = i, k = 0, l = 0;\n        function m() {\n            var n = ((new JSBNG__Date() - h));\n            while (((((j && j.next)) && ((j.t < n))))) {\n                k -= j.v;\n                l -= j.count;\n                j = j.next;\n            };\n        ;\n        };\n    ;\n        this.add = function(n) {\n            k += n;\n            l++;\n            var o = new JSBNG__Date();\n            if (((((o - i.t)) < 1000))) {\n                i.v += n;\n                i.count++;\n            }\n             else {\n                i.next = {\n                    t: o,\n                    v: n,\n                    count: 1\n                };\n                i = i.next;\n                m();\n            }\n        ;\n        ;\n        };\n        this.tally = function(n) {\n            n = ((n || 1000));\n            m();\n            return {\n                sum: k,\n                count: l,\n                timeAverage: ((((k * n)) / h))\n            };\n        };\n    };\n;\n    e.exports = g;\n});\n__d(\"ChannelManager\", [\"JSBNG__Event\",\"function-extensions\",\"AjaxRequest\",\"Arbiter\",\"AsyncRequest\",\"ChannelConstants\",\"ChannelInitialData\",\"ChannelSubdomain\",\"ChannelTransport\",\"Env\",\"FBAjaxRequest\",\"JSLogger\",\"MovingStat\",\"PresenceCookieManager\",\"PresenceState\",\"PresenceUtil\",\"Run\",\"SystemEvents\",\"URI\",\"UserActivity\",\"copyProperties\",\"createArrayFrom\",\"ChatVisibility\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"AjaxRequest\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"ChannelConstants\"), l = b(\"ChannelInitialData\"), m = b(\"ChannelSubdomain\"), n = b(\"ChannelTransport\"), o = b(\"Env\"), p = b(\"FBAjaxRequest\"), q = b(\"JSLogger\"), r = b(\"MovingStat\"), s = b(\"PresenceCookieManager\"), t = b(\"PresenceState\"), u = b(\"PresenceUtil\"), v = b(\"Run\"), w = b(\"SystemEvents\"), x = b(\"URI\"), y = b(\"UserActivity\"), z = b(\"copyProperties\"), aa = b(\"createArrayFrom\"), ba = b(\"ChatVisibility\"), ca, da = q.create(\"channel\"), ea = null;\n    function fa(qa) {\n        ea = qa;\n    };\n;\n    var ga = {\n        idle: {\n            ok: \"init!\"\n        },\n        init: {\n            ok: \"pull!\",\n            error: \"reconnect\",\n            sys_online: \"init\",\n            sys_timetravel: \"init\"\n        },\n        pull: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_missing: \"pull\",\n            error_msg_type: \"pull\",\n            refresh_0: \"reconnect\",\n            refresh_110: \"reconnect\",\n            refresh_111: \"reconnect\",\n            refresh_112: \"pull\",\n            refresh_113: \"pull\",\n            refresh_117: \"reconnect\"\n        },\n        ping: {\n            ok: \"pull!\",\n            error: \"ping\",\n            error_stale: \"reconnect!\"\n        },\n        reconnect: {\n            ok: \"init!\",\n            error: \"reconnect\",\n            sys_online: \"reconnect\",\n            sys_timetravel: \"reconnect\"\n        },\n        shutdown: {\n        },\n        _all: {\n            error_max: \"shutdown!\",\n            error_shutdown: \"shutdown!\",\n            sys_owner: \"reconnect\",\n            sys_nonowner: \"idle!\",\n            sys_online: \"ping\",\n            sys_offline: \"idle!\",\n            sys_timetravel: \"ping\"\n        }\n    }, ha = {\n        userActive: ((ba.isOnline() ? JSBNG__Date.now() : 0)),\n        sessionID: ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(16),\n        streamingCapable: false,\n        inStreaming: false,\n        LONGPOLL_TIMEOUT: 60000,\n        STREAMING_TIMEOUT: 60000,\n        P_TIMEOUT: 30000,\n        IFRAME_LOAD_TIMEOUT: 30000,\n        MIN_RETRY_INTERVAL: 5000,\n        MAX_RETRY_INTERVAL: 30000,\n        MIN_12002_TIMEOUT: 9000,\n        MIN_504_TIMEOUT: 20000,\n        STALL_THRESHOLD: 180000,\n        JUMPSTART_THRESHOLD: 90000,\n        MIN_INIT_PROBE_DELAY: 3000,\n        INIT_PROBE_DELAY_RANDOMIZE_RANGE: 12000,\n        PROBE_DELAY: 60000,\n        PROBE_HEARTBEATS_INTERVAL_LOW: 1000,\n        PROBE_HEARTBEATS_INTERVAL_HIGH: 3000,\n        STREAMING_EXIT_STATE_ON_CONTINUE: false\n    }, ia = 1, ja = {\n    }, ka = 0;\n    function la() {\n        return ((j.lastSuccessTime ? Math.round(((((JSBNG__Date.now() - j.lastSuccessTime)) / 1000))) : -1));\n    };\n;\n    function ma() {\n        var qa = {\n        };\n        if (ca.getConfig(\"host\")) {\n            qa[ca.getConfig(\"user_channel\")] = ca.getConfig(\"seq\", 0);\n        }\n    ;\n    ;\n        return qa;\n    };\n;\n    function na() {\n        var qa = JSBNG__Date.now(), ra = JSBNG__Date.now(), sa = {\n            total: 0\n        }, ta = \"idle\", ua = false;\n        w.subscribe([w.USER,w.ONLINE,w.TIME_TRAVEL,], function(xa, ya) {\n            pa(true);\n            ra = null;\n            ca.lastPullTime = JSBNG__Date.now();\n            var za;\n            switch (xa) {\n              case w.USER:\n                za = ((w.isPageOwner() ? k.SYS_OWNER : k.SYS_NONOWNER));\n                break;\n              case w.ONLINE:\n                za = ((ya ? k.SYS_ONLINE : k.SYS_OFFLINE));\n                break;\n              case w.TIME_TRAVEL:\n                za = k.SYS_TIMETRAVEL;\n                break;\n            };\n        ;\n            ca.exitState({\n                JSBNG__status: za,\n                stateId: ia\n            });\n        });\n        var va = function(xa, ya) {\n            var za = JSBNG__Date.now(), ab;\n            if (ya) {\n                qa = za;\n                ab = ((ya.nextState || ya.state));\n            }\n             else ab = ta;\n        ;\n        ;\n            w.checkTimeTravel();\n            if (ra) {\n                var bb = Math.round(((((za - ra)) / 1000)));\n                if (((bb > 0))) {\n                    sa[ta] = ((((sa[ta] || 0)) + bb));\n                    sa.total += bb;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ta = ab;\n            ra = za;\n            if (!xa) {\n                sa.lastSuccessTime = la();\n                sa.online = w.isOnline();\n                da.log(\"rollup\", sa);\n            }\n        ;\n        ;\n        };\n        i.subscribe(k.ON_ENTER_STATE, va);\n        JSBNG__setInterval(va, 60000, false);\n        i.subscribe(q.DUMP_EVENT, function(xa, ya) {\n            ya.channelRollup = sa;\n        });\n        var wa = function() {\n            if (((ca.isShutdown() || ca.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            w.checkTimeTravel();\n            var xa = ((JSBNG__Date.now() - ((ca.lastPullTime || o.start))));\n            if (((!ua && ((xa > ha.STALL_THRESHOLD))))) {\n                var ya = la();\n                da.error(\"stall\", {\n                    lastSuccessTime: ya,\n                    rollupState: ta\n                });\n                ua = true;\n            }\n        ;\n        ;\n            var za = ((JSBNG__Date.now() - qa));\n            if (((((ca.state == \"pull\")) && ((za > ha.JUMPSTART_THRESHOLD))))) {\n                qa = null;\n                da.warn(\"jumpstart\", {\n                    state: ca.state,\n                    dormant: za\n                });\n                ca.enterState(\"init\");\n            }\n        ;\n        ;\n        };\n        JSBNG__setInterval(wa, 10000, false);\n    };\n;\n    function oa() {\n        var qa = JSBNG__Date.now(), ra = 1;\n        function sa() {\n            JSBNG__setTimeout(sa, ((ra * 1000)), false);\n            var xa = ca.state;\n            if (((((xa == \"idle\")) && ca.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            da.bump(\"conn_t\", ra);\n            if (((xa == \"pull\"))) {\n                da.bump(\"conn_t_pull\", ra);\n            }\n        ;\n        ;\n        };\n    ;\n        sa();\n        var ta = [15,30,60,120,240,], ua = false, va = false;\n        function wa(xa) {\n            JSBNG__setTimeout(function() {\n                da.rate(((\"pullenter_\" + xa)), ua);\n                da.rate(((\"pullexit_\" + xa)), va);\n            }, ((xa * 1000)), false);\n        };\n    ;\n        while (ta.length) {\n            wa(ta.shift());\n        ;\n        };\n    ;\n        i.subscribe(k.ON_ENTER_STATE, function(xa, ya) {\n            if (((ya.state == \"pull\"))) {\n                ua = true;\n            }\n        ;\n        ;\n            qa = JSBNG__Date.now();\n        });\n        i.subscribe(k.ON_EXIT_STATE, function(xa, ya) {\n            if (((((ya.state != \"pull\")) || !qa))) {\n                return;\n            }\n        ;\n        ;\n            var za = \"other\";\n            if (((ya.JSBNG__status == k.OK))) {\n                va = true;\n                za = \"ok\";\n            }\n             else if (((ya.xhr && ya.xhr.errorType))) {\n                za = ((/ar:(\\w+)/.test(ya.xhr.errorType) && RegExp.$1));\n            }\n             else if (/^sys_/.test(ya.JSBNG__status)) {\n                return;\n            }\n            \n            \n        ;\n        ;\n            var ab = ((((JSBNG__Date.now() - qa)) / 1000));\n            if (((ab < 0))) {\n                return;\n            }\n             else if (((ab > 3600))) {\n                ab = 3600;\n            }\n            \n        ;\n        ;\n            da.bump(\"conn_num\");\n            da.bump(\"conn_exit\", ab);\n            da.bump(((\"conn_num_\" + za)));\n            da.bump(((\"conn_exit_\" + za)), ab);\n        });\n    };\n;\n    function pa(qa) {\n        if (qa) {\n            ka = 0;\n            ja = {\n            };\n        }\n         else ka++;\n    ;\n    ;\n    };\n;\n    ca = {\n        state: \"idle\",\n        nextState: null,\n        lastPullTime: JSBNG__Date.now(),\n        heartbeats: [],\n        setTestCallback: fa,\n        init: function(qa) {\n            this.init = function() {\n            \n            };\n            if (((typeof (y) != \"undefined\"))) {\n                y.subscribe(function() {\n                    if (ba.isOnline()) {\n                        ha.userActive = JSBNG__Date.now();\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else da.error(\"user_activity_undefined\");\n        ;\n        ;\n            s.register(\"ch\", ma);\n            var ra = this.getConfig(\"max_conn\", 2), sa = Math.floor(((Math.JSBNG__random() * 32)));\n            ha.subdomain = m.allocate(ra, sa);\n            if (((typeof window.JSBNG__onpageshow != \"undefined\"))) {\n                g.listen(window, \"pagehide\", m.clear);\n            }\n             else v.onUnload(m.clear);\n        ;\n        ;\n            this._transportRate = new r(30000);\n            var ta = ((((h.supportsCORS() && !ha.forceIframe)) ? \"CORSTransport\" : \"IframeTransport\"));\n            this.transport = new n[ta](this);\n            if (qa) {\n                this.enterState.apply(this, arguments);\n            }\n        ;\n        ;\n            i.subscribe(q.DUMP_EVENT, function(JSBNG__event, va) {\n                va.transportRate = this._transportRate.tally();\n                va.transportType = ta;\n                va.transportVersion = 2;\n            }.bind(this));\n            na();\n            oa();\n            if (((((((ca.getConfig(\"tryStreaming\") && ca.getConfig(\"host\"))) && h.supportsCORS())) && !ha.forceIframe))) {\n                var ua = ((ha.MIN_INIT_PROBE_DELAY + ((Math.JSBNG__random() * ha.INIT_PROBE_DELAY_RANDOMIZE_RANGE))));\n                JSBNG__setTimeout(this._probeTest, ua, false);\n            }\n        ;\n        ;\n        },\n        configure: function() {\n            var qa = aa(arguments);\n            da.log(\"configure\", qa);\n            qa.forEach(z.bind(null, ha));\n            i.inform(k.ON_CONFIG, this);\n        },\n        getConfig: function(qa, ra) {\n            return ((((qa in ha)) ? ha[qa] : ra));\n        },\n        isShutdown: function() {\n            return ((this.state == \"shutdown\"));\n        },\n        shouldIdle: function() {\n            return !((w.isPageOwner() && w.isOnline()));\n        },\n        _sendIframeError: function(qa) {\n            var ra = new j().setURI(\"/ajax/presence/reconnect.php\").setData({\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            }).setOption(\"suppressErrorHandlerWarning\", true).setOption(\"retries\", 1).setMethod(\"GET\").setReadOnly(true).setAllowCrossPageTransition(true);\n            ((ra.specifiesWriteRequiredParams() && ra.send()));\n        },\n        _getDelay: function() {\n            var qa = Math.min(((ha.MIN_RETRY_INTERVAL * Math.pow(2, Math.max(0, ((ka - 1)))))), ha.MAX_RETRY_INTERVAL);\n            return ((((qa * ((13517 + ((Math.JSBNG__random() / 2)))))) | 0));\n        },\n        enterState: function() {\n            if (this._inEnterState) {\n                da.warn(\"enterstate_recursion\");\n            }\n        ;\n        ;\n            this._inEnterState = true;\n            try {\n                this._enterState.apply(this, arguments);\n                this._inEnterState = false;\n            } catch (qa) {\n                this._inEnterState = false;\n                throw qa;\n            };\n        ;\n        },\n        _enterState: function(qa) {\n            var ra = 0, sa = aa(arguments);\n            if (this.isShutdown()) {\n                return;\n            }\n        ;\n        ;\n            if (((((qa != \"idle!\")) && this.shouldIdle()))) {\n                return;\n            }\n        ;\n        ;\n            ia++;\n            ha.stateId = ia;\n            JSBNG__clearTimeout(this._deferredTransition);\n            this._deferredTransition = null;\n            this.transport.enterState(\"idle\");\n            this.state = \"idle\";\n            this.nextState = null;\n            if (/!$/.test(qa)) {\n                var ta = this._transportRate.tally().timeAverage, ua = ca.getConfig(\"MAX_CHANNEL_STATES_PER_SEC\", 1);\n                if (((ta >= ua))) {\n                    if (!this._throttled) {\n                        this._throttled = true;\n                        da.warn(\"throttled\");\n                    }\n                ;\n                ;\n                    da.bump(\"throttle\");\n                    ra = ((1000 / ua));\n                }\n            ;\n            ;\n            }\n             else if (!(/#$/.test(qa))) {\n                ra = this._getDelay();\n            }\n            \n        ;\n        ;\n            qa = qa.replace(/\\W*$/, \"\");\n            if (!ga[qa]) {\n                throw new Error(((\"invalid state:\" + qa)));\n            }\n        ;\n        ;\n            var va;\n            if (((ra <= 0))) {\n                va = {\n                    state: qa\n                };\n                this._transportRate.add(1);\n                this.state = qa;\n                var wa = this[((\"_enter_\" + this.state))];\n                if (wa) {\n                    sa.shift();\n                    wa.apply(this, sa);\n                }\n            ;\n            ;\n                if (/init|idle|pull|ping/.test(this.state)) {\n                    if (((ha.streamingCapable && /pull/.test(this.state)))) {\n                        this.heartbeats = [];\n                    }\n                ;\n                ;\n                    this.transport.enterState(this.state, ha);\n                    if (((this.state == \"ping\"))) {\n                        va.url = n.getURI(ha).toString();\n                        va.port = ((ha.port || \"undefined\"));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n             else {\n                this.state = \"idle\";\n                this.nextState = qa;\n                va = {\n                    state: this.state,\n                    delay: ra,\n                    nextState: qa\n                };\n                sa[0] = ((qa + \"#\"));\n                this._deferredTransition = (function() {\n                    this._deferredTransition = null;\n                    this.enterState.apply(this, sa);\n                }).bind(this).defer(ra, false);\n            }\n        ;\n        ;\n            if (/pull/.test(qa)) {\n                va.client_id = ha.sessionID;\n                va.streaming = ha.inStreaming;\n            }\n        ;\n        ;\n            da.log(((\"enter_\" + this.state)), va);\n            i.inform(k.ON_ENTER_STATE, va);\n        },\n        exitState: function(qa, ra) {\n            var sa = qa.stateId, ta = qa.JSBNG__status;\n            if (((this.isShutdown() || ((sa < ia))))) {\n                return;\n            }\n        ;\n        ;\n            var ua = aa(arguments), va = this.state;\n            ua[0] = qa.JSBNG__status;\n            var wa = {\n                state: va,\n                JSBNG__status: ta\n            };\n            if (/pull/.test(va)) {\n                wa.client_id = ha.sessionID;\n                wa.streaming = ha.inStreaming;\n            }\n        ;\n        ;\n            if (((/ping/.test(va) && ((ta != k.OK))))) {\n                wa.url = n.getURI(ha).toString();\n            }\n        ;\n        ;\n            if (this.nextState) {\n                wa.nextState = this.nextState;\n            }\n        ;\n        ;\n            if (((ra && ra.errorType))) {\n                wa.xhr = ((ra.toJSON ? ra.toJSON() : ra));\n                delete wa.xhr.json;\n            }\n        ;\n        ;\n            if (((ra && ra.json))) {\n                if (ra.json.t) {\n                    wa.t = ra.json.t;\n                }\n            ;\n            ;\n                if (ra.json.reason) {\n                    wa.reason = ra.json.reason;\n                }\n            ;\n            ;\n                if (ra.json.seq) {\n                    wa.seq = ra.json.seq;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            da.log(((\"exit_\" + va)), wa);\n            i.inform(k.ON_EXIT_STATE, wa);\n            var xa = this[((\"_exit_\" + va))];\n            if (xa) {\n                ta = ((xa.apply(this, ua) || ta));\n            }\n        ;\n        ;\n            if (((ta != k.OK))) {\n                pa();\n                ja[va] = ((((ja[va] || 0)) + 1));\n            }\n        ;\n        ;\n            var ya = ((ga[((this.nextState || va))][ta] || ga._all[ta])), za = ((ya && ya.replace(/!*$/, \"\")));\n            if (!za) {\n                da.error(\"terminal_transition\", wa);\n                this._shutdownHint = k.HINT_INVALID_STATE;\n                ya = \"shutdown!\";\n            }\n        ;\n        ;\n            this._lastState = va;\n            this._lastStatus = ta;\n            this.enterState(ya);\n        },\n        _processTransportData: function(qa, ra) {\n            var sa = ra.json, ta = sa.t;\n            if (((\"s\" in sa))) {\n                sa.seq = sa.s;\n                delete sa.s;\n            }\n        ;\n        ;\n            var ua = ha.seq;\n            if (((\"seq\" in sa))) {\n                ha.seq = sa.seq;\n                t.doSync();\n            }\n        ;\n        ;\n            switch (ta) {\n              case \"continue\":\n                if (((ha.inStreaming && ((this.heartbeats.length < 1))))) {\n                    ha.streamingCapable = false;\n                    da.log(\"switch_to_longpoll\");\n                    JSBNG__setTimeout(this._probeTest, ha.PROBE_DELAY, false);\n                }\n            ;\n            ;\n                pa(true);\n                if (((!ha.inStreaming || ha.STREAMING_EXIT_STATE_ON_CONTINUE))) {\n                    this.exitState({\n                        JSBNG__status: k.OK,\n                        stateId: qa\n                    });\n                }\n            ;\n            ;\n                break;\n              case \"refresh\":\n            \n              case \"refreshDelay\":\n                this.exitState({\n                    JSBNG__status: ((\"refresh_\" + ((sa.reason || 0)))),\n                    stateId: qa\n                }, ra);\n                break;\n              case \"fullReload\":\n                s.clear();\n                da.log(\"invalid_history\");\n                i.inform(k.ON_INVALID_HISTORY);\n                this.exitState({\n                    JSBNG__status: k.ERROR_MISSING,\n                    stateId: qa\n                }, ra);\n                break;\n              case \"msg\":\n                var va, wa, xa, ya;\n                pa(true);\n                wa = sa.ms;\n                xa = ((ha.seq - wa.length));\n                for (va = 0; ((va < wa.length)); va++, xa++) {\n                    if (((xa >= ua))) {\n                        ya = wa[va];\n                        if (ya.type) {\n                            if (((((ya.type === \"messaging\")) && ya.message))) {\n                                var za = ((ya.unread_counts && ya.unread_counts.inbox));\n                                da.debug(\"message\", {\n                                    type: \"messaging\",\n                                    inbox_unread: za,\n                                    tid: ya.message.tid,\n                                    mid: ya.message.mid\n                                });\n                            }\n                             else if (((ya.type === \"m_messaging\"))) {\n                                da.debug(\"message\", {\n                                    type: \"m_messaging\",\n                                    tid: ya.tid,\n                                    mid: ya.uuid\n                                });\n                            }\n                             else da.debug(\"message\", {\n                                type: ya.type\n                            });\n                            \n                        ;\n                        ;\n                            i.inform(k.getArbiterType(ya.type), {\n                                obj: ya\n                            });\n                        }\n                    ;\n                    ;\n                    }\n                     else da.warn(\"seq_regression\", {\n                        seq: xa,\n                        last_seq: ua,\n                        messages: wa.length\n                    });\n                ;\n                ;\n                };\n            ;\n                break;\n              case \"heartbeat\":\n                if (ha.inStreaming) {\n                    var ab = JSBNG__Date.now();\n                    if (((this.heartbeats.length > 0))) {\n                        var bb = ((ab - this.heartbeats[((this.heartbeats.length - 1))]));\n                        da.log(\"heartbeat_interval\", {\n                            client_id: ha.sessionID,\n                            interval: bb\n                        });\n                    }\n                ;\n                ;\n                    this.heartbeats.push(ab);\n                }\n            ;\n            ;\n                break;\n              default:\n                da.error(\"unknown_msg_type\", {\n                    type: ta\n                });\n                break;\n            };\n        ;\n        },\n        _enter_init: function() {\n            if (((ja.init >= ca.getConfig(\"MAX_INIT_FAILS\", 2)))) {\n                return this.exitState.bind(this, {\n                    JSBNG__status: k.ERROR_MAX,\n                    stateId: ia\n                }).defer();\n            }\n        ;\n        ;\n            this._initTimer = this.exitState.bind(this, {\n                JSBNG__status: k.ERROR,\n                stateId: ia\n            }, \"timeout\").defer(ha.IFRAME_LOAD_TIMEOUT, false);\n        },\n        _enter_reconnect: function(qa) {\n            var ra = ia;\n            if (!u.hasUserCookie()) {\n                da.warn(\"no_user_cookie\");\n                (function() {\n                    ca._shutdownHint = k.HINT_AUTH;\n                    ca.exitState({\n                        JSBNG__status: k.ERROR_SHUTDOWN,\n                        stateId: ra\n                    });\n                }).defer();\n                return;\n            }\n        ;\n        ;\n            var sa = {\n                reason: qa,\n                fb_dtsg: o.fb_dtsg\n            };\n            if (o.fb_isb) {\n                sa.fb_isb = o.fb_isb;\n            }\n        ;\n        ;\n            if (ea) {\n                ea(sa);\n            }\n        ;\n        ;\n            var ta = new p(\"GET\", \"/ajax/presence/reconnect.php\", sa);\n            ta.onSuccess = (function() {\n                ca.configure(ta.json);\n                s.store();\n                this.exitState({\n                    JSBNG__status: k.OK,\n                    stateId: ra\n                });\n            }).bind(this);\n            ta.onError = (function() {\n                var ua = ((ta.json && ta.json.error));\n                if (((((ta.errorType == h.TRANSPORT_ERROR)) || ((ta.errorType == h.PROXY_ERROR))))) {\n                    this._shutdownHint = k.HINT_CONN;\n                }\n            ;\n            ;\n                if (((ua && ((ua == 1356007))))) {\n                    this._shutdownHint = k.HINT_MAINT;\n                }\n                 else if (((((((ua == 1357001)) || ((ua == 1357004)))) || ((ua == 1348009))))) {\n                    this._shutdownHint = k.HINT_AUTH;\n                }\n                 else this._shutdownHint = null;\n                \n            ;\n            ;\n                this.exitState({\n                    JSBNG__status: ((this._shutdownHint ? k.ERROR_SHUTDOWN : k.ERROR)),\n                    stateId: ra\n                }, ta);\n            }).bind(this);\n            ta.send();\n        },\n        _enter_shutdown: function() {\n            i.inform(k.ON_SHUTDOWN, {\n                reason: this._shutdownHint\n            });\n        },\n        _exit_init: function(qa) {\n            if (this._initTimer) {\n                this._initTimer = JSBNG__clearTimeout(this._initTimer);\n            }\n        ;\n        ;\n            if (((qa == k.ERROR_MAX))) {\n                this._sendIframeError(k.reason_IFrameLoadGiveUp);\n            }\n        ;\n        ;\n        },\n        _exit_pull: function(qa) {\n            if (((qa == k.OK))) {\n                this.lastPullTime = JSBNG__Date.now();\n            }\n        ;\n        ;\n        },\n        _exit_ping: function(qa) {\n            if (((qa == k.OK))) {\n                var ra = ((JSBNG__Date.now() - ((this.lastPullTime || o.start))));\n                if (((ra > ha.STALL_THRESHOLD))) {\n                    return k.ERROR_STALE;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _probeTest: function() {\n            ha.streamingCapable = false;\n            var qa = [], ra = {\n                mode: \"stream\",\n                format: \"json\"\n            }, sa = new x(\"/probe\").setDomain(((ha.host + \".facebook.com\"))).setPort(ha.port).setSecure(x().isSecure()).setQueryData(ra), ta = new h(\"GET\", sa);\n            ta.onJSON = function(ua, va) {\n                if (((((ua && ua.json)) && ((ua.json.t === \"heartbeat\"))))) {\n                    qa.push(JSBNG__Date.now());\n                    if (((qa.length >= 2))) {\n                        var wa = ((qa[1] - qa[0]));\n                        if (((((wa >= ha.PROBE_HEARTBEATS_INTERVAL_LOW)) && ((wa <= ha.PROBE_HEARTBEATS_INTERVAL_HIGH))))) {\n                            ha.streamingCapable = true;\n                            da.log(\"switch_to_streaming\");\n                        }\n                    ;\n                    ;\n                        da.log(\"probe_ok\", {\n                            time: wa\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n            ta.onSuccess = function(ua) {\n                if (((qa.length != 2))) {\n                    ha.streamingCapable = false;\n                    da.error(\"probe_error\", {\n                        error: ((\"beats.length = \" + qa.length))\n                    });\n                }\n            ;\n            ;\n            };\n            ta.onError = function(ua) {\n                ha.streamingCapable = false;\n                da.error(\"probe_error\", ua);\n            };\n            da.log(\"probe_request\");\n            ta.send();\n        }\n    };\n    e.exports = ca;\n    if (l.channelConfig) {\n        ca.configure(l.channelConfig);\n        if (/shutdown/.test(l.state)) {\n            ca._shutdownHint = k[l.reason];\n        }\n    ;\n    ;\n        ca.init(l.state, l.reason);\n    }\n;\n;\n});\n__d(\"ChannelConnection\", [\"Arbiter\",\"copyProperties\",\"ChatConfig\",\"Run\",\"SystemEvents\",\"ChannelConstants\",\"ChannelManager\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = b(\"ChatConfig\"), j = b(\"Run\"), k = b(\"SystemEvents\"), l = b(\"ChannelConstants\"), m = b(\"ChannelManager\"), n = b(\"JSLogger\"), o = n.create(\"channel_connection\"), p = null, q = null, r = null, s = null, t = 0, u = h(new g(), {\n        CONNECTED: \"chat-connection/connected\",\n        RECONNECTING: \"chat-connection/reconnecting\",\n        SHUTDOWN: \"chat-connection/shutdown\",\n        MUTE_WARNING: \"chat-connection/mute\",\n        UNMUTE_WARNING: \"chat-connection/unmute\"\n    });\n    function v() {\n        if (q) {\n            JSBNG__clearTimeout(q);\n            q = null;\n        }\n    ;\n    ;\n    };\n;\n    function w() {\n        v();\n        o.log(\"unmute_warning\");\n        u.inform(u.UNMUTE_WARNING);\n    };\n;\n    function x(ba) {\n        v();\n        q = w.defer(ba, false);\n        o.log(\"mute_warning\", {\n            time: ba\n        });\n        u.inform(u.MUTE_WARNING);\n    };\n;\n    function y() {\n        if (r) {\n            JSBNG__clearTimeout(r);\n            r = null;\n        }\n    ;\n    ;\n    };\n;\n    function z(ba, ca) {\n        y();\n        if (((((ba === l.ON_ENTER_STATE)) && ((((ca.nextState || ca.state)) === \"pull\"))))) {\n            if (((s !== u.CONNECTED))) {\n                o.log(\"connected\");\n                var da = !s;\n                s = u.CONNECTED;\n                t = 0;\n                u.inform(u.CONNECTED, {\n                    init: da\n                });\n            }\n        ;\n        ;\n        }\n         else if (((((ba === l.ON_ENTER_STATE)) && ((((((ca.nextState || ca.state)) === \"ping\")) || ((!ca.nextState && ((ca.state === \"idle\"))))))))) {\n            r = (function() {\n                var ea = null;\n                if (!((((ca.state === \"idle\")) && !ca.nextState))) {\n                    ea = ((ca.delay || 0));\n                }\n            ;\n            ;\n                o.log(\"reconnecting\", {\n                    delay: ea\n                });\n                if (u.disconnected()) {\n                    o.log(\"reconnecting_ui\", {\n                        delay: ea\n                    });\n                }\n            ;\n            ;\n                s = u.RECONNECTING;\n                ((((ca.state === \"idle\")) && t++));\n                if (((t > 1))) {\n                    u.inform(u.RECONNECTING, ea);\n                }\n                 else if (((!ca.nextState && ((ca.state === \"idle\"))))) {\n                    z(ba, ca);\n                }\n                \n            ;\n            ;\n            }).defer(500, false);\n        }\n         else if (((ba === l.ON_SHUTDOWN))) {\n            o.log(\"shutdown\", {\n                reason: ca.reason\n            });\n            s = u.SHUTDOWN;\n            t = 0;\n            u.inform(u.SHUTDOWN, ca.reason);\n        }\n        \n        \n    ;\n    ;\n    };\n;\n    function aa(ba) {\n        if (((((m.state === \"ping\")) || m.isShutdown()))) {\n            return;\n        }\n    ;\n    ;\n        o.log(\"reconnect\", {\n            now: ba\n        });\n        u.inform(u.RECONNECTING, 0);\n        if (!!ba) {\n            if (((p !== null))) {\n                JSBNG__clearTimeout(p);\n                p = null;\n            }\n        ;\n        ;\n            m.enterState(\"ping!\");\n        }\n         else if (!p) {\n            p = JSBNG__setTimeout(function() {\n                m.enterState(\"ping!\");\n                p = null;\n            }, i.get(\"channel_manual_reconnect_defer_msec\"), false);\n        }\n        \n    ;\n    ;\n    };\n;\n    if (m.isShutdown()) {\n        z(l.ON_SHUTDOWN, m._shutdownHint);\n    }\n     else z(l.ON_ENTER_STATE, {\n        state: m.state,\n        nextState: m.nextState,\n        delay: 0\n    });\n;\n;\n    g.subscribe([l.ON_ENTER_STATE,l.ON_SHUTDOWN,], z);\n    k.subscribe(k.TIME_TRAVEL, function() {\n        aa();\n        x(i.get(\"mute_warning_time_msec\"));\n    });\n    j.onBeforeUnload(y, false);\n    h(u, {\n        disconnected: function() {\n            return ((((s === u.SHUTDOWN)) || ((((((s === u.RECONNECTING)) && !q)) && ((t > 1))))));\n        },\n        isShutdown: function() {\n            return ((s === u.SHUTDOWN));\n        },\n        reconnect: aa,\n        unmuteWarning: w\n    });\n    e.exports = u;\n});\n__d(\"legacy:cookie\", [\"Cookie\",], function(a, b, c, d) {\n    var e = b(\"Cookie\");\n    a.getCookie = e.get;\n    a.setCookie = e.set;\n    a.clearCookie = e.clear;\n}, 3);\n__d(\"LayerHideOnSuccess\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i) {\n        this._layer = i;\n    };\n;\n    g(h.prototype, {\n        _subscription: null,\n        enable: function() {\n            this._subscription = this._layer.subscribe(\"success\", this._layer.hide.bind(this._layer));\n        },\n        disable: function() {\n            if (this._subscription) {\n                this._subscription.unsubscribe();\n                this._subscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = h;\n});\n__d(\"Overlay\", [\"Class\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Layer\",\"LayerButtons\",\"LayerDestroyOnHide\",\"LayerFadeOnHide\",\"LayerFadeOnShow\",\"LayerFormHooks\",\"LayerHideOnBlur\",\"LayerHideOnEscape\",\"LayerHideOnSuccess\",\"LayerHideOnTransition\",\"LayerTabIsolation\",\"LayerMouseHooks\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JSBNG__CSS\"), i = b(\"DataStore\"), j = b(\"DOM\"), k = b(\"Layer\"), l = b(\"LayerButtons\"), m = b(\"LayerDestroyOnHide\"), n = b(\"LayerFadeOnHide\"), o = b(\"LayerFadeOnShow\"), p = b(\"LayerFormHooks\"), q = b(\"LayerHideOnBlur\"), r = b(\"LayerHideOnEscape\"), s = b(\"LayerHideOnSuccess\"), t = b(\"LayerHideOnTransition\"), u = b(\"LayerTabIsolation\"), v = b(\"LayerMouseHooks\"), w = b(\"copyProperties\");\n    function x(y, z) {\n        y = w({\n            buildWrapper: true\n        }, ((y || {\n        })));\n        this._shouldBuildWrapper = y.buildWrapper;\n        this.parent.construct(this, y, z);\n    };\n;\n    g.extend(x, k);\n    w(x.prototype, {\n        _configure: function(y, z) {\n            this.parent._configure(y, z);\n            var aa = this.getRoot();\n            this._overlay = ((j.scry(aa, \"div.uiOverlay\")[0] || aa));\n            h.hide(aa);\n            j.appendContent(this.getInsertParent(), aa);\n            i.set(this._overlay, \"overlay\", this);\n            var ba = i.get(this._overlay, \"width\");\n            ((ba && this.setWidth(ba)));\n            if (this.setFixed) {\n                this.setFixed(((i.get(this._overlay, \"fixed\") == \"true\")));\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"fadeonshow\") != \"false\"))) {\n                this.enableBehavior(o);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"fadeonhide\") != \"false\"))) {\n                this.enableBehavior(n);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"hideonsuccess\") != \"false\"))) {\n                this.enableBehavior(s);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"hideonblur\") == \"true\"))) {\n                this.enableBehavior(q);\n            }\n        ;\n        ;\n            if (((i.get(this._overlay, \"destroyonhide\") != \"false\"))) {\n                this.enableBehavior(m);\n            }\n        ;\n        ;\n            return this;\n        },\n        _getDefaultBehaviors: function() {\n            return this.parent._getDefaultBehaviors().concat([l,p,v,r,t,u,]);\n        },\n        initWithoutBuildingWrapper: function() {\n            this._shouldBuildWrapper = false;\n            return this.init.apply(this, arguments);\n        },\n        _buildWrapper: function(y, z) {\n            z = this.parent._buildWrapper(y, z);\n            if (!this._shouldBuildWrapper) {\n                this._contentRoot = z;\n                return z;\n            }\n        ;\n        ;\n            this._contentRoot = j.create(\"div\", {\n                className: \"uiOverlayContent\"\n            }, z);\n            return j.create(\"div\", {\n                className: \"uiOverlay\"\n            }, this._contentRoot);\n        },\n        getContentRoot: function() {\n            return this._contentRoot;\n        },\n        destroy: function() {\n            i.remove(this.getRoot(), \"overlay\");\n            this.parent.destroy();\n        }\n    });\n    e.exports = x;\n});\n__d(\"legacy:adware-scanner\", [\"AdwareScaner\",], function(a, b, c, d) {\n    a.AdwareScaner = b(\"AdwareScaner\");\n}, 3);\n__d(\"ContextualDialogFooterLink\", [\"JSBNG__Event\",\"copyProperties\",\"JSBNG__CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\");\n    function k(l) {\n        this._layer = l;\n    };\n;\n    h(k.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var l = this._layer.getRoot(), m = j.scry(l, \".uiContextualDialogFooterLink\")[0], n = \"uiContextualDialogHoverFooterArrow\";\n            this._subscriptions = [g.listen(m, \"mouseenter\", i.addClass.curry(l, n)),g.listen(m, \"mouseleave\", i.removeClass.curry(l, n)),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(l) {\n                l.remove();\n            });\n            this._subscriptions = null;\n        }\n    });\n    e.exports = k;\n});\n__d(\"LegacyContextualDialog\", [\"Arbiter\",\"ArbiterMixin\",\"ARIA\",\"Bootloader\",\"Class\",\"ContextualDialogFooterLink\",\"ContextualThing\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"JSBNG__Event\",\"Locale\",\"Overlay\",\"Parent\",\"Style\",\"Vector\",\"$\",\"copyProperties\",\"getOverlayZIndex\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ARIA\"), j = b(\"Bootloader\"), k = b(\"Class\"), l = b(\"ContextualDialogFooterLink\"), m = b(\"ContextualThing\"), n = b(\"JSBNG__CSS\"), o = b(\"DataStore\"), p = b(\"DOM\"), q = b(\"JSBNG__Event\"), r = b(\"Locale\"), s = b(\"Overlay\"), t = b(\"Parent\"), u = b(\"Style\"), v = b(\"Vector\"), w = b(\"$\"), x = b(\"copyProperties\"), y = b(\"getOverlayZIndex\"), z = b(\"shield\");\n    function aa(ba, ca) {\n        this.parent.construct(this, ba, ca);\n    };\n;\n    k.extend(aa, s);\n    x(aa, h, {\n        ARROW_OFFSET: 15,\n        ARROW_LENGTH: 16,\n        ARROW_INSET: 22,\n        TOP_MARGIN: 50,\n        BOTTOM_MARGIN: 30,\n        LEFT_MARGIN: 15,\n        RIGHT_MARGIN: 30,\n        MIN_TOP_GAP: 5,\n        POSITION_TO_CLASS: {\n            above: \"uiContextualDialogAbove\",\n            below: \"uiContextualDialogBelow\",\n            left: \"uiContextualDialogLeft\",\n            right: \"uiContextualDialogRight\"\n        },\n        RIGHT_ALIGNED_CLASS: \"uiContextualDialogRightAligned\",\n        ARROW_CLASS: {\n            bottom: \"uiContextualDialogArrowBottom\",\n            JSBNG__top: \"uiContextualDialogArrowTop\",\n            right: \"uiContextualDialogArrowRight\",\n            left: \"uiContextualDialogArrowLeft\"\n        },\n        POSITION_TO_ARROW: {\n            above: \"bottom\",\n            below: \"JSBNG__top\",\n            left: \"right\",\n            right: \"left\"\n        },\n        getInstance: function(ba) {\n            var ca = o.get(ba, \"LegacyContextualDialog\");\n            if (!ca) {\n                var da = t.byClass(ba, \"uiOverlay\");\n                if (da) {\n                    ca = o.get(da, \"overlay\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ca;\n        }\n    });\n    x(aa.prototype, {\n        _scrollListener: null,\n        _scrollParent: null,\n        _width: null,\n        _fixed: false,\n        _hasFooter: false,\n        _showSubscription: null,\n        _hideSubscription: null,\n        _setContextSubscription: null,\n        _resizeListener: null,\n        _reflowSubscription: null,\n        _configure: function(ba, ca) {\n            this.parent._configure(ba, ca);\n            var da = this.getRoot(), ea = o.get.curry(da);\n            this.setAlignH(ea(\"alignh\", \"left\"));\n            this.setOffsetX(ea(\"offsetx\", 0));\n            this.setOffsetY(ea(\"offsety\", 0));\n            this.setPosition(ea(\"position\", \"above\"));\n            this._hasFooter = ea(\"hasfooter\", false);\n            if (this._hasFooter) {\n                var fa = p.scry(da, \".uiContextualDialogFooterLink\")[0];\n                ((fa && this.enableBehavior(l)));\n            }\n        ;\n        ;\n            this._setContextSubscription = this.subscribe(\"beforeshow\", function() {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n                var ha = ea(\"context\");\n                if (ha) {\n                    this.setContext(w(ha));\n                }\n                 else {\n                    ha = ea(\"contextselector\");\n                    if (ha) {\n                        this.setContext(p.JSBNG__find(JSBNG__document, ha));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this._content = p.scry(da, \".uiContextualDialogContent\")[0];\n            if (this._content) {\n                this._content.setAttribute(\"role\", \"dialog\");\n                var ga = p.scry(this._content, \".legacyContextualDialogTitle\")[0];\n                if (ga) {\n                    this._content.setAttribute(\"aria-labelledby\", p.getID(ga));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this._showSubscription = this.subscribe(\"show\", function() {\n                var ha = z(this.updatePosition, this);\n                this._resizeListener = q.listen(window, \"resize\", ha);\n                this._reflowSubscription = g.subscribe(\"reflow\", ha);\n                this._setupScrollListener(this._scrollParent);\n                m.register(da, this.context);\n                g.inform(\"layer_shown\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            this._hideSubscription = this.subscribe(\"hide\", function() {\n                this._teardownResizeAndReflowListeners();\n                this._teardownScrollListener();\n                g.inform(\"layer_hidden\", {\n                    type: \"ContextualDialog\"\n                });\n            }.bind(this));\n            return this;\n        },\n        _buildWrapper: function(ba, ca) {\n            var da = this.parent._buildWrapper(ba, ca);\n            if (!this._shouldBuildWrapper) {\n                return da;\n            }\n        ;\n        ;\n            n.addClass(da, \"uiContextualDialog\");\n            return p.create(\"div\", {\n                className: \"uiContextualDialogPositioner\"\n            }, da);\n        },\n        setWidth: function(ba) {\n            this._width = Math.floor(ba);\n            return this;\n        },\n        setFixed: function(ba) {\n            ba = !!ba;\n            n.conditionClass(this.getRoot(), \"uiContextualDialogFixed\", ba);\n            this._fixed = ba;\n            return this;\n        },\n        setAlignH: function(ba) {\n            this.alignH = ba;\n            this._updateAlignmentClass();\n            ((this._shown && this.updatePosition()));\n            ((this.position && this._updateArrow()));\n            return this;\n        },\n        getContent: function() {\n            return this._content;\n        },\n        getContext: function() {\n            return this.context;\n        },\n        setContext: function(ba) {\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n        ;\n            ba = w(ba);\n            if (((this.context && ((this.context != ba))))) {\n                o.remove(this.context, \"LegacyContextualDialog\");\n            }\n        ;\n        ;\n            this.context = ba;\n            i.setPopup(this.getCausalElement(), this.getRoot());\n            var ca = t.byClass(ba, \"fbPhotoSnowlift\");\n            this.setInsertParent(((ca || JSBNG__document.body)));\n            if (((this._scrollListener && ((this._scrollParent !== ca))))) {\n                this._teardownScrollListener();\n                this._setupScrollListener(ca);\n            }\n        ;\n        ;\n            this._scrollParent = ca;\n            var da = y(ba, this._insertParent);\n            u.set(this.getRoot(), \"z-index\", ((((da > 200)) ? da : \"\")));\n            o.set(this.context, \"LegacyContextualDialog\", this);\n            return this;\n        },\n        getCausalElement: function() {\n            return ((this.parent.getCausalElement() || this.context));\n        },\n        listen: function(ba, ca) {\n            return q.listen(this.getRoot(), ba, ca);\n        },\n        setOffsetX: function(ba) {\n            this.offsetX = ((parseInt(ba, 10) || 0));\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setOffsetY: function(ba) {\n            this.offsetY = ((parseInt(ba, 10) || 0));\n            ((this._shown && this.updatePosition()));\n            return this;\n        },\n        setPosition: function(ba) {\n            this.position = ba;\n            {\n                var fin266keys = ((window.top.JSBNG_Replay.forInKeys)((aa.POSITION_TO_CLASS))), fin266i = (0);\n                var ca;\n                for (; (fin266i < fin266keys.length); (fin266i++)) {\n                    ((ca) = (fin266keys[fin266i]));\n                    {\n                        n.conditionClass(this.getRoot(), aa.POSITION_TO_CLASS[ca], ((ba == ca)));\n                    ;\n                    };\n                };\n            };\n        ;\n            this._updateAlignmentClass();\n            ((this._shown && this.updatePosition()));\n            this._updateArrow();\n            return this;\n        },\n        updatePosition: function() {\n            if (!this.context) {\n                return false;\n            }\n        ;\n        ;\n            if (this._width) {\n                u.set(this._overlay, \"width\", ((this._width + \"px\")));\n            }\n        ;\n        ;\n            var ba = ((this._fixed ? \"viewport\" : \"JSBNG__document\")), ca = v.getElementPosition(this.context, ba), da = this._scrollParent;\n            if (da) {\n                ca = ca.sub(v.getElementPosition(da, \"JSBNG__document\")).add(da.scrollLeft, da.scrollTop);\n            }\n        ;\n        ;\n            var ea = v.getElementDimensions(this.context), fa = ((((this.position == \"above\")) || ((this.position == \"below\")))), ga = r.isRTL();\n            if (((((((this.position == \"right\")) || ((fa && ((this.alignH == \"right\")))))) != ga))) {\n                ca = ca.add(ea.x, 0);\n            }\n        ;\n        ;\n            if (((this.position == \"below\"))) {\n                ca = ca.add(0, ea.y);\n            }\n        ;\n        ;\n            var ha = new v(0, 0);\n            if (((fa && ((this.alignH == \"center\"))))) {\n                ha = ha.add(((((ea.x - this._width)) / 2)), 0);\n            }\n             else {\n                var ia = ((fa ? ea.x : ea.y)), ja = ((2 * aa.ARROW_INSET));\n                if (((ia < ja))) {\n                    var ka = ((((ia / 2)) - aa.ARROW_INSET));\n                    if (((fa && ((((this.alignH == \"right\")) != ga))))) {\n                        ka = -ka;\n                    }\n                ;\n                ;\n                    ha = ha.add(((fa ? ka : 0)), ((fa ? 0 : ka)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            ha = ha.add(this.offsetX, this.offsetY);\n            if (ga) {\n                ha = ha.mul(-1, 1);\n            }\n        ;\n        ;\n            ca = ca.add(ha);\n            if (this._fixed) {\n                ca = new v(ca.x, ca.y, \"JSBNG__document\");\n            }\n        ;\n        ;\n            ca.setElementPosition(this.getRoot());\n            this._adjustVerticalPosition();\n            this._adjustHorizontalPosition();\n            return true;\n        },\n        JSBNG__scrollTo: function() {\n            if (this.context) {\n                j.loadModules([\"DOMScroll\",], function(ba) {\n                    ba.JSBNG__scrollTo(this.context, true, true);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            this.unsubscribe(this._showSubscription);\n            this.unsubscribe(this._hideSubscription);\n            if (this._setContextSubscription) {\n                this.unsubscribe(this._setContextSubscription);\n                this._setContextSubscription = null;\n            }\n        ;\n        ;\n            this._teardownScrollListener();\n            this._teardownResizeAndReflowListeners();\n            ((this.context && o.remove(this.context, \"LegacyContextualDialog\")));\n            this.parent.destroy();\n        },\n        _adjustVerticalPosition: function() {\n            if (((((this.position != \"left\")) && ((this.position != \"right\"))))) {\n                u.set(this._overlay, \"JSBNG__top\", \"\");\n                return;\n            }\n        ;\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").y, da = v.getElementDimensions(this._overlay).y, ea = v.getViewportDimensions().y, fa = Math.min(Math.max(ca, aa.MIN_TOP_GAP), aa.TOP_MARGIN), ga = Math.min(Math.max(0, ((((((ca + da)) + aa.BOTTOM_MARGIN)) - ea))), Math.max(-fa, ((ca - fa))), ((da - ((2 * aa.ARROW_INSET)))));\n            u.set(this._overlay, \"JSBNG__top\", ((((-1 * ga)) + \"px\")));\n            u.set(this._arrow, \"JSBNG__top\", ((aa.ARROW_OFFSET + \"px\")));\n            u.set(this._arrow, \"marginTop\", ((ga + \"px\")));\n        },\n        _adjustHorizontalPosition: function() {\n            if (((((((this.position != \"above\")) && ((this.position != \"below\")))) || ((this.alignH != \"left\"))))) {\n                u.set(this._overlay, \"left\", \"\");\n                u.set(this._overlay, \"right\", \"\");\n                return;\n            }\n        ;\n        ;\n            var ba = this.getRoot(), ca = v.getElementPosition(ba, \"viewport\").x, da = v.getElementDimensions(this._overlay).x, ea = v.getViewportDimensions().x, fa = r.isRTL(), ga;\n            if (!fa) {\n                ga = ((((((ca + da)) + aa.RIGHT_MARGIN)) - ea));\n            }\n             else ga = ((((aa.LEFT_MARGIN + da)) - ca));\n        ;\n        ;\n            ga = Math.min(Math.max(0, ga), ((da - ((2 * aa.ARROW_INSET)))));\n            u.set(this._overlay, ((fa ? \"right\" : \"left\")), ((((-1 * ga)) + \"px\")));\n            u.set(this._arrow, ((fa ? \"right\" : \"left\")), ((aa.ARROW_OFFSET + \"px\")));\n            u.set(this._arrow, ((fa ? \"marginRight\" : \"marginLeft\")), ((ga + \"px\")));\n        },\n        _updateArrow: function() {\n            var ba = 0;\n            if (((((this.position == \"above\")) || ((this.position == \"below\"))))) {\n                switch (this.alignH) {\n                  case \"center\":\n                    ba = 50;\n                    break;\n                  case \"right\":\n                    ba = 100;\n                    break;\n                };\n            }\n        ;\n        ;\n            this._renderArrow(aa.POSITION_TO_ARROW[this.position], ba);\n        },\n        _renderArrow: function(ba, ca) {\n            {\n                var fin267keys = ((window.top.JSBNG_Replay.forInKeys)((aa.ARROW_CLASS))), fin267i = (0);\n                var da;\n                for (; (fin267i < fin267keys.length); (fin267i++)) {\n                    ((da) = (fin267keys[fin267i]));\n                    {\n                        n.conditionClass(this._overlay, aa.ARROW_CLASS[da], ((ba == da)));\n                    ;\n                    };\n                };\n            };\n        ;\n            n.conditionClass(this._overlay, \"uiContextualDialogWithFooterArrowBottom\", ((((ba == \"bottom\")) && this._hasFooter)));\n            if (((ba == \"none\"))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._arrow) {\n                this._arrow = p.create(\"i\", {\n                    className: \"uiContextualDialogArrow\"\n                });\n                p.appendContent(this._overlay, this._arrow);\n            }\n        ;\n        ;\n            u.set(this._arrow, \"JSBNG__top\", \"\");\n            u.set(this._arrow, \"left\", \"\");\n            u.set(this._arrow, \"right\", \"\");\n            u.set(this._arrow, \"margin\", \"\");\n            var ea = ((((ba == \"JSBNG__top\")) || ((ba == \"bottom\")))), fa = ((ea ? ((r.isRTL() ? \"right\" : \"left\")) : \"JSBNG__top\"));\n            ca = ((ca || 0));\n            u.set(this._arrow, fa, ((ca + \"%\")));\n            var ga = ((aa.ARROW_LENGTH + ((aa.ARROW_OFFSET * 2)))), ha = -((((((ga * ca)) / 100)) - aa.ARROW_OFFSET));\n            u.set(this._arrow, ((\"margin-\" + fa)), ((ha + \"px\")));\n        },\n        _updateAlignmentClass: function() {\n            n.conditionClass(this.getRoot(), aa.RIGHT_ALIGNED_CLASS, ((((((this.position == \"above\")) || ((this.position == \"below\")))) && ((this.alignH == \"right\")))));\n        },\n        _setupScrollListener: function(ba) {\n            this._scrollListener = q.listen(((ba || window)), \"JSBNG__scroll\", z(this._adjustVerticalPosition, this));\n        },\n        _teardownScrollListener: function() {\n            if (this._scrollListener) {\n                this._scrollListener.remove();\n                this._scrollListener = null;\n            }\n        ;\n        ;\n        },\n        _teardownResizeAndReflowListeners: function() {\n            if (this._resizeListener) {\n                this._resizeListener.remove();\n                this._resizeListener = null;\n            }\n        ;\n        ;\n            if (this._reflowSubscription) {\n                this._reflowSubscription.unsubscribe();\n                this._reflowSubscription = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = aa;\n});");
// 15666
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o86,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yK/r/RErt59oF4EQ.js",o95);
// undefined
o86 = null;
// undefined
o95 = null;
// 15671
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"dm/WP\",]);\n}\n;\n__d(\"AdblockDetector\", [], function(a, b, c, d, e, f) {\n    var g = \"data-adblock-hash\", h = {\n    }, i = 0;\n    function j(k, l) {\n        var m = k.getAttribute(g);\n        if (!m) {\n            m = ++i;\n            k.setAttribute(g, m);\n        }\n         else if (h[m]) {\n            clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n        h[m] = setTimeout(function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = document.getElementsByTagName(\"body\")[0];\n                while ((n && (n !== o))) {\n                    if ((((((n.style.display === \"none\") || (n.style.height === \"0px\")) || (n.style.height === 0)) || (n.style.height === \"0\")) || (n.childNodes.length === 0))) {\n                        return\n                    };\n                    n = n.parentNode;\n                };\n                if ((n === o)) {\n                    (l && l(k));\n                };\n            }\n        ;\n        }, 3000);\n    };\n    f.assertUnblocked = j;\n});\n__d(\"AdblockDetectorLogging\", [\"AdblockDetector\",\"EagleEye\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdblockDetector\"), h = b(\"EagleEye\");\n    function i(j) {\n        g.assertUnblocked(j, h.log.bind(h, \"ads\", {\n            event: \"ads_blocked\"\n        }));\n    };\n    f.assertUnblocked = i;\n});\n__d(\"EmuController\", [\"AsyncRequest\",\"DataStore\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"URI\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"ge\"), m = b(\"goURI\");\n    function n(o, p) {\n        var q = l(o);\n        if (!q) {\n            return null\n        };\n        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null\n            };\n            return h.get(p, \"emuController\");\n        },\n        getEventClass: function(o) {\n            return (\"emuEvent\" + String(o).trim());\n        }\n    });\n    j(n.prototype, {\n        EVENT_HANDLER_PATH: \"/ajax/emu/end.php\",\n        CLICK: 1,\n        FAN: \"fad_fan\",\n        event: function(o, p, q, r) {\n            var s = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: o,\n                a: 1\n            };\n            if (p) {\n                s.ed = JSON.stringify(p);\n            };\n            if (!r) {\n                r = k;\n            };\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\n            };\n            t.send();\n        },\n        redirect: function() {\n            var o = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: this.CLICK,\n                a: 0,\n                sig: (Math.floor((Math.random() * 65535)) + 65536)\n            }, p = new i(this.EVENT_HANDLER_PATH);\n            p.setQueryData(o);\n            m(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ad-units-base-js\", [\"EmuController\",], function(a, b, c, d) {\n    a.EmuController = b(\"EmuController\");\n}, 3);\n__d(\"BassWhitespaceListener\", [\"Bootloader\",\"Event\",\"Parent\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Event\"), i = b(\"Parent\"), j = b(\"copyProperties\"), k = b(\"goURI\");\n    function l(m, n) {\n        this.link = n;\n        h.listen(m, \"click\", this.onclicked.bind(this));\n    };\n    j(l.prototype, {\n        onclicked: function(m) {\n            if (i.byTag(m.getTarget(), \"A\")) {\n                return\n            };\n            switch (this.link.getAttribute(\"rel\")) {\n              case \"async\":\n                g.loadModules([\"AsyncRequest\",], function(o) {\n                    o.bootstrap(this.link.getAttribute(\"ajaxify\"), this.link);\n                }.bind(this));\n                break;\n              case \"theater\":\n                var n = i.byClass(m.getTarget(), \"fbPhotoSnowlift\");\n                g.loadModules([\"PhotoViewer\",], function(o) {\n                    o.bootstrap(this.link.getAttribute(\"ajaxify\"), this.link);\n                }.bind(this));\n                if (n) {\n                    return false\n                };\n                break;\n              default:\n                k(this.link.getAttribute(\"href\"));\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"legacy:ad-units-stream-whitespace\", [\"BassWhitespaceListener\",], function(a, b, c, d) {\n    a.BassWhitespaceListener = b(\"BassWhitespaceListener\");\n}, 3);\n__d(\"legacy:async-signal\", [\"AsyncSignal\",], function(a, b, c, d) {\n    a.AsyncSignal = b(\"AsyncSignal\");\n}, 3);\n__d(\"NetEgo\", [\"Arbiter\",\"CSS\",\"DOM\",\"URI\",\"ge\",\"Animation\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"ge\"), l = b(\"Animation\"), m = {\n        setup: function(n) {\n            g.subscribe([\"page/liked\",\"FriendRequest/sending\",], function(o, p) {\n                if (((n == p.id) || (n == p.uid))) {\n                    var q = k(document.body, \".ego_unit_container\");\n                    if (q) {\n                        var r = i.scry(q, \".ego_unit\"), s = r.length;\n                        for (var t = 0; (t < s); t++) {\n                            var u = r[t].getAttribute(\"data-ego-fbid\");\n                            if (((u == p.id) || (u == p.uid))) {\n                                var v = i.find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                };\n                                break;\n                            }\n                        ;\n                        };\n                    }\n                ;\n                }\n            ;\n            });\n        },\n        updateXids: function(n, o) {\n            if (((n.length == 0) && (o.length == 0))) {\n                return\n            };\n            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false\n                    };\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if ((q.length == 0)) {\n                return\n            };\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return\n            };\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n            for (var v = 0; (v < n.length); ++v) {\n                delete u[n[v]];;\n            };\n            for (v = 0; (v < o.length); ++v) {\n                u[o[v]] = 1;;\n            };\n            var w = JSON.stringify(u), x = function(z, aa) {\n                r = new j(z.getAttribute(aa));\n                s = r.getQueryData();\n                s.xids = w;\n                r.setQueryData(s);\n                z.setAttribute(aa, r.toString());\n            };\n            for (v = 0; (v < q.length); ++v) {\n                x(q[v], \"ajaxify\");;\n            };\n            var y = i.scry(document.body, \".ego_unit form\");\n            y = y.filter(p(\"action\"));\n            for (v = 0; (v < y.length); ++v) {\n                x(y[v], \"action\");;\n            };\n        },\n        replaceUnit: function(n, o, p, q) {\n            var r = i.insertAfter(n, o);\n            r.forEach(h.hide);\n            if (((q !== undefined) && (q !== null))) {\n                (function() {\n                    m._replaceUnitFadeout(n, r, p);\n                }).defer(q);\n            }\n             else m._replaceUnitFadeout(n, r, p);\n        ;\n        },\n        _replaceUnitFadeout: function(n, o, p) {\n            if (p) {\n                new l(n).from(\"opacity\", 1).to(\"opacity\", 0).duration(p).checkpoint(1, function() {\n                    m._replaceUnitElement(n, o);\n                }).go();\n            }\n             else m._replaceUnitElement(n, o);\n        ;\n        },\n        _replaceUnitElement: function(n, o) {\n            i.remove(n);\n            o.forEach(h.show);\n            g.inform(\"netego_replacedUnit\");\n            m.clearHeader();\n        },\n        clearHeader: function() {\n            var n = i.scry(document.body, \".ego_column\"), o = [];\n            for (var p = 0; (p < n.length); ++p) {\n                o = o.concat(i.scry(n[p], \".uiHeader\"));;\n            };\n            for (p = 0; (p < o.length); ++p) {\n                var q = o[p].nextSibling;\n                if ((!q || (q.childNodes.length === 0))) {\n                    i.remove(o[p]);\n                }\n                 else if ((q.childNodes.length === 1)) {\n                    var r = q.childNodes[0];\n                    if ((h.hasClass(r, \"ego_appended_units\") && (r.childNodes.length === 0))) {\n                        i.remove(o[p]);\n                    };\n                }\n                \n            ;\n            };\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReminderStory\", [\"AsyncRequest\",\"endsWith\",\"Event\",\"DOMQuery\",\"ScrollableArea\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"endsWith\"), i = b(\"Event\"), j = b(\"DOMQuery\"), k = b(\"ScrollableArea\");\n    function l(m, n, o) {\n        i.listen(m, \"click\", function(p) {\n            n.show();\n            if (o) {\n                var q = {\n                    context_data: o\n                };\n                new g().setURI(\"/growth/reminder/logging.php\").setData(q).send();\n            }\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.find(p, \"#SuggestBelowInvite\");\n            if (q) {\n                new g().setURI(\"/ajax/pages/reminder/recommendations\").send();\n            };\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.scry(p, \".inlineReplyTextArea\");\n            if ((q.length > 0)) {\n                q[0].focus();\n            };\n            var r = j.scry(p, \".jewelItemNew\"), s = [];\n            for (var t in r) {\n                var u = r[t].getAttribute(\"id\");\n                if ((u && h(u, \"_1_req\"))) {\n                    s = s.concat(u.replace(\"_1_req\", \"\"));\n                };\n            };\n            if ((s.length > 0)) {\n                new g().setURI(\"/friends/requests/log_impressions\").setData({\n                    ids: s.join(\",\"),\n                    ref: \"reminder_box\"\n                }).send();\n            };\n            k.poke(j.scry(p, \".uiScrollableArea\")[0]);\n        });\n    };\n    e.exports = l;\n});");
// 15672
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s197eb22f80b202989c5f857515ef594ca9682b45");
// 15673
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"dm/WP\",]);\n}\n;\n;\n__d(\"AdblockDetector\", [], function(a, b, c, d, e, f) {\n    var g = \"data-adblock-hash\", h = {\n    }, i = 0;\n    function j(k, l) {\n        var m = k.getAttribute(g);\n        if (!m) {\n            m = ++i;\n            k.setAttribute(g, m);\n        }\n         else if (h[m]) {\n            JSBNG__clearTimeout(h[m]);\n            h[m] = null;\n        }\n        \n    ;\n    ;\n        h[m] = JSBNG__setTimeout(function() {\n            h[m] = null;\n            if (!k.offsetHeight) {\n                var n = k, o = JSBNG__document.getElementsByTagName(\"body\")[0];\n                while (((n && ((n !== o))))) {\n                    if (((((((((((n.style.display === \"none\")) || ((n.style.height === \"0px\")))) || ((n.style.height === 0)))) || ((n.style.height === \"0\")))) || ((n.childNodes.length === 0))))) {\n                        return;\n                    }\n                ;\n                ;\n                    n = n.parentNode;\n                };\n            ;\n                if (((n === o))) {\n                    ((l && l(k)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }, 3000);\n    };\n;\n    f.assertUnblocked = j;\n});\n__d(\"AdblockDetectorLogging\", [\"AdblockDetector\",\"EagleEye\",], function(a, b, c, d, e, f) {\n    var g = b(\"AdblockDetector\"), h = b(\"EagleEye\");\n    function i(j) {\n        g.assertUnblocked(j, h.log.bind(h, \"ads\", {\n            JSBNG__event: \"ads_blocked\"\n        }));\n    };\n;\n    f.assertUnblocked = i;\n});\n__d(\"EmuController\", [\"AsyncRequest\",\"DataStore\",\"URI\",\"copyProperties\",\"emptyFunction\",\"ge\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"DataStore\"), i = b(\"URI\"), j = b(\"copyProperties\"), k = b(\"emptyFunction\"), l = b(\"ge\"), m = b(\"goURI\");\n    function n(o, p) {\n        var q = l(o);\n        if (!q) {\n            return null;\n        }\n    ;\n    ;\n        this.impression = p;\n        this.containerId = o;\n        h.set(q, \"emuController\", this);\n        return this;\n    };\n;\n    j(n, {\n        fromContainer: function(o) {\n            var p = l(o);\n            if (!p) {\n                return null;\n            }\n        ;\n        ;\n            return h.get(p, \"emuController\");\n        },\n        getEventClass: function(o) {\n            return ((\"emuEvent\" + String(o).trim()));\n        }\n    });\n    j(n.prototype, {\n        EVENT_HANDLER_PATH: \"/ajax/emu/end.php\",\n        CLICK: 1,\n        FAN: \"fad_fan\",\n        JSBNG__event: function(o, p, q, r) {\n            var s = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: o,\n                a: 1\n            };\n            if (p) {\n                s.ed = JSON.stringify(p);\n            }\n        ;\n        ;\n            if (!r) {\n                r = k;\n            }\n        ;\n        ;\n            var t = new g().setURI(this.EVENT_HANDLER_PATH).setData(s).setErrorHandler(r);\n            if (q) {\n                t.setHandler(q);\n            }\n        ;\n        ;\n            t.send();\n        },\n        redirect: function() {\n            var o = {\n                eid: this.impression,\n                f: 0,\n                ui: this.containerId,\n                en: this.CLICK,\n                a: 0,\n                sig: ((Math.floor(((Math.JSBNG__random() * 65535))) + 65536))\n            }, p = new i(this.EVENT_HANDLER_PATH);\n            p.setQueryData(o);\n            m(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"legacy:ad-units-base-js\", [\"EmuController\",], function(a, b, c, d) {\n    a.EmuController = b(\"EmuController\");\n}, 3);\n__d(\"BassWhitespaceListener\", [\"Bootloader\",\"JSBNG__Event\",\"Parent\",\"copyProperties\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"JSBNG__Event\"), i = b(\"Parent\"), j = b(\"copyProperties\"), k = b(\"goURI\");\n    function l(m, n) {\n        this.link = n;\n        h.listen(m, \"click\", this.onclicked.bind(this));\n    };\n;\n    j(l.prototype, {\n        onclicked: function(m) {\n            if (i.byTag(m.getTarget(), \"A\")) {\n                return;\n            }\n        ;\n        ;\n            switch (this.link.getAttribute(\"rel\")) {\n              case \"async\":\n                g.loadModules([\"AsyncRequest\",], function(o) {\n                    o.bootstrap(this.link.getAttribute(\"ajaxify\"), this.link);\n                }.bind(this));\n                break;\n              case \"theater\":\n                var n = i.byClass(m.getTarget(), \"fbPhotoSnowlift\");\n                g.loadModules([\"PhotoViewer\",], function(o) {\n                    o.bootstrap(this.link.getAttribute(\"ajaxify\"), this.link);\n                }.bind(this));\n                if (n) {\n                    return false;\n                }\n            ;\n            ;\n                break;\n              default:\n                k(this.link.getAttribute(\"href\"));\n            };\n        ;\n        }\n    });\n    e.exports = l;\n});\n__d(\"legacy:ad-units-stream-whitespace\", [\"BassWhitespaceListener\",], function(a, b, c, d) {\n    a.BassWhitespaceListener = b(\"BassWhitespaceListener\");\n}, 3);\n__d(\"legacy:async-signal\", [\"AsyncSignal\",], function(a, b, c, d) {\n    a.AsyncSignal = b(\"AsyncSignal\");\n}, 3);\n__d(\"NetEgo\", [\"Arbiter\",\"JSBNG__CSS\",\"DOM\",\"URI\",\"ge\",\"Animation\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"URI\"), k = b(\"ge\"), l = b(\"Animation\"), m = {\n        setup: function(n) {\n            g.subscribe([\"page/liked\",\"FriendRequest/sending\",], function(o, p) {\n                if (((((n == p.id)) || ((n == p.uid))))) {\n                    var q = k(JSBNG__document.body, \".ego_unit_container\");\n                    if (q) {\n                        var r = i.scry(q, \".ego_unit\"), s = r.length;\n                        for (var t = 0; ((t < s)); t++) {\n                            var u = r[t].getAttribute(\"data-ego-fbid\");\n                            if (((((u == p.id)) || ((u == p.uid))))) {\n                                var v = i.JSBNG__find(r[t], \".ego_action a\");\n                                if (v) {\n                                    v.click();\n                                }\n                            ;\n                            ;\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        updateXids: function(n, o) {\n            if (((((n.length == 0)) && ((o.length == 0))))) {\n                return;\n            }\n        ;\n        ;\n            var p = function(z) {\n                return function(aa) {\n                    var ba = aa.getAttribute(z);\n                    if (!ba) {\n                        return false;\n                    }\n                ;\n                ;\n                    var ca = new j(ba).getQueryData();\n                    return !!ca.xids;\n                };\n            }, q = i.scry(JSBNG__document.body, \".ego_unit a\");\n            q = q.filter(p(\"ajaxify\"));\n            if (((q.length == 0))) {\n                return;\n            }\n        ;\n        ;\n            var r = new j(q[0].getAttribute(\"ajaxify\")), s = r.getQueryData();\n            if (!s.xids) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var u = JSON.parse(s.xids);\n            } catch (t) {\n                return;\n            };\n        ;\n            for (var v = 0; ((v < n.length)); ++v) {\n                delete u[n[v]];\n            ;\n            };\n        ;\n            for (v = 0; ((v < o.length)); ++v) {\n                u[o[v]] = 1;\n            ;\n            };\n        ;\n            var w = JSON.stringify(u), x = function(z, aa) {\n                r = new j(z.getAttribute(aa));\n                s = r.getQueryData();\n                s.xids = w;\n                r.setQueryData(s);\n                z.setAttribute(aa, r.toString());\n            };\n            for (v = 0; ((v < q.length)); ++v) {\n                x(q[v], \"ajaxify\");\n            ;\n            };\n        ;\n            var y = i.scry(JSBNG__document.body, \".ego_unit form\");\n            y = y.filter(p(\"action\"));\n            for (v = 0; ((v < y.length)); ++v) {\n                x(y[v], \"action\");\n            ;\n            };\n        ;\n        },\n        replaceUnit: function(n, o, p, q) {\n            var r = i.insertAfter(n, o);\n            r.forEach(h.hide);\n            if (((((q !== undefined)) && ((q !== null))))) {\n                (function() {\n                    m._replaceUnitFadeout(n, r, p);\n                }).defer(q);\n            }\n             else m._replaceUnitFadeout(n, r, p);\n        ;\n        ;\n        },\n        _replaceUnitFadeout: function(n, o, p) {\n            if (p) {\n                new l(n).from(\"opacity\", 1).to(\"opacity\", 0).duration(p).checkpoint(1, function() {\n                    m._replaceUnitElement(n, o);\n                }).go();\n            }\n             else m._replaceUnitElement(n, o);\n        ;\n        ;\n        },\n        _replaceUnitElement: function(n, o) {\n            i.remove(n);\n            o.forEach(h.show);\n            g.inform(\"netego_replacedUnit\");\n            m.clearHeader();\n        },\n        clearHeader: function() {\n            var n = i.scry(JSBNG__document.body, \".ego_column\"), o = [];\n            for (var p = 0; ((p < n.length)); ++p) {\n                o = o.concat(i.scry(n[p], \".uiHeader\"));\n            ;\n            };\n        ;\n            for (p = 0; ((p < o.length)); ++p) {\n                var q = o[p].nextSibling;\n                if (((!q || ((q.childNodes.length === 0))))) {\n                    i.remove(o[p]);\n                }\n                 else if (((q.childNodes.length === 1))) {\n                    var r = q.childNodes[0];\n                    if (((h.hasClass(r, \"ego_appended_units\") && ((r.childNodes.length === 0))))) {\n                        i.remove(o[p]);\n                    }\n                ;\n                ;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"ReminderStory\", [\"AsyncRequest\",\"endsWith\",\"JSBNG__Event\",\"DOMQuery\",\"ScrollableArea\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"endsWith\"), i = b(\"JSBNG__Event\"), j = b(\"DOMQuery\"), k = b(\"ScrollableArea\");\n    function l(m, n, o) {\n        i.listen(m, \"click\", function(p) {\n            n.show();\n            if (o) {\n                var q = {\n                    context_data: o\n                };\n                new g().setURI(\"/growth/reminder/logging.php\").setData(q).send();\n            }\n        ;\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.JSBNG__find(p, \"#SuggestBelowInvite\");\n            if (q) {\n                new g().setURI(\"/ajax/pages/reminder/recommendations\").send();\n            }\n        ;\n        ;\n        });\n        n.subscribe(\"aftershow\", function() {\n            var p = n.getRoot(), q = j.scry(p, \".inlineReplyTextArea\");\n            if (((q.length > 0))) {\n                q[0].JSBNG__focus();\n            }\n        ;\n        ;\n            var r = j.scry(p, \".jewelItemNew\"), s = [];\n            {\n                var fin268keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin268i = (0);\n                var t;\n                for (; (fin268i < fin268keys.length); (fin268i++)) {\n                    ((t) = (fin268keys[fin268i]));\n                    {\n                        var u = r[t].getAttribute(\"id\");\n                        if (((u && h(u, \"_1_req\")))) {\n                            s = s.concat(u.replace(\"_1_req\", \"\"));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((s.length > 0))) {\n                new g().setURI(\"/friends/requests/log_impressions\").setData({\n                    ids: s.join(\",\"),\n                    ref: \"reminder_box\"\n                }).send();\n            }\n        ;\n        ;\n            k.poke(j.scry(p, \".uiScrollableArea\")[0]);\n        });\n    };\n;\n    e.exports = l;\n});");
// 15693
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o189,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/ys/r/hXdibVSGozY.js",o190);
// undefined
o189 = null;
// undefined
o190 = null;
// 15775
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 15785
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"TXKLp\",]);\n}\n;\n__d(\"ChatFavoriteList\", [\"AsyncRequest\",\"arrayContains\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"arrayContains\"), i = b(\"emptyFunction\"), j = false, k = [], l = [], m = false;\n    function n() {\n        var r = k.join(\",\");\n        new g(\"/ajax/chat/favorite_list.php\").setData({\n            favorite_list: r\n        }).setHandler(i).setErrorHandler(i).send();\n    };\n    function o(r) {\n        return r.toString();\n    };\n    function p(r) {\n        if ((k.length != r.length)) {\n            return true\n        };\n        for (var s = 0; (s < r.length); s++) {\n            if ((k[s] !== r[s].toString())) {\n                return true\n            };\n        };\n        return false;\n    };\n    var q = {\n        isEditMode: function() {\n            var r = null;\n            d([\"ChatSidebar\",], function(s) {\n                r = s;\n            });\n            return ((j && r) && r.isEnabled());\n        },\n        toggleEditMode: function() {\n            j = !j;\n            if (j) {\n                l = k.slice();\n            };\n        },\n        get: function() {\n            if (j) {\n                return l.slice();\n            }\n             else return k.slice()\n        ;\n        },\n        isFavored: function(r) {\n            return h(l, r.toString());\n        },\n        init: function(r) {\n            k = r.slice().map(o);\n            l = k.slice();\n        },\n        toggleID: function(r) {\n            if (!j) {\n                return\n            };\n            r = r.toString();\n            var s = l.indexOf(r);\n            if ((s >= 0)) {\n                l.splice(s, 1);\n            }\n             else l.push(r);\n        ;\n            m = true;\n        },\n        hasChanged: function() {\n            if (m) {\n                m = false;\n                return true;\n            }\n        ;\n            return false;\n        },\n        updateList: function(r) {\n            if (!j) {\n                return\n            };\n            l = r.map(o);\n        },\n        save: function() {\n            if (p(l)) {\n                k = l;\n                n();\n            }\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChatContexts\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(k) {\n        var l = (k ? k.subtext : \"\");\n        return l;\n    };\n    function i(k, l) {\n        g[k] = l;\n    };\n    var j = {\n        get: function(k) {\n            if ((k in g)) {\n                return g[k];\n            }\n             else return null\n        ;\n        },\n        update: function(k) {\n            for (var l in k) {\n                i(l, k[l]);;\n            };\n        },\n        getShortDisplay: function(k) {\n            return h(j.get(k));\n        }\n    };\n    e.exports = j;\n});\n__d(\"LastMobileActiveTimes\", [\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"tx\"), h = 0, i = {\n    };\n    function j(n) {\n        if ((!h || !n)) {\n            return \"\"\n        };\n        var o = (h - n), p = Math.floor((o / 60)), q = Math.floor((p / 60)), r = Math.floor((q / 24));\n        if ((p <= 1)) {\n            return g._(\"{count}m\", {\n                count: 1\n            });\n        }\n         else if ((p < 60)) {\n            return g._(\"{count}m\", {\n                count: p\n            });\n        }\n         else if ((q < 24)) {\n            return g._(\"{count}h\", {\n                count: q\n            });\n        }\n         else if ((r < 3)) {\n            return g._(\"{count}d\", {\n                count: r\n            });\n        }\n         else return \"\"\n        \n        \n        \n    ;\n    };\n    function k(n, o) {\n        i[n] = o;\n    };\n    function l(n) {\n        if ((n in i)) {\n            return i[n];\n        }\n         else return 0\n    ;\n    };\n    var m = {\n        update: function(n, o) {\n            h = (o / 1000);\n            for (var p in n) {\n                k(p, n[p]);;\n            };\n        },\n        getShortDisplay: function(n) {\n            return j(l(n));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ServerTime\", [\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"PresenceInitialData\"), h;\n    function i(k) {\n        h = (Date.now() - k);\n    };\n    i(g.serverTime);\n    var j = {\n        get: function() {\n            return (Date.now() - h);\n        },\n        getSkew: function() {\n            return h;\n        },\n        update: function(k) {\n            i(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"PresenceStatus\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatVisibility\",\"Env\",\"PresencePrivacy\",\"ServerTime\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatVisibility\"), j = b(\"Env\"), k = b(\"PresencePrivacy\"), l = b(\"ServerTime\"), m = b(\"createObjectFrom\"), n = {\n    }, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = {\n        resetPresenceData: function() {\n            n = {\n            };\n            r = {\n            };\n            q = {\n            };\n        },\n        reset: function() {\n            s.resetPresenceData();\n            o = {\n            };\n            p = {\n            };\n        },\n        get: function(t) {\n            if ((t == j.user)) {\n                return (i.isOnline() ? g.ACTIVE : g.OFFLINE)\n            };\n            var u = g.OFFLINE;\n            if ((t in n)) {\n                u = n[t];\n            };\n            if (!k.allows(t)) {\n                u = g.OFFLINE;\n            };\n            if ((u == g.OFFLINE)) {\n                if (o[t]) {\n                    u = g.MOBILE;\n                }\n            };\n            return u;\n        },\n        isBirthday: function(t) {\n            return p[t];\n        },\n        getGroup: function(t) {\n            if (!h.get(\"chat_group_presence\", 0)) {\n                return g.OFFLINE\n            };\n            return (t.some(function(u) {\n                if ((u == j.user)) {\n                    return false\n                };\n                return ((s.get(u) === g.ACTIVE));\n            }) ? g.ACTIVE : g.OFFLINE);\n        },\n        set: function(t, u, v, w) {\n            if ((t == j.user)) {\n                return false\n            };\n            switch (u) {\n              case g.OFFLINE:\n            \n              case g.IDLE:\n            \n              case g.ACTIVE:\n            \n              case g.MOBILE:\n                break;\n              default:\n                return false;\n            };\n            var x = (s.get(t) != u);\n            if (v) {\n                q[t] = l.get();\n                r[t] = w;\n            }\n        ;\n            n[t] = u;\n            return x;\n        },\n        setMobileFriends: function(t) {\n            o = m(t);\n        },\n        setBirthdayFriends: function(t) {\n            p = m(t);\n        },\n        getOnlineIDs: function() {\n            var t, u = [];\n            for (t in n) {\n                if ((s.get(t) === g.ACTIVE)) {\n                    u.push(t);\n                };\n            };\n            return u;\n        },\n        getAvailableIDs: function() {\n            var t = s.getOnlineIDs(), u;\n            for (u in o) {\n                if (n[u]) {\n                    continue;\n                };\n                t.push(u);\n            };\n            return t;\n        },\n        getOnlineCount: function() {\n            return s.getOnlineIDs().length;\n        },\n        getPresenceStats: function() {\n            var t = 0, u = 0, v = 0, w = 0, x = 0;\n            for (var y in n) {\n                t += 1;\n                switch (s.get(y)) {\n                  case g.OFFLINE:\n                    u += 1;\n                    break;\n                  case g.IDLE:\n                    v += 1;\n                    break;\n                  case g.ACTIVE:\n                    w += 1;\n                    break;\n                  case g.MOBILE:\n                    x += 1;\n                    break;\n                  default:\n                    break;\n                };\n            };\n            return {\n                total: t,\n                offline: u,\n                idle: v,\n                active: w,\n                mobile: x\n            };\n        },\n        getDebugInfo: function(t) {\n            return {\n                id: t,\n                presence: n[t],\n                overlaySource: r[t],\n                overlayTime: q[t],\n                mobile: o[t]\n            };\n        }\n    };\n    e.exports = s;\n});\n__d(\"PresencePoller\", [\"AvailableListConstants\",\"AvailableListInitialData\",\"BanzaiODS\",\"ChannelImplementation\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatVisibility\",\"Env\",\"JSLogger\",\"LastMobileActiveTimes\",\"Poller\",\"PresenceStatus\",\"PresenceUtil\",\"ServerTime\",\"ShortProfiles\",\"UserActivity\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"AvailableListInitialData\"), i = b(\"BanzaiODS\"), j = b(\"ChannelImplementation\").instance, k = b(\"ChatContexts\"), l = b(\"ChatFavoriteList\"), m = b(\"ChatVisibility\"), n = b(\"Env\"), o = b(\"JSLogger\"), p = b(\"LastMobileActiveTimes\"), q = b(\"Poller\"), r = b(\"PresenceStatus\"), s = b(\"PresenceUtil\"), t = b(\"ServerTime\"), u = b(\"ShortProfiles\"), v = b(\"UserActivity\"), w = b(\"copyProperties\"), x = b(\"debounceAcrossTransitions\"), y = 5, z = \"/ajax/chat/buddy_list.php\", aa = 1800000, ba = h.pollInterval, ca = h.lazyPollInterval, da = h.lazyThreshold, ea = o.create(\"available_list\"), fa = \"presence_poller\";\n    i.setEntitySample(fa, 4998);\n    function ga(ha) {\n        this.$PresencePoller0 = ha;\n        this.$PresencePoller1 = false;\n        this.$PresencePoller2 = h.chatNotif;\n        this.$PresencePoller3 = new q({\n            interval: ba,\n            setupRequest: this.$PresencePoller4.bind(this),\n            clearOnQuicklingEvents: false,\n            dontStart: true\n        });\n        this.$PresencePoller5 = Date.now();\n        this.$PresencePoller6 = Date.now();\n        this.$PresencePoller7 = Date.now();\n        this.$PresencePoller8 = h.updateTime;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera = 0;\n        if (h.favoriteList) {\n            l.init(h.favoriteList);\n        };\n        this.$PresencePollerb(\"available_initial_data\", h.updateTime, h.availableList, h.lastActiveTimes, h.mobileFriends, h.birthdayFriends);\n        v.subscribe(function(ia, ja) {\n            if ((ja.idleness > ba)) {\n                this.forceUpdate();\n            };\n        }.bind(this));\n    };\n    ga.prototype.start = function() {\n        this.$PresencePoller3.start.bind(this.$PresencePoller3).defer();\n    };\n    ga.prototype.forceUpdate = function() {\n        if (!this.$PresencePoller9) {\n            this.$PresencePoller3.request();\n        };\n    };\n    ga.prototype.getIsUserIdle = function() {\n        return this.$PresencePoller1;\n    };\n    ga.prototype.getWebChatNotification = function() {\n        return this.$PresencePoller2;\n    };\n    ga.prototype.getCallback = function() {\n        return this.$PresencePoller0;\n    };\n    ga.prototype.$PresencePollerc = function() {\n        return x(function() {\n            this.$PresencePoller0(g.ON_AVAILABILITY_CHANGED);\n        }.bind(this), 0)();\n    };\n    ga.prototype.$PresencePollerb = function(ha, ia, ja, ka, la, ma) {\n        this.$PresencePoller8 = ia;\n        if (!Array.isArray(ja)) {\n            r.resetPresenceData();\n            for (var na in ja) {\n                r.set(na, ja[na].a, false, ha);;\n            };\n        }\n    ;\n        if (ka) {\n            p.update(ka, ia);\n        };\n        if (la) {\n            r.setMobileFriends(la);\n        };\n        if (ma) {\n            r.setBirthdayFriends(ma);\n        };\n        this.$PresencePollerc();\n    };\n    ga.prototype.$PresencePoller4 = function(ha) {\n        if ((j.isShutdown() || !m.isOnline())) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.offline\");\n            return;\n        }\n    ;\n        if (((Date.now() - this.$PresencePoller5) < ba)) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.recent\");\n            return;\n        }\n    ;\n        i.bumpEntityKey(fa, \"request\");\n        this.$PresencePoller5 = Date.now();\n        var ia = (((Date.now() - this.$PresencePoller7) > aa)), ja = u.getCachedProfileIDs().join(\",\");\n        this.$PresencePoller9 = true;\n        ha.setHandler(this.$PresencePollerd.bind(this)).setErrorHandler(this.$PresencePollere.bind(this)).setOption(\"suppressErrorAlerts\", true).setOption(\"retries\", 1).setData({\n            user: n.user,\n            cached_user_info_ids: ja,\n            fetch_mobile: ia\n        }).setURI(z).setAllowCrossPageTransition(true);\n    };\n    ga.prototype.$PresencePollerd = function(ha) {\n        var ia = ha.getPayload(), ja = ia.buddy_list;\n        if (!ja) {\n            this.$PresencePollere(ha);\n            return;\n        }\n    ;\n        i.bumpEntityKey(fa, \"response\");\n        this.$PresencePoller9 = false;\n        this.$PresencePollerf();\n        this.$PresencePoller6 = Date.now();\n        t.update(ia.time);\n        this.$PresencePollera = 0;\n        this.$PresencePollerg();\n        var ka = ja.userInfos;\n        if (ka) {\n            u.setMulti(ka);\n        };\n        var la = ja.chatContexts;\n        (la && k.update(la));\n        this.$PresencePoller1 = ja.userIsIdle;\n        if ((ja.chatNotif !== undefined)) {\n            this.$PresencePoller2 = ja.chatNotif;\n            this.$PresencePoller0(g.ON_CHAT_NOTIFICATION_CHANGED, this.$PresencePoller2);\n        }\n    ;\n        this.$PresencePollerb(\"buddy_list_poller\", ia.time, ja.nowAvailableList, ja.last_active_times, ja.mobile_friends, ja.todays_birthdays);\n    };\n    ga.prototype.$PresencePollere = function(ha) {\n        i.bumpEntityKey(fa, \"error\");\n        if (s.checkMaintenanceError(ha)) {\n            return\n        };\n        this.$PresencePoller9 = false;\n        this.$PresencePollera++;\n        if ((this.$PresencePollera++ >= y)) {\n            this.$PresencePoller0(g.ON_UPDATE_ERROR);\n        };\n    };\n    ga.prototype.$PresencePollerg = function() {\n        var ha = (v.isActive(da) ? ba : ca);\n        i.bumpEntityKey(fa, (\"period.\" + ha));\n        this.$PresencePoller3.setInterval(ha);\n    };\n    ga.prototype.$PresencePollerf = function() {\n        var ha = Date.now(), ia = (ha - this.$PresencePoller6);\n        ea.log(\"buddylist_presence_stats\", w({\n            duration: ia\n        }, r.getPresenceStats()));\n    };\n    e.exports = ga;\n});\n__d(\"AvailableList\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableListConstants\",\"ChannelImplementation\",\"ChannelConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"JSLogger\",\"PresencePoller\",\"PresencePrivacy\",\"PresenceStatus\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"debounceAcrossTransitions\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableListConstants\"), k = b(\"ChannelImplementation\").instance, l = b(\"ChannelConstants\"), m = b(\"ChatConfig\"), n = b(\"ChatFavoriteList\"), o = b(\"JSLogger\"), p = b(\"PresencePoller\"), q = b(\"PresencePrivacy\"), r = b(\"PresenceStatus\"), s = b(\"ShortProfiles\"), t = b(\"TypingDetector\"), u = b(\"copyProperties\"), v = b(\"debounceAcrossTransitions\"), w = b(\"emptyFunction\"), x = u({\n    }, j, h);\n    x.subscribe([j.ON_AVAILABILITY_CHANGED,j.ON_UPDATE_ERROR,], function(ea, fa) {\n        g.inform(ea, fa);\n    });\n    var y = v(function() {\n        x.inform(j.ON_AVAILABILITY_CHANGED);\n    }, 0);\n    function z(ea, fa, ga, ha) {\n        var ia = r.set(ea, fa, ga, ha);\n        if (ia) {\n            y();\n        };\n    };\n    function aa(ea) {\n        var fa = (ea.payload.availability || {\n        });\n        for (var ga in fa) {\n            z(ga, fa[ga], true, \"mercury_tabs\");;\n        };\n    };\n    function ba(ea) {\n        var fa = x.getDebugInfo(ea), ga = ((fa.presence == j.ACTIVE)), ha = new i(\"/ajax/mercury/tabs_presence.php\").setData({\n            target_id: ea,\n            to_online: ga,\n            presence_source: fa.overlaySource,\n            presence_time: fa.overlayTime\n        }).setHandler(aa).setErrorHandler(w).setAllowCrossPageTransition(true).send();\n    };\n    function ca(ea, fa) {\n        fa.chat_config = m.getDebugInfo();\n        fa.available_list_debug_info = {\n        };\n        x.getAvailableIDs().forEach(function(ga) {\n            fa.available_list_debug_info[ga] = x.getDebugInfo(ga);\n        });\n        fa.available_list_poll_interval = (x._poller && x._poller.getInterval());\n    };\n    var da = new p(function(event) {\n        x.inform(event);\n    });\n    u(x, {\n        get: function(ea) {\n            return r.get(ea);\n        },\n        updateForID: function(ea) {\n            ba(ea);\n        },\n        getWebChatNotification: function() {\n            return da.getWebChatNotification();\n        },\n        isUserIdle: function() {\n            return da.getIsUserIdle();\n        },\n        isReady: function() {\n            return true;\n        },\n        set: function(ea, fa, ga) {\n            z(ea, fa, true, ga);\n        },\n        update: function() {\n            da.forceUpdate();\n        },\n        isIdle: function(ea) {\n            return (x.get(ea) == j.IDLE);\n        },\n        getOnlineIDs: function() {\n            return r.getOnlineIDs();\n        },\n        getAvailableIDs: function() {\n            return r.getAvailableIDs();\n        },\n        getOnlineCount: function() {\n            return r.getOnlineCount();\n        },\n        getDebugInfo: function(ea) {\n            var fa = r.getDebugInfo(ea), ga = s.getNow(ea);\n            if (ga) {\n                fa.name = ga.name;\n            };\n            return fa;\n        }\n    });\n    da.start();\n    g.subscribe(o.DUMP_EVENT, ca);\n    g.subscribe(l.getArbiterType(\"favorite_list\"), function(ea, fa) {\n        var ga = fa.obj, ha = (ga.value ? ga.value.split(\",\") : []);\n        n.init(ha);\n        y();\n    });\n    q.subscribe([\"privacy-changed\",\"privacy-availability-changed\",\"privacy-user-presence-response\",], y);\n    k.subscribe([k.CONNECTED,k.RECONNECTING,k.SHUTDOWN,k.MUTE_WARNING,k.UNMUTE_WARNING,], y);\n    g.subscribe(l.getArbiterType(\"buddylist_overlay\"), function(ea, fa) {\n        var ga = fa.obj.overlay;\n        for (var ha in ga) {\n            x.set(ha, ga[ha].a, (ga[ha].s || \"channel\"));;\n        };\n    });\n    g.subscribe([l.getArbiterType(\"typ\"),l.getArbiterType(\"ttyp\"),], function(ea, fa) {\n        var ga = fa.obj;\n        if ((ga.st === t.TYPING)) {\n            var ha = ga.from;\n            x.set(ha, j.ACTIVE, \"channel-typing\");\n        }\n    ;\n    });\n    a.AvailableList = e.exports = x;\n});\n__d(\"ChatImpressionLogger\", [\"AvailableList\",\"AsyncSignal\",\"ChatConfig\",\"ChatVisibility\",\"Poller\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"AsyncSignal\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"Poller\"), l = null, m = null, n = {\n        init: function(o) {\n            l = o;\n            var p = i.get(\"chat_impression_logging_periodical\", 0);\n            if (p) {\n                var q = i.get(\"periodical_impression_logging_config.interval\");\n                m = new k({\n                    interval: q,\n                    setupRequest: this.logImps.bind(this),\n                    clearOnQuicklingEvents: false\n                });\n            }\n        ;\n            this.init = function() {\n            \n            };\n        },\n        logImps: function(o) {\n            if (!j.isOnline()) {\n                return\n            };\n            var p = {\n                source: \"periodical_imps\"\n            }, q = l.getCachedSortedList(), r = [];\n            for (var s = 0; (s < q.length); s++) {\n                r[s] = g.get(q[s]);;\n            };\n            p.sorted_list = q.toString();\n            p.list_availability = r.toString();\n            o.setURI(\"/ajax/chat/imps_logging.php\").setData(p);\n        },\n        getOrderedList: function() {\n            return l;\n        },\n        logImpressions: function(o) {\n            var p = [], q = [];\n            if (i.get(\"chat_impression_logging_with_click\")) {\n                p = l.getCachedSortedList();\n                for (var r = 0; (r < p.length); r++) {\n                    q[r] = g.get(p[r]);;\n                };\n            }\n        ;\n            o.sorted_list = p.toString();\n            o.list_availability = q.toString();\n            new h(\"/ajax/chat/ct.php\", o).send();\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatTypeaheadConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        USER_TYPE: \"user\",\n        THREAD_TYPE: \"thread\",\n        FRIEND_TYPE: \"friend\",\n        NON_FRIEND_TYPE: \"non_friend\",\n        HEADER_TYPE: \"header\"\n    };\n    e.exports = g;\n});\n__d(\"Chat\", [\"Arbiter\",\"AvailableList\",\"ChatImpressionLogger\",\"ChatTypeaheadConstants\",\"MercuryParticipantTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"ChatImpressionLogger\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"MercuryParticipantTypes\");\n    function l(q, r) {\n        var s = (r && r.source);\n        if ((((((((s && (s === \"ordered_list\")) || (s === \"more_online_friends\")) || (s === \"online_friends\")) || (s === \"recent_threads_in_divebar_new\")) || (s === \"recent_threads_in_divebar\")) || (s === \"presence\")) || (s === \"typeahead\"))) {\n            r.viewport_width = document.body.clientWidth;\n            r.target = q;\n            r.target_presence = h.get(q);\n            i.logImpressions(r);\n        }\n    ;\n    };\n    var m = {\n        buddyListNub: \"buddylist-nub/initialized\",\n        sidebar: \"sidebar/initialized\"\n    };\n    function n(q, r) {\n        g.subscribe(m[q], function(event, s) {\n            r(s);\n        });\n    };\n    function o() {\n        return (((Math.random() * 2147483648) | 0)).toString(16);\n    };\n    var p = {\n        openTab: function(q, r, s) {\n            if (((window.External && window.External.Chat) && window.External.Chat.openWindow)) {\n                window.External.Chat.openWindow(q);\n            };\n            l.curry(q, s).defer();\n            d([\"MercuryThreads\",], function(t) {\n                if ((((!r || (r === k.FRIEND)) || (r === j.FRIEND_TYPE)) || (r === j.USER_TYPE))) {\n                    var u = t.get().getCanonicalThreadToUser(q), v = o();\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: u.thread_id,\n                        signature_id: v\n                    });\n                    return;\n                }\n            ;\n                if ((r === j.THREAD_TYPE)) {\n                    d([\"ChatOpenTab\",], function(w) {\n                        if (q) {\n                            w.openThread(q);\n                        }\n                         else w.openEmptyTab();\n                    ;\n                    });\n                };\n            });\n        },\n        openBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.show();\n                n(\"sidebar\", function(r) {\n                    r.enable();\n                });\n            });\n        },\n        closeBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.hide();\n            });\n        },\n        toggleSidebar: function() {\n            n(\"sidebar\", function(q) {\n                q.toggle();\n            });\n        },\n        goOnline: function(q) {\n            d([\"ChatVisibility\",], function(r) {\n                r.goOnline(q);\n            });\n        },\n        isOnline: function() {\n            var q = null;\n            d([\"ChatVisibility\",], function(r) {\n                q = r;\n            });\n            return (q && q.isOnline());\n        }\n    };\n    a.Chat = e.exports = p;\n}, 3);\n__d(\"OrderedFriendsList\", [\"AvailableList\",\"ChatConfig\",\"createArrayFrom\",\"ShortProfiles\",\"InitialChatFriendsList\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatConfig\"), i = b(\"createArrayFrom\"), j = b(\"ShortProfiles\"), k = [], l = {\n    }, m = [], n = {\n        contains: function(o) {\n            return (o in l);\n        },\n        compare: function(o, p) {\n            var q = n.getRank(o), r = n.getRank(p);\n            if ((q !== r)) {\n                return (q - r)\n            };\n            var s = j.getNowUnsafe(o), t = j.getNowUnsafe(p), u = ((((s || {\n            })).name || \"~\")).toLowerCase(), v = ((((t || {\n            })).name || \"~\")).toLowerCase();\n            if ((u !== v)) {\n                return ((u < v) ? -1 : 1)\n            };\n            return 0;\n        },\n        getList: function() {\n            if (h.get(\"chat_web_ranking_with_presence\")) {\n                n.reRank();\n            };\n            var o = i(k);\n            o = o.filter(function(p) {\n                var q = j.getNowUnsafe(p);\n                return (!q || (q.type == \"friend\"));\n            });\n            return o;\n        },\n        getRank: function(o) {\n            return ((o in l) ? l[o] : k.length);\n        },\n        reRank: function() {\n            var o = {\n            }, p = {\n            };\n            m.forEach(function(r, s) {\n                var t = r.substr(0, (r.length - 2)), u = r.substring((r.length - 1));\n                if ((typeof (p.uid) == \"undefined\")) {\n                    if ((typeof (o.uid) == \"undefined\")) {\n                        o[t] = g.get(t);\n                    };\n                    var v = o[t];\n                    if ((v == u)) {\n                        p[s] = t;\n                    };\n                }\n            ;\n            });\n            k = [];\n            for (var q in p) {\n                k.push(p[q]);;\n            };\n            k.forEach(function(r, s) {\n                l[r] = s;\n            });\n        }\n    };\n    (function() {\n        var o = b(\"InitialChatFriendsList\");\n        k = (o.list.length ? o.list : []);\n        if (h.get(\"chat_web_ranking_with_presence\")) {\n            m = k.slice();\n            n.reRank();\n        }\n    ;\n        k.forEach(function(p, q) {\n            l[p] = q;\n        });\n    })();\n    e.exports = (a.OrderedFriendsList || n);\n});\n__d(\"ChatSidebarConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LITESTAND_IMAGE_SIZE: 24,\n        LITESTAND_BLENDED_SIZE: 32,\n        IMAGE_SIZE: 28\n    };\n    e.exports = g;\n});\n__d(\"ChatTypeaheadBehavior\", [\"Chat\",\"ChatConfig\",\"ChatFavoriteList\",\"CSS\",\"DOM\",\"Rect\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Chat\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Rect\"), m = b(\"copyProperties\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n    m(o.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var p = this._typeahead;\n            this._subscriptions = [p.subscribe(\"focus\", function() {\n                p.getData().refreshData();\n            }),p.subscribe(\"blur\", function(q) {\n                p.getCore().reset();\n            }),p.subscribe(\"respond\", function(q, r) {\n                if ((r.value && (r.value === p.getCore().getValue()))) {\n                    if (!r.results.length) {\n                        var s = h.get(\"divebar_typeahead_group_fof\", 0);\n                        if ((s && !r.isAsync)) {\n                            return\n                        };\n                        var t = k.create(\"div\", {\n                            className: \"noResults\"\n                        }, \"Friend not found.\");\n                        k.setContent(p.getView().getElement(), t);\n                    }\n                ;\n                    j.addClass(p.getElement(), \"hasValue\");\n                }\n            ;\n            }),p.subscribe(\"reset\", function() {\n                j.removeClass(p.getElement(), \"hasValue\");\n            }),p.subscribe(\"select\", function(q, r) {\n                if (i.isEditMode()) {\n                    i.toggleID(r.selected.uid);\n                    i.save();\n                }\n                 else {\n                    var s = j.hasClass(document.documentElement, \"sidebarMode\"), t = {\n                        mode: (s ? \"sidebar\" : \"chatNub\"),\n                        source: \"typeahead\",\n                        type: r.selected.type,\n                        typeahead: true\n                    };\n                    g.openTab(r.selected.uid, r.selected.type, t);\n                }\n            ;\n            }),p.subscribe(\"highlight\", function(q, r) {\n                if ((r.index >= 0)) {\n                    var s = p.getView().getItems()[r.index];\n                    if (s) {\n                        var t = new l(s), u = s.offsetParent, v = t.boundWithin(new l(u)).getPositionVector();\n                        t.getPositionVector().sub(v).scrollElementBy(u);\n                    }\n                ;\n                }\n            ;\n            }),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(p) {\n                this._typeahead.unsubscribe(p);\n            }.bind(this));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatTypeaheadCore\", [\"function-extensions\",\"Class\",\"Event\",\"Keys\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"Event\"), i = b(\"Keys\"), j = b(\"TypeaheadCore\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"shield\");\n    function n(o) {\n        this.parent.construct(this, o);\n    };\n    g.extend(n, j);\n    k(n.prototype, {\n        init: function(o, p, q) {\n            this.parent.init(o, p, q);\n            this.informBeginActive = false;\n            this.informEndActive = false;\n            this.data.subscribe(\"respond\", function() {\n                if (this.informBeginActive) {\n                    this.informBeginActive = false;\n                    this.inform(\"sidebar/typeahead/active\", true);\n                }\n                 else if (this.informEndActive) {\n                    this.informEndActive = false;\n                    this.inform(\"sidebar/typeahead/active\", false);\n                }\n                \n            ;\n            }.bind(this));\n        },\n        handleTab: l,\n        keydown: function(event) {\n            var o = h.getKeyCode(event);\n            if ((o === i.ESC)) {\n                m(this.reset, this).defer();\n                return event.kill();\n            }\n        ;\n            return this.parent.keydown(event);\n        },\n        checkValue: function() {\n            var o = this.getValue(), p = this.value;\n            if ((o == p)) {\n                return\n            };\n            if ((p && !o)) {\n                this.typeaheadActive = false;\n                this.informEndActive = true;\n            }\n             else if ((!p && o)) {\n                this.typeaheadActive = true;\n                this.informBeginActive = true;\n                this.inform(\"sidebar/typeahead/preActive\");\n            }\n            \n        ;\n            this.parent.checkValue();\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatTypeaheadDataSource\", [\"Class\",\"DataSource\",\"Env\",\"JSLogger\",\"MercuryParticipantTypes\",\"OrderedFriendsList\",\"Run\",\"ShortProfiles\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"MercuryParticipantTypes\"), l = b(\"OrderedFriendsList\"), m = b(\"Run\"), n = b(\"ShortProfiles\"), o = b(\"copyProperties\");\n    function p(q) {\n        q = (q || {\n        });\n        q.kanaNormalization = true;\n        this.parent.construct(this, q);\n        this.persistOnRefresh = (q.persistOnRefresh !== false);\n        this.showOfflineUsers = !!q.showOfflineUsers;\n        this._jslog = j.create(\"chat_typeahead\");\n        this._jslog.log(\"created\");\n    };\n    g.extend(p, h);\n    o(p.prototype, {\n        init: function() {\n            this._jslog.log(\"init\");\n            this.parent.init();\n            this._update();\n        },\n        bootstrap: function() {\n            this._jslog.log(\"bootstrap\");\n            this.parent.bootstrap();\n            if (this.showOfflineUsers) {\n                this._jslog.log(\"show_offline_users\");\n                this._jslog.log(\"ensured_short_profiles\");\n                if (n.hasAll()) {\n                    this._update();\n                }\n                 else {\n                    this._jslog.log(\"fetch_all_short_profiles\");\n                    n.fetchAll();\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                    var q = n.subscribe(\"updated\", function() {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                        this._update();\n                    }.bind(this));\n                    if (!this.persistOnRefresh) {\n                        m.onLeave(function() {\n                            n.unsubscribe(q);\n                        });\n                    };\n                }\n            ;\n            }\n        ;\n        },\n        _update: function() {\n            d([\"AvailableList\",], function(q) {\n                var r = this.value;\n                this.dirty();\n                var s = n.getCachedProfileIDs(), t = s.filter(function(v) {\n                    var w = n.getNow(v);\n                    return (w.type === k.FRIEND);\n                });\n                t.sort(l.compare);\n                var u = [];\n                t.forEach(function(v) {\n                    if ((v == i.user)) {\n                        return\n                    };\n                    var w = q.get(v);\n                    if ((!this.showOfflineUsers && (w !== q.ACTIVE))) {\n                        return\n                    };\n                    var x = n.getNow(v), y = x.additionalName;\n                    if (x.hasOwnProperty(\"searchTokens\")) {\n                        y = ((y !== null) ? ((y + \" \") + x.searchTokens.join(\" \")) : x.searchTokens.join(\" \"));\n                    };\n                    u.push({\n                        uid: v,\n                        text: x.name,\n                        tokens: y,\n                        localized_text: x.name,\n                        additional_text: x.additionalName,\n                        photo: x.thumbSrc,\n                        type: x.type\n                    });\n                }.bind(this));\n                if (u.length) {\n                    this.addEntries(u);\n                };\n                this.value = r;\n                if (r) {\n                    this.query(r);\n                };\n            }.bind(this));\n        },\n        refreshData: function() {\n            d([\"AvailableList\",], function(q) {\n                q.update();\n            }.bind(this));\n        }\n    });\n    e.exports = p;\n});\n__d(\"ChatSidebarHeader.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"ReactChatSidebarHeader\",\n        render: function() {\n            return (g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__header\"\n            }, g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__headertext\"\n            }, this.props.name)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ChatSidebarItem.react\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"ChatSidebarConstants\",\"Image.react\",\"Link.react\",\"React\",\"SplitImage.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"ChatSidebarConstants\"), k = b(\"Image.react\"), l = b(\"Link.react\"), m = b(\"React\"), n = b(\"SplitImage.react\"), o = b(\"cx\"), p = b(\"ix\"), q = 9, r = m.createClass({\n        displayName: \"ChatSidebarItem\",\n        render: function() {\n            var s = ((((\"-cx-PRIVATE-chatSidebarItem__link\") + ((this.props.context ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__hascontext\") : \"\"))) + (((this.props.unreadCount && h.get(\"litestand_buddylist_count\")) ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__hasunreadcount\") : \"\")))), t;\n            if (this.props.litestandSidebar) {\n                t = m.DOM.div({\n                    \"aria-label\": this.props.name,\n                    className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-position\": \"right\"\n                });\n            };\n            return (l({\n                className: s,\n                href: this.props.href,\n                onClick: this.props.onClick,\n                rel: \"ignore\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__contents\"\n            }, this.renderFavorite(), m.DOM.div({\n                className: \"-cx-PUBLIC-chatSidebarItem__piccontainer\"\n            }, this.renderImage(), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__picborder\"\n            })), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__rightcontent\"\n            }, this.renderBirthday(), this.renderUnreadCount(), this.renderStatus()), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__name\"\n            }, this.props.name), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__context\"\n            }, this.props.context)), t));\n        },\n        renderFavorite: function() {\n            if ((this.props.isAdded === undefined)) {\n                return null\n            };\n            var s = null;\n            if (this.props.litestandSidebar) {\n                s = (this.props.isAdded ? p(\"/images/litestand/bookmarks/sidebar/remove.png\") : p(\"/images/litestand/bookmarks/sidebar/add.png\"));\n            }\n             else s = (this.props.isAdded ? p(\"/images/chat/delete.png\") : p(\"/images/chat/add.png\"));\n        ;\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__favoritebutton\") + ((!this.props.showEditButton ? (\" \" + \"hidden_elem\") : \"\"))));\n            return (m.DOM.div({\n                className: t,\n                onClick: this.props.onEditClick\n            }, k({\n                className: \"-cx-PRIVATE-chatSidebarItem__favoriteicon\",\n                src: s\n            })));\n        },\n        renderImage: function() {\n            var s = (this.props.imageSize || j.IMAGE_SIZE);\n            return n({\n                size: s,\n                srcs: this.props.images\n            });\n        },\n        renderUnreadCount: function() {\n            var s = this.props.unreadCount;\n            if ((!s || !h.get(\"litestand_buddylist_count\"))) {\n                return null\n            };\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__unreadcount\") + (((s > q) ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__largecount\") : \"\"))));\n            if ((s > q)) {\n                s = (q + \"+\");\n            };\n            return (m.DOM.div({\n                className: t\n            }, s));\n        },\n        renderStatus: function() {\n            var s = this.getStatusSrc();\n            if (!s) {\n                return null\n            };\n            if (((this.props.unreadCount && h.get(\"litestand_blended_sidebar\")) && h.get(\"litestand_buddylist_count\"))) {\n                return\n            };\n            var t = (h.get(\"divebar_favorite_list\", 0) && i.isEditMode());\n            if (t) {\n                return\n            };\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__status\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__statustime\"\n            }, this.props.statusTime), k({\n                className: \"-cx-PRIVATE-chatSidebarItem__statusicon\",\n                src: s\n            })));\n        },\n        renderBirthday: function() {\n            if (!this.props.birthday) {\n                return null\n            };\n            return (k({\n                className: \"-cx-PRIVATE-chatSidebarItem__birthdayicon\",\n                src: p(\"/images/gifts/icons/cake_icon.png\")\n            }));\n        },\n        getStatusSrc: function() {\n            switch (this.props.status) {\n              case g.ACTIVE:\n            \n              case g.IDLE:\n                if (this.props.litestandSidebar) {\n                    return (h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/online.png\") : p(\"/images/litestand/sidebar/online.png\"))\n                };\n                return p(\"/images/chat/status/online.png\");\n              case g.MOBILE:\n                if (this.props.litestandSidebar) {\n                    return (h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/pushable.png\") : p(\"/images/litestand/sidebar/pushable.png\"))\n                };\n                return p(\"/images/chat/status/mobile.png\");\n            };\n            return null;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatSidebarThread.react\", [\"ChatSidebarItem.react\",\"WebMessengerPermalinkConstants\",\"React\",\"MercuryThreadMetadataRawRenderer\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"React\"), j = b(\"MercuryThreadMetadataRawRenderer\"), k = i.createClass({\n        displayName: \"ChatSidebarThread\",\n        render: function() {\n            var n = this.props.name, o = l(this.props.threadID, this.props.participants), p = (n ? o : undefined), q = h.getURIPathForThreadID(this.props.threadID), r = m(this.props.image, this.props.participants), s = (n ? n : o);\n            return (g({\n                context: p,\n                href: {\n                    url: q\n                },\n                imageSize: this.props.imageSize,\n                images: r,\n                litestandSidebar: this.props.litestandSidebar,\n                name: s,\n                status: this.props.status,\n                unreadCount: this.props.unreadCount\n            }));\n        }\n    });\n    function l(n, o) {\n        return j.renderRawParticipantList(n, o, o.length, {\n            names_renderer: j.renderShortNames\n        });\n    };\n    function m(n, o) {\n        if (n) {\n            return n\n        };\n        return o.map(function(p) {\n            return p.image_src;\n        });\n    };\n    e.exports = k;\n});\n__d(\"ChatSidebarUser.react\", [\"ChatFavoriteList\",\"WebMessengerPermalinkConstants\",\"ChatConfig\",\"React\",\"ChatSidebarItem.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatFavoriteList\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"ChatConfig\"), j = b(\"React\"), k = b(\"ChatSidebarItem.react\"), l = j.createClass({\n        displayName: \"ChatSidebarUser\",\n        render: function() {\n            var m = h.getURIPathForIDOrVanity(this.props.userID), n = g.isFavored(this.props.userID), o = function() {\n                g.toggleID(this.props.userID);\n            }.bind(this), p = (i.get(\"divebar_favorite_list\", 0) ? n : undefined);\n            return (k({\n                href: {\n                    url: m\n                },\n                imageSize: this.props.imageSize,\n                images: this.props.image,\n                litestandSidebar: this.props.litestandSidebar,\n                isAdded: p,\n                showEditButton: g.isEditMode(),\n                name: this.props.name,\n                onEditClick: o,\n                status: this.props.status,\n                birthday: this.props.birthday,\n                statusTime: this.props.statusTime,\n                context: this.props.context\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatTypeaheadRenderer\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatSidebarConstants\",\"ChatSidebarHeader.react\",\"ChatSidebarThread.react\",\"ChatSidebarUser.react\",\"ChatTypeaheadConstants\",\"DOM\",\"LastMobileActiveTimes\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarHeader.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"ChatSidebarUser.react\"), m = b(\"ChatTypeaheadConstants\"), n = b(\"DOM\"), o = b(\"LastMobileActiveTimes\"), p = b(\"MercuryParticipants\"), q = b(\"PresenceStatus\"), r = b(\"React\"), s = {\n    };\n    function t(z, aa) {\n        if (!((z in s))) {\n            s[z] = n.create(\"li\");\n        };\n        r.renderComponent(aa, s[z]);\n        return s[z];\n    };\n    function u(z) {\n        return t(z.text, j({\n            name: z.text\n        }));\n    };\n    function v() {\n        if ((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\"))) {\n            return (h.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE)\n        };\n        return i.IMAGE_SIZE;\n    };\n    function w(z) {\n        var aa = z.mercury_thread.participants.map(function(ba) {\n            return p.getUserID(ba);\n        });\n        return t(z.uid, k({\n            image: z.mercury_thread.image_src,\n            imageSize: v(),\n            litestandSidebar: (h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\")),\n            name: z.mercury_thread.name,\n            participants: z.participants_to_render,\n            status: q.getGroup(aa),\n            threadID: z.uid\n        }));\n    };\n    function x(z) {\n        var aa = q.get(z.uid), ba = (((aa === g.MOBILE)) ? o.getShortDisplay(z.uid) : null), ca = ((z.render_type == \"non_friend\") ? z.subtext : null);\n        return t(z.uid, l({\n            image: z.photo,\n            imageSize: v(),\n            litestandSidebar: h.get(\"litestand\", 0),\n            name: z.text,\n            status: aa,\n            birthday: q.isBirthday(z.uid),\n            statusTime: ba,\n            userID: z.uid,\n            context: ca\n        }));\n    };\n    function y(z, aa) {\n        if ((z.type === m.HEADER_TYPE)) {\n            return u(z)\n        };\n        if ((z.type == m.THREAD_TYPE)) {\n            return w(z)\n        };\n        return x(z);\n    };\n    e.exports = y;\n});\n__d(\"ChatTypeaheadView\", [\"arrayContains\",\"BucketedTypeaheadView\",\"ChatConfig\",\"Class\",\"ChatTypeaheadConstants\",\"Env\",\"MercuryThreadSearchUtils\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"BucketedTypeaheadView\"), i = b(\"ChatConfig\"), j = b(\"Class\"), k = b(\"ChatTypeaheadConstants\"), l = b(\"Env\"), m = b(\"MercuryThreadSearchUtils\"), n = b(\"copyProperties\"), o = b(\"tx\"), p = i.get(\"divebar_typeahead_group_fof\", 0);\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n        this.typeObjects = {\n        };\n        this.typeObjectsOrder = [];\n        this.typeObjects[k.NON_FRIEND_TYPE] = {\n            uid: k.NON_FRIEND_TYPE,\n            type: k.HEADER_TYPE,\n            text: \"FRIENDS OF FRIENDS\"\n        };\n        this.typeObjectsOrder.push(k.NON_FRIEND_TYPE);\n        this.typeObjects[k.THREAD_TYPE] = {\n            uid: k.THREAD_TYPE,\n            type: k.HEADER_TYPE,\n            text: \"GROUP CONVERSATIONS\"\n        };\n        this.typeObjectsOrder.push(k.THREAD_TYPE);\n        this.typeObjects[k.FRIEND_TYPE] = {\n            disabled: true,\n            uid: k.FRIEND_TYPE,\n            type: k.HEADER_TYPE,\n            text: \"FRIENDS\"\n        };\n        this.typeObjectsOrder.push(k.FRIEND_TYPE);\n    };\n    j.extend(q, h);\n    n(q.prototype, {\n        buildBuckets: function(r, s) {\n            if (p) {\n                s = s.reverse();\n                s = s.filter(function(t) {\n                    var u = (t.render_type || t.type);\n                    if ((u === \"thread\")) {\n                        var v = (\"fbid:\" + l.user);\n                        if (!g(t.mercury_thread.participants, v)) {\n                            return false\n                        };\n                        var w = t.participants_to_render.some(function(y) {\n                            return m.queryMatchesName(r, y.name);\n                        }), x = m.queryMatchesName(r, t.mercury_thread.name);\n                        if ((!w && !x)) {\n                            return false\n                        };\n                    }\n                ;\n                    return true;\n                });\n            }\n        ;\n            s = this.parent.buildBuckets(r, s);\n            if (!p) {\n                s = s.filter(function(t) {\n                    return (t && !t.disabled);\n                });\n            };\n            return s;\n        },\n        getDefaultIndex: function(r) {\n            if (!p) {\n                return this.parent.getDefaultIndex(r)\n            };\n            if ((r.length === 0)) {\n                return -1\n            };\n            var s = (r.length - 1);\n            while ((!this.isHighlightable(r[s]) && (s >= 0))) {\n                s--;;\n            };\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"AbstractButton.react\", [\"Link.react\",\"ReactPropTypes\",\"React\",\"cx\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = b(\"invariant\");\n    function l(n, o) {\n        if (n.props.className) {\n            n.props.className += (\" \" + o);\n        }\n         else n.props.className = o;\n    ;\n    };\n    var m = i.createClass({\n        displayName: \"AbstractButton\",\n        propTypes: {\n            image: function(n, o, p) {\n                var q = n[o];\n                k(((q == null) || i.isValidComponent(q)));\n                return q;\n            },\n            depressed: h.bool,\n            imageOnRight: h.bool,\n            href: h.object\n        },\n        render: function() {\n            var n = ((((\"-cx-PRIVATE-abstractButton__root\") + ((this.props.disabled ? (\" \" + \"-cx-PUBLIC-abstractButton__disabled\") : \"\"))) + ((this.props.depressed ? (\" \" + \"-cx-PUBLIC-abstractButton__depressed\") : \"\")))), o = this.props.image, p = this.props.label;\n            if ((o && p)) {\n                if (this.props.imageOnRight) {\n                    l(o, \"mls\");\n                }\n                 else l(o, \"mrs\");\n            \n            };\n            var q;\n            if (this.props.href) {\n                q = g({\n                    disabled: null\n                });\n            }\n             else {\n                var r = (this.props.type || \"submit\");\n                q = i.DOM.button({\n                    type: r\n                });\n                if ((r === \"submit\")) {\n                    q.props.value = \"1\";\n                };\n            }\n        ;\n            if (this.props.imageOnRight) {\n                q.props.children = [p,o,];\n            }\n             else q.props.children = [o,p,];\n        ;\n            q.props.className = n;\n            q.props.label = null;\n            return this.transferPropsTo(q);\n        }\n    });\n    e.exports = m;\n});\n__d(\"XUIButton.react\", [\"AbstractButton.react\",\"ReactPropTypes\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AbstractButton.react\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = \"medium\", l = i.createClass({\n        displayName: \"XUIButton\",\n        propTypes: {\n            use: h.oneOf([\"default\",\"special\",\"confirm\",]),\n            size: h.oneOf([\"small\",\"medium\",\"large\",\"xlarge\",\"xxlarge\",]),\n            suppressed: h.bool\n        },\n        getDefaultProps: function() {\n            return {\n                use: \"default\",\n                size: k,\n                suppressed: false\n            };\n        },\n        getButtonSize: function() {\n            return (this.props.size || k);\n        },\n        render: function() {\n            var m = this.props.use, n = this.getButtonSize(), o = this.props.suppressed, p = ((((((((((((\"-cx-PRIVATE-xuiButton__root\") + (((n === \"small\") ? (\" \" + \"-cx-PRIVATE-xuiButton__small\") : \"\"))) + (((n === \"medium\") ? (\" \" + \"-cx-PRIVATE-xuiButton__medium\") : \"\"))) + (((n === \"large\") ? (\" \" + \"-cx-PRIVATE-xuiButton__large\") : \"\"))) + (((n === \"xlarge\") ? (\" \" + \"-cx-PRIVATE-xuiButton__xlarge\") : \"\"))) + (((n === \"xxlarge\") ? (\" \" + \"-cx-PRIVATE-xuiButton__xxlarge\") : \"\"))) + (((m === \"default\") ? (\" \" + \"-cx-PRIVATE-xuiButton__default\") : \"\"))) + (((m === \"confirm\") ? (\" \" + \"-cx-PRIVATE-xuiButton__confirm\") : \"\"))) + (((m === \"special\") ? (\" \" + \"-cx-PRIVATE-xuiButton__special\") : \"\"))) + ((o ? (\" \" + \"-cx-PRIVATE-xuiButton__suppressed\") : \"\"))) + ((((m === \"confirm\") || (m === \"special\")) ? (\" \" + \"selected\") : \"\"))));\n            return this.transferPropsTo(g({\n                className: p\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FeatureDetection\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\");\n    e.exports = {\n        isFileAPISupported: function() {\n            if (((g.webkit() && !g.chrome()) && g.windows())) {\n                return false\n            };\n            return (((\"FileList\" in window)) && ((\"FormData\" in window)));\n        },\n        isBlobFactorySupported: function() {\n            return !!a.Blob;\n        }\n    };\n});\n__d(\"AsyncUploadBase\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"Form\",\"FeatureDetection\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Form\"), k = b(\"FeatureDetection\"), l = b(\"copyProperties\"), m = b(\"removeFromArray\");\n    function n(p) {\n        this.setURI(p);\n    };\n    n.isSupported = function() {\n        return k.isFileAPISupported();\n    };\n    l(n.prototype, g, {\n        _limit: 10,\n        setAllowCrossOrigin: function(p) {\n            this._allowCrossOrigin = !!p;\n            return this;\n        },\n        setData: function(p) {\n            this._data = p;\n            return this;\n        },\n        setLimit: function(p) {\n            this._limit = p;\n            return this;\n        },\n        setRelativeTo: function(p) {\n            this._relativeTo = p;\n            return this;\n        },\n        setStatusElement: function(p) {\n            this._statusElement = p;\n            return this;\n        },\n        setURI: function(p) {\n            this._uri = p;\n            return this;\n        },\n        suspend: function() {\n            this._suspended = true;\n            return this;\n        },\n        resume: function() {\n            this._suspended = false;\n            this._processQueue();\n            return this;\n        },\n        isUploading: function() {\n            return this._inFlight;\n        },\n        _createFileUpload: function(p, q, r) {\n            return new o(p, q, r);\n        },\n        _parseFiles: function(p) {\n            var q = {\n            };\n            for (var r in p) {\n                var s = p[r];\n                if (Array.isArray(s)) {\n                    q[r] = s;\n                }\n                 else {\n                    q[r] = [];\n                    if ((s instanceof window.FileList)) {\n                        for (var t = 0; (t < s.length); t++) {\n                            q[r].push(s.item(t));;\n                        };\n                    }\n                     else if (((s instanceof window.File) || (s instanceof window.Blob))) {\n                        q[r].push(s);\n                    }\n                ;\n                }\n            ;\n            };\n            return q;\n        },\n        _processQueue: function() {\n            if (this._suspended) {\n                return\n            };\n            while ((this._pending.length < this._limit)) {\n                if (!this._waiting.length) {\n                    break;\n                };\n                var p = this._waiting.shift();\n                this._processUpload(p);\n                this._pending.push(p);\n            };\n        },\n        _processUpload: function(p) {\n            var q = j.createFormData((p.getData() || this._data));\n            if (p.getFile()) {\n                q.append(p.getName(), p.getFile());\n                q.append(\"upload_id\", p.getFile().uploadID);\n            }\n        ;\n            var r = new h().setAllowCrossOrigin(this._allowCrossOrigin).setURI(this._uri).setRawData(q).setRelativeTo(this._relativeTo).setStatusElement(this._statusElement).setHandler(this._success.bind(this, p)).setErrorHandler(this._failure.bind(this, p)).setUploadProgressHandler(this._progress.bind(this, p)).setInitialHandler(this._initial.bind(this, p));\n            r.send();\n            p.setAsyncRequest(r);\n            this._inFlight = true;\n            this.inform(\"start\", p);\n        },\n        _abort: function(p) {\n            m(this._waiting, p);\n            p.abort();\n        },\n        _initial: function(p) {\n            this.inform(\"initial\", p);\n        },\n        _success: function(p, q) {\n            this._complete(p);\n            this.inform(\"success\", p.handleSuccess(q));\n            this._processQueue();\n        },\n        _failure: function(p, q) {\n            this._complete(p);\n            if ((this.inform(\"failure\", p.handleFailure(q)) !== false)) {\n                i.defaultErrorHandler(q);\n            };\n            this._processQueue();\n        },\n        _progress: function(p, event) {\n            this.inform(\"progress\", p.handleProgress(event));\n        },\n        _complete: function(p) {\n            m(this._pending, p);\n            if (!this._pending.length) {\n                this._inFlight = false;\n            };\n        }\n    });\n    var o = function(p, q, r) {\n        this._name = p;\n        this._file = q;\n        this._data = r;\n        this._success = null;\n        this._response = null;\n        this._progressEvent = null;\n        this._request = null;\n    };\n    l(o.prototype, {\n        getName: function() {\n            return this._name;\n        },\n        getFile: function() {\n            return this._file;\n        },\n        getData: function() {\n            return this._data;\n        },\n        isComplete: function() {\n            return (this._success !== null);\n        },\n        isSuccess: function() {\n            return (this._success === true);\n        },\n        getResponse: function() {\n            return this._response;\n        },\n        getProgressEvent: function() {\n            return this._progressEvent;\n        },\n        setAsyncRequest: function(p) {\n            this._request = p;\n            return this;\n        },\n        isWaiting: function() {\n            return !this._request;\n        },\n        abort: function() {\n            (this._request && this._request.abort());\n            this._request = null;\n        },\n        handleSuccess: function(p) {\n            this._success = true;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleFailure: function(p) {\n            this._success = false;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleProgress: function(event) {\n            this._progressEvent = event;\n            return this;\n        }\n    });\n    e.exports = n;\n});\n__d(\"AsyncUploadRequest\", [\"AsyncUploadBase\",\"Class\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncUploadBase\"), h = b(\"Class\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n    j.isSupported = function() {\n        return g.isSupported();\n    };\n    h.extend(j, g);\n    i(j.prototype, {\n        setFiles: function(k) {\n            this._files = this._parseFiles(k);\n            return this;\n        },\n        send: function() {\n            if (this._inFlight) {\n                return\n            };\n            this._inFlight = true;\n            this._uploads = [];\n            for (var k in this._files) {\n                this._files[k].forEach(function(l) {\n                    this._uploads.push(this._createFileUpload(k, l));\n                }.bind(this));;\n            };\n            if (this._uploads.length) {\n                this._waiting = this._uploads.slice(0);\n                this._pending = [];\n                this._processQueue();\n            }\n             else this._processUpload(this._createFileUpload(null, null));\n        ;\n        },\n        _processQueue: function() {\n            this.parent._processQueue();\n            if ((!this._pending.length && !this._waiting.length)) {\n                this.inform(\"complete\", this._uploads);\n            };\n        }\n    });\n    e.exports = j;\n});\n__d(\"CacheStorage\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        memory: k,\n        localstorage: i,\n        sessionstorage: j\n    };\n    function i() {\n        this._store = a.localStorage;\n    };\n    i.available = function() {\n        try {\n            return !!a.localStorage;\n        } catch (m) {\n            return false;\n        };\n    };\n    g(i.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; (n < this._store.length); n++) {\n                m.push(this._store.key(n));;\n            };\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function j() {\n        this._store = a.sessionStorage;\n    };\n    j.available = function() {\n        try {\n            return !!a.sessionStorage;\n        } catch (m) {\n            return false;\n        };\n    };\n    g(j.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; (n < this._store.length); n++) {\n                m.push(this._store.key(n));;\n            };\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function k() {\n        this._store = {\n        };\n    };\n    k.available = function() {\n        return true;\n    };\n    g(k.prototype, {\n        keys: function() {\n            return Object.keys(this._store);\n        },\n        get: function(m) {\n            if ((this._store[m] === undefined)) {\n                return null\n            };\n            return this._store[m];\n        },\n        set: function(m, n) {\n            this._store[m] = n;\n        },\n        remove: function(m) {\n            if ((m in this._store)) {\n                delete this._store[m];\n            };\n        },\n        clear: function() {\n            this._store = {\n            };\n        }\n    });\n    function l(m, n) {\n        this._key_prefix = (n || \"_cs_\");\n        this._magic_prefix = \"_@_\";\n        if (((m == \"AUTO\") || !m)) {\n            for (var o in h) {\n                var p = h[o];\n                if (p.available()) {\n                    m = o;\n                    break;\n                }\n            ;\n            }\n        };\n        if (m) {\n            if ((typeof m == \"string\")) {\n                if ((!h[m] || !h[m].available())) {\n                    this._backend = new k();\n                }\n                 else this._backend = new h[m]();\n            ;\n            }\n             else if ((!m.available || !m.available())) {\n                this._backend = new k();\n            }\n             else this._backend = m;\n            \n        \n        };\n    };\n    g(l, {\n        getAllStorageTypes: function() {\n            return Object.keys(h);\n        }\n    });\n    g(l.prototype, {\n        keys: function() {\n            var m = [];\n            try {\n                if (this._backend) {\n                    var o = this._backend.keys();\n                    for (var p = 0; (p < o.length); p++) {\n                        if ((o[p].substr(0, this._key_prefix.length) == this._key_prefix)) {\n                            m.push(o[p].substr(this._key_prefix.length));\n                        };\n                    };\n                }\n            ;\n            } catch (n) {\n            \n            };\n            return m;\n        },\n        set: function(m, n) {\n            if (this._backend) {\n                if ((typeof n == \"string\")) {\n                    n = (this._magic_prefix + n);\n                }\n                 else n = JSON.stringify(n);\n            ;\n                try {\n                    this._backend.set((this._key_prefix + m), n);\n                } catch (o) {\n                \n                };\n            }\n        ;\n        },\n        get: function(m, n) {\n            var o;\n            if (this._backend) {\n                try {\n                    o = this._backend.get((this._key_prefix + m));\n                } catch (p) {\n                    o = null;\n                };\n                if ((o !== null)) {\n                    if ((o.substr(0, this._magic_prefix.length) == this._magic_prefix)) {\n                        o = o.substr(this._magic_prefix.length);\n                    }\n                     else try {\n                        o = JSON.parse(o);\n                    } catch (q) {\n                        o = undefined;\n                    }\n                ;\n                }\n                 else o = undefined;\n            ;\n            }\n        ;\n            if (((o === undefined) && (n !== undefined))) {\n                o = n;\n                if (this._backend) {\n                    var r;\n                    if ((typeof o == \"string\")) {\n                        r = (this._magic_prefix + o);\n                    }\n                     else r = JSON.stringify(o);\n                ;\n                    try {\n                        this._backend.set((this._key_prefix + m), r);\n                    } catch (p) {\n                    \n                    };\n                }\n            ;\n            }\n        ;\n            return o;\n        },\n        remove: function(m) {\n            if (this._backend) {\n                try {\n                    this._backend.remove((this._key_prefix + m));\n                } catch (n) {\n                \n                }\n            };\n        }\n    });\n    e.exports = l;\n});\n__d(\"DOMWrapper\", [], function(a, b, c, d, e, f) {\n    var g, h, i = {\n        setRoot: function(j) {\n            g = j;\n        },\n        getRoot: function() {\n            return (g || document.body);\n        },\n        setWindow: function(j) {\n            h = j;\n        },\n        getWindow: function() {\n            return (h || self);\n        }\n    };\n    e.exports = i;\n});\n__d(\"Flash\", [\"DOMWrapper\",\"QueryString\",\"UserAgent\",\"copyProperties\",\"guid\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMWrapper\"), h = b(\"QueryString\"), i = b(\"UserAgent\"), j = b(\"copyProperties\"), k = b(\"guid\"), l = {\n    }, m, n = g.getWindow().document;\n    function o(t) {\n        var u = n.getElementById(t);\n        if (u) {\n            u.parentNode.removeChild(u);\n        };\n        delete l[t];\n    };\n    function p() {\n        for (var t in l) {\n            if (l.hasOwnProperty(t)) {\n                o(t);\n            };\n        };\n    };\n    function q(t) {\n        return t.replace(/\\d+/g, function(u) {\n            return (\"000\".substring(u.length) + u);\n        });\n    };\n    function r(t) {\n        if (!m) {\n            if ((i.ie() >= 9)) {\n                window.attachEvent(\"onunload\", p);\n            };\n            m = true;\n        }\n    ;\n        l[t] = t;\n    };\n    var s = {\n        embed: function(t, u, v, w) {\n            var x = k();\n            t = encodeURI(t);\n            v = j({\n                allowscriptaccess: \"always\",\n                flashvars: w,\n                movie: t\n            }, (v || {\n            }));\n            if ((typeof v.flashvars == \"object\")) {\n                v.flashvars = h.encode(v.flashvars);\n            };\n            var y = [];\n            for (var z in v) {\n                if ((v.hasOwnProperty(z) && v[z])) {\n                    y.push(((((\"\\u003Cparam name=\\\"\" + encodeURI(z)) + \"\\\" value=\\\"\") + encodeURI(v[z])) + \"\\\"\\u003E\"));\n                };\n            };\n            var aa = n.createElement(\"div\"), ba = (((((((((\"\\u003Cobject \" + ((i.ie() ? \"classid=\\\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\\\" \" : \"type=\\\"application/x-shockwave-flash\\\"\"))) + \"data=\\\"\") + t) + \"\\\" \") + \"id=\\\"\") + x) + \"\\\"\\u003E\") + y.join(\"\")) + \"\\u003C/object\\u003E\");\n            aa.innerHTML = ba;\n            var ca = u.appendChild(aa.firstChild);\n            r(x);\n            return ca;\n        },\n        remove: o,\n        getVersion: function() {\n            var t = \"Shockwave Flash\", u = \"application/x-shockwave-flash\", v = \"ShockwaveFlash.ShockwaveFlash\", w;\n            if ((navigator.plugins && (typeof navigator.plugins[t] == \"object\"))) {\n                var x = navigator.plugins[t].description;\n                if ((((x && navigator.mimeTypes) && navigator.mimeTypes[u]) && navigator.mimeTypes[u].enabledPlugin)) {\n                    w = x.match(/\\d+/g);\n                };\n            }\n        ;\n            if (!w) {\n                try {\n                    w = (new ActiveXObject(v)).GetVariable(\"$version\").match(/(\\d+),(\\d+),(\\d+),(\\d+)/);\n                    w = Array.prototype.slice.call(w, 1);\n                } catch (y) {\n                \n                }\n            };\n            return w;\n        },\n        checkMinVersion: function(t) {\n            var u = s.getVersion();\n            if (!u) {\n                return false\n            };\n            return (q(u.join(\".\")) >= q(t));\n        },\n        isAvailable: function() {\n            return !!s.getVersion();\n        }\n    };\n    e.exports = s;\n});\n__d(\"PhotosUploadWaterfall\", [\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = {\n        APP_FLASH: \"flash_pro\",\n        APP_SIMPLE: \"simple\",\n        APP_ARCHIVE: \"archive\",\n        APP_COMPOSER: \"composer\",\n        APP_MESSENGER: \"messenger\",\n        APP_HTML5: \"html5\",\n        APP_CHAT: \"chat\",\n        INSTALL_CANCEL: 1,\n        INSTALL_INSTALL: 2,\n        INSTALL_UPDATE: 3,\n        INSTALL_REINSTALL: 4,\n        INSTALL_PERMA_CANCEL: 5,\n        INSTALL_SILENT_SKIP: 6,\n        INSTALL_DOWNLOAD: 7,\n        CERROR_RESIZING_FAILED: 6,\n        CERROR_MARKER_EXTRACTION_FAILED: 9,\n        BEGIN: 1,\n        UPLOAD_START: 4,\n        ALL_UPLOADS_DONE: 6,\n        CLIENT_ERROR: 7,\n        RECOVERABLE_CLIENT_ERROR: 12,\n        IMAGES_SELECTED: 9,\n        UPGRADE_REQUIRED: 11,\n        VERSION: 15,\n        SELECT_START: 18,\n        SELECT_CANCELED: 19,\n        CANCEL: 22,\n        CANCEL_DURING_UPLOAD: 83,\n        ONE_RESIZING_START: 2,\n        ONE_UPLOAD_DONE: 29,\n        ONE_RESIZING_DONE: 34,\n        PROGRESS_BAR_STOPPED: 44,\n        MISSED_BEAT: 45,\n        HEART_ATTACK: 46,\n        PUBLISH_START: 100,\n        PUBLISH_SUCCESS: 101,\n        PUBLISH_FAILURE: 102,\n        SESSION_POSTED: 72,\n        POST_PUBLISHED: 80,\n        ONE_UPLOAD_CANCELED: 81,\n        ONE_UPLOAD_CANCELED_DURING_UPLOAD: 82,\n        RESIZER_AVAILABLE: 20,\n        OVERLAY_FIRST: 61,\n        ASYNC_AVAILABLE: 63,\n        FALLBACK_TO_FLASH: 13,\n        RETRY_UPLOAD: 17,\n        TAGGED_ALL_FACES: 14,\n        VAULT_IMAGES_SELECTED: 62,\n        VAULT_CREATE_POST_CANCEL: 65,\n        VAULT_SEND_IN_MESSAGE_CLICKED: 66,\n        VAULT_DELETE_CANCEL: 68,\n        VAULT_ADD_TO_ALBUM_CANCEL: 74,\n        VAULT_SHARE_IN_AN_ALBUM_CLICKED: 76,\n        VAULT_SHARE_OWN_TIMELINE_CLICKED: 77,\n        VAULT_SHARE_FRIENDS_TIMELINE_CLICKED: 78,\n        VAULT_SHARE_IN_A_GROUP_CLICKED: 79,\n        VAULT_SYNCED_PAGED_LINK_CLICKED: 84,\n        METHOD_DRAGDROP: \"dragdrop\",\n        METHOD_FILE_SELECTOR: \"file_selector\",\n        METHOD_VAULT: \"vault\",\n        METHOD_PHOTOS_OF_YOU: \"photos_of_you\",\n        METHOD_RECENT_PHOTOS: \"recent_photos\",\n        VAULTBOX: \"vaultbox\",\n        GRID: \"grid\",\n        SPOTLIGHT_VAULT_VIEWER: \"spotlight_vault_viewer\",\n        REF_VAULT_NOTIFICATION: \"vault_notification\",\n        sendSignal: function(i, j) {\n            new g(\"/ajax/photos/waterfall.php\", {\n                data: JSON.stringify(i)\n            }).setHandler(j).send();\n        }\n    };\n    e.exports = h;\n});");
// 15786
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"sd1808efce0daa190ec2ad760a02db38d236b794b");
// 15787
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"TXKLp\",]);\n}\n;\n;\n__d(\"ChatFavoriteList\", [\"AsyncRequest\",\"arrayContains\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"arrayContains\"), i = b(\"emptyFunction\"), j = false, k = [], l = [], m = false;\n    function n() {\n        var r = k.join(\",\");\n        new g(\"/ajax/chat/favorite_list.php\").setData({\n            favorite_list: r\n        }).setHandler(i).setErrorHandler(i).send();\n    };\n;\n    function o(r) {\n        return r.toString();\n    };\n;\n    function p(r) {\n        if (((k.length != r.length))) {\n            return true;\n        }\n    ;\n    ;\n        for (var s = 0; ((s < r.length)); s++) {\n            if (((k[s] !== r[s].toString()))) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    var q = {\n        isEditMode: function() {\n            var r = null;\n            d([\"ChatSidebar\",], function(s) {\n                r = s;\n            });\n            return ((((j && r)) && r.isEnabled()));\n        },\n        toggleEditMode: function() {\n            j = !j;\n            if (j) {\n                l = k.slice();\n            }\n        ;\n        ;\n        },\n        get: function() {\n            if (j) {\n                return l.slice();\n            }\n             else return k.slice()\n        ;\n        },\n        isFavored: function(r) {\n            return h(l, r.toString());\n        },\n        init: function(r) {\n            k = r.slice().map(o);\n            l = k.slice();\n        },\n        toggleID: function(r) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            r = r.toString();\n            var s = l.indexOf(r);\n            if (((s >= 0))) {\n                l.splice(s, 1);\n            }\n             else l.push(r);\n        ;\n        ;\n            m = true;\n        },\n        hasChanged: function() {\n            if (m) {\n                m = false;\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        updateList: function(r) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            l = r.map(o);\n        },\n        save: function() {\n            if (p(l)) {\n                k = l;\n                n();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"ChatContexts\", [], function(a, b, c, d, e, f) {\n    var g = {\n    };\n    function h(k) {\n        var l = ((k ? k.subtext : \"\"));\n        return l;\n    };\n;\n    function i(k, l) {\n        g[k] = l;\n    };\n;\n    var j = {\n        get: function(k) {\n            if (((k in g))) {\n                return g[k];\n            }\n             else return null\n        ;\n        },\n        update: function(k) {\n            {\n                var fin269keys = ((window.top.JSBNG_Replay.forInKeys)((k))), fin269i = (0);\n                var l;\n                for (; (fin269i < fin269keys.length); (fin269i++)) {\n                    ((l) = (fin269keys[fin269i]));\n                    {\n                        i(l, k[l]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        getShortDisplay: function(k) {\n            return h(j.get(k));\n        }\n    };\n    e.exports = j;\n});\n__d(\"LastMobileActiveTimes\", [\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"tx\"), h = 0, i = {\n    };\n    function j(n) {\n        if (((!h || !n))) {\n            return \"\";\n        }\n    ;\n    ;\n        var o = ((h - n)), p = Math.floor(((o / 60))), q = Math.floor(((p / 60))), r = Math.floor(((q / 24)));\n        if (((p <= 1))) {\n            return g._(\"{count}m\", {\n                count: 1\n            });\n        }\n         else if (((p < 60))) {\n            return g._(\"{count}m\", {\n                count: p\n            });\n        }\n         else if (((q < 24))) {\n            return g._(\"{count}h\", {\n                count: q\n            });\n        }\n         else if (((r < 3))) {\n            return g._(\"{count}d\", {\n                count: r\n            });\n        }\n         else return \"\"\n        \n        \n        \n    ;\n    };\n;\n    function k(n, o) {\n        i[n] = o;\n    };\n;\n    function l(n) {\n        if (((n in i))) {\n            return i[n];\n        }\n         else return 0\n    ;\n    };\n;\n    var m = {\n        update: function(n, o) {\n            h = ((o / 1000));\n            {\n                var fin270keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin270i = (0);\n                var p;\n                for (; (fin270i < fin270keys.length); (fin270i++)) {\n                    ((p) = (fin270keys[fin270i]));\n                    {\n                        k(p, n[p]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        getShortDisplay: function(n) {\n            return j(l(n));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ServerTime\", [\"PresenceInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"PresenceInitialData\"), h;\n    function i(k) {\n        h = ((JSBNG__Date.now() - k));\n    };\n;\n    i(g.serverTime);\n    var j = {\n        get: function() {\n            return ((JSBNG__Date.now() - h));\n        },\n        getSkew: function() {\n            return h;\n        },\n        update: function(k) {\n            i(k);\n        }\n    };\n    e.exports = j;\n});\n__d(\"PresenceStatus\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatVisibility\",\"Env\",\"PresencePrivacy\",\"ServerTime\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatVisibility\"), j = b(\"Env\"), k = b(\"PresencePrivacy\"), l = b(\"ServerTime\"), m = b(\"createObjectFrom\"), n = {\n    }, o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = {\n        resetPresenceData: function() {\n            n = {\n            };\n            r = {\n            };\n            q = {\n            };\n        },\n        reset: function() {\n            s.resetPresenceData();\n            o = {\n            };\n            p = {\n            };\n        },\n        get: function(t) {\n            if (((t == j.user))) {\n                return ((i.isOnline() ? g.ACTIVE : g.OFFLINE));\n            }\n        ;\n        ;\n            var u = g.OFFLINE;\n            if (((t in n))) {\n                u = n[t];\n            }\n        ;\n        ;\n            if (!k.allows(t)) {\n                u = g.OFFLINE;\n            }\n        ;\n        ;\n            if (((u == g.OFFLINE))) {\n                if (o[t]) {\n                    u = g.MOBILE;\n                }\n            ;\n            }\n        ;\n        ;\n            return u;\n        },\n        isBirthday: function(t) {\n            return p[t];\n        },\n        getGroup: function(t) {\n            if (!h.get(\"chat_group_presence\", 0)) {\n                return g.OFFLINE;\n            }\n        ;\n        ;\n            return ((t.some(function(u) {\n                if (((u == j.user))) {\n                    return false;\n                }\n            ;\n            ;\n                return ((s.get(u) === g.ACTIVE));\n            }) ? g.ACTIVE : g.OFFLINE));\n        },\n        set: function(t, u, v, w) {\n            if (((t == j.user))) {\n                return false;\n            }\n        ;\n        ;\n            switch (u) {\n              case g.OFFLINE:\n            \n              case g.IDLE:\n            \n              case g.ACTIVE:\n            \n              case g.MOBILE:\n                break;\n              default:\n                return false;\n            };\n        ;\n            var x = ((s.get(t) != u));\n            if (v) {\n                q[t] = l.get();\n                r[t] = w;\n            }\n        ;\n        ;\n            n[t] = u;\n            return x;\n        },\n        setMobileFriends: function(t) {\n            o = m(t);\n        },\n        setBirthdayFriends: function(t) {\n            p = m(t);\n        },\n        getOnlineIDs: function() {\n            var t, u = [];\n            {\n                var fin271keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin271i = (0);\n                (0);\n                for (; (fin271i < fin271keys.length); (fin271i++)) {\n                    ((t) = (fin271keys[fin271i]));\n                    {\n                        if (((s.get(t) === g.ACTIVE))) {\n                            u.push(t);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return u;\n        },\n        getAvailableIDs: function() {\n            var t = s.getOnlineIDs(), u;\n            {\n                var fin272keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin272i = (0);\n                (0);\n                for (; (fin272i < fin272keys.length); (fin272i++)) {\n                    ((u) = (fin272keys[fin272i]));\n                    {\n                        if (n[u]) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        t.push(u);\n                    };\n                };\n            };\n        ;\n            return t;\n        },\n        getOnlineCount: function() {\n            return s.getOnlineIDs().length;\n        },\n        getPresenceStats: function() {\n            var t = 0, u = 0, v = 0, w = 0, x = 0;\n            {\n                var fin273keys = ((window.top.JSBNG_Replay.forInKeys)((n))), fin273i = (0);\n                var y;\n                for (; (fin273i < fin273keys.length); (fin273i++)) {\n                    ((y) = (fin273keys[fin273i]));\n                    {\n                        t += 1;\n                        switch (s.get(y)) {\n                          case g.OFFLINE:\n                            u += 1;\n                            break;\n                          case g.IDLE:\n                            v += 1;\n                            break;\n                          case g.ACTIVE:\n                            w += 1;\n                            break;\n                          case g.MOBILE:\n                            x += 1;\n                            break;\n                          default:\n                            break;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n            return {\n                total: t,\n                offline: u,\n                idle: v,\n                active: w,\n                mobile: x\n            };\n        },\n        getDebugInfo: function(t) {\n            return {\n                id: t,\n                presence: n[t],\n                overlaySource: r[t],\n                overlayTime: q[t],\n                mobile: o[t]\n            };\n        }\n    };\n    e.exports = s;\n});\n__d(\"PresencePoller\", [\"AvailableListConstants\",\"AvailableListInitialData\",\"BanzaiODS\",\"ChannelImplementation\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatVisibility\",\"Env\",\"JSLogger\",\"LastMobileActiveTimes\",\"Poller\",\"PresenceStatus\",\"PresenceUtil\",\"ServerTime\",\"ShortProfiles\",\"UserActivity\",\"copyProperties\",\"debounceAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"AvailableListInitialData\"), i = b(\"BanzaiODS\"), j = b(\"ChannelImplementation\").instance, k = b(\"ChatContexts\"), l = b(\"ChatFavoriteList\"), m = b(\"ChatVisibility\"), n = b(\"Env\"), o = b(\"JSLogger\"), p = b(\"LastMobileActiveTimes\"), q = b(\"Poller\"), r = b(\"PresenceStatus\"), s = b(\"PresenceUtil\"), t = b(\"ServerTime\"), u = b(\"ShortProfiles\"), v = b(\"UserActivity\"), w = b(\"copyProperties\"), x = b(\"debounceAcrossTransitions\"), y = 5, z = \"/ajax/chat/buddy_list.php\", aa = 1800000, ba = h.pollInterval, ca = h.lazyPollInterval, da = h.lazyThreshold, ea = o.create(\"available_list\"), fa = \"presence_poller\";\n    i.setEntitySample(fa, 4998);\n    function ga(ha) {\n        this.$PresencePoller0 = ha;\n        this.$PresencePoller1 = false;\n        this.$PresencePoller2 = h.chatNotif;\n        this.$PresencePoller3 = new q({\n            interval: ba,\n            setupRequest: this.$PresencePoller4.bind(this),\n            clearOnQuicklingEvents: false,\n            dontStart: true\n        });\n        this.$PresencePoller5 = JSBNG__Date.now();\n        this.$PresencePoller6 = JSBNG__Date.now();\n        this.$PresencePoller7 = JSBNG__Date.now();\n        this.$PresencePoller8 = h.updateTime;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera = 0;\n        if (h.favoriteList) {\n            l.init(h.favoriteList);\n        }\n    ;\n    ;\n        this.$PresencePollerb(\"available_initial_data\", h.updateTime, h.availableList, h.lastActiveTimes, h.mobileFriends, h.birthdayFriends);\n        v.subscribe(function(ia, ja) {\n            if (((ja.idleness > ba))) {\n                this.forceUpdate();\n            }\n        ;\n        ;\n        }.bind(this));\n    };\n;\n    ga.prototype.start = function() {\n        this.$PresencePoller3.start.bind(this.$PresencePoller3).defer();\n    };\n    ga.prototype.forceUpdate = function() {\n        if (!this.$PresencePoller9) {\n            this.$PresencePoller3.request();\n        }\n    ;\n    ;\n    };\n    ga.prototype.getIsUserIdle = function() {\n        return this.$PresencePoller1;\n    };\n    ga.prototype.getWebChatNotification = function() {\n        return this.$PresencePoller2;\n    };\n    ga.prototype.getCallback = function() {\n        return this.$PresencePoller0;\n    };\n    ga.prototype.$PresencePollerc = function() {\n        return x(function() {\n            this.$PresencePoller0(g.ON_AVAILABILITY_CHANGED);\n        }.bind(this), 0)();\n    };\n    ga.prototype.$PresencePollerb = function(ha, ia, ja, ka, la, ma) {\n        this.$PresencePoller8 = ia;\n        if (!Array.isArray(ja)) {\n            r.resetPresenceData();\n            {\n                var fin274keys = ((window.top.JSBNG_Replay.forInKeys)((ja))), fin274i = (0);\n                var na;\n                for (; (fin274i < fin274keys.length); (fin274i++)) {\n                    ((na) = (fin274keys[fin274i]));\n                    {\n                        r.set(na, ja[na].a, false, ha);\n                    ;\n                    };\n                };\n            };\n        ;\n        }\n    ;\n    ;\n        if (ka) {\n            p.update(ka, ia);\n        }\n    ;\n    ;\n        if (la) {\n            r.setMobileFriends(la);\n        }\n    ;\n    ;\n        if (ma) {\n            r.setBirthdayFriends(ma);\n        }\n    ;\n    ;\n        this.$PresencePollerc();\n    };\n    ga.prototype.$PresencePoller4 = function(ha) {\n        if (((j.isShutdown() || !m.isOnline()))) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.offline\");\n            return;\n        }\n    ;\n    ;\n        if (((((JSBNG__Date.now() - this.$PresencePoller5)) < ba))) {\n            this.$PresencePoller3.skip();\n            i.bumpEntityKey(fa, \"skip.recent\");\n            return;\n        }\n    ;\n    ;\n        i.bumpEntityKey(fa, \"request\");\n        this.$PresencePoller5 = JSBNG__Date.now();\n        var ia = ((((JSBNG__Date.now() - this.$PresencePoller7)) > aa)), ja = u.getCachedProfileIDs().join(\",\");\n        this.$PresencePoller9 = true;\n        ha.setHandler(this.$PresencePollerd.bind(this)).setErrorHandler(this.$PresencePollere.bind(this)).setOption(\"suppressErrorAlerts\", true).setOption(\"retries\", 1).setData({\n            user: n.user,\n            cached_user_info_ids: ja,\n            fetch_mobile: ia\n        }).setURI(z).setAllowCrossPageTransition(true);\n    };\n    ga.prototype.$PresencePollerd = function(ha) {\n        var ia = ha.getPayload(), ja = ia.buddy_list;\n        if (!ja) {\n            this.$PresencePollere(ha);\n            return;\n        }\n    ;\n    ;\n        i.bumpEntityKey(fa, \"response\");\n        this.$PresencePoller9 = false;\n        this.$PresencePollerf();\n        this.$PresencePoller6 = JSBNG__Date.now();\n        t.update(ia.time);\n        this.$PresencePollera = 0;\n        this.$PresencePollerg();\n        var ka = ja.userInfos;\n        if (ka) {\n            u.setMulti(ka);\n        }\n    ;\n    ;\n        var la = ja.chatContexts;\n        ((la && k.update(la)));\n        this.$PresencePoller1 = ja.userIsIdle;\n        if (((ja.chatNotif !== undefined))) {\n            this.$PresencePoller2 = ja.chatNotif;\n            this.$PresencePoller0(g.ON_CHAT_NOTIFICATION_CHANGED, this.$PresencePoller2);\n        }\n    ;\n    ;\n        this.$PresencePollerb(\"buddy_list_poller\", ia.time, ja.nowAvailableList, ja.last_active_times, ja.mobile_friends, ja.todays_birthdays);\n    };\n    ga.prototype.$PresencePollere = function(ha) {\n        i.bumpEntityKey(fa, \"error\");\n        if (s.checkMaintenanceError(ha)) {\n            return;\n        }\n    ;\n    ;\n        this.$PresencePoller9 = false;\n        this.$PresencePollera++;\n        if (((this.$PresencePollera++ >= y))) {\n            this.$PresencePoller0(g.ON_UPDATE_ERROR);\n        }\n    ;\n    ;\n    };\n    ga.prototype.$PresencePollerg = function() {\n        var ha = ((v.isActive(da) ? ba : ca));\n        i.bumpEntityKey(fa, ((\"period.\" + ha)));\n        this.$PresencePoller3.JSBNG__setInterval(ha);\n    };\n    ga.prototype.$PresencePollerf = function() {\n        var ha = JSBNG__Date.now(), ia = ((ha - this.$PresencePoller6));\n        ea.log(\"buddylist_presence_stats\", w({\n            duration: ia\n        }, r.getPresenceStats()));\n    };\n    e.exports = ga;\n});\n__d(\"AvailableList\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableListConstants\",\"ChannelImplementation\",\"ChannelConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"JSLogger\",\"PresencePoller\",\"PresencePrivacy\",\"PresenceStatus\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"debounceAcrossTransitions\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableListConstants\"), k = b(\"ChannelImplementation\").instance, l = b(\"ChannelConstants\"), m = b(\"ChatConfig\"), n = b(\"ChatFavoriteList\"), o = b(\"JSLogger\"), p = b(\"PresencePoller\"), q = b(\"PresencePrivacy\"), r = b(\"PresenceStatus\"), s = b(\"ShortProfiles\"), t = b(\"TypingDetector\"), u = b(\"copyProperties\"), v = b(\"debounceAcrossTransitions\"), w = b(\"emptyFunction\"), x = u({\n    }, j, h);\n    x.subscribe([j.ON_AVAILABILITY_CHANGED,j.ON_UPDATE_ERROR,], function(ea, fa) {\n        g.inform(ea, fa);\n    });\n    var y = v(function() {\n        x.inform(j.ON_AVAILABILITY_CHANGED);\n    }, 0);\n    function z(ea, fa, ga, ha) {\n        var ia = r.set(ea, fa, ga, ha);\n        if (ia) {\n            y();\n        }\n    ;\n    ;\n    };\n;\n    function aa(ea) {\n        var fa = ((ea.payload.availability || {\n        }));\n        {\n            var fin275keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin275i = (0);\n            var ga;\n            for (; (fin275i < fin275keys.length); (fin275i++)) {\n                ((ga) = (fin275keys[fin275i]));\n                {\n                    z(ga, fa[ga], true, \"mercury_tabs\");\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function ba(ea) {\n        var fa = x.getDebugInfo(ea), ga = ((fa.presence == j.ACTIVE)), ha = new i(\"/ajax/mercury/tabs_presence.php\").setData({\n            target_id: ea,\n            to_online: ga,\n            presence_source: fa.overlaySource,\n            presence_time: fa.overlayTime\n        }).setHandler(aa).setErrorHandler(w).setAllowCrossPageTransition(true).send();\n    };\n;\n    function ca(ea, fa) {\n        fa.chat_config = m.getDebugInfo();\n        fa.available_list_debug_info = {\n        };\n        x.getAvailableIDs().forEach(function(ga) {\n            fa.available_list_debug_info[ga] = x.getDebugInfo(ga);\n        });\n        fa.available_list_poll_interval = ((x._poller && x._poller.getInterval()));\n    };\n;\n    var da = new p(function(JSBNG__event) {\n        x.inform(JSBNG__event);\n    });\n    u(x, {\n        get: function(ea) {\n            return r.get(ea);\n        },\n        updateForID: function(ea) {\n            ba(ea);\n        },\n        getWebChatNotification: function() {\n            return da.getWebChatNotification();\n        },\n        isUserIdle: function() {\n            return da.getIsUserIdle();\n        },\n        isReady: function() {\n            return true;\n        },\n        set: function(ea, fa, ga) {\n            z(ea, fa, true, ga);\n        },\n        update: function() {\n            da.forceUpdate();\n        },\n        isIdle: function(ea) {\n            return ((x.get(ea) == j.IDLE));\n        },\n        getOnlineIDs: function() {\n            return r.getOnlineIDs();\n        },\n        getAvailableIDs: function() {\n            return r.getAvailableIDs();\n        },\n        getOnlineCount: function() {\n            return r.getOnlineCount();\n        },\n        getDebugInfo: function(ea) {\n            var fa = r.getDebugInfo(ea), ga = s.getNow(ea);\n            if (ga) {\n                fa.JSBNG__name = ga.JSBNG__name;\n            }\n        ;\n        ;\n            return fa;\n        }\n    });\n    da.start();\n    g.subscribe(o.DUMP_EVENT, ca);\n    g.subscribe(l.getArbiterType(\"favorite_list\"), function(ea, fa) {\n        var ga = fa.obj, ha = ((ga.value ? ga.value.split(\",\") : []));\n        n.init(ha);\n        y();\n    });\n    q.subscribe([\"privacy-changed\",\"privacy-availability-changed\",\"privacy-user-presence-response\",], y);\n    k.subscribe([k.CONNECTED,k.RECONNECTING,k.SHUTDOWN,k.MUTE_WARNING,k.UNMUTE_WARNING,], y);\n    g.subscribe(l.getArbiterType(\"buddylist_overlay\"), function(ea, fa) {\n        var ga = fa.obj.overlay;\n        {\n            var fin276keys = ((window.top.JSBNG_Replay.forInKeys)((ga))), fin276i = (0);\n            var ha;\n            for (; (fin276i < fin276keys.length); (fin276i++)) {\n                ((ha) = (fin276keys[fin276i]));\n                {\n                    x.set(ha, ga[ha].a, ((ga[ha].s || \"channel\")));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    g.subscribe([l.getArbiterType(\"typ\"),l.getArbiterType(\"ttyp\"),], function(ea, fa) {\n        var ga = fa.obj;\n        if (((ga.st === t.TYPING))) {\n            var ha = ga.from;\n            x.set(ha, j.ACTIVE, \"channel-typing\");\n        }\n    ;\n    ;\n    });\n    a.AvailableList = e.exports = x;\n});\n__d(\"ChatImpressionLogger\", [\"AvailableList\",\"AsyncSignal\",\"ChatConfig\",\"ChatVisibility\",\"Poller\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"AsyncSignal\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"Poller\"), l = null, m = null, n = {\n        init: function(o) {\n            l = o;\n            var p = i.get(\"chat_impression_logging_periodical\", 0);\n            if (p) {\n                var q = i.get(\"periodical_impression_logging_config.interval\");\n                m = new k({\n                    interval: q,\n                    setupRequest: this.logImps.bind(this),\n                    clearOnQuicklingEvents: false\n                });\n            }\n        ;\n        ;\n            this.init = function() {\n            \n            };\n        },\n        logImps: function(o) {\n            if (!j.isOnline()) {\n                return;\n            }\n        ;\n        ;\n            var p = {\n                source: \"periodical_imps\"\n            }, q = l.getCachedSortedList(), r = [];\n            for (var s = 0; ((s < q.length)); s++) {\n                r[s] = g.get(q[s]);\n            ;\n            };\n        ;\n            p.sorted_list = q.toString();\n            p.list_availability = r.toString();\n            o.setURI(\"/ajax/chat/imps_logging.php\").setData(p);\n        },\n        getOrderedList: function() {\n            return l;\n        },\n        logImpressions: function(o) {\n            var p = [], q = [];\n            if (i.get(\"chat_impression_logging_with_click\")) {\n                p = l.getCachedSortedList();\n                for (var r = 0; ((r < p.length)); r++) {\n                    q[r] = g.get(p[r]);\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            o.sorted_list = p.toString();\n            o.list_availability = q.toString();\n            new h(\"/ajax/chat/ct.php\", o).send();\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatTypeaheadConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        USER_TYPE: \"user\",\n        THREAD_TYPE: \"thread\",\n        FRIEND_TYPE: \"friend\",\n        NON_FRIEND_TYPE: \"non_friend\",\n        HEADER_TYPE: \"header\"\n    };\n    e.exports = g;\n});\n__d(\"Chat\", [\"Arbiter\",\"AvailableList\",\"ChatImpressionLogger\",\"ChatTypeaheadConstants\",\"MercuryParticipantTypes\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"ChatImpressionLogger\"), j = b(\"ChatTypeaheadConstants\"), k = b(\"MercuryParticipantTypes\");\n    function l(q, r) {\n        var s = ((r && r.source));\n        if (((((((((((((((s && ((s === \"ordered_list\")))) || ((s === \"more_online_friends\")))) || ((s === \"online_friends\")))) || ((s === \"recent_threads_in_divebar_new\")))) || ((s === \"recent_threads_in_divebar\")))) || ((s === \"presence\")))) || ((s === \"typeahead\"))))) {\n            r.viewport_width = JSBNG__document.body.clientWidth;\n            r.target = q;\n            r.target_presence = h.get(q);\n            i.logImpressions(r);\n        }\n    ;\n    ;\n    };\n;\n    var m = {\n        buddyListNub: \"buddylist-nub/initialized\",\n        JSBNG__sidebar: \"sidebar/initialized\"\n    };\n    function n(q, r) {\n        g.subscribe(m[q], function(JSBNG__event, s) {\n            r(s);\n        });\n    };\n;\n    function o() {\n        return ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(16);\n    };\n;\n    var p = {\n        openTab: function(q, r, s) {\n            if (((((window.External && window.External.Chat)) && window.External.Chat.openWindow))) {\n                window.External.Chat.openWindow(q);\n            }\n        ;\n        ;\n            l.curry(q, s).defer();\n            d([\"MercuryThreads\",], function(t) {\n                if (((((((!r || ((r === k.FRIEND)))) || ((r === j.FRIEND_TYPE)))) || ((r === j.USER_TYPE))))) {\n                    var u = t.get().getCanonicalThreadToUser(q), v = o();\n                    g.inform(\"chat/open-tab\", {\n                        thread_id: u.thread_id,\n                        signature_id: v\n                    });\n                    return;\n                }\n            ;\n            ;\n                if (((r === j.THREAD_TYPE))) {\n                    d([\"ChatOpenTab\",], function(w) {\n                        if (q) {\n                            w.openThread(q);\n                        }\n                         else w.openEmptyTab();\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n            });\n        },\n        openBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.show();\n                n(\"JSBNG__sidebar\", function(r) {\n                    r.enable();\n                });\n            });\n        },\n        closeBuddyList: function() {\n            n(\"buddyListNub\", function(q) {\n                q.hide();\n            });\n        },\n        toggleSidebar: function() {\n            n(\"JSBNG__sidebar\", function(q) {\n                q.toggle();\n            });\n        },\n        goOnline: function(q) {\n            d([\"ChatVisibility\",], function(r) {\n                r.goOnline(q);\n            });\n        },\n        isOnline: function() {\n            var q = null;\n            d([\"ChatVisibility\",], function(r) {\n                q = r;\n            });\n            return ((q && q.isOnline()));\n        }\n    };\n    a.Chat = e.exports = p;\n}, 3);\n__d(\"OrderedFriendsList\", [\"AvailableList\",\"ChatConfig\",\"createArrayFrom\",\"ShortProfiles\",\"InitialChatFriendsList\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatConfig\"), i = b(\"createArrayFrom\"), j = b(\"ShortProfiles\"), k = [], l = {\n    }, m = [], n = {\n        contains: function(o) {\n            return ((o in l));\n        },\n        compare: function(o, p) {\n            var q = n.getRank(o), r = n.getRank(p);\n            if (((q !== r))) {\n                return ((q - r));\n            }\n        ;\n        ;\n            var s = j.getNowUnsafe(o), t = j.getNowUnsafe(p), u = ((((s || {\n            })).JSBNG__name || \"~\")).toLowerCase(), v = ((((t || {\n            })).JSBNG__name || \"~\")).toLowerCase();\n            if (((u !== v))) {\n                return ((((u < v)) ? -1 : 1));\n            }\n        ;\n        ;\n            return 0;\n        },\n        getList: function() {\n            if (h.get(\"chat_web_ranking_with_presence\")) {\n                n.reRank();\n            }\n        ;\n        ;\n            var o = i(k);\n            o = o.filter(function(p) {\n                var q = j.getNowUnsafe(p);\n                return ((!q || ((q.type == \"friend\"))));\n            });\n            return o;\n        },\n        getRank: function(o) {\n            return ((((o in l)) ? l[o] : k.length));\n        },\n        reRank: function() {\n            var o = {\n            }, p = {\n            };\n            m.forEach(function(r, s) {\n                var t = r.substr(0, ((r.length - 2))), u = r.substring(((r.length - 1)));\n                if (((typeof (p.uid) == \"undefined\"))) {\n                    if (((typeof (o.uid) == \"undefined\"))) {\n                        o[t] = g.get(t);\n                    }\n                ;\n                ;\n                    var v = o[t];\n                    if (((v == u))) {\n                        p[s] = t;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n            k = [];\n            {\n                var fin277keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin277i = (0);\n                var q;\n                for (; (fin277i < fin277keys.length); (fin277i++)) {\n                    ((q) = (fin277keys[fin277i]));\n                    {\n                        k.push(p[q]);\n                    ;\n                    };\n                };\n            };\n        ;\n            k.forEach(function(r, s) {\n                l[r] = s;\n            });\n        }\n    };\n    (function() {\n        var o = b(\"InitialChatFriendsList\");\n        k = ((o.list.length ? o.list : []));\n        if (h.get(\"chat_web_ranking_with_presence\")) {\n            m = k.slice();\n            n.reRank();\n        }\n    ;\n    ;\n        k.forEach(function(p, q) {\n            l[p] = q;\n        });\n    })();\n    e.exports = ((a.OrderedFriendsList || n));\n});\n__d(\"ChatSidebarConstants\", [], function(a, b, c, d, e, f) {\n    var g = {\n        LITESTAND_IMAGE_SIZE: 24,\n        LITESTAND_BLENDED_SIZE: 32,\n        IMAGE_SIZE: 28\n    };\n    e.exports = g;\n});\n__d(\"ChatTypeaheadBehavior\", [\"Chat\",\"ChatConfig\",\"ChatFavoriteList\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Rect\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Chat\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Rect\"), m = b(\"copyProperties\"), n = b(\"tx\");\n    function o(p) {\n        this._typeahead = p;\n    };\n;\n    m(o.prototype, {\n        _subscriptions: null,\n        enable: function() {\n            var p = this._typeahead;\n            this._subscriptions = [p.subscribe(\"JSBNG__focus\", function() {\n                p.getData().refreshData();\n            }),p.subscribe(\"JSBNG__blur\", function(q) {\n                p.getCore().reset();\n            }),p.subscribe(\"respond\", function(q, r) {\n                if (((r.value && ((r.value === p.getCore().getValue()))))) {\n                    if (!r.results.length) {\n                        var s = h.get(\"divebar_typeahead_group_fof\", 0);\n                        if (((s && !r.isAsync))) {\n                            return;\n                        }\n                    ;\n                    ;\n                        var t = k.create(\"div\", {\n                            className: \"noResults\"\n                        }, \"Friend not found.\");\n                        k.setContent(p.getView().getElement(), t);\n                    }\n                ;\n                ;\n                    j.addClass(p.getElement(), \"hasValue\");\n                }\n            ;\n            ;\n            }),p.subscribe(\"reset\", function() {\n                j.removeClass(p.getElement(), \"hasValue\");\n            }),p.subscribe(\"select\", function(q, r) {\n                if (i.isEditMode()) {\n                    i.toggleID(r.selected.uid);\n                    i.save();\n                }\n                 else {\n                    var s = j.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), t = {\n                        mode: ((s ? \"JSBNG__sidebar\" : \"chatNub\")),\n                        source: \"typeahead\",\n                        type: r.selected.type,\n                        typeahead: true\n                    };\n                    g.openTab(r.selected.uid, r.selected.type, t);\n                }\n            ;\n            ;\n            }),p.subscribe(\"highlight\", function(q, r) {\n                if (((r.index >= 0))) {\n                    var s = p.getView().getItems()[r.index];\n                    if (s) {\n                        var t = new l(s), u = s.offsetParent, v = t.boundWithin(new l(u)).getPositionVector();\n                        t.getPositionVector().sub(v).scrollElementBy(u);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }),];\n        },\n        disable: function() {\n            this._subscriptions.forEach(function(p) {\n                this._typeahead.unsubscribe(p);\n            }.bind(this));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatTypeaheadCore\", [\"function-extensions\",\"Class\",\"JSBNG__Event\",\"Keys\",\"TypeaheadCore\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Class\"), h = b(\"JSBNG__Event\"), i = b(\"Keys\"), j = b(\"TypeaheadCore\"), k = b(\"copyProperties\"), l = b(\"emptyFunction\"), m = b(\"shield\");\n    function n(o) {\n        this.parent.construct(this, o);\n    };\n;\n    g.extend(n, j);\n    k(n.prototype, {\n        init: function(o, p, q) {\n            this.parent.init(o, p, q);\n            this.informBeginActive = false;\n            this.informEndActive = false;\n            this.data.subscribe(\"respond\", function() {\n                if (this.informBeginActive) {\n                    this.informBeginActive = false;\n                    this.inform(\"sidebar/typeahead/active\", true);\n                }\n                 else if (this.informEndActive) {\n                    this.informEndActive = false;\n                    this.inform(\"sidebar/typeahead/active\", false);\n                }\n                \n            ;\n            ;\n            }.bind(this));\n        },\n        handleTab: l,\n        keydown: function(JSBNG__event) {\n            var o = h.getKeyCode(JSBNG__event);\n            if (((o === i.ESC))) {\n                m(this.reset, this).defer();\n                return JSBNG__event.kill();\n            }\n        ;\n        ;\n            return this.parent.keydown(JSBNG__event);\n        },\n        checkValue: function() {\n            var o = this.getValue(), p = this.value;\n            if (((o == p))) {\n                return;\n            }\n        ;\n        ;\n            if (((p && !o))) {\n                this.typeaheadActive = false;\n                this.informEndActive = true;\n            }\n             else if (((!p && o))) {\n                this.typeaheadActive = true;\n                this.informBeginActive = true;\n                this.inform(\"sidebar/typeahead/preActive\");\n            }\n            \n        ;\n        ;\n            this.parent.checkValue();\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatTypeaheadDataSource\", [\"Class\",\"DataSource\",\"Env\",\"JSLogger\",\"MercuryParticipantTypes\",\"OrderedFriendsList\",\"Run\",\"ShortProfiles\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"DataSource\"), i = b(\"Env\"), j = b(\"JSLogger\"), k = b(\"MercuryParticipantTypes\"), l = b(\"OrderedFriendsList\"), m = b(\"Run\"), n = b(\"ShortProfiles\"), o = b(\"copyProperties\");\n    function p(q) {\n        q = ((q || {\n        }));\n        q.kanaNormalization = true;\n        this.parent.construct(this, q);\n        this.persistOnRefresh = ((q.persistOnRefresh !== false));\n        this.showOfflineUsers = !!q.showOfflineUsers;\n        this._jslog = j.create(\"chat_typeahead\");\n        this._jslog.log(\"created\");\n    };\n;\n    g.extend(p, h);\n    o(p.prototype, {\n        init: function() {\n            this._jslog.log(\"init\");\n            this.parent.init();\n            this._update();\n        },\n        bootstrap: function() {\n            this._jslog.log(\"bootstrap\");\n            this.parent.bootstrap();\n            if (this.showOfflineUsers) {\n                this._jslog.log(\"show_offline_users\");\n                this._jslog.log(\"ensured_short_profiles\");\n                if (n.hasAll()) {\n                    this._update();\n                }\n                 else {\n                    this._jslog.log(\"fetch_all_short_profiles\");\n                    n.fetchAll();\n                    this.inform(\"activity\", {\n                        activity: true\n                    });\n                    var q = n.subscribe(\"updated\", function() {\n                        this.inform(\"activity\", {\n                            activity: false\n                        });\n                        this._update();\n                    }.bind(this));\n                    if (!this.persistOnRefresh) {\n                        m.onLeave(function() {\n                            n.unsubscribe(q);\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _update: function() {\n            d([\"AvailableList\",], function(q) {\n                var r = this.value;\n                this.dirty();\n                var s = n.getCachedProfileIDs(), t = s.filter(function(v) {\n                    var w = n.getNow(v);\n                    return ((w.type === k.FRIEND));\n                });\n                t.sort(l.compare);\n                var u = [];\n                t.forEach(function(v) {\n                    if (((v == i.user))) {\n                        return;\n                    }\n                ;\n                ;\n                    var w = q.get(v);\n                    if (((!this.showOfflineUsers && ((w !== q.ACTIVE))))) {\n                        return;\n                    }\n                ;\n                ;\n                    var x = n.getNow(v), y = x.additionalName;\n                    if (x.hasOwnProperty(\"searchTokens\")) {\n                        y = ((((y !== null)) ? ((((y + \" \")) + x.searchTokens.join(\" \"))) : x.searchTokens.join(\" \")));\n                    }\n                ;\n                ;\n                    u.push({\n                        uid: v,\n                        text: x.JSBNG__name,\n                        tokens: y,\n                        localized_text: x.JSBNG__name,\n                        additional_text: x.additionalName,\n                        photo: x.thumbSrc,\n                        type: x.type\n                    });\n                }.bind(this));\n                if (u.length) {\n                    this.addEntries(u);\n                }\n            ;\n            ;\n                this.value = r;\n                if (r) {\n                    this.query(r);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        refreshData: function() {\n            d([\"AvailableList\",], function(q) {\n                q.update();\n            }.bind(this));\n        }\n    });\n    e.exports = p;\n});\n__d(\"ChatSidebarHeader.react\", [\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"React\"), h = b(\"cx\"), i = g.createClass({\n        displayName: \"ReactChatSidebarHeader\",\n        render: function() {\n            return (g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__header\"\n            }, g.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__headertext\"\n            }, this.props.JSBNG__name)));\n        }\n    });\n    e.exports = i;\n});\n__d(\"ChatSidebarItem.react\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatFavoriteList\",\"ChatSidebarConstants\",\"JSBNG__Image.react\",\"Link.react\",\"React\",\"SplitImage.react\",\"cx\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatFavoriteList\"), j = b(\"ChatSidebarConstants\"), k = b(\"JSBNG__Image.react\"), l = b(\"Link.react\"), m = b(\"React\"), n = b(\"SplitImage.react\"), o = b(\"cx\"), p = b(\"ix\"), q = 9, r = m.createClass({\n        displayName: \"ChatSidebarItem\",\n        render: function() {\n            var s = (((((\"-cx-PRIVATE-chatSidebarItem__link\") + ((this.props.context ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__hascontext\")) : \"\")))) + ((((this.props.unreadCount && h.get(\"litestand_buddylist_count\"))) ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__hasunreadcount\")) : \"\")))), t;\n            if (this.props.litestandSidebar) {\n                t = m.DOM.div({\n                    \"aria-label\": this.props.JSBNG__name,\n                    className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-position\": \"right\"\n                });\n            }\n        ;\n        ;\n            return (l({\n                className: s,\n                href: this.props.href,\n                onClick: this.props.onClick,\n                rel: \"ignore\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__contents\"\n            }, this.renderFavorite(), m.DOM.div({\n                className: \"-cx-PUBLIC-chatSidebarItem__piccontainer\"\n            }, this.renderImage(), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__picborder\"\n            })), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__rightcontent\"\n            }, this.renderBirthday(), this.renderUnreadCount(), this.renderStatus()), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__name\"\n            }, this.props.JSBNG__name), m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__context\"\n            }, this.props.context)), t));\n        },\n        renderFavorite: function() {\n            if (((this.props.isAdded === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            var s = null;\n            if (this.props.litestandSidebar) {\n                s = ((this.props.isAdded ? p(\"/images/litestand/bookmarks/sidebar/remove.png\") : p(\"/images/litestand/bookmarks/sidebar/add.png\")));\n            }\n             else s = ((this.props.isAdded ? p(\"/images/chat/delete.png\") : p(\"/images/chat/add.png\")));\n        ;\n        ;\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__favoritebutton\") + ((!this.props.showEditButton ? ((\" \" + \"hidden_elem\")) : \"\"))));\n            return (m.DOM.div({\n                className: t,\n                onClick: this.props.onEditClick\n            }, k({\n                className: \"-cx-PRIVATE-chatSidebarItem__favoriteicon\",\n                src: s\n            })));\n        },\n        renderImage: function() {\n            var s = ((this.props.imageSize || j.IMAGE_SIZE));\n            return n({\n                size: s,\n                srcs: this.props.images\n            });\n        },\n        renderUnreadCount: function() {\n            var s = this.props.unreadCount;\n            if (((!s || !h.get(\"litestand_buddylist_count\")))) {\n                return null;\n            }\n        ;\n        ;\n            var t = (((\"-cx-PRIVATE-chatSidebarItem__unreadcount\") + ((((s > q)) ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__largecount\")) : \"\"))));\n            if (((s > q))) {\n                s = ((q + \"+\"));\n            }\n        ;\n        ;\n            return (m.DOM.div({\n                className: t\n            }, s));\n        },\n        renderStatus: function() {\n            var s = this.getStatusSrc();\n            if (!s) {\n                return null;\n            }\n        ;\n        ;\n            if (((((this.props.unreadCount && h.get(\"litestand_blended_sidebar\"))) && h.get(\"litestand_buddylist_count\")))) {\n                return;\n            }\n        ;\n        ;\n            var t = ((h.get(\"divebar_favorite_list\", 0) && i.isEditMode()));\n            if (t) {\n                return;\n            }\n        ;\n        ;\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__status\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-chatSidebarItem__statustime\"\n            }, this.props.statusTime), k({\n                className: \"-cx-PRIVATE-chatSidebarItem__statusicon\",\n                src: s\n            })));\n        },\n        renderBirthday: function() {\n            if (!this.props.birthday) {\n                return null;\n            }\n        ;\n        ;\n            return (k({\n                className: \"-cx-PRIVATE-chatSidebarItem__birthdayicon\",\n                src: p(\"/images/gifts/icons/cake_icon.png\")\n            }));\n        },\n        getStatusSrc: function() {\n            switch (this.props.JSBNG__status) {\n              case g.ACTIVE:\n            \n              case g.IDLE:\n                if (this.props.litestandSidebar) {\n                    return ((h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/online.png\") : p(\"/images/litestand/sidebar/online.png\")));\n                }\n            ;\n            ;\n                return p(\"/images/chat/status/online.png\");\n              case g.MOBILE:\n                if (this.props.litestandSidebar) {\n                    return ((h.get(\"litestand_blended_sidebar\") ? p(\"/images/litestand/sidebar/blended/pushable.png\") : p(\"/images/litestand/sidebar/pushable.png\")));\n                }\n            ;\n            ;\n                return p(\"/images/chat/status/mobile.png\");\n            };\n        ;\n            return null;\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatSidebarThread.react\", [\"ChatSidebarItem.react\",\"WebMessengerPermalinkConstants\",\"React\",\"MercuryThreadMetadataRawRenderer\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"React\"), j = b(\"MercuryThreadMetadataRawRenderer\"), k = i.createClass({\n        displayName: \"ChatSidebarThread\",\n        render: function() {\n            var n = this.props.JSBNG__name, o = l(this.props.threadID, this.props.participants), p = ((n ? o : undefined)), q = h.getURIPathForThreadID(this.props.threadID), r = m(this.props.image, this.props.participants), s = ((n ? n : o));\n            return (g({\n                context: p,\n                href: {\n                    url: q\n                },\n                imageSize: this.props.imageSize,\n                images: r,\n                litestandSidebar: this.props.litestandSidebar,\n                JSBNG__name: s,\n                JSBNG__status: this.props.JSBNG__status,\n                unreadCount: this.props.unreadCount\n            }));\n        }\n    });\n    function l(n, o) {\n        return j.renderRawParticipantList(n, o, o.length, {\n            names_renderer: j.renderShortNames\n        });\n    };\n;\n    function m(n, o) {\n        if (n) {\n            return n;\n        }\n    ;\n    ;\n        return o.map(function(p) {\n            return p.image_src;\n        });\n    };\n;\n    e.exports = k;\n});\n__d(\"ChatSidebarUser.react\", [\"ChatFavoriteList\",\"WebMessengerPermalinkConstants\",\"ChatConfig\",\"React\",\"ChatSidebarItem.react\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatFavoriteList\"), h = b(\"WebMessengerPermalinkConstants\"), i = b(\"ChatConfig\"), j = b(\"React\"), k = b(\"ChatSidebarItem.react\"), l = j.createClass({\n        displayName: \"ChatSidebarUser\",\n        render: function() {\n            var m = h.getURIPathForIDOrVanity(this.props.userID), n = g.isFavored(this.props.userID), o = function() {\n                g.toggleID(this.props.userID);\n            }.bind(this), p = ((i.get(\"divebar_favorite_list\", 0) ? n : undefined));\n            return (k({\n                href: {\n                    url: m\n                },\n                imageSize: this.props.imageSize,\n                images: this.props.image,\n                litestandSidebar: this.props.litestandSidebar,\n                isAdded: p,\n                showEditButton: g.isEditMode(),\n                JSBNG__name: this.props.JSBNG__name,\n                onEditClick: o,\n                JSBNG__status: this.props.JSBNG__status,\n                birthday: this.props.birthday,\n                statusTime: this.props.statusTime,\n                context: this.props.context\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatTypeaheadRenderer\", [\"AvailableListConstants\",\"ChatConfig\",\"ChatSidebarConstants\",\"ChatSidebarHeader.react\",\"ChatSidebarThread.react\",\"ChatSidebarUser.react\",\"ChatTypeaheadConstants\",\"DOM\",\"LastMobileActiveTimes\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableListConstants\"), h = b(\"ChatConfig\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarHeader.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"ChatSidebarUser.react\"), m = b(\"ChatTypeaheadConstants\"), n = b(\"DOM\"), o = b(\"LastMobileActiveTimes\"), p = b(\"MercuryParticipants\"), q = b(\"PresenceStatus\"), r = b(\"React\"), s = {\n    };\n    function t(z, aa) {\n        if (!((z in s))) {\n            s[z] = n.create(\"li\");\n        }\n    ;\n    ;\n        r.renderComponent(aa, s[z]);\n        return s[z];\n    };\n;\n    function u(z) {\n        return t(z.text, j({\n            JSBNG__name: z.text\n        }));\n    };\n;\n    function v() {\n        if (((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\")))) {\n            return ((h.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE));\n        }\n    ;\n    ;\n        return i.IMAGE_SIZE;\n    };\n;\n    function w(z) {\n        var aa = z.mercury_thread.participants.map(function(ba) {\n            return p.getUserID(ba);\n        });\n        return t(z.uid, k({\n            image: z.mercury_thread.image_src,\n            imageSize: v(),\n            litestandSidebar: ((h.get(\"litestand\", 0) && !h.get(\"test_old_divebar\"))),\n            JSBNG__name: z.mercury_thread.JSBNG__name,\n            participants: z.participants_to_render,\n            JSBNG__status: q.getGroup(aa),\n            threadID: z.uid\n        }));\n    };\n;\n    function x(z) {\n        var aa = q.get(z.uid), ba = ((((aa === g.MOBILE)) ? o.getShortDisplay(z.uid) : null)), ca = ((((z.render_type == \"non_friend\")) ? z.subtext : null));\n        return t(z.uid, l({\n            image: z.photo,\n            imageSize: v(),\n            litestandSidebar: h.get(\"litestand\", 0),\n            JSBNG__name: z.text,\n            JSBNG__status: aa,\n            birthday: q.isBirthday(z.uid),\n            statusTime: ba,\n            userID: z.uid,\n            context: ca\n        }));\n    };\n;\n    function y(z, aa) {\n        if (((z.type === m.HEADER_TYPE))) {\n            return u(z);\n        }\n    ;\n    ;\n        if (((z.type == m.THREAD_TYPE))) {\n            return w(z);\n        }\n    ;\n    ;\n        return x(z);\n    };\n;\n    e.exports = y;\n});\n__d(\"ChatTypeaheadView\", [\"arrayContains\",\"BucketedTypeaheadView\",\"ChatConfig\",\"Class\",\"ChatTypeaheadConstants\",\"Env\",\"MercuryThreadSearchUtils\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"arrayContains\"), h = b(\"BucketedTypeaheadView\"), i = b(\"ChatConfig\"), j = b(\"Class\"), k = b(\"ChatTypeaheadConstants\"), l = b(\"Env\"), m = b(\"MercuryThreadSearchUtils\"), n = b(\"copyProperties\"), o = b(\"tx\"), p = i.get(\"divebar_typeahead_group_fof\", 0);\n    function q(r, s) {\n        this.parent.construct(this, r, s);\n        this.typeObjects = {\n        };\n        this.typeObjectsOrder = [];\n        this.typeObjects[k.NON_FRIEND_TYPE] = {\n            uid: k.NON_FRIEND_TYPE,\n            type: k.HEADER_TYPE,\n            text: \"FRIENDS OF FRIENDS\"\n        };\n        this.typeObjectsOrder.push(k.NON_FRIEND_TYPE);\n        this.typeObjects[k.THREAD_TYPE] = {\n            uid: k.THREAD_TYPE,\n            type: k.HEADER_TYPE,\n            text: \"GROUP CONVERSATIONS\"\n        };\n        this.typeObjectsOrder.push(k.THREAD_TYPE);\n        this.typeObjects[k.FRIEND_TYPE] = {\n            disabled: true,\n            uid: k.FRIEND_TYPE,\n            type: k.HEADER_TYPE,\n            text: \"FRIENDS\"\n        };\n        this.typeObjectsOrder.push(k.FRIEND_TYPE);\n    };\n;\n    j.extend(q, h);\n    n(q.prototype, {\n        buildBuckets: function(r, s) {\n            if (p) {\n                s = s.reverse();\n                s = s.filter(function(t) {\n                    var u = ((t.render_type || t.type));\n                    if (((u === \"thread\"))) {\n                        var v = ((\"fbid:\" + l.user));\n                        if (!g(t.mercury_thread.participants, v)) {\n                            return false;\n                        }\n                    ;\n                    ;\n                        var w = t.participants_to_render.some(function(y) {\n                            return m.queryMatchesName(r, y.JSBNG__name);\n                        }), x = m.queryMatchesName(r, t.mercury_thread.JSBNG__name);\n                        if (((!w && !x))) {\n                            return false;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    return true;\n                });\n            }\n        ;\n        ;\n            s = this.parent.buildBuckets(r, s);\n            if (!p) {\n                s = s.filter(function(t) {\n                    return ((t && !t.disabled));\n                });\n            }\n        ;\n        ;\n            return s;\n        },\n        getDefaultIndex: function(r) {\n            if (!p) {\n                return this.parent.getDefaultIndex(r);\n            }\n        ;\n        ;\n            if (((r.length === 0))) {\n                return -1;\n            }\n        ;\n        ;\n            var s = ((r.length - 1));\n            while (((!this.isHighlightable(r[s]) && ((s >= 0))))) {\n                s--;\n            ;\n            };\n        ;\n            return s;\n        }\n    });\n    e.exports = q;\n});\n__d(\"AbstractButton.react\", [\"Link.react\",\"ReactPropTypes\",\"React\",\"cx\",\"invariant\",], function(a, b, c, d, e, f) {\n    var g = b(\"Link.react\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = b(\"invariant\");\n    function l(n, o) {\n        if (n.props.className) {\n            n.props.className += ((\" \" + o));\n        }\n         else n.props.className = o;\n    ;\n    ;\n    };\n;\n    var m = i.createClass({\n        displayName: \"AbstractButton\",\n        propTypes: {\n            image: function(n, o, p) {\n                var q = n[o];\n                k(((((q == null)) || i.isValidComponent(q))));\n                return q;\n            },\n            depressed: h.bool,\n            imageOnRight: h.bool,\n            href: h.object\n        },\n        render: function() {\n            var n = (((((\"-cx-PRIVATE-abstractButton__root\") + ((this.props.disabled ? ((\" \" + \"-cx-PUBLIC-abstractButton__disabled\")) : \"\")))) + ((this.props.depressed ? ((\" \" + \"-cx-PUBLIC-abstractButton__depressed\")) : \"\")))), o = this.props.image, p = this.props.label;\n            if (((o && p))) {\n                if (this.props.imageOnRight) {\n                    l(o, \"mls\");\n                }\n                 else l(o, \"mrs\");\n            ;\n            }\n        ;\n        ;\n            var q;\n            if (this.props.href) {\n                q = g({\n                    disabled: null\n                });\n            }\n             else {\n                var r = ((this.props.type || \"submit\"));\n                q = i.DOM.button({\n                    type: r\n                });\n                if (((r === \"submit\"))) {\n                    q.props.value = \"1\";\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (this.props.imageOnRight) {\n                q.props.children = [p,o,];\n            }\n             else q.props.children = [o,p,];\n        ;\n        ;\n            q.props.className = n;\n            q.props.label = null;\n            return this.transferPropsTo(q);\n        }\n    });\n    e.exports = m;\n});\n__d(\"XUIButton.react\", [\"AbstractButton.react\",\"ReactPropTypes\",\"React\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AbstractButton.react\"), h = b(\"ReactPropTypes\"), i = b(\"React\"), j = b(\"cx\"), k = \"medium\", l = i.createClass({\n        displayName: \"XUIButton\",\n        propTypes: {\n            use: h.oneOf([\"default\",\"special\",\"JSBNG__confirm\",]),\n            size: h.oneOf([\"small\",\"medium\",\"large\",\"xlarge\",\"xxlarge\",]),\n            suppressed: h.bool\n        },\n        getDefaultProps: function() {\n            return {\n                use: \"default\",\n                size: k,\n                suppressed: false\n            };\n        },\n        getButtonSize: function() {\n            return ((this.props.size || k));\n        },\n        render: function() {\n            var m = this.props.use, n = this.getButtonSize(), o = this.props.suppressed, p = (((((((((((((((((((((\"-cx-PRIVATE-xuiButton__root\") + ((((n === \"small\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__small\")) : \"\")))) + ((((n === \"medium\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__medium\")) : \"\")))) + ((((n === \"large\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__large\")) : \"\")))) + ((((n === \"xlarge\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__xlarge\")) : \"\")))) + ((((n === \"xxlarge\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__xxlarge\")) : \"\")))) + ((((m === \"default\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__default\")) : \"\")))) + ((((m === \"JSBNG__confirm\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__confirm\")) : \"\")))) + ((((m === \"special\")) ? ((\" \" + \"-cx-PRIVATE-xuiButton__special\")) : \"\")))) + ((o ? ((\" \" + \"-cx-PRIVATE-xuiButton__suppressed\")) : \"\")))) + ((((((m === \"JSBNG__confirm\")) || ((m === \"special\")))) ? ((\" \" + \"selected\")) : \"\"))));\n            return this.transferPropsTo(g({\n                className: p\n            }));\n        }\n    });\n    e.exports = l;\n});\n__d(\"FeatureDetection\", [\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"UserAgent\");\n    e.exports = {\n        isFileAPISupported: function() {\n            if (((((g.webkit() && !g.chrome())) && g.windows()))) {\n                return false;\n            }\n        ;\n        ;\n            return ((((\"JSBNG__FileList\" in window)) && ((\"JSBNG__FormData\" in window))));\n        },\n        isBlobFactorySupported: function() {\n            return !!a.JSBNG__Blob;\n        }\n    };\n});\n__d(\"AsyncUploadBase\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"Form\",\"FeatureDetection\",\"copyProperties\",\"removeFromArray\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"Form\"), k = b(\"FeatureDetection\"), l = b(\"copyProperties\"), m = b(\"removeFromArray\");\n    function n(p) {\n        this.setURI(p);\n    };\n;\n    n.isSupported = function() {\n        return k.isFileAPISupported();\n    };\n    l(n.prototype, g, {\n        _limit: 10,\n        setAllowCrossOrigin: function(p) {\n            this._allowCrossOrigin = !!p;\n            return this;\n        },\n        setData: function(p) {\n            this._data = p;\n            return this;\n        },\n        setLimit: function(p) {\n            this._limit = p;\n            return this;\n        },\n        setRelativeTo: function(p) {\n            this._relativeTo = p;\n            return this;\n        },\n        setStatusElement: function(p) {\n            this._statusElement = p;\n            return this;\n        },\n        setURI: function(p) {\n            this._uri = p;\n            return this;\n        },\n        suspend: function() {\n            this._suspended = true;\n            return this;\n        },\n        resume: function() {\n            this._suspended = false;\n            this._processQueue();\n            return this;\n        },\n        isUploading: function() {\n            return this._inFlight;\n        },\n        _createFileUpload: function(p, q, r) {\n            return new o(p, q, r);\n        },\n        _parseFiles: function(p) {\n            var q = {\n            };\n            {\n                var fin278keys = ((window.top.JSBNG_Replay.forInKeys)((p))), fin278i = (0);\n                var r;\n                for (; (fin278i < fin278keys.length); (fin278i++)) {\n                    ((r) = (fin278keys[fin278i]));\n                    {\n                        var s = p[r];\n                        if (Array.isArray(s)) {\n                            q[r] = s;\n                        }\n                         else {\n                            q[r] = [];\n                            if (((s instanceof window.JSBNG__FileList))) {\n                                for (var t = 0; ((t < s.length)); t++) {\n                                    q[r].push(s.JSBNG__item(t));\n                                ;\n                                };\n                            ;\n                            }\n                             else if (((((s instanceof window.JSBNG__File)) || ((s instanceof window.JSBNG__Blob))))) {\n                                q[r].push(s);\n                            }\n                            \n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return q;\n        },\n        _processQueue: function() {\n            if (this._suspended) {\n                return;\n            }\n        ;\n        ;\n            while (((this._pending.length < this._limit))) {\n                if (!this._waiting.length) {\n                    break;\n                }\n            ;\n            ;\n                var p = this._waiting.shift();\n                this._processUpload(p);\n                this._pending.push(p);\n            };\n        ;\n        },\n        _processUpload: function(p) {\n            var q = j.createFormData(((p.getData() || this._data)));\n            if (p.getFile()) {\n                q.append(p.getName(), p.getFile());\n                q.append(\"upload_id\", p.getFile().uploadID);\n            }\n        ;\n        ;\n            var r = new h().setAllowCrossOrigin(this._allowCrossOrigin).setURI(this._uri).setRawData(q).setRelativeTo(this._relativeTo).setStatusElement(this._statusElement).setHandler(this._success.bind(this, p)).setErrorHandler(this._failure.bind(this, p)).setUploadProgressHandler(this._progress.bind(this, p)).setInitialHandler(this._initial.bind(this, p));\n            r.send();\n            p.setAsyncRequest(r);\n            this._inFlight = true;\n            this.inform(\"start\", p);\n        },\n        _abort: function(p) {\n            m(this._waiting, p);\n            p.abort();\n        },\n        _initial: function(p) {\n            this.inform(\"initial\", p);\n        },\n        _success: function(p, q) {\n            this._complete(p);\n            this.inform(\"success\", p.handleSuccess(q));\n            this._processQueue();\n        },\n        _failure: function(p, q) {\n            this._complete(p);\n            if (((this.inform(\"failure\", p.handleFailure(q)) !== false))) {\n                i.defaultErrorHandler(q);\n            }\n        ;\n        ;\n            this._processQueue();\n        },\n        _progress: function(p, JSBNG__event) {\n            this.inform(\"progress\", p.handleProgress(JSBNG__event));\n        },\n        _complete: function(p) {\n            m(this._pending, p);\n            if (!this._pending.length) {\n                this._inFlight = false;\n            }\n        ;\n        ;\n        }\n    });\n    var o = function(p, q, r) {\n        this._name = p;\n        this._file = q;\n        this._data = r;\n        this._success = null;\n        this._response = null;\n        this._progressEvent = null;\n        this._request = null;\n    };\n    l(o.prototype, {\n        getName: function() {\n            return this._name;\n        },\n        getFile: function() {\n            return this._file;\n        },\n        getData: function() {\n            return this._data;\n        },\n        isComplete: function() {\n            return ((this._success !== null));\n        },\n        isSuccess: function() {\n            return ((this._success === true));\n        },\n        getResponse: function() {\n            return this._response;\n        },\n        getProgressEvent: function() {\n            return this._progressEvent;\n        },\n        setAsyncRequest: function(p) {\n            this._request = p;\n            return this;\n        },\n        isWaiting: function() {\n            return !this._request;\n        },\n        abort: function() {\n            ((this._request && this._request.abort()));\n            this._request = null;\n        },\n        handleSuccess: function(p) {\n            this._success = true;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleFailure: function(p) {\n            this._success = false;\n            this._response = p;\n            this._progressEvent = null;\n            return this;\n        },\n        handleProgress: function(JSBNG__event) {\n            this._progressEvent = JSBNG__event;\n            return this;\n        }\n    });\n    e.exports = n;\n});\n__d(\"AsyncUploadRequest\", [\"AsyncUploadBase\",\"Class\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncUploadBase\"), h = b(\"Class\"), i = b(\"copyProperties\");\n    function j(k) {\n        this.parent.construct(this, k);\n    };\n;\n    j.isSupported = function() {\n        return g.isSupported();\n    };\n    h.extend(j, g);\n    i(j.prototype, {\n        setFiles: function(k) {\n            this._files = this._parseFiles(k);\n            return this;\n        },\n        send: function() {\n            if (this._inFlight) {\n                return;\n            }\n        ;\n        ;\n            this._inFlight = true;\n            this._uploads = [];\n            {\n                var fin279keys = ((window.top.JSBNG_Replay.forInKeys)((this._files))), fin279i = (0);\n                var k;\n                for (; (fin279i < fin279keys.length); (fin279i++)) {\n                    ((k) = (fin279keys[fin279i]));\n                    {\n                        this._files[k].forEach(function(l) {\n                            this._uploads.push(this._createFileUpload(k, l));\n                        }.bind(this));\n                    ;\n                    };\n                };\n            };\n        ;\n            if (this._uploads.length) {\n                this._waiting = this._uploads.slice(0);\n                this._pending = [];\n                this._processQueue();\n            }\n             else this._processUpload(this._createFileUpload(null, null));\n        ;\n        ;\n        },\n        _processQueue: function() {\n            this.parent._processQueue();\n            if (((!this._pending.length && !this._waiting.length))) {\n                this.inform(\"complete\", this._uploads);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = j;\n});\n__d(\"CacheStorage\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = {\n        memory: k,\n        localstorage: i,\n        sessionstorage: j\n    };\n    function i() {\n        this._store = a.JSBNG__localStorage;\n    };\n;\n    i.available = function() {\n        try {\n            return !!a.JSBNG__localStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(i.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function j() {\n        this._store = a.JSBNG__sessionStorage;\n    };\n;\n    j.available = function() {\n        try {\n            return !!a.JSBNG__sessionStorage;\n        } catch (m) {\n            return false;\n        };\n    ;\n    };\n    g(j.prototype, {\n        keys: function() {\n            var m = [];\n            for (var n = 0; ((n < this._store.length)); n++) {\n                m.push(this._store.key(n));\n            ;\n            };\n        ;\n            return m;\n        },\n        get: function(m) {\n            return this._store.getItem(m);\n        },\n        set: function(m, n) {\n            this._store.setItem(m, n);\n        },\n        remove: function(m) {\n            this._store.removeItem(m);\n        },\n        clear: function() {\n            this._store.clear();\n        }\n    });\n    function k() {\n        this._store = {\n        };\n    };\n;\n    k.available = function() {\n        return true;\n    };\n    g(k.prototype, {\n        keys: function() {\n            return Object.keys(this._store);\n        },\n        get: function(m) {\n            if (((this._store[m] === undefined))) {\n                return null;\n            }\n        ;\n        ;\n            return this._store[m];\n        },\n        set: function(m, n) {\n            this._store[m] = n;\n        },\n        remove: function(m) {\n            if (((m in this._store))) {\n                delete this._store[m];\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            this._store = {\n            };\n        }\n    });\n    function l(m, n) {\n        this._key_prefix = ((n || \"_cs_\"));\n        this._magic_prefix = \"_@_\";\n        if (((((m == \"AUTO\")) || !m))) {\n            {\n                var fin280keys = ((window.top.JSBNG_Replay.forInKeys)((h))), fin280i = (0);\n                var o;\n                for (; (fin280i < fin280keys.length); (fin280i++)) {\n                    ((o) = (fin280keys[fin280i]));\n                    {\n                        var p = h[o];\n                        if (p.available()) {\n                            m = o;\n                            break;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        }\n    ;\n    ;\n        if (m) {\n            if (((typeof m == \"string\"))) {\n                if (((!h[m] || !h[m].available()))) {\n                    this._backend = new k();\n                }\n                 else this._backend = new h[m]();\n            ;\n            ;\n            }\n             else if (((!m.available || !m.available()))) {\n                this._backend = new k();\n            }\n             else this._backend = m;\n            \n        ;\n        }\n    ;\n    ;\n    };\n;\n    g(l, {\n        getAllStorageTypes: function() {\n            return Object.keys(h);\n        }\n    });\n    g(l.prototype, {\n        keys: function() {\n            var m = [];\n            try {\n                if (this._backend) {\n                    var o = this._backend.keys();\n                    for (var p = 0; ((p < o.length)); p++) {\n                        if (((o[p].substr(0, this._key_prefix.length) == this._key_prefix))) {\n                            m.push(o[p].substr(this._key_prefix.length));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n            } catch (n) {\n            \n            };\n        ;\n            return m;\n        },\n        set: function(m, n) {\n            if (this._backend) {\n                if (((typeof n == \"string\"))) {\n                    n = ((this._magic_prefix + n));\n                }\n                 else n = JSON.stringify(n);\n            ;\n            ;\n                try {\n                    this._backend.set(((this._key_prefix + m)), n);\n                } catch (o) {\n                \n                };\n            ;\n            }\n        ;\n        ;\n        },\n        get: function(m, n) {\n            var o;\n            if (this._backend) {\n                try {\n                    o = this._backend.get(((this._key_prefix + m)));\n                } catch (p) {\n                    o = null;\n                };\n            ;\n                if (((o !== null))) {\n                    if (((o.substr(0, this._magic_prefix.length) == this._magic_prefix))) {\n                        o = o.substr(this._magic_prefix.length);\n                    }\n                     else try {\n                        o = JSON.parse(o);\n                    } catch (q) {\n                        o = undefined;\n                    }\n                ;\n                ;\n                }\n                 else o = undefined;\n            ;\n            ;\n            }\n        ;\n        ;\n            if (((((o === undefined)) && ((n !== undefined))))) {\n                o = n;\n                if (this._backend) {\n                    var r;\n                    if (((typeof o == \"string\"))) {\n                        r = ((this._magic_prefix + o));\n                    }\n                     else r = JSON.stringify(o);\n                ;\n                ;\n                    try {\n                        this._backend.set(((this._key_prefix + m)), r);\n                    } catch (p) {\n                    \n                    };\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return o;\n        },\n        remove: function(m) {\n            if (this._backend) {\n                try {\n                    this._backend.remove(((this._key_prefix + m)));\n                } catch (n) {\n                \n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = l;\n});\n__d(\"DOMWrapper\", [], function(a, b, c, d, e, f) {\n    var g, h, i = {\n        setRoot: function(j) {\n            g = j;\n        },\n        getRoot: function() {\n            return ((g || JSBNG__document.body));\n        },\n        setWindow: function(j) {\n            h = j;\n        },\n        getWindow: function() {\n            return ((h || JSBNG__self));\n        }\n    };\n    e.exports = i;\n});\n__d(\"Flash\", [\"DOMWrapper\",\"QueryString\",\"UserAgent\",\"copyProperties\",\"guid\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMWrapper\"), h = b(\"QueryString\"), i = b(\"UserAgent\"), j = b(\"copyProperties\"), k = b(\"guid\"), l = {\n    }, m, n = g.getWindow().JSBNG__document;\n    function o(t) {\n        var u = n.getElementById(t);\n        if (u) {\n            u.parentNode.removeChild(u);\n        }\n    ;\n    ;\n        delete l[t];\n    };\n;\n    function p() {\n        {\n            var fin281keys = ((window.top.JSBNG_Replay.forInKeys)((l))), fin281i = (0);\n            var t;\n            for (; (fin281i < fin281keys.length); (fin281i++)) {\n                ((t) = (fin281keys[fin281i]));\n                {\n                    if (l.hasOwnProperty(t)) {\n                        o(t);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n    };\n;\n    function q(t) {\n        return t.replace(/\\d+/g, function(u) {\n            return ((\"000\".substring(u.length) + u));\n        });\n    };\n;\n    function r(t) {\n        if (!m) {\n            if (((i.ie() >= 9))) {\n                window.JSBNG__attachEvent(\"JSBNG__onunload\", p);\n            }\n        ;\n        ;\n            m = true;\n        }\n    ;\n    ;\n        l[t] = t;\n    };\n;\n    var s = {\n        embed: function(t, u, v, w) {\n            var x = k();\n            t = encodeURI(t);\n            v = j({\n                allowscriptaccess: \"always\",\n                flashvars: w,\n                movie: t\n            }, ((v || {\n            })));\n            if (((typeof v.flashvars == \"object\"))) {\n                v.flashvars = h.encode(v.flashvars);\n            }\n        ;\n        ;\n            var y = [];\n            {\n                var fin282keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin282i = (0);\n                var z;\n                for (; (fin282i < fin282keys.length); (fin282i++)) {\n                    ((z) = (fin282keys[fin282i]));\n                    {\n                        if (((v.hasOwnProperty(z) && v[z]))) {\n                            y.push(((((((((\"\\u003Cparam name=\\\"\" + encodeURI(z))) + \"\\\" value=\\\"\")) + encodeURI(v[z]))) + \"\\\"\\u003E\")));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var aa = n.createElement(\"div\"), ba = ((((((((((((((((((\"\\u003Cobject \" + ((i.ie() ? \"classid=\\\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\\\" \" : \"type=\\\"application/x-shockwave-flash\\\"\")))) + \"data=\\\"\")) + t)) + \"\\\" \")) + \"id=\\\"\")) + x)) + \"\\\"\\u003E\")) + y.join(\"\"))) + \"\\u003C/object\\u003E\"));\n            aa.innerHTML = ba;\n            var ca = u.appendChild(aa.firstChild);\n            r(x);\n            return ca;\n        },\n        remove: o,\n        getVersion: function() {\n            var t = \"Shockwave Flash\", u = \"application/x-shockwave-flash\", v = \"ShockwaveFlash.ShockwaveFlash\", w;\n            if (((JSBNG__navigator.plugins && ((typeof JSBNG__navigator.plugins[t] == \"object\"))))) {\n                var x = JSBNG__navigator.plugins[t].description;\n                if (((((((x && JSBNG__navigator.mimeTypes)) && JSBNG__navigator.mimeTypes[u])) && JSBNG__navigator.mimeTypes[u].enabledPlugin))) {\n                    w = x.match(/\\d+/g);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (!w) {\n                try {\n                    w = (new ActiveXObject(v)).GetVariable(\"$version\").match(/(\\d+),(\\d+),(\\d+),(\\d+)/);\n                    w = Array.prototype.slice.call(w, 1);\n                } catch (y) {\n                \n                };\n            }\n        ;\n        ;\n            return w;\n        },\n        checkMinVersion: function(t) {\n            var u = s.getVersion();\n            if (!u) {\n                return false;\n            }\n        ;\n        ;\n            return ((q(u.join(\".\")) >= q(t)));\n        },\n        isAvailable: function() {\n            return !!s.getVersion();\n        }\n    };\n    e.exports = s;\n});\n__d(\"PhotosUploadWaterfall\", [\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = {\n        APP_FLASH: \"flash_pro\",\n        APP_SIMPLE: \"simple\",\n        APP_ARCHIVE: \"archive\",\n        APP_COMPOSER: \"composer\",\n        APP_MESSENGER: \"messenger\",\n        APP_HTML5: \"html5\",\n        APP_CHAT: \"chat\",\n        INSTALL_CANCEL: 1,\n        INSTALL_INSTALL: 2,\n        INSTALL_UPDATE: 3,\n        INSTALL_REINSTALL: 4,\n        INSTALL_PERMA_CANCEL: 5,\n        INSTALL_SILENT_SKIP: 6,\n        INSTALL_DOWNLOAD: 7,\n        CERROR_RESIZING_FAILED: 6,\n        CERROR_MARKER_EXTRACTION_FAILED: 9,\n        BEGIN: 1,\n        UPLOAD_START: 4,\n        ALL_UPLOADS_DONE: 6,\n        CLIENT_ERROR: 7,\n        RECOVERABLE_CLIENT_ERROR: 12,\n        IMAGES_SELECTED: 9,\n        UPGRADE_REQUIRED: 11,\n        VERSION: 15,\n        SELECT_START: 18,\n        SELECT_CANCELED: 19,\n        CANCEL: 22,\n        CANCEL_DURING_UPLOAD: 83,\n        ONE_RESIZING_START: 2,\n        ONE_UPLOAD_DONE: 29,\n        ONE_RESIZING_DONE: 34,\n        PROGRESS_BAR_STOPPED: 44,\n        MISSED_BEAT: 45,\n        HEART_ATTACK: 46,\n        PUBLISH_START: 100,\n        PUBLISH_SUCCESS: 101,\n        PUBLISH_FAILURE: 102,\n        SESSION_POSTED: 72,\n        POST_PUBLISHED: 80,\n        ONE_UPLOAD_CANCELED: 81,\n        ONE_UPLOAD_CANCELED_DURING_UPLOAD: 82,\n        RESIZER_AVAILABLE: 20,\n        OVERLAY_FIRST: 61,\n        ASYNC_AVAILABLE: 63,\n        FALLBACK_TO_FLASH: 13,\n        RETRY_UPLOAD: 17,\n        TAGGED_ALL_FACES: 14,\n        VAULT_IMAGES_SELECTED: 62,\n        VAULT_CREATE_POST_CANCEL: 65,\n        VAULT_SEND_IN_MESSAGE_CLICKED: 66,\n        VAULT_DELETE_CANCEL: 68,\n        VAULT_ADD_TO_ALBUM_CANCEL: 74,\n        VAULT_SHARE_IN_AN_ALBUM_CLICKED: 76,\n        VAULT_SHARE_OWN_TIMELINE_CLICKED: 77,\n        VAULT_SHARE_FRIENDS_TIMELINE_CLICKED: 78,\n        VAULT_SHARE_IN_A_GROUP_CLICKED: 79,\n        VAULT_SYNCED_PAGED_LINK_CLICKED: 84,\n        METHOD_DRAGDROP: \"dragdrop\",\n        METHOD_FILE_SELECTOR: \"file_selector\",\n        METHOD_VAULT: \"vault\",\n        METHOD_PHOTOS_OF_YOU: \"photos_of_you\",\n        METHOD_RECENT_PHOTOS: \"recent_photos\",\n        VAULTBOX: \"vaultbox\",\n        GRID: \"grid\",\n        SPOTLIGHT_VAULT_VIEWER: \"spotlight_vault_viewer\",\n        REF_VAULT_NOTIFICATION: \"vault_notification\",\n        sendSignal: function(i, j) {\n            new g(\"/ajax/photos/waterfall.php\", {\n                data: JSON.stringify(i)\n            }).setHandler(j).send();\n        }\n    };\n    e.exports = h;\n});");
// 15996
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o51,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yC/r/601-E9kc9jy.js",o57);
// undefined
o51 = null;
// undefined
o57 = null;
// 16001
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"1YKDj\",]);\n}\n;\n__d(\"BuddyListNub\", [\"JSXDOM\",\"Event\",\"Arbiter\",\"AvailableList\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatConfig\",\"ChatSidebar\",\"ChatVisibility\",\"Class\",\"CSS\",\"Dock\",\"DOM\",\"HTML\",\"Keys\",\"NubController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"Toggler\",\"copyProperties\",\"csx\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Event\"), i = b(\"Arbiter\"), j = b(\"AvailableList\"), k = b(\"BlackbirdUpsell\"), l = b(\"ChannelConnection\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatSidebar\"), p = b(\"ChatVisibility\"), q = b(\"Class\"), r = b(\"CSS\"), s = b(\"Dock\"), t = b(\"DOM\"), u = b(\"HTML\"), v = b(\"Keys\"), w = b(\"NubController\"), x = b(\"OrderedFriendsList\"), y = b(\"Parent\"), z = b(\"PresencePrivacy\"), aa = b(\"Toggler\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"tx\"), fa = 32, ga = 10;\n    function ha(ia, ja, ka) {\n        this.parent.construct(this);\n        this.parent.init(ia);\n        this.root = ia;\n        this.orderedList = ja;\n        this.typeahead = ka;\n        this.button = t.find(ia, \"a.fbNubButton\");\n        this.unreadCount = t.find(ia, \"span.-cx-PRIVATE-fbDockChatBuddyListNub__unreadcount\");\n        this.label = t.find(ia, \"span.label\");\n        this.body = t.scry(ia, \"div.fbNubFlyoutBody\")[0];\n        this.container = y.byClass(ia, \"-cx-PUBLIC-fbDockChatBuddyListNub__container\");\n        var la = t.find(ia, \"div.fbNubFlyoutTitlebar\");\n        aa.createInstance(la).setSticky(false);\n        ja.subscribe(\"render\", this.flyoutContentChanged.bind(this));\n        ja.setScrollContainer(this.body);\n        j.subscribe(\"buddylist/availability-changed\", this._updateCount.bind(this));\n        i.subscribe(\"chat/connect\", this._handleConnect.bind(this));\n        z.subscribe(\"privacy-user-presence-changed\", this._handleVisibilityChange.bind(this));\n        this.message = t.find(ia, \"div.-cx-PRIVATE-fbDockChatBuddyListNub__message\");\n        this.warningMsgText = null;\n        this.warningMsgEventListener = null;\n        this.showWarningTimeout = null;\n        l.subscribe(l.CONNECTED, this._handleChannelConnected.bind(this));\n        l.subscribe(l.SHUTDOWN, this._handleChannelShutdown.bind(this));\n        l.subscribe(l.RECONNECTING, this._handleChannelReconnecting.bind(this));\n        l.subscribe([l.MUTE_WARNING,l.UNMUTE_WARNING,], this._updateView.bind(this));\n        this.subscribe(\"show\", this.onShow.bind(this));\n        this.subscribe(\"hide\", this.onHide.bind(this));\n        this.subscribe(\"resize\", this.onResize.bind(this));\n        h.listen(ia, \"keydown\", this._onKeyDown.bind(this));\n        h.listen(this.button, \"click\", this.onButtonClick.bind(this));\n        ka.subscribe([\"respond\",\"reset\",], function(ma, na) {\n            if (this._isOpen) {\n                var oa = this.orderedList.isVisible();\n                if ((((na && na.value) && (na.value === ka.getCore().getValue())) && ka.getView().isVisible())) {\n                    s.setUseMaxHeight(this.root, false);\n                    this.orderedList.hide();\n                }\n                 else this._showBuddyList();\n            ;\n                if ((oa !== this.orderedList.isVisible())) {\n                    this.flyoutContentChanged();\n                };\n            }\n        ;\n        }.bind(this));\n        i.subscribe(\"sidebar/show\", this.hide.bind(this));\n        i.subscribe(\"sidebar/hide\", this._onSidebarHide.bind(this));\n        if (n.get(\"litestand_buddylist_count\")) {\n            this._unreadMessageCount = 0;\n            i.subscribe(\"buddylist-nub/updateCount\", function(ma, na) {\n                if ((this._unreadMessageCount !== na.count)) {\n                    this._unreadMessageCount = na.count;\n                    this._updateView();\n                }\n            ;\n            }.bind(this));\n        }\n    ;\n        this._orderedListCount = x.getList().length;\n        i.inform(\"buddylist-nub/initialized\", this, i.BEHAVIOR_PERSISTENT);\n        this._handleVisibilityChange();\n    };\n    q.extend(ha, w);\n    ba(ha.prototype, {\n        getButton: function() {\n            return this.button;\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        _handleConnect: function(ia) {\n            this._updateView(true);\n        },\n        _getShutdownReason: function(ia) {\n            switch (ia) {\n              case m.HINT_AUTH:\n                return \"Your session has timed out. Please log in.\";\n              case m.HINT_CONN:\n                return ea._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n              case m.HINT_MAINT:\n                return ea._(\"Facebook {Chat} is currently down for maintenance.\", {\n                    Chat: \"Chat\"\n                });\n              default:\n                return ea._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n            };\n        },\n        _getReconnectMsg: function(ia) {\n            var ja;\n            if ((ia === null)) {\n                ja = \"Unable to connect to chat. Check your Internet connection.\";\n            }\n             else if ((ia > n.get(\"warning_countdown_threshold_msec\"))) {\n                var ka = t.create(\"a\", {\n                    href: \"#\",\n                    className: \"fbChatReconnectLink\"\n                }, \"Try again\"), la = t.create(\"div\", null, ka), ma = la.innerHTML;\n                ja = u(ea._(\"Unable to connect to chat. {try-again-link}\", {\n                    \"try-again-link\": ma\n                }));\n            }\n             else if ((ia > 1000)) {\n                ja = ea._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                    seconds: Math.floor((ia / 1000))\n                });\n            }\n             else ja = \"Unable to connect to chat. Reconnecting...\";\n            \n            \n        ;\n            return ja;\n        },\n        _resetShowWarningTimeout: function() {\n            if (this.showWarningTimeout) {\n                clearTimeout(this.showWarningTimeout);\n                this.showWarningTimeout = null;\n            }\n        ;\n        },\n        _handleChannelConnected: function(ia) {\n            this._resetShowWarningTimeout();\n            if (this.orderedList.isVisible()) {\n                p.goOnline();\n            };\n            this.warningMsgText = null;\n            this._updateView();\n        },\n        _handleChannelShutdown: function(ia, ja) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getShutdownReason(ja);\n            this._updateView();\n        },\n        _handleChannelReconnecting: function(ia, ja) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getReconnectMsg(ja);\n            if ((ja > 1000)) {\n                if ((ja > n.get(\"warning_countdown_threshold_msec\"))) {\n                    if (this.warningMsgEventListener) {\n                        this.warningMsgEventListener.remove();\n                        this.warningMsgEventListener = null;\n                    }\n                ;\n                    this.warningMsgEventListener = h.listen(this.message, \"click\", function(event) {\n                        if (r.hasClass(event.getTarget(), \"fbChatReconnectLink\")) {\n                            this._tryReconnect();\n                            event.kill();\n                        }\n                    ;\n                    }.bind(this));\n                }\n            ;\n                this.showWarningTimeout = setTimeout(this._handleChannelReconnecting.bind(this, ia, (ja - 1000)), 1000, false);\n            }\n        ;\n            this._updateView();\n        },\n        _tryReconnect: function() {\n            if (l.disconnected()) {\n                l.reconnect();\n            };\n        },\n        _handleVisibilityChange: function() {\n            this._updateView();\n            if (k.shouldShow()) {\n                if (p.hasBlackbirdEnabled()) {\n                    k.showBlackbirdDialog(this.getButton(), z.getVisibility());\n                }\n                 else if (!p.isOnline()) {\n                    k.showOfflineDialog(this.getButton());\n                }\n            ;\n            }\n             else k.hide();\n        ;\n            if (!p.isOnline()) {\n                this.hide();\n            };\n        },\n        _updateView: function(ia) {\n            var ja = this.container;\n            if (ja) {\n                r.conditionClass(ja, \"offline\", !p.isOnline());\n                r.conditionClass(ja, \"error\", l.disconnected());\n            }\n        ;\n            if (l.disconnected()) {\n                t.setContent(this.message, this.warningMsgText);\n            };\n            var ka, la;\n            if (!p.isOnline()) {\n                ka = ea._(\"{Chat} (Off)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else if (l.disconnected()) {\n                ka = ea._(\"{Chat} (Disconnected)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else {\n                var ma = j.getOnlineCount();\n                if (ma) {\n                    ka = ea._(\"{Chat} {number-available}\", {\n                        Chat: \"Chat\",\n                        \"number-available\": g.span({\n                            className: \"count\"\n                        }, \" (\", g.strong(null, ma), \") \")\n                    });\n                }\n                 else {\n                    ka = \"Chat\";\n                    la = true;\n                }\n            ;\n            }\n            \n        ;\n            this._setUnread(this._unreadMessageCount);\n            this._setLabel(ka, la);\n            this.buttonContentChanged();\n        },\n        onButtonClick: function() {\n            this._conditionallyShowTypeahead();\n            if (r.shown(this.typeahead.getElement())) {\n                var ia = this.subscribe(\"show\", function() {\n                    this.typeahead.getCore().getElement().focus();\n                    k.dismiss();\n                }.bind(this));\n                this.unsubscribe.bind(this, ia).defer();\n            }\n        ;\n        },\n        onHide: function() {\n            this._isOpen = false;\n            if (this._buddyListRenderSubscription) {\n                this.orderedList.unsubscribe(this._buddyListRenderSubscription);\n                this._buddyListRenderSubscription = null;\n            }\n        ;\n            this.orderedList.hide();\n            this.typeahead.getCore().reset();\n        },\n        _onKeyDown: function(event) {\n            var ia = h.getKeyCode(event);\n            if (((ia === v.ESC) && !r.hasClass(this.root, \"menuOpened\"))) {\n                this.hide();\n                return false;\n            }\n             else if ((ia == v.RETURN)) {\n                o.enable();\n            }\n        ;\n        },\n        _onSidebarHide: function(event) {\n            this.getButton().focus();\n        },\n        onResize: function() {\n            var ia = (s.getMaxFlyoutHeight(this.root) - 60), ja = Math.max(250, ia);\n            this.orderedList.setNumTopFriends(Math.floor((ja / fa)));\n        },\n        _showBuddyList: function() {\n            if (!this._buddyListRenderSubscription) {\n                this._buddyListRenderSubscription = this.orderedList.subscribe(\"render\", s.setUseMaxHeight.bind(s, this.root, false));\n            };\n            this.orderedList.show();\n        },\n        onShow: function() {\n            this._isOpen = true;\n            if (l.disconnected()) {\n                this._tryReconnect();\n                this._showBuddyList();\n            }\n             else p.goOnline(this._showBuddyList.bind(this));\n        ;\n        },\n        _setLabel: function(ia, ja) {\n            var ka = this.label.cloneNode(true);\n            t.setContent(ka, ia);\n            t.replace(this.label, ka);\n            this.label = ka;\n            (this.throbber && r.conditionShow(this.throbber, !!ja));\n        },\n        _setUnread: function(ia) {\n            r.conditionShow(this.unreadCount, !!ia);\n            if (ia) {\n                ia = g.span({\n                    className: \"-cx-PRIVATE-fbMercuryChatTab__nummessages -cx-PRIVATE-fbMercuryChatTab__numbluegrey\"\n                }, ia);\n                t.setContent(this.unreadCount, ia);\n            }\n        ;\n        },\n        _conditionallyShowTypeahead: function() {\n            r.conditionShow(this.typeahead.getElement(), (this._orderedListCount >= ga));\n        },\n        _updateCount: function() {\n            this._updateView();\n            this._conditionallyShowTypeahead();\n        }\n    });\n    e.exports = ha;\n});\n__d(\"LiveBarData\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"ChannelConstants\",\"LayerDestroyOnHide\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"LayerDestroyOnHide\"), l = b(\"copyProperties\"), m = b(\"setTimeoutAcrossTransitions\"), n = false, o = {\n    }, p = {\n    }, q = {\n    };\n    function r(y) {\n        if (((((y.expires * 1000)) - Date.now()) > 0)) {\n            return true\n        };\n        return false;\n    };\n    function s(y) {\n        var z = y.payload.actions;\n        if (!((z && z.length))) {\n            return\n        };\n        var aa;\n        for (var ba = 0; (ba < z.length); ba++) {\n            aa = z[ba].actor_id;\n            if ((!o[aa] || (z[ba].action_id != o[aa].action_id))) {\n                continue;\n            };\n            if ((z[ba].delete_action || z[ba].remove)) {\n                v(z[ba]);\n                continue;\n            }\n        ;\n        };\n    };\n    function t(y) {\n        var z = false;\n        for (var aa = 0; (aa < y.length); aa++) {\n            if ((y[aa].delete_action || y[aa].remove)) {\n                v(y[aa]);\n                continue;\n            }\n        ;\n            var ba = y[aa].actor_id, ca = y[aa].action_id;\n            if (o[ba]) {\n                if ((o[ba].action_id == ca)) {\n                    continue;\n                };\n                v(o[ba]);\n            }\n        ;\n            z = true;\n            o[ba] = y[aa];\n            u(y[aa]);\n        };\n        if (z) {\n            x.inform(\"new-actions\");\n        };\n    };\n    function u(y) {\n        var z = (((y.expires * 1000)) - Date.now());\n        p[y.actor_id] = m(v.curry(y), Math.max(0, z));\n    };\n    function v(y) {\n        if (!o[y.actor_id]) {\n            return\n        };\n        if ((o[y.actor_id].action_id != y.action_id)) {\n            return\n        };\n        delete o[y.actor_id];\n        var z = y.actor_id;\n        if (p[z]) {\n            clearTimeout(p[z]);\n            delete p[z];\n        }\n    ;\n        w(z);\n        x.inform(\"remove-action\", y);\n    };\n    function w(y) {\n        var z = q[y];\n        if (z) {\n            z.enableBehavior(k);\n            if (!z.isShown()) {\n                z.destroy();\n            };\n            delete q[y];\n        }\n    ;\n    };\n    g.subscribe(j.getArbiterType(\"livebar_update\"), function(y, z) {\n        t(z.obj.actions);\n    });\n    var x = {\n    };\n    l(x, h, {\n        fetch: function() {\n            if (n) {\n                return\n            };\n            var y = [];\n            for (var z in o) {\n                var aa = o[z];\n                if (aa.suppress_callout) {\n                    continue;\n                };\n                if (!q[aa.actor_id]) {\n                    y.push(o[z]);\n                };\n            };\n            if ((y.length > 0)) {\n                n = true;\n                new i().setURI(\"/ajax/chat/livebar.php\").setData({\n                    actions: y\n                }).setHandler(s).setFinallyHandler(function() {\n                    n = false;\n                }).setAllowCrossPageTransition(true).send();\n            }\n        ;\n        },\n        addActions: t,\n        getAction: function(y) {\n            var z = o[y];\n            if ((z && r(z))) {\n                return z\n            };\n            return null;\n        },\n        getDialog: function(y) {\n            var z = this.getAction(y);\n            if ((z && q[z.actor_id])) {\n                return q[z.actor_id]\n            };\n            return null;\n        },\n        setDialog: function(y, z, aa) {\n            var ba = o[y];\n            if ((ba && (ba.action_id == z))) {\n                w(y);\n                q[y] = aa;\n                x.inform(\"dialog-fetched\", y);\n            }\n        ;\n        }\n    });\n    e.exports = x;\n});\n__d(\"LiveBar\", [\"ChatOrderedList\",\"function-extensions\",\"LegacyContextualDialog\",\"ChatConfig\",\"CSS\",\"LiveBarData\",\"copyProperties\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"function-extensions\");\n    b(\"LegacyContextualDialog\");\n    var g = b(\"ChatConfig\"), h = b(\"CSS\"), i = b(\"LiveBarData\"), j = b(\"copyProperties\"), k = b(\"setTimeoutAcrossTransitions\"), l = b(\"shield\"), m = (g.get(\"livebar_fetch_defer\") || 1000);\n    function n(o, p, q) {\n        this._orderedList = o;\n        this._root = o.getRoot();\n        this._liveBarTypes = q;\n        this._hoverController = o.getHoverController();\n        this._hoverController.subscribe(\"hover\", this._mouseMove.bind(this));\n        this._hoverController.subscribe(\"leave\", this._mouseLeave.bind(this));\n        o.subscribe(\"render\", l(this._handleChatListUpdate, this));\n        i.subscribe(\"new-actions\", this._updateIcons.bind(this));\n        i.subscribe(\"remove-action\", this._handleRemoveAction.bind(this));\n        i.subscribe(\"dialog-fetched\", function(r, s) {\n            this._setDialogContent(s);\n        }.bind(this));\n        i.addActions(p);\n    };\n    j(n, {\n        setDialog: function(o, p, q) {\n            i.setDialog(o, p, q);\n        }\n    });\n    j(n.prototype, {\n        _root: null,\n        _liveBarTypes: null,\n        _hoverController: null,\n        _registrations: {\n        },\n        _renderedIcons: {\n        },\n        _fetchTimer: null,\n        _mouseLeftRoot: false,\n        _chatListRendered: false,\n        _getLiveBarTypes: function() {\n            return this._liveBarTypes;\n        },\n        _handleChatListUpdate: function() {\n            if (!this._chatListRendered) {\n                this._chatListRendered = true;\n                this._updateIcons();\n            }\n        ;\n        },\n        _handleShow: function(o) {\n            this._setDialogContent(o);\n        },\n        _mouseMove: function() {\n            if (!this._fetchTimer) {\n                this._fetchTimer = k(this._fetch.bind(this), m);\n                this._mouseLeftRoot = false;\n            }\n        ;\n        },\n        _mouseLeave: function() {\n            this._mouseLeftRoot = true;\n            clearTimeout(this._fetchTimer);\n            this._fetchTimer = null;\n        },\n        _setDialogContent: function(o) {\n            var p = i.getDialog(o);\n            if (p) {\n                this._hoverController.showHovercard(o, p);\n            };\n        },\n        _fetch: function() {\n            if (this._mouseLeftRoot) {\n                return\n            };\n            this._fetchTimer = null;\n            i.fetch();\n        },\n        _updateIcons: function() {\n            if (!this._chatListRendered) {\n                return\n            };\n            var o = this._orderedList.getAllNodes(), p = this._getLiveBarTypes();\n            for (var q in o) {\n                var r = i.getAction(q);\n                if ((r && ((!this._renderedIcons[q] || (this._renderedIcons[q] != r.action_id))))) {\n                    for (var s = 0; (s < p.length); s++) {\n                        h.removeClass(o[q], p[s]);;\n                    };\n                    h.addClass(o[q], r.livebar_type);\n                    this._renderedIcons[q] = r.action_id;\n                    var t = this._hoverController.register(q, this._handleShow.bind(this));\n                    if (t) {\n                        this._registrations[q] = t;\n                    };\n                }\n            ;\n            };\n        },\n        _handleRemoveAction: function(o, p) {\n            var q = p.action_id, r = p.actor_id;\n            (this._registrations[r] && this._registrations[r].unregister());\n            delete this._registrations[r];\n            if ((this._renderedIcons[r] == q)) {\n                var s = this._getLiveBarTypes(), t = this._orderedList.getAllNodes();\n                if (t[r]) {\n                    for (var u = 0; (u < s.length); u++) {\n                        h.removeClass(t[r], s[u]);;\n                    }\n                };\n                delete this._renderedIcons[r];\n            }\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"LiveBarDark\", [\"Class\",\"LiveBar\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LiveBar\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l, m, n) {\n        this.parent.construct(this, l, m, n);\n    };\n    g.extend(k, h);\n    i(k.prototype, {\n        _setupDialogContent: j,\n        _show: j,\n        _updateIcons: j,\n        _handleRemoveAction: j,\n        _handleChatListUpdate: j\n    });\n    e.exports = k;\n});\n__d(\"ChatSidebarDropdown\", [\"Arbiter\",\"AsyncRequest\",\"Chat\",\"ChatOptions\",\"ChatVisibility\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"PresenceState\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Chat\"), j = b(\"ChatOptions\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"Event\"), o = b(\"JSLogger\"), p = b(\"PresenceState\"), q = b(\"SelectorDeprecated\"), r = b(\"copyProperties\");\n    function s(t, u) {\n        this._root = t;\n        this._logger = o.create(\"blackbird\");\n        this._displayBrowserNotificationsIfNeeded();\n        q.listen(t, \"select\", this._onSelect.bind(this));\n        q.listen(t, \"toggle\", this._onToggle.bind(this));\n        if (u) {\n            q.listen(t, \"close\", u.allowCollapse.curry(true, \"SidebarMenu\"));\n            q.listen(t, \"open\", u.allowCollapse.curry(false, \"SidebarMenu\"));\n        }\n    ;\n        g.subscribe(\"chat/option-changed\", this._onOptionChanged.bind(this));\n    };\n    r(s, {\n        registerEditFavorites: function(t, u, v) {\n            function w(x) {\n                l.conditionShow(t, !x);\n                l.conditionShow(u, x);\n            };\n            n.listen(t, \"click\", function() {\n                v.toggleEditMode();\n                w(true);\n            });\n            n.listen(u, \"click\", function() {\n                v.toggleEditMode();\n                w(false);\n            });\n            v.subscribe(\"editStart\", w.curry(true));\n            v.subscribe(\"editEnd\", w.curry(false));\n        }\n    });\n    r(s.prototype, {\n        changeSetting: function(t, u) {\n            if (this._pendingChange) {\n                return false\n            };\n            this._pendingChange = true;\n            var v = {\n            };\n            v[t] = u;\n            j.setSetting(t, u, \"sidebar_menu\");\n            new h(\"/ajax/chat/settings.php\").setHandler(this._onChangeSettingResponse.bind(this, t, u)).setErrorHandler(this._onChangeSettingError.bind(this, t, u)).setFinallyHandler(this._onChangeFinally.bind(this)).setData(v).setAllowCrossPageTransition(true).send();\n        },\n        _displayBrowserNotificationsIfNeeded: function() {\n            if (window.webkitNotifications) {\n                m.scry(document, \"li.sidebar-browser-notif\").forEach(l.show);\n                if ((window.webkitNotifications.checkPermission() !== 0)) {\n                    m.scry(document, \"li.sidebar-browser-notif\").forEach(function(t) {\n                        l.removeClass(t, \"checked\");\n                    });\n                };\n            }\n        ;\n        },\n        _conditionEnabled: function(t, u) {\n            var v = q.getOption(this._root, t);\n            (v && q.setOptionEnabled(v, u));\n        },\n        _onChangeSettingResponse: function(t, u, v) {\n            p.doSync();\n        },\n        _onChangeSettingError: function(t, u, v) {\n            j.setSetting(t, !u, \"sidebar_menu_error\");\n        },\n        _onChangeFinally: function() {\n            this._pendingChange = false;\n        },\n        _onOptionChanged: function(t, u) {\n            var v = u.name, w = u.value;\n            if (((v === \"sound\") || (v === \"browser_notif\"))) {\n                var x = q.getOption(this._root, v);\n                if ((w !== q.isOptionSelected(x))) {\n                    q.setSelected(this._root, v, w);\n                };\n            }\n        ;\n        },\n        _onSelect: function(t) {\n            if (this._pendingChange) {\n                return false\n            };\n            var u = false, v = false, w = q.getOptionValue(t.option);\n            switch (w) {\n              case \"sidebar\":\n                return this.toggleSidebar();\n              case \"online\":\n                if (!k.isOnline()) {\n                    k.goOnline();\n                }\n                 else v = true;\n            ;\n                u = true;\n                break;\n              case \"offline\":\n                if (k.isOnline()) {\n                    k.goOffline();\n                }\n                 else v = true;\n            ;\n                u = true;\n                break;\n              case \"advanced_settings\":\n            \n              case \"turn_off_dialog\":\n                g.inform(\"chat/advanced-settings-dialog-opened\");\n                u = true;\n                break;\n            };\n            if (v) {\n                this._logger.error(\"sidebar_dropdown_visibility_error\", {\n                    action: w\n                });\n            }\n             else this._logger.log(\"sidebar_dropdown_set_visibility\", {\n                action: w\n            });\n        ;\n            if (u) {\n                q.toggle(this._root);\n                return false;\n            }\n        ;\n        },\n        _onToggle: function(t) {\n            if (this._pendingChange) {\n                return false\n            };\n            var u = q.getOptionValue(t.option), v = q.isOptionSelected(t.option);\n            switch (u) {\n              case \"visibility\":\n                if (!k) {\n                    this._jslogger.error(\"on_toggle_visibility_undefined\");\n                    return;\n                }\n            ;\n                k.toggleVisibility();\n                this._logger.log(\"sidebar_dropdown_toggle_visibility\", {\n                    available: v\n                });\n                break;\n              case \"browser_notif\":\n                if (((v && window.webkitNotifications) && (window.webkitNotifications.checkPermission() !== 0))) {\n                    window.webkitNotifications.requestPermission(function() {\n                        this.changeSetting(u, v);\n                    }.bind(this));\n                }\n                 else this.changeSetting(u, v);\n            ;\n                break;\n              case \"sound\":\n                this.changeSetting(u, v);\n                break;\n            };\n            q.toggle(this._root);\n        },\n        _onVisibilityChanged: function() {\n            var t = k.isOnline(), u = q.getOption(this._root, \"visibility\");\n            if ((t !== q.isOptionSelected(u))) {\n                q.setSelected(this._root, \"visibility\", t);\n            };\n        },\n        toggleSidebar: function() {\n            i.toggleSidebar();\n            q.toggle(this._root);\n            return false;\n        }\n    });\n    e.exports = s;\n});\n__d(\"ModuleDependencies\", [], function(a, b, c, d, e, f) {\n    function g(k, l, m) {\n        var n = a.require.__debug.modules[m], o = a.require.__debug.deps;\n        if (l[m]) {\n            return\n        };\n        l[m] = true;\n        if (!n) {\n            (o[m] && (k[m] = true));\n            return;\n        }\n    ;\n        if ((!n.dependencies || !n.dependencies.length)) {\n            if (n.waiting) {\n                k[m] = true;\n            };\n            return;\n        }\n    ;\n        n.dependencies.forEach(function(p) {\n            g(k, l, p);\n        });\n    };\n    function h(k) {\n        if (a.require.__debug) {\n            var l = {\n            };\n            g(l, {\n            }, k);\n            var m = Object.keys(l);\n            m.sort();\n            return m;\n        }\n    ;\n        return null;\n    };\n    function i() {\n        var k = {\n            loading: {\n            },\n            missing: []\n        };\n        if (!a.require.__debug) {\n            return k\n        };\n        var l = {\n        }, m = a.require.__debug.modules, n = a.require.__debug.deps;\n        for (var o in m) {\n            var p = m[o];\n            if (p.waiting) {\n                var q = {\n                };\n                g(q, {\n                }, p.id);\n                delete q[p.id];\n                k.loading[p.id] = Object.keys(q);\n                k.loading[p.id].sort();\n                k.loading[p.id].forEach(function(r) {\n                    if ((!((r in m)) && n[r])) {\n                        l[r] = 1;\n                    };\n                });\n            }\n        ;\n        };\n        k.missing = Object.keys(l);\n        k.missing.sort();\n        return k;\n    };\n    var j = {\n        getMissing: h,\n        getNotLoadedModules: i\n    };\n    e.exports = j;\n});\n__d(\"ChatSidebarLog\", [\"AsyncSignal\",\"Bootloader\",\"ModuleDependencies\",\"JSLogger\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Bootloader\"), i = b(\"ModuleDependencies\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = j.create(\"chat_sidebar_load\"), m = null, n = false, o = (((Math.random() * 2147483648) | 0)).toString(36);\n    k.onLoad(function() {\n        n = true;\n    });\n    try {\n        d([\"ChatSidebar\",], function(t) {\n            m = t;\n        });\n    } catch (p) {\n        l.warn(\"exception\", {\n            reason: p.toString()\n        });\n    };\n    function q(t, u) {\n        if ((t.length > u)) {\n            return t[u]\n        };\n        return null;\n    };\n    function r(t) {\n        setTimeout(function() {\n            var u = i.getMissing(\"ChatSidebar\"), v = h.getErrorUrls(), w = h.getLoadingUrls(), x = [];\n            for (var y in w) {\n                x.push({\n                    url: y,\n                    time: w[y]\n                });;\n            };\n            x.sort(function(aa, ba) {\n                return (ba.time - aa.time);\n            });\n            var z = {\n                page_loaded: n,\n                page_id: o,\n                timeout: t,\n                missing_total: u.length,\n                module_1: q(u, 0),\n                module_2: q(u, 1),\n                module_3: q(u, 2),\n                error_url_total: v.length,\n                error_url_1: q(v, 0),\n                error_url_2: q(v, 1),\n                error_url_3: q(v, 2),\n                loading_url_total: x.length,\n                loading_url_1: (q(x, 0) ? q(x, 0).url : null),\n                loading_time_1: (q(x, 0) ? q(x, 0).time : null),\n                loading_url_2: (q(x, 1) ? q(x, 1).url : null),\n                loading_time_2: (q(x, 1) ? q(x, 1).time : null),\n                loading_url_3: (q(x, 2) ? q(x, 2).url : null),\n                loading_time_3: (q(x, 2) ? q(x, 2).time : null)\n            };\n            if (!m) {\n                l.warn((\"require_\" + t), {\n                    missing: u\n                });\n                z.symptom = \"require\";\n            }\n        ;\n            if ((m && !m.isInitialized())) {\n                l.warn((\"init_\" + t), {\n                    missing: u\n                });\n                z.symptom = \"init\";\n            }\n        ;\n            if (z.symptom) {\n                new g(\"/ajax/chat/sidebar_load.php\", z).send();\n            };\n        }, t);\n    };\n    var s = {\n        start: function() {\n            r(5000);\n            r(10000);\n            r(15000);\n            r(30000);\n            r(60000);\n        }\n    };\n    e.exports = s;\n});\n__d(\"NotificationConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PayloadSourceType: {\n            UNKNOWN: 0,\n            USER_ACTION: 1,\n            LIVE_SEND: 2,\n            ENDPOINT: 3,\n            INITIAL_LOAD: 4,\n            OTHER_APPLICATION: 5\n        }\n    };\n});\n__d(\"NotificationTokens\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        tokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return ((g.user + \":\") + j);\n            });\n        },\n        untokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return j.split(\":\")[1];\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationImpressions\", [\"AsyncSignal\",\"NotificationTokens\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"NotificationTokens\"), i = b(\"URI\"), j = \"/ajax/notifications/impression.php\";\n    function k(l, m) {\n        var n = {\n            ref: m\n        };\n        h.untokenizeIDs(l).forEach(function(o, p) {\n            n[((\"alert_ids[\" + p) + \"]\")] = o;\n        });\n        new g(i(j).getQualifiedURI().toString(), n).send();\n    };\n    e.exports = {\n        log: k\n    };\n});\n__d(\"NotificationPhotoThumbnail\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        if (((!i.media || !i.style_list) || !i.style_list.length)) {\n            return null\n        };\n        switch (i.style_list[0]) {\n          case \"photo\":\n        \n          case \"album\":\n            return i.media.image;\n          default:\n            return null;\n        };\n    };\n    var h = {\n        getThumbnail: function(i, j) {\n            var k;\n            if ((i && i.length)) {\n                k = g(i[0]);\n                if (k) {\n                    return k\n                };\n            }\n        ;\n            if (j) {\n                var l = j.attachments;\n                if ((l && l.length)) {\n                    return g(l[0])\n                };\n            }\n        ;\n            return null;\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationUpdates\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"NotificationConstants\",\"NotificationTokens\",\"LiveTimer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"NotificationConstants\"), k = b(\"NotificationTokens\"), l = b(\"LiveTimer\"), m = b(\"copyProperties\"), n = b(\"createObjectFrom\"), o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [], t = 0, u = i.create(\"notification_updates\");\n    function v() {\n        if (t) {\n            return\n        };\n        var z = o, aa = p, ba = q, ca = r;\n        o = {\n        };\n        p = {\n        };\n        q = {\n        };\n        r = {\n        };\n        x(\"notifications-updated\", z);\n        if (Object.keys(aa).length) {\n            x(\"seen-state-updated\", aa);\n        };\n        if (Object.keys(ba).length) {\n            x(\"read-state-updated\", ba);\n        };\n        if (Object.keys(ca).length) {\n            x(\"hidden-state-updated\", ca);\n        };\n        s.pop();\n    };\n    function w() {\n        if (s.length) {\n            return s[(s.length - 1)]\n        };\n        return j.PayloadSourceType.UNKNOWN;\n    };\n    function x(event, z) {\n        y.inform(event, {\n            updates: z,\n            source: w()\n        });\n    };\n    g.subscribe(h.getArbiterType(\"notification_json\"), function(z, aa) {\n        var ba = Date.now(), ca = aa.obj.nodes;\n        if (ca) {\n            ca.forEach(function(da) {\n                da.receivedTime = ba;\n            });\n            u.debug(\"notifications_received\", ca);\n            y.handleUpdate(j.PayloadSourceType.LIVE_SEND, aa.obj);\n        }\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"notifications_seen\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            seenState: n(ba)\n        });\n    });\n    g.subscribe(h.getArbiterType(\"notifications_read\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            readState: n(ba)\n        });\n    });\n    var y = m(new g(), {\n        handleUpdate: function(z, aa) {\n            if (aa.servertime) {\n                l.restart(aa.servertime);\n            };\n            if (Object.keys(aa).length) {\n                this.synchronizeInforms(function() {\n                    s.push(z);\n                    var ba = m({\n                        payloadsource: w()\n                    }, aa);\n                    this.inform(\"update-notifications\", ba);\n                    this.inform(\"update-seen\", ba);\n                    this.inform(\"update-read\", ba);\n                    this.inform(\"update-hidden\", ba);\n                }.bind(this));\n            };\n        },\n        didUpdateNotifications: function(z) {\n            m(o, n(z));\n            v();\n        },\n        didUpdateSeenState: function(z) {\n            m(p, n(z));\n            v();\n        },\n        didUpdateReadState: function(z) {\n            m(q, n(z));\n            v();\n        },\n        didUpdateHiddenState: function(z) {\n            m(r, n(z));\n            v();\n        },\n        synchronizeInforms: function(z) {\n            t++;\n            try {\n                z();\n            } catch (aa) {\n                throw aa;\n            } finally {\n                t--;\n                v();\n            };\n        }\n    });\n    e.exports = y;\n});\n__d(\"NotificationStore\", [\"KeyedCallbackManager\",\"NotificationConstants\",\"NotificationUpdates\",\"RangedCallbackManager\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"NotificationConstants\"), i = b(\"NotificationUpdates\"), j = b(\"RangedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = new g(), m = new j(function(p) {\n        var q = l.getResource(p);\n        return q.creation_time;\n    }, function(p, q) {\n        return (q - p);\n    }), n = {\n    };\n    i.subscribe(\"update-notifications\", function(p, q) {\n        if (q.page_info) {\n            n = q.page_info;\n        };\n        if ((q.nodes === undefined)) {\n            return\n        };\n        var r, s = [], t = {\n        }, u = (q.nodes || []), v;\n        u.forEach(function(w) {\n            r = w.alert_id;\n            v = l.getResource(r);\n            if ((!v || (v.creation_time < w.creation_time))) {\n                s.push(r);\n                t[r] = w;\n            }\n        ;\n        });\n        l.addResourcesAndExecute(t);\n        m.addResources(s);\n        i.didUpdateNotifications(s);\n    });\n    k.registerEndpoints({\n        \"/ajax/notifications/client/get.php\": {\n            mode: k.IMMEDIATE,\n            handler: function(p) {\n                i.handleUpdate(h.PayloadSourceType.ENDPOINT, p);\n            }\n        }\n    });\n    var o = {\n        getNotifications: function(p, q) {\n            var r = m.executeOrEnqueue(0, p, function(w) {\n                var x = l.executeOrEnqueue(w, function(y) {\n                    q(y);\n                });\n            }), s = m.getUnavailableResources(r);\n            if (s.length) {\n                m.unsubscribe(r);\n                if (!o.canFetchMore()) {\n                    l.executeOrEnqueue(m.getAllResources(), q);\n                    return;\n                }\n            ;\n                var t = (n.end_cursor || null), u;\n                if (t) {\n                    var v = Math.max.apply(null, s);\n                    u = ((v - m.getCurrentArraySize()) + 1);\n                }\n                 else u = p;\n            ;\n                k.trySend(\"/ajax/notifications/client/get.php\", {\n                    cursor: t,\n                    length: u\n                });\n            }\n        ;\n        },\n        getAll: function(p) {\n            o.getNotifications(o.getCount(), p);\n        },\n        getCount: function() {\n            return m.getCurrentArraySize();\n        },\n        canFetchMore: function() {\n            if (n.hasOwnProperty(\"has_next_page\")) {\n                return n.has_next_page\n            };\n            return true;\n        }\n    };\n    e.exports = o;\n});\n__d(\"NotificationUserActions\", [\"AsyncRequest\",\"AsyncSignal\",\"NotificationConstants\",\"NotificationStore\",\"NotificationTokens\",\"NotificationUpdates\",\"URI\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AsyncSignal\"), i = b(\"NotificationConstants\"), j = b(\"NotificationStore\"), k = b(\"NotificationTokens\"), l = b(\"NotificationUpdates\"), m = b(\"URI\"), n = b(\"createObjectFrom\"), o = b(\"emptyFunction\"), p = i.PayloadSourceType.USER_ACTION, q = \"mark_spam\", r = \"turn_off\", s = \"undo\", t = \"first_receipt_yes\", u = \"first_receipt_no\";\n    function v(aa) {\n        var ba = m(\"/ajax/notifications/mark_read.php\").getQualifiedURI().toString();\n        new h(ba, aa).send();\n    };\n    function w(aa) {\n        var ba = {\n        };\n        aa.forEach(function(ca, da) {\n            ba[((\"alert_ids[\" + da) + \"]\")] = ca;\n        });\n        return ba;\n    };\n    function x(aa, ba, ca, da) {\n        var ea = k.untokenizeIDs([aa,])[0];\n        new g(\"/ajax/notifications/negative_req.php\").setData({\n            notification_id: ea,\n            client_rendered: true,\n            request_type: ba\n        }).setHandler((ca || o)).setErrorHandler((da || o)).send();\n    };\n    function y(aa, ba, ca, da, ea) {\n        var fa = (ea ? s : r);\n        j.getAll(function(ga) {\n            var ha = Object.keys(ga).filter(function(ia) {\n                var ja = ga[ia];\n                return !!(((ja.application && ja.application.id) && (ja.application.id == ba)));\n            });\n            x(aa, fa, function(ia) {\n                ca(ia);\n                l.handleUpdate(p, {\n                    hiddenState: n(ha, !ea)\n                });\n            }, da);\n        });\n    };\n    var z = {\n        markNotificationsAsSeen: function(aa) {\n            l.handleUpdate(p, {\n                seenState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa), ca = w(ba);\n            ca.seen = true;\n            v(ca);\n            if (a.presenceNotifications) {\n                a.presenceNotifications.alertList.markSeen(ba);\n            };\n        },\n        markNotificationsAsRead: function(aa) {\n            l.handleUpdate(p, {\n                readState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa);\n            v(w(ba));\n            if (a.presenceNotifications) {\n                a.presenceNotifications.markRead(false, ba);\n            };\n        },\n        markNotificationAsHidden: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,])\n            });\n            x(aa, r, ba, ca);\n        },\n        markNotificationAsVisible: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, s, ba, ca);\n        },\n        markNotificationAsSpam: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, q, ba, ca);\n        },\n        markAppAsHidden: function(aa, ba, ca, da) {\n            var ea = false;\n            y(aa, ba, ca, da, ea);\n        },\n        markAppAsVisible: function(aa, ba, ca, da) {\n            var ea = true;\n            y(aa, ba, ca, da, ea);\n        },\n        markFirstReceiptYes: function(aa, ba, ca) {\n            x(aa, t, ba, ca);\n        },\n        markFirstReceiptNo: function(aa, ba, ca) {\n            x(aa, u, ba, ca);\n        }\n    };\n    e.exports = z;\n});\n__d(\"NotificationBeeperItemContents.react\", [\"Animation\",\"CloseButton.react\",\"ImageBlock.react\",\"NotificationURI\",\"NotificationUserActions\",\"React\",\"TextWithEntities.react\",\"Timestamp.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CloseButton.react\"), i = b(\"ImageBlock.react\"), j = b(\"NotificationURI\"), k = b(\"NotificationUserActions\"), l = b(\"React\"), m = b(\"TextWithEntities.react\"), n = b(\"Timestamp.react\"), o = b(\"cx\");\n    function p(r, s) {\n        return l.DOM.span({\n            className: \"fwb\"\n        }, r);\n    };\n    var q = l.createClass({\n        displayName: \"NotificationBeeperItemContents\",\n        _markAsRead: function() {\n            k.markNotificationsAsRead([this.props.beep.notificationID,]);\n            this.props.onHide();\n        },\n        _onClose: function() {\n            this._markAsRead();\n            this.props.onHide();\n        },\n        _doFlash: function() {\n            new g(this.refs.inner.getDOMNode()).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(200).go();\n        },\n        componentDidUpdate: function(r) {\n            if ((r.beep.beepID !== this.props.beep.beepID)) {\n                this._doFlash();\n            };\n        },\n        render: function() {\n            var r = this.props.beep, s = r.icon.uri, t = (r.link ? j.localize(r.link) : \"#\"), u = (r.photo && j.snowliftable(t));\n            return (l.DOM.div({\n                ref: \"inner\"\n            }, h({\n                className: \"-cx-PRIVATE-notificationBeeperItem__closebutton\",\n                onClick: this._onClose,\n                size: \"medium\"\n            }), l.DOM.a({\n                href: t,\n                ajaxify: (u ? t : null),\n                onClick: this._markAsRead,\n                rel: (u ? \"theater\" : null),\n                className: \"-cx-PRIVATE-notificationBeeperItem__anchor\"\n            }, i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblock\"\n            }, l.DOM.img({\n                src: r.actors[0].profile_picture.uri,\n                className: \"-cx-PRIVATE-notificationBeeperItem__photo\"\n            }), l.DOM.div({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblockcontent\"\n            }, m({\n                renderEmoticons: true,\n                renderEmoji: true,\n                interpolator: p,\n                ranges: r.text.ranges,\n                aggregatedranges: r.text.aggregated_ranges,\n                text: r.text.text\n            }), i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__metadata\"\n            }, l.DOM.img({\n                src: s\n            }), n({\n                time: r.timestamp.time,\n                text: r.timestamp.text,\n                verbose: r.timestamp.verbose\n            })))))));\n        }\n    });\n    e.exports = q;\n});\n__d(\"NotificationBeeperItem.react\", [\"Animation\",\"BrowserSupport\",\"NotificationBeeperItemContents.react\",\"React\",\"cx\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"BrowserSupport\"), i = b(\"NotificationBeeperItemContents.react\"), j = b(\"React\"), k = b(\"cx\"), l = b(\"setTimeoutAcrossTransitions\"), m = j.createClass({\n        displayName: \"NotificationBeeperItem\",\n        getInitialState: function() {\n            return {\n                fadedIn: false,\n                hidden: false\n            };\n        },\n        componentDidMount: function() {\n            var n;\n            if (h.hasCSSAnimations()) {\n                n = this.setState.bind(this, {\n                    fadedIn: true\n                }, null);\n            }\n             else n = function() {\n                new g(this.refs.item.getDOMNode()).from(\"top\", \"-30px\").from(\"opacity\", \"0\").to(\"top\", \"0px\").to(\"opacity\", \"1\").duration(200).ondone(this.setState.bind(this, {\n                    fadedIn: true\n                }, null)).go();\n            }.bind(this);\n        ;\n            l(n, 50);\n            this.props.onInserted(this.props.beep);\n        },\n        render: function() {\n            var n = this.props.beep, o = ((((\"-cx-PRIVATE-notificationBeeperItem__beeperitem\") + ((this.state.fadedIn ? (\" \" + \"-cx-PRIVATE-notificationBeeperItem__fadedin\") : \"\"))) + ((this.state.hidden ? (\" \" + \"-cx-PRIVATE-notificationBeeperItem__hiddenitem\") : \"\")))), p = (n.beepRenderer || i);\n            return (j.DOM.li({\n                className: o,\n                ref: \"item\",\n                \"data-gt\": n.tracking\n            }, p({\n                beep: n,\n                onHide: this.setState.bind(this, {\n                    hidden: true\n                }, null)\n            })));\n        }\n    });\n    e.exports = m;\n});\n__d(\"NotificationSound\", [\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Sound\"), h = b(\"copyProperties\"), i = 5000;\n    g.init([\"audio/mpeg\",]);\n    function j(k) {\n        this._soundPath = k;\n        this._lastPlayed = 0;\n    };\n    h(j.prototype, {\n        play: function(k) {\n            if (!this._soundPath) {\n                return\n            };\n            var l = Date.now();\n            if ((((l - this._lastPlayed)) < i)) {\n                return\n            };\n            this._lastPlayed = l;\n            g.play(this._soundPath, k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"NotificationBeeper.react\", [\"Animation\",\"Arbiter\",\"ChannelConstants\",\"NotificationBeeperItem.react\",\"NotificationConstants\",\"NotificationImpressions\",\"NotificationPhotoThumbnail\",\"NotificationSound\",\"NotificationUpdates\",\"NotificationUserActions\",\"React\",\"Style\",\"cx\",\"isEmpty\",\"merge\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ChannelConstants\"), j = b(\"NotificationBeeperItem.react\"), k = b(\"NotificationConstants\"), l = b(\"NotificationImpressions\"), m = b(\"NotificationPhotoThumbnail\"), n = b(\"NotificationSound\"), o = b(\"NotificationUpdates\"), p = b(\"NotificationUserActions\"), q = b(\"React\"), r = b(\"Style\"), s = b(\"cx\"), t = b(\"isEmpty\"), u = b(\"merge\"), v = b(\"setTimeoutAcrossTransitions\"), w = b(\"shield\"), x = 5000, y = 2000, z = \"beeper\", aa = k.PayloadSourceType.LIVE_SEND, ba = k.PayloadSourceType.OTHER_APPLICATION, ca = q.createClass({\n        displayName: \"NotificationBeeper\",\n        getInitialState: function() {\n            return {\n                soundEnabled: this.props.soundEnabled,\n                hovering: false,\n                fading: false,\n                paused: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            };\n        },\n        componentWillMount: function() {\n            var ea = i.getArbiterType(\"notif_sound_pref_changed\"), fa = \"update-notifications\";\n            this.subscriptions = [o.subscribe(fa, function(ga, ha) {\n                if (((ha.payloadsource === aa) || (ha.payloadsource === ba))) {\n                    var ia = ha.nodes;\n                    if ((ia && ia.length)) {\n                        this._handleBeepChanges(da(ia));\n                    };\n                }\n            ;\n            }.bind(this)),h.subscribe(ea, function(ga, ha) {\n                this.setState({\n                    soundEnabled: ha.obj.enabled\n                });\n            }.bind(this)),];\n            h.inform(\"NotificationBeeper/mounted\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        componentWillUnmount: function() {\n            this.subscriptions.forEach(function(ea) {\n                ea.unsubscribe();\n            });\n            this.subscriptions = null;\n        },\n        _onMouseEnter: function() {\n            if (this.state.paused) {\n                return\n            };\n            (this._hideWait && clearTimeout(this._hideWait));\n            if (this.state.fading) {\n                this._animation.stop();\n                this._animation = null;\n                r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n            }\n        ;\n            var ea = Object.keys(this.state.renderedBeeps);\n            if (this.props.unseenVsUnread) {\n                p.markNotificationsAsSeen(ea);\n            }\n             else p.markNotificationsAsRead(ea);\n        ;\n            this.setState({\n                hovering: true,\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: u(this.state.renderedBeeps, this.state.pendingBeeps)\n            });\n        },\n        _onMouseLeave: function() {\n            if (this.state.paused) {\n                return\n            };\n            this._waitToHide(y);\n            this.setState({\n                hovering: false\n            });\n        },\n        _onInsertedItem: function(ea) {\n            if (!this.state.hovering) {\n                this._waitToHide();\n            };\n            if ((this.state.soundEnabled && ea.sound)) {\n                if (!this._notifSound) {\n                    this._notifSound = new n(this.props.soundPath);\n                };\n                this._notifSound.play(ea.beepID);\n            }\n        ;\n            if (this.props.shouldLogImpressions) {\n                l.log([ea.notificationID,], z);\n            };\n        },\n        _waitToHide: function(ea) {\n            (this._hideWait && clearTimeout(this._hideWait));\n            this._hideWait = v(w(this._hide, this), (ea || x));\n        },\n        _hide: function() {\n            (this._animation && this._animation.stop());\n            this._animation = new g(this.refs.container.getDOMNode()).from(\"opacity\", \"0.96\").to(\"opacity\", \"0\").duration(1500).ondone(this._finishHide).go();\n            this.setState({\n                fading: true\n            });\n        },\n        _finishHide: function() {\n            var ea = this.state.pendingBeeps;\n            this.setState({\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            });\n            v(this.setState.bind(this, {\n                renderedBeeps: ea\n            }, null));\n            r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n        },\n        _handleBeepChanges: function(ea) {\n            var fa = (this.state.fading ? this.state.pendingBeeps : this.state.renderedBeeps);\n            Object.keys(ea).reverse().forEach(function(ga) {\n                var ha = ea[ga], ia = ha.beepID, ja = (this.state.renderedBeeps[ga] || {\n                });\n                if ((ja.beepID != ia)) {\n                    delete fa[ga];\n                    fa[ga] = ha;\n                }\n            ;\n            }.bind(this));\n            if (!this.state.paused) {\n                this._waitToHide();\n            };\n            this.forceUpdate();\n        },\n        _togglePause: function() {\n            if (!this.state.paused) {\n                (this._animation && this._animation.stop());\n                (this._hideWait && clearTimeout(this._hideWait));\n            }\n             else this._waitToHide();\n        ;\n            this.setState({\n                paused: !this.state.paused\n            });\n        },\n        render: function() {\n            var ea = this.state.renderedBeeps, fa = {\n            };\n            Object.keys(ea).reverse().forEach(function(ja) {\n                var ka = ea[ja];\n                fa[ja] = j({\n                    beep: ka,\n                    onInserted: this._onInsertedItem\n                });\n            }, this);\n            var ga = !t(fa), ha = null;\n            if ((ga && this.props.canPause)) {\n                ha = q.DOM.li({\n                    className: \"-cx-PRIVATE-notificationBeeper__pause\",\n                    onClick: this._togglePause\n                }, (this.state.paused ? \"Continue\" : \"Pause [fb]\"));\n            };\n            var ia = ((((!ga ? \"hidden_elem\" : \"\")) + ((\" \" + \"-cx-PUBLIC-notificationBeeper__list\"))));\n            return (q.DOM.ul({\n                ref: \"container\",\n                className: ia,\n                \"data-gt\": this.props.tracking,\n                onMouseEnter: this._onMouseEnter,\n                onMouseLeave: this._onMouseLeave\n            }, fa, ha));\n        }\n    });\n    function da(ea) {\n        var fa = {\n        };\n        ea.forEach(function(ga) {\n            var ha = ga.alert_id, ia = ((ha + \"-\") + ga.receivedTime), ja = m.getThumbnail(ga.attachments, ga.attached_story);\n            fa[ha] = {\n                notificationID: ha,\n                beepID: ia,\n                beepRenderer: ga.beepRenderer,\n                actors: ga.actors,\n                icon: ga.icon,\n                link: ga.url,\n                photo: ja,\n                text: (ga.unaggregatedTitle || ga.title),\n                timestamp: ga.timestamp,\n                receivedTime: ga.receivedTime,\n                sound: !!ga.sound,\n                tracking: ga.tracking\n            };\n        });\n        return fa;\n    };\n    e.exports = ca;\n});\n__d(\"FbdEventLog\", [\"URI\",\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"AsyncSignal\"), i = {\n        log: function(j, k, l, m) {\n            if (!j) {\n                return\n            };\n            var n = g(\"/desktop/eventlog.php\"), o = new h(n.toString(), {\n                event: j,\n                category: (k || \"unknown\"),\n                payload: (l || \"\")\n            });\n            o.setHandler(m).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"DownloadDialog\", [\"Event\",\"Arbiter\",\"Class\",\"DataStore\",\"ModalMask\",\"Overlay\",\"Parent\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DataStore\"), k = b(\"ModalMask\"), l = b(\"Overlay\"), m = b(\"Parent\"), n = b(\"Style\"), o = b(\"copyProperties\"), p = b(\"emptyFunction\");\n    function q() {\n        this.parent.construct(this);\n        return this;\n    };\n    i.extend(q, l);\n    o(q, {\n        POSITIONS: {\n            BOTTOM_LEFT: \"bottom_left\",\n            TOP_LEFT: \"top_left\",\n            IE9_BOTTOM: \"ie9_bottom\"\n        },\n        activeDialogs: {\n        },\n        dismissAll: function() {\n            for (var r in this.POSITIONS) {\n                this.hideDialog(this.POSITIONS[r]);;\n            };\n        },\n        hideDialog: function(r) {\n            var s = this.activeDialogs[r];\n            (s && s.hide());\n            this.activeDialogs[r] = null;\n        }\n    });\n    o(q.prototype, {\n        _cancelHandler: p,\n        _closeHandler: p,\n        _width: null,\n        position: q.POSITIONS.BOTTOM_LEFT,\n        init: function(r, s) {\n            this.parent.init(r);\n            this.position = s;\n            var t = ((j.get(this._root, \"modal\") === \"true\"));\n            q.hideDialog(s);\n            q.activeDialogs[s] = this;\n            g.listen(this._root, \"click\", function(event) {\n                if (m.byClass(event.getTarget(), \"closeButton\")) {\n                    if ((this._cancelHandler() !== false)) {\n                        q.hideDialog(this.position);\n                    }\n                };\n            }.bind(this));\n            this.subscribe(\"show\", function() {\n                if (t) {\n                    k.show();\n                };\n                h.inform(\"layer_shown\", {\n                    type: \"DownloadDialog\"\n                });\n            }.bind(this));\n            this.subscribe(\"hide\", function() {\n                if (t) {\n                    k.hide();\n                };\n                h.inform(\"layer_hidden\", {\n                    type: \"DownloadDialog\"\n                });\n                this._closeHandler();\n            }.bind(this));\n        },\n        setWidth: function(r) {\n            this._width = Math.floor(r);\n            return this;\n        },\n        updatePosition: function() {\n            if (this._width) {\n                n.set(this._overlay, \"width\", (this._width + \"px\"));\n            };\n            return true;\n        },\n        setCancelHandler: function(r) {\n            this._cancelHandler = (r || p);\n            return this;\n        },\n        setCloseHandler: function(r) {\n            this._closeHandler = (r || p);\n            return this;\n        }\n    });\n    e.exports = q;\n    a.DownloadDialog = q;\n});\n__d(\"FbdConversionTracking\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\"), i = {\n        logClick: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            };\n            new g().setURI(\"/ajax/desktop/log_clicks.php\").setData({\n                click_source: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        },\n        logConversion: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            };\n            new g().setURI(\"/ajax/desktop/log_conversions.php\").setData({\n                conversion_action: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"FbdInstall\", [\"$\",\"AsyncRequest\",\"CSS\",\"DOM\",\"DownloadDialog\",\"FbdConversionTracking\",\"FbdEventLog\",\"FBDesktopDetect\",\"FBDesktopPlugin\",\"MegaphoneHelper\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DownloadDialog\"), l = b(\"FbdConversionTracking\"), m = b(\"FbdEventLog\"), n = b(\"FBDesktopDetect\"), o = b(\"FBDesktopPlugin\"), p = b(\"MegaphoneHelper\"), q = 1000, r = (300 * q), s = {\n        cancelSetup: function() {\n            var t = JSON.stringify({\n                ref: this.ref\n            });\n            m.log(\"download_canceled\", \"setup\", t);\n            l.logConversion(\"download_canceled\");\n        },\n        hideMegaphone: function() {\n            if ((this.megaphoneId && this.megaphoneLoc)) {\n                p.hideStory(this.megaphoneId, this.megaphoneLoc, this.elementId, \"\", null);\n            };\n        },\n        init: function(t, u) {\n            this.downloadUrl = t;\n            this.ref = (u || \"unknown\");\n        },\n        initInstallWait: function(t, u, v) {\n            this.megaphoneId = t;\n            this.megaphoneLoc = u;\n            this.elementId = v;\n            this._waitForInstall(r);\n        },\n        promptDownload: function(t) {\n            t = (t || this.downloadUrl);\n            if (t) {\n                var u = JSON.stringify({\n                    ref: this.ref\n                });\n                m.log(\"download_prompted\", \"setup\", u);\n                l.logConversion(\"download_prompted\");\n                var v = j.create(\"iframe\", {\n                    src: t,\n                    className: \"hidden_elem\"\n                });\n                j.appendContent(document.body, v);\n            }\n        ;\n        },\n        _responseHandler: function(t) {\n            if (t.payload) {\n                this._authToken = t.payload.access_token;\n                this._userId = t.payload.id;\n            }\n        ;\n            if ((this._authToken && this._userId)) {\n                this._waitForRunningStart = Date.now();\n                setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        },\n        setupPlugin: function() {\n            new h(\"/ajax/desktop/download\").send();\n            this.promptDownload();\n        },\n        updateSidebarLinkVisibility: function() {\n            if (!n.isPluginInstalled()) {\n                i.show(g(\"sidebar-messenger-install-link\"));\n                i.show(g(\"sidebar-messenger-install-separator\"));\n            }\n        ;\n        },\n        _waitForInstall: function(t) {\n            var u = JSON.stringify({\n                ref: this.ref\n            });\n            if (n.isPluginInstalled()) {\n                m.log(\"install_success\", \"setup\", u);\n                l.logConversion(\"install_success\");\n                o.recheck();\n                new h(\"/desktop/fbdesktop2/transfer.php\").setMethod(\"POST\").setHandler(this._responseHandler.bind(this)).send();\n                k.dismissAll();\n                this.hideMegaphone();\n                return;\n            }\n        ;\n            if ((t <= 0)) {\n                m.log(\"install_timeout\", \"setup\", u);\n                l.logConversion(\"install_timeout\");\n                k.dismissAll();\n            }\n             else setTimeout(this._waitForInstall.bind(this, (t - q)), q);\n        ;\n        },\n        _waitForRunning: function() {\n            var t = (Date.now() - this._waitForRunningStart);\n            if (o.isAppRunning()) {\n                o.transferAuthToken(this._authToken, this._userId);\n            }\n             else if ((t < r)) {\n                setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:fbdesktop2-install-js\", [\"FbdInstall\",], function(a, b, c, d) {\n    a.FbdInstall = b(\"FbdInstall\");\n}, 3);\n__d(\"legacy:fbdesktop-conversion-tracking\", [\"FbdConversionTracking\",], function(a, b, c, d) {\n    a.FbdConversionTracking = b(\"FbdConversionTracking\");\n}, 3);\n__d(\"SidebarTicker\", [\"Arbiter\",\"ChatSidebar\",\"CSS\",\"DOM\",\"Run\",\"TickerController\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatSidebar\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Run\"), l = b(\"TickerController\"), m = b(\"$\"), n = b(\"copyProperties\");\n    function o() {\n        this._ticker = m(\"pagelet_ticker\");\n        this._initSubscriptions();\n        if (i.hasClass(document.documentElement, \"sidebarMode\")) {\n            this._onSidebarShow();\n        };\n    };\n    o.hide = function() {\n        k.onAfterLoad(function() {\n            j.remove(m(\"pagelet_ticker\"));\n            j.remove(j.find(document.body, \"div.fbSidebarGripper\"));\n            h.resize();\n        });\n    };\n    n(o.prototype, {\n        _initSubscriptions: function() {\n            this._subscriptions = [g.subscribe(\"sidebar/show\", this._onSidebarShow.bind(this)),];\n        },\n        _onSidebarShow: function() {\n            l.show(this._ticker);\n        }\n    });\n    e.exports = o;\n});\n__d(\"SidebarTickerResizer\", [\"Arbiter\",\"AsyncRequest\",\"ChatSidebar\",\"SimpleDrag\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"ChatSidebar\"), j = b(\"SimpleDrag\"), k = b(\"$\"), l = 1e-7;\n    function m(n) {\n        var o = k(\"pagelet_ticker\"), p = o.parentNode, q = this._saveResizedState.bind(this), r, s, t, u = function(x, event) {\n            r = event.clientY;\n            s = o.offsetHeight;\n            t = p.offsetHeight;\n        }, v = function(x, event) {\n            var y = (s + ((event.clientY - r))), z = (100 - ((((((t - y)) / t)) * 100)));\n            z = Math.max(l, Math.min(90, z));\n            o.style.height = (z + \"%\");\n            if ((x == \"end\")) {\n                q(z);\n                g.inform(\"Ticker/resized\");\n            }\n        ;\n            i.resize();\n        }, w = new j(n);\n        w.subscribe(\"start\", u);\n        w.subscribe([\"update\",\"end\",], v);\n    };\n    m.prototype._saveResizedState = function(n) {\n        new h(\"/ajax/feed/ticker/resize\").setData({\n            height: (\"\" + n)\n        }).setMethod(\"POST\").send();\n    };\n    e.exports = m;\n});\n__d(\"NotificationXOut\", [\"Arbiter\",\"Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\");\n    function i(m, n) {\n        g.inform(\"notif/negativeCancel\", {\n            id: m\n        });\n        n.kill();\n    };\n    function j(m) {\n        m.prevent();\n    };\n    function k(m, n) {\n        h.listen(m, \"click\", i.curry(n));\n    };\n    function l(m) {\n        h.listen(m, \"click\", j);\n    };\n    e.exports = {\n        setupCancelListener: k,\n        setupNoListener: l\n    };\n});\n__d(\"LiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\"), k = b(\"shield\");\n    function l(m) {\n        this.eventName = m;\n        this.subs = null;\n        this.handler = j;\n        this.shutdownHandler = null;\n        this.registered = false;\n        this.appId = 1;\n    };\n    i(l, {\n        getAppMessageType: function(m, n) {\n            return (((\"live_message/\" + m) + \":\") + n);\n        },\n        route: function(m) {\n            var n = function(o) {\n                var p = l.getAppMessageType(m.app_id, m.event_name);\n                g.inform(p, o, g.BEHAVIOR_PERSISTENT);\n            };\n            n(m.response);\n        }\n    });\n    i(l.prototype, {\n        setAppId: function(m) {\n            this.appId = m;\n            return this;\n        },\n        setHandler: function(m) {\n            this.handler = m;\n            this._dirty();\n            return this;\n        },\n        setRestartHandler: j,\n        setShutdownHandler: function(m) {\n            this.shutdownHandler = k(m);\n            this._dirty();\n            return this;\n        },\n        _dirty: function() {\n            if (this.registered) {\n                this.unregister();\n                this.register();\n            }\n        ;\n        },\n        register: function() {\n            var m = function(o, p) {\n                return this.handler(p);\n            }.bind(this), n = l.getAppMessageType(this.appId, this.eventName);\n            this.subs = {\n            };\n            this.subs.main = g.subscribe(n, m);\n            if (this.shutdownHandler) {\n                this.subs.shut = g.subscribe(h.ON_SHUTDOWN, this.shutdownHandler);\n            };\n            this.registered = true;\n            return this;\n        },\n        unregister: function() {\n            if (!this.subs) {\n                return this\n            };\n            for (var m in this.subs) {\n                if (this.subs[m]) {\n                    this.subs[m].unsubscribe();\n                };\n            };\n            this.subs = null;\n            this.registered = false;\n            return this;\n        }\n    });\n    e.exports = l;\n});\n__d(\"initLiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"LiveMessageReceiver\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveMessageReceiver\");\n    g.subscribe(h.getArbiterType(\"app_msg\"), function(j, k) {\n        i.route(k.obj);\n    });\n});\n__d(\"legacy:CompactTypeaheadRenderer\", [\"CompactTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    };\n    a.TypeaheadRenderers.compact = b(\"CompactTypeaheadRenderer\");\n}, 3);");
// 16002
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s68f309fc311d4f8233d0c2481871ee0dab181004");
// 16003
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"1YKDj\",]);\n}\n;\n;\n__d(\"BuddyListNub\", [\"JSXDOM\",\"JSBNG__Event\",\"Arbiter\",\"AvailableList\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatConfig\",\"ChatSidebar\",\"ChatVisibility\",\"Class\",\"JSBNG__CSS\",\"Dock\",\"DOM\",\"HTML\",\"Keys\",\"NubController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"Toggler\",\"copyProperties\",\"csx\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"JSBNG__Event\"), i = b(\"Arbiter\"), j = b(\"AvailableList\"), k = b(\"BlackbirdUpsell\"), l = b(\"ChannelConnection\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatSidebar\"), p = b(\"ChatVisibility\"), q = b(\"Class\"), r = b(\"JSBNG__CSS\"), s = b(\"Dock\"), t = b(\"DOM\"), u = b(\"HTML\"), v = b(\"Keys\"), w = b(\"NubController\"), x = b(\"OrderedFriendsList\"), y = b(\"Parent\"), z = b(\"PresencePrivacy\"), aa = b(\"Toggler\"), ba = b(\"copyProperties\"), ca = b(\"csx\"), da = b(\"cx\"), ea = b(\"tx\"), fa = 32, ga = 10;\n    function ha(ia, ja, ka) {\n        this.parent.construct(this);\n        this.parent.init(ia);\n        this.root = ia;\n        this.orderedList = ja;\n        this.typeahead = ka;\n        this.button = t.JSBNG__find(ia, \"a.fbNubButton\");\n        this.unreadCount = t.JSBNG__find(ia, \"span.-cx-PRIVATE-fbDockChatBuddyListNub__unreadcount\");\n        this.label = t.JSBNG__find(ia, \"span.label\");\n        this.body = t.scry(ia, \"div.fbNubFlyoutBody\")[0];\n        this.container = y.byClass(ia, \"-cx-PUBLIC-fbDockChatBuddyListNub__container\");\n        var la = t.JSBNG__find(ia, \"div.fbNubFlyoutTitlebar\");\n        aa.createInstance(la).setSticky(false);\n        ja.subscribe(\"render\", this.flyoutContentChanged.bind(this));\n        ja.setScrollContainer(this.body);\n        j.subscribe(\"buddylist/availability-changed\", this._updateCount.bind(this));\n        i.subscribe(\"chat/connect\", this._handleConnect.bind(this));\n        z.subscribe(\"privacy-user-presence-changed\", this._handleVisibilityChange.bind(this));\n        this.message = t.JSBNG__find(ia, \"div.-cx-PRIVATE-fbDockChatBuddyListNub__message\");\n        this.warningMsgText = null;\n        this.warningMsgEventListener = null;\n        this.showWarningTimeout = null;\n        l.subscribe(l.CONNECTED, this._handleChannelConnected.bind(this));\n        l.subscribe(l.SHUTDOWN, this._handleChannelShutdown.bind(this));\n        l.subscribe(l.RECONNECTING, this._handleChannelReconnecting.bind(this));\n        l.subscribe([l.MUTE_WARNING,l.UNMUTE_WARNING,], this._updateView.bind(this));\n        this.subscribe(\"show\", this.onShow.bind(this));\n        this.subscribe(\"hide\", this.onHide.bind(this));\n        this.subscribe(\"resize\", this.onResize.bind(this));\n        h.listen(ia, \"keydown\", this._onKeyDown.bind(this));\n        h.listen(this.button, \"click\", this.onButtonClick.bind(this));\n        ka.subscribe([\"respond\",\"reset\",], function(ma, na) {\n            if (this._isOpen) {\n                var oa = this.orderedList.isVisible();\n                if (((((((na && na.value)) && ((na.value === ka.getCore().getValue())))) && ka.getView().isVisible()))) {\n                    s.setUseMaxHeight(this.root, false);\n                    this.orderedList.hide();\n                }\n                 else this._showBuddyList();\n            ;\n            ;\n                if (((oa !== this.orderedList.isVisible()))) {\n                    this.flyoutContentChanged();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }.bind(this));\n        i.subscribe(\"sidebar/show\", this.hide.bind(this));\n        i.subscribe(\"sidebar/hide\", this._onSidebarHide.bind(this));\n        if (n.get(\"litestand_buddylist_count\")) {\n            this._unreadMessageCount = 0;\n            i.subscribe(\"buddylist-nub/updateCount\", function(ma, na) {\n                if (((this._unreadMessageCount !== na.count))) {\n                    this._unreadMessageCount = na.count;\n                    this._updateView();\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        this._orderedListCount = x.getList().length;\n        i.inform(\"buddylist-nub/initialized\", this, i.BEHAVIOR_PERSISTENT);\n        this._handleVisibilityChange();\n    };\n;\n    q.extend(ha, w);\n    ba(ha.prototype, {\n        getButton: function() {\n            return this.button;\n        },\n        getRoot: function() {\n            return this.root;\n        },\n        _handleConnect: function(ia) {\n            this._updateView(true);\n        },\n        _getShutdownReason: function(ia) {\n            switch (ia) {\n              case m.HINT_AUTH:\n                return \"Your session has timed out. Please log in.\";\n              case m.HINT_CONN:\n                return ea._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n              case m.HINT_MAINT:\n                return ea._(\"Facebook {Chat} is currently down for maintenance.\", {\n                    Chat: \"Chat\"\n                });\n              default:\n                return ea._(\"Facebook {Chat} is currently unavailable.\", {\n                    Chat: \"Chat\"\n                });\n            };\n        ;\n        },\n        _getReconnectMsg: function(ia) {\n            var ja;\n            if (((ia === null))) {\n                ja = \"Unable to connect to chat. Check your Internet connection.\";\n            }\n             else if (((ia > n.get(\"warning_countdown_threshold_msec\")))) {\n                var ka = t.create(\"a\", {\n                    href: \"#\",\n                    className: \"fbChatReconnectLink\"\n                }, \"Try again\"), la = t.create(\"div\", null, ka), ma = la.innerHTML;\n                ja = u(ea._(\"Unable to connect to chat. {try-again-link}\", {\n                    \"try-again-link\": ma\n                }));\n            }\n             else if (((ia > 1000))) {\n                ja = ea._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                    seconds: Math.floor(((ia / 1000)))\n                });\n            }\n             else ja = \"Unable to connect to chat. Reconnecting...\";\n            \n            \n        ;\n        ;\n            return ja;\n        },\n        _resetShowWarningTimeout: function() {\n            if (this.showWarningTimeout) {\n                JSBNG__clearTimeout(this.showWarningTimeout);\n                this.showWarningTimeout = null;\n            }\n        ;\n        ;\n        },\n        _handleChannelConnected: function(ia) {\n            this._resetShowWarningTimeout();\n            if (this.orderedList.isVisible()) {\n                p.goOnline();\n            }\n        ;\n        ;\n            this.warningMsgText = null;\n            this._updateView();\n        },\n        _handleChannelShutdown: function(ia, ja) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getShutdownReason(ja);\n            this._updateView();\n        },\n        _handleChannelReconnecting: function(ia, ja) {\n            this._resetShowWarningTimeout();\n            this.warningMsgText = this._getReconnectMsg(ja);\n            if (((ja > 1000))) {\n                if (((ja > n.get(\"warning_countdown_threshold_msec\")))) {\n                    if (this.warningMsgEventListener) {\n                        this.warningMsgEventListener.remove();\n                        this.warningMsgEventListener = null;\n                    }\n                ;\n                ;\n                    this.warningMsgEventListener = h.listen(this.message, \"click\", function(JSBNG__event) {\n                        if (r.hasClass(JSBNG__event.getTarget(), \"fbChatReconnectLink\")) {\n                            this._tryReconnect();\n                            JSBNG__event.kill();\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n            ;\n            ;\n                this.showWarningTimeout = JSBNG__setTimeout(this._handleChannelReconnecting.bind(this, ia, ((ja - 1000))), 1000, false);\n            }\n        ;\n        ;\n            this._updateView();\n        },\n        _tryReconnect: function() {\n            if (l.disconnected()) {\n                l.reconnect();\n            }\n        ;\n        ;\n        },\n        _handleVisibilityChange: function() {\n            this._updateView();\n            if (k.shouldShow()) {\n                if (p.hasBlackbirdEnabled()) {\n                    k.showBlackbirdDialog(this.getButton(), z.getVisibility());\n                }\n                 else if (!p.isOnline()) {\n                    k.showOfflineDialog(this.getButton());\n                }\n                \n            ;\n            ;\n            }\n             else k.hide();\n        ;\n        ;\n            if (!p.isOnline()) {\n                this.hide();\n            }\n        ;\n        ;\n        },\n        _updateView: function(ia) {\n            var ja = this.container;\n            if (ja) {\n                r.conditionClass(ja, \"offline\", !p.isOnline());\n                r.conditionClass(ja, \"error\", l.disconnected());\n            }\n        ;\n        ;\n            if (l.disconnected()) {\n                t.setContent(this.message, this.warningMsgText);\n            }\n        ;\n        ;\n            var ka, la;\n            if (!p.isOnline()) {\n                ka = ea._(\"{Chat} (Off)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else if (l.disconnected()) {\n                ka = ea._(\"{Chat} (Disconnected)\", {\n                    Chat: \"Chat\"\n                });\n            }\n             else {\n                var ma = j.getOnlineCount();\n                if (ma) {\n                    ka = ea._(\"{Chat} {number-available}\", {\n                        Chat: \"Chat\",\n                        \"number-available\": g.span({\n                            className: \"count\"\n                        }, \" (\", g.strong(null, ma), \") \")\n                    });\n                }\n                 else {\n                    ka = \"Chat\";\n                    la = true;\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            this._setUnread(this._unreadMessageCount);\n            this._setLabel(ka, la);\n            this.buttonContentChanged();\n        },\n        onButtonClick: function() {\n            this._conditionallyShowTypeahead();\n            if (r.shown(this.typeahead.getElement())) {\n                var ia = this.subscribe(\"show\", function() {\n                    this.typeahead.getCore().getElement().JSBNG__focus();\n                    k.dismiss();\n                }.bind(this));\n                this.unsubscribe.bind(this, ia).defer();\n            }\n        ;\n        ;\n        },\n        onHide: function() {\n            this._isOpen = false;\n            if (this._buddyListRenderSubscription) {\n                this.orderedList.unsubscribe(this._buddyListRenderSubscription);\n                this._buddyListRenderSubscription = null;\n            }\n        ;\n        ;\n            this.orderedList.hide();\n            this.typeahead.getCore().reset();\n        },\n        _onKeyDown: function(JSBNG__event) {\n            var ia = h.getKeyCode(JSBNG__event);\n            if (((((ia === v.ESC)) && !r.hasClass(this.root, \"menuOpened\")))) {\n                this.hide();\n                return false;\n            }\n             else if (((ia == v.RETURN))) {\n                o.enable();\n            }\n            \n        ;\n        ;\n        },\n        _onSidebarHide: function(JSBNG__event) {\n            this.getButton().JSBNG__focus();\n        },\n        onResize: function() {\n            var ia = ((s.getMaxFlyoutHeight(this.root) - 60)), ja = Math.max(250, ia);\n            this.orderedList.setNumTopFriends(Math.floor(((ja / fa))));\n        },\n        _showBuddyList: function() {\n            if (!this._buddyListRenderSubscription) {\n                this._buddyListRenderSubscription = this.orderedList.subscribe(\"render\", s.setUseMaxHeight.bind(s, this.root, false));\n            }\n        ;\n        ;\n            this.orderedList.show();\n        },\n        onShow: function() {\n            this._isOpen = true;\n            if (l.disconnected()) {\n                this._tryReconnect();\n                this._showBuddyList();\n            }\n             else p.goOnline(this._showBuddyList.bind(this));\n        ;\n        ;\n        },\n        _setLabel: function(ia, ja) {\n            var ka = this.label.cloneNode(true);\n            t.setContent(ka, ia);\n            t.replace(this.label, ka);\n            this.label = ka;\n            ((this.throbber && r.conditionShow(this.throbber, !!ja)));\n        },\n        _setUnread: function(ia) {\n            r.conditionShow(this.unreadCount, !!ia);\n            if (ia) {\n                ia = g.span({\n                    className: \"-cx-PRIVATE-fbMercuryChatTab__nummessages -cx-PRIVATE-fbMercuryChatTab__numbluegrey\"\n                }, ia);\n                t.setContent(this.unreadCount, ia);\n            }\n        ;\n        ;\n        },\n        _conditionallyShowTypeahead: function() {\n            r.conditionShow(this.typeahead.getElement(), ((this._orderedListCount >= ga)));\n        },\n        _updateCount: function() {\n            this._updateView();\n            this._conditionallyShowTypeahead();\n        }\n    });\n    e.exports = ha;\n});\n__d(\"LiveBarData\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"ChannelConstants\",\"LayerDestroyOnHide\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"ChannelConstants\"), k = b(\"LayerDestroyOnHide\"), l = b(\"copyProperties\"), m = b(\"setTimeoutAcrossTransitions\"), n = false, o = {\n    }, p = {\n    }, q = {\n    };\n    function r(y) {\n        if (((((((y.expires * 1000)) - JSBNG__Date.now())) > 0))) {\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function s(y) {\n        var z = y.payload.actions;\n        if (!((z && z.length))) {\n            return;\n        }\n    ;\n    ;\n        var aa;\n        for (var ba = 0; ((ba < z.length)); ba++) {\n            aa = z[ba].actor_id;\n            if (((!o[aa] || ((z[ba].action_id != o[aa].action_id))))) {\n                continue;\n            }\n        ;\n        ;\n            if (((z[ba].delete_action || z[ba].remove))) {\n                v(z[ba]);\n                continue;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function t(y) {\n        var z = false;\n        for (var aa = 0; ((aa < y.length)); aa++) {\n            if (((y[aa].delete_action || y[aa].remove))) {\n                v(y[aa]);\n                continue;\n            }\n        ;\n        ;\n            var ba = y[aa].actor_id, ca = y[aa].action_id;\n            if (o[ba]) {\n                if (((o[ba].action_id == ca))) {\n                    continue;\n                }\n            ;\n            ;\n                v(o[ba]);\n            }\n        ;\n        ;\n            z = true;\n            o[ba] = y[aa];\n            u(y[aa]);\n        };\n    ;\n        if (z) {\n            x.inform(\"new-actions\");\n        }\n    ;\n    ;\n    };\n;\n    function u(y) {\n        var z = ((((y.expires * 1000)) - JSBNG__Date.now()));\n        p[y.actor_id] = m(v.curry(y), Math.max(0, z));\n    };\n;\n    function v(y) {\n        if (!o[y.actor_id]) {\n            return;\n        }\n    ;\n    ;\n        if (((o[y.actor_id].action_id != y.action_id))) {\n            return;\n        }\n    ;\n    ;\n        delete o[y.actor_id];\n        var z = y.actor_id;\n        if (p[z]) {\n            JSBNG__clearTimeout(p[z]);\n            delete p[z];\n        }\n    ;\n    ;\n        w(z);\n        x.inform(\"remove-action\", y);\n    };\n;\n    function w(y) {\n        var z = q[y];\n        if (z) {\n            z.enableBehavior(k);\n            if (!z.isShown()) {\n                z.destroy();\n            }\n        ;\n        ;\n            delete q[y];\n        }\n    ;\n    ;\n    };\n;\n    g.subscribe(j.getArbiterType(\"livebar_update\"), function(y, z) {\n        t(z.obj.actions);\n    });\n    var x = {\n    };\n    l(x, h, {\n        fetch: function() {\n            if (n) {\n                return;\n            }\n        ;\n        ;\n            var y = [];\n            {\n                var fin283keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin283i = (0);\n                var z;\n                for (; (fin283i < fin283keys.length); (fin283i++)) {\n                    ((z) = (fin283keys[fin283i]));\n                    {\n                        var aa = o[z];\n                        if (aa.suppress_callout) {\n                            continue;\n                        }\n                    ;\n                    ;\n                        if (!q[aa.actor_id]) {\n                            y.push(o[z]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (((y.length > 0))) {\n                n = true;\n                new i().setURI(\"/ajax/chat/livebar.php\").setData({\n                    actions: y\n                }).setHandler(s).setFinallyHandler(function() {\n                    n = false;\n                }).setAllowCrossPageTransition(true).send();\n            }\n        ;\n        ;\n        },\n        addActions: t,\n        getAction: function(y) {\n            var z = o[y];\n            if (((z && r(z)))) {\n                return z;\n            }\n        ;\n        ;\n            return null;\n        },\n        getDialog: function(y) {\n            var z = this.getAction(y);\n            if (((z && q[z.actor_id]))) {\n                return q[z.actor_id];\n            }\n        ;\n        ;\n            return null;\n        },\n        setDialog: function(y, z, aa) {\n            var ba = o[y];\n            if (((ba && ((ba.action_id == z))))) {\n                w(y);\n                q[y] = aa;\n                x.inform(\"dialog-fetched\", y);\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = x;\n});\n__d(\"LiveBar\", [\"ChatOrderedList\",\"function-extensions\",\"LegacyContextualDialog\",\"ChatConfig\",\"JSBNG__CSS\",\"LiveBarData\",\"copyProperties\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"function-extensions\");\n    b(\"LegacyContextualDialog\");\n    var g = b(\"ChatConfig\"), h = b(\"JSBNG__CSS\"), i = b(\"LiveBarData\"), j = b(\"copyProperties\"), k = b(\"setTimeoutAcrossTransitions\"), l = b(\"shield\"), m = ((g.get(\"livebar_fetch_defer\") || 1000));\n    function n(o, p, q) {\n        this._orderedList = o;\n        this._root = o.getRoot();\n        this._liveBarTypes = q;\n        this._hoverController = o.getHoverController();\n        this._hoverController.subscribe(\"hover\", this._mouseMove.bind(this));\n        this._hoverController.subscribe(\"leave\", this._mouseLeave.bind(this));\n        o.subscribe(\"render\", l(this._handleChatListUpdate, this));\n        i.subscribe(\"new-actions\", this._updateIcons.bind(this));\n        i.subscribe(\"remove-action\", this._handleRemoveAction.bind(this));\n        i.subscribe(\"dialog-fetched\", function(r, s) {\n            this._setDialogContent(s);\n        }.bind(this));\n        i.addActions(p);\n    };\n;\n    j(n, {\n        setDialog: function(o, p, q) {\n            i.setDialog(o, p, q);\n        }\n    });\n    j(n.prototype, {\n        _root: null,\n        _liveBarTypes: null,\n        _hoverController: null,\n        _registrations: {\n        },\n        _renderedIcons: {\n        },\n        _fetchTimer: null,\n        _mouseLeftRoot: false,\n        _chatListRendered: false,\n        _getLiveBarTypes: function() {\n            return this._liveBarTypes;\n        },\n        _handleChatListUpdate: function() {\n            if (!this._chatListRendered) {\n                this._chatListRendered = true;\n                this._updateIcons();\n            }\n        ;\n        ;\n        },\n        _handleShow: function(o) {\n            this._setDialogContent(o);\n        },\n        _mouseMove: function() {\n            if (!this._fetchTimer) {\n                this._fetchTimer = k(this._fetch.bind(this), m);\n                this._mouseLeftRoot = false;\n            }\n        ;\n        ;\n        },\n        _mouseLeave: function() {\n            this._mouseLeftRoot = true;\n            JSBNG__clearTimeout(this._fetchTimer);\n            this._fetchTimer = null;\n        },\n        _setDialogContent: function(o) {\n            var p = i.getDialog(o);\n            if (p) {\n                this._hoverController.showHovercard(o, p);\n            }\n        ;\n        ;\n        },\n        _fetch: function() {\n            if (this._mouseLeftRoot) {\n                return;\n            }\n        ;\n        ;\n            this._fetchTimer = null;\n            i.fetch();\n        },\n        _updateIcons: function() {\n            if (!this._chatListRendered) {\n                return;\n            }\n        ;\n        ;\n            var o = this._orderedList.getAllNodes(), p = this._getLiveBarTypes();\n            {\n                var fin284keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin284i = (0);\n                var q;\n                for (; (fin284i < fin284keys.length); (fin284i++)) {\n                    ((q) = (fin284keys[fin284i]));\n                    {\n                        var r = i.getAction(q);\n                        if (((r && ((!this._renderedIcons[q] || ((this._renderedIcons[q] != r.action_id))))))) {\n                            for (var s = 0; ((s < p.length)); s++) {\n                                h.removeClass(o[q], p[s]);\n                            ;\n                            };\n                        ;\n                            h.addClass(o[q], r.livebar_type);\n                            this._renderedIcons[q] = r.action_id;\n                            var t = this._hoverController.register(q, this._handleShow.bind(this));\n                            if (t) {\n                                this._registrations[q] = t;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _handleRemoveAction: function(o, p) {\n            var q = p.action_id, r = p.actor_id;\n            ((this._registrations[r] && this._registrations[r].unregister()));\n            delete this._registrations[r];\n            if (((this._renderedIcons[r] == q))) {\n                var s = this._getLiveBarTypes(), t = this._orderedList.getAllNodes();\n                if (t[r]) {\n                    for (var u = 0; ((u < s.length)); u++) {\n                        h.removeClass(t[r], s[u]);\n                    ;\n                    };\n                }\n            ;\n            ;\n                delete this._renderedIcons[r];\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = n;\n});\n__d(\"LiveBarDark\", [\"Class\",\"LiveBar\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"LiveBar\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\");\n    function k(l, m, n) {\n        this.parent.construct(this, l, m, n);\n    };\n;\n    g.extend(k, h);\n    i(k.prototype, {\n        _setupDialogContent: j,\n        _show: j,\n        _updateIcons: j,\n        _handleRemoveAction: j,\n        _handleChatListUpdate: j\n    });\n    e.exports = k;\n});\n__d(\"ChatSidebarDropdown\", [\"Arbiter\",\"AsyncRequest\",\"Chat\",\"ChatOptions\",\"ChatVisibility\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"PresenceState\",\"SelectorDeprecated\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"Chat\"), j = b(\"ChatOptions\"), k = b(\"ChatVisibility\"), l = b(\"JSBNG__CSS\"), m = b(\"DOM\"), n = b(\"JSBNG__Event\"), o = b(\"JSLogger\"), p = b(\"PresenceState\"), q = b(\"SelectorDeprecated\"), r = b(\"copyProperties\");\n    function s(t, u) {\n        this._root = t;\n        this._logger = o.create(\"blackbird\");\n        this._displayBrowserNotificationsIfNeeded();\n        q.listen(t, \"select\", this._onSelect.bind(this));\n        q.listen(t, \"toggle\", this._onToggle.bind(this));\n        if (u) {\n            q.listen(t, \"close\", u.allowCollapse.curry(true, \"SidebarMenu\"));\n            q.listen(t, \"open\", u.allowCollapse.curry(false, \"SidebarMenu\"));\n        }\n    ;\n    ;\n        g.subscribe(\"chat/option-changed\", this._onOptionChanged.bind(this));\n    };\n;\n    r(s, {\n        registerEditFavorites: function(t, u, v) {\n            function w(x) {\n                l.conditionShow(t, !x);\n                l.conditionShow(u, x);\n            };\n        ;\n            n.listen(t, \"click\", function() {\n                v.toggleEditMode();\n                w(true);\n            });\n            n.listen(u, \"click\", function() {\n                v.toggleEditMode();\n                w(false);\n            });\n            v.subscribe(\"editStart\", w.curry(true));\n            v.subscribe(\"editEnd\", w.curry(false));\n        }\n    });\n    r(s.prototype, {\n        changeSetting: function(t, u) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            this._pendingChange = true;\n            var v = {\n            };\n            v[t] = u;\n            j.setSetting(t, u, \"sidebar_menu\");\n            new h(\"/ajax/chat/settings.php\").setHandler(this._onChangeSettingResponse.bind(this, t, u)).setErrorHandler(this._onChangeSettingError.bind(this, t, u)).setFinallyHandler(this._onChangeFinally.bind(this)).setData(v).setAllowCrossPageTransition(true).send();\n        },\n        _displayBrowserNotificationsIfNeeded: function() {\n            if (window.JSBNG__webkitNotifications) {\n                m.scry(JSBNG__document, \"li.sidebar-browser-notif\").forEach(l.show);\n                if (((window.JSBNG__webkitNotifications.checkPermission() !== 0))) {\n                    m.scry(JSBNG__document, \"li.sidebar-browser-notif\").forEach(function(t) {\n                        l.removeClass(t, \"checked\");\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _conditionEnabled: function(t, u) {\n            var v = q.getOption(this._root, t);\n            ((v && q.setOptionEnabled(v, u)));\n        },\n        _onChangeSettingResponse: function(t, u, v) {\n            p.doSync();\n        },\n        _onChangeSettingError: function(t, u, v) {\n            j.setSetting(t, !u, \"sidebar_menu_error\");\n        },\n        _onChangeFinally: function() {\n            this._pendingChange = false;\n        },\n        _onOptionChanged: function(t, u) {\n            var v = u.JSBNG__name, w = u.value;\n            if (((((v === \"sound\")) || ((v === \"browser_notif\"))))) {\n                var x = q.getOption(this._root, v);\n                if (((w !== q.isOptionSelected(x)))) {\n                    q.setSelected(this._root, v, w);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _onSelect: function(t) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            var u = false, v = false, w = q.getOptionValue(t.option);\n            switch (w) {\n              case \"JSBNG__sidebar\":\n                return this.toggleSidebar();\n              case \"online\":\n                if (!k.isOnline()) {\n                    k.goOnline();\n                }\n                 else v = true;\n            ;\n            ;\n                u = true;\n                break;\n              case \"offline\":\n                if (k.isOnline()) {\n                    k.goOffline();\n                }\n                 else v = true;\n            ;\n            ;\n                u = true;\n                break;\n              case \"advanced_settings\":\n            \n              case \"turn_off_dialog\":\n                g.inform(\"chat/advanced-settings-dialog-opened\");\n                u = true;\n                break;\n            };\n        ;\n            if (v) {\n                this._logger.error(\"sidebar_dropdown_visibility_error\", {\n                    action: w\n                });\n            }\n             else this._logger.log(\"sidebar_dropdown_set_visibility\", {\n                action: w\n            });\n        ;\n        ;\n            if (u) {\n                q.toggle(this._root);\n                return false;\n            }\n        ;\n        ;\n        },\n        _onToggle: function(t) {\n            if (this._pendingChange) {\n                return false;\n            }\n        ;\n        ;\n            var u = q.getOptionValue(t.option), v = q.isOptionSelected(t.option);\n            switch (u) {\n              case \"visibility\":\n                if (!k) {\n                    this._jslogger.error(\"on_toggle_visibility_undefined\");\n                    return;\n                }\n            ;\n            ;\n                k.toggleVisibility();\n                this._logger.log(\"sidebar_dropdown_toggle_visibility\", {\n                    available: v\n                });\n                break;\n              case \"browser_notif\":\n                if (((((v && window.JSBNG__webkitNotifications)) && ((window.JSBNG__webkitNotifications.checkPermission() !== 0))))) {\n                    window.JSBNG__webkitNotifications.requestPermission(function() {\n                        this.changeSetting(u, v);\n                    }.bind(this));\n                }\n                 else this.changeSetting(u, v);\n            ;\n            ;\n                break;\n              case \"sound\":\n                this.changeSetting(u, v);\n                break;\n            };\n        ;\n            q.toggle(this._root);\n        },\n        _onVisibilityChanged: function() {\n            var t = k.isOnline(), u = q.getOption(this._root, \"visibility\");\n            if (((t !== q.isOptionSelected(u)))) {\n                q.setSelected(this._root, \"visibility\", t);\n            }\n        ;\n        ;\n        },\n        toggleSidebar: function() {\n            i.toggleSidebar();\n            q.toggle(this._root);\n            return false;\n        }\n    });\n    e.exports = s;\n});\n__d(\"ModuleDependencies\", [], function(a, b, c, d, e, f) {\n    function g(k, l, m) {\n        var n = a.require.__debug.modules[m], o = a.require.__debug.deps;\n        if (l[m]) {\n            return;\n        }\n    ;\n    ;\n        l[m] = true;\n        if (!n) {\n            ((o[m] && (k[m] = true)));\n            return;\n        }\n    ;\n    ;\n        if (((!n.dependencies || !n.dependencies.length))) {\n            if (n.waiting) {\n                k[m] = true;\n            }\n        ;\n        ;\n            return;\n        }\n    ;\n    ;\n        n.dependencies.forEach(function(p) {\n            g(k, l, p);\n        });\n    };\n;\n    function h(k) {\n        if (a.require.__debug) {\n            var l = {\n            };\n            g(l, {\n            }, k);\n            var m = Object.keys(l);\n            m.sort();\n            return m;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function i() {\n        var k = {\n            loading: {\n            },\n            missing: []\n        };\n        if (!a.require.__debug) {\n            return k;\n        }\n    ;\n    ;\n        var l = {\n        }, m = a.require.__debug.modules, n = a.require.__debug.deps;\n        {\n            var fin285keys = ((window.top.JSBNG_Replay.forInKeys)((m))), fin285i = (0);\n            var o;\n            for (; (fin285i < fin285keys.length); (fin285i++)) {\n                ((o) = (fin285keys[fin285i]));\n                {\n                    var p = m[o];\n                    if (p.waiting) {\n                        var q = {\n                        };\n                        g(q, {\n                        }, p.id);\n                        delete q[p.id];\n                        k.loading[p.id] = Object.keys(q);\n                        k.loading[p.id].sort();\n                        k.loading[p.id].forEach(function(r) {\n                            if (((!((r in m)) && n[r]))) {\n                                l[r] = 1;\n                            }\n                        ;\n                        ;\n                        });\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        k.missing = Object.keys(l);\n        k.missing.sort();\n        return k;\n    };\n;\n    var j = {\n        getMissing: h,\n        getNotLoadedModules: i\n    };\n    e.exports = j;\n});\n__d(\"ChatSidebarLog\", [\"AsyncSignal\",\"Bootloader\",\"ModuleDependencies\",\"JSLogger\",\"Run\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Bootloader\"), i = b(\"ModuleDependencies\"), j = b(\"JSLogger\"), k = b(\"Run\"), l = j.create(\"chat_sidebar_load\"), m = null, n = false, o = ((((Math.JSBNG__random() * 2147483648)) | 0)).toString(36);\n    k.onLoad(function() {\n        n = true;\n    });\n    try {\n        d([\"ChatSidebar\",], function(t) {\n            m = t;\n        });\n    } catch (p) {\n        l.warn(\"exception\", {\n            reason: p.toString()\n        });\n    };\n;\n    function q(t, u) {\n        if (((t.length > u))) {\n            return t[u];\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function r(t) {\n        JSBNG__setTimeout(function() {\n            var u = i.getMissing(\"ChatSidebar\"), v = h.getErrorUrls(), w = h.getLoadingUrls(), x = [];\n            {\n                var fin286keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin286i = (0);\n                var y;\n                for (; (fin286i < fin286keys.length); (fin286i++)) {\n                    ((y) = (fin286keys[fin286i]));\n                    {\n                        x.push({\n                            url: y,\n                            time: w[y]\n                        });\n                    ;\n                    };\n                };\n            };\n        ;\n            x.sort(function(aa, ba) {\n                return ((ba.time - aa.time));\n            });\n            var z = {\n                page_loaded: n,\n                page_id: o,\n                timeout: t,\n                missing_total: u.length,\n                module_1: q(u, 0),\n                module_2: q(u, 1),\n                module_3: q(u, 2),\n                error_url_total: v.length,\n                error_url_1: q(v, 0),\n                error_url_2: q(v, 1),\n                error_url_3: q(v, 2),\n                loading_url_total: x.length,\n                loading_url_1: ((q(x, 0) ? q(x, 0).url : null)),\n                loading_time_1: ((q(x, 0) ? q(x, 0).time : null)),\n                loading_url_2: ((q(x, 1) ? q(x, 1).url : null)),\n                loading_time_2: ((q(x, 1) ? q(x, 1).time : null)),\n                loading_url_3: ((q(x, 2) ? q(x, 2).url : null)),\n                loading_time_3: ((q(x, 2) ? q(x, 2).time : null))\n            };\n            if (!m) {\n                l.warn(((\"require_\" + t)), {\n                    missing: u\n                });\n                z.symptom = \"require\";\n            }\n        ;\n        ;\n            if (((m && !m.isInitialized()))) {\n                l.warn(((\"init_\" + t)), {\n                    missing: u\n                });\n                z.symptom = \"init\";\n            }\n        ;\n        ;\n            if (z.symptom) {\n                new g(\"/ajax/chat/sidebar_load.php\", z).send();\n            }\n        ;\n        ;\n        }, t);\n    };\n;\n    var s = {\n        start: function() {\n            r(5000);\n            r(10000);\n            r(15000);\n            r(30000);\n            r(60000);\n        }\n    };\n    e.exports = s;\n});\n__d(\"NotificationConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        PayloadSourceType: {\n            UNKNOWN: 0,\n            USER_ACTION: 1,\n            LIVE_SEND: 2,\n            ENDPOINT: 3,\n            INITIAL_LOAD: 4,\n            OTHER_APPLICATION: 5\n        }\n    };\n});\n__d(\"NotificationTokens\", [\"Env\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = {\n        tokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return ((((g.user + \":\")) + j));\n            });\n        },\n        untokenizeIDs: function(i) {\n            return i.map(function(j) {\n                return j.split(\":\")[1];\n            });\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationImpressions\", [\"AsyncSignal\",\"NotificationTokens\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"NotificationTokens\"), i = b(\"URI\"), j = \"/ajax/notifications/impression.php\";\n    function k(l, m) {\n        var n = {\n            ref: m\n        };\n        h.untokenizeIDs(l).forEach(function(o, p) {\n            n[((((\"alert_ids[\" + p)) + \"]\"))] = o;\n        });\n        new g(i(j).getQualifiedURI().toString(), n).send();\n    };\n;\n    e.exports = {\n        log: k\n    };\n});\n__d(\"NotificationPhotoThumbnail\", [], function(a, b, c, d, e, f) {\n    function g(i) {\n        if (((((!i.media || !i.style_list)) || !i.style_list.length))) {\n            return null;\n        }\n    ;\n    ;\n        switch (i.style_list[0]) {\n          case \"photo\":\n        \n          case \"album\":\n            return i.media.image;\n          default:\n            return null;\n        };\n    ;\n    };\n;\n    var h = {\n        getThumbnail: function(i, j) {\n            var k;\n            if (((i && i.length))) {\n                k = g(i[0]);\n                if (k) {\n                    return k;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (j) {\n                var l = j.attachments;\n                if (((l && l.length))) {\n                    return g(l[0]);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return null;\n        }\n    };\n    e.exports = h;\n});\n__d(\"NotificationUpdates\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"NotificationConstants\",\"NotificationTokens\",\"LiveTimer\",\"copyProperties\",\"createObjectFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"NotificationConstants\"), k = b(\"NotificationTokens\"), l = b(\"LiveTimer\"), m = b(\"copyProperties\"), n = b(\"createObjectFrom\"), o = {\n    }, p = {\n    }, q = {\n    }, r = {\n    }, s = [], t = 0, u = i.create(\"notification_updates\");\n    function v() {\n        if (t) {\n            return;\n        }\n    ;\n    ;\n        var z = o, aa = p, ba = q, ca = r;\n        o = {\n        };\n        p = {\n        };\n        q = {\n        };\n        r = {\n        };\n        x(\"notifications-updated\", z);\n        if (Object.keys(aa).length) {\n            x(\"seen-state-updated\", aa);\n        }\n    ;\n    ;\n        if (Object.keys(ba).length) {\n            x(\"read-state-updated\", ba);\n        }\n    ;\n    ;\n        if (Object.keys(ca).length) {\n            x(\"hidden-state-updated\", ca);\n        }\n    ;\n    ;\n        s.pop();\n    };\n;\n    function w() {\n        if (s.length) {\n            return s[((s.length - 1))];\n        }\n    ;\n    ;\n        return j.PayloadSourceType.UNKNOWN;\n    };\n;\n    function x(JSBNG__event, z) {\n        y.inform(JSBNG__event, {\n            updates: z,\n            source: w()\n        });\n    };\n;\n    g.subscribe(h.getArbiterType(\"notification_json\"), function(z, aa) {\n        var ba = JSBNG__Date.now(), ca = aa.obj.nodes;\n        if (ca) {\n            ca.forEach(function(da) {\n                da.receivedTime = ba;\n            });\n            u.debug(\"notifications_received\", ca);\n            y.handleUpdate(j.PayloadSourceType.LIVE_SEND, aa.obj);\n        }\n    ;\n    ;\n    });\n    g.subscribe(h.getArbiterType(\"notifications_seen\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            seenState: n(ba)\n        });\n    });\n    g.subscribe(h.getArbiterType(\"notifications_read\"), function(z, aa) {\n        var ba = k.tokenizeIDs(aa.obj.alert_ids);\n        y.handleUpdate(j.PayloadSourceType.LIVE_SEND, {\n            readState: n(ba)\n        });\n    });\n    var y = m(new g(), {\n        handleUpdate: function(z, aa) {\n            if (aa.servertime) {\n                l.restart(aa.servertime);\n            }\n        ;\n        ;\n            if (Object.keys(aa).length) {\n                this.synchronizeInforms(function() {\n                    s.push(z);\n                    var ba = m({\n                        payloadsource: w()\n                    }, aa);\n                    this.inform(\"update-notifications\", ba);\n                    this.inform(\"update-seen\", ba);\n                    this.inform(\"update-read\", ba);\n                    this.inform(\"update-hidden\", ba);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        didUpdateNotifications: function(z) {\n            m(o, n(z));\n            v();\n        },\n        didUpdateSeenState: function(z) {\n            m(p, n(z));\n            v();\n        },\n        didUpdateReadState: function(z) {\n            m(q, n(z));\n            v();\n        },\n        didUpdateHiddenState: function(z) {\n            m(r, n(z));\n            v();\n        },\n        synchronizeInforms: function(z) {\n            t++;\n            try {\n                z();\n            } catch (aa) {\n                throw aa;\n            } finally {\n                t--;\n                v();\n            };\n        ;\n        }\n    });\n    e.exports = y;\n});\n__d(\"NotificationStore\", [\"KeyedCallbackManager\",\"NotificationConstants\",\"NotificationUpdates\",\"RangedCallbackManager\",\"MercuryServerDispatcher\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"NotificationConstants\"), i = b(\"NotificationUpdates\"), j = b(\"RangedCallbackManager\"), k = b(\"MercuryServerDispatcher\"), l = new g(), m = new j(function(p) {\n        var q = l.getResource(p);\n        return q.creation_time;\n    }, function(p, q) {\n        return ((q - p));\n    }), n = {\n    };\n    i.subscribe(\"update-notifications\", function(p, q) {\n        if (q.page_info) {\n            n = q.page_info;\n        }\n    ;\n    ;\n        if (((q.nodes === undefined))) {\n            return;\n        }\n    ;\n    ;\n        var r, s = [], t = {\n        }, u = ((q.nodes || [])), v;\n        u.forEach(function(w) {\n            r = w.alert_id;\n            v = l.getResource(r);\n            if (((!v || ((v.creation_time < w.creation_time))))) {\n                s.push(r);\n                t[r] = w;\n            }\n        ;\n        ;\n        });\n        l.addResourcesAndExecute(t);\n        m.addResources(s);\n        i.didUpdateNotifications(s);\n    });\n    k.registerEndpoints({\n        \"/ajax/notifications/client/get.php\": {\n            mode: k.IMMEDIATE,\n            handler: function(p) {\n                i.handleUpdate(h.PayloadSourceType.ENDPOINT, p);\n            }\n        }\n    });\n    var o = {\n        getNotifications: function(p, q) {\n            var r = m.executeOrEnqueue(0, p, function(w) {\n                var x = l.executeOrEnqueue(w, function(y) {\n                    q(y);\n                });\n            }), s = m.getUnavailableResources(r);\n            if (s.length) {\n                m.unsubscribe(r);\n                if (!o.canFetchMore()) {\n                    l.executeOrEnqueue(m.getAllResources(), q);\n                    return;\n                }\n            ;\n            ;\n                var t = ((n.end_cursor || null)), u;\n                if (t) {\n                    var v = Math.max.apply(null, s);\n                    u = ((((v - m.getCurrentArraySize())) + 1));\n                }\n                 else u = p;\n            ;\n            ;\n                k.trySend(\"/ajax/notifications/client/get.php\", {\n                    cursor: t,\n                    length: u\n                });\n            }\n        ;\n        ;\n        },\n        getAll: function(p) {\n            o.getNotifications(o.getCount(), p);\n        },\n        getCount: function() {\n            return m.getCurrentArraySize();\n        },\n        canFetchMore: function() {\n            if (n.hasOwnProperty(\"has_next_page\")) {\n                return n.has_next_page;\n            }\n        ;\n        ;\n            return true;\n        }\n    };\n    e.exports = o;\n});\n__d(\"NotificationUserActions\", [\"AsyncRequest\",\"AsyncSignal\",\"NotificationConstants\",\"NotificationStore\",\"NotificationTokens\",\"NotificationUpdates\",\"URI\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AsyncSignal\"), i = b(\"NotificationConstants\"), j = b(\"NotificationStore\"), k = b(\"NotificationTokens\"), l = b(\"NotificationUpdates\"), m = b(\"URI\"), n = b(\"createObjectFrom\"), o = b(\"emptyFunction\"), p = i.PayloadSourceType.USER_ACTION, q = \"mark_spam\", r = \"turn_off\", s = \"undo\", t = \"first_receipt_yes\", u = \"first_receipt_no\";\n    function v(aa) {\n        var ba = m(\"/ajax/notifications/mark_read.php\").getQualifiedURI().toString();\n        new h(ba, aa).send();\n    };\n;\n    function w(aa) {\n        var ba = {\n        };\n        aa.forEach(function(ca, da) {\n            ba[((((\"alert_ids[\" + da)) + \"]\"))] = ca;\n        });\n        return ba;\n    };\n;\n    function x(aa, ba, ca, da) {\n        var ea = k.untokenizeIDs([aa,])[0];\n        new g(\"/ajax/notifications/negative_req.php\").setData({\n            notification_id: ea,\n            client_rendered: true,\n            request_type: ba\n        }).setHandler(((ca || o))).setErrorHandler(((da || o))).send();\n    };\n;\n    function y(aa, ba, ca, da, ea) {\n        var fa = ((ea ? s : r));\n        j.getAll(function(ga) {\n            var ha = Object.keys(ga).filter(function(ia) {\n                var ja = ga[ia];\n                return !!((((ja.application && ja.application.id)) && ((ja.application.id == ba))));\n            });\n            x(aa, fa, function(ia) {\n                ca(ia);\n                l.handleUpdate(p, {\n                    hiddenState: n(ha, !ea)\n                });\n            }, da);\n        });\n    };\n;\n    var z = {\n        markNotificationsAsSeen: function(aa) {\n            l.handleUpdate(p, {\n                seenState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa), ca = w(ba);\n            ca.seen = true;\n            v(ca);\n            if (a.presenceNotifications) {\n                a.presenceNotifications.alertList.markSeen(ba);\n            }\n        ;\n        ;\n        },\n        markNotificationsAsRead: function(aa) {\n            l.handleUpdate(p, {\n                readState: n(aa)\n            });\n            var ba = k.untokenizeIDs(aa);\n            v(w(ba));\n            if (a.presenceNotifications) {\n                a.presenceNotifications.markRead(false, ba);\n            }\n        ;\n        ;\n        },\n        markNotificationAsHidden: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,])\n            });\n            x(aa, r, ba, ca);\n        },\n        markNotificationAsVisible: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, s, ba, ca);\n        },\n        markNotificationAsSpam: function(aa, ba, ca) {\n            l.handleUpdate(p, {\n                hiddenState: n([aa,], false)\n            });\n            x(aa, q, ba, ca);\n        },\n        markAppAsHidden: function(aa, ba, ca, da) {\n            var ea = false;\n            y(aa, ba, ca, da, ea);\n        },\n        markAppAsVisible: function(aa, ba, ca, da) {\n            var ea = true;\n            y(aa, ba, ca, da, ea);\n        },\n        markFirstReceiptYes: function(aa, ba, ca) {\n            x(aa, t, ba, ca);\n        },\n        markFirstReceiptNo: function(aa, ba, ca) {\n            x(aa, u, ba, ca);\n        }\n    };\n    e.exports = z;\n});\n__d(\"NotificationBeeperItemContents.react\", [\"Animation\",\"CloseButton.react\",\"ImageBlock.react\",\"NotificationURI\",\"NotificationUserActions\",\"React\",\"TextWithEntities.react\",\"Timestamp.react\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CloseButton.react\"), i = b(\"ImageBlock.react\"), j = b(\"NotificationURI\"), k = b(\"NotificationUserActions\"), l = b(\"React\"), m = b(\"TextWithEntities.react\"), n = b(\"Timestamp.react\"), o = b(\"cx\");\n    function p(r, s) {\n        return l.DOM.span({\n            className: \"fwb\"\n        }, r);\n    };\n;\n    var q = l.createClass({\n        displayName: \"NotificationBeeperItemContents\",\n        _markAsRead: function() {\n            k.markNotificationsAsRead([this.props.beep.notificationID,]);\n            this.props.onHide();\n        },\n        _onClose: function() {\n            this._markAsRead();\n            this.props.onHide();\n        },\n        _doFlash: function() {\n            new g(this.refs.JSBNG__inner.getDOMNode()).from(\"opacity\", \"0\").to(\"opacity\", \"1\").duration(200).go();\n        },\n        componentDidUpdate: function(r) {\n            if (((r.beep.beepID !== this.props.beep.beepID))) {\n                this._doFlash();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var r = this.props.beep, s = r.icon.uri, t = ((r.link ? j.localize(r.link) : \"#\")), u = ((r.photo && j.snowliftable(t)));\n            return (l.DOM.div({\n                ref: \"JSBNG__inner\"\n            }, h({\n                className: \"-cx-PRIVATE-notificationBeeperItem__closebutton\",\n                onClick: this._onClose,\n                size: \"medium\"\n            }), l.DOM.a({\n                href: t,\n                ajaxify: ((u ? t : null)),\n                onClick: this._markAsRead,\n                rel: ((u ? \"theater\" : null)),\n                className: \"-cx-PRIVATE-notificationBeeperItem__anchor\"\n            }, i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblock\"\n            }, l.DOM.img({\n                src: r.actors[0].profile_picture.uri,\n                className: \"-cx-PRIVATE-notificationBeeperItem__photo\"\n            }), l.DOM.div({\n                className: \"-cx-PRIVATE-notificationBeeperItem__imageblockcontent\"\n            }, m({\n                renderEmoticons: true,\n                renderEmoji: true,\n                interpolator: p,\n                ranges: r.text.ranges,\n                aggregatedranges: r.text.aggregated_ranges,\n                text: r.text.text\n            }), i({\n                className: \"-cx-PRIVATE-notificationBeeperItem__metadata\"\n            }, l.DOM.img({\n                src: s\n            }), n({\n                time: r.timestamp.time,\n                text: r.timestamp.text,\n                verbose: r.timestamp.verbose\n            })))))));\n        }\n    });\n    e.exports = q;\n});\n__d(\"NotificationBeeperItem.react\", [\"Animation\",\"BrowserSupport\",\"NotificationBeeperItemContents.react\",\"React\",\"cx\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"BrowserSupport\"), i = b(\"NotificationBeeperItemContents.react\"), j = b(\"React\"), k = b(\"cx\"), l = b(\"setTimeoutAcrossTransitions\"), m = j.createClass({\n        displayName: \"NotificationBeeperItem\",\n        getInitialState: function() {\n            return {\n                fadedIn: false,\n                hidden: false\n            };\n        },\n        componentDidMount: function() {\n            var n;\n            if (h.hasCSSAnimations()) {\n                n = this.setState.bind(this, {\n                    fadedIn: true\n                }, null);\n            }\n             else n = function() {\n                new g(this.refs.JSBNG__item.getDOMNode()).from(\"JSBNG__top\", \"-30px\").from(\"opacity\", \"0\").to(\"JSBNG__top\", \"0px\").to(\"opacity\", \"1\").duration(200).ondone(this.setState.bind(this, {\n                    fadedIn: true\n                }, null)).go();\n            }.bind(this);\n        ;\n        ;\n            l(n, 50);\n            this.props.onInserted(this.props.beep);\n        },\n        render: function() {\n            var n = this.props.beep, o = (((((\"-cx-PRIVATE-notificationBeeperItem__beeperitem\") + ((this.state.fadedIn ? ((\" \" + \"-cx-PRIVATE-notificationBeeperItem__fadedin\")) : \"\")))) + ((this.state.hidden ? ((\" \" + \"-cx-PRIVATE-notificationBeeperItem__hiddenitem\")) : \"\")))), p = ((n.beepRenderer || i));\n            return (j.DOM.li({\n                className: o,\n                ref: \"JSBNG__item\",\n                \"data-gt\": n.tracking\n            }, p({\n                beep: n,\n                onHide: this.setState.bind(this, {\n                    hidden: true\n                }, null)\n            })));\n        }\n    });\n    e.exports = m;\n});\n__d(\"NotificationSound\", [\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Sound\"), h = b(\"copyProperties\"), i = 5000;\n    g.init([\"audio/mpeg\",]);\n    function j(k) {\n        this._soundPath = k;\n        this._lastPlayed = 0;\n    };\n;\n    h(j.prototype, {\n        play: function(k) {\n            if (!this._soundPath) {\n                return;\n            }\n        ;\n        ;\n            var l = JSBNG__Date.now();\n            if (((((l - this._lastPlayed)) < i))) {\n                return;\n            }\n        ;\n        ;\n            this._lastPlayed = l;\n            g.play(this._soundPath, k);\n        }\n    });\n    e.exports = j;\n});\n__d(\"NotificationBeeper.react\", [\"Animation\",\"Arbiter\",\"ChannelConstants\",\"NotificationBeeperItem.react\",\"NotificationConstants\",\"NotificationImpressions\",\"NotificationPhotoThumbnail\",\"NotificationSound\",\"NotificationUpdates\",\"NotificationUserActions\",\"React\",\"Style\",\"cx\",\"isEmpty\",\"merge\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ChannelConstants\"), j = b(\"NotificationBeeperItem.react\"), k = b(\"NotificationConstants\"), l = b(\"NotificationImpressions\"), m = b(\"NotificationPhotoThumbnail\"), n = b(\"NotificationSound\"), o = b(\"NotificationUpdates\"), p = b(\"NotificationUserActions\"), q = b(\"React\"), r = b(\"Style\"), s = b(\"cx\"), t = b(\"isEmpty\"), u = b(\"merge\"), v = b(\"setTimeoutAcrossTransitions\"), w = b(\"shield\"), x = 5000, y = 2000, z = \"beeper\", aa = k.PayloadSourceType.LIVE_SEND, ba = k.PayloadSourceType.OTHER_APPLICATION, ca = q.createClass({\n        displayName: \"NotificationBeeper\",\n        getInitialState: function() {\n            return {\n                soundEnabled: this.props.soundEnabled,\n                hovering: false,\n                fading: false,\n                paused: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            };\n        },\n        componentWillMount: function() {\n            var ea = i.getArbiterType(\"notif_sound_pref_changed\"), fa = \"update-notifications\";\n            this.subscriptions = [o.subscribe(fa, function(ga, ha) {\n                if (((((ha.payloadsource === aa)) || ((ha.payloadsource === ba))))) {\n                    var ia = ha.nodes;\n                    if (((ia && ia.length))) {\n                        this._handleBeepChanges(da(ia));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this)),h.subscribe(ea, function(ga, ha) {\n                this.setState({\n                    soundEnabled: ha.obj.enabled\n                });\n            }.bind(this)),];\n            h.inform(\"NotificationBeeper/mounted\", null, h.BEHAVIOR_PERSISTENT);\n        },\n        componentWillUnmount: function() {\n            this.subscriptions.forEach(function(ea) {\n                ea.unsubscribe();\n            });\n            this.subscriptions = null;\n        },\n        _onMouseEnter: function() {\n            if (this.state.paused) {\n                return;\n            }\n        ;\n        ;\n            ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            if (this.state.fading) {\n                this._animation.JSBNG__stop();\n                this._animation = null;\n                r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n            }\n        ;\n        ;\n            var ea = Object.keys(this.state.renderedBeeps);\n            if (this.props.unseenVsUnread) {\n                p.markNotificationsAsSeen(ea);\n            }\n             else p.markNotificationsAsRead(ea);\n        ;\n        ;\n            this.setState({\n                hovering: true,\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: u(this.state.renderedBeeps, this.state.pendingBeeps)\n            });\n        },\n        _onMouseLeave: function() {\n            if (this.state.paused) {\n                return;\n            }\n        ;\n        ;\n            this._waitToHide(y);\n            this.setState({\n                hovering: false\n            });\n        },\n        _onInsertedItem: function(ea) {\n            if (!this.state.hovering) {\n                this._waitToHide();\n            }\n        ;\n        ;\n            if (((this.state.soundEnabled && ea.sound))) {\n                if (!this._notifSound) {\n                    this._notifSound = new n(this.props.soundPath);\n                }\n            ;\n            ;\n                this._notifSound.play(ea.beepID);\n            }\n        ;\n        ;\n            if (this.props.shouldLogImpressions) {\n                l.log([ea.notificationID,], z);\n            }\n        ;\n        ;\n        },\n        _waitToHide: function(ea) {\n            ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            this._hideWait = v(w(this._hide, this), ((ea || x)));\n        },\n        _hide: function() {\n            ((this._animation && this._animation.JSBNG__stop()));\n            this._animation = new g(this.refs.container.getDOMNode()).from(\"opacity\", \"0.96\").to(\"opacity\", \"0\").duration(1500).ondone(this._finishHide).go();\n            this.setState({\n                fading: true\n            });\n        },\n        _finishHide: function() {\n            var ea = this.state.pendingBeeps;\n            this.setState({\n                fading: false,\n                pendingBeeps: {\n                },\n                renderedBeeps: {\n                }\n            });\n            v(this.setState.bind(this, {\n                renderedBeeps: ea\n            }, null));\n            r.set(this.refs.container.getDOMNode(), \"opacity\", \"0.96\");\n        },\n        _handleBeepChanges: function(ea) {\n            var fa = ((this.state.fading ? this.state.pendingBeeps : this.state.renderedBeeps));\n            Object.keys(ea).reverse().forEach(function(ga) {\n                var ha = ea[ga], ia = ha.beepID, ja = ((this.state.renderedBeeps[ga] || {\n                }));\n                if (((ja.beepID != ia))) {\n                    delete fa[ga];\n                    fa[ga] = ha;\n                }\n            ;\n            ;\n            }.bind(this));\n            if (!this.state.paused) {\n                this._waitToHide();\n            }\n        ;\n        ;\n            this.forceUpdate();\n        },\n        _togglePause: function() {\n            if (!this.state.paused) {\n                ((this._animation && this._animation.JSBNG__stop()));\n                ((this._hideWait && JSBNG__clearTimeout(this._hideWait)));\n            }\n             else this._waitToHide();\n        ;\n        ;\n            this.setState({\n                paused: !this.state.paused\n            });\n        },\n        render: function() {\n            var ea = this.state.renderedBeeps, fa = {\n            };\n            Object.keys(ea).reverse().forEach(function(ja) {\n                var ka = ea[ja];\n                fa[ja] = j({\n                    beep: ka,\n                    onInserted: this._onInsertedItem\n                });\n            }, this);\n            var ga = !t(fa), ha = null;\n            if (((ga && this.props.canPause))) {\n                ha = q.DOM.li({\n                    className: \"-cx-PRIVATE-notificationBeeper__pause\",\n                    onClick: this._togglePause\n                }, ((this.state.paused ? \"Continue\" : \"Pause [fb]\")));\n            }\n        ;\n        ;\n            var ia = ((((!ga ? \"hidden_elem\" : \"\")) + ((\" \" + \"-cx-PUBLIC-notificationBeeper__list\"))));\n            return (q.DOM.ul({\n                ref: \"container\",\n                className: ia,\n                \"data-gt\": this.props.tracking,\n                onMouseEnter: this._onMouseEnter,\n                onMouseLeave: this._onMouseLeave\n            }, fa, ha));\n        }\n    });\n    function da(ea) {\n        var fa = {\n        };\n        ea.forEach(function(ga) {\n            var ha = ga.alert_id, ia = ((((ha + \"-\")) + ga.receivedTime)), ja = m.getThumbnail(ga.attachments, ga.attached_story);\n            fa[ha] = {\n                notificationID: ha,\n                beepID: ia,\n                beepRenderer: ga.beepRenderer,\n                actors: ga.actors,\n                icon: ga.icon,\n                link: ga.url,\n                photo: ja,\n                text: ((ga.unaggregatedTitle || ga.title)),\n                timestamp: ga.timestamp,\n                receivedTime: ga.receivedTime,\n                sound: !!ga.sound,\n                tracking: ga.tracking\n            };\n        });\n        return fa;\n    };\n;\n    e.exports = ca;\n});\n__d(\"FbdEventLog\", [\"URI\",\"AsyncSignal\",], function(a, b, c, d, e, f) {\n    var g = b(\"URI\"), h = b(\"AsyncSignal\"), i = {\n        log: function(j, k, l, m) {\n            if (!j) {\n                return;\n            }\n        ;\n        ;\n            var n = g(\"/desktop/eventlog.php\"), o = new h(n.toString(), {\n                JSBNG__event: j,\n                category: ((k || \"unknown\")),\n                payload: ((l || \"\"))\n            });\n            o.setHandler(m).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"DownloadDialog\", [\"JSBNG__Event\",\"Arbiter\",\"Class\",\"DataStore\",\"ModalMask\",\"Overlay\",\"Parent\",\"Style\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"Class\"), j = b(\"DataStore\"), k = b(\"ModalMask\"), l = b(\"Overlay\"), m = b(\"Parent\"), n = b(\"Style\"), o = b(\"copyProperties\"), p = b(\"emptyFunction\");\n    function q() {\n        this.parent.construct(this);\n        return this;\n    };\n;\n    i.extend(q, l);\n    o(q, {\n        POSITIONS: {\n            BOTTOM_LEFT: \"bottom_left\",\n            TOP_LEFT: \"top_left\",\n            IE9_BOTTOM: \"ie9_bottom\"\n        },\n        activeDialogs: {\n        },\n        dismissAll: function() {\n            {\n                var fin287keys = ((window.top.JSBNG_Replay.forInKeys)((this.POSITIONS))), fin287i = (0);\n                var r;\n                for (; (fin287i < fin287keys.length); (fin287i++)) {\n                    ((r) = (fin287keys[fin287i]));\n                    {\n                        this.hideDialog(this.POSITIONS[r]);\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        hideDialog: function(r) {\n            var s = this.activeDialogs[r];\n            ((s && s.hide()));\n            this.activeDialogs[r] = null;\n        }\n    });\n    o(q.prototype, {\n        _cancelHandler: p,\n        _closeHandler: p,\n        _width: null,\n        position: q.POSITIONS.BOTTOM_LEFT,\n        init: function(r, s) {\n            this.parent.init(r);\n            this.position = s;\n            var t = ((j.get(this._root, \"modal\") === \"true\"));\n            q.hideDialog(s);\n            q.activeDialogs[s] = this;\n            g.listen(this._root, \"click\", function(JSBNG__event) {\n                if (m.byClass(JSBNG__event.getTarget(), \"closeButton\")) {\n                    if (((this._cancelHandler() !== false))) {\n                        q.hideDialog(this.position);\n                    }\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.subscribe(\"show\", function() {\n                if (t) {\n                    k.show();\n                }\n            ;\n            ;\n                h.inform(\"layer_shown\", {\n                    type: \"DownloadDialog\"\n                });\n            }.bind(this));\n            this.subscribe(\"hide\", function() {\n                if (t) {\n                    k.hide();\n                }\n            ;\n            ;\n                h.inform(\"layer_hidden\", {\n                    type: \"DownloadDialog\"\n                });\n                this._closeHandler();\n            }.bind(this));\n        },\n        setWidth: function(r) {\n            this._width = Math.floor(r);\n            return this;\n        },\n        updatePosition: function() {\n            if (this._width) {\n                n.set(this._overlay, \"width\", ((this._width + \"px\")));\n            }\n        ;\n        ;\n            return true;\n        },\n        setCancelHandler: function(r) {\n            this._cancelHandler = ((r || p));\n            return this;\n        },\n        setCloseHandler: function(r) {\n            this._closeHandler = ((r || p));\n            return this;\n        }\n    });\n    e.exports = q;\n    a.DownloadDialog = q;\n});\n__d(\"FbdConversionTracking\", [\"AsyncRequest\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"emptyFunction\"), i = {\n        logClick: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/desktop/log_clicks.php\").setData({\n                click_source: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        },\n        logConversion: function(j, k) {\n            if (!k) {\n                k = \"desktop\";\n            }\n        ;\n        ;\n            new g().setURI(\"/ajax/desktop/log_conversions.php\").setData({\n                conversion_action: j,\n                promo: k\n            }).setAllowCrossPageTransition(true).setErrorHandler(h).send();\n        }\n    };\n    e.exports = i;\n});\n__d(\"FbdInstall\", [\"$\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOM\",\"DownloadDialog\",\"FbdConversionTracking\",\"FbdEventLog\",\"FBDesktopDetect\",\"FBDesktopPlugin\",\"MegaphoneHelper\",], function(a, b, c, d, e, f) {\n    var g = b(\"$\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"DownloadDialog\"), l = b(\"FbdConversionTracking\"), m = b(\"FbdEventLog\"), n = b(\"FBDesktopDetect\"), o = b(\"FBDesktopPlugin\"), p = b(\"MegaphoneHelper\"), q = 1000, r = ((300 * q)), s = {\n        cancelSetup: function() {\n            var t = JSON.stringify({\n                ref: this.ref\n            });\n            m.log(\"download_canceled\", \"setup\", t);\n            l.logConversion(\"download_canceled\");\n        },\n        hideMegaphone: function() {\n            if (((this.megaphoneId && this.megaphoneLoc))) {\n                p.hideStory(this.megaphoneId, this.megaphoneLoc, this.elementId, \"\", null);\n            }\n        ;\n        ;\n        },\n        init: function(t, u) {\n            this.downloadUrl = t;\n            this.ref = ((u || \"unknown\"));\n        },\n        initInstallWait: function(t, u, v) {\n            this.megaphoneId = t;\n            this.megaphoneLoc = u;\n            this.elementId = v;\n            this._waitForInstall(r);\n        },\n        promptDownload: function(t) {\n            t = ((t || this.downloadUrl));\n            if (t) {\n                var u = JSON.stringify({\n                    ref: this.ref\n                });\n                m.log(\"download_prompted\", \"setup\", u);\n                l.logConversion(\"download_prompted\");\n                var v = j.create(\"div\", {\n                    src: t,\n                    className: \"hidden_elem\"\n                });\n                j.appendContent(JSBNG__document.body, v);\n            }\n        ;\n        ;\n        },\n        _responseHandler: function(t) {\n            if (t.payload) {\n                this._authToken = t.payload.access_token;\n                this._userId = t.payload.id;\n            }\n        ;\n        ;\n            if (((this._authToken && this._userId))) {\n                this._waitForRunningStart = JSBNG__Date.now();\n                JSBNG__setTimeout(this._waitForRunning.bind(this), q);\n            }\n        ;\n        ;\n        },\n        setupPlugin: function() {\n            new h(\"/ajax/desktop/download\").send();\n            this.promptDownload();\n        },\n        updateSidebarLinkVisibility: function() {\n            if (!n.isPluginInstalled()) {\n                i.show(g(\"sidebar-messenger-install-link\"));\n                i.show(g(\"sidebar-messenger-install-separator\"));\n            }\n        ;\n        ;\n        },\n        _waitForInstall: function(t) {\n            var u = JSON.stringify({\n                ref: this.ref\n            });\n            if (n.isPluginInstalled()) {\n                m.log(\"install_success\", \"setup\", u);\n                l.logConversion(\"install_success\");\n                o.recheck();\n                new h(\"/desktop/fbdesktop2/transfer.php\").setMethod(\"POST\").setHandler(this._responseHandler.bind(this)).send();\n                k.dismissAll();\n                this.hideMegaphone();\n                return;\n            }\n        ;\n        ;\n            if (((t <= 0))) {\n                m.log(\"install_timeout\", \"setup\", u);\n                l.logConversion(\"install_timeout\");\n                k.dismissAll();\n            }\n             else JSBNG__setTimeout(this._waitForInstall.bind(this, ((t - q))), q);\n        ;\n        ;\n        },\n        _waitForRunning: function() {\n            var t = ((JSBNG__Date.now() - this._waitForRunningStart));\n            if (o.isAppRunning()) {\n                o.transferAuthToken(this._authToken, this._userId);\n            }\n             else if (((t < r))) {\n                JSBNG__setTimeout(this._waitForRunning.bind(this), q);\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = s;\n});\n__d(\"legacy:fbdesktop2-install-js\", [\"FbdInstall\",], function(a, b, c, d) {\n    a.FbdInstall = b(\"FbdInstall\");\n}, 3);\n__d(\"legacy:fbdesktop-conversion-tracking\", [\"FbdConversionTracking\",], function(a, b, c, d) {\n    a.FbdConversionTracking = b(\"FbdConversionTracking\");\n}, 3);\n__d(\"SidebarTicker\", [\"Arbiter\",\"ChatSidebar\",\"JSBNG__CSS\",\"DOM\",\"Run\",\"TickerController\",\"$\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatSidebar\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"Run\"), l = b(\"TickerController\"), m = b(\"$\"), n = b(\"copyProperties\");\n    function o() {\n        this._ticker = m(\"pagelet_ticker\");\n        this._initSubscriptions();\n        if (i.hasClass(JSBNG__document.documentElement, \"sidebarMode\")) {\n            this._onSidebarShow();\n        }\n    ;\n    ;\n    };\n;\n    o.hide = function() {\n        k.onAfterLoad(function() {\n            j.remove(m(\"pagelet_ticker\"));\n            j.remove(j.JSBNG__find(JSBNG__document.body, \"div.fbSidebarGripper\"));\n            h.resize();\n        });\n    };\n    n(o.prototype, {\n        _initSubscriptions: function() {\n            this._subscriptions = [g.subscribe(\"sidebar/show\", this._onSidebarShow.bind(this)),];\n        },\n        _onSidebarShow: function() {\n            l.show(this._ticker);\n        }\n    });\n    e.exports = o;\n});\n__d(\"SidebarTickerResizer\", [\"Arbiter\",\"AsyncRequest\",\"ChatSidebar\",\"SimpleDrag\",\"$\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncRequest\"), i = b(\"ChatSidebar\"), j = b(\"SimpleDrag\"), k = b(\"$\"), l = 1e-7;\n    function m(n) {\n        var o = k(\"pagelet_ticker\"), p = o.parentNode, q = this._saveResizedState.bind(this), r, s, t, u = function(x, JSBNG__event) {\n            r = JSBNG__event.clientY;\n            s = o.offsetHeight;\n            t = p.offsetHeight;\n        }, v = function(x, JSBNG__event) {\n            var y = ((s + ((JSBNG__event.clientY - r)))), z = ((100 - ((((((t - y)) / t)) * 100))));\n            z = Math.max(l, Math.min(90, z));\n            o.style.height = ((z + \"%\"));\n            if (((x == \"end\"))) {\n                q(z);\n                g.inform(\"Ticker/resized\");\n            }\n        ;\n        ;\n            i.resize();\n        }, w = new j(n);\n        w.subscribe(\"start\", u);\n        w.subscribe([\"update\",\"end\",], v);\n    };\n;\n    m.prototype._saveResizedState = function(n) {\n        new h(\"/ajax/feed/ticker/resize\").setData({\n            height: ((\"\" + n))\n        }).setMethod(\"POST\").send();\n    };\n    e.exports = m;\n});\n__d(\"NotificationXOut\", [\"Arbiter\",\"JSBNG__Event\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\");\n    function i(m, n) {\n        g.inform(\"notif/negativeCancel\", {\n            id: m\n        });\n        n.kill();\n    };\n;\n    function j(m) {\n        m.prevent();\n    };\n;\n    function k(m, n) {\n        h.listen(m, \"click\", i.curry(n));\n    };\n;\n    function l(m) {\n        h.listen(m, \"click\", j);\n    };\n;\n    e.exports = {\n        setupCancelListener: k,\n        setupNoListener: l\n    };\n});\n__d(\"LiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"copyProperties\"), j = b(\"emptyFunction\"), k = b(\"shield\");\n    function l(m) {\n        this.eventName = m;\n        this.subs = null;\n        this.handler = j;\n        this.shutdownHandler = null;\n        this.registered = false;\n        this.appId = 1;\n    };\n;\n    i(l, {\n        getAppMessageType: function(m, n) {\n            return ((((((\"live_message/\" + m)) + \":\")) + n));\n        },\n        route: function(m) {\n            var n = function(o) {\n                var p = l.getAppMessageType(m.app_id, m.event_name);\n                g.inform(p, o, g.BEHAVIOR_PERSISTENT);\n            };\n            n(m.response);\n        }\n    });\n    i(l.prototype, {\n        setAppId: function(m) {\n            this.appId = m;\n            return this;\n        },\n        setHandler: function(m) {\n            this.handler = m;\n            this._dirty();\n            return this;\n        },\n        setRestartHandler: j,\n        setShutdownHandler: function(m) {\n            this.shutdownHandler = k(m);\n            this._dirty();\n            return this;\n        },\n        _dirty: function() {\n            if (this.registered) {\n                this.unregister();\n                this.register();\n            }\n        ;\n        ;\n        },\n        register: function() {\n            var m = function(o, p) {\n                return this.handler(p);\n            }.bind(this), n = l.getAppMessageType(this.appId, this.eventName);\n            this.subs = {\n            };\n            this.subs.main = g.subscribe(n, m);\n            if (this.shutdownHandler) {\n                this.subs.shut = g.subscribe(h.ON_SHUTDOWN, this.shutdownHandler);\n            }\n        ;\n        ;\n            this.registered = true;\n            return this;\n        },\n        unregister: function() {\n            if (!this.subs) {\n                return this;\n            }\n        ;\n        ;\n            {\n                var fin288keys = ((window.top.JSBNG_Replay.forInKeys)((this.subs))), fin288i = (0);\n                var m;\n                for (; (fin288i < fin288keys.length); (fin288i++)) {\n                    ((m) = (fin288keys[fin288i]));\n                    {\n                        if (this.subs[m]) {\n                            this.subs[m].unsubscribe();\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            this.subs = null;\n            this.registered = false;\n            return this;\n        }\n    });\n    e.exports = l;\n});\n__d(\"initLiveMessageReceiver\", [\"Arbiter\",\"ChannelConstants\",\"LiveMessageReceiver\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"LiveMessageReceiver\");\n    g.subscribe(h.getArbiterType(\"app_msg\"), function(j, k) {\n        i.route(k.obj);\n    });\n});\n__d(\"legacy:CompactTypeaheadRenderer\", [\"CompactTypeaheadRenderer\",], function(a, b, c, d) {\n    if (!a.TypeaheadRenderers) {\n        a.TypeaheadRenderers = {\n        };\n    }\n;\n;\n    a.TypeaheadRenderers.compact = b(\"CompactTypeaheadRenderer\");\n}, 3);");
// 16017
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o58,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yQ/r/mxp6_mu5GrT.js",o59);
// undefined
o58 = null;
// undefined
o59 = null;
// 16023
fpc.call(JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_361[0], o75,undefined);
// undefined
o75 = null;
// 16043
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 16052
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"cmK7/\",]);\n}\n;\n__d(\"GenderConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        UNKNOWN: 0,\n        FEMALE_SINGULAR: 1,\n        MALE_SINGULAR: 2,\n        FEMALE_SINGULAR_GUESS: 3,\n        MALE_SINGULAR_GUESS: 4,\n        MIXED_SINGULAR: 5,\n        MIXED_PLURAL: 5,\n        NEUTER_SINGULAR: 6,\n        UNKNOWN_SINGULAR: 7,\n        FEMALE_PLURAL: 8,\n        MALE_PLURAL: 9,\n        NEUTER_PLURAL: 10,\n        UNKNOWN_PLURAL: 11\n    };\n    e.exports = g;\n});\n__d(\"VideoCallingTour\", [\"Arbiter\",\"ArbiterMixin\",\"Chat\",\"ChatSidebar\",\"ChatVisibility\",\"CSS\",\"DOM\",\"PresencePrivacy\",\"Run\",\"Toggler\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Chat\"), j = b(\"ChatSidebar\"), k = b(\"ChatVisibility\"), l = b(\"CSS\"), m = b(\"DOM\"), n = b(\"PresencePrivacy\"), o = b(\"Run\"), p = b(\"Toggler\"), q = b(\"Vector\"), r = b(\"copyProperties\"), s, t, u, v, w = [], x = function() {\n    \n    };\n    function y() {\n        if (j.isVisible()) {\n            z();\n        }\n         else if (u) {\n            aa();\n        }\n    ;\n    };\n    function z() {\n        s.setContext(t.getBody());\n        ba();\n        s.show();\n        ca();\n    };\n    function aa() {\n        if (!v) {\n            v = p.createInstance(u.getRoot());\n        };\n        var fa = m.scry(u.getRoot(), \"div.fbNubFlyout\")[0];\n        if (fa) {\n            s.setContext(fa);\n            ba();\n            s.show();\n            ca();\n        }\n    ;\n    };\n    function ba() {\n        var fa = q.getElementDimensions(s.getContext()).y;\n        s.setOffsetY((fa * 1125));\n        s.updatePosition();\n    };\n    function ca() {\n        if (u) {\n            w.push(u.subscribe(\"hide\", function() {\n                da();\n                if (!j.isVisible()) {\n                    s.hide();\n                };\n            }), u.subscribe(\"show\", function() {\n                s.show();\n            }), u.subscribe(\"resize\", function() {\n                ba();\n                s.updatePosition();\n            }));\n        };\n        w.push(g.subscribe(\"sidebar/show\", z), g.subscribe(\"sidebar/hide\", aa), g.subscribe(\"sidebar/resized\", ba));\n    };\n    function da() {\n        if (v) {\n            v.setSticky(false);\n            v = null;\n        }\n    ;\n    };\n    function ea() {\n        while (w.length) {\n            w.pop().unsubscribe();;\n        };\n        if (u) {\n            da();\n        };\n        s.hide();\n        l.show(\"fbVideoCallingGetStarted\");\n    };\n    r(x, h, {\n        start: function(fa) {\n            s = fa;\n            l.hide(\"fbVideoCallingGetStarted\");\n            k.goOnline(function() {\n                w.push(n.subscribe(\"privacy-user-presence-changed\", ea));\n                o.onLeave(ea);\n                i.openBuddyList();\n                var ga = null;\n                w.push(j.subscribe(\"sidebar/initialized\", function(ha, ia) {\n                    t = ia;\n                    clearTimeout(ga);\n                    ga = y.defer();\n                }), x.subscribe(\"videocallingtour/end\", ea));\n                w.push(g.subscribe(\"buddylist-nub/initialized\", function(ha, ia) {\n                    u = ia;\n                    clearTimeout(ga);\n                    ga = y.defer();\n                }));\n            });\n            x.inform(\"videocallingtour/start\");\n        }\n    });\n    e.exports = x;\n});\n__d(\"ChatPeopleSuggestionList.react\", [\"ChatSidebarItem.react\",\"fbt\",\"React\",\"ShortProfiles\",\"PresenceStatus\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"fbt\"), i = b(\"React\"), j = b(\"ShortProfiles\"), k = b(\"PresenceStatus\"), l = b(\"cx\"), m = i.createClass({\n        displayName: \"ChatPeopleSuggestionList\",\n        _renderPeopleList: function() {\n            var n = [];\n            this.props.uids.map(function(o) {\n                var p = j.getNow(o);\n                if (p) {\n                    n.push(i.DOM.li(null, g({\n                        isAdded: false,\n                        showEditButton: true,\n                        images: p.thumbSrc,\n                        name: p.name,\n                        status: k.get(o),\n                        onClick: this.props.onClick.curry(o)\n                    })));\n                };\n            }.bind(this));\n            return n;\n        },\n        render: function() {\n            return (i.DOM.div(null, i.DOM.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__header\"\n            }, i.DOM.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__headertext\"\n            }, \"SUGGESTIONS\")), i.DOM.ul({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupslist\"\n            }, this._renderPeopleList())));\n        }\n    });\n    e.exports = m;\n});\n__d(\"Dock\", [\"function-extensions\",\"Event\",\"shield\",\"WebMessengerWidthControl\",\"Arbiter\",\"ArbiterMixin\",\"ChatQuietLinks\",\"CSS\",\"DataStore\",\"DOM\",\"Parent\",\"Style\",\"Toggler\",\"Vector\",\"copyProperties\",\"csx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Event\"), h = b(\"shield\");\n    b(\"WebMessengerWidthControl\");\n    var i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"ChatQuietLinks\"), l = b(\"CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"Toggler\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    function w() {\n    \n    };\n    s(w, j, {\n        MIN_HEIGHT: 140,\n        INITIAL_FLYOUT_HEIGHT_OFFSET: 10,\n        init: function(x) {\n            this.init = u;\n            this.rootEl = x;\n            this.calculateViewportDimensions();\n            this.calculateFlyoutHeightOffset();\n            k.removeEmptyHrefs(this.rootEl);\n            g.listen(x, \"click\", this._onClick.bind(this));\n            g.listen(window, \"resize\", this._onWindowResize.bind(this));\n            q.subscribe([\"show\",\"hide\",], function(y, z) {\n                var aa = z.getActive();\n                if (!n.contains(x, aa)) {\n                    return\n                };\n                if (l.hasClass(aa, \"fbNub\")) {\n                    this.notifyNub(aa, y);\n                    if ((y === \"show\")) {\n                        this._resizeNubFlyout(aa);\n                    };\n                }\n                 else {\n                    var ba = o.byClass(aa, \"fbNubFlyout\");\n                    if (ba) {\n                        l.conditionClass(ba, \"menuOpened\", (y === \"show\"));\n                    };\n                }\n            ;\n            }.bind(this));\n            this.inform(\"init\", {\n            }, i.BEHAVIOR_PERSISTENT);\n        },\n        calculateViewportDimensions: function() {\n            return (this.viewportDimensions = r.getViewportDimensions());\n        },\n        calculateFlyoutHeightOffset: function() {\n            this.flyoutHeightOffset = (this.INITIAL_FLYOUT_HEIGHT_OFFSET + r.getElementDimensions(this.rootEl).y);\n            var x = v(\"blueBar\");\n            if (x) {\n                var y = (p.isFixed(x) ? \"viewport\" : \"document\");\n                this.flyoutHeightOffset += (r.getElementPosition(x, y).y + r.getElementDimensions(x).y);\n            }\n        ;\n        },\n        toggle: function(x) {\n            var y = this._findFlyout(x);\n            if (!y) {\n                return\n            };\n            this.subscribe(\"init\", function() {\n                q.toggle(x);\n            });\n        },\n        show: function(x) {\n            this.subscribe(\"init\", function() {\n                q.show(x);\n            });\n        },\n        showNub: function(x) {\n            l.show(x);\n        },\n        hide: function(x) {\n            this.subscribe(\"init\", function() {\n                var y = q.getInstance(x);\n                (n.contains(x, y.getActive()) && y.hide());\n            });\n        },\n        hideNub: function(x) {\n            l.hide(x);\n            this.hide(x);\n        },\n        setUseMaxHeight: function(x, y) {\n            l.conditionClass(x, \"maxHeight\", (y !== false));\n            this._resizeNubFlyout(x);\n        },\n        _resizeNubFlyout: function(x) {\n            var y = this._findFlyout(x);\n            if ((!y || !((l.hasClass(x, \"openToggler\") || l.hasClass(x, \"opened\"))))) {\n                return\n            };\n            var z = n.find(y, \"div.fbNubFlyoutOuter\"), aa = n.find(z, \"div.fbNubFlyoutInner\"), ba = n.find(aa, \"div.fbNubFlyoutBody\"), ca = ba.scrollTop, da = ba.offsetHeight;\n            p.set(ba, \"height\", \"auto\");\n            var ea = r.getElementDimensions(y), fa = r.getElementDimensions(ba), ga = this.getMaxFlyoutHeight(x);\n            p.set(y, \"max-height\", (ga + \"px\"));\n            p.set(z, \"max-height\", (ga + \"px\"));\n            ea = r.getElementDimensions(y);\n            var ha = r.getElementDimensions(aa), ia = (ha.y - fa.y), ja = (ea.y - ia), ka = parseInt((ba.style.height || ba.clientHeight), 10), la = (ja !== ka);\n            if (((ea.y > ia) && la)) {\n                p.set(ba, \"height\", (ja + \"px\"));\n            };\n            l.removeClass(y, \"swapDirection\");\n            var ma = r.getElementPosition(y).x;\n            l.conditionClass(y, \"swapDirection\", function() {\n                if ((ma < 0)) {\n                    return true\n                };\n                return (((ma + ea.x) > this.viewportDimensions.x));\n            }.bind(this)());\n            if ((la && ((ca + da) >= fa.y))) {\n                ba.scrollTop = ba.scrollHeight;\n            }\n             else ba.scrollTop = ca;\n        ;\n            this.notifyNub(x, \"resize\");\n        },\n        getMaxFlyoutHeight: function(x) {\n            var y = this._findFlyout(x), z = r.getElementPosition(y, \"viewport\"), aa = r.getElementDimensions(y), ba = (Math.max(this.MIN_HEIGHT, (this.viewportDimensions.y - this.flyoutHeightOffset)) - (((this.viewportDimensions.y - z.y) - aa.y)));\n            return Math.max(ba, 0);\n        },\n        resizeAllFlyouts: function() {\n            var x = n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.openToggler\");\n            x = x.concat(n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.opened\"));\n            var y = x.length;\n            while (y--) {\n                this._resizeNubFlyout(x[y]);;\n            };\n        },\n        _onClick: function(event) {\n            var x = event.getTarget(), y = o.byClass(x, \"fbNub\");\n            if (y) {\n                if (o.byClass(x, \"fbNubFlyoutTitlebar\")) {\n                    var z = o.byTag(x, \"a\"), aa = ((x.nodeName == \"INPUT\") && (x.getAttribute(\"type\") == \"submit\"));\n                    if ((!z && !aa)) {\n                        this.hide(y);\n                        return false;\n                    }\n                ;\n                }\n            ;\n                this.notifyNub(y, \"click\");\n            }\n        ;\n        },\n        _onWindowResize: function(event) {\n            this.calculateViewportDimensions();\n            this.resizeAllFlyouts();\n        },\n        _findFlyout: function(x) {\n            return (l.hasClass(x, \"fbNubFlyout\") ? x : (n.scry(x, \"div.fbNubFlyout\")[0] || null));\n        },\n        registerNubController: function(x, y) {\n            m.set(x, \"dock:nub:controller\", y);\n            y.subscribe(\"nub/button/content-changed\", h(this.inform, this, \"resize\", x));\n            y.subscribe(\"nub/flyout/content-changed\", h(this._resizeNubFlyout, this, x));\n        },\n        unregisterNubController: function(x) {\n            m.remove(x, \"dock:nub:controller\");\n        },\n        notifyNub: function(x, y, z) {\n            var aa = m.get(x, \"dock:nub:controller\");\n            (aa && aa.inform(y, z));\n        }\n    });\n    e.exports = (a.Dock || w);\n});\n__d(\"NubController\", [\"ArbiterMixin\",\"Dock\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"Dock\"), i = b(\"copyProperties\");\n    function j() {\n    \n    };\n    i(j.prototype, g, {\n        init: function(k) {\n            this.el = k;\n            h.registerNubController(k, this);\n            return this;\n        },\n        buttonContentChanged: function() {\n            this.inform(\"nub/button/content-changed\");\n        },\n        flyoutContentChanged: function() {\n            this.inform(\"nub/flyout/content-changed\");\n        },\n        hide: function() {\n            h.hide(this.el);\n        },\n        show: function() {\n            h.show(this.el);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatApp\", [\"CSS\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"JSLogger\"), i = false, j = false, k = false, l = null, m = {\n        init: function(n, o, p) {\n            if (l) {\n                h.create(\"chat_app\").error(\"repeated_init\");\n                return;\n            }\n        ;\n            l = n;\n            d([\"TabsViewport\",\"ChatTabController\",\"ChatTabViewCoordinator\",\"MercuryServerRequests\",\"MercuryChannelHandler\",\"MercuryStateCheck\",], function(q, r, s, t, u, v) {\n                t.get().handleUpdate(p);\n                this.tabsViewport = new q(o);\n                this.tabController = new r(this.tabsViewport);\n                this.tabViewCoordinator = new s(o, this.tabsViewport);\n                i = j = true;\n            }.bind(this));\n        },\n        hide: function() {\n            if ((!i || k)) {\n                return\n            };\n            g.hide(l);\n            k = true;\n        },\n        unhide: function() {\n            if (i) {\n                if (k) {\n                    g.show(l);\n                    this.tabsViewport.checkWidth();\n                    d([\"Dock\",], function(n) {\n                        n.resizeAllFlyouts();\n                    });\n                    k = false;\n                }\n            ;\n            }\n             else if (!j) {\n                d([\"UIPagelet\",], function(n) {\n                    n.loadFromEndpoint(\"ChatTabsPagelet\", \"ChatTabsPagelet\");\n                    n.loadFromEndpoint(\"BuddylistPagelet\", \"BuddylistPagelet\");\n                });\n                j = true;\n            }\n            \n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"DataViewPolyfill\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i, j, k) {\n        if ((j === undefined)) {\n            this._ba = new Uint8Array(i);\n        }\n         else if ((k === undefined)) {\n            this._ba = new Uint8Array(i, j);\n        }\n         else this._ba = new Uint8Array(i, j, k);\n        \n    ;\n        this.byteLength = this._ba.byteLength;\n    };\n    g(h, {\n        isSupported: function() {\n            return !!a.Uint8Array;\n        }\n    });\n    g(h.prototype, {\n        getUint8: function(i) {\n            if ((i >= this._ba.length)) {\n                throw new Error(\"Trying to read beyond bounds of DataViewPolyfill\")\n            };\n            return this._ba[i];\n        },\n        getUint16: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8((i + 1));\n            return (j ? (((l * 256)) + k) : (((k * 256)) + l));\n        },\n        getUint32: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8((i + 1)), m = this.getUint8((i + 2)), n = this.getUint8((i + 3));\n            return (j ? (((((((((n * 256) + m)) * 256) + l)) * 256)) + k) : (((((((((k * 256) + l)) * 256) + m)) * 256)) + n));\n        }\n    });\n    e.exports = h;\n});\n__d(\"getImageSize\", [\"DataViewPolyfill\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataViewPolyfill\"), h = (a.DataView || g);\n    function i(m) {\n        return {\n            width: m.getUint16(6, true),\n            height: m.getUint16(8, true)\n        };\n    };\n    function j(m) {\n        return {\n            width: m.getUint32(16, false),\n            height: m.getUint32(20, false)\n        };\n    };\n    function k(m) {\n        var n = m.byteLength, o = 2;\n        while ((o < n)) {\n            var p = m.getUint16(o, false);\n            o += 2;\n            if (((p == 65472) || (p == 65474))) {\n                return {\n                    width: m.getUint16((o + 5), false),\n                    height: m.getUint16((o + 3), false)\n                };\n            }\n             else o += m.getUint16(o, false);\n        ;\n        };\n        return null;\n    };\n    function l(m) {\n        var n = new h(m);\n        if (((n.getUint8(0) == 255) && (n.getUint8(1) == 216))) {\n            return k(n)\n        };\n        if ((((n.getUint8(0) == 71) && (n.getUint8(1) == 73)) && (n.getUint8(2) == 70))) {\n            return i(n)\n        };\n        if (((((n.getUint8(0) == 137) && (n.getUint8(1) == 80)) && (n.getUint8(2) == 78)) && (n.getUint8(3) == 71))) {\n            return j(n)\n        };\n        return null;\n    };\n    e.exports = l;\n    l.gif = i;\n    l.png = j;\n    l.jpeg = k;\n});\n__d(\"ChatAutoSendPhotoUploader\", [\"ArbiterMixin\",\"DOM\",\"Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachmentType\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getImageSize\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"FileForm\"), k = b(\"FileFormResetOnSubmit\"), l = b(\"FileInput\"), m = b(\"FormSubmitOnChange\"), n = b(\"MercuryAttachmentType\"), o = b(\"SubscriptionsHandler\"), p = b(\"copyProperties\"), q = b(\"csx\"), r = b(\"getImageSize\"), s = b(\"removeFromArray\"), t = b(\"shield\"), u = 0;\n    function v(w, x, y) {\n        this._idElem = y;\n        this._input = x;\n        this._subscriptionsHandler = new o();\n        this._uploadBatches = [];\n        var z = new j(w, [m,k,]), aa = h.find(w, \".-cx-PRIVATE-mercuryFileUploader__root\"), ba = h.find(aa, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new l(aa, ba, x);\n        this._subscriptionsHandler.addSubscriptions(z.subscribe(\"submit\", this._onFileSubmit.bind(this)), z.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), z.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), i.listen(ba, \"click\", t(this.inform, this, \"open\")));\n    };\n    p(v.prototype, g, {\n        isUploading: function() {\n            return (this._uploadBatches.length > 0);\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n        },\n        _getPreviewAttachment: function(w) {\n            var x = {\n                attach_type: n.PHOTO,\n                preview_uploading: true\n            };\n            if (w) {\n                x.preview_width = w.width;\n                x.preview_height = w.height;\n            }\n        ;\n            return x;\n        },\n        _onFileSubmit: function() {\n            u += 1;\n            var w = (\"upload_\" + u);\n            this._idElem.value = w;\n            this._uploadBatches.push(w);\n            if (((((typeof FileReader !== \"undefined\") && FileReader.prototype.readAsArrayBuffer) && this._input.files) && (this._input.files.length === 1))) {\n                var x = new FileReader();\n                x.onload = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        preview_attachments: [this._getPreviewAttachment(r(x.result)),]\n                    });\n                }.bind(this);\n                x.onerror = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        preview_attachments: [this._getPreviewAttachment(null),]\n                    });\n                }.bind(this);\n                x.readAsArrayBuffer(this._input.files[0]);\n            }\n             else {\n                var y = 1;\n                if (this._input.files) {\n                    y = this._input.files.length;\n                };\n                var z = [];\n                for (var aa = 0; (aa < y); ++aa) {\n                    z.push(this._getPreviewAttachment(null));;\n                };\n                this.inform(\"submit\", {\n                    upload_id: w,\n                    preview_attachments: z\n                });\n            }\n        ;\n        },\n        _onFileUploadSuccess: function(event, w) {\n            var x = w.response.getPayload(), y = x.uploadID;\n            s(this._uploadBatches, y);\n            var z = [];\n            x.metadata.forEach(function(aa) {\n                z.push(aa.image_id);\n            });\n            this.inform(\"all-uploads-completed\", {\n                upload_id: x.uploadID,\n                image_ids: z\n            });\n        },\n        _onFileUploadFailure: function(event, w) {\n            var x = this._uploadBatches[(this._uploadBatches.length - 1)];\n            s(this._uploadBatches, x);\n            this.inform(\"all-uploads-failed\", {\n                upload_id: x\n            });\n        }\n    });\n    e.exports = v;\n});\n__d(\"VideoCallPromo\", [\"ArbiterMixin\",\"AsyncRequest\",\"ChatConfig\",\"ChatVisibility\",\"LegacyContextualDialog\",\"CSS\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"LegacyContextualDialog\"), l = b(\"CSS\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"VideoCallCore\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\");\n    function s() {\n        this._dialog = null;\n    };\n    function t(v) {\n        if (!((p.isSupported() && i.get(\"video.show_promo\")))) {\n            return false\n        };\n        var w = n.getCanonicalUserInThread(v);\n        if (!w) {\n            return false\n        };\n        return (j.isOnline() && p.availableForCall(w));\n    };\n    function u(v) {\n        new h().setURI(\"/ajax/chat/video/log_promo.php\").setData({\n            viewedUserID: v\n        }).setAllowCrossPageTransition(true).setErrorHandler(r).send();\n    };\n    q(s.prototype, g);\n    q(s.prototype, {\n        render: function(v, w) {\n            var x = t(w);\n            if (!x) {\n                return\n            };\n            var y = n.getCanonicalUserInThread(w);\n            m.get((\"fbid:\" + y), function(z) {\n                if (!z.call_promo) {\n                    return\n                };\n                var aa = o[\":fb:mercury:call:promo\"].build();\n                this._dialog = new k();\n                this._dialog.init(aa.getRoot()).setWidth(250).setAlignH(\"center\").setContext(v).show();\n                l.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n                l.addClass(v, \"video_call_promo\");\n                u(n.getCanonicalUserInThread(w));\n                this.inform(\"chat/dialog-rendered\", {\n                    dialog: this,\n                    thread_id: w\n                });\n            }.bind(this));\n        },\n        updatePosition: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.updatePosition();\n            };\n        },\n        hide: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"VideoCallTourDialog\", [\"ArbiterMixin\",\"LegacyContextualDialog\",\"CSS\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"VideoCallingTour\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LegacyContextualDialog\"), i = b(\"CSS\"), j = b(\"MercuryThreads\").get(), k = b(\"ChatTabTemplates\"), l = b(\"VideoCallCore\"), m = b(\"VideoCallingTour\"), n = b(\"copyProperties\");\n    function o() {\n        this._dialog = null;\n    };\n    n(o.prototype, g);\n    n(o.prototype, {\n        render: function(p, q) {\n            var r = j.getCanonicalUserInThread(q);\n            if ((!r || !l.availableForCall(r))) {\n                return\n            };\n            var s = k[\":fb:mercury:call:tour\"].build();\n            this._dialog = new h();\n            this._dialog.init(s.getRoot()).setWidth(250).setAlignH(\"center\").setContext(p).show();\n            i.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n            i.addClass(p, \"video_call_tour\");\n            this.inform(\"chat/dialog-rendered\", {\n                dialog: this,\n                thread_id: q\n            });\n            m.inform(\"videocallingtour/end\");\n        },\n        updatePosition: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.updatePosition();\n            };\n        },\n        hide: function() {\n            if ((this._dialog && this._dialog.isShown())) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatContextualDialogController\", [\"Event\",\"ArbiterMixin\",\"ChatTabModel\",\"VideoCallingTour\",\"VideoCallPromo\",\"VideoCallTourDialog\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"VideoCallingTour\"), k = b(\"VideoCallPromo\"), l = b(\"VideoCallTourDialog\"), m = b(\"copyProperties\"), n = b(\"setTimeoutAcrossTransitions\"), o = 60000, p = false, q = false, r = function(y, z) {\n        this._videoCallPromo = new k();\n        this._videoCallTour = new l();\n        this._threadID = y;\n        this._tabMainElement = z;\n        this._openDialog = null;\n        this._subscriptionTokens = [];\n        this._scrollListener = null;\n        this._timeout = null;\n    };\n    function s(y, event, z) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        };\n    };\n    function t(y) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        };\n    };\n    function u(y) {\n        if (y._openDialog) {\n            y._openDialog.hide();\n            y._openDialog = null;\n        }\n    ;\n        if (y._timeout) {\n            clearTimeout(y._timeout);\n            y._timeout = null;\n        }\n    ;\n        while (y._subscriptionTokens.length) {\n            y._subscriptionTokens.pop().unsubscribe();;\n        };\n        if (y._scrollListener) {\n            y._scrollListener.remove();\n            y._scrollListener = null;\n        }\n    ;\n    };\n    function v(y, event, z) {\n        if ((z.thread_id === y._threadID)) {\n            y._openDialog = z.dialog;\n            p = true;\n            x(y);\n            y._timeout = n(y.destroy.bind(y, y._threadID), o);\n            y._scrollListener = g.listen(window, \"scroll\", t.curry(y));\n        }\n    ;\n    };\n    function w(y, z) {\n        if (!y._openDialog) {\n            y._subscriptionTokens.push(z.subscribe(\"chat/dialog-rendered\", v.curry(y)));\n            z.render(y._tabMainElement, y._threadID);\n        }\n    ;\n    };\n    function x(y) {\n        y._subscriptionTokens.push(i.subscribe(\"chat/tabs-changed\", s.curry(y)), r.subscribe(\"dialog/close-all\", u.curry(y)));\n    };\n    m(r, h);\n    m(r.prototype, {\n        destroy: function() {\n            u(this);\n        },\n        tabFocused: function() {\n            if (q) {\n                w(this, this._videoCallTour);\n                return;\n            }\n        ;\n            if (!p) {\n                w(this, this._videoCallPromo);\n            };\n        },\n        tabNotActive: function() {\n            u(this);\n        },\n        hideVideoCallouts: function() {\n            u(this);\n        }\n    });\n    j.subscribe(\"videocallingtour/start\", function() {\n        q = true;\n        r.inform(\"dialog/close-all\");\n    });\n    j.subscribe(\"videocallingtour/end\", function() {\n        q = false;\n    });\n    e.exports = r;\n});\n__d(\"ChatPrivacyActionController\", [\"ChatVisibility\",\"JSLogger\",\"PresencePrivacy\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatVisibility\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = b(\"copyProperties\"), k = function(l, m) {\n        this._userID = l;\n        this._logger = h.create(\"blackbird\");\n        this._getState = function() {\n            if (g.isOnline()) {\n                return (i.allows(this._userID) ? k.NORMAL : k.BLOCKED)\n            };\n            return k.OFFLINE;\n        };\n        this._togglePrivacy = function() {\n            var n = this._getState();\n            switch (this._getState()) {\n              case k.OFFLINE:\n                if (g.isOnline()) {\n                    this._logger.error(\"tabs_already_online\");\n                    break;\n                }\n            ;\n                this._logger.log(\"tabs_go_online\", {\n                    tab_id: this._userID\n                });\n                g.goOnline(function() {\n                    if (!i.allows(this._userID)) {\n                        if ((this._getState() !== k.BLOCKED)) {\n                            this._logger.error(\"privacy_action_controller_blocked_inconsistency\");\n                        };\n                        this._togglePrivacy();\n                    }\n                ;\n                }.bind(this));\n                break;\n              case k.BLOCKED:\n                i.allow(this._userID);\n                this._logger.log(\"tabs_unblock\", {\n                    tab_id: this._userID\n                });\n                break;\n              case k.NORMAL:\n                i.disallow(this._userID);\n                this._logger.log(\"tabs_block\", {\n                    tab_id: this._userID\n                });\n                break;\n            };\n        };\n        (function() {\n            var n = function() {\n                (m && m(this._getState()));\n            }.bind(this);\n            n();\n            this._subscribeToken = i.subscribe(\"privacy-changed\", n);\n        }.bind(this)).defer();\n    };\n    k.OFFLINE = \"offline\";\n    k.BLOCKED = \"blocked\";\n    k.NORMAL = \"normal\";\n    j(k.prototype, {\n        togglePrivacy: function() {\n            this._logger.log(\"gear_menu_toggle_privacy\", {\n                tab_id: this._userID\n            });\n            this._togglePrivacy();\n        },\n        destroy: function() {\n            i.unsubscribe(this._subscribeToken);\n        }\n    });\n    e.exports = k;\n});\n__d(\"MercuryTypingIndicator\", [\"Animation\",\"CSS\",\"DOM\",\"MercuryTypingReceiver\",\"MercuryParticipants\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Tooltip\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"MercuryTypingReceiver\"), k = b(\"MercuryParticipants\"), l = b(\"Style\"), m = b(\"ChatTabTemplates\"), n = b(\"MercuryThreadInformer\").get(), o = b(\"Tooltip\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\"), s = [];\n    n.subscribe(\"messages-received\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            (y && x.receivedMessages(y));\n        });\n    });\n    j.subscribe(\"state-changed\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            (y && x._handleStateChanged(y));\n        });\n    });\n    function t(v) {\n        var w = m[\":fb:chat:conversation:message-group\"].build(), x = m[\":fb:mercury:typing-indicator:typing\"].build();\n        h.addClass(w.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\");\n        var y = w.getNode(\"profileLink\");\n        o.set(y, v.name, \"left\");\n        y.href = v.href;\n        w.setNodeContent(\"profileName\", v.name);\n        w.setNodeProperty(\"profilePhoto\", \"src\", v.image_src);\n        var z = r._(\"{name} is typing...\", {\n            name: v.short_name\n        });\n        o.set(x.getRoot(), z, \"above\");\n        i.appendContent(w.getNode(\"messages\"), x.getRoot());\n        return w;\n    };\n    function u(v, w, x) {\n        this._animations = {\n        };\n        this._activeUsers = {\n        };\n        this._typingIndicator = w;\n        this._messagesView = x;\n        this._threadID = v;\n        this._subscription = j.subscribe(\"state-changed\", function(y, z) {\n            var aa = z[this._threadID];\n            (aa && this._handleStateChanged(aa));\n        }.bind(this));\n        s.push(this);\n    };\n    p(u.prototype, {\n        destroy: function() {\n            Object.keys(this._activeUsers).forEach(this._removeUserBubble.bind(this));\n            this._controller.destroy();\n            s.remove(this);\n        },\n        receivedMessages: function(v) {\n            v.forEach(function(w) {\n                if (!k.isAuthor(w.author)) {\n                    this._removeUserBubble(w.author);\n                };\n            }.bind(this));\n        },\n        _handleStateChanged: function(v) {\n            for (var w in this._activeUsers) {\n                if ((v.indexOf(w) === -1)) {\n                    this._slideOutUserBubble(w);\n                    delete this._activeUsers[w];\n                }\n            ;\n            };\n            if (v.length) {\n                k.getMulti(v, function(x) {\n                    var y = this._messagesView.isScrolledToBottom(), z = {\n                    };\n                    for (var aa in x) {\n                        var ba = this._activeUsers[aa];\n                        z[aa] = (ba || t(x[aa]).getRoot());\n                        if (!ba) {\n                            i.appendContent(this._typingIndicator, z[aa]);\n                        };\n                    };\n                    var ca = (Object.keys(z).length > 0);\n                    (y && this._messagesView.scrollToBottom(ca));\n                    this._activeUsers = z;\n                }.bind(this));\n            };\n        },\n        _removeUserBubble: function(v, w) {\n            var x = this._getCurrentAnimation(v, w);\n            if (x) {\n                x.animation.stop();\n                i.remove(x.elem);\n                delete this._animations[v];\n            }\n        ;\n            if ((v in this._activeUsers)) {\n                i.remove(this._activeUsers[v]);\n                delete this._activeUsers[v];\n            }\n        ;\n            (w && i.remove(w));\n        },\n        _slideOutUserBubble: function(v) {\n            var w = this._activeUsers[v];\n            if (this._getCurrentAnimation(v, w)) {\n                return;\n            }\n             else if (w) {\n                l.set(w, \"overflow\", \"hidden\");\n                var x = (new g(w)).from(\"opacity\", 1).from(\"height\", w.offsetHeight).to(\"height\", 0).to(\"opacity\", 0).ease(g.ease.end).duration(250).ondone(this._removeUserBubble.bind(this, v, w)).go();\n                this._animations[v] = {\n                    animation: x,\n                    elem: w\n                };\n            }\n            \n        ;\n        },\n        _getCurrentAnimation: function(v, w) {\n            if ((this._animations[v] && ((!w || (this._animations[v].elem === w))))) {\n                return this._animations[v]\n            };\n        }\n    });\n    e.exports = u;\n});\n__d(\"ChatTabMessagesView\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"MercuryAttachment\",\"MercuryAttachmentRenderer\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"createArrayFrom\",\"CSS\",\"DOM\",\"Env\",\"Event\",\"JoinableConversationMessageFilter\",\"LiveTimer\",\"MercuryActionTypeConstants\",\"MercuryAPIArgsSource\",\"MercuryLastMessageIndicator\",\"MercuryLogMessageType\",\"MercurySourceType\",\"shield\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"MercuryThreadlistConstants\",\"MercuryTypingIndicator\",\"MercuryMessageRenderer\",\"Parent\",\"MercuryParticipants\",\"React\",\"ServerTime\",\"MercuryStatusTemplates\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Timestamp.react\",\"Tooltip\",\"UserAgent\",\"VideoCallCore\",\"copyProperties\",\"csx\",\"cx\",\"extendArray\",\"formatDate\",\"isRTL\",\"removeFromArray\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"MercuryAttachment\"), l = b(\"MercuryAttachmentRenderer\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"createArrayFrom\"), q = b(\"CSS\"), r = b(\"DOM\"), s = b(\"Env\"), t = b(\"Event\"), u = b(\"JoinableConversationMessageFilter\"), v = b(\"LiveTimer\"), w = b(\"MercuryActionTypeConstants\"), x = b(\"MercuryAPIArgsSource\"), y = b(\"MercuryLastMessageIndicator\"), z = b(\"MercuryLogMessageType\"), aa = b(\"MercurySourceType\"), ba = b(\"shield\"), ca = b(\"MercuryMessages\").get(), da = b(\"MercuryServerRequests\").get(), ea = b(\"MercuryThreadMetadataRawRenderer\"), fa = b(\"MercuryThreadMetadataRenderer\").get(), ga = b(\"MercuryThreads\").get(), ha = b(\"MercuryThreadlistConstants\"), ia = b(\"MercuryTypingIndicator\"), ja = b(\"MercuryMessageRenderer\"), ka = b(\"Parent\"), la = b(\"MercuryParticipants\"), ma = b(\"React\"), na = b(\"ServerTime\"), oa = b(\"MercuryStatusTemplates\"), pa = b(\"Style\"), qa = b(\"SubscriptionsHandler\"), ra = b(\"ChatTabTemplates\"), sa = b(\"MercuryThreadInformer\").get(), ta = b(\"Timestamp.react\"), ua = b(\"Tooltip\"), va = b(\"UserAgent\"), wa = b(\"VideoCallCore\"), xa = b(\"copyProperties\"), ya = b(\"csx\"), za = b(\"cx\"), ab = b(\"extendArray\"), bb = b(\"formatDate\"), cb = b(\"isRTL\"), db = b(\"removeFromArray\"), eb = b(\"throttle\"), fb = b(\"tx\"), gb, hb = 34, ib = ((1000 * 60) * 60), jb = 70, kb = null, lb = 20;\n    function mb(wb) {\n        return bb(new Date(wb), (n.get(\"24h_times\") ? \"H:i\" : \"g:ia\"));\n    };\n    function nb(wb) {\n        var xb = ra[\":fb:chat:conversation:message-group\"].build(), yb = xb.getNode(\"profileLink\"), zb = n.get(\"chat_tab_bubbles\"), ac = la.isAuthor(wb.author), bc = da.tokenizeThreadID(wb.thread_id), cc = (bc.type !== \"user\"), dc = (!ac || !zb);\n        if (!zb) {\n            xb.setNodeContent(\"timestamp\", mb(wb.timestamp));\n        };\n        q.conditionClass(xb.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\", (!ac && zb));\n        q.conditionClass(xb.getRoot(), \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\", ((cc && !ac) && zb));\n        q.conditionShow(yb, dc);\n        la.get(wb.author, function(ec) {\n            if (dc) {\n                yb.href = ec.href;\n                var fc = (ac ? \"You\" : ec.name);\n                if ((!ac && zb)) {\n                    fc = g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__tooltipcontainer\"\n                    }, g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__timestamptooltip\"\n                    }, mb(wb.timestamp)), ec.name);\n                };\n                ua.set(yb, fc, \"left\");\n                if (((!ac && zb) && cc)) {\n                    xb.setNodeContent(\"profileName\", ec.name);\n                };\n                xb.setNodeProperty(\"profilePhoto\", \"src\", ec.image_src);\n            }\n        ;\n        });\n        return xb;\n    };\n    function ob(wb) {\n        var xb = ra[\":fb:chat:conversation:message:event\"].build(), yb = n.get(\"chat_tab_bubbles\"), zb = mb(wb.timestamp);\n        if (yb) {\n            xb.getRoot().setAttribute(\"title\", zb);\n        }\n         else xb.setNodeContent(\"timestamp\", zb);\n    ;\n        ja.renderLogMessage(xb.getNode(\"icon\"), xb.getNode(\"message\"), xb.getNode(\"attachment\"), wb);\n        var ac = qb(wb);\n        if (ac) {\n            r.appendContent(xb.getNode(\"message\"), ac);\n        };\n        return xb.getRoot();\n    };\n    function pb(wb, xb) {\n        if (!n.get(\"chat_tab_bubbles\")) {\n            return\n        };\n        if ((kb === null)) {\n            var yb = xb.childNodes[0];\n            pa.set(xb, \"overflow\", \"scroll\");\n            kb = (yb.clientWidth - jb);\n            pa.set(xb, \"overflow\", \"\");\n        }\n    ;\n        if (!q.hasClass(wb, \"-cx-PRIVATE-fbChatMessage__root\")) {\n            var zb = r.scry(wb, \".-cx-PRIVATE-fbChatMessage__root\");\n            if ((zb.length === 1)) {\n                wb = zb[0];\n            }\n             else return\n        ;\n        }\n    ;\n        pa.set(wb, \"max-width\", (kb + \"px\"));\n        var ac, bc, cc = wb.firstChild;\n        if (((wb.childNodes.length === 1) && cc.getAttribute(\"data-measureme\"))) {\n            ac = cc.getClientRects();\n            var dc = cc.offsetHeight;\n            if (((ac && (ac.length > 1)) && (ac[0].height < dc))) {\n                bc = true;\n                if (!gb) {\n                    r.remove(cc);\n                    gb = wb.offsetWidth;\n                    r.appendContent(wb, cc);\n                }\n            ;\n                var ec = cc.offsetWidth, fc = ((wb.offsetWidth - ec) - gb);\n                if ((fc > 0)) {\n                    pa.set(wb, \"max-width\", (ec + \"px\"));\n                };\n            }\n        ;\n        }\n    ;\n        var gc = ka.byClass(wb, \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\");\n        if (gc) {\n            q.conditionClass(gc, \"-cx-PRIVATE-fbChatMessageGroup__onelineunderprofilename\", (ac ? !bc : (wb.offsetHeight < hb)));\n        };\n    };\n    function qb(wb) {\n        var xb, yb;\n        if ((wb.log_message_type == z.VIDEO_CALL)) {\n            if ((wb.log_message_data.event_name == \"install_canceled\")) {\n                xb = r.tx._(\"Retry setup and call back.\");\n                yb = \"callback_cancelinstall_link\";\n                return rb(xb, wb.thread_id, wb.log_message_data.to, yb);\n            }\n             else if (((!wb.log_message_data.event_name && (wb.log_message_data.callee == la.user)) && !wb.log_message_data.answered)) {\n                xb = r.tx._(\"Call Back\");\n                yb = \"callback_link\";\n                return rb(xb, wb.thread_id, wb.log_message_data.caller.split(\":\")[1], yb);\n            }\n            \n        \n        };\n        return null;\n    };\n    function rb(wb, xb, yb, zb) {\n        if (wa.isSupported()) {\n            var ac = (!o.isOnline() || !wa.availableForCall(yb)), bc = r.create(\"a\", {\n                href: \"#\",\n                className: \"callBackLink\"\n            }, wb);\n            if (ac) {\n                q.hide(bc);\n            };\n            bc.setAttribute(\"data-gt\", JSON.stringify({\n                videochat: \"clicked_callback_link\"\n            }));\n            t.listen(bc, \"click\", function() {\n                ub.inform(\"video-call-clicked\", {\n                    userID: yb,\n                    threadID: xb,\n                    clickSource: zb\n                });\n            });\n            return bc;\n        }\n    ;\n        return null;\n    };\n    function sb(wb) {\n        var xb = ra[\":fb:mercury:chat:message:forward\"].build(), yb = xb.getNode(\"forwardText\");\n        if (yb) {\n            q.hide(xb.getRoot());\n            fa.renderTitanLink(wb.thread_id, xb.getNode(\"forwardLink\"), q.show.bind(q, xb.getRoot()));\n            if ((wb.forward_count > 1)) {\n                r.appendContent(yb, fb._(\"{count} forwarded messages\", {\n                    count: wb.forward_count\n                }));\n            }\n             else r.appendContent(yb, \"1 forwarded message\");\n        ;\n        }\n    ;\n        return xb.getRoot();\n    };\n    var tb = [];\n    function ub(wb, xb, yb, zb, ac, bc, cc) {\n        this.loadingIcon = ac;\n        this.threadID = wb;\n        this.sheetController = xb;\n        this.scrollContainer = yb;\n        this.conversationElem = zb;\n        this.messageElements = {\n        };\n        this.messageGroup = null;\n        this.prevMessage = null;\n        v.restart((na.get() / 1000));\n        this._fetchMultiplier = 1;\n        this._oldestMessageDisplayedTimestamp = null;\n        this._loadingMoreMessages = false;\n        this._currentMessageCount = 0;\n        this._hasReachedClearedMessages = false;\n        var dc = ha.MESSAGE_TIMESTAMP_THRESHOLD;\n        this._oldestMessageDisplayedTimestamp = (Date.now() - dc);\n        tb.push(this);\n        function ec() {\n            ub.inform(\"interaction-with-tab\", wb);\n        };\n        this._subscriptions = new qa();\n        this._subscriptions.addSubscriptions(i.subscribe(\"overflow-applied-to-body\", this.scrollToBottom.bind(this)), t.listen(this.scrollContainer, \"mousedown\", ec));\n        if (va.firefox()) {\n            var fc = (((\"WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\");\n            this.scrollContainer.addEventListener(fc, ec, false);\n        }\n         else this._subscriptions.addSubscriptions(t.listen(this.scrollContainer, \"mousewheel\", ec));\n    ;\n        this._subscriptions.addSubscriptions(t.listen(this.scrollContainer, \"scroll\", eb(this.scrolling, 50, this)));\n        var gc = n.get(\"chat_tab_bubbles\");\n        this.lastMessageIndicator = new y(this.threadID, bc, gc, this);\n        if (gc) {\n            this.typingIndicator = new ia(this.threadID, cc, this);\n        };\n        ca.getThreadMessagesRange(this.threadID, 0, ha.RECENT_MESSAGES_LIMIT, this._updateTimestamp.bind(this));\n        this.rerender();\n    };\n    xa(ub, j);\n    xa(ub.prototype, {\n        scrolling: function() {\n            if ((((!this._loadingMoreMessages && this.isScrolledNearTop()) && !this.isScrolledToBottom()) && !this._hasReachedClearedMessages)) {\n                this.loadMoreMessages();\n            };\n            if (!this._newMessagesSheetOpened) {\n                return\n            };\n            if (this.isScrolledToBottom()) {\n                this.sheetController.closeNewMessagesSheet();\n                this._newMessagesSheetOpened = false;\n            }\n        ;\n        },\n        destroy: function() {\n            r.empty(this.conversationElem);\n            this._subscriptions.release();\n            db(tb, this);\n            (this.lastMessageIndicator && this.lastMessageIndicator.destroy());\n            this.destroyed = true;\n        },\n        _appendMessage: function(wb) {\n            if ((wb == this.prevMessage)) {\n                return\n            };\n            var xb = ha, yb = xb.GROUPING_THRESHOLD, zb = ((wb.action_type == w.LOG_MESSAGE) && (wb.log_message_type == z.SERVER_ERROR));\n            if (wb.is_cleared) {\n                this._hasReachedClearedMessages = true;\n                return;\n            }\n        ;\n            var ac;\n            if ((this.prevMessage !== null)) {\n                ac = (wb.timestamp - this.prevMessage.timestamp);\n            }\n             else ac = Infinity;\n        ;\n            if ((!zb && ((ac >= ib)))) {\n                var bc = Math.round((wb.timestamp / 1000)), cc = wb.timestamp_datetime, dc = ra[\":fb:chat:conversation:date-break\"].build();\n                ma.renderComponent(ta({\n                    time: bc,\n                    verbose: cc,\n                    text: cc\n                }), dc.getNode(\"date\"));\n                r.appendContent(this.conversationElem, dc.getRoot());\n                this.messageGroup = null;\n            }\n        ;\n            if ((wb.action_type == w.LOG_MESSAGE)) {\n                r.appendContent(this.conversationElem, ob(wb));\n                this.messageGroup = null;\n                this.prevMessage = wb;\n                return;\n            }\n        ;\n            var ec = n.get(\"chat_tab_bubbles\");\n            if ((((!this.messageGroup || (ec && (wb.author !== la.user))) || (this.prevMessage.author != wb.author)) || (this.prevMessage.timestamp < (wb.timestamp - yb)))) {\n                this.messageGroup = nb(wb);\n                r.appendContent(this.conversationElem, this.messageGroup.getRoot());\n            }\n        ;\n            var fc = this._makeSingleMessage(wb);\n            this.messageElements[wb.message_id] = fc;\n            r.appendContent(this.messageGroup.getNode(\"messages\"), fc);\n            pb(fc, this.scrollContainer);\n            this.prevMessage = wb;\n        },\n        rerender: function() {\n            if (!this._oldestMessageDisplayedTimestamp) {\n                return\n            };\n            var wb = (this._finishedFetchingMoreMessages && this.scrollContainer.scrollHeight), xb = (this._finishedFetchingMoreMessages && this.scrollContainer.scrollTop), yb = this.isScrolledToBottom();\n            r.empty(this.conversationElem);\n            this.messageElements = {\n            };\n            this.messageGroup = null;\n            this.prevMessage = null;\n            var zb = ca.getThreadMessagesSinceTimestamp(this.threadID, this._oldestMessageDisplayedTimestamp);\n            this._renderOlderMessages(zb, wb, xb, yb);\n            this._finishedFetchingMoreMessages = false;\n        },\n        update: function(wb) {\n            for (var xb in wb) {\n                var yb = this.messageElements[xb];\n                if (yb) {\n                    var zb = this.isScrolledToBottom(), ac = this._makeSingleMessage(ca.getMessagesFromIDs([xb,])[0]);\n                    this.messageElements[xb] = ac;\n                    r.replace(yb, ac);\n                    pb(ac, this.scrollContainer);\n                    if (zb) {\n                        this.scrollToBottom();\n                    };\n                }\n            ;\n            };\n        },\n        _getLoadingHeight: function() {\n            return (this.loadingHeight || this.loadingIcon.clientHeight);\n        },\n        _appendMessages: function(wb) {\n            wb.forEach(this._appendMessage.bind(this));\n            (this.lastMessageIndicator && this.lastMessageIndicator.setLastMessage(this.prevMessage));\n        },\n        _appendNewMessages: function(wb) {\n            wb = u.filterMessages(function(zb) {\n                this.sheetController.openUserJoinStatusSheet(zb);\n            }.bind(this), wb, true);\n            var xb = this.isScrolledToBottom(), yb = this._messagesOnlySentFromSelf(wb);\n            this._appendMessages(wb);\n            if (xb) {\n                this.scrollToBottom();\n            }\n             else if (!yb) {\n                this.sheetController.openNewMessagesSheet();\n                this._newMessagesSheetOpened = true;\n            }\n            \n        ;\n        },\n        _messagesOnlySentFromSelf: function(wb) {\n            for (var xb = 0; (xb < wb.length); xb++) {\n                if ((wb[xb].author !== la.user)) {\n                    return false\n                };\n            };\n            return true;\n        },\n        _renderOlderMessages: function(wb, xb, yb, zb) {\n            if (!wb) {\n                return\n            };\n            wb = u.filterMessages(function(ac) {\n                this.sheetController.openUserJoinStatusSheet(ac);\n            }.bind(this), wb, false);\n            this._appendMessages(wb);\n            if (zb) {\n                this.scrollToBottom();\n            }\n             else if (this._finishedFetchingMoreMessages) {\n                this.scrollToPosition((((this.scrollContainer.scrollHeight - xb) - this.loadingHeight) + yb));\n            }\n        ;\n        },\n        _updateTimestamp: function(wb) {\n            if ((wb && wb.length)) {\n                this._oldestMessageDisplayedTimestamp = wb[0].timestamp;\n                this._currentMessageCount = wb.length;\n            }\n        ;\n            this._loadingMoreMessages = false;\n            this._finishedFetchingMoreMessages = true;\n            q.hide(this.loadingIcon);\n        },\n        isScrolledToBottom: function() {\n            var wb = this.scrollContainer;\n            return ((wb.scrollTop + wb.clientHeight) >= (wb.scrollHeight - lb));\n        },\n        isScrolledNearTop: function() {\n            return (this.scrollContainer.scrollTop < this.scrollContainer.clientHeight);\n        },\n        scrollToBottom: function(wb) {\n            this.scrollToPosition(this.scrollContainer.scrollHeight, wb);\n        },\n        scrollToPosition: function(wb, xb) {\n            (this._scrollTopAnimation && this._scrollTopAnimation.stop());\n            if ((xb === true)) {\n                this._scrollTopAnimation = (new h(this.scrollContainer)).to(\"scrollTop\", wb).ease(h.ease.end).duration(400).go();\n            }\n             else this.scrollContainer.scrollTop = wb;\n        ;\n        },\n        loadMoreMessages: function() {\n            if ((ca.hasLoadedExactlyNMessages(this.threadID, this._currentMessageCount) && ca.hasLoadedAllMessages(this.threadID))) {\n                return\n            };\n            if (ga.isNewEmptyLocalThread(this.threadID)) {\n                return\n            };\n            q.show(this.loadingIcon);\n            this.loadingHeight = this._getLoadingHeight();\n            this._loadingMoreMessages = true;\n            if ((this._fetchMultiplier < 10)) {\n                this._fetchMultiplier += 1;\n            };\n            var wb = (ha.RECENT_MESSAGES_LIMIT * this._fetchMultiplier), xb = (this._currentMessageCount + wb), yb = ca.hasLoadedNMessages(this.threadID, xb);\n            ca.getThreadMessagesRange(this.threadID, 0, xb, this._updateTimestamp.bind(this), null, x.CHAT);\n            if (yb) {\n                this.rerender();\n            };\n        },\n        _makeSingleMessage: function(wb) {\n            var xb = this._renderSingleMessage(wb);\n            q.addClass(xb, \"-cx-PRIVATE-fbChatMessage__singlemessage\");\n            return xb;\n        },\n        _renderSingleMessage: function(wb) {\n            var xb = ra[\":fb:chat:conversation:message\"].render(), yb = n.get(\"chat_tab_bubbles\");\n            if ((yb && la.isAuthor(wb.author))) {\n                xb.setAttribute(\"title\", mb(wb.timestamp));\n            };\n            if (wb.subject) {\n                var zb = ra[\":fb:chat:conversation:message:subject\"].render();\n                r.setContent(zb, wb.subject);\n                r.appendContent(xb, zb);\n            }\n        ;\n            function ac(ic) {\n                if (yb) {\n                    ic = r.create(\"span\", {\n                        \"data-measureme\": 1\n                    }, ic);\n                };\n                return ic;\n            };\n            if (wb.is_filtered_content) {\n                var bc = oa[\":fb:mercury:filtered-message\"].build();\n                r.appendContent(xb, ac(bc.getRoot()));\n                return xb;\n            }\n        ;\n            if ((wb.body.substr(0, 4) == \"?OTR\")) {\n                r.setContent(xb, ac(\"[encrypted message]\"));\n                q.addClass(xb, \"-cx-PRIVATE-fbChatMessage__cyphertext\");\n            }\n             else {\n                q.addClass(xb, (cb(wb.body) ? \"direction_rtl\" : \"direction_ltr\"));\n                var cc = ja.formatMessageBody(wb.body);\n                r.appendContent(xb, ac(cc));\n            }\n        ;\n            if (wb.has_attachment) {\n                var dc = g.div(null), ec = this._appendMessageAttachments(dc, wb);\n                if (((yb && !wb.body) && !ec)) {\n                    return dc\n                };\n                r.appendContent(xb, p(dc.childNodes));\n            }\n        ;\n            if (wb.forward_count) {\n                r.appendContent(xb, sb(wb));\n            };\n            if (wb.is_spoof_warning) {\n                var fc = ra[\":fb:chat:conversation:message:undertext\"].build();\n                r.appendContent(fc.getNode(\"message\"), xb);\n                la.get(wb.author, function(ic) {\n                    fa.renderChatSpoofWarning(fc.getNode(\"status\"), wb.is_spoof_warning, ic);\n                });\n                return fc.getRoot();\n            }\n        ;\n            var gc = ea.renderStatusIndicator(wb.status, wb.error_data, ba(ca.resendMessage, ca, wb));\n            if (gc) {\n                var hc = ra[\":fb:chat:conversation:message:status\"].build();\n                r.appendContent(hc.getNode(\"message\"), xb);\n                r.appendContent(hc.getNode(\"status\"), gc);\n                return hc.getRoot();\n            }\n        ;\n            return xb;\n        },\n        _appendMessageAttachments: function(wb, xb) {\n            var yb = 0, zb = xb.attachments;\n            zb.sort(l.booleanLexicographicComparator([l.isPhotoAttachment,l.isShareAttachment,l.isFileAttachment,l.isErrorAttachment,]));\n            if ((xb.raw_attachments && (xb.raw_attachments.length > 0))) {\n                zb = k.convertRaw(xb.raw_attachments);\n            };\n            if ((((xb.attachments.length === 0) && xb.preview_attachments) && (xb.preview_attachments.length > 0))) {\n                ab(zb, xb.preview_attachments);\n            };\n            var ac = l.renderPhotoAttachments(zb.filter(l.isPhotoAttachment), xb, 176, 4);\n            if (ac) {\n                r.appendContent(wb, ac);\n            };\n            for (var bc = 0; (bc < zb.length); bc++) {\n                if (l.isPhotoAttachment(zb[bc])) {\n                    yb = 1;\n                    continue;\n                }\n            ;\n                var cc = l.renderAttachment(true, zb[bc], xb);\n                (cc.error && r.appendContent(wb, cc.error));\n                (cc.content && r.appendContent(wb, cc.content));\n                yb |= cc.bubblePreferred;\n            };\n            var dc = r.scry(wb, \"img\");\n            dc.forEach(function(ec) {\n                this._subscriptions.addSubscriptions(t.listen(ec, \"load\", ba(this._thumbLoaded, this, ec)));\n            }.bind(this));\n            return !!yb;\n        },\n        _thumbLoaded: function(wb) {\n            var xb = (this.scrollContainer.scrollTop + this.scrollContainer.clientHeight);\n            if (((xb + wb.offsetHeight) >= this.scrollContainer.scrollHeight)) {\n                this.scrollToBottom();\n            };\n        }\n    });\n    sa.subscribe(\"messages-reordered\", function(wb, xb) {\n        tb.forEach(function(yb) {\n            (xb[yb.threadID] && yb.rerender());\n        });\n    });\n    sa.subscribe(\"messages-updated\", function(wb, xb) {\n        tb.forEach(function(yb) {\n            (xb[yb.threadID] && yb.update(xb[yb.threadID]));\n        });\n    });\n    sa.subscribe(\"messages-received\", function(wb, xb) {\n        tb.forEach(function(yb) {\n            var zb = xb[yb.threadID];\n            if ((zb && zb.length)) {\n                yb._currentMessageCount += zb.length;\n            };\n            (zb && yb._appendNewMessages(zb));\n        });\n    });\n    i.subscribe(m.getArbiterType(\"chat_event\"), function(wb, xb) {\n        if (vb(xb.obj)) {\n            var yb = (((s.user == xb.obj.from)) ? xb.obj.to : xb.obj.from), zb = ga.getThreadIdForUser(yb), ac = tb.filter(function(dc) {\n                return (dc.threadID === zb);\n            });\n            if ((ac.length > 0)) {\n                var bc = ac[0], cc = ca.constructLogMessageObject(aa.CHAT_WEB, zb, z.VIDEO_CALL, xb.obj);\n                cc.author = (\"fbid:\" + xb.obj.from);\n                bc._appendNewMessages([cc,]);\n            }\n        ;\n        }\n    ;\n    });\n    function vb(wb) {\n        return (((wb.event_name === \"installing\") || (wb.event_name === \"install_canceled\")));\n    };\n    e.exports = ub;\n});\n__d(\"MercuryPeopleSuggestions\", [\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"OrderedFriendsList\",\"ShortProfiles\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"MercuryServerDispatcher\"), i = b(\"OrderedFriendsList\"), j = b(\"ShortProfiles\"), k = b(\"arrayContains\"), l = new g(), m = 6;\n    function n(s) {\n        return s.sort().join(\",\");\n    };\n    function o(s, t) {\n        if ((s.length < m)) {\n            var u = i.getList();\n            for (var v = 0; (v < u.length); v++) {\n                if (!((k(s, u[v]) || k(t, u[v])))) {\n                    s.push(u[v]);\n                    if ((s.length >= m)) {\n                        break;\n                    };\n                }\n            ;\n            };\n        }\n    ;\n        return s;\n    };\n    function p(s) {\n        h.trySend(\"/ajax/chat/people_suggest.php\", s);\n    };\n    function q(s, t, u) {\n        s = s.filter(function(w) {\n            return !k(t, w);\n        });\n        var v = o(s, t);\n        j.getMulti(v, function() {\n            u(v);\n        });\n    };\n    var r = {\n        getPeopleSuggestions: function(s, t) {\n            if (s) {\n                if (s.length) {\n                    var u = n(s), v = l.executeOrEnqueue(u, function(x) {\n                        q(x, s, t);\n                    }), w = l.getUnavailableResources(v);\n                    if (w.length) {\n                        p({\n                            query: u,\n                            size: m\n                        });\n                    };\n                    return v;\n                }\n                 else q([], [], t);\n            \n            };\n            return 0;\n        },\n        handleUpdate: function(s) {\n            if (s.query) {\n                var t = (s.suggestions || \"\"), u = (t.length ? t.split(\",\") : []);\n                l.setResource(s.query, u);\n            }\n        ;\n        }\n    };\n    h.registerEndpoints({\n        \"/ajax/chat/people_suggest.php\": {\n            mode: h.IMMEDIATE,\n            handler: r.handleUpdate\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatTabPeopleSuggestionView\", [\"ChatPeopleSuggestionList.react\",\"ChatQuietLinks\",\"CSS\",\"DOM\",\"Event\",\"MercuryPeopleSuggestions\",\"MercuryIDs\",\"React\",\"ShortProfiles\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPeopleSuggestionList.react\"), h = b(\"ChatQuietLinks\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"MercuryPeopleSuggestions\"), m = b(\"MercuryIDs\"), n = b(\"React\"), o = b(\"ShortProfiles\"), p = b(\"Style\"), q = b(\"copyProperties\");\n    function r(s, t, u) {\n        this.sheetController = s;\n        this.viewNode = t;\n        this.loadingIcon = u;\n        this.addFriendsSheet = s.getAddFriendsTabSheet();\n        this.mercuryTypeahead = (this.addFriendsSheet && this.addFriendsSheet._typeahead);\n        this.typeaheadInput = (this.mercuryTypeahead && this.mercuryTypeahead._input);\n        this.typeaheadView = (this.mercuryTypeahead && this.mercuryTypeahead.getTypeahead().getView());\n        var v = this.showSuggestions.bind(this);\n        if (this.typeaheadInput) {\n            k.listen(this.typeaheadInput, \"focus\", v);\n        };\n        if (this.typeaheadView) {\n            this.typeaheadView.subscribe(\"reset\", v);\n            this.typeaheadView.subscribe(\"render\", this.clearSuggestions.bind(this));\n        }\n    ;\n        this.tokenizer = (this.mercuryTypeahead && this.mercuryTypeahead.getTokenizer());\n        if (this.tokenizer) {\n            this.tokenizer.subscribe(\"removeToken\", v);\n        };\n        this.showSuggestions();\n    };\n    q(r.prototype, {\n        addSelectedParticipant: function(s) {\n            var t = o.getNow(s);\n            if ((t && this.tokenizer)) {\n                this.tokenizer.addToken(this.tokenizer.createToken({\n                    uid: s,\n                    text: t.name\n                }));\n                this.showSuggestions();\n            }\n        ;\n        },\n        showSuggestions: function() {\n            if (this.mercuryTypeahead) {\n                var s = this.mercuryTypeahead.getSelectedParticipantIDs();\n                s = s.map(m.getUserIDFromParticipantID);\n                j.empty(this.viewNode);\n                i.show(this.loadingIcon);\n                l.getPeopleSuggestions(s, function(t) {\n                    var u = g({\n                        uids: t,\n                        onClick: this.addSelectedParticipant.bind(this)\n                    });\n                    i.hide(this.loadingIcon);\n                    n.renderComponent(u, this.viewNode);\n                    h.removeAllHrefs(this.viewNode);\n                }.bind(this));\n            }\n        ;\n        },\n        clearSuggestions: function() {\n            j.empty(this.viewNode);\n            i.hide(this.loadingIcon);\n            p.set(this.viewNode, \"margin-top\", 0);\n        },\n        destroy: function() {\n            this.clearSuggestions();\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatAddFriendsTabSheetRawRenderer\", [\"ContextualTypeaheadView\",\"DOM\",\"Event\",\"MercuryTypeahead\",\"ChatTabTemplates\",\"tx\",\"MercuryDataSourceWrapper\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualTypeaheadView\"), h = b(\"DOM\"), i = b(\"Event\"), j = b(\"MercuryTypeahead\"), k = b(\"ChatTabTemplates\"), l = b(\"tx\"), m = b(\"MercuryDataSourceWrapper\").source, n = {\n        render: function(o, p, q, r, s, t) {\n            var u = (t ? k[\":fb:mercury:chat:tab-sheet:add-friends-empty-tab\"].build() : k[\":fb:mercury:chat:tab-sheet:add-friends\"].build()), v = new j(m, g);\n            v.setExcludedParticipants(r.participants);\n            if (!t) {\n                v.setPlaceholder(\"Add friends to this chat\");\n            };\n            v.build();\n            h.replace(u.getNode(\"participantsTypeahead\"), v.getElement());\n            h.setContent(q, u.getRoot());\n            v.getTokenizer().adjustWidth();\n            v.focus();\n            if (!t) {\n                var w = function() {\n                    var x = v.getSelectedParticipantIDs();\n                    if (x.length) {\n                        s(x);\n                    };\n                    p.close(o);\n                };\n                i.listen(u.getNode(\"doneButton\"), \"click\", w);\n            }\n        ;\n            return v;\n        }\n    };\n    e.exports = n;\n});\n__d(\"MultiChatController\", [\"Arbiter\",\"AsyncSignal\",\"copyProperties\",\"Form\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncSignal\"), i = b(\"copyProperties\"), j = b(\"Form\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get();\n    function n() {\n    \n    };\n    i(n, {\n        subscribe: function(o, p) {\n            o.subscribe(\"confirm\", function() {\n                this.createGroupThreadFromChooserDialog(o, p);\n            }.bind(this));\n        },\n        createGroupThreadFromChooserDialog: function(o, p) {\n            var q = j.serialize(o.getRoot()), r = JSON.parse(q.profileChooserItems), s = [];\n            for (var t in r) {\n                if (r[t]) {\n                    s.push(t);\n                };\n            };\n            var u = n.createThreadForFBIDs(s);\n            l.subscribe(\"update-thread-ids\", function(v, w) {\n                for (var x in w) {\n                    if ((w[x] == u)) {\n                        new h(\"/ajax/groups/chat/log\", {\n                            group_id: p,\n                            message_id: x\n                        }).send();\n                    };\n                };\n            });\n            o.hide();\n        },\n        createThreadForTokens: function(o) {\n            if (!o.length) {\n                return\n            };\n            var p;\n            if ((o.length == 1)) {\n                p = (\"user:\" + o[0].split(\":\")[1]);\n            }\n             else p = (\"root:\" + k.generateNewClientMessageID(Date.now()));\n        ;\n            m.createNewLocalThread(p, o);\n            g.inform(\"chat/open-tab\", {\n                thread_id: p\n            });\n            return p;\n        },\n        createThreadForFBIDs: function(o) {\n            var p = [];\n            for (var q = 0; (q < o.length); q++) {\n                p.push((\"fbid:\" + o[q]));;\n            };\n            return n.createThreadForTokens(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatAddFriendsTabSheet\", [\"Arbiter\",\"ChatAddFriendsTabSheetRawRenderer\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MultiChatController\",\"Style\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatAddFriendsTabSheetRawRenderer\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercurySourceType\"), k = b(\"MercuryMessages\").get(), l = b(\"MultiChatController\"), m = b(\"Style\"), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\");\n    function p(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._sheetView = u;\n        this._typeahead = null;\n    };\n    o(p.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(s) {\n                var t = (s.is_canonical_user ? q : r);\n                this._typeahead = h.render(this, this._sheetView, this._rootElement, s, t.curry(s), n.isNewEmptyLocalThread(this._threadID));\n                this._typeahead.subscribe(\"resize\", function() {\n                    this._sheetView.resize();\n                }.bind(this));\n            }.bind(this));\n        },\n        getParticipants: function() {\n            if (!this._typeahead) {\n                return null\n            };\n            return this._typeahead.getSelectedParticipantIDs();\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"add_friends_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        getHeight: function() {\n            return m.get(this._rootElement, \"height\");\n        }\n    });\n    function q(s, t) {\n        var u = s.participants;\n        l.createThreadForTokens(u.concat(t));\n    };\n    function r(s, t) {\n        var u = s.thread_id;\n        if (n.isEmptyLocalThread(u)) {\n            n.addParticipantsToThreadLocally(u, t);\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n         else {\n            k.sendMessage(k.constructLogMessageObject(j.CHAT_WEB, u, i.SUBSCRIBE, {\n                added_participants: t\n            }));\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n    ;\n    };\n    e.exports = p;\n});\n__d(\"ChatNameConversationTabSheetRawRenderer\", [\"DOM\",\"Event\",\"Input\",\"Keys\",\"ChatTabTemplates\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"Event\"), i = b(\"Input\"), j = b(\"Keys\"), k = b(\"ChatTabTemplates\"), l = b(\"fbt\"), m = {\n        render: function(n, o, p, q, r, s) {\n            var t = k[\":fb:mercury:chat:tab-sheet:name-conversation\"].build(), u = t.getNode(\"nameInput\"), v = t.getNode(\"doneButton\"), w = \"Done\", x = \"Hide\", y = q.name;\n            if (y) {\n                i.setValue(u, y);\n            }\n             else g.setContent(v, x);\n        ;\n            var z = function() {\n                var aa = i.getValue(u);\n                if (aa) {\n                    r(aa);\n                };\n                s();\n                o.close(n);\n            };\n            h.listen(u, \"input\", function() {\n                g.setContent(v, ((i.getValue(u).length === 0) ? x : w));\n            });\n            h.listen(v, \"click\", z);\n            h.listen(u, \"keyup\", function(aa) {\n                if ((aa.keyCode === j.RETURN)) {\n                    z();\n                    return false;\n                }\n            ;\n            });\n            g.setContent(p, t.getRoot());\n            (!n.isAutomatic() && u.focus());\n        }\n    };\n    e.exports = m;\n});\n__d(\"ChatNameConversationTabSheet\", [\"AsyncRequest\",\"ChatNameConversationTabSheetRawRenderer\",\"MercuryAPIArgsSource\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"ChatNameConversationTabSheetRawRenderer\"), i = b(\"MercuryAPIArgsSource\"), j = b(\"MercuryLogMessageType\"), k = b(\"MercurySourceType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = \"/ajax/chat/multichat/name_conversation/dismiss.php\";\n    function p(q, r, s) {\n        this.$ChatNameConversationTabSheet0 = q;\n        this.$ChatNameConversationTabSheet1 = r;\n        this.$ChatNameConversationTabSheet2 = s;\n        this.$ChatNameConversationTabSheet3 = false;\n        this.$ChatNameConversationTabSheet4 = false;\n    };\n    p.prototype.render = function() {\n        n.getThreadMeta(this.$ChatNameConversationTabSheet0, function(q) {\n            h.render(this, this.$ChatNameConversationTabSheet2, this.$ChatNameConversationTabSheet1, q, this.$ChatNameConversationTabSheet5.curry(q), this.$ChatNameConversationTabSheet6.bind(this, q));\n            this.$ChatNameConversationTabSheet2.resize();\n        }.bind(this));\n    };\n    p.prototype.isPermanent = function() {\n        return true;\n    };\n    p.prototype.getType = function() {\n        return \"name_conversation_type\";\n    };\n    p.prototype.open = function(q) {\n        this.$ChatNameConversationTabSheet3 = q;\n        if (!((this.$ChatNameConversationTabSheet3 && this.$ChatNameConversationTabSheet4))) {\n            this.$ChatNameConversationTabSheet2.open(this);\n        };\n    };\n    p.prototype.close = function() {\n        this.$ChatNameConversationTabSheet2.close(this);\n    };\n    p.prototype.isAutomatic = function() {\n        return this.$ChatNameConversationTabSheet3;\n    };\n    p.prototype.$ChatNameConversationTabSheet6 = function(q) {\n        if ((!q.name_conversation_sheet_dismissed || !this.$ChatNameConversationTabSheet4)) {\n            this.$ChatNameConversationTabSheet4 = true;\n            m.getServerThreadID(q.thread_id, function(r) {\n                new g(o).setData({\n                    thread_id: r\n                }).send();\n            });\n        }\n    ;\n    };\n    p.prototype.$ChatNameConversationTabSheet5 = function(q, r) {\n        var s = q.name;\n        if ((((r || s)) && ((r != s)))) {\n            l.sendMessage(l.constructLogMessageObject(k.CHAT_WEB, q.thread_id, j.THREAD_NAME, {\n                name: r\n            }), null, i.CHAT);\n        };\n    };\n    e.exports = p;\n});\n__d(\"ChatNewMessagesTabSheet\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"Scroll down to see new messages.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getRoot(), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"new_messages_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatNoRecipientsTabSheet\", [\"DOM\",\"fbt\",\"MercuryParticipants\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"fbt\"), i = b(\"MercuryParticipants\"), j = b(\"ChatTabTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreads\").get(), m = b(\"copyProperties\");\n    function n(o, p, q) {\n        this._threadID = o;\n        this._rootElement = p;\n        this._sheetView = q;\n        k.subscribe(\"threads-updated\", this._handleThreadsUpdated.bind(this));\n    };\n    m(n.prototype, {\n        render: function() {\n            var o = j[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(o.getNode(\"text\"), \"Everyone has left the conversation.\");\n            g.setContent(this._rootElement, o.getRoot());\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"no_recipients_type\";\n        },\n        _handleThreadsUpdated: function() {\n            l.getThreadMeta(this._threadID, function(o) {\n                var p = i.user, q = o.participants.filter(function(r) {\n                    return (r != p);\n                });\n                if ((((q.length < 1) && !o.is_joinable) && !l.isNewEmptyLocalThread(this._threadID))) {\n                    this._sheetView.open(this);\n                }\n                 else this._sheetView.close(this);\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatOfflineTabSheet\", [\"ChatPrivacyActionController\",\"ChatVisibility\",\"CSS\",\"DOM\",\"Event\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"ChatVisibility\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\");\n    function r(s, t, u) {\n        this._rootElement = t;\n        this._sheetView = u;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(s);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        };\n    };\n    p(r.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"offline_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n            var s = o[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build(), t = (\"fbid:\" + this._canonicalUser);\n            m.get(t, function(u) {\n                var v = \"fbChatGoOnlineLink\", w = j.tx._(\"turn on chat\"), x = j.create(\"a\", {\n                    href: \"#\",\n                    className: v\n                }, w), y = j.tx._(\"To chat with {name} and other friends, {link}.\", {\n                    name: u.short_name,\n                    link: x\n                });\n                j.setContent(s.getNode(\"text\"), y);\n                i.addClass(s.getRoot(), \"-cx-PRIVATE-chatTabSheet__chatoffline\");\n                j.setContent(this._rootElement, s.getRoot());\n                k.listen(this._rootElement, \"click\", function(event) {\n                    if (i.hasClass(event.getTarget(), v)) {\n                        if (h.isOnline()) {\n                            this._logger.error(\"tab_sheet_already_online\");\n                        };\n                        this._privacyActionController.togglePrivacy();\n                        this._logger.log(\"tab_sheet_go_online\", {\n                            tab_id: this._canonicalUser\n                        });\n                        return false;\n                    }\n                ;\n                }.bind(this));\n                this._sheetView.resize();\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(s) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            };\n            switch (s) {\n              case g.OFFLINE:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.BLOCKED:\n                this._sheetView.close(this);\n                break;\n            };\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"offline_type\";\n        },\n        destroy: function() {\n            (this._privacyActionController && this._privacyActionController.destroy());\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatUploadWarningTabSheet\", [\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ChatTabTemplates\"), i = b(\"copyProperties\");\n    function j(k, l, m) {\n        this._threadID = k;\n        this._rootElement = l;\n        this._sheetView = m;\n    };\n    i(j.prototype, {\n        render: function() {\n            var k = h[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(k.getNode(\"text\"), g.tx._(\"Please wait until the upload is complete before you send your message.\"));\n            g.setContent(this._rootElement, k.getRoot());\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"upload_warning_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatThreadIsMutedTabSheet\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:message-mute-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"This conversation is muted. Chat tabs will not pop up for it and push notifications are off.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getNode(\"unmuteButton\"), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"chat-thread-is-muted\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatUserBlockedTabSheet\", [\"ChatPrivacyActionController\",\"CSS\",\"DOM\",\"Event\",\"GenderConst\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"Event\"), k = b(\"GenderConst\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\");\n    function s(t, u, v) {\n        this._rootElement = u;\n        this._sheetView = v;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(t);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        };\n    };\n    p(s.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n            var t = o[\":fb:mercury:chat:tab-sheet:user-blocked\"].build(), u = (\"fbid:\" + this._canonicalUser);\n            m.get(u, function(v) {\n                var w = null;\n                switch (v.gender) {\n                  case k.FEMALE_SINGULAR:\n                \n                  case k.FEMALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send her a message. \", {\n                        name: v.short_name\n                    });\n                    break;\n                  case k.MALE_SINGULAR:\n                \n                  case k.MALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send him a message. \", {\n                        name: v.short_name\n                    });\n                    break;\n                  default:\n                    w = r._(\"You turned off chat for {name} but you can still send them a message. \", {\n                        name: v.short_name\n                    });\n                };\n                i.setContent(t.getNode(\"text\"), w);\n                var x = r._(\"Turn on chat for {name}?\", {\n                    name: v.short_name\n                });\n                i.setContent(t.getNode(\"actionLink\"), x);\n                h.addClass(t.getRoot(), \"-cx-PRIVATE-chatTabSheet__blocked\");\n                i.setContent(this._rootElement, t.getRoot());\n                j.listen(t.getNode(\"actionLink\"), \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController));\n                this._sheetView.resize();\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(t) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            };\n            switch (t) {\n              case g.BLOCKED:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.OFFLINE:\n                this._sheetView.close(this);\n                break;\n            };\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"user_blocked_type\";\n        },\n        destroy: function() {\n            (this._privacyActionController && this._privacyActionController.destroy());\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatUserJoinStatusTabSheet\", [\"Class\",\"JoinStatusTabSheet\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JoinStatusTabSheet\"), i = b(\"ChatTabTemplates\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, h);\n    j(k.prototype, {\n        _getTemplate: function() {\n            return i[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"];\n        }\n    });\n    e.exports = k;\n});\n__d(\"ChatTabSheetController\", [\"ChatAddFriendsTabSheet\",\"ChatNameConversationTabSheet\",\"ChatNewMessagesTabSheet\",\"ChatNoRecipientsTabSheet\",\"ChatOfflineTabSheet\",\"ChatUploadWarningTabSheet\",\"ChatThreadIsMutedTabSheet\",\"ChatUserBlockedTabSheet\",\"ChatUserJoinStatusTabSheet\",\"copyProperties\",\"MercurySheetView\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatAddFriendsTabSheet\"), h = b(\"ChatNameConversationTabSheet\"), i = b(\"ChatNewMessagesTabSheet\"), j = b(\"ChatNoRecipientsTabSheet\"), k = b(\"ChatOfflineTabSheet\"), l = b(\"ChatUploadWarningTabSheet\"), m = b(\"ChatThreadIsMutedTabSheet\"), n = b(\"ChatUserBlockedTabSheet\"), o = b(\"ChatUserJoinStatusTabSheet\"), p = b(\"copyProperties\"), q = b(\"MercurySheetView\"), r = b(\"MercuryThreads\").get(), s = function(t, u, v) {\n        this._sheetView = new q(t, u, v);\n        this._addFriendsTabSheet = new g(t, u, this._sheetView);\n        this._nameConversationTabSheet = new h(t, u, this._sheetView);\n        this._userBlockedTabSheet = new n(t, u, this._sheetView);\n        this._offlineTabSheet = new k(t, u, this._sheetView);\n        this._newMessagesTabSheet = new i(t, u, this._sheetView);\n        this._uploadWarningTabSheet = new l(t, u, this._sheetView);\n        this._threadIsMutedTabSheet = new m(t, u, this._sheetView);\n        this._userJoinStatusTabSheet = new o(u, this._sheetView);\n        if (!r.getCanonicalUserInThread(t)) {\n            this._noRecipientsTabSheet = new j(t, u, this._sheetView);\n        };\n    };\n    p(s.prototype, {\n        openAddFriendsSheet: function() {\n            this._addFriendsTabSheet.open();\n        },\n        openUserJoinStatusSheet: function(t) {\n            this._userJoinStatusTabSheet.addToQueue(t);\n        },\n        getAddFriendsTabSheet: function() {\n            return this._addFriendsTabSheet;\n        },\n        getAddFriendsParticipants: function() {\n            var t = this._addFriendsTabSheet.getParticipants();\n            this._addFriendsTabSheet.close();\n            return t;\n        },\n        openNameConversationSheet: function(t) {\n            this._nameConversationTabSheet.open(t);\n        },\n        openNewMessagesSheet: function() {\n            this._newMessagesTabSheet.open();\n        },\n        openUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.open();\n        },\n        openThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.open();\n        },\n        closeAutomaticNameConversationSheet: function() {\n            if (this._nameConversationTabSheet.isAutomatic()) {\n                this._nameConversationTabSheet.close();\n            };\n        },\n        closeThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.close();\n        },\n        closeNewMessagesSheet: function() {\n            this._newMessagesTabSheet.close();\n        },\n        closeUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.close();\n        },\n        onClickNewMessagesSheet: function(t) {\n            this._newMessageClickSub = this._newMessagesTabSheet.subscribe(\"clicked\", t);\n        },\n        onClickThreadIsMutedSheet: function(t) {\n            this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", t);\n        },\n        onResize: function(t) {\n            this._sheetView.subscribe(\"resize\", t);\n        },\n        destroy: function() {\n            this._sheetView.destroy();\n            this._offlineTabSheet.destroy();\n            this._userBlockedTabSheet.destroy();\n            (this._newMessageClickSub && this._newMessageClickSub.unsubscribe());\n            (this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe());\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatTabView\", [\"Event\",\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AsyncSignal\",\"AvailableListConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatContextualDialogController\",\"ChatAutoSendPhotoUploader\",\"ChatPrivacyActionController\",\"ChatQuietLinks\",\"ChatTabMessagesView\",\"ChatTabPeopleSuggestionView\",\"ChatTabSheetController\",\"ChatVisibility\",\"MercuryConstants\",\"CSS\",\"Dialog\",\"Dock\",\"DOM\",\"Input\",\"JSLogger\",\"Keys\",\"Locale\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryFileUploader\",\"MercuryLogMessageType\",\"MercuryMessages\",\"MercuryMessageClientState\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercurySourceType\",\"MercuryStickers\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"MessagesEmoticonView\",\"NubController\",\"Parent\",\"PhotosUploadWaterfall\",\"PresencePrivacy\",\"PresenceStatus\",\"Run\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"TextAreaControl\",\"Tooltip\",\"TypingDetectorController\",\"URI\",\"UserAgent\",\"VideoCallCore\",\"WaterfallIDGenerator\",\"copyProperties\",\"cx\",\"setIntervalAcrossTransitions\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"AvailableListConstants\"), n = b(\"ChatBehavior\"), o = b(\"ChatConfig\"), p = b(\"ChatContextualDialogController\"), q = b(\"ChatAutoSendPhotoUploader\"), r = b(\"ChatPrivacyActionController\"), s = b(\"ChatQuietLinks\"), t = b(\"ChatTabMessagesView\"), u = b(\"ChatTabPeopleSuggestionView\"), v = b(\"ChatTabSheetController\"), w = b(\"ChatVisibility\"), x = b(\"MercuryConstants\"), y = b(\"CSS\"), z = b(\"Dialog\"), aa = b(\"Dock\"), ba = b(\"DOM\"), ca = b(\"Input\"), da = b(\"JSLogger\"), ea = b(\"Keys\"), fa = b(\"Locale\"), ga = b(\"MercuryActionStatus\"), ha = b(\"MercuryConfig\"), ia = b(\"MercuryFileUploader\"), ja = b(\"MercuryLogMessageType\"), ka = b(\"MercuryMessages\").get(), la = b(\"MercuryMessageClientState\"), ma = b(\"MercuryParticipants\"), na = b(\"MercuryServerRequests\").get(), oa = b(\"MercurySourceType\"), pa = b(\"MercuryStickers\"), qa = b(\"MercuryThreadInformer\").get(), ra = b(\"MercuryThreadMetadataRawRenderer\"), sa = b(\"MercuryThreadMetadataRenderer\").get(), ta = b(\"MercuryThreadMuter\"), ua = b(\"MercuryThreads\").get(), va = b(\"MercuryTypingReceiver\"), wa = b(\"MessagesEmoticonView\"), xa = b(\"NubController\"), ya = b(\"Parent\"), za = b(\"PhotosUploadWaterfall\"), ab = b(\"PresencePrivacy\"), bb = b(\"PresenceStatus\"), cb = b(\"Run\"), db = b(\"Style\"), eb = b(\"SubscriptionsHandler\"), fb = b(\"ChatTabTemplates\"), gb = b(\"TextAreaControl\"), hb = b(\"Tooltip\"), ib = b(\"TypingDetectorController\"), jb = b(\"URI\"), kb = b(\"UserAgent\"), lb = b(\"VideoCallCore\"), mb = b(\"WaterfallIDGenerator\"), nb = b(\"copyProperties\"), ob = b(\"cx\"), pb = b(\"setIntervalAcrossTransitions\"), qb = b(\"tx\"), rb = 227878347358915, sb = /^\\s*$/, tb = da.create(\"tab_view\"), ub = {\n    }, vb = null, wb, xb;\n    function yb(tc, uc) {\n        var vc = ba.create(\"div\");\n        uc = uc.filter(function(wc) {\n            return (wc != ma.user);\n        });\n        if (!uc.length) {\n            return hb.remove(tc)\n        };\n        ma.getMulti(uc, function(wc) {\n            for (var xc in wc) {\n                var yc = wc[xc], zc = fb[\":fb:mercury:chat:multichat-tooltip-item\"].build();\n                ba.setContent(zc.getNode(\"name\"), yc.name);\n                var ad = ma.getUserID(xc), bd = (ad && (bb.get(ad) == m.ACTIVE));\n                y.conditionShow(zc.getNode(\"icon\"), bd);\n                y.conditionClass(zc.getNode(\"name\"), \"tooltipItemWithIcon\", bd);\n                ba.appendContent(vc, zc.getRoot());\n            };\n            hb.set(tc, vc, \"above\");\n        });\n    };\n    var zb = {\n    }, ac = null, bc = false;\n    function cc(tc, uc, vc) {\n        if (vc) {\n            zb[tc] = uc;\n            if (!ac) {\n                ac = pb(dc, 600);\n            };\n        }\n         else {\n            y.removeClass(uc, \"highlightTitle\");\n            delete zb[tc];\n        }\n    ;\n    };\n    function dc() {\n        for (var tc in zb) {\n            var uc = zb[tc];\n            if (uc.parentNode) {\n                y.conditionClass(uc, \"highlightTitle\", bc);\n            }\n             else delete zb[tc];\n        ;\n        };\n        bc = !bc;\n        if (!Object.keys(zb).length) {\n            clearInterval(ac);\n            ac = null;\n        }\n    ;\n    };\n    function ec(tc) {\n        var uc = na.tokenizeThreadID(tc);\n        switch (uc.type) {\n          case \"user\":\n            return fb[\":fb:mercury:chat:user-tab\"].build();\n        };\n        return fb[\":fb:mercury:chat:multichat-tab\"].build();\n    };\n    function fc(tc) {\n        var uc = (tc._tabTemplate.getNode(\"input\").value || \"\"), vc = tc._fileUploader.getAttachments();\n        if (lc(tc)) {\n            hc(tc, uc, vc, function(wc) {\n                var xc = tc._fileUploader.getImageIDs();\n                if ((xc.length > 0)) {\n                    wc.photo_fbids = xc;\n                    wc.has_attachment = true;\n                }\n            ;\n                ka.sendMessage(wc);\n                tc._fileUploader.removeAttachments();\n                tc._getNode(\"input\").value = \"\";\n                (tc._lastMessageIndicator && tc._lastMessageIndicator.resetState());\n                (tc._messagesView && tc._messagesView.scrollToBottom());\n            });\n        };\n    };\n    function gc(tc, uc) {\n        if ((uc === 0)) {\n            return\n        };\n        pc(tc, za.POST_PUBLISHED, {\n            count: uc\n        });\n        tc._waterfallID = mb.generate();\n    };\n    function hc(tc, uc, vc, wc) {\n        ua.getThreadMeta(tc._threadID, function(xc) {\n            var yc = ka.constructUserGeneratedMessageObject(uc, oa.CHAT_WEB, tc._threadID);\n            if ((vc.length > 0)) {\n                yc.has_attachment = true;\n                yc.raw_attachments = vc;\n            }\n        ;\n            if (ua.isNewEmptyLocalThread(tc._threadID)) {\n                var zc = tc._sheetController.getAddFriendsParticipants();\n                if (((zc === null) || (zc.length === 0))) {\n                    return;\n                }\n                 else if ((zc.length === 1)) {\n                    var ad = (\"user:\" + ma.getUserID(zc[0]));\n                    yc.thread_id = ad;\n                }\n                 else ua.addParticipantsToThreadLocally(tc._threadID, zc);\n                \n            ;\n            }\n        ;\n            if (ua.isEmptyLocalThread(tc._threadID)) {\n                var bd = na.tokenizeThreadID(tc._threadID);\n                yc.message_id = bd.value;\n                yc.specific_to_list = xc.participants;\n            }\n        ;\n            if ((typeof yc != \"undefined\")) {\n                yc.signatureID = tc._signatureID;\n            };\n            yc.ui_push_phase = x.UIPushPhase;\n            wc(yc);\n            if ((tc._threadID !== yc.thread_id)) {\n                qc.inform(\"closed-tab\", tc._threadID);\n                h.inform(\"chat/open-tab\", {\n                    thread_id: yc.thread_id\n                });\n            }\n        ;\n        });\n    };\n    function ic(tc) {\n        tc._blocked = true;\n        tc._sheetController.openUploadWarningTabSheet();\n    };\n    function jc(tc) {\n        return ((tc._fileUploader.isUploading() || tc._photoUploader.isUploading()));\n    };\n    function kc(tc) {\n        return tc._fileUploader.isUploading();\n    };\n    function lc(tc) {\n        var uc = (tc._tabTemplate.getNode(\"input\").value || \"\");\n        if (!sb.test(uc)) {\n            return true\n        };\n        if (((tc._fileUploader.getAttachments().length > 0) || (tc._fileUploader.getImageIDs().length > 0))) {\n            return true\n        };\n        return false;\n    };\n    function mc(tc) {\n        if (tc._blocked) {\n            if (kc(tc)) {\n                return\n            };\n            tc._blocked = false;\n            fc(tc);\n            tc._sheetController.closeUploadWarningTabSheet();\n        }\n    ;\n    };\n    function nc(tc) {\n        tc._nubController.flyoutContentChanged();\n        tc._attachmentsDiv.scrollTop = tc._attachmentsDiv.scrollHeight;\n    };\n    function oc(tc, uc, vc) {\n        tc._subscriptionsHandler.addSubscriptions(tc._photoUploader.subscribe(uc, function(wc, xc) {\n            pc(tc, vc, xc);\n        }));\n    };\n    function pc(tc, uc, vc) {\n        za.sendSignal(nb({\n            qn: tc._waterfallID,\n            step: uc,\n            uploader: za.APP_CHAT\n        }, (vc || {\n        })));\n    };\n    function qc(tc, uc, vc) {\n        if (uc) {\n            na.ensureThreadIsFetched(uc);\n        };\n        this._threadID = tc;\n        this._signatureID = vc;\n        this._eventListeners = [];\n        this._tabTemplate = ec(tc);\n        this._tabElem = this._tabTemplate.getRoot();\n        this._waterfallID = mb.generate();\n        if (!((this._getNode instanceof Function))) {\n            tb.log(\"getnode_undefined\", {\n                is_getnode_set: !!this._getNode,\n                is_prototype_set: !!qc.prototype,\n                is_window: (window == this),\n                is_chat_tab_view: (this instanceof qc),\n                ctor_name: (this.constructor && this.constructor.name)\n            });\n        };\n        this._subscriptionsHandler = new eb();\n        this._fileUploader = new ia(this._tabTemplate.getNode(\"attachmentShelf\"), this._tabTemplate.getNode(\"attachButtonForm\"), this._tabTemplate.getNode(\"fileInput\"), this._tabTemplate.getNode(\"attachID\"));\n        this._initializeUploader(this._fileUploader);\n        this._initializeAutoSendPhotoUploader();\n        this._attachmentsDiv = this._getNode(\"attachmentShelf\");\n        this._sheetController = new v(this._threadID, this._getNode(\"sheet\"), this._tabElem);\n        this._sheetController.onClickNewMessagesSheet(function() {\n            (this._messagesView && this._messagesView.scrollToBottom());\n            this.focus();\n            qc.inform(\"read\", this._threadID);\n        }.bind(this));\n        this._sheetController.onClickThreadIsMutedSheet(function() {\n            ta.showMuteChangeDialog(0, this._threadID);\n            this.focus();\n        }.bind(this));\n        this._nubController = new xa().init(this._tabElem);\n        this._sheetController.onResize(this._nubController.flyoutContentChanged.bind(this._nubController));\n        this._contextualDialogController = new p(this._threadID, this._getNode(\"videoCallLink\"));\n        if ((vb === null)) {\n            vb = !o.get(\"seen_autosend_photo_nux\");\n        };\n        if ((wb === undefined)) {\n            wb = o.get(\"show_sticker_nux\");\n        };\n        this._messagesView = null;\n        var wc = this._getNode(\"conversationLink\");\n        if (wc) {\n            y.hide(wc);\n            sa.renderTitanLink(tc, wc, y.show.bind(y, wc));\n        }\n    ;\n        if (!ua.getCanonicalUserInThread(this._threadID)) {\n            this._titlebarTooltipAnchor = this._getNode(\"titlebarText\");\n        };\n        var xc = this._getCanonicalUserID();\n        if (this._isTitleTextLinked()) {\n            ma.get((\"fbid:\" + xc), function(id) {\n                if (id.href) {\n                    var jd = this._getNode(\"titlebarText\");\n                    jd.setAttribute(\"href\", id.href);\n                    jd.removeAttribute(\"rel\");\n                    y.removeClass(jd, \"noLink\");\n                }\n            ;\n            }.bind(this));\n        };\n        var yc = this._getNode(\"inputContainer\").clientHeight;\n        gb.getInstance(this._getNode(\"input\")).subscribe(\"resize\", function() {\n            var id = this._getNode(\"inputContainer\").clientHeight;\n            if ((id != yc)) {\n                this._nubController.flyoutContentChanged();\n            };\n            yc = id;\n        }.bind(this));\n        var zc = null, ad = this._getNode(\"inputContainer\");\n        this._nubController.subscribe(\"resize\", function() {\n            if (!zc) {\n                zc = this._tabElem.clientWidth;\n            };\n            var id = 2, jd = (zc - ((ad.clientWidth + id))), kd = (fa.isRTL() ? \"left\" : \"right\");\n            db.set(this._iconsContainerNode, kd, (jd + \"px\"));\n            gb.getInstance(this._getNode(\"input\")).update();\n        }.bind(this));\n        var bd = o.get(\"chat_tab_height\");\n        if (bd) {\n            var cd = this._tabTemplate.getNode(\"chatWrapper\");\n            db.set(cd, \"height\", (bd + \"px\"));\n        }\n    ;\n        this._listen(\"closeButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"mousedown\", this._closePreClicked);\n        this._listen(\"dockButton\", \"click\", this._nubClicked);\n        this._listen(\"dockButton\", \"keydown\", this._dockKeyDown);\n        this._listen(\"nubFlyoutTitlebar\", \"click\", this._titleClicked);\n        this._listen(\"chatConv\", \"click\", this._chatConvClicked);\n        this._listen(\"inputContainer\", \"click\", this._inputContainerClicked);\n        this._listen(\"addFriendLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"addToThreadLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"nameConversationLink\", \"click\", this._nameConversationLinkClicked, true);\n        this._listen(\"clearWindowLink\", \"click\", this._clearHistory, true);\n        this._listen(\"unsubscribeLink\", \"click\", this._unsubscribeLinkClicked, true);\n        this._listen(\"videoCallLink\", \"click\", this._callClicked, true);\n        this._listen(\"reportSpamLink\", \"click\", this._reportSpamClicked, true);\n        this._listen(\"muteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, -1), true);\n        this._listen(\"unmuteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, 0), true);\n        this._listen(\"input\", \"focus\", this._focusTab);\n        this._listen(\"input\", \"blur\", this._blurTab);\n        this._listen(\"sheet\", \"keydown\", function(event) {\n            if ((!event.getModifiers().any && (event.keyCode === ea.TAB))) {\n                this._getNode(\"input\").focus();\n                event.kill();\n            }\n        ;\n        }.bind(this));\n        this._iconsContainerNode = this._getNode(\"iconsContainer\");\n        var dd = this._getNode(\"emoticons\");\n        this._emoticonView = null;\n        if (dd) {\n            this._emoticonView = new wa(dd, this._getNode(\"input\"));\n        };\n        var ed = this._getNode(\"stickers\");\n        if (ed) {\n            this._stickerController = new pa(ed);\n            if (ha.BigThumbsUpStickerWWWGK) {\n                this._listen(\"bigThumbsUp\", \"click\", this._bigThumbsUpClicked);\n            };\n            this._subscriptionsHandler.addSubscriptions(this._stickerController.subscribe(\"stickerselected\", function(id, jd) {\n                this._stickerSelected(jd.id);\n            }.bind(this)));\n        }\n    ;\n        if (kb.firefox()) {\n            this._listen(\"input\", \"keypress\", this._inputKeyDown);\n        }\n         else this._listen(\"input\", \"keydown\", this._inputKeyDown);\n    ;\n        this._privacyLink = this._getNode(\"privacyLink\");\n        if (this._privacyLink) {\n            this._privacyActionController = new r(xc, this._updatePrivacyLink.bind(this));\n            this._eventListeners.push(g.listen(this._privacyLink, \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController)));\n        }\n    ;\n        ua.getThreadMeta(this._threadID, function(id) {\n            var jd = (xc || ((o.get(\"chat_multi_typ_send\") && !id.is_canonical)));\n            if (jd) {\n                na.getServerThreadID(this._threadID, function(kd) {\n                    this._lastMessageIndicator = new ib(xc, this._getNode(\"input\"), \"mercury-chat\", null, kd);\n                }.bind(this));\n            };\n            this._setUpMutingSettings(id);\n        }.bind(this));\n        var fd = this._getNode(\"muteGroupLink\");\n        if (fd) {\n            var gd = ua.getCanonicalGroupInThread(this._threadID);\n            if (gd) {\n                fd.setAttribute(\"ajaxify\", jb(fd.getAttribute(\"ajaxify\")).addQueryData({\n                    id: gd\n                }));\n            };\n        }\n    ;\n        s.removeEmptyHrefs(this._tabElem);\n        ub[tc] = this;\n        this.updateAvailableStatus();\n        this.updateTab();\n        this._setCloseTooltip(false);\n        var hd = {\n            threadID: tc,\n            userID: xc,\n            signatureID: this._signatureID\n        };\n        new l(\"/ajax/chat/opentab_tracking.php\", hd).send();\n        cb.onBeforeUnload(function() {\n            if ((lc(this) || jc(this))) {\n                return \"You haven't sent your message yet. Do you want to leave without sending?\"\n            };\n            if (ka.getNumberLocalMessages(this._threadID)) {\n                return \"Your message is still being sent. Are you sure you want to leave?\"\n            };\n            return null;\n        }.bind(this), false);\n        cb.onUnload(function() {\n            rc(this);\n        }.bind(this));\n    };\n    function rc(tc) {\n        if (tc._photoUploader.isUploading()) {\n            pc(tc, za.CANCEL_DURING_UPLOAD);\n        };\n    };\n    function sc() {\n        for (var tc in ub) {\n            ub[tc].updateAvailableStatus();\n            ub[tc].updateMultichatTooltip();\n        };\n    };\n    h.subscribe([\"buddylist/availability-changed\",], sc);\n    ab.subscribe([\"privacy-changed\",\"privacy-availability-changed\",], sc);\n    n.subscribe(n.ON_CHANGED, function() {\n        for (var tc in ub) {\n            ua.getThreadMeta(tc, function(uc) {\n                ub[tc]._updateUnreadCount(uc);\n            });;\n        };\n    });\n    va.subscribe(\"state-changed\", function(tc, uc) {\n        for (var vc in uc) {\n            var wc = (uc[vc] && uc[vc].length), xc = ub[vc];\n            (xc && xc.showTypingIndicator(wc));\n        };\n    });\n    qa.subscribe(\"threads-updated\", function(tc, uc) {\n        for (var vc in ub) {\n            (uc[vc] && ub[vc].updateTab());;\n        };\n    });\n    qa.subscribe(\"threads-deleted\", function(tc, uc) {\n        for (var vc in ub) {\n            (uc[vc] && qc.inform(\"thread-deleted\", vc));;\n        };\n    });\n    nb(qc, i, {\n        get: function(tc) {\n            return ub[tc];\n        }\n    });\n    nb(qc.prototype, {\n        getThreadID: function() {\n            return this._threadID;\n        },\n        showAddFriend: function() {\n            (function() {\n                this._sheetController.openAddFriendsSheet();\n            }).bind(this).defer();\n        },\n        showPeopleSuggestions: function() {\n            (function() {\n                this._peopleSuggestions = new u(this._sheetController, this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"));\n            }).bind(this).defer();\n        },\n        showNameConversation: function(tc) {\n            (function() {\n                this._sheetController.openNameConversationSheet(tc);\n            }).bind(this).defer();\n        },\n        hideAutomaticNameConversation: function() {\n            (function() {\n                this._sheetController.closeAutomaticNameConversationSheet();\n            }).bind(this).defer();\n        },\n        isVisible: function() {\n            return y.shown(this._tabElem);\n        },\n        setVisibleState: function(tc, uc) {\n            var vc = y.shown(this._tabElem), wc = y.hasClass(this._tabElem, \"opened\");\n            y.conditionShow(this._tabElem, tc);\n            y.conditionClass(this._tabElem, \"opened\", uc);\n            if (((!((vc && wc)) && tc) && uc)) {\n                if (!this._messagesView) {\n                    this._messagesView = new t(this._threadID, this._sheetController, this._getNode(\"chatConv\"), this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"), this._getNode(\"lastMessageIndicator\"), this._getNode(\"typingIndicator\"));\n                };\n                this._nubController.flyoutContentChanged();\n                this._messagesView.scrollToBottom();\n            }\n        ;\n            if (((vc && wc) && !((tc && uc)))) {\n                this._contextualDialogController.tabNotActive();\n            };\n        },\n        focus: function() {\n            var tc = (y.hasClass(this._tabElem, \"opened\") ? \"input\" : \"dockButton\");\n            this._getNode(tc).focus();\n        },\n        isFocused: function() {\n            var tc = document.activeElement;\n            return (ya.byClass(tc, \"-cx-PRIVATE-fbMercuryChatTab__root\") === this._tabElem);\n        },\n        hasEmptyInput: function() {\n            return sb.test(this._getNode(\"input\").value);\n        },\n        getInputElem: function() {\n            return this._getNode(\"input\");\n        },\n        setInput: function(tc) {\n            this._getNode(\"input\").value = tc;\n        },\n        insertBefore: function(tc) {\n            ba.insertBefore(tc._tabElem, this._tabElem);\n        },\n        appendTo: function(tc) {\n            ba.appendContent(tc, this._tabElem);\n        },\n        nextTabIs: function(tc) {\n            var uc = (tc && tc._tabElem);\n            return (this._tabElem.nextSibling == uc);\n        },\n        getScrollTop: function() {\n            return ba.find(this._tabElem, \".scrollable\").scrollTop;\n        },\n        setScrollTop: function(tc) {\n            ba.find(this._tabElem, \".scrollable\").scrollTop = tc;\n        },\n        destroy: function() {\n            ba.remove(this._tabElem);\n            (this._emoticonView && this._emoticonView.destroy());\n            (this._stickerController && this._stickerController.destroy());\n            while (this._eventListeners.length) {\n                this._eventListeners.pop().remove();;\n            };\n            (this._messagesView && this._messagesView.destroy());\n            this._sheetController.destroy();\n            this._fileUploader.destroy();\n            this._photoUploader.destroy();\n            this._subscriptionsHandler.release();\n            this._contextualDialogController.destroy();\n            (this._privacyActionController && this._privacyActionController.destroy());\n            delete ub[this._threadID];\n            aa.unregisterNubController(this._nubController);\n            ca.reset(this._getNode(\"input\"));\n        },\n        updateAvailableStatus: function() {\n            ua.getThreadMeta(this._threadID, function(tc) {\n                var uc = m.OFFLINE, vc = this._getCanonicalUserID();\n                if (vc) {\n                    uc = bb.get(vc);\n                }\n                 else {\n                    var wc = tc.participants.map(function(yc) {\n                        return ma.getUserID(yc);\n                    });\n                    uc = bb.getGroup(wc);\n                }\n            ;\n                if (!w.isOnline()) {\n                    uc = m.OFFLINE;\n                };\n                if (vc) {\n                    this._updateCallLink(uc);\n                };\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__active\", (uc === m.ACTIVE));\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__mobile\", (uc === m.MOBILE));\n                var xc = this._getNode(\"presenceIndicator\");\n                switch (uc) {\n                  case m.ACTIVE:\n                    xc.setAttribute(\"alt\", \"Online\");\n                    break;\n                  case m.MOBILE:\n                    xc.setAttribute(\"alt\", \"Mobile\");\n                    break;\n                  default:\n                    xc.removeAttribute(\"alt\");\n                    break;\n                };\n            }.bind(this));\n        },\n        updateTab: function() {\n            ua.getThreadMeta(this._threadID, function(tc) {\n                if (!tc.is_subscribed) {\n                    qc.inform(\"unsubscribed\", this._threadID);\n                    return;\n                }\n            ;\n                sa.renderAndSeparatedParticipantList(this._threadID, [this._getNode(\"name\"),this._getNode(\"titlebarText\"),], {\n                    names_renderer: ra.renderShortNames,\n                    check_length: true\n                });\n                if ((tc.is_joinable && !o.get(\"joinable_conversation_is_modal\"))) {\n                    this._updateJoinableAddFriendSheet(tc);\n                };\n                this._updateMutingSettings(tc);\n                this._updateUnreadCount(tc);\n                this.updateMultichatTooltip();\n                this._updateArchiveWarning(tc);\n                this._updateNewThread(tc);\n                this._updateNameConversationSheet(tc);\n            }.bind(this));\n        },\n        _updateNameConversationSheet: function(tc) {\n            if ((((!tc.name && !tc.is_canonical) && !tc.name_conversation_sheet_dismissed) && !ua.isEmptyLocalThread(tc.thread_id))) {\n                this.showNameConversation(true);\n            }\n             else this.hideAutomaticNameConversation();\n        ;\n        },\n        _updateJoinableAddFriendSheet: function(tc) {\n            var uc = ma.user, vc = tc.participants.filter(function(wc) {\n                return (wc != uc);\n            });\n            if ((tc.is_joinable && (vc.length < 1))) {\n                this.showAddFriend();\n            };\n        },\n        updateSignatureID: function(tc) {\n            this._signatureID = tc;\n        },\n        _showPhotoNUXIfNecessary: function() {\n            if (vb) {\n                vb = false;\n                new k(\"/ajax/chat/photo_nux.php\").setRelativeTo(this._getNode(\"photoAttachLink\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        },\n        _showStickerNUXIfNecessary: function() {\n            if (wb) {\n                wb = false;\n                new k(\"/ajax/messaging/stickers/nux\").setRelativeTo(this._getNode(\"emoticons\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        },\n        _setUpMutingSettings: function(tc) {\n            var uc = ta.isThreadMuted(tc);\n            if (uc) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            };\n            this._updateActionMenu(uc);\n        },\n        _updateMutingSettings: function(tc) {\n            var uc = ta.isThreadMuted(tc);\n            if ((uc && y.shown(this._getNode(\"muteThreadLink\").parentNode))) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n             else if ((!uc && y.shown(this._getNode(\"unmuteThreadLink\").parentNode))) {\n                this._sheetController.closeThreadIsMutedTabSheet();\n            }\n        ;\n            this._updateActionMenu(uc);\n        },\n        _updateActionMenu: function(tc) {\n            y.conditionShow(this._getNode(\"muteThreadLink\").parentNode, !tc);\n            y.conditionShow(this._getNode(\"unmuteThreadLink\").parentNode, tc);\n        },\n        _updateArchiveWarning: function(tc) {\n            var uc = false;\n            ma.get(ma.user, function(vc) {\n                uc = vc.employee;\n                if (uc) {\n                    ma.getMulti(tc.participants, this._showArchiveWarningIfAllParticipantsAreEmployees.bind(this));\n                };\n            }.bind(this));\n        },\n        _updateNewThread: function(tc) {\n            var uc = ua.isNewEmptyLocalThread(tc.thread_id);\n            y.conditionShow(this._getNode(\"dropdown\"), !uc);\n            if (uc) {\n                this.showAddFriend();\n                if (o.get(\"www_chat_compose_suggestions\", 0)) {\n                    this.showPeopleSuggestions();\n                };\n            }\n             else if (this._peopleSuggestions) {\n                this._peopleSuggestions.destroy();\n                this._peopleSuggestions = null;\n            }\n            \n        ;\n        },\n        _showArchiveWarningIfAllParticipantsAreEmployees: function(tc) {\n            var uc = true;\n            for (var vc in tc) {\n                uc = (uc && tc[vc].employee);;\n            };\n            var wc = this._getNode(\"titanArchiveWarning\");\n            if (wc) {\n                if (this._titlebarTooltipAnchor) {\n                    y.conditionClass(this._titlebarTooltipAnchor, \"narrowTitleBar\", uc);\n                };\n                y.conditionShow(wc, uc);\n            }\n        ;\n        },\n        updateMultichatTooltip: function() {\n            ua.getThreadMeta(this._threadID, function(tc) {\n                if (!tc.is_canonical) {\n                    yb(this._titlebarTooltipAnchor, tc.participants);\n                };\n            }.bind(this));\n        },\n        _getNode: function(tc) {\n            return this._tabTemplate.getNode(tc);\n        },\n        _getCanonicalUserID: function() {\n            return ua.getCanonicalUserInThread(this._threadID);\n        },\n        _listen: function(tc, event, uc, vc) {\n            var wc = this._getNode(tc);\n            if (wc) {\n                this._eventListeners.push(g.listen(wc, event, uc.bind(this)));\n            }\n             else if (!vc) {\n                throw new Error(((\"Could not find node \\\"\" + tc) + \"\\\"\"))\n            }\n        ;\n        },\n        _closePreClicked: function(tc) {\n            this._closeMouseDown = true;\n        },\n        _closeClicked: function(tc) {\n            rc(this);\n            qc.inform(\"closed-tab\", this._threadID);\n            tc.kill();\n        },\n        _nubClicked: function(tc) {\n            tc.kill();\n            return qc.inform(\"nub-activated\", this._threadID);\n        },\n        _dockKeyDown: function(event) {\n            if (((event.keyCode === ea.RETURN) || (event.keyCode === ea.SPACE))) {\n                qc.inform(\"nub-activated\", this._threadID);\n                event.kill();\n            }\n             else this._handleHotkeyPressed(event);\n        ;\n        },\n        _handleHotkeyPressed: function(event) {\n            if ((event.keyCode === ea.ESC)) {\n                rc(this);\n                qc.inform(\"esc-pressed\", this._threadID);\n                event.kill();\n            }\n             else if (((event.keyCode === ea.TAB) && !event.ctrlKey)) {\n                var tc = qc.inform(\"tab-pressed\", {\n                    id: this._threadID,\n                    shiftPressed: event.shiftKey\n                });\n                (!tc && event.kill());\n            }\n            \n        ;\n        },\n        _isTitleTextLinked: function() {\n            var tc = this._getCanonicalUserID();\n            return (tc && o.get(\"chat_tab_title_link_timeline\"));\n        },\n        _titleClicked: function(event) {\n            var tc = event.getTarget(), uc = ya.byClass(tc, \"titlebarText\"), vc = (uc && this._isTitleTextLinked());\n            if (((!vc && !ya.byClass(tc, \"uiSelector\")) && !ya.byClass(tc, \"addToThread\"))) {\n                qc.inform(\"lower-activated\", this._threadID);\n                event.kill();\n            }\n        ;\n        },\n        _callClicked: function(tc) {\n            var uc = this._getCanonicalUserID();\n            if (lb.availableForCall(uc)) {\n                var vc = \"chat_tab_icon\";\n                if ((tc.target && y.hasClass(tc.target, \"video_call_promo\"))) {\n                    vc = \"chat_tab_icon_promo\";\n                }\n                 else if ((tc.target && y.hasClass(tc.target, \"video_call_tour\"))) {\n                    vc = \"chat_tab_icon_tour\";\n                }\n            ;\n                qc.inform(\"video-call-clicked\", {\n                    threadID: this._threadID,\n                    userID: uc,\n                    clickSource: vc\n                });\n            }\n        ;\n            return false;\n        },\n        _addFriendLinkClicked: function() {\n            this.showAddFriend();\n        },\n        _nameConversationLinkClicked: function() {\n            this.showNameConversation();\n        },\n        _clearHistory: function() {\n            var tc = ua.getThreadMetaNow(this._threadID);\n            if (tc) {\n                var uc = this._getCanonicalUserID();\n                na.clearChat(this._threadID, uc, tc.timestamp);\n            }\n        ;\n        },\n        _unsubscribeLinkClicked: function() {\n            var tc = [];\n            tc.push({\n                name: \"unsubscribe\",\n                label: \"Leave Conversation\",\n                handler: this._unsubscribeToThread.bind(this)\n            });\n            tc.push(z.CANCEL);\n            new z().setTitle(\"Leave Conversation?\").setBody(\"You will stop receiving messages from this conversation and people will see that you left.\").setButtons(tc).show();\n        },\n        _bigThumbsUpClicked: function() {\n            this._stickerSelected(rb);\n        },\n        _reportSpamClicked: function() {\n            var tc = this._getCanonicalUserID(), uc = jb(\"/ajax/chat/report.php\").addQueryData({\n                id: tc\n            }).addQueryData({\n                src: \"top_report_link\"\n            });\n            j.send(new k(uc));\n        },\n        _showMuteSettingDialog: function(tc) {\n            ta.showMuteChangeDialog(tc, this._threadID);\n        },\n        _focusTab: function() {\n            y.addClass(this._tabElem, \"focusedTab\");\n            if (this._peopleSuggestions) {\n                this._peopleSuggestions.clearSuggestions();\n            };\n            this.tryMarkAsRead();\n            this._contextualDialogController.tabFocused();\n            if ((!xb && ((this._showPhotoNUXIfNecessary() || this._showStickerNUXIfNecessary())))) {\n                h.subscribe([\"ChatNUX/show\",\"ChatNUX/hide\",], function(event) {\n                    xb = (event === \"ChatNUX/show\");\n                });\n            };\n            this._closeMouseDown = false;\n            this._setCloseTooltip(true);\n        },\n        _blurTab: function() {\n            y.removeClass(this._tabElem, \"focusedTab\");\n            (!this._closeMouseDown && this._setCloseTooltip(false));\n        },\n        _setCloseTooltip: function(tc) {\n            var uc = this._getNode(\"titlebarCloseButton\"), vc = (tc ? \"Press Esc to close\" : \"Close tab\");\n            hb.set(uc, vc, \"above\");\n        },\n        _inputKeyDown: function(event) {\n            if (((event.keyCode === ea.RETURN) && !event.shiftKey)) {\n                if (kc(this)) {\n                    ic(this);\n                    event.kill();\n                    return;\n                }\n            ;\n                fc(this);\n                event.kill();\n                return;\n            }\n        ;\n            if ((((event.keyCode === ea.DOWN) && event.shiftKey) && (this._getNode(\"input\").value === \"\"))) {\n                qc.inform(\"lower-activated\", this._threadID);\n                event.kill();\n                return;\n            }\n        ;\n            this._handleHotkeyPressed(event);\n        },\n        tryMarkAsRead: function() {\n            if ((!this._messagesView || this._messagesView.isScrolledToBottom())) {\n                qc.inform(\"read\", this._threadID);\n                return true;\n            }\n        ;\n            return false;\n        },\n        _chatConvClicked: function(tc) {\n            this.tryMarkAsRead();\n            if ((ya.byTag(tc.getTarget(), \"a\") || ba.getSelection())) {\n                return\n            };\n            this.focus();\n        },\n        _inputContainerClicked: function(tc) {\n            this.tryMarkAsRead();\n            this.focus();\n        },\n        showTypingIndicator: function(tc) {\n            var uc = ua.getThreadMetaNow(this._threadID), vc = (this._getCanonicalUserID() || (((o.get(\"chat_multi_typ\") && uc) && !uc.is_canonical)));\n            if (vc) {\n                y.conditionClass(this._tabElem, \"typing\", tc);\n            };\n        },\n        _updateUnreadCount: function(tc) {\n            var uc = tc.unread_count;\n            if ((typeof uc != \"undefined\")) {\n                var vc = (!!uc && ((!n.showsTabUnreadUI || n.showsTabUnreadUI()))), wc = this._getNode(\"numMessages\");\n                y.conditionShow(wc, vc);\n                y.conditionClass(this._tabElem, \"highlightTab\", vc);\n                cc(this._threadID, this._tabElem, vc);\n                ba.setContent(wc, uc);\n            }\n        ;\n        },\n        _updateCallLink: function(tc) {\n            var uc = this._getNode(\"videoCallLink\");\n            if (w.isOnline()) {\n                var vc = this._getCanonicalUserID(), wc = (\"fbid:\" + vc);\n                ma.get(wc, function(xc) {\n                    if (lb.availableForCall(vc)) {\n                        hb.set(uc, qb._(\"Start a video call with {firstname}\", {\n                            firstname: xc.short_name\n                        }));\n                        this._updateCallBackLinks(this._tabElem, true);\n                    }\n                     else {\n                        hb.set(uc, qb._(\"{firstname} is currently unavailable for video calling\", {\n                            firstname: xc.short_name\n                        }));\n                        this._hideVideoCallouts();\n                        this._updateCallBackLinks(this._tabElem, false);\n                    }\n                ;\n                }.bind(this));\n            }\n             else {\n                hb.set(uc, \"You must be online to make a call.\");\n                this._hideVideoCallouts();\n                this._updateCallBackLinks(document.body, false);\n            }\n        ;\n        },\n        _updateCallBackLinks: function(tc, uc) {\n            var vc = ba.scry(tc, \"a.callBackLink\");\n            if (uc) {\n                vc.forEach(y.show);\n            }\n             else vc.forEach(y.hide);\n        ;\n        },\n        _hideVideoCallouts: function() {\n            this._contextualDialogController.hideVideoCallouts();\n        },\n        _updatePrivacyLink: function(tc) {\n            if ((tc == r.OFFLINE)) {\n                ba.setContent(this._privacyLink, \"Go online\");\n            }\n             else {\n                var uc = this._getCanonicalUserID(), vc = (\"fbid:\" + uc);\n                ma.get(vc, function(wc) {\n                    var xc = null;\n                    if ((tc == r.BLOCKED)) {\n                        xc = qb._(\"Turn On Chat for {name}\", {\n                            name: wc.short_name\n                        });\n                    }\n                     else xc = qb._(\"Turn Off Chat for {name}\", {\n                        name: wc.short_name\n                    });\n                ;\n                    ba.setContent(this._privacyLink, xc);\n                }.bind(this));\n            }\n        ;\n        },\n        _unsubscribeToThread: function() {\n            if (ua.isEmptyLocalThread(this._threadID)) {\n                qc.inform(\"unsubscribed\", this._threadID);\n            }\n             else {\n                var tc = ka.constructLogMessageObject(oa.CHAT_WEB, this._threadID, ja.UNSUBSCRIBE, {\n                });\n                ka.sendMessage(tc);\n            }\n        ;\n            return true;\n        },\n        _initializeUploader: function(tc) {\n            this._subscriptionsHandler.addSubscriptions(tc.subscribe([\"all-uploads-completed\",\"upload-canceled\",], function() {\n                mc(this);\n            }.bind(this)), tc.subscribe(\"dom-updated\", function() {\n                nc(this);\n            }.bind(this)), tc.subscribe(\"submit\", function() {\n                this._getNode(\"input\").focus();\n            }.bind(this)));\n        },\n        _initializeAutoSendPhotoUploader: function() {\n            this._photoUploader = new q(this._tabTemplate.getNode(\"photoAttachButtonForm\"), this._tabTemplate.getNode(\"photoFileInput\"), this._tabTemplate.getNode(\"photoAttachID\"));\n            var tc = {\n            };\n            oc(this, \"submit\", za.UPLOAD_START);\n            oc(this, \"all-uploads-completed\", za.ALL_UPLOADS_DONE);\n            oc(this, \"all-uploads-failed\", za.CLIENT_ERROR);\n            this._subscriptionsHandler.addSubscriptions(this._photoUploader.subscribe(\"submit\", function(uc, vc) {\n                hc(this, \"\", [], function(wc) {\n                    tc[vc.upload_id] = wc;\n                    if ((vc.preview_attachments.length > 0)) {\n                        wc.has_attachment = true;\n                        wc.preview_attachments = vc.preview_attachments;\n                    }\n                ;\n                    wc.client_state = la.DO_NOT_SEND_TO_SERVER;\n                    wc.status = ga.RESENDING;\n                    ka.sendMessage(wc);\n                });\n                this._getNode(\"input\").focus();\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-failed\", function(uc, vc) {\n                var wc = tc[vc.upload_id];\n                delete tc[vc.upload_id];\n                ka.deleteMessages(wc.thread_id, [wc.message_id,]);\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-completed\", function(uc, vc) {\n                var wc = tc[vc.upload_id];\n                delete tc[vc.upload_id];\n                wc.image_ids = vc.image_ids;\n                wc.client_state = la.SEND_TO_SERVER;\n                ka.sendMessage(wc);\n                var xc = (vc.image_ids.length || vc.attachments.length);\n                gc(this, xc);\n            }.bind(this)));\n        },\n        _stickerSelected: function(tc) {\n            hc(this, \"\", [], function(uc) {\n                uc.has_attachment = true;\n                uc.sticker_id = tc;\n                ka.sendMessage(uc);\n                this.focus();\n            }.bind(this));\n        },\n        _emoticonView: null\n    });\n    e.exports = qc;\n});\n__d(\"ChatNewMessageHandler\", [\"ChatActivity\",\"ChatTabModel\",\"ChatTabView\",\"JSLogger\",\"MercuryAssert\",\"MercuryBrowserAlerts\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"JSLogger\"), k = b(\"MercuryAssert\"), l = b(\"MercuryBrowserAlerts\"), m = b(\"MercuryUnseenState\").get(), n = j.create(\"chat_new_message\"), o = {\n        _raiseTab: function(p, q) {\n            var r = h.getTab(p), s = false;\n            if (r) {\n                s = r.raised;\n            }\n             else {\n                h.raiseTab(p, false);\n                s = true;\n            }\n        ;\n            q.to_new_tab = !r;\n            q.to_raised_tab = !!s;\n        },\n        _notify: function(p, q, r) {\n            var s = i.get(p);\n            r.view_is_visible = (s && s.isVisible());\n            r.view_is_focused = (s && s.isFocused());\n            if (!r.view_is_visible) {\n                n.log(\"message_to_hidden\");\n            };\n            r.is_active = g.isActive();\n            l.messageReceived(q);\n        },\n        _promoteTab: function(p, q, r) {\n            if (((r && !r[p]) && q)) {\n                h.promoteThreadInPlaceOfThread(p, q);\n            };\n        },\n        newMessage: function(p, q, r, s) {\n            k.isThreadID(p);\n            var t = {\n                thread_id: p,\n                message_id: q.message_id\n            };\n            this._raiseTab(p, t);\n            this._promoteTab(p, r, s);\n            this._notify(p, q, t);\n            n.log(\"message\", t);\n        }\n    };\n    l.subscribe(\"before-alert\", function(p, event) {\n        var q = event.threadID, r = i.get(q), s = h.getTab(q);\n        if ((((((s && s.raised) && r) && r.isVisible()) && r.isFocused()) && r.tryMarkAsRead())) {\n            m.markThreadSeen(q);\n            event.cancelAlert();\n        }\n    ;\n    });\n    e.exports = o;\n});\n__d(\"ChatTabPresence\", [\"AvailableList\",\"ChatTabModel\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatTabModel\"), i = b(\"MercuryThreads\").get(), j = {\n    };\n    function k(l) {\n        var m = i.getCanonicalUserInThread(l);\n        if (m) {\n            g.updateForID(m);\n        };\n    };\n    h.subscribe(\"chat/tabs-changed\", function(event, l) {\n        l.tabs.forEach(function(m) {\n            if ((m.raised && !j[m.id])) {\n                k(m.id);\n            };\n        });\n        j = {\n        };\n        l.tabs.forEach(function(m) {\n            if (m.raised) {\n                j[m.id] = true;\n            };\n        });\n    });\n    e.exports = {\n    };\n});\n__d(\"ChatTabPolicy\", [\"ChatBehavior\",\"FBDesktopPlugin\",\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryParticipants\",\"MercuryParticipantTypes\",\"MercurySourceType\",\"MercuryThreadMode\",\"MercuryThreadMuter\",\"MercuryUnseenState\",\"MessagingTag\",\"PresencePrivacy\",\"ShortProfiles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatBehavior\"), h = b(\"FBDesktopPlugin\"), i = b(\"JSLogger\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryAssert\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryParticipantTypes\"), n = b(\"MercurySourceType\"), o = b(\"MercuryThreadMode\"), p = b(\"MercuryThreadMuter\"), q = b(\"MercuryUnseenState\").get(), r = b(\"MessagingTag\"), s = b(\"PresencePrivacy\"), t = b(\"ShortProfiles\"), u = i.create(\"tab_policy\");\n    function v(w, x) {\n        q.markThreadSeen(w, x);\n    };\n    e.exports = {\n        messageIsAllowed: function(w, x, y) {\n            var z = w.thread_id, aa = x.message_id;\n            k.isThreadID(z);\n            k.isParticipantID(x.author);\n            var ba;\n            if (p.isThreadMuted(w)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mute_settings: w.mute_settings\n                };\n                u.log(\"message_thread_muted\", ba);\n                return;\n            }\n        ;\n            if ((w.mode == o.OBJECT_ORIGINATED)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mode: w.mode\n                };\n                u.log(\"message_object_originated\", ba);\n                return;\n            }\n        ;\n            if (((x.source == n.EMAIL) || (x.source == n.TITAN_EMAIL_REPLY))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    source: x.source\n                };\n                u.log(\"message_source_not_allowed\", ba);\n                return;\n            }\n        ;\n            var ca = l.getUserID(x.author);\n            if (!ca) {\n                u.log(\"message_bad_author\", {\n                    thread_id: z,\n                    message_id: aa,\n                    user: ca\n                });\n                return;\n            }\n        ;\n            if ((x.action_type != j.USER_GENERATED_MESSAGE)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    type: x.action_type\n                };\n                u.log(\"message_non_user_generated\", ba);\n                return;\n            }\n        ;\n            if ((w.is_canonical_user && !g.notifiesUserMessages())) {\n                u.log(\"message_jabber\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                v(z, true);\n                return;\n            }\n        ;\n            if ((w.is_canonical && !w.canonical_fbid)) {\n                u.log(\"message_canonical_contact\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n            if (h.shouldSuppressMessages()) {\n                u.log(\"message_desktop\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n            if ((w.folder != r.INBOX)) {\n                u.log(\"message_folder\", {\n                    thread_id: z,\n                    message_id: aa,\n                    folder: w.folder\n                });\n                return;\n            }\n        ;\n            var da = l.getUserID(l.user);\n            t.getMulti([ca,da,], function(ea) {\n                if (!s.allows(ca)) {\n                    u.log(\"message_privacy\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n                var fa = (ea[ca].employee && ea[da].employee);\n                if ((!fa && (ea[ca].type !== m.FRIEND))) {\n                    u.log(\"message_non_friend\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n                y();\n            });\n        }\n    };\n});\n__d(\"ChatTabViewSelector\", [\"Event\",\"Arbiter\",\"CSS\",\"DataStore\",\"DOM\",\"MenuDeprecated\",\"MercuryThreadInformer\",\"MercuryThreads\",\"NubController\",\"ChatTabTemplates\",\"MercuryThreadMetadataRenderer\",\"Toggler\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"NubController\"), p = b(\"ChatTabTemplates\"), q = b(\"MercuryThreadMetadataRenderer\").get(), r = b(\"Toggler\"), s = b(\"copyProperties\");\n    function t(u) {\n        var v = p[\":fb:chat:tab:selector\"].build(), w = v.getRoot(), x = v.getNode(\"menu\"), y = k.find(x, \".uiMenuInner\"), z = {\n        }, aa = new o().init(w);\n        i.hide(w);\n        k.insertBefore(u, w);\n        function ba(ea) {\n            var fa = 0;\n            for (var ga in z) {\n                var ha = z[ga], ia = n.getThreadMetaNow(ga), ja = ha.getNode(\"unreadCount\"), ka = (((ia && ia.unread_count)) || 0);\n                fa += ka;\n                if ((ka > 9)) {\n                    ka = \"+\";\n                };\n                i.conditionClass(ja, \"invisible_elem\", !ka);\n                k.setContent(ja, ka);\n            };\n            var la = v.getNode(\"numMessages\");\n            i.conditionShow(la, fa);\n            k.setContent(la, fa);\n        };\n        this.setTabData = function(ea) {\n            z = {\n            };\n            if ((ea.length < 1)) {\n                i.hide(w);\n                return;\n            }\n        ;\n            i.show(w);\n            k.empty(y);\n            ea.forEach(function(fa) {\n                var ga = p[\":fb:chat:tab:selector:item\"].build();\n                z[fa.id] = ga;\n                var ha = ga.getNode(\"content\");\n                q.renderAndSeparatedParticipantList(fa.id, ha);\n                k.prependContent(y, ga.getRoot());\n                j.set(ga.getRoot(), \"threadID\", fa.id);\n                var ia = ga.getNode(\"closeButton\");\n                g.listen(ia, \"click\", function(event) {\n                    t.inform(\"selector/close-tab\", fa.id);\n                    event.kill();\n                });\n            });\n            aa.flyoutContentChanged();\n            k.setContent(v.getNode(\"numTabs\"), ea.length);\n            ba();\n        };\n        function ca(event, ea) {\n            if ((ea.menu != x)) {\n                return\n            };\n            var fa = j.get(ea.item, \"threadID\");\n            t.inform(\"selected\", fa);\n            r.hide(w);\n        };\n        function da(event, ea) {\n            l.register(x);\n        };\n        l.subscribe(\"select\", ca.bind(this));\n        r.listen(\"show\", w, function() {\n            h.inform(\"layer_shown\", {\n                type: \"ChatTabSelector\"\n            });\n            da();\n        });\n        r.listen(\"hide\", w, function() {\n            h.inform(\"layer_hidden\", {\n                type: \"ChatTabSelector\"\n            });\n        });\n        m.subscribe(\"threads-updated\", ba);\n    };\n    s(t, new h());\n    e.exports = t;\n});\n__d(\"ChatTabController\", [\"ChatTabPresence\",\"ChatTypeaheadBehavior\",\"Arbiter\",\"ChatActivity\",\"ChatConfig\",\"ChatNewMessageHandler\",\"ChatTabMessagesView\",\"ChatTabModel\",\"ChatTabPolicy\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MercuryUnseenState\",\"Style\",\"UserAgent\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    b(\"ChatTabPresence\");\n    b(\"ChatTypeaheadBehavior\");\n    var g = b(\"Arbiter\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatNewMessageHandler\"), k = b(\"ChatTabMessagesView\"), l = b(\"ChatTabModel\"), m = b(\"ChatTabPolicy\"), n = b(\"ChatTabView\"), o = b(\"ChatTabViewSelector\"), p = b(\"JSLogger\"), q = b(\"MercuryParticipants\"), r = b(\"MercuryThreadInformer\").get(), s = b(\"MercuryThreads\").get(), t = b(\"MercuryUnseenState\").get(), u = b(\"Style\"), v = b(\"UserAgent\"), w = b(\"VideoCallCore\"), x = (i.get(\"tab_auto_close_timeout\") || 7200000), y = p.create(\"tab_controller\");\n    function z(la) {\n        s.changeThreadReadStatus(la, true);\n        aa(la);\n    };\n    function aa(la) {\n        t.markThreadSeen(la);\n    };\n    function ba(la, ma, na) {\n        var oa = l.get().tabs;\n        la += (ma ? 1 : -1);\n        while (((la >= 0) && (la < oa.length))) {\n            var pa = oa[la], qa = n.get(pa.id);\n            if (((qa && qa.isVisible()) && ((!na || pa.raised)))) {\n                qa.focus();\n                return true;\n            }\n        ;\n            la += (ma ? 1 : -1);\n        };\n        return false;\n    };\n    function ca(la, ma, na) {\n        var oa = ma.shouldPromoteOnRaise(la);\n        g.inform(\"chat/promote-tab\", la);\n        if (oa) {\n            l.raiseAndPromoteTab(la, true, na);\n        }\n         else l.raiseTab(la, true, na);\n    ;\n        var pa = n.get(la);\n        (pa && pa.focus());\n    };\n    function da(la, ma, na) {\n        var oa = na.getMaxTabsToShow(), pa = l.indexOf(la);\n        l.closeTabAndDemote(la, (oa - 2), ma);\n        return pa;\n    };\n    function ea(la) {\n        var ma = Object.keys((la.getTabsToShow() || {\n        })), na = (1 * 60), oa = null, pa = Infinity;\n        for (var qa = 0; (qa < ma.length); qa++) {\n            var ra = ma[qa], sa = s.getThreadMetaNow(ra);\n            if ((!n.get(ra).hasEmptyInput() || !sa)) {\n                continue;\n            };\n            var ta = (((l.getServerTime() - sa.timestamp)) / 1000);\n            if ((!sa.timestamp || (((sa.timestamp && (sa.timestamp < pa)) && (ta > na))))) {\n                oa = sa.thread_id;\n                pa = sa.timestamp;\n            }\n        ;\n        };\n        return oa;\n    };\n    function fa(la) {\n        o.subscribe(\"selected\", function(na, oa) {\n            ca(oa, la);\n        });\n        g.subscribe(\"chat/open-tab\", function(na, oa) {\n            ca(oa.thread_id, la, oa.signature_id);\n        });\n        g.subscribe(\"page_transition\", function(na, oa) {\n            l.closeFragileTabs();\n        });\n        n.subscribe(\"read\", function(event, na) {\n            z(na);\n        });\n        h.subscribe(\"idle\", function(na, oa) {\n            if ((oa > x)) {\n                var pa = l.get().tabs;\n                pa.forEach(function(qa) {\n                    var ra = qa.id;\n                    s.getThreadMeta(ra, function(sa) {\n                        if (!sa.unread_count) {\n                            y.log(\"autoclose_idle_seen\", {\n                                thread_id: ra,\n                                idleness: oa\n                            });\n                            l.closeTab(ra, \"autoclose_idle_seen\");\n                        }\n                    ;\n                    });\n                });\n            }\n        ;\n        });\n        n.subscribe(\"nub-activated\", function(na, oa) {\n            ca(oa, la);\n        });\n        n.subscribe(\"lower-activated\", function(na, oa) {\n            l.lowerTab(oa);\n            var pa = n.get(oa);\n            (pa && pa.focus());\n        });\n        function ma(na, oa) {\n            w.showOutgoingCallDialog(oa.userID, oa.clickSource);\n            l.lowerTab(oa.threadID);\n        };\n        n.subscribe(\"video-call-clicked\", ma);\n        k.subscribe(\"video-call-clicked\", ma);\n        k.subscribe(\"interaction-with-tab\", function(na, oa) {\n            var pa = l.getTab(oa);\n            ((pa && pa.raised) && aa(oa));\n        });\n        n.subscribe(\"closed-tab\", function(na, oa) {\n            y.log(\"close_view\", {\n                thread_id: oa\n            });\n            da(oa, \"close_view\", la);\n            return false;\n        });\n        n.subscribe(\"thread-deleted\", function(na, oa) {\n            y.log(\"close_thread_deleted\", {\n                thread_id: oa\n            });\n            da(oa, \"close_thread_deleted\", la);\n            return false;\n        });\n        n.subscribe(\"unsubscribed\", function(na, oa) {\n            y.log(\"close_view_unsubscribed\", {\n                thread_id: oa\n            });\n            da(oa, \"close_view_unsubscribed\", la);\n            return false;\n        });\n        n.subscribe(\"esc-pressed\", function(na, oa) {\n            y.log(\"close_esc\", {\n                thread_id: oa\n            });\n            var pa = da(oa, \"close_esc\", la);\n            (function() {\n                (ba((pa - 1), true, true) || ba(pa, false, true));\n            }).defer();\n        });\n        o.subscribe(\"selector/close-tab\", function(na, oa) {\n            y.log(\"close_chat_from_selector\", {\n                thread_id: oa\n            });\n            da(oa, \"close_chat_from_selector\", la);\n        });\n        r.subscribe(\"messages-received\", function(na, oa) {\n            for (var pa in oa) {\n                var qa = oa[pa];\n                for (var ra = 0; (ra < qa.length); ra++) {\n                    var sa = qa[ra];\n                    if ((sa.author != q.user)) {\n                        if (!sa.is_unread) {\n                            y.log(\"message_already_read\", {\n                                action_id: sa.action_id,\n                                thread_id: sa.thread_id\n                            });\n                            continue;\n                        }\n                    ;\n                        s.getThreadMeta(pa, function(ta) {\n                            m.messageIsAllowed(ta, sa, function() {\n                                var ua = (la.hasRoomForRaisedTab() ? undefined : ea(la));\n                                j.newMessage(pa, sa, ua, la.getTabsToShow());\n                            });\n                        });\n                    }\n                ;\n                };\n            };\n        });\n        r.subscribe(\"thread-read-changed\", function(na, oa) {\n            for (var pa in oa) {\n                if (!oa[pa].mark_as_read) {\n                    y.log(\"autoclose_marked_unread\", {\n                        thread_id: pa\n                    });\n                    l.closeTab(pa, \"autoclose_marked_unread\");\n                }\n            ;\n            };\n        });\n        n.subscribe(\"tab-pressed\", function(na, oa) {\n            return !ba(l.indexOf(oa.id), oa.shiftPressed);\n        });\n        g.subscribe(p.DUMP_EVENT, function(na, oa) {\n            oa.chat_controller = {\n                auto_close_timeout: x\n            };\n        });\n    };\n    if (v.firefox()) {\n        var ga = function() {\n            return ((u.get(document.body, \"overflowX\") + \" \") + u.get(document.body, \"overflowY\"));\n        }, ha = ga(), ia = function() {\n            var la = ga();\n            if ((la !== ha)) {\n                ha = la;\n                g.inform(\"overflow-applied-to-body\");\n            }\n        ;\n        };\n        if ((\"MutationObserver\" in window)) {\n            var ja = new MutationObserver(ia), ka = {\n                attributes: true,\n                attributeFilter: [\"class\",\"style\",]\n            };\n            ja.observe(document.documentElement, ka);\n        }\n         else document.documentElement.addEventListener(\"DOMAttrModified\", function(event) {\n            if (((event.getTarget() === document.documentElement) && (((event.attrName === \"class\") || (event.attrName === \"style\"))))) {\n                ia();\n            };\n        }, false);\n    ;\n    }\n;\n    e.exports = fa;\n});\n__d(\"ChatTabViewCoordinator\", [\"Arbiter\",\"ChatTabModel\",\"ChatTabView\",\"ChatTabViewSelector\",\"CSS\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"ChatTabViewSelector\"), k = b(\"CSS\"), l = b(\"VideoCallCore\");\n    function m(n, o) {\n        var p = new j(n), q = {\n        }, r = false;\n        function s() {\n            var w = h.get(), x = {\n            };\n            w.tabs.forEach(function(z) {\n                x[z.id] = 1;\n            });\n            for (var y in q) {\n                if (!x[y]) {\n                    q[y].destroy();\n                    delete (q[y]);\n                }\n            ;\n            };\n            t(w);\n            u(w);\n        };\n        function t(w) {\n            var x = null;\n            w.tabs.forEach(function(y) {\n                var z = y.id, aa = false;\n                if (!q[z]) {\n                    q[z] = new i(z, y.server_id, y.signatureID);\n                    aa = true;\n                }\n                 else q[z].updateSignatureID(y.signatureID);\n            ;\n                if ((aa || !q[z].nextTabIs(x))) {\n                    var ba = q[z].getScrollTop();\n                    if (x) {\n                        q[z].insertBefore(x);\n                    }\n                     else q[z].appendTo(n);\n                ;\n                    if (ba) {\n                        q[z].setScrollTop(ba);\n                    };\n                }\n            ;\n                x = q[z];\n            });\n        };\n        function u(w) {\n            var x = o.getTabsToShow(w), y = [], z = false;\n            w.tabs.forEach(function(aa) {\n                if (!x[aa.id]) {\n                    q[aa.id].setVisibleState(false, aa.raised);\n                    y.push(aa);\n                }\n            ;\n            });\n            w.tabs.forEach(function(aa) {\n                if (x[aa.id]) {\n                    q[aa.id].setVisibleState(true, aa.raised);\n                    z |= aa.raised;\n                }\n            ;\n            });\n            p.setTabData(y);\n            v(z);\n        };\n        function v(w) {\n            if ((!w && r)) {\n                g.inform(\"layer_hidden\", {\n                    type: \"ChatTab\"\n                });\n                r = false;\n            }\n             else if ((w && !r)) {\n                g.inform(\"layer_shown\", {\n                    type: \"ChatTab\"\n                });\n                r = true;\n            }\n            \n        ;\n        };\n        if (l.isSupported()) {\n            k.addClass(n, \"videoCallEnabled\");\n        };\n        o.subscribe(\"tabs-changed\", s);\n        s();\n    };\n    e.exports = m;\n});\n__d(\"TabsViewport\", [\"Arbiter\",\"ArbiterMixin\",\"ChatTabModel\",\"Dock\",\"DOM\",\"DOMDimensions\",\"Event\",\"Parent\",\"Vector\",\"ViewportBounds\",\"areObjectsEqual\",\"copyProperties\",\"csx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"Dock\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"Event\"), n = b(\"Parent\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"areObjectsEqual\"), r = b(\"copyProperties\"), s = b(\"csx\"), t = b(\"shield\"), u = 164, v = 264;\n    function w(x) {\n        this._root = x;\n        var y = this._recalculateWidth.bind(this);\n        m.listen(window, \"resize\", y);\n        j.subscribe(\"resize\", y);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], y);\n        g.subscribeOnce([\"sidebar/initialized\",\"LitestandSidebar/initialized\",], y, g.SUBSCRIBE_NEW);\n        i.subscribe(\"chat/tabs-changed\", t(this._recalculateTabs, this, true));\n        this._recalculateWidth();\n        this._initialized = true;\n    };\n    r(w.prototype, h, {\n        _root: null,\n        _initialized: false,\n        _availableWidth: 0,\n        _maxShown: 1,\n        _viewState: null,\n        _recalculateWidth: function() {\n            var x = w._getAvailableDockWidth(this._root), y = Math.max(1, Math.floor((x / v))), z = (y != this._maxShown);\n            if ((((!this._viewState || z) || (x <= this._viewState.usedWidth)) || (x > this._viewState.widthToShowNext))) {\n                this._availableWidth = x;\n                this._maxShown = y;\n                this._viewState = null;\n                this._recalculateTabs(z);\n            }\n        ;\n        },\n        _onTabsChanged: function() {\n            if (this._initialized) {\n                this.inform(\"tabs-changed\");\n                this.inform(\"max-to-show-changed\", this._maxShown);\n                this.inform(\"max-to-show-change-completed\");\n            }\n        ;\n        },\n        _recalculateTabs: function(x) {\n            var y = w._getTabsToShow(i.get(), this._availableWidth);\n            if ((x || !q(this._viewState, y))) {\n                this._viewState = y;\n                this._onTabsChanged();\n            }\n        ;\n        },\n        getMaxTabsToShow: function() {\n            return this._maxShown;\n        },\n        checkWidth: function() {\n            this._recalculateWidth();\n        },\n        hasRoomForRaisedTab: function() {\n            return ((this._availableWidth - this._viewState.usedWidth) > v);\n        },\n        getTabsToShow: function() {\n            return JSON.parse(JSON.stringify(this._viewState.tabsToShow));\n        },\n        shouldPromoteOnRaise: function(x) {\n            if (!this._viewState.tabsToShow[x]) {\n                return true\n            };\n            if ((this._viewState.nextToHide != x)) {\n                return false\n            };\n            var y = i.getTab(x), z = (y && y.raised);\n            return (!z && (((this._availableWidth - this._viewState.usedWidth) < 100)));\n        }\n    });\n    r(w, {\n        _getAvailableDockWidth: function(x) {\n            var y = l.getViewportWithoutScrollbarDimensions().width;\n            y -= (p.getLeft() + p.getRight());\n            y -= 50;\n            var z = n.byClass(x, \"fbDock\"), aa = k.find(z, \".-cx-PUBLIC-fbDockChatBuddyListNub__container\"), ba = o.getElementDimensions(aa).x;\n            y -= ba;\n            var ca = k.find(z, \".-cx-PUBLIC-fbMercuryChatTab__container\");\n            ba += o.getElementDimensions(ca).x;\n            var da = o.getElementDimensions(z), ea = (da.x - ba);\n            y -= ea;\n            y -= 15;\n            return Math.max(y, 0);\n        },\n        _getTabsToShow: function(x, y) {\n            y = Math.max(y, (v + 1));\n            function z(oa) {\n                return (oa.raised ? v : u);\n            };\n            var aa = JSON.parse(JSON.stringify(x.tabs)), ba = -1, ca = null;\n            if (x.promoted) {\n                aa.forEach(function(oa, pa) {\n                    if ((oa.id === x.promoted)) {\n                        ba = pa;\n                        ca = oa;\n                    }\n                ;\n                });\n            };\n            var da = 0, ea = 0, fa = !ca;\n            aa.forEach(function(oa, pa) {\n                var qa = z(oa);\n                oa.leftmostOffset = (da + v);\n                da += qa;\n                if ((oa.leftmostOffset < y)) {\n                    ea++;\n                };\n                fa |= (pa == ba);\n                oa.alreadyPlacedPromoted = fa;\n            });\n            function ga(oa, pa, qa) {\n                var ra = {\n                };\n                for (var sa = 0; (sa < pa); sa++) {\n                    var ta = oa[sa];\n                    if ((!ta.alreadyPlacedPromoted && (sa == (pa - 1)))) {\n                        ra[qa] = true;\n                    }\n                     else ra[ta.id] = true;\n                ;\n                };\n                return ra;\n            };\n            var ha = ga(aa, ea, x.promoted), ia = ga(aa, (ea - 1), x.promoted), ja = null;\n            for (var ka in ha) {\n                if (!ia[ka]) {\n                    ja = ka;\n                };\n            };\n            var la = aa[(ea - 1)], ma = (la ? la.leftmostOffset : 0), na = Infinity;\n            if ((ea < aa.length)) {\n                na = aa[ea].leftmostOffset;\n            };\n            return {\n                nextToHide: ja,\n                tabsToShow: ha,\n                usedWidth: ma,\n                widthToShowNext: na\n            };\n        }\n    });\n    e.exports = w;\n});");
// 16053
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s7432a7bbb7e5427efb6bdc5726a83bb5ce36ed02");
// 16054
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"cmK7/\",]);\n}\n;\n;\n__d(\"GenderConst\", [], function(a, b, c, d, e, f) {\n    var g = {\n        UNKNOWN: 0,\n        FEMALE_SINGULAR: 1,\n        MALE_SINGULAR: 2,\n        FEMALE_SINGULAR_GUESS: 3,\n        MALE_SINGULAR_GUESS: 4,\n        MIXED_SINGULAR: 5,\n        MIXED_PLURAL: 5,\n        NEUTER_SINGULAR: 6,\n        UNKNOWN_SINGULAR: 7,\n        FEMALE_PLURAL: 8,\n        MALE_PLURAL: 9,\n        NEUTER_PLURAL: 10,\n        UNKNOWN_PLURAL: 11\n    };\n    e.exports = g;\n});\n__d(\"VideoCallingTour\", [\"Arbiter\",\"ArbiterMixin\",\"Chat\",\"ChatSidebar\",\"ChatVisibility\",\"JSBNG__CSS\",\"DOM\",\"PresencePrivacy\",\"Run\",\"Toggler\",\"Vector\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"Chat\"), j = b(\"ChatSidebar\"), k = b(\"ChatVisibility\"), l = b(\"JSBNG__CSS\"), m = b(\"DOM\"), n = b(\"PresencePrivacy\"), o = b(\"Run\"), p = b(\"Toggler\"), q = b(\"Vector\"), r = b(\"copyProperties\"), s, t, u, v, w = [], x = function() {\n    \n    };\n    function y() {\n        if (j.isVisible()) {\n            z();\n        }\n         else if (u) {\n            aa();\n        }\n        \n    ;\n    ;\n    };\n;\n    function z() {\n        s.setContext(t.getBody());\n        ba();\n        s.show();\n        ca();\n    };\n;\n    function aa() {\n        if (!v) {\n            v = p.createInstance(u.getRoot());\n        }\n    ;\n    ;\n        var fa = m.scry(u.getRoot(), \"div.fbNubFlyout\")[0];\n        if (fa) {\n            s.setContext(fa);\n            ba();\n            s.show();\n            ca();\n        }\n    ;\n    ;\n    };\n;\n    function ba() {\n        var fa = q.getElementDimensions(s.getContext()).y;\n        s.setOffsetY(((fa * 1125)));\n        s.updatePosition();\n    };\n;\n    function ca() {\n        if (u) {\n            w.push(u.subscribe(\"hide\", function() {\n                da();\n                if (!j.isVisible()) {\n                    s.hide();\n                }\n            ;\n            ;\n            }), u.subscribe(\"show\", function() {\n                s.show();\n            }), u.subscribe(\"resize\", function() {\n                ba();\n                s.updatePosition();\n            }));\n        }\n    ;\n    ;\n        w.push(g.subscribe(\"sidebar/show\", z), g.subscribe(\"sidebar/hide\", aa), g.subscribe(\"sidebar/resized\", ba));\n    };\n;\n    function da() {\n        if (v) {\n            v.setSticky(false);\n            v = null;\n        }\n    ;\n    ;\n    };\n;\n    function ea() {\n        while (w.length) {\n            w.pop().unsubscribe();\n        ;\n        };\n    ;\n        if (u) {\n            da();\n        }\n    ;\n    ;\n        s.hide();\n        l.show(\"fbVideoCallingGetStarted\");\n    };\n;\n    r(x, h, {\n        start: function(fa) {\n            s = fa;\n            l.hide(\"fbVideoCallingGetStarted\");\n            k.goOnline(function() {\n                w.push(n.subscribe(\"privacy-user-presence-changed\", ea));\n                o.onLeave(ea);\n                i.openBuddyList();\n                var ga = null;\n                w.push(j.subscribe(\"sidebar/initialized\", function(ha, ia) {\n                    t = ia;\n                    JSBNG__clearTimeout(ga);\n                    ga = y.defer();\n                }), x.subscribe(\"videocallingtour/end\", ea));\n                w.push(g.subscribe(\"buddylist-nub/initialized\", function(ha, ia) {\n                    u = ia;\n                    JSBNG__clearTimeout(ga);\n                    ga = y.defer();\n                }));\n            });\n            x.inform(\"videocallingtour/start\");\n        }\n    });\n    e.exports = x;\n});\n__d(\"ChatPeopleSuggestionList.react\", [\"ChatSidebarItem.react\",\"fbt\",\"React\",\"ShortProfiles\",\"PresenceStatus\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatSidebarItem.react\"), h = b(\"fbt\"), i = b(\"React\"), j = b(\"ShortProfiles\"), k = b(\"PresenceStatus\"), l = b(\"cx\"), m = i.createClass({\n        displayName: \"ChatPeopleSuggestionList\",\n        _renderPeopleList: function() {\n            var n = [];\n            this.props.uids.map(function(o) {\n                var p = j.getNow(o);\n                if (p) {\n                    n.push(i.DOM.li(null, g({\n                        isAdded: false,\n                        showEditButton: true,\n                        images: p.thumbSrc,\n                        JSBNG__name: p.JSBNG__name,\n                        JSBNG__status: k.get(o),\n                        onClick: this.props.onClick.curry(o)\n                    })));\n                }\n            ;\n            ;\n            }.bind(this));\n            return n;\n        },\n        render: function() {\n            return (i.DOM.div(null, i.DOM.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__header\"\n            }, i.DOM.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__headertext\"\n            }, \"SUGGESTIONS\")), i.DOM.ul({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupslist\"\n            }, this._renderPeopleList())));\n        }\n    });\n    e.exports = m;\n});\n__d(\"Dock\", [\"function-extensions\",\"JSBNG__Event\",\"shield\",\"WebMessengerWidthControl\",\"Arbiter\",\"ArbiterMixin\",\"ChatQuietLinks\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"Parent\",\"Style\",\"Toggler\",\"Vector\",\"copyProperties\",\"csx\",\"emptyFunction\",\"ge\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"JSBNG__Event\"), h = b(\"shield\");\n    b(\"WebMessengerWidthControl\");\n    var i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"ChatQuietLinks\"), l = b(\"JSBNG__CSS\"), m = b(\"DataStore\"), n = b(\"DOM\"), o = b(\"Parent\"), p = b(\"Style\"), q = b(\"Toggler\"), r = b(\"Vector\"), s = b(\"copyProperties\"), t = b(\"csx\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    function w() {\n    \n    };\n;\n    s(w, j, {\n        MIN_HEIGHT: 140,\n        INITIAL_FLYOUT_HEIGHT_OFFSET: 10,\n        init: function(x) {\n            this.init = u;\n            this.rootEl = x;\n            this.calculateViewportDimensions();\n            this.calculateFlyoutHeightOffset();\n            k.removeEmptyHrefs(this.rootEl);\n            g.listen(x, \"click\", this._onClick.bind(this));\n            g.listen(window, \"resize\", this._onWindowResize.bind(this));\n            q.subscribe([\"show\",\"hide\",], function(y, z) {\n                var aa = z.getActive();\n                if (!n.contains(x, aa)) {\n                    return;\n                }\n            ;\n            ;\n                if (l.hasClass(aa, \"fbNub\")) {\n                    this.notifyNub(aa, y);\n                    if (((y === \"show\"))) {\n                        this._resizeNubFlyout(aa);\n                    }\n                ;\n                ;\n                }\n                 else {\n                    var ba = o.byClass(aa, \"fbNubFlyout\");\n                    if (ba) {\n                        l.conditionClass(ba, \"menuOpened\", ((y === \"show\")));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n            this.inform(\"init\", {\n            }, i.BEHAVIOR_PERSISTENT);\n        },\n        calculateViewportDimensions: function() {\n            return (this.viewportDimensions = r.getViewportDimensions());\n        },\n        calculateFlyoutHeightOffset: function() {\n            this.flyoutHeightOffset = ((this.INITIAL_FLYOUT_HEIGHT_OFFSET + r.getElementDimensions(this.rootEl).y));\n            var x = v(\"blueBar\");\n            if (x) {\n                var y = ((p.isFixed(x) ? \"viewport\" : \"JSBNG__document\"));\n                this.flyoutHeightOffset += ((r.getElementPosition(x, y).y + r.getElementDimensions(x).y));\n            }\n        ;\n        ;\n        },\n        toggle: function(x) {\n            var y = this._findFlyout(x);\n            if (!y) {\n                return;\n            }\n        ;\n        ;\n            this.subscribe(\"init\", function() {\n                q.toggle(x);\n            });\n        },\n        show: function(x) {\n            this.subscribe(\"init\", function() {\n                q.show(x);\n            });\n        },\n        showNub: function(x) {\n            l.show(x);\n        },\n        hide: function(x) {\n            this.subscribe(\"init\", function() {\n                var y = q.getInstance(x);\n                ((n.contains(x, y.getActive()) && y.hide()));\n            });\n        },\n        hideNub: function(x) {\n            l.hide(x);\n            this.hide(x);\n        },\n        setUseMaxHeight: function(x, y) {\n            l.conditionClass(x, \"maxHeight\", ((y !== false)));\n            this._resizeNubFlyout(x);\n        },\n        _resizeNubFlyout: function(x) {\n            var y = this._findFlyout(x);\n            if (((!y || !((l.hasClass(x, \"openToggler\") || l.hasClass(x, \"opened\")))))) {\n                return;\n            }\n        ;\n        ;\n            var z = n.JSBNG__find(y, \"div.fbNubFlyoutOuter\"), aa = n.JSBNG__find(z, \"div.fbNubFlyoutInner\"), ba = n.JSBNG__find(aa, \"div.fbNubFlyoutBody\"), ca = ba.scrollTop, da = ba.offsetHeight;\n            p.set(ba, \"height\", \"auto\");\n            var ea = r.getElementDimensions(y), fa = r.getElementDimensions(ba), ga = this.getMaxFlyoutHeight(x);\n            p.set(y, \"max-height\", ((ga + \"px\")));\n            p.set(z, \"max-height\", ((ga + \"px\")));\n            ea = r.getElementDimensions(y);\n            var ha = r.getElementDimensions(aa), ia = ((ha.y - fa.y)), ja = ((ea.y - ia)), ka = parseInt(((ba.style.height || ba.clientHeight)), 10), la = ((ja !== ka));\n            if (((((ea.y > ia)) && la))) {\n                p.set(ba, \"height\", ((ja + \"px\")));\n            }\n        ;\n        ;\n            l.removeClass(y, \"swapDirection\");\n            var ma = r.getElementPosition(y).x;\n            l.conditionClass(y, \"swapDirection\", function() {\n                if (((ma < 0))) {\n                    return true;\n                }\n            ;\n            ;\n                return ((((ma + ea.x)) > this.viewportDimensions.x));\n            }.bind(this)());\n            if (((la && ((((ca + da)) >= fa.y))))) {\n                ba.scrollTop = ba.scrollHeight;\n            }\n             else ba.scrollTop = ca;\n        ;\n        ;\n            this.notifyNub(x, \"resize\");\n        },\n        getMaxFlyoutHeight: function(x) {\n            var y = this._findFlyout(x), z = r.getElementPosition(y, \"viewport\"), aa = r.getElementDimensions(y), ba = ((Math.max(this.MIN_HEIGHT, ((this.viewportDimensions.y - this.flyoutHeightOffset))) - ((((this.viewportDimensions.y - z.y)) - aa.y))));\n            return Math.max(ba, 0);\n        },\n        resizeAllFlyouts: function() {\n            var x = n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.openToggler\");\n            x = x.concat(n.scry(this.rootEl, \"div.-cx-PRIVATE-fbNub__root.opened\"));\n            var y = x.length;\n            while (y--) {\n                this._resizeNubFlyout(x[y]);\n            ;\n            };\n        ;\n        },\n        _onClick: function(JSBNG__event) {\n            var x = JSBNG__event.getTarget(), y = o.byClass(x, \"fbNub\");\n            if (y) {\n                if (o.byClass(x, \"fbNubFlyoutTitlebar\")) {\n                    var z = o.byTag(x, \"a\"), aa = ((((x.nodeName == \"INPUT\")) && ((x.getAttribute(\"type\") == \"submit\"))));\n                    if (((!z && !aa))) {\n                        this.hide(y);\n                        return false;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                this.notifyNub(y, \"click\");\n            }\n        ;\n        ;\n        },\n        _onWindowResize: function(JSBNG__event) {\n            this.calculateViewportDimensions();\n            this.resizeAllFlyouts();\n        },\n        _findFlyout: function(x) {\n            return ((l.hasClass(x, \"fbNubFlyout\") ? x : ((n.scry(x, \"div.fbNubFlyout\")[0] || null))));\n        },\n        registerNubController: function(x, y) {\n            m.set(x, \"dock:nub:controller\", y);\n            y.subscribe(\"nub/button/content-changed\", h(this.inform, this, \"resize\", x));\n            y.subscribe(\"nub/flyout/content-changed\", h(this._resizeNubFlyout, this, x));\n        },\n        unregisterNubController: function(x) {\n            m.remove(x, \"dock:nub:controller\");\n        },\n        notifyNub: function(x, y, z) {\n            var aa = m.get(x, \"dock:nub:controller\");\n            ((aa && aa.inform(y, z)));\n        }\n    });\n    e.exports = ((a.Dock || w));\n});\n__d(\"NubController\", [\"ArbiterMixin\",\"Dock\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"Dock\"), i = b(\"copyProperties\");\n    function j() {\n    \n    };\n;\n    i(j.prototype, g, {\n        init: function(k) {\n            this.el = k;\n            h.registerNubController(k, this);\n            return this;\n        },\n        buttonContentChanged: function() {\n            this.inform(\"nub/button/content-changed\");\n        },\n        flyoutContentChanged: function() {\n            this.inform(\"nub/flyout/content-changed\");\n        },\n        hide: function() {\n            h.hide(this.el);\n        },\n        show: function() {\n            h.show(this.el);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatApp\", [\"JSBNG__CSS\",\"JSLogger\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"JSLogger\"), i = false, j = false, k = false, l = null, m = {\n        init: function(n, o, p) {\n            if (l) {\n                h.create(\"chat_app\").error(\"repeated_init\");\n                return;\n            }\n        ;\n        ;\n            l = n;\n            d([\"TabsViewport\",\"ChatTabController\",\"ChatTabViewCoordinator\",\"MercuryServerRequests\",\"MercuryChannelHandler\",\"MercuryStateCheck\",], function(q, r, s, t, u, v) {\n                t.get().handleUpdate(p);\n                this.tabsViewport = new q(o);\n                this.tabController = new r(this.tabsViewport);\n                this.tabViewCoordinator = new s(o, this.tabsViewport);\n                i = j = true;\n            }.bind(this));\n        },\n        hide: function() {\n            if (((!i || k))) {\n                return;\n            }\n        ;\n        ;\n            g.hide(l);\n            k = true;\n        },\n        unhide: function() {\n            if (i) {\n                if (k) {\n                    g.show(l);\n                    this.tabsViewport.checkWidth();\n                    d([\"Dock\",], function(n) {\n                        n.resizeAllFlyouts();\n                    });\n                    k = false;\n                }\n            ;\n            ;\n            }\n             else if (!j) {\n                d([\"UIPagelet\",], function(n) {\n                    n.loadFromEndpoint(\"ChatTabsPagelet\", \"ChatTabsPagelet\");\n                    n.loadFromEndpoint(\"BuddylistPagelet\", \"BuddylistPagelet\");\n                });\n                j = true;\n            }\n            \n        ;\n        ;\n        }\n    };\n    e.exports = m;\n});\n__d(\"DataViewPolyfill\", [\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\");\n    function h(i, j, k) {\n        if (((j === undefined))) {\n            this._ba = new JSBNG__Uint8Array(i);\n        }\n         else if (((k === undefined))) {\n            this._ba = new JSBNG__Uint8Array(i, j);\n        }\n         else this._ba = new JSBNG__Uint8Array(i, j, k);\n        \n    ;\n    ;\n        this.byteLength = this._ba.byteLength;\n    };\n;\n    g(h, {\n        isSupported: function() {\n            return !!a.JSBNG__Uint8Array;\n        }\n    });\n    g(h.prototype, {\n        getUint8: function(i) {\n            if (((i >= this._ba.length))) {\n                throw new Error(\"Trying to read beyond bounds of DataViewPolyfill\");\n            }\n        ;\n        ;\n            return this._ba[i];\n        },\n        getUint16: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8(((i + 1)));\n            return ((j ? ((((l * 256)) + k)) : ((((k * 256)) + l))));\n        },\n        getUint32: function(i, j) {\n            var k = this.getUint8(i), l = this.getUint8(((i + 1))), m = this.getUint8(((i + 2))), n = this.getUint8(((i + 3)));\n            return ((j ? ((((((((((((n * 256)) + m)) * 256)) + l)) * 256)) + k)) : ((((((((((((k * 256)) + l)) * 256)) + m)) * 256)) + n))));\n        }\n    });\n    e.exports = h;\n});\n__d(\"getImageSize\", [\"DataViewPolyfill\",], function(a, b, c, d, e, f) {\n    var g = b(\"DataViewPolyfill\"), h = ((a.JSBNG__DataView || g));\n    function i(m) {\n        return {\n            width: m.getUint16(6, true),\n            height: m.getUint16(8, true)\n        };\n    };\n;\n    function j(m) {\n        return {\n            width: m.getUint32(16, false),\n            height: m.getUint32(20, false)\n        };\n    };\n;\n    function k(m) {\n        var n = m.byteLength, o = 2;\n        while (((o < n))) {\n            var p = m.getUint16(o, false);\n            o += 2;\n            if (((((p == 65472)) || ((p == 65474))))) {\n                return {\n                    width: m.getUint16(((o + 5)), false),\n                    height: m.getUint16(((o + 3)), false)\n                };\n            }\n             else o += m.getUint16(o, false);\n        ;\n        ;\n        };\n    ;\n        return null;\n    };\n;\n    function l(m) {\n        var n = new h(m);\n        if (((((n.getUint8(0) == 255)) && ((n.getUint8(1) == 216))))) {\n            return k(n);\n        }\n    ;\n    ;\n        if (((((((n.getUint8(0) == 71)) && ((n.getUint8(1) == 73)))) && ((n.getUint8(2) == 70))))) {\n            return i(n);\n        }\n    ;\n    ;\n        if (((((((((n.getUint8(0) == 137)) && ((n.getUint8(1) == 80)))) && ((n.getUint8(2) == 78)))) && ((n.getUint8(3) == 71))))) {\n            return j(n);\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    e.exports = l;\n    l.gif = i;\n    l.png = j;\n    l.jpeg = k;\n});\n__d(\"ChatAutoSendPhotoUploader\", [\"ArbiterMixin\",\"DOM\",\"JSBNG__Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachmentType\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getImageSize\",\"removeFromArray\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"FileForm\"), k = b(\"FileFormResetOnSubmit\"), l = b(\"FileInput\"), m = b(\"FormSubmitOnChange\"), n = b(\"MercuryAttachmentType\"), o = b(\"SubscriptionsHandler\"), p = b(\"copyProperties\"), q = b(\"csx\"), r = b(\"getImageSize\"), s = b(\"removeFromArray\"), t = b(\"shield\"), u = 0;\n    function v(w, x, y) {\n        this._idElem = y;\n        this._input = x;\n        this._subscriptionsHandler = new o();\n        this._uploadBatches = [];\n        var z = new j(w, [m,k,]), aa = h.JSBNG__find(w, \".-cx-PRIVATE-mercuryFileUploader__root\"), ba = h.JSBNG__find(aa, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new l(aa, ba, x);\n        this._subscriptionsHandler.addSubscriptions(z.subscribe(\"submit\", this._onFileSubmit.bind(this)), z.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), z.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), i.listen(ba, \"click\", t(this.inform, this, \"open\")));\n    };\n;\n    p(v.prototype, g, {\n        isUploading: function() {\n            return ((this._uploadBatches.length > 0));\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n        },\n        _getPreviewAttachment: function(w) {\n            var x = {\n                attach_type: n.PHOTO,\n                preview_uploading: true\n            };\n            if (w) {\n                x.preview_width = w.width;\n                x.preview_height = w.height;\n            }\n        ;\n        ;\n            return x;\n        },\n        _onFileSubmit: function() {\n            u += 1;\n            var w = ((\"upload_\" + u));\n            this._idElem.value = w;\n            this._uploadBatches.push(w);\n            if (((((((((typeof JSBNG__FileReader !== \"undefined\")) && JSBNG__FileReader.prototype.readAsArrayBuffer)) && this._input.files)) && ((this._input.files.length === 1))))) {\n                var x = new JSBNG__FileReader();\n                x.JSBNG__onload = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        preview_attachments: [this._getPreviewAttachment(r(x.result)),]\n                    });\n                }.bind(this);\n                x.JSBNG__onerror = function() {\n                    this.inform(\"submit\", {\n                        upload_id: w,\n                        preview_attachments: [this._getPreviewAttachment(null),]\n                    });\n                }.bind(this);\n                x.readAsArrayBuffer(this._input.files[0]);\n            }\n             else {\n                var y = 1;\n                if (this._input.files) {\n                    y = this._input.files.length;\n                }\n            ;\n            ;\n                var z = [];\n                for (var aa = 0; ((aa < y)); ++aa) {\n                    z.push(this._getPreviewAttachment(null));\n                ;\n                };\n            ;\n                this.inform(\"submit\", {\n                    upload_id: w,\n                    preview_attachments: z\n                });\n            }\n        ;\n        ;\n        },\n        _onFileUploadSuccess: function(JSBNG__event, w) {\n            var x = w.response.getPayload(), y = x.uploadID;\n            s(this._uploadBatches, y);\n            var z = [];\n            x.metadata.forEach(function(aa) {\n                z.push(aa.image_id);\n            });\n            this.inform(\"all-uploads-completed\", {\n                upload_id: x.uploadID,\n                image_ids: z\n            });\n        },\n        _onFileUploadFailure: function(JSBNG__event, w) {\n            var x = this._uploadBatches[((this._uploadBatches.length - 1))];\n            s(this._uploadBatches, x);\n            this.inform(\"all-uploads-failed\", {\n                upload_id: x\n            });\n        }\n    });\n    e.exports = v;\n});\n__d(\"VideoCallPromo\", [\"ArbiterMixin\",\"AsyncRequest\",\"ChatConfig\",\"ChatVisibility\",\"LegacyContextualDialog\",\"JSBNG__CSS\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"copyProperties\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"ChatConfig\"), j = b(\"ChatVisibility\"), k = b(\"LegacyContextualDialog\"), l = b(\"JSBNG__CSS\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"VideoCallCore\"), q = b(\"copyProperties\"), r = b(\"emptyFunction\");\n    function s() {\n        this._dialog = null;\n    };\n;\n    function t(v) {\n        if (!((p.isSupported() && i.get(\"video.show_promo\")))) {\n            return false;\n        }\n    ;\n    ;\n        var w = n.getCanonicalUserInThread(v);\n        if (!w) {\n            return false;\n        }\n    ;\n    ;\n        return ((j.isOnline() && p.availableForCall(w)));\n    };\n;\n    function u(v) {\n        new h().setURI(\"/ajax/chat/video/log_promo.php\").setData({\n            viewedUserID: v\n        }).setAllowCrossPageTransition(true).setErrorHandler(r).send();\n    };\n;\n    q(s.prototype, g);\n    q(s.prototype, {\n        render: function(v, w) {\n            var x = t(w);\n            if (!x) {\n                return;\n            }\n        ;\n        ;\n            var y = n.getCanonicalUserInThread(w);\n            m.get(((\"fbid:\" + y)), function(z) {\n                if (!z.call_promo) {\n                    return;\n                }\n            ;\n            ;\n                var aa = o[\":fb:mercury:call:promo\"].build();\n                this._dialog = new k();\n                this._dialog.init(aa.getRoot()).setWidth(250).setAlignH(\"center\").setContext(v).show();\n                l.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n                l.addClass(v, \"video_call_promo\");\n                u(n.getCanonicalUserInThread(w));\n                this.inform(\"chat/dialog-rendered\", {\n                    dialog: this,\n                    thread_id: w\n                });\n            }.bind(this));\n        },\n        updatePosition: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.updatePosition();\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = s;\n});\n__d(\"VideoCallTourDialog\", [\"ArbiterMixin\",\"LegacyContextualDialog\",\"JSBNG__CSS\",\"MercuryThreads\",\"ChatTabTemplates\",\"VideoCallCore\",\"VideoCallingTour\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"LegacyContextualDialog\"), i = b(\"JSBNG__CSS\"), j = b(\"MercuryThreads\").get(), k = b(\"ChatTabTemplates\"), l = b(\"VideoCallCore\"), m = b(\"VideoCallingTour\"), n = b(\"copyProperties\");\n    function o() {\n        this._dialog = null;\n    };\n;\n    n(o.prototype, g);\n    n(o.prototype, {\n        render: function(p, q) {\n            var r = j.getCanonicalUserInThread(q);\n            if (((!r || !l.availableForCall(r)))) {\n                return;\n            }\n        ;\n        ;\n            var s = k[\":fb:mercury:call:tour\"].build();\n            this._dialog = new h();\n            this._dialog.init(s.getRoot()).setWidth(250).setAlignH(\"center\").setContext(p).show();\n            i.addClass(this._dialog.getRoot(), \"uiContextualDialogWithFooterArrowBottom\");\n            i.addClass(p, \"video_call_tour\");\n            this.inform(\"chat/dialog-rendered\", {\n                dialog: this,\n                thread_id: q\n            });\n            m.inform(\"videocallingtour/end\");\n        },\n        updatePosition: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.updatePosition();\n            }\n        ;\n        ;\n        },\n        hide: function() {\n            if (((this._dialog && this._dialog.isShown()))) {\n                this._dialog.hide();\n                this._dialog = null;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = o;\n});\n__d(\"ChatContextualDialogController\", [\"JSBNG__Event\",\"ArbiterMixin\",\"ChatTabModel\",\"VideoCallingTour\",\"VideoCallPromo\",\"VideoCallTourDialog\",\"copyProperties\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"VideoCallingTour\"), k = b(\"VideoCallPromo\"), l = b(\"VideoCallTourDialog\"), m = b(\"copyProperties\"), n = b(\"setTimeoutAcrossTransitions\"), o = 60000, p = false, q = false, r = function(y, z) {\n        this._videoCallPromo = new k();\n        this._videoCallTour = new l();\n        this._threadID = y;\n        this._tabMainElement = z;\n        this._openDialog = null;\n        this._subscriptionTokens = [];\n        this._scrollListener = null;\n        this._timeout = null;\n    };\n    function s(y, JSBNG__event, z) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        }\n    ;\n    ;\n    };\n;\n    function t(y) {\n        if (y._openDialog) {\n            y._openDialog.updatePosition();\n        }\n    ;\n    ;\n    };\n;\n    function u(y) {\n        if (y._openDialog) {\n            y._openDialog.hide();\n            y._openDialog = null;\n        }\n    ;\n    ;\n        if (y._timeout) {\n            JSBNG__clearTimeout(y._timeout);\n            y._timeout = null;\n        }\n    ;\n    ;\n        while (y._subscriptionTokens.length) {\n            y._subscriptionTokens.pop().unsubscribe();\n        ;\n        };\n    ;\n        if (y._scrollListener) {\n            y._scrollListener.remove();\n            y._scrollListener = null;\n        }\n    ;\n    ;\n    };\n;\n    function v(y, JSBNG__event, z) {\n        if (((z.thread_id === y._threadID))) {\n            y._openDialog = z.dialog;\n            p = true;\n            x(y);\n            y._timeout = n(y.destroy.bind(y, y._threadID), o);\n            y._scrollListener = g.listen(window, \"JSBNG__scroll\", t.curry(y));\n        }\n    ;\n    ;\n    };\n;\n    function w(y, z) {\n        if (!y._openDialog) {\n            y._subscriptionTokens.push(z.subscribe(\"chat/dialog-rendered\", v.curry(y)));\n            z.render(y._tabMainElement, y._threadID);\n        }\n    ;\n    ;\n    };\n;\n    function x(y) {\n        y._subscriptionTokens.push(i.subscribe(\"chat/tabs-changed\", s.curry(y)), r.subscribe(\"dialog/close-all\", u.curry(y)));\n    };\n;\n    m(r, h);\n    m(r.prototype, {\n        destroy: function() {\n            u(this);\n        },\n        tabFocused: function() {\n            if (q) {\n                w(this, this._videoCallTour);\n                return;\n            }\n        ;\n        ;\n            if (!p) {\n                w(this, this._videoCallPromo);\n            }\n        ;\n        ;\n        },\n        tabNotActive: function() {\n            u(this);\n        },\n        hideVideoCallouts: function() {\n            u(this);\n        }\n    });\n    j.subscribe(\"videocallingtour/start\", function() {\n        q = true;\n        r.inform(\"dialog/close-all\");\n    });\n    j.subscribe(\"videocallingtour/end\", function() {\n        q = false;\n    });\n    e.exports = r;\n});\n__d(\"ChatPrivacyActionController\", [\"ChatVisibility\",\"JSLogger\",\"PresencePrivacy\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatVisibility\"), h = b(\"JSLogger\"), i = b(\"PresencePrivacy\"), j = b(\"copyProperties\"), k = function(l, m) {\n        this._userID = l;\n        this._logger = h.create(\"blackbird\");\n        this._getState = function() {\n            if (g.isOnline()) {\n                return ((i.allows(this._userID) ? k.NORMAL : k.BLOCKED));\n            }\n        ;\n        ;\n            return k.OFFLINE;\n        };\n        this._togglePrivacy = function() {\n            var n = this._getState();\n            switch (this._getState()) {\n              case k.OFFLINE:\n                if (g.isOnline()) {\n                    this._logger.error(\"tabs_already_online\");\n                    break;\n                }\n            ;\n            ;\n                this._logger.log(\"tabs_go_online\", {\n                    tab_id: this._userID\n                });\n                g.goOnline(function() {\n                    if (!i.allows(this._userID)) {\n                        if (((this._getState() !== k.BLOCKED))) {\n                            this._logger.error(\"privacy_action_controller_blocked_inconsistency\");\n                        }\n                    ;\n                    ;\n                        this._togglePrivacy();\n                    }\n                ;\n                ;\n                }.bind(this));\n                break;\n              case k.BLOCKED:\n                i.allow(this._userID);\n                this._logger.log(\"tabs_unblock\", {\n                    tab_id: this._userID\n                });\n                break;\n              case k.NORMAL:\n                i.disallow(this._userID);\n                this._logger.log(\"tabs_block\", {\n                    tab_id: this._userID\n                });\n                break;\n            };\n        ;\n        };\n        (function() {\n            var n = function() {\n                ((m && m(this._getState())));\n            }.bind(this);\n            n();\n            this._subscribeToken = i.subscribe(\"privacy-changed\", n);\n        }.bind(this)).defer();\n    };\n    k.OFFLINE = \"offline\";\n    k.BLOCKED = \"blocked\";\n    k.NORMAL = \"normal\";\n    j(k.prototype, {\n        togglePrivacy: function() {\n            this._logger.log(\"gear_menu_toggle_privacy\", {\n                tab_id: this._userID\n            });\n            this._togglePrivacy();\n        },\n        destroy: function() {\n            i.unsubscribe(this._subscribeToken);\n        }\n    });\n    e.exports = k;\n});\n__d(\"MercuryTypingIndicator\", [\"Animation\",\"JSBNG__CSS\",\"DOM\",\"MercuryTypingReceiver\",\"MercuryParticipants\",\"Style\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Tooltip\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"MercuryTypingReceiver\"), k = b(\"MercuryParticipants\"), l = b(\"Style\"), m = b(\"ChatTabTemplates\"), n = b(\"MercuryThreadInformer\").get(), o = b(\"Tooltip\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\"), s = [];\n    n.subscribe(\"messages-received\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            ((y && x.receivedMessages(y)));\n        });\n    });\n    j.subscribe(\"state-changed\", function(v, w) {\n        s.forEach(function(x) {\n            var y = w[x._threadID];\n            ((y && x._handleStateChanged(y)));\n        });\n    });\n    function t(v) {\n        var w = m[\":fb:chat:conversation:message-group\"].build(), x = m[\":fb:mercury:typing-indicator:typing\"].build();\n        h.addClass(w.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\");\n        var y = w.getNode(\"profileLink\");\n        o.set(y, v.JSBNG__name, \"left\");\n        y.href = v.href;\n        w.setNodeContent(\"profileName\", v.JSBNG__name);\n        w.setNodeProperty(\"profilePhoto\", \"src\", v.image_src);\n        var z = r._(\"{name} is typing...\", {\n            JSBNG__name: v.short_name\n        });\n        o.set(x.getRoot(), z, \"above\");\n        i.appendContent(w.getNode(\"messages\"), x.getRoot());\n        return w;\n    };\n;\n    function u(v, w, x) {\n        this._animations = {\n        };\n        this._activeUsers = {\n        };\n        this._typingIndicator = w;\n        this._messagesView = x;\n        this._threadID = v;\n        this._subscription = j.subscribe(\"state-changed\", function(y, z) {\n            var aa = z[this._threadID];\n            ((aa && this._handleStateChanged(aa)));\n        }.bind(this));\n        s.push(this);\n    };\n;\n    p(u.prototype, {\n        destroy: function() {\n            Object.keys(this._activeUsers).forEach(this._removeUserBubble.bind(this));\n            this._controller.destroy();\n            s.remove(this);\n        },\n        receivedMessages: function(v) {\n            v.forEach(function(w) {\n                if (!k.isAuthor(w.author)) {\n                    this._removeUserBubble(w.author);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _handleStateChanged: function(v) {\n            {\n                var fin289keys = ((window.top.JSBNG_Replay.forInKeys)((this._activeUsers))), fin289i = (0);\n                var w;\n                for (; (fin289i < fin289keys.length); (fin289i++)) {\n                    ((w) = (fin289keys[fin289i]));\n                    {\n                        if (((v.indexOf(w) === -1))) {\n                            this._slideOutUserBubble(w);\n                            delete this._activeUsers[w];\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            if (v.length) {\n                k.getMulti(v, function(x) {\n                    var y = this._messagesView.isScrolledToBottom(), z = {\n                    };\n                    {\n                        var fin290keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin290i = (0);\n                        var aa;\n                        for (; (fin290i < fin290keys.length); (fin290i++)) {\n                            ((aa) = (fin290keys[fin290i]));\n                            {\n                                var ba = this._activeUsers[aa];\n                                z[aa] = ((ba || t(x[aa]).getRoot()));\n                                if (!ba) {\n                                    i.appendContent(this._typingIndicator, z[aa]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    var ca = ((Object.keys(z).length > 0));\n                    ((y && this._messagesView.scrollToBottom(ca)));\n                    this._activeUsers = z;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _removeUserBubble: function(v, w) {\n            var x = this._getCurrentAnimation(v, w);\n            if (x) {\n                x.animation.JSBNG__stop();\n                i.remove(x.elem);\n                delete this._animations[v];\n            }\n        ;\n        ;\n            if (((v in this._activeUsers))) {\n                i.remove(this._activeUsers[v]);\n                delete this._activeUsers[v];\n            }\n        ;\n        ;\n            ((w && i.remove(w)));\n        },\n        _slideOutUserBubble: function(v) {\n            var w = this._activeUsers[v];\n            if (this._getCurrentAnimation(v, w)) {\n                return;\n            }\n             else if (w) {\n                l.set(w, \"overflow\", \"hidden\");\n                var x = (new g(w)).from(\"opacity\", 1).from(\"height\", w.offsetHeight).to(\"height\", 0).to(\"opacity\", 0).ease(g.ease.end).duration(250).ondone(this._removeUserBubble.bind(this, v, w)).go();\n                this._animations[v] = {\n                    animation: x,\n                    elem: w\n                };\n            }\n            \n        ;\n        ;\n        },\n        _getCurrentAnimation: function(v, w) {\n            if (((this._animations[v] && ((!w || ((this._animations[v].elem === w))))))) {\n                return this._animations[v];\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"ChatTabMessagesView\", [\"JSXDOM\",\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"MercuryAttachment\",\"MercuryAttachmentRenderer\",\"ChannelConstants\",\"ChatConfig\",\"ChatVisibility\",\"createArrayFrom\",\"JSBNG__CSS\",\"DOM\",\"Env\",\"JSBNG__Event\",\"JoinableConversationMessageFilter\",\"LiveTimer\",\"MercuryActionTypeConstants\",\"MercuryAPIArgsSource\",\"MercuryLastMessageIndicator\",\"MercuryLogMessageType\",\"MercurySourceType\",\"shield\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreads\",\"MercuryThreadlistConstants\",\"MercuryTypingIndicator\",\"MercuryMessageRenderer\",\"Parent\",\"MercuryParticipants\",\"React\",\"ServerTime\",\"MercuryStatusTemplates\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"Timestamp.react\",\"Tooltip\",\"UserAgent\",\"VideoCallCore\",\"copyProperties\",\"csx\",\"cx\",\"extendArray\",\"formatDate\",\"isRTL\",\"removeFromArray\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSXDOM\"), h = b(\"Animation\"), i = b(\"Arbiter\"), j = b(\"ArbiterMixin\"), k = b(\"MercuryAttachment\"), l = b(\"MercuryAttachmentRenderer\"), m = b(\"ChannelConstants\"), n = b(\"ChatConfig\"), o = b(\"ChatVisibility\"), p = b(\"createArrayFrom\"), q = b(\"JSBNG__CSS\"), r = b(\"DOM\"), s = b(\"Env\"), t = b(\"JSBNG__Event\"), u = b(\"JoinableConversationMessageFilter\"), v = b(\"LiveTimer\"), w = b(\"MercuryActionTypeConstants\"), x = b(\"MercuryAPIArgsSource\"), y = b(\"MercuryLastMessageIndicator\"), z = b(\"MercuryLogMessageType\"), aa = b(\"MercurySourceType\"), ba = b(\"shield\"), ca = b(\"MercuryMessages\").get(), da = b(\"MercuryServerRequests\").get(), ea = b(\"MercuryThreadMetadataRawRenderer\"), fa = b(\"MercuryThreadMetadataRenderer\").get(), ga = b(\"MercuryThreads\").get(), ha = b(\"MercuryThreadlistConstants\"), ia = b(\"MercuryTypingIndicator\"), ja = b(\"MercuryMessageRenderer\"), ka = b(\"Parent\"), la = b(\"MercuryParticipants\"), ma = b(\"React\"), na = b(\"ServerTime\"), oa = b(\"MercuryStatusTemplates\"), pa = b(\"Style\"), qa = b(\"SubscriptionsHandler\"), ra = b(\"ChatTabTemplates\"), sa = b(\"MercuryThreadInformer\").get(), ta = b(\"Timestamp.react\"), ua = b(\"Tooltip\"), va = b(\"UserAgent\"), wa = b(\"VideoCallCore\"), xa = b(\"copyProperties\"), ya = b(\"csx\"), za = b(\"cx\"), ab = b(\"extendArray\"), bb = b(\"formatDate\"), cb = b(\"isRTL\"), db = b(\"removeFromArray\"), eb = b(\"throttle\"), fb = b(\"tx\"), gb, hb = 34, ib = ((((1000 * 60)) * 60)), jb = 70, kb = null, lb = 20;\n    function mb(wb) {\n        return bb(new JSBNG__Date(wb), ((n.get(\"24h_times\") ? \"H:i\" : \"g:ia\")));\n    };\n;\n    function nb(wb) {\n        var xb = ra[\":fb:chat:conversation:message-group\"].build(), yb = xb.getNode(\"profileLink\"), zb = n.get(\"chat_tab_bubbles\"), ac = la.isAuthor(wb.author), bc = da.tokenizeThreadID(wb.thread_id), cc = ((bc.type !== \"user\")), dc = ((!ac || !zb));\n        if (!zb) {\n            xb.setNodeContent(\"timestamp\", mb(wb.timestamp));\n        }\n    ;\n    ;\n        q.conditionClass(xb.getRoot(), \"-cx-PRIVATE-fbChatMessage__fromothers\", ((!ac && zb)));\n        q.conditionClass(xb.getRoot(), \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\", ((((cc && !ac)) && zb)));\n        q.conditionShow(yb, dc);\n        la.get(wb.author, function(ec) {\n            if (dc) {\n                yb.href = ec.href;\n                var fc = ((ac ? \"You\" : ec.JSBNG__name));\n                if (((!ac && zb))) {\n                    fc = g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__tooltipcontainer\"\n                    }, g.div({\n                        className: \"-cx-PRIVATE-fbChatMessageGroup__timestamptooltip\"\n                    }, mb(wb.timestamp)), ec.JSBNG__name);\n                }\n            ;\n            ;\n                ua.set(yb, fc, \"left\");\n                if (((((!ac && zb)) && cc))) {\n                    xb.setNodeContent(\"profileName\", ec.JSBNG__name);\n                }\n            ;\n            ;\n                xb.setNodeProperty(\"profilePhoto\", \"src\", ec.image_src);\n            }\n        ;\n        ;\n        });\n        return xb;\n    };\n;\n    function ob(wb) {\n        var xb = ra[\":fb:chat:conversation:message:event\"].build(), yb = n.get(\"chat_tab_bubbles\"), zb = mb(wb.timestamp);\n        if (yb) {\n            xb.getRoot().setAttribute(\"title\", zb);\n        }\n         else xb.setNodeContent(\"timestamp\", zb);\n    ;\n    ;\n        ja.renderLogMessage(xb.getNode(\"icon\"), xb.getNode(\"message\"), xb.getNode(\"attachment\"), wb);\n        var ac = qb(wb);\n        if (ac) {\n            r.appendContent(xb.getNode(\"message\"), ac);\n        }\n    ;\n    ;\n        return xb.getRoot();\n    };\n;\n    function pb(wb, xb) {\n        if (!n.get(\"chat_tab_bubbles\")) {\n            return;\n        }\n    ;\n    ;\n        if (((kb === null))) {\n            var yb = xb.childNodes[0];\n            pa.set(xb, \"overflow\", \"JSBNG__scroll\");\n            kb = ((yb.clientWidth - jb));\n            pa.set(xb, \"overflow\", \"\");\n        }\n    ;\n    ;\n        if (!q.hasClass(wb, \"-cx-PRIVATE-fbChatMessage__root\")) {\n            var zb = r.scry(wb, \".-cx-PRIVATE-fbChatMessage__root\");\n            if (((zb.length === 1))) {\n                wb = zb[0];\n            }\n             else return\n        ;\n        }\n    ;\n    ;\n        pa.set(wb, \"max-width\", ((kb + \"px\")));\n        var ac, bc, cc = wb.firstChild;\n        if (((((wb.childNodes.length === 1)) && cc.getAttribute(\"data-measureme\")))) {\n            ac = cc.getClientRects();\n            var dc = cc.offsetHeight;\n            if (((((ac && ((ac.length > 1)))) && ((ac[0].height < dc))))) {\n                bc = true;\n                if (!gb) {\n                    r.remove(cc);\n                    gb = wb.offsetWidth;\n                    r.appendContent(wb, cc);\n                }\n            ;\n            ;\n                var ec = cc.offsetWidth, fc = ((((wb.offsetWidth - ec)) - gb));\n                if (((fc > 0))) {\n                    pa.set(wb, \"max-width\", ((ec + \"px\")));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        var gc = ka.byClass(wb, \"-cx-PRIVATE-fbChatMessageGroup__withprofilename\");\n        if (gc) {\n            q.conditionClass(gc, \"-cx-PRIVATE-fbChatMessageGroup__onelineunderprofilename\", ((ac ? !bc : ((wb.offsetHeight < hb)))));\n        }\n    ;\n    ;\n    };\n;\n    function qb(wb) {\n        var xb, yb;\n        if (((wb.log_message_type == z.VIDEO_CALL))) {\n            if (((wb.log_message_data.event_name == \"install_canceled\"))) {\n                xb = r.tx._(\"Retry setup and call back.\");\n                yb = \"callback_cancelinstall_link\";\n                return rb(xb, wb.thread_id, wb.log_message_data.to, yb);\n            }\n             else if (((((!wb.log_message_data.event_name && ((wb.log_message_data.callee == la.user)))) && !wb.log_message_data.answered))) {\n                xb = r.tx._(\"Call Back\");\n                yb = \"callback_link\";\n                return rb(xb, wb.thread_id, wb.log_message_data.caller.split(\":\")[1], yb);\n            }\n            \n        ;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function rb(wb, xb, yb, zb) {\n        if (wa.isSupported()) {\n            var ac = ((!o.isOnline() || !wa.availableForCall(yb))), bc = r.create(\"a\", {\n                href: \"#\",\n                className: \"callBackLink\"\n            }, wb);\n            if (ac) {\n                q.hide(bc);\n            }\n        ;\n        ;\n            bc.setAttribute(\"data-gt\", JSON.stringify({\n                videochat: \"clicked_callback_link\"\n            }));\n            t.listen(bc, \"click\", function() {\n                ub.inform(\"video-call-clicked\", {\n                    userID: yb,\n                    threadID: xb,\n                    clickSource: zb\n                });\n            });\n            return bc;\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    function sb(wb) {\n        var xb = ra[\":fb:mercury:chat:message:forward\"].build(), yb = xb.getNode(\"forwardText\");\n        if (yb) {\n            q.hide(xb.getRoot());\n            fa.renderTitanLink(wb.thread_id, xb.getNode(\"forwardLink\"), q.show.bind(q, xb.getRoot()));\n            if (((wb.forward_count > 1))) {\n                r.appendContent(yb, fb._(\"{count} forwarded messages\", {\n                    count: wb.forward_count\n                }));\n            }\n             else r.appendContent(yb, \"1 forwarded message\");\n        ;\n        ;\n        }\n    ;\n    ;\n        return xb.getRoot();\n    };\n;\n    var tb = [];\n    function ub(wb, xb, yb, zb, ac, bc, cc) {\n        this.loadingIcon = ac;\n        this.threadID = wb;\n        this.sheetController = xb;\n        this.scrollContainer = yb;\n        this.conversationElem = zb;\n        this.messageElements = {\n        };\n        this.messageGroup = null;\n        this.prevMessage = null;\n        v.restart(((na.get() / 1000)));\n        this._fetchMultiplier = 1;\n        this._oldestMessageDisplayedTimestamp = null;\n        this._loadingMoreMessages = false;\n        this._currentMessageCount = 0;\n        this._hasReachedClearedMessages = false;\n        var dc = ha.MESSAGE_TIMESTAMP_THRESHOLD;\n        this._oldestMessageDisplayedTimestamp = ((JSBNG__Date.now() - dc));\n        tb.push(this);\n        function ec() {\n            ub.inform(\"interaction-with-tab\", wb);\n        };\n    ;\n        this._subscriptions = new qa();\n        this._subscriptions.addSubscriptions(i.subscribe(\"overflow-applied-to-body\", this.scrollToBottom.bind(this)), t.listen(this.scrollContainer, \"mousedown\", ec));\n        if (va.firefox()) {\n            var fc = ((((\"JSBNG__WheelEvent\" in window)) ? \"wheel\" : \"DOMMouseScroll\"));\n            this.scrollContainer.JSBNG__addEventListener(fc, ec, false);\n        }\n         else this._subscriptions.addSubscriptions(t.listen(this.scrollContainer, \"mousewheel\", ec));\n    ;\n    ;\n        this._subscriptions.addSubscriptions(t.listen(this.scrollContainer, \"JSBNG__scroll\", eb(this.scrolling, 50, this)));\n        var gc = n.get(\"chat_tab_bubbles\");\n        this.lastMessageIndicator = new y(this.threadID, bc, gc, this);\n        if (gc) {\n            this.typingIndicator = new ia(this.threadID, cc, this);\n        }\n    ;\n    ;\n        ca.getThreadMessagesRange(this.threadID, 0, ha.RECENT_MESSAGES_LIMIT, this._updateTimestamp.bind(this));\n        this.rerender();\n    };\n;\n    xa(ub, j);\n    xa(ub.prototype, {\n        scrolling: function() {\n            if (((((((!this._loadingMoreMessages && this.isScrolledNearTop())) && !this.isScrolledToBottom())) && !this._hasReachedClearedMessages))) {\n                this.loadMoreMessages();\n            }\n        ;\n        ;\n            if (!this._newMessagesSheetOpened) {\n                return;\n            }\n        ;\n        ;\n            if (this.isScrolledToBottom()) {\n                this.sheetController.closeNewMessagesSheet();\n                this._newMessagesSheetOpened = false;\n            }\n        ;\n        ;\n        },\n        destroy: function() {\n            r.empty(this.conversationElem);\n            this._subscriptions.release();\n            db(tb, this);\n            ((this.lastMessageIndicator && this.lastMessageIndicator.destroy()));\n            this.destroyed = true;\n        },\n        _appendMessage: function(wb) {\n            if (((wb == this.prevMessage))) {\n                return;\n            }\n        ;\n        ;\n            var xb = ha, yb = xb.GROUPING_THRESHOLD, zb = ((((wb.action_type == w.LOG_MESSAGE)) && ((wb.log_message_type == z.SERVER_ERROR))));\n            if (wb.is_cleared) {\n                this._hasReachedClearedMessages = true;\n                return;\n            }\n        ;\n        ;\n            var ac;\n            if (((this.prevMessage !== null))) {\n                ac = ((wb.timestamp - this.prevMessage.timestamp));\n            }\n             else ac = Infinity;\n        ;\n        ;\n            if (((!zb && ((ac >= ib))))) {\n                var bc = Math.round(((wb.timestamp / 1000))), cc = wb.timestamp_datetime, dc = ra[\":fb:chat:conversation:date-break\"].build();\n                ma.renderComponent(ta({\n                    time: bc,\n                    verbose: cc,\n                    text: cc\n                }), dc.getNode(\"date\"));\n                r.appendContent(this.conversationElem, dc.getRoot());\n                this.messageGroup = null;\n            }\n        ;\n        ;\n            if (((wb.action_type == w.LOG_MESSAGE))) {\n                r.appendContent(this.conversationElem, ob(wb));\n                this.messageGroup = null;\n                this.prevMessage = wb;\n                return;\n            }\n        ;\n        ;\n            var ec = n.get(\"chat_tab_bubbles\");\n            if (((((((!this.messageGroup || ((ec && ((wb.author !== la.user)))))) || ((this.prevMessage.author != wb.author)))) || ((this.prevMessage.timestamp < ((wb.timestamp - yb))))))) {\n                this.messageGroup = nb(wb);\n                r.appendContent(this.conversationElem, this.messageGroup.getRoot());\n            }\n        ;\n        ;\n            var fc = this._makeSingleMessage(wb);\n            this.messageElements[wb.message_id] = fc;\n            r.appendContent(this.messageGroup.getNode(\"messages\"), fc);\n            pb(fc, this.scrollContainer);\n            this.prevMessage = wb;\n        },\n        rerender: function() {\n            if (!this._oldestMessageDisplayedTimestamp) {\n                return;\n            }\n        ;\n        ;\n            var wb = ((this._finishedFetchingMoreMessages && this.scrollContainer.scrollHeight)), xb = ((this._finishedFetchingMoreMessages && this.scrollContainer.scrollTop)), yb = this.isScrolledToBottom();\n            r.empty(this.conversationElem);\n            this.messageElements = {\n            };\n            this.messageGroup = null;\n            this.prevMessage = null;\n            var zb = ca.getThreadMessagesSinceTimestamp(this.threadID, this._oldestMessageDisplayedTimestamp);\n            this._renderOlderMessages(zb, wb, xb, yb);\n            this._finishedFetchingMoreMessages = false;\n        },\n        update: function(wb) {\n            {\n                var fin291keys = ((window.top.JSBNG_Replay.forInKeys)((wb))), fin291i = (0);\n                var xb;\n                for (; (fin291i < fin291keys.length); (fin291i++)) {\n                    ((xb) = (fin291keys[fin291i]));\n                    {\n                        var yb = this.messageElements[xb];\n                        if (yb) {\n                            var zb = this.isScrolledToBottom(), ac = this._makeSingleMessage(ca.getMessagesFromIDs([xb,])[0]);\n                            this.messageElements[xb] = ac;\n                            r.replace(yb, ac);\n                            pb(ac, this.scrollContainer);\n                            if (zb) {\n                                this.scrollToBottom();\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        },\n        _getLoadingHeight: function() {\n            return ((this.loadingHeight || this.loadingIcon.clientHeight));\n        },\n        _appendMessages: function(wb) {\n            wb.forEach(this._appendMessage.bind(this));\n            ((this.lastMessageIndicator && this.lastMessageIndicator.setLastMessage(this.prevMessage)));\n        },\n        _appendNewMessages: function(wb) {\n            wb = u.filterMessages(function(zb) {\n                this.sheetController.openUserJoinStatusSheet(zb);\n            }.bind(this), wb, true);\n            var xb = this.isScrolledToBottom(), yb = this._messagesOnlySentFromSelf(wb);\n            this._appendMessages(wb);\n            if (xb) {\n                this.scrollToBottom();\n            }\n             else if (!yb) {\n                this.sheetController.openNewMessagesSheet();\n                this._newMessagesSheetOpened = true;\n            }\n            \n        ;\n        ;\n        },\n        _messagesOnlySentFromSelf: function(wb) {\n            for (var xb = 0; ((xb < wb.length)); xb++) {\n                if (((wb[xb].author !== la.user))) {\n                    return false;\n                }\n            ;\n            ;\n            };\n        ;\n            return true;\n        },\n        _renderOlderMessages: function(wb, xb, yb, zb) {\n            if (!wb) {\n                return;\n            }\n        ;\n        ;\n            wb = u.filterMessages(function(ac) {\n                this.sheetController.openUserJoinStatusSheet(ac);\n            }.bind(this), wb, false);\n            this._appendMessages(wb);\n            if (zb) {\n                this.scrollToBottom();\n            }\n             else if (this._finishedFetchingMoreMessages) {\n                this.scrollToPosition(((((((this.scrollContainer.scrollHeight - xb)) - this.loadingHeight)) + yb)));\n            }\n            \n        ;\n        ;\n        },\n        _updateTimestamp: function(wb) {\n            if (((wb && wb.length))) {\n                this._oldestMessageDisplayedTimestamp = wb[0].timestamp;\n                this._currentMessageCount = wb.length;\n            }\n        ;\n        ;\n            this._loadingMoreMessages = false;\n            this._finishedFetchingMoreMessages = true;\n            q.hide(this.loadingIcon);\n        },\n        isScrolledToBottom: function() {\n            var wb = this.scrollContainer;\n            return ((((wb.scrollTop + wb.clientHeight)) >= ((wb.scrollHeight - lb))));\n        },\n        isScrolledNearTop: function() {\n            return ((this.scrollContainer.scrollTop < this.scrollContainer.clientHeight));\n        },\n        scrollToBottom: function(wb) {\n            this.scrollToPosition(this.scrollContainer.scrollHeight, wb);\n        },\n        scrollToPosition: function(wb, xb) {\n            ((this._scrollTopAnimation && this._scrollTopAnimation.JSBNG__stop()));\n            if (((xb === true))) {\n                this._scrollTopAnimation = (new h(this.scrollContainer)).to(\"scrollTop\", wb).ease(h.ease.end).duration(400).go();\n            }\n             else this.scrollContainer.scrollTop = wb;\n        ;\n        ;\n        },\n        loadMoreMessages: function() {\n            if (((ca.hasLoadedExactlyNMessages(this.threadID, this._currentMessageCount) && ca.hasLoadedAllMessages(this.threadID)))) {\n                return;\n            }\n        ;\n        ;\n            if (ga.isNewEmptyLocalThread(this.threadID)) {\n                return;\n            }\n        ;\n        ;\n            q.show(this.loadingIcon);\n            this.loadingHeight = this._getLoadingHeight();\n            this._loadingMoreMessages = true;\n            if (((this._fetchMultiplier < 10))) {\n                this._fetchMultiplier += 1;\n            }\n        ;\n        ;\n            var wb = ((ha.RECENT_MESSAGES_LIMIT * this._fetchMultiplier)), xb = ((this._currentMessageCount + wb)), yb = ca.hasLoadedNMessages(this.threadID, xb);\n            ca.getThreadMessagesRange(this.threadID, 0, xb, this._updateTimestamp.bind(this), null, x.CHAT);\n            if (yb) {\n                this.rerender();\n            }\n        ;\n        ;\n        },\n        _makeSingleMessage: function(wb) {\n            var xb = this._renderSingleMessage(wb);\n            q.addClass(xb, \"-cx-PRIVATE-fbChatMessage__singlemessage\");\n            return xb;\n        },\n        _renderSingleMessage: function(wb) {\n            var xb = ra[\":fb:chat:conversation:message\"].render(), yb = n.get(\"chat_tab_bubbles\");\n            if (((yb && la.isAuthor(wb.author)))) {\n                xb.setAttribute(\"title\", mb(wb.timestamp));\n            }\n        ;\n        ;\n            if (wb.subject) {\n                var zb = ra[\":fb:chat:conversation:message:subject\"].render();\n                r.setContent(zb, wb.subject);\n                r.appendContent(xb, zb);\n            }\n        ;\n        ;\n            function ac(ic) {\n                if (yb) {\n                    ic = r.create(\"span\", {\n                        \"data-measureme\": 1\n                    }, ic);\n                }\n            ;\n            ;\n                return ic;\n            };\n        ;\n            if (wb.is_filtered_content) {\n                var bc = oa[\":fb:mercury:filtered-message\"].build();\n                r.appendContent(xb, ac(bc.getRoot()));\n                return xb;\n            }\n        ;\n        ;\n            if (((wb.body.substr(0, 4) == \"?OTR\"))) {\n                r.setContent(xb, ac(\"[encrypted message]\"));\n                q.addClass(xb, \"-cx-PRIVATE-fbChatMessage__cyphertext\");\n            }\n             else {\n                q.addClass(xb, ((cb(wb.body) ? \"direction_rtl\" : \"direction_ltr\")));\n                var cc = ja.formatMessageBody(wb.body);\n                r.appendContent(xb, ac(cc));\n            }\n        ;\n        ;\n            if (wb.has_attachment) {\n                var dc = g.div(null), ec = this._appendMessageAttachments(dc, wb);\n                if (((((yb && !wb.body)) && !ec))) {\n                    return dc;\n                }\n            ;\n            ;\n                r.appendContent(xb, p(dc.childNodes));\n            }\n        ;\n        ;\n            if (wb.forward_count) {\n                r.appendContent(xb, sb(wb));\n            }\n        ;\n        ;\n            if (wb.is_spoof_warning) {\n                var fc = ra[\":fb:chat:conversation:message:undertext\"].build();\n                r.appendContent(fc.getNode(\"message\"), xb);\n                la.get(wb.author, function(ic) {\n                    fa.renderChatSpoofWarning(fc.getNode(\"JSBNG__status\"), wb.is_spoof_warning, ic);\n                });\n                return fc.getRoot();\n            }\n        ;\n        ;\n            var gc = ea.renderStatusIndicator(wb.JSBNG__status, wb.error_data, ba(ca.resendMessage, ca, wb));\n            if (gc) {\n                var hc = ra[\":fb:chat:conversation:message:status\"].build();\n                r.appendContent(hc.getNode(\"message\"), xb);\n                r.appendContent(hc.getNode(\"JSBNG__status\"), gc);\n                return hc.getRoot();\n            }\n        ;\n        ;\n            return xb;\n        },\n        _appendMessageAttachments: function(wb, xb) {\n            var yb = 0, zb = xb.attachments;\n            zb.sort(l.booleanLexicographicComparator([l.isPhotoAttachment,l.isShareAttachment,l.isFileAttachment,l.isErrorAttachment,]));\n            if (((xb.raw_attachments && ((xb.raw_attachments.length > 0))))) {\n                zb = k.convertRaw(xb.raw_attachments);\n            }\n        ;\n        ;\n            if (((((((xb.attachments.length === 0)) && xb.preview_attachments)) && ((xb.preview_attachments.length > 0))))) {\n                ab(zb, xb.preview_attachments);\n            }\n        ;\n        ;\n            var ac = l.renderPhotoAttachments(zb.filter(l.isPhotoAttachment), xb, 176, 4);\n            if (ac) {\n                r.appendContent(wb, ac);\n            }\n        ;\n        ;\n            for (var bc = 0; ((bc < zb.length)); bc++) {\n                if (l.isPhotoAttachment(zb[bc])) {\n                    yb = 1;\n                    continue;\n                }\n            ;\n            ;\n                var cc = l.renderAttachment(true, zb[bc], xb);\n                ((cc.error && r.appendContent(wb, cc.error)));\n                ((cc.JSBNG__content && r.appendContent(wb, cc.JSBNG__content)));\n                yb |= cc.bubblePreferred;\n            };\n        ;\n            var dc = r.scry(wb, \"img\");\n            dc.forEach(function(ec) {\n                this._subscriptions.addSubscriptions(t.listen(ec, \"load\", ba(this._thumbLoaded, this, ec)));\n            }.bind(this));\n            return !!yb;\n        },\n        _thumbLoaded: function(wb) {\n            var xb = ((this.scrollContainer.scrollTop + this.scrollContainer.clientHeight));\n            if (((((xb + wb.offsetHeight)) >= this.scrollContainer.scrollHeight))) {\n                this.scrollToBottom();\n            }\n        ;\n        ;\n        }\n    });\n    sa.subscribe(\"messages-reordered\", function(wb, xb) {\n        tb.forEach(function(yb) {\n            ((xb[yb.threadID] && yb.rerender()));\n        });\n    });\n    sa.subscribe(\"messages-updated\", function(wb, xb) {\n        tb.forEach(function(yb) {\n            ((xb[yb.threadID] && yb.update(xb[yb.threadID])));\n        });\n    });\n    sa.subscribe(\"messages-received\", function(wb, xb) {\n        tb.forEach(function(yb) {\n            var zb = xb[yb.threadID];\n            if (((zb && zb.length))) {\n                yb._currentMessageCount += zb.length;\n            }\n        ;\n        ;\n            ((zb && yb._appendNewMessages(zb)));\n        });\n    });\n    i.subscribe(m.getArbiterType(\"chat_event\"), function(wb, xb) {\n        if (vb(xb.obj)) {\n            var yb = ((((s.user == xb.obj.from)) ? xb.obj.to : xb.obj.from)), zb = ga.getThreadIdForUser(yb), ac = tb.filter(function(dc) {\n                return ((dc.threadID === zb));\n            });\n            if (((ac.length > 0))) {\n                var bc = ac[0], cc = ca.constructLogMessageObject(aa.CHAT_WEB, zb, z.VIDEO_CALL, xb.obj);\n                cc.author = ((\"fbid:\" + xb.obj.from));\n                bc._appendNewMessages([cc,]);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    function vb(wb) {\n        return ((((wb.event_name === \"installing\")) || ((wb.event_name === \"install_canceled\"))));\n    };\n;\n    e.exports = ub;\n});\n__d(\"MercuryPeopleSuggestions\", [\"KeyedCallbackManager\",\"MercuryServerDispatcher\",\"OrderedFriendsList\",\"ShortProfiles\",\"arrayContains\",], function(a, b, c, d, e, f) {\n    var g = b(\"KeyedCallbackManager\"), h = b(\"MercuryServerDispatcher\"), i = b(\"OrderedFriendsList\"), j = b(\"ShortProfiles\"), k = b(\"arrayContains\"), l = new g(), m = 6;\n    function n(s) {\n        return s.sort().join(\",\");\n    };\n;\n    function o(s, t) {\n        if (((s.length < m))) {\n            var u = i.getList();\n            for (var v = 0; ((v < u.length)); v++) {\n                if (!((k(s, u[v]) || k(t, u[v])))) {\n                    s.push(u[v]);\n                    if (((s.length >= m))) {\n                        break;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function p(s) {\n        h.trySend(\"/ajax/chat/people_suggest.php\", s);\n    };\n;\n    function q(s, t, u) {\n        s = s.filter(function(w) {\n            return !k(t, w);\n        });\n        var v = o(s, t);\n        j.getMulti(v, function() {\n            u(v);\n        });\n    };\n;\n    var r = {\n        getPeopleSuggestions: function(s, t) {\n            if (s) {\n                if (s.length) {\n                    var u = n(s), v = l.executeOrEnqueue(u, function(x) {\n                        q(x, s, t);\n                    }), w = l.getUnavailableResources(v);\n                    if (w.length) {\n                        p({\n                            query: u,\n                            size: m\n                        });\n                    }\n                ;\n                ;\n                    return v;\n                }\n                 else q([], [], t);\n            ;\n            }\n        ;\n        ;\n            return 0;\n        },\n        handleUpdate: function(s) {\n            if (s.query) {\n                var t = ((s.suggestions || \"\")), u = ((t.length ? t.split(\",\") : []));\n                l.setResource(s.query, u);\n            }\n        ;\n        ;\n        }\n    };\n    h.registerEndpoints({\n        \"/ajax/chat/people_suggest.php\": {\n            mode: h.IMMEDIATE,\n            handler: r.handleUpdate\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatTabPeopleSuggestionView\", [\"ChatPeopleSuggestionList.react\",\"ChatQuietLinks\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"MercuryPeopleSuggestions\",\"MercuryIDs\",\"React\",\"ShortProfiles\",\"Style\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPeopleSuggestionList.react\"), h = b(\"ChatQuietLinks\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"MercuryPeopleSuggestions\"), m = b(\"MercuryIDs\"), n = b(\"React\"), o = b(\"ShortProfiles\"), p = b(\"Style\"), q = b(\"copyProperties\");\n    function r(s, t, u) {\n        this.sheetController = s;\n        this.viewNode = t;\n        this.loadingIcon = u;\n        this.addFriendsSheet = s.getAddFriendsTabSheet();\n        this.mercuryTypeahead = ((this.addFriendsSheet && this.addFriendsSheet._typeahead));\n        this.typeaheadInput = ((this.mercuryTypeahead && this.mercuryTypeahead._input));\n        this.typeaheadView = ((this.mercuryTypeahead && this.mercuryTypeahead.getTypeahead().getView()));\n        var v = this.showSuggestions.bind(this);\n        if (this.typeaheadInput) {\n            k.listen(this.typeaheadInput, \"JSBNG__focus\", v);\n        }\n    ;\n    ;\n        if (this.typeaheadView) {\n            this.typeaheadView.subscribe(\"reset\", v);\n            this.typeaheadView.subscribe(\"render\", this.clearSuggestions.bind(this));\n        }\n    ;\n    ;\n        this.tokenizer = ((this.mercuryTypeahead && this.mercuryTypeahead.getTokenizer()));\n        if (this.tokenizer) {\n            this.tokenizer.subscribe(\"removeToken\", v);\n        }\n    ;\n    ;\n        this.showSuggestions();\n    };\n;\n    q(r.prototype, {\n        addSelectedParticipant: function(s) {\n            var t = o.getNow(s);\n            if (((t && this.tokenizer))) {\n                this.tokenizer.addToken(this.tokenizer.createToken({\n                    uid: s,\n                    text: t.JSBNG__name\n                }));\n                this.showSuggestions();\n            }\n        ;\n        ;\n        },\n        showSuggestions: function() {\n            if (this.mercuryTypeahead) {\n                var s = this.mercuryTypeahead.getSelectedParticipantIDs();\n                s = s.map(m.getUserIDFromParticipantID);\n                j.empty(this.viewNode);\n                i.show(this.loadingIcon);\n                l.getPeopleSuggestions(s, function(t) {\n                    var u = g({\n                        uids: t,\n                        onClick: this.addSelectedParticipant.bind(this)\n                    });\n                    i.hide(this.loadingIcon);\n                    n.renderComponent(u, this.viewNode);\n                    h.removeAllHrefs(this.viewNode);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        clearSuggestions: function() {\n            j.empty(this.viewNode);\n            i.hide(this.loadingIcon);\n            p.set(this.viewNode, \"margin-top\", 0);\n        },\n        destroy: function() {\n            this.clearSuggestions();\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatAddFriendsTabSheetRawRenderer\", [\"ContextualTypeaheadView\",\"DOM\",\"JSBNG__Event\",\"MercuryTypeahead\",\"ChatTabTemplates\",\"tx\",\"MercuryDataSourceWrapper\",], function(a, b, c, d, e, f) {\n    var g = b(\"ContextualTypeaheadView\"), h = b(\"DOM\"), i = b(\"JSBNG__Event\"), j = b(\"MercuryTypeahead\"), k = b(\"ChatTabTemplates\"), l = b(\"tx\"), m = b(\"MercuryDataSourceWrapper\").source, n = {\n        render: function(o, p, q, r, s, t) {\n            var u = ((t ? k[\":fb:mercury:chat:tab-sheet:add-friends-empty-tab\"].build() : k[\":fb:mercury:chat:tab-sheet:add-friends\"].build())), v = new j(m, g);\n            v.setExcludedParticipants(r.participants);\n            if (!t) {\n                v.setPlaceholder(\"Add friends to this chat\");\n            }\n        ;\n        ;\n            v.build();\n            h.replace(u.getNode(\"participantsTypeahead\"), v.getElement());\n            h.setContent(q, u.getRoot());\n            v.getTokenizer().adjustWidth();\n            v.JSBNG__focus();\n            if (!t) {\n                var w = function() {\n                    var x = v.getSelectedParticipantIDs();\n                    if (x.length) {\n                        s(x);\n                    }\n                ;\n                ;\n                    p.close(o);\n                };\n                i.listen(u.getNode(\"doneButton\"), \"click\", w);\n            }\n        ;\n        ;\n            return v;\n        }\n    };\n    e.exports = n;\n});\n__d(\"MultiChatController\", [\"Arbiter\",\"AsyncSignal\",\"copyProperties\",\"Form\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncSignal\"), i = b(\"copyProperties\"), j = b(\"Form\"), k = b(\"MercuryMessages\").get(), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get();\n    function n() {\n    \n    };\n;\n    i(n, {\n        subscribe: function(o, p) {\n            o.subscribe(\"JSBNG__confirm\", function() {\n                this.createGroupThreadFromChooserDialog(o, p);\n            }.bind(this));\n        },\n        createGroupThreadFromChooserDialog: function(o, p) {\n            var q = j.serialize(o.getRoot()), r = JSON.parse(q.profileChooserItems), s = [];\n            {\n                var fin292keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin292i = (0);\n                var t;\n                for (; (fin292i < fin292keys.length); (fin292i++)) {\n                    ((t) = (fin292keys[fin292i]));\n                    {\n                        if (r[t]) {\n                            s.push(t);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var u = n.createThreadForFBIDs(s);\n            l.subscribe(\"update-thread-ids\", function(v, w) {\n                {\n                    var fin293keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin293i = (0);\n                    var x;\n                    for (; (fin293i < fin293keys.length); (fin293i++)) {\n                        ((x) = (fin293keys[fin293i]));\n                        {\n                            if (((w[x] == u))) {\n                                new h(\"/ajax/groups/chat/log\", {\n                                    group_id: p,\n                                    message_id: x\n                                }).send();\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n            });\n            o.hide();\n        },\n        createThreadForTokens: function(o) {\n            if (!o.length) {\n                return;\n            }\n        ;\n        ;\n            var p;\n            if (((o.length == 1))) {\n                p = ((\"user:\" + o[0].split(\":\")[1]));\n            }\n             else p = ((\"root:\" + k.generateNewClientMessageID(JSBNG__Date.now())));\n        ;\n        ;\n            m.createNewLocalThread(p, o);\n            g.inform(\"chat/open-tab\", {\n                thread_id: p\n            });\n            return p;\n        },\n        createThreadForFBIDs: function(o) {\n            var p = [];\n            for (var q = 0; ((q < o.length)); q++) {\n                p.push(((\"fbid:\" + o[q])));\n            ;\n            };\n        ;\n            return n.createThreadForTokens(p);\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatAddFriendsTabSheet\", [\"Arbiter\",\"ChatAddFriendsTabSheetRawRenderer\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MultiChatController\",\"Style\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatAddFriendsTabSheetRawRenderer\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercurySourceType\"), k = b(\"MercuryMessages\").get(), l = b(\"MultiChatController\"), m = b(\"Style\"), n = b(\"MercuryThreads\").get(), o = b(\"copyProperties\");\n    function p(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._sheetView = u;\n        this._typeahead = null;\n    };\n;\n    o(p.prototype, {\n        render: function() {\n            n.getThreadMeta(this._threadID, function(s) {\n                var t = ((s.is_canonical_user ? q : r));\n                this._typeahead = h.render(this, this._sheetView, this._rootElement, s, t.curry(s), n.isNewEmptyLocalThread(this._threadID));\n                this._typeahead.subscribe(\"resize\", function() {\n                    this._sheetView.resize();\n                }.bind(this));\n            }.bind(this));\n        },\n        getParticipants: function() {\n            if (!this._typeahead) {\n                return null;\n            }\n        ;\n        ;\n            return this._typeahead.getSelectedParticipantIDs();\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"add_friends_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        },\n        getHeight: function() {\n            return m.get(this._rootElement, \"height\");\n        }\n    });\n    function q(s, t) {\n        var u = s.participants;\n        l.createThreadForTokens(u.concat(t));\n    };\n;\n    function r(s, t) {\n        var u = s.thread_id;\n        if (n.isEmptyLocalThread(u)) {\n            n.addParticipantsToThreadLocally(u, t);\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n         else {\n            k.sendMessage(k.constructLogMessageObject(j.CHAT_WEB, u, i.SUBSCRIBE, {\n                added_participants: t\n            }));\n            g.inform(\"chat/open-tab\", {\n                thread_id: u\n            });\n        }\n    ;\n    ;\n    };\n;\n    e.exports = p;\n});\n__d(\"ChatNameConversationTabSheetRawRenderer\", [\"DOM\",\"JSBNG__Event\",\"Input\",\"Keys\",\"ChatTabTemplates\",\"fbt\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"JSBNG__Event\"), i = b(\"Input\"), j = b(\"Keys\"), k = b(\"ChatTabTemplates\"), l = b(\"fbt\"), m = {\n        render: function(n, o, p, q, r, s) {\n            var t = k[\":fb:mercury:chat:tab-sheet:name-conversation\"].build(), u = t.getNode(\"nameInput\"), v = t.getNode(\"doneButton\"), w = \"Done\", x = \"Hide\", y = q.JSBNG__name;\n            if (y) {\n                i.setValue(u, y);\n            }\n             else g.setContent(v, x);\n        ;\n        ;\n            var z = function() {\n                var aa = i.getValue(u);\n                if (aa) {\n                    r(aa);\n                }\n            ;\n            ;\n                s();\n                o.close(n);\n            };\n            h.listen(u, \"input\", function() {\n                g.setContent(v, ((((i.getValue(u).length === 0)) ? x : w)));\n            });\n            h.listen(v, \"click\", z);\n            h.listen(u, \"keyup\", function(aa) {\n                if (((aa.keyCode === j.RETURN))) {\n                    z();\n                    return false;\n                }\n            ;\n            ;\n            });\n            g.setContent(p, t.getRoot());\n            ((!n.isAutomatic() && u.JSBNG__focus()));\n        }\n    };\n    e.exports = m;\n});\n__d(\"ChatNameConversationTabSheet\", [\"AsyncRequest\",\"ChatNameConversationTabSheetRawRenderer\",\"MercuryAPIArgsSource\",\"MercuryLogMessageType\",\"MercurySourceType\",\"MercuryMessages\",\"MercuryServerRequests\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"ChatNameConversationTabSheetRawRenderer\"), i = b(\"MercuryAPIArgsSource\"), j = b(\"MercuryLogMessageType\"), k = b(\"MercurySourceType\"), l = b(\"MercuryMessages\").get(), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = \"/ajax/chat/multichat/name_conversation/dismiss.php\";\n    function p(q, r, s) {\n        this.$ChatNameConversationTabSheet0 = q;\n        this.$ChatNameConversationTabSheet1 = r;\n        this.$ChatNameConversationTabSheet2 = s;\n        this.$ChatNameConversationTabSheet3 = false;\n        this.$ChatNameConversationTabSheet4 = false;\n    };\n;\n    p.prototype.render = function() {\n        n.getThreadMeta(this.$ChatNameConversationTabSheet0, function(q) {\n            h.render(this, this.$ChatNameConversationTabSheet2, this.$ChatNameConversationTabSheet1, q, this.$ChatNameConversationTabSheet5.curry(q), this.$ChatNameConversationTabSheet6.bind(this, q));\n            this.$ChatNameConversationTabSheet2.resize();\n        }.bind(this));\n    };\n    p.prototype.isPermanent = function() {\n        return true;\n    };\n    p.prototype.getType = function() {\n        return \"name_conversation_type\";\n    };\n    p.prototype.open = function(q) {\n        this.$ChatNameConversationTabSheet3 = q;\n        if (!((this.$ChatNameConversationTabSheet3 && this.$ChatNameConversationTabSheet4))) {\n            this.$ChatNameConversationTabSheet2.open(this);\n        }\n    ;\n    ;\n    };\n    p.prototype.close = function() {\n        this.$ChatNameConversationTabSheet2.close(this);\n    };\n    p.prototype.isAutomatic = function() {\n        return this.$ChatNameConversationTabSheet3;\n    };\n    p.prototype.$ChatNameConversationTabSheet6 = function(q) {\n        if (((!q.name_conversation_sheet_dismissed || !this.$ChatNameConversationTabSheet4))) {\n            this.$ChatNameConversationTabSheet4 = true;\n            m.getServerThreadID(q.thread_id, function(r) {\n                new g(o).setData({\n                    thread_id: r\n                }).send();\n            });\n        }\n    ;\n    ;\n    };\n    p.prototype.$ChatNameConversationTabSheet5 = function(q, r) {\n        var s = q.JSBNG__name;\n        if (((((r || s)) && ((r != s))))) {\n            l.sendMessage(l.constructLogMessageObject(k.CHAT_WEB, q.thread_id, j.THREAD_NAME, {\n                JSBNG__name: r\n            }), null, i.CHAT);\n        }\n    ;\n    ;\n    };\n    e.exports = p;\n});\n__d(\"ChatNewMessagesTabSheet\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n;\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:clickable-message-icon-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"Scroll down to see new messages.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getRoot(), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"new_messages_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatNoRecipientsTabSheet\", [\"DOM\",\"fbt\",\"MercuryParticipants\",\"ChatTabTemplates\",\"MercuryThreadInformer\",\"MercuryThreads\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"fbt\"), i = b(\"MercuryParticipants\"), j = b(\"ChatTabTemplates\"), k = b(\"MercuryThreadInformer\").get(), l = b(\"MercuryThreads\").get(), m = b(\"copyProperties\");\n    function n(o, p, q) {\n        this._threadID = o;\n        this._rootElement = p;\n        this._sheetView = q;\n        k.subscribe(\"threads-updated\", this._handleThreadsUpdated.bind(this));\n    };\n;\n    m(n.prototype, {\n        render: function() {\n            var o = j[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(o.getNode(\"text\"), \"Everyone has left the conversation.\");\n            g.setContent(this._rootElement, o.getRoot());\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"no_recipients_type\";\n        },\n        _handleThreadsUpdated: function() {\n            l.getThreadMeta(this._threadID, function(o) {\n                var p = i.user, q = o.participants.filter(function(r) {\n                    return ((r != p));\n                });\n                if (((((((q.length < 1)) && !o.is_joinable)) && !l.isNewEmptyLocalThread(this._threadID)))) {\n                    this._sheetView.open(this);\n                }\n                 else this._sheetView.close(this);\n            ;\n            ;\n            }.bind(this));\n        }\n    });\n    e.exports = n;\n});\n__d(\"ChatOfflineTabSheet\", [\"ChatPrivacyActionController\",\"ChatVisibility\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"ChatVisibility\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\");\n    function r(s, t, u) {\n        this._rootElement = t;\n        this._sheetView = u;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(s);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    p(r.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"offline_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n        ;\n            var s = o[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build(), t = ((\"fbid:\" + this._canonicalUser));\n            m.get(t, function(u) {\n                var v = \"fbChatGoOnlineLink\", w = j.tx._(\"turn on chat\"), x = j.create(\"a\", {\n                    href: \"#\",\n                    className: v\n                }, w), y = j.tx._(\"To chat with {name} and other friends, {link}.\", {\n                    JSBNG__name: u.short_name,\n                    link: x\n                });\n                j.setContent(s.getNode(\"text\"), y);\n                i.addClass(s.getRoot(), \"-cx-PRIVATE-chatTabSheet__chatoffline\");\n                j.setContent(this._rootElement, s.getRoot());\n                k.listen(this._rootElement, \"click\", function(JSBNG__event) {\n                    if (i.hasClass(JSBNG__event.getTarget(), v)) {\n                        if (h.isOnline()) {\n                            this._logger.error(\"tab_sheet_already_online\");\n                        }\n                    ;\n                    ;\n                        this._privacyActionController.togglePrivacy();\n                        this._logger.log(\"tab_sheet_go_online\", {\n                            tab_id: this._canonicalUser\n                        });\n                        return false;\n                    }\n                ;\n                ;\n                }.bind(this));\n                this._sheetView.resize();\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(s) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            }\n        ;\n        ;\n            switch (s) {\n              case g.OFFLINE:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.BLOCKED:\n                this._sheetView.close(this);\n                break;\n            };\n        ;\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"offline_type\";\n        },\n        destroy: function() {\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n        }\n    });\n    e.exports = r;\n});\n__d(\"ChatUploadWarningTabSheet\", [\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ChatTabTemplates\"), i = b(\"copyProperties\");\n    function j(k, l, m) {\n        this._threadID = k;\n        this._rootElement = l;\n        this._sheetView = m;\n    };\n;\n    i(j.prototype, {\n        render: function() {\n            var k = h[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"].build();\n            g.setContent(k.getNode(\"text\"), g.tx._(\"Please wait until the upload is complete before you send your message.\"));\n            g.setContent(this._rootElement, k.getRoot());\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"upload_warning_type\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = j;\n});\n__d(\"ChatThreadIsMutedTabSheet\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"ChatTabTemplates\"), k = b(\"copyProperties\");\n    function l(m, n, o) {\n        this._threadID = m;\n        this._rootElement = n;\n        this._sheetView = o;\n    };\n;\n    k(l.prototype, h, {\n        render: function() {\n            var m = j[\":fb:mercury:chat:tab-sheet:message-mute-sheet\"].build();\n            i.setContent(m.getNode(\"text\"), i.tx._(\"This conversation is muted. Chat tabs will not pop up for it and push notifications are off.\"));\n            i.setContent(this._rootElement, m.getRoot());\n            g.listen(m.getNode(\"unmuteButton\"), \"click\", function() {\n                this.inform(\"clicked\", this._threadID);\n            }.bind(this));\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getType: function() {\n            return \"chat-thread-is-muted\";\n        },\n        open: function() {\n            this._sheetView.open(this);\n        },\n        close: function() {\n            this._sheetView.close(this);\n        }\n    });\n    e.exports = l;\n});\n__d(\"ChatUserBlockedTabSheet\", [\"ChatPrivacyActionController\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"GenderConst\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreads\",\"ChatTabTemplates\",\"copyProperties\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatPrivacyActionController\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"JSBNG__Event\"), k = b(\"GenderConst\"), l = b(\"JSLogger\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryThreads\").get(), o = b(\"ChatTabTemplates\"), p = b(\"copyProperties\"), q = b(\"cx\"), r = b(\"tx\");\n    function s(t, u, v) {\n        this._rootElement = u;\n        this._sheetView = v;\n        this._logger = l.create(\"blackbird\");\n        this._canonicalUser = n.getCanonicalUserInThread(t);\n        if (this._canonicalUser) {\n            this._privacyActionController = new g(this._canonicalUser, this._handlePrivacyChange.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    p(s.prototype, {\n        render: function() {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_open_with_non_friend\");\n                return;\n            }\n        ;\n        ;\n            var t = o[\":fb:mercury:chat:tab-sheet:user-blocked\"].build(), u = ((\"fbid:\" + this._canonicalUser));\n            m.get(u, function(v) {\n                var w = null;\n                switch (v.gender) {\n                  case k.FEMALE_SINGULAR:\n                \n                  case k.FEMALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send her a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                    break;\n                  case k.MALE_SINGULAR:\n                \n                  case k.MALE_SINGULAR_GUESS:\n                    w = r._(\"You turned off chat for {name} but you can still send him a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                    break;\n                  default:\n                    w = r._(\"You turned off chat for {name} but you can still send them a message. \", {\n                        JSBNG__name: v.short_name\n                    });\n                };\n            ;\n                i.setContent(t.getNode(\"text\"), w);\n                var x = r._(\"Turn on chat for {name}?\", {\n                    JSBNG__name: v.short_name\n                });\n                i.setContent(t.getNode(\"actionLink\"), x);\n                h.addClass(t.getRoot(), \"-cx-PRIVATE-chatTabSheet__blocked\");\n                i.setContent(this._rootElement, t.getRoot());\n                j.listen(t.getNode(\"actionLink\"), \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController));\n                this._sheetView.resize();\n            }.bind(this));\n        },\n        _handlePrivacyChange: function(t) {\n            if (!this._canonicalUser) {\n                this._logger.error(\"user_blocked_sheet_privacy_changed_non_friend\");\n            }\n        ;\n        ;\n            switch (t) {\n              case g.BLOCKED:\n                this._sheetView.open(this);\n                break;\n              case g.NORMAL:\n            \n              case g.OFFLINE:\n                this._sheetView.close(this);\n                break;\n            };\n        ;\n        },\n        isPermanent: function() {\n            return true;\n        },\n        getType: function() {\n            return \"user_blocked_type\";\n        },\n        destroy: function() {\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatUserJoinStatusTabSheet\", [\"Class\",\"JoinStatusTabSheet\",\"ChatTabTemplates\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JoinStatusTabSheet\"), i = b(\"ChatTabTemplates\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, h);\n    j(k.prototype, {\n        _getTemplate: function() {\n            return i[\":fb:mercury:chat:tab-sheet:message-icon-sheet\"];\n        }\n    });\n    e.exports = k;\n});\n__d(\"ChatTabSheetController\", [\"ChatAddFriendsTabSheet\",\"ChatNameConversationTabSheet\",\"ChatNewMessagesTabSheet\",\"ChatNoRecipientsTabSheet\",\"ChatOfflineTabSheet\",\"ChatUploadWarningTabSheet\",\"ChatThreadIsMutedTabSheet\",\"ChatUserBlockedTabSheet\",\"ChatUserJoinStatusTabSheet\",\"copyProperties\",\"MercurySheetView\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatAddFriendsTabSheet\"), h = b(\"ChatNameConversationTabSheet\"), i = b(\"ChatNewMessagesTabSheet\"), j = b(\"ChatNoRecipientsTabSheet\"), k = b(\"ChatOfflineTabSheet\"), l = b(\"ChatUploadWarningTabSheet\"), m = b(\"ChatThreadIsMutedTabSheet\"), n = b(\"ChatUserBlockedTabSheet\"), o = b(\"ChatUserJoinStatusTabSheet\"), p = b(\"copyProperties\"), q = b(\"MercurySheetView\"), r = b(\"MercuryThreads\").get(), s = function(t, u, v) {\n        this._sheetView = new q(t, u, v);\n        this._addFriendsTabSheet = new g(t, u, this._sheetView);\n        this._nameConversationTabSheet = new h(t, u, this._sheetView);\n        this._userBlockedTabSheet = new n(t, u, this._sheetView);\n        this._offlineTabSheet = new k(t, u, this._sheetView);\n        this._newMessagesTabSheet = new i(t, u, this._sheetView);\n        this._uploadWarningTabSheet = new l(t, u, this._sheetView);\n        this._threadIsMutedTabSheet = new m(t, u, this._sheetView);\n        this._userJoinStatusTabSheet = new o(u, this._sheetView);\n        if (!r.getCanonicalUserInThread(t)) {\n            this._noRecipientsTabSheet = new j(t, u, this._sheetView);\n        }\n    ;\n    ;\n    };\n    p(s.prototype, {\n        openAddFriendsSheet: function() {\n            this._addFriendsTabSheet.open();\n        },\n        openUserJoinStatusSheet: function(t) {\n            this._userJoinStatusTabSheet.addToQueue(t);\n        },\n        getAddFriendsTabSheet: function() {\n            return this._addFriendsTabSheet;\n        },\n        getAddFriendsParticipants: function() {\n            var t = this._addFriendsTabSheet.getParticipants();\n            this._addFriendsTabSheet.close();\n            return t;\n        },\n        openNameConversationSheet: function(t) {\n            this._nameConversationTabSheet.open(t);\n        },\n        openNewMessagesSheet: function() {\n            this._newMessagesTabSheet.open();\n        },\n        openUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.open();\n        },\n        openThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.open();\n        },\n        closeAutomaticNameConversationSheet: function() {\n            if (this._nameConversationTabSheet.isAutomatic()) {\n                this._nameConversationTabSheet.close();\n            }\n        ;\n        ;\n        },\n        closeThreadIsMutedTabSheet: function() {\n            this._threadIsMutedTabSheet.close();\n        },\n        closeNewMessagesSheet: function() {\n            this._newMessagesTabSheet.close();\n        },\n        closeUploadWarningTabSheet: function() {\n            this._uploadWarningTabSheet.close();\n        },\n        onClickNewMessagesSheet: function(t) {\n            this._newMessageClickSub = this._newMessagesTabSheet.subscribe(\"clicked\", t);\n        },\n        onClickThreadIsMutedSheet: function(t) {\n            this._threadIsMutedClickSub = this._threadIsMutedTabSheet.subscribe(\"clicked\", t);\n        },\n        onResize: function(t) {\n            this._sheetView.subscribe(\"resize\", t);\n        },\n        destroy: function() {\n            this._sheetView.destroy();\n            this._offlineTabSheet.destroy();\n            this._userBlockedTabSheet.destroy();\n            ((this._newMessageClickSub && this._newMessageClickSub.unsubscribe()));\n            ((this._threadIsMutedClickSub && this._threadIsMutedClickSub.unsubscribe()));\n        }\n    });\n    e.exports = s;\n});\n__d(\"ChatTabView\", [\"JSBNG__Event\",\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AsyncSignal\",\"AvailableListConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatContextualDialogController\",\"ChatAutoSendPhotoUploader\",\"ChatPrivacyActionController\",\"ChatQuietLinks\",\"ChatTabMessagesView\",\"ChatTabPeopleSuggestionView\",\"ChatTabSheetController\",\"ChatVisibility\",\"MercuryConstants\",\"JSBNG__CSS\",\"Dialog\",\"Dock\",\"DOM\",\"Input\",\"JSLogger\",\"Keys\",\"Locale\",\"MercuryActionStatus\",\"MercuryConfig\",\"MercuryFileUploader\",\"MercuryLogMessageType\",\"MercuryMessages\",\"MercuryMessageClientState\",\"MercuryParticipants\",\"MercuryServerRequests\",\"MercurySourceType\",\"MercuryStickers\",\"MercuryThreadInformer\",\"MercuryThreadMetadataRawRenderer\",\"MercuryThreadMetadataRenderer\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"MessagesEmoticonView\",\"NubController\",\"Parent\",\"PhotosUploadWaterfall\",\"PresencePrivacy\",\"PresenceStatus\",\"Run\",\"Style\",\"SubscriptionsHandler\",\"ChatTabTemplates\",\"TextAreaControl\",\"Tooltip\",\"TypingDetectorController\",\"URI\",\"UserAgent\",\"VideoCallCore\",\"WaterfallIDGenerator\",\"copyProperties\",\"cx\",\"setIntervalAcrossTransitions\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AsyncSignal\"), m = b(\"AvailableListConstants\"), n = b(\"ChatBehavior\"), o = b(\"ChatConfig\"), p = b(\"ChatContextualDialogController\"), q = b(\"ChatAutoSendPhotoUploader\"), r = b(\"ChatPrivacyActionController\"), s = b(\"ChatQuietLinks\"), t = b(\"ChatTabMessagesView\"), u = b(\"ChatTabPeopleSuggestionView\"), v = b(\"ChatTabSheetController\"), w = b(\"ChatVisibility\"), x = b(\"MercuryConstants\"), y = b(\"JSBNG__CSS\"), z = b(\"Dialog\"), aa = b(\"Dock\"), ba = b(\"DOM\"), ca = b(\"Input\"), da = b(\"JSLogger\"), ea = b(\"Keys\"), fa = b(\"Locale\"), ga = b(\"MercuryActionStatus\"), ha = b(\"MercuryConfig\"), ia = b(\"MercuryFileUploader\"), ja = b(\"MercuryLogMessageType\"), ka = b(\"MercuryMessages\").get(), la = b(\"MercuryMessageClientState\"), ma = b(\"MercuryParticipants\"), na = b(\"MercuryServerRequests\").get(), oa = b(\"MercurySourceType\"), pa = b(\"MercuryStickers\"), qa = b(\"MercuryThreadInformer\").get(), ra = b(\"MercuryThreadMetadataRawRenderer\"), sa = b(\"MercuryThreadMetadataRenderer\").get(), ta = b(\"MercuryThreadMuter\"), ua = b(\"MercuryThreads\").get(), va = b(\"MercuryTypingReceiver\"), wa = b(\"MessagesEmoticonView\"), xa = b(\"NubController\"), ya = b(\"Parent\"), za = b(\"PhotosUploadWaterfall\"), ab = b(\"PresencePrivacy\"), bb = b(\"PresenceStatus\"), cb = b(\"Run\"), db = b(\"Style\"), eb = b(\"SubscriptionsHandler\"), fb = b(\"ChatTabTemplates\"), gb = b(\"TextAreaControl\"), hb = b(\"Tooltip\"), ib = b(\"TypingDetectorController\"), jb = b(\"URI\"), kb = b(\"UserAgent\"), lb = b(\"VideoCallCore\"), mb = b(\"WaterfallIDGenerator\"), nb = b(\"copyProperties\"), ob = b(\"cx\"), pb = b(\"setIntervalAcrossTransitions\"), qb = b(\"tx\"), rb = 227878347358915, sb = /^\\s*$/, tb = da.create(\"tab_view\"), ub = {\n    }, vb = null, wb, xb;\n    function yb(tc, uc) {\n        var vc = ba.create(\"div\");\n        uc = uc.filter(function(wc) {\n            return ((wc != ma.user));\n        });\n        if (!uc.length) {\n            return hb.remove(tc);\n        }\n    ;\n    ;\n        ma.getMulti(uc, function(wc) {\n            {\n                var fin294keys = ((window.top.JSBNG_Replay.forInKeys)((wc))), fin294i = (0);\n                var xc;\n                for (; (fin294i < fin294keys.length); (fin294i++)) {\n                    ((xc) = (fin294keys[fin294i]));\n                    {\n                        var yc = wc[xc], zc = fb[\":fb:mercury:chat:multichat-tooltip-item\"].build();\n                        ba.setContent(zc.getNode(\"JSBNG__name\"), yc.JSBNG__name);\n                        var ad = ma.getUserID(xc), bd = ((ad && ((bb.get(ad) == m.ACTIVE))));\n                        y.conditionShow(zc.getNode(\"icon\"), bd);\n                        y.conditionClass(zc.getNode(\"JSBNG__name\"), \"tooltipItemWithIcon\", bd);\n                        ba.appendContent(vc, zc.getRoot());\n                    };\n                };\n            };\n        ;\n            hb.set(tc, vc, \"above\");\n        });\n    };\n;\n    var zb = {\n    }, ac = null, bc = false;\n    function cc(tc, uc, vc) {\n        if (vc) {\n            zb[tc] = uc;\n            if (!ac) {\n                ac = pb(dc, 600);\n            }\n        ;\n        ;\n        }\n         else {\n            y.removeClass(uc, \"highlightTitle\");\n            delete zb[tc];\n        }\n    ;\n    ;\n    };\n;\n    function dc() {\n        {\n            var fin295keys = ((window.top.JSBNG_Replay.forInKeys)((zb))), fin295i = (0);\n            var tc;\n            for (; (fin295i < fin295keys.length); (fin295i++)) {\n                ((tc) = (fin295keys[fin295i]));\n                {\n                    var uc = zb[tc];\n                    if (uc.parentNode) {\n                        y.conditionClass(uc, \"highlightTitle\", bc);\n                    }\n                     else delete zb[tc];\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        bc = !bc;\n        if (!Object.keys(zb).length) {\n            JSBNG__clearInterval(ac);\n            ac = null;\n        }\n    ;\n    ;\n    };\n;\n    function ec(tc) {\n        var uc = na.tokenizeThreadID(tc);\n        switch (uc.type) {\n          case \"user\":\n            return fb[\":fb:mercury:chat:user-tab\"].build();\n        };\n    ;\n        return fb[\":fb:mercury:chat:multichat-tab\"].build();\n    };\n;\n    function fc(tc) {\n        var uc = ((tc._tabTemplate.getNode(\"input\").value || \"\")), vc = tc._fileUploader.getAttachments();\n        if (lc(tc)) {\n            hc(tc, uc, vc, function(wc) {\n                var xc = tc._fileUploader.getImageIDs();\n                if (((xc.length > 0))) {\n                    wc.photo_fbids = xc;\n                    wc.has_attachment = true;\n                }\n            ;\n            ;\n                ka.sendMessage(wc);\n                tc._fileUploader.removeAttachments();\n                tc._getNode(\"input\").value = \"\";\n                ((tc._lastMessageIndicator && tc._lastMessageIndicator.resetState()));\n                ((tc._messagesView && tc._messagesView.scrollToBottom()));\n            });\n        }\n    ;\n    ;\n    };\n;\n    function gc(tc, uc) {\n        if (((uc === 0))) {\n            return;\n        }\n    ;\n    ;\n        pc(tc, za.POST_PUBLISHED, {\n            count: uc\n        });\n        tc._waterfallID = mb.generate();\n    };\n;\n    function hc(tc, uc, vc, wc) {\n        ua.getThreadMeta(tc._threadID, function(xc) {\n            var yc = ka.constructUserGeneratedMessageObject(uc, oa.CHAT_WEB, tc._threadID);\n            if (((vc.length > 0))) {\n                yc.has_attachment = true;\n                yc.raw_attachments = vc;\n            }\n        ;\n        ;\n            if (ua.isNewEmptyLocalThread(tc._threadID)) {\n                var zc = tc._sheetController.getAddFriendsParticipants();\n                if (((((zc === null)) || ((zc.length === 0))))) {\n                    return;\n                }\n                 else if (((zc.length === 1))) {\n                    var ad = ((\"user:\" + ma.getUserID(zc[0])));\n                    yc.thread_id = ad;\n                }\n                 else ua.addParticipantsToThreadLocally(tc._threadID, zc);\n                \n            ;\n            ;\n            }\n        ;\n        ;\n            if (ua.isEmptyLocalThread(tc._threadID)) {\n                var bd = na.tokenizeThreadID(tc._threadID);\n                yc.message_id = bd.value;\n                yc.specific_to_list = xc.participants;\n            }\n        ;\n        ;\n            if (((typeof yc != \"undefined\"))) {\n                yc.signatureID = tc._signatureID;\n            }\n        ;\n        ;\n            yc.ui_push_phase = x.UIPushPhase;\n            wc(yc);\n            if (((tc._threadID !== yc.thread_id))) {\n                qc.inform(\"closed-tab\", tc._threadID);\n                h.inform(\"chat/open-tab\", {\n                    thread_id: yc.thread_id\n                });\n            }\n        ;\n        ;\n        });\n    };\n;\n    function ic(tc) {\n        tc._blocked = true;\n        tc._sheetController.openUploadWarningTabSheet();\n    };\n;\n    function jc(tc) {\n        return ((tc._fileUploader.isUploading() || tc._photoUploader.isUploading()));\n    };\n;\n    function kc(tc) {\n        return tc._fileUploader.isUploading();\n    };\n;\n    function lc(tc) {\n        var uc = ((tc._tabTemplate.getNode(\"input\").value || \"\"));\n        if (!sb.test(uc)) {\n            return true;\n        }\n    ;\n    ;\n        if (((((tc._fileUploader.getAttachments().length > 0)) || ((tc._fileUploader.getImageIDs().length > 0))))) {\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function mc(tc) {\n        if (tc._blocked) {\n            if (kc(tc)) {\n                return;\n            }\n        ;\n        ;\n            tc._blocked = false;\n            fc(tc);\n            tc._sheetController.closeUploadWarningTabSheet();\n        }\n    ;\n    ;\n    };\n;\n    function nc(tc) {\n        tc._nubController.flyoutContentChanged();\n        tc._attachmentsDiv.scrollTop = tc._attachmentsDiv.scrollHeight;\n    };\n;\n    function oc(tc, uc, vc) {\n        tc._subscriptionsHandler.addSubscriptions(tc._photoUploader.subscribe(uc, function(wc, xc) {\n            pc(tc, vc, xc);\n        }));\n    };\n;\n    function pc(tc, uc, vc) {\n        za.sendSignal(nb({\n            qn: tc._waterfallID,\n            step: uc,\n            uploader: za.APP_CHAT\n        }, ((vc || {\n        }))));\n    };\n;\n    function qc(tc, uc, vc) {\n        if (uc) {\n            na.ensureThreadIsFetched(uc);\n        }\n    ;\n    ;\n        this._threadID = tc;\n        this._signatureID = vc;\n        this._eventListeners = [];\n        this._tabTemplate = ec(tc);\n        this._tabElem = this._tabTemplate.getRoot();\n        this._waterfallID = mb.generate();\n        if (!((this._getNode instanceof Function))) {\n            tb.log(\"getnode_undefined\", {\n                is_getnode_set: !!this._getNode,\n                is_prototype_set: !!qc.prototype,\n                is_window: ((window == this)),\n                is_chat_tab_view: ((this instanceof qc)),\n                ctor_name: ((this.constructor && this.constructor.JSBNG__name))\n            });\n        }\n    ;\n    ;\n        this._subscriptionsHandler = new eb();\n        this._fileUploader = new ia(this._tabTemplate.getNode(\"attachmentShelf\"), this._tabTemplate.getNode(\"attachButtonForm\"), this._tabTemplate.getNode(\"fileInput\"), this._tabTemplate.getNode(\"attachID\"));\n        this._initializeUploader(this._fileUploader);\n        this._initializeAutoSendPhotoUploader();\n        this._attachmentsDiv = this._getNode(\"attachmentShelf\");\n        this._sheetController = new v(this._threadID, this._getNode(\"sheet\"), this._tabElem);\n        this._sheetController.onClickNewMessagesSheet(function() {\n            ((this._messagesView && this._messagesView.scrollToBottom()));\n            this.JSBNG__focus();\n            qc.inform(\"read\", this._threadID);\n        }.bind(this));\n        this._sheetController.onClickThreadIsMutedSheet(function() {\n            ta.showMuteChangeDialog(0, this._threadID);\n            this.JSBNG__focus();\n        }.bind(this));\n        this._nubController = new xa().init(this._tabElem);\n        this._sheetController.onResize(this._nubController.flyoutContentChanged.bind(this._nubController));\n        this._contextualDialogController = new p(this._threadID, this._getNode(\"videoCallLink\"));\n        if (((vb === null))) {\n            vb = !o.get(\"seen_autosend_photo_nux\");\n        }\n    ;\n    ;\n        if (((wb === undefined))) {\n            wb = o.get(\"show_sticker_nux\");\n        }\n    ;\n    ;\n        this._messagesView = null;\n        var wc = this._getNode(\"conversationLink\");\n        if (wc) {\n            y.hide(wc);\n            sa.renderTitanLink(tc, wc, y.show.bind(y, wc));\n        }\n    ;\n    ;\n        if (!ua.getCanonicalUserInThread(this._threadID)) {\n            this._titlebarTooltipAnchor = this._getNode(\"titlebarText\");\n        }\n    ;\n    ;\n        var xc = this._getCanonicalUserID();\n        if (this._isTitleTextLinked()) {\n            ma.get(((\"fbid:\" + xc)), function(id) {\n                if (id.href) {\n                    var jd = this._getNode(\"titlebarText\");\n                    jd.setAttribute(\"href\", id.href);\n                    jd.removeAttribute(\"rel\");\n                    y.removeClass(jd, \"noLink\");\n                }\n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        var yc = this._getNode(\"inputContainer\").clientHeight;\n        gb.getInstance(this._getNode(\"input\")).subscribe(\"resize\", function() {\n            var id = this._getNode(\"inputContainer\").clientHeight;\n            if (((id != yc))) {\n                this._nubController.flyoutContentChanged();\n            }\n        ;\n        ;\n            yc = id;\n        }.bind(this));\n        var zc = null, ad = this._getNode(\"inputContainer\");\n        this._nubController.subscribe(\"resize\", function() {\n            if (!zc) {\n                zc = this._tabElem.clientWidth;\n            }\n        ;\n        ;\n            var id = 2, jd = ((zc - ((ad.clientWidth + id)))), kd = ((fa.isRTL() ? \"left\" : \"right\"));\n            db.set(this._iconsContainerNode, kd, ((jd + \"px\")));\n            gb.getInstance(this._getNode(\"input\")).update();\n        }.bind(this));\n        var bd = o.get(\"chat_tab_height\");\n        if (bd) {\n            var cd = this._tabTemplate.getNode(\"chatWrapper\");\n            db.set(cd, \"height\", ((bd + \"px\")));\n        }\n    ;\n    ;\n        this._listen(\"closeButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"click\", this._closeClicked);\n        this._listen(\"titlebarCloseButton\", \"mousedown\", this._closePreClicked);\n        this._listen(\"dockButton\", \"click\", this._nubClicked);\n        this._listen(\"dockButton\", \"keydown\", this._dockKeyDown);\n        this._listen(\"nubFlyoutTitlebar\", \"click\", this._titleClicked);\n        this._listen(\"chatConv\", \"click\", this._chatConvClicked);\n        this._listen(\"inputContainer\", \"click\", this._inputContainerClicked);\n        this._listen(\"addFriendLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"addToThreadLink\", \"click\", this._addFriendLinkClicked, true);\n        this._listen(\"nameConversationLink\", \"click\", this._nameConversationLinkClicked, true);\n        this._listen(\"clearWindowLink\", \"click\", this._clearHistory, true);\n        this._listen(\"unsubscribeLink\", \"click\", this._unsubscribeLinkClicked, true);\n        this._listen(\"videoCallLink\", \"click\", this._callClicked, true);\n        this._listen(\"reportSpamLink\", \"click\", this._reportSpamClicked, true);\n        this._listen(\"muteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, -1), true);\n        this._listen(\"unmuteThreadLink\", \"click\", this._showMuteSettingDialog.bind(this, 0), true);\n        this._listen(\"input\", \"JSBNG__focus\", this._focusTab);\n        this._listen(\"input\", \"JSBNG__blur\", this._blurTab);\n        this._listen(\"sheet\", \"keydown\", function(JSBNG__event) {\n            if (((!JSBNG__event.getModifiers().any && ((JSBNG__event.keyCode === ea.TAB))))) {\n                this._getNode(\"input\").JSBNG__focus();\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        }.bind(this));\n        this._iconsContainerNode = this._getNode(\"iconsContainer\");\n        var dd = this._getNode(\"emoticons\");\n        this._emoticonView = null;\n        if (dd) {\n            this._emoticonView = new wa(dd, this._getNode(\"input\"));\n        }\n    ;\n    ;\n        var ed = this._getNode(\"stickers\");\n        if (ed) {\n            this._stickerController = new pa(ed);\n            if (ha.BigThumbsUpStickerWWWGK) {\n                this._listen(\"bigThumbsUp\", \"click\", this._bigThumbsUpClicked);\n            }\n        ;\n        ;\n            this._subscriptionsHandler.addSubscriptions(this._stickerController.subscribe(\"stickerselected\", function(id, jd) {\n                this._stickerSelected(jd.id);\n            }.bind(this)));\n        }\n    ;\n    ;\n        if (kb.firefox()) {\n            this._listen(\"input\", \"keypress\", this._inputKeyDown);\n        }\n         else this._listen(\"input\", \"keydown\", this._inputKeyDown);\n    ;\n    ;\n        this._privacyLink = this._getNode(\"privacyLink\");\n        if (this._privacyLink) {\n            this._privacyActionController = new r(xc, this._updatePrivacyLink.bind(this));\n            this._eventListeners.push(g.listen(this._privacyLink, \"click\", this._privacyActionController.togglePrivacy.bind(this._privacyActionController)));\n        }\n    ;\n    ;\n        ua.getThreadMeta(this._threadID, function(id) {\n            var jd = ((xc || ((o.get(\"chat_multi_typ_send\") && !id.is_canonical))));\n            if (jd) {\n                na.getServerThreadID(this._threadID, function(kd) {\n                    this._lastMessageIndicator = new ib(xc, this._getNode(\"input\"), \"mercury-chat\", null, kd);\n                }.bind(this));\n            }\n        ;\n        ;\n            this._setUpMutingSettings(id);\n        }.bind(this));\n        var fd = this._getNode(\"muteGroupLink\");\n        if (fd) {\n            var gd = ua.getCanonicalGroupInThread(this._threadID);\n            if (gd) {\n                fd.setAttribute(\"ajaxify\", jb(fd.getAttribute(\"ajaxify\")).addQueryData({\n                    id: gd\n                }));\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        s.removeEmptyHrefs(this._tabElem);\n        ub[tc] = this;\n        this.updateAvailableStatus();\n        this.updateTab();\n        this._setCloseTooltip(false);\n        var hd = {\n            threadID: tc,\n            userID: xc,\n            signatureID: this._signatureID\n        };\n        new l(\"/ajax/chat/opentab_tracking.php\", hd).send();\n        cb.onBeforeUnload(function() {\n            if (((lc(this) || jc(this)))) {\n                return \"You haven't sent your message yet. Do you want to leave without sending?\";\n            }\n        ;\n        ;\n            if (ka.getNumberLocalMessages(this._threadID)) {\n                return \"Your message is still being sent. Are you sure you want to leave?\";\n            }\n        ;\n        ;\n            return null;\n        }.bind(this), false);\n        cb.onUnload(function() {\n            rc(this);\n        }.bind(this));\n    };\n;\n    function rc(tc) {\n        if (tc._photoUploader.isUploading()) {\n            pc(tc, za.CANCEL_DURING_UPLOAD);\n        }\n    ;\n    ;\n    };\n;\n    function sc() {\n        {\n            var fin296keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin296i = (0);\n            var tc;\n            for (; (fin296i < fin296keys.length); (fin296i++)) {\n                ((tc) = (fin296keys[fin296i]));\n                {\n                    ub[tc].updateAvailableStatus();\n                    ub[tc].updateMultichatTooltip();\n                };\n            };\n        };\n    ;\n    };\n;\n    h.subscribe([\"buddylist/availability-changed\",], sc);\n    ab.subscribe([\"privacy-changed\",\"privacy-availability-changed\",], sc);\n    n.subscribe(n.ON_CHANGED, function() {\n        {\n            var fin297keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin297i = (0);\n            var tc;\n            for (; (fin297i < fin297keys.length); (fin297i++)) {\n                ((tc) = (fin297keys[fin297i]));\n                {\n                    ua.getThreadMeta(tc, function(uc) {\n                        ub[tc]._updateUnreadCount(uc);\n                    });\n                ;\n                };\n            };\n        };\n    ;\n    });\n    va.subscribe(\"state-changed\", function(tc, uc) {\n        {\n            var fin298keys = ((window.top.JSBNG_Replay.forInKeys)((uc))), fin298i = (0);\n            var vc;\n            for (; (fin298i < fin298keys.length); (fin298i++)) {\n                ((vc) = (fin298keys[fin298i]));\n                {\n                    var wc = ((uc[vc] && uc[vc].length)), xc = ub[vc];\n                    ((xc && xc.showTypingIndicator(wc)));\n                };\n            };\n        };\n    ;\n    });\n    qa.subscribe(\"threads-updated\", function(tc, uc) {\n        {\n            var fin299keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin299i = (0);\n            var vc;\n            for (; (fin299i < fin299keys.length); (fin299i++)) {\n                ((vc) = (fin299keys[fin299i]));\n                {\n                    ((uc[vc] && ub[vc].updateTab()));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    qa.subscribe(\"threads-deleted\", function(tc, uc) {\n        {\n            var fin300keys = ((window.top.JSBNG_Replay.forInKeys)((ub))), fin300i = (0);\n            var vc;\n            for (; (fin300i < fin300keys.length); (fin300i++)) {\n                ((vc) = (fin300keys[fin300i]));\n                {\n                    ((uc[vc] && qc.inform(\"thread-deleted\", vc)));\n                ;\n                };\n            };\n        };\n    ;\n    });\n    nb(qc, i, {\n        get: function(tc) {\n            return ub[tc];\n        }\n    });\n    nb(qc.prototype, {\n        getThreadID: function() {\n            return this._threadID;\n        },\n        showAddFriend: function() {\n            (function() {\n                this._sheetController.openAddFriendsSheet();\n            }).bind(this).defer();\n        },\n        showPeopleSuggestions: function() {\n            (function() {\n                this._peopleSuggestions = new u(this._sheetController, this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"));\n            }).bind(this).defer();\n        },\n        showNameConversation: function(tc) {\n            (function() {\n                this._sheetController.openNameConversationSheet(tc);\n            }).bind(this).defer();\n        },\n        hideAutomaticNameConversation: function() {\n            (function() {\n                this._sheetController.closeAutomaticNameConversationSheet();\n            }).bind(this).defer();\n        },\n        isVisible: function() {\n            return y.shown(this._tabElem);\n        },\n        setVisibleState: function(tc, uc) {\n            var vc = y.shown(this._tabElem), wc = y.hasClass(this._tabElem, \"opened\");\n            y.conditionShow(this._tabElem, tc);\n            y.conditionClass(this._tabElem, \"opened\", uc);\n            if (((((!((vc && wc)) && tc)) && uc))) {\n                if (!this._messagesView) {\n                    this._messagesView = new t(this._threadID, this._sheetController, this._getNode(\"chatConv\"), this._getNode(\"conversation\"), this._getNode(\"loadingIndicator\"), this._getNode(\"lastMessageIndicator\"), this._getNode(\"typingIndicator\"));\n                }\n            ;\n            ;\n                this._nubController.flyoutContentChanged();\n                this._messagesView.scrollToBottom();\n            }\n        ;\n        ;\n            if (((((vc && wc)) && !((tc && uc))))) {\n                this._contextualDialogController.tabNotActive();\n            }\n        ;\n        ;\n        },\n        JSBNG__focus: function() {\n            var tc = ((y.hasClass(this._tabElem, \"opened\") ? \"input\" : \"dockButton\"));\n            this._getNode(tc).JSBNG__focus();\n        },\n        isFocused: function() {\n            var tc = JSBNG__document.activeElement;\n            return ((ya.byClass(tc, \"-cx-PRIVATE-fbMercuryChatTab__root\") === this._tabElem));\n        },\n        hasEmptyInput: function() {\n            return sb.test(this._getNode(\"input\").value);\n        },\n        getInputElem: function() {\n            return this._getNode(\"input\");\n        },\n        setInput: function(tc) {\n            this._getNode(\"input\").value = tc;\n        },\n        insertBefore: function(tc) {\n            ba.insertBefore(tc._tabElem, this._tabElem);\n        },\n        appendTo: function(tc) {\n            ba.appendContent(tc, this._tabElem);\n        },\n        nextTabIs: function(tc) {\n            var uc = ((tc && tc._tabElem));\n            return ((this._tabElem.nextSibling == uc));\n        },\n        getScrollTop: function() {\n            return ba.JSBNG__find(this._tabElem, \".scrollable\").scrollTop;\n        },\n        setScrollTop: function(tc) {\n            ba.JSBNG__find(this._tabElem, \".scrollable\").scrollTop = tc;\n        },\n        destroy: function() {\n            ba.remove(this._tabElem);\n            ((this._emoticonView && this._emoticonView.destroy()));\n            ((this._stickerController && this._stickerController.destroy()));\n            while (this._eventListeners.length) {\n                this._eventListeners.pop().remove();\n            ;\n            };\n        ;\n            ((this._messagesView && this._messagesView.destroy()));\n            this._sheetController.destroy();\n            this._fileUploader.destroy();\n            this._photoUploader.destroy();\n            this._subscriptionsHandler.release();\n            this._contextualDialogController.destroy();\n            ((this._privacyActionController && this._privacyActionController.destroy()));\n            delete ub[this._threadID];\n            aa.unregisterNubController(this._nubController);\n            ca.reset(this._getNode(\"input\"));\n        },\n        updateAvailableStatus: function() {\n            ua.getThreadMeta(this._threadID, function(tc) {\n                var uc = m.OFFLINE, vc = this._getCanonicalUserID();\n                if (vc) {\n                    uc = bb.get(vc);\n                }\n                 else {\n                    var wc = tc.participants.map(function(yc) {\n                        return ma.getUserID(yc);\n                    });\n                    uc = bb.getGroup(wc);\n                }\n            ;\n            ;\n                if (!w.isOnline()) {\n                    uc = m.OFFLINE;\n                }\n            ;\n            ;\n                if (vc) {\n                    this._updateCallLink(uc);\n                }\n            ;\n            ;\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__active\", ((uc === m.ACTIVE)));\n                y.conditionClass(this._tabElem, \"-cx-PRIVATE-fbMercuryChatUserTab__mobile\", ((uc === m.MOBILE)));\n                var xc = this._getNode(\"presenceIndicator\");\n                switch (uc) {\n                  case m.ACTIVE:\n                    xc.setAttribute(\"alt\", \"Online\");\n                    break;\n                  case m.MOBILE:\n                    xc.setAttribute(\"alt\", \"Mobile\");\n                    break;\n                  default:\n                    xc.removeAttribute(\"alt\");\n                    break;\n                };\n            ;\n            }.bind(this));\n        },\n        updateTab: function() {\n            ua.getThreadMeta(this._threadID, function(tc) {\n                if (!tc.is_subscribed) {\n                    qc.inform(\"unsubscribed\", this._threadID);\n                    return;\n                }\n            ;\n            ;\n                sa.renderAndSeparatedParticipantList(this._threadID, [this._getNode(\"JSBNG__name\"),this._getNode(\"titlebarText\"),], {\n                    names_renderer: ra.renderShortNames,\n                    check_length: true\n                });\n                if (((tc.is_joinable && !o.get(\"joinable_conversation_is_modal\")))) {\n                    this._updateJoinableAddFriendSheet(tc);\n                }\n            ;\n            ;\n                this._updateMutingSettings(tc);\n                this._updateUnreadCount(tc);\n                this.updateMultichatTooltip();\n                this._updateArchiveWarning(tc);\n                this._updateNewThread(tc);\n                this._updateNameConversationSheet(tc);\n            }.bind(this));\n        },\n        _updateNameConversationSheet: function(tc) {\n            if (((((((!tc.JSBNG__name && !tc.is_canonical)) && !tc.name_conversation_sheet_dismissed)) && !ua.isEmptyLocalThread(tc.thread_id)))) {\n                this.showNameConversation(true);\n            }\n             else this.hideAutomaticNameConversation();\n        ;\n        ;\n        },\n        _updateJoinableAddFriendSheet: function(tc) {\n            var uc = ma.user, vc = tc.participants.filter(function(wc) {\n                return ((wc != uc));\n            });\n            if (((tc.is_joinable && ((vc.length < 1))))) {\n                this.showAddFriend();\n            }\n        ;\n        ;\n        },\n        updateSignatureID: function(tc) {\n            this._signatureID = tc;\n        },\n        _showPhotoNUXIfNecessary: function() {\n            if (vb) {\n                vb = false;\n                new k(\"/ajax/chat/photo_nux.php\").setRelativeTo(this._getNode(\"photoAttachLink\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        ;\n        },\n        _showStickerNUXIfNecessary: function() {\n            if (wb) {\n                wb = false;\n                new k(\"/ajax/messaging/stickers/nux\").setRelativeTo(this._getNode(\"emoticons\")).setData({\n                    threadID: this._threadID\n                }).send();\n                return true;\n            }\n        ;\n        ;\n        },\n        _setUpMutingSettings: function(tc) {\n            var uc = ta.isThreadMuted(tc);\n            if (uc) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n        ;\n        ;\n            this._updateActionMenu(uc);\n        },\n        _updateMutingSettings: function(tc) {\n            var uc = ta.isThreadMuted(tc);\n            if (((uc && y.shown(this._getNode(\"muteThreadLink\").parentNode)))) {\n                this._sheetController.openThreadIsMutedTabSheet();\n            }\n             else if (((!uc && y.shown(this._getNode(\"unmuteThreadLink\").parentNode)))) {\n                this._sheetController.closeThreadIsMutedTabSheet();\n            }\n            \n        ;\n        ;\n            this._updateActionMenu(uc);\n        },\n        _updateActionMenu: function(tc) {\n            y.conditionShow(this._getNode(\"muteThreadLink\").parentNode, !tc);\n            y.conditionShow(this._getNode(\"unmuteThreadLink\").parentNode, tc);\n        },\n        _updateArchiveWarning: function(tc) {\n            var uc = false;\n            ma.get(ma.user, function(vc) {\n                uc = vc.employee;\n                if (uc) {\n                    ma.getMulti(tc.participants, this._showArchiveWarningIfAllParticipantsAreEmployees.bind(this));\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _updateNewThread: function(tc) {\n            var uc = ua.isNewEmptyLocalThread(tc.thread_id);\n            y.conditionShow(this._getNode(\"dropdown\"), !uc);\n            if (uc) {\n                this.showAddFriend();\n                if (o.get(\"www_chat_compose_suggestions\", 0)) {\n                    this.showPeopleSuggestions();\n                }\n            ;\n            ;\n            }\n             else if (this._peopleSuggestions) {\n                this._peopleSuggestions.destroy();\n                this._peopleSuggestions = null;\n            }\n            \n        ;\n        ;\n        },\n        _showArchiveWarningIfAllParticipantsAreEmployees: function(tc) {\n            var uc = true;\n            {\n                var fin301keys = ((window.top.JSBNG_Replay.forInKeys)((tc))), fin301i = (0);\n                var vc;\n                for (; (fin301i < fin301keys.length); (fin301i++)) {\n                    ((vc) = (fin301keys[fin301i]));\n                    {\n                        uc = ((uc && tc[vc].employee));\n                    ;\n                    };\n                };\n            };\n        ;\n            var wc = this._getNode(\"titanArchiveWarning\");\n            if (wc) {\n                if (this._titlebarTooltipAnchor) {\n                    y.conditionClass(this._titlebarTooltipAnchor, \"narrowTitleBar\", uc);\n                }\n            ;\n            ;\n                y.conditionShow(wc, uc);\n            }\n        ;\n        ;\n        },\n        updateMultichatTooltip: function() {\n            ua.getThreadMeta(this._threadID, function(tc) {\n                if (!tc.is_canonical) {\n                    yb(this._titlebarTooltipAnchor, tc.participants);\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        _getNode: function(tc) {\n            return this._tabTemplate.getNode(tc);\n        },\n        _getCanonicalUserID: function() {\n            return ua.getCanonicalUserInThread(this._threadID);\n        },\n        _listen: function(tc, JSBNG__event, uc, vc) {\n            var wc = this._getNode(tc);\n            if (wc) {\n                this._eventListeners.push(g.listen(wc, JSBNG__event, uc.bind(this)));\n            }\n             else if (!vc) {\n                throw new Error(((((\"Could not find node \\\"\" + tc)) + \"\\\"\")));\n            }\n            \n        ;\n        ;\n        },\n        _closePreClicked: function(tc) {\n            this._closeMouseDown = true;\n        },\n        _closeClicked: function(tc) {\n            rc(this);\n            qc.inform(\"closed-tab\", this._threadID);\n            tc.kill();\n        },\n        _nubClicked: function(tc) {\n            tc.kill();\n            return qc.inform(\"nub-activated\", this._threadID);\n        },\n        _dockKeyDown: function(JSBNG__event) {\n            if (((((JSBNG__event.keyCode === ea.RETURN)) || ((JSBNG__event.keyCode === ea.SPACE))))) {\n                qc.inform(\"nub-activated\", this._threadID);\n                JSBNG__event.kill();\n            }\n             else this._handleHotkeyPressed(JSBNG__event);\n        ;\n        ;\n        },\n        _handleHotkeyPressed: function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === ea.ESC))) {\n                rc(this);\n                qc.inform(\"esc-pressed\", this._threadID);\n                JSBNG__event.kill();\n            }\n             else if (((((JSBNG__event.keyCode === ea.TAB)) && !JSBNG__event.ctrlKey))) {\n                var tc = qc.inform(\"tab-pressed\", {\n                    id: this._threadID,\n                    shiftPressed: JSBNG__event.shiftKey\n                });\n                ((!tc && JSBNG__event.kill()));\n            }\n            \n        ;\n        ;\n        },\n        _isTitleTextLinked: function() {\n            var tc = this._getCanonicalUserID();\n            return ((tc && o.get(\"chat_tab_title_link_timeline\")));\n        },\n        _titleClicked: function(JSBNG__event) {\n            var tc = JSBNG__event.getTarget(), uc = ya.byClass(tc, \"titlebarText\"), vc = ((uc && this._isTitleTextLinked()));\n            if (((((!vc && !ya.byClass(tc, \"uiSelector\"))) && !ya.byClass(tc, \"addToThread\")))) {\n                qc.inform(\"lower-activated\", this._threadID);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        _callClicked: function(tc) {\n            var uc = this._getCanonicalUserID();\n            if (lb.availableForCall(uc)) {\n                var vc = \"chat_tab_icon\";\n                if (((tc.target && y.hasClass(tc.target, \"video_call_promo\")))) {\n                    vc = \"chat_tab_icon_promo\";\n                }\n                 else if (((tc.target && y.hasClass(tc.target, \"video_call_tour\")))) {\n                    vc = \"chat_tab_icon_tour\";\n                }\n                \n            ;\n            ;\n                qc.inform(\"video-call-clicked\", {\n                    threadID: this._threadID,\n                    userID: uc,\n                    clickSource: vc\n                });\n            }\n        ;\n        ;\n            return false;\n        },\n        _addFriendLinkClicked: function() {\n            this.showAddFriend();\n        },\n        _nameConversationLinkClicked: function() {\n            this.showNameConversation();\n        },\n        _clearHistory: function() {\n            var tc = ua.getThreadMetaNow(this._threadID);\n            if (tc) {\n                var uc = this._getCanonicalUserID();\n                na.clearChat(this._threadID, uc, tc.timestamp);\n            }\n        ;\n        ;\n        },\n        _unsubscribeLinkClicked: function() {\n            var tc = [];\n            tc.push({\n                JSBNG__name: \"unsubscribe\",\n                label: \"Leave Conversation\",\n                handler: this._unsubscribeToThread.bind(this)\n            });\n            tc.push(z.CANCEL);\n            new z().setTitle(\"Leave Conversation?\").setBody(\"You will stop receiving messages from this conversation and people will see that you left.\").setButtons(tc).show();\n        },\n        _bigThumbsUpClicked: function() {\n            this._stickerSelected(rb);\n        },\n        _reportSpamClicked: function() {\n            var tc = this._getCanonicalUserID(), uc = jb(\"/ajax/chat/report.php\").addQueryData({\n                id: tc\n            }).addQueryData({\n                src: \"top_report_link\"\n            });\n            j.send(new k(uc));\n        },\n        _showMuteSettingDialog: function(tc) {\n            ta.showMuteChangeDialog(tc, this._threadID);\n        },\n        _focusTab: function() {\n            y.addClass(this._tabElem, \"focusedTab\");\n            if (this._peopleSuggestions) {\n                this._peopleSuggestions.clearSuggestions();\n            }\n        ;\n        ;\n            this.tryMarkAsRead();\n            this._contextualDialogController.tabFocused();\n            if (((!xb && ((this._showPhotoNUXIfNecessary() || this._showStickerNUXIfNecessary()))))) {\n                h.subscribe([\"ChatNUX/show\",\"ChatNUX/hide\",], function(JSBNG__event) {\n                    xb = ((JSBNG__event === \"ChatNUX/show\"));\n                });\n            }\n        ;\n        ;\n            this._closeMouseDown = false;\n            this._setCloseTooltip(true);\n        },\n        _blurTab: function() {\n            y.removeClass(this._tabElem, \"focusedTab\");\n            ((!this._closeMouseDown && this._setCloseTooltip(false)));\n        },\n        _setCloseTooltip: function(tc) {\n            var uc = this._getNode(\"titlebarCloseButton\"), vc = ((tc ? \"Press Esc to close\" : \"Close tab\"));\n            hb.set(uc, vc, \"above\");\n        },\n        _inputKeyDown: function(JSBNG__event) {\n            if (((((JSBNG__event.keyCode === ea.RETURN)) && !JSBNG__event.shiftKey))) {\n                if (kc(this)) {\n                    ic(this);\n                    JSBNG__event.kill();\n                    return;\n                }\n            ;\n            ;\n                fc(this);\n                JSBNG__event.kill();\n                return;\n            }\n        ;\n        ;\n            if (((((((JSBNG__event.keyCode === ea.DOWN)) && JSBNG__event.shiftKey)) && ((this._getNode(\"input\").value === \"\"))))) {\n                qc.inform(\"lower-activated\", this._threadID);\n                JSBNG__event.kill();\n                return;\n            }\n        ;\n        ;\n            this._handleHotkeyPressed(JSBNG__event);\n        },\n        tryMarkAsRead: function() {\n            if (((!this._messagesView || this._messagesView.isScrolledToBottom()))) {\n                qc.inform(\"read\", this._threadID);\n                return true;\n            }\n        ;\n        ;\n            return false;\n        },\n        _chatConvClicked: function(tc) {\n            this.tryMarkAsRead();\n            if (((ya.byTag(tc.getTarget(), \"a\") || ba.JSBNG__getSelection()))) {\n                return;\n            }\n        ;\n        ;\n            this.JSBNG__focus();\n        },\n        _inputContainerClicked: function(tc) {\n            this.tryMarkAsRead();\n            this.JSBNG__focus();\n        },\n        showTypingIndicator: function(tc) {\n            var uc = ua.getThreadMetaNow(this._threadID), vc = ((this._getCanonicalUserID() || ((((o.get(\"chat_multi_typ\") && uc)) && !uc.is_canonical))));\n            if (vc) {\n                y.conditionClass(this._tabElem, \"typing\", tc);\n            }\n        ;\n        ;\n        },\n        _updateUnreadCount: function(tc) {\n            var uc = tc.unread_count;\n            if (((typeof uc != \"undefined\"))) {\n                var vc = ((!!uc && ((!n.showsTabUnreadUI || n.showsTabUnreadUI())))), wc = this._getNode(\"numMessages\");\n                y.conditionShow(wc, vc);\n                y.conditionClass(this._tabElem, \"highlightTab\", vc);\n                cc(this._threadID, this._tabElem, vc);\n                ba.setContent(wc, uc);\n            }\n        ;\n        ;\n        },\n        _updateCallLink: function(tc) {\n            var uc = this._getNode(\"videoCallLink\");\n            if (w.isOnline()) {\n                var vc = this._getCanonicalUserID(), wc = ((\"fbid:\" + vc));\n                ma.get(wc, function(xc) {\n                    if (lb.availableForCall(vc)) {\n                        hb.set(uc, qb._(\"Start a video call with {firstname}\", {\n                            firstname: xc.short_name\n                        }));\n                        this._updateCallBackLinks(this._tabElem, true);\n                    }\n                     else {\n                        hb.set(uc, qb._(\"{firstname} is currently unavailable for video calling\", {\n                            firstname: xc.short_name\n                        }));\n                        this._hideVideoCallouts();\n                        this._updateCallBackLinks(this._tabElem, false);\n                    }\n                ;\n                ;\n                }.bind(this));\n            }\n             else {\n                hb.set(uc, \"You must be online to make a call.\");\n                this._hideVideoCallouts();\n                this._updateCallBackLinks(JSBNG__document.body, false);\n            }\n        ;\n        ;\n        },\n        _updateCallBackLinks: function(tc, uc) {\n            var vc = ba.scry(tc, \"a.callBackLink\");\n            if (uc) {\n                vc.forEach(y.show);\n            }\n             else vc.forEach(y.hide);\n        ;\n        ;\n        },\n        _hideVideoCallouts: function() {\n            this._contextualDialogController.hideVideoCallouts();\n        },\n        _updatePrivacyLink: function(tc) {\n            if (((tc == r.OFFLINE))) {\n                ba.setContent(this._privacyLink, \"Go online\");\n            }\n             else {\n                var uc = this._getCanonicalUserID(), vc = ((\"fbid:\" + uc));\n                ma.get(vc, function(wc) {\n                    var xc = null;\n                    if (((tc == r.BLOCKED))) {\n                        xc = qb._(\"Turn On Chat for {name}\", {\n                            JSBNG__name: wc.short_name\n                        });\n                    }\n                     else xc = qb._(\"Turn Off Chat for {name}\", {\n                        JSBNG__name: wc.short_name\n                    });\n                ;\n                ;\n                    ba.setContent(this._privacyLink, xc);\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        _unsubscribeToThread: function() {\n            if (ua.isEmptyLocalThread(this._threadID)) {\n                qc.inform(\"unsubscribed\", this._threadID);\n            }\n             else {\n                var tc = ka.constructLogMessageObject(oa.CHAT_WEB, this._threadID, ja.UNSUBSCRIBE, {\n                });\n                ka.sendMessage(tc);\n            }\n        ;\n        ;\n            return true;\n        },\n        _initializeUploader: function(tc) {\n            this._subscriptionsHandler.addSubscriptions(tc.subscribe([\"all-uploads-completed\",\"upload-canceled\",], function() {\n                mc(this);\n            }.bind(this)), tc.subscribe(\"dom-updated\", function() {\n                nc(this);\n            }.bind(this)), tc.subscribe(\"submit\", function() {\n                this._getNode(\"input\").JSBNG__focus();\n            }.bind(this)));\n        },\n        _initializeAutoSendPhotoUploader: function() {\n            this._photoUploader = new q(this._tabTemplate.getNode(\"photoAttachButtonForm\"), this._tabTemplate.getNode(\"photoFileInput\"), this._tabTemplate.getNode(\"photoAttachID\"));\n            var tc = {\n            };\n            oc(this, \"submit\", za.UPLOAD_START);\n            oc(this, \"all-uploads-completed\", za.ALL_UPLOADS_DONE);\n            oc(this, \"all-uploads-failed\", za.CLIENT_ERROR);\n            this._subscriptionsHandler.addSubscriptions(this._photoUploader.subscribe(\"submit\", function(uc, vc) {\n                hc(this, \"\", [], function(wc) {\n                    tc[vc.upload_id] = wc;\n                    if (((vc.preview_attachments.length > 0))) {\n                        wc.has_attachment = true;\n                        wc.preview_attachments = vc.preview_attachments;\n                    }\n                ;\n                ;\n                    wc.client_state = la.DO_NOT_SEND_TO_SERVER;\n                    wc.JSBNG__status = ga.RESENDING;\n                    ka.sendMessage(wc);\n                });\n                this._getNode(\"input\").JSBNG__focus();\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-failed\", function(uc, vc) {\n                var wc = tc[vc.upload_id];\n                delete tc[vc.upload_id];\n                ka.deleteMessages(wc.thread_id, [wc.message_id,]);\n            }.bind(this)), this._photoUploader.subscribe(\"all-uploads-completed\", function(uc, vc) {\n                var wc = tc[vc.upload_id];\n                delete tc[vc.upload_id];\n                wc.image_ids = vc.image_ids;\n                wc.client_state = la.SEND_TO_SERVER;\n                ka.sendMessage(wc);\n                var xc = ((vc.image_ids.length || vc.attachments.length));\n                gc(this, xc);\n            }.bind(this)));\n        },\n        _stickerSelected: function(tc) {\n            hc(this, \"\", [], function(uc) {\n                uc.has_attachment = true;\n                uc.sticker_id = tc;\n                ka.sendMessage(uc);\n                this.JSBNG__focus();\n            }.bind(this));\n        },\n        _emoticonView: null\n    });\n    e.exports = qc;\n});\n__d(\"ChatNewMessageHandler\", [\"ChatActivity\",\"ChatTabModel\",\"ChatTabView\",\"JSLogger\",\"MercuryAssert\",\"MercuryBrowserAlerts\",\"MercuryUnseenState\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"JSLogger\"), k = b(\"MercuryAssert\"), l = b(\"MercuryBrowserAlerts\"), m = b(\"MercuryUnseenState\").get(), n = j.create(\"chat_new_message\"), o = {\n        _raiseTab: function(p, q) {\n            var r = h.getTab(p), s = false;\n            if (r) {\n                s = r.raised;\n            }\n             else {\n                h.raiseTab(p, false);\n                s = true;\n            }\n        ;\n        ;\n            q.to_new_tab = !r;\n            q.to_raised_tab = !!s;\n        },\n        _notify: function(p, q, r) {\n            var s = i.get(p);\n            r.view_is_visible = ((s && s.isVisible()));\n            r.view_is_focused = ((s && s.isFocused()));\n            if (!r.view_is_visible) {\n                n.log(\"message_to_hidden\");\n            }\n        ;\n        ;\n            r.is_active = g.isActive();\n            l.messageReceived(q);\n        },\n        _promoteTab: function(p, q, r) {\n            if (((((r && !r[p])) && q))) {\n                h.promoteThreadInPlaceOfThread(p, q);\n            }\n        ;\n        ;\n        },\n        newMessage: function(p, q, r, s) {\n            k.isThreadID(p);\n            var t = {\n                thread_id: p,\n                message_id: q.message_id\n            };\n            this._raiseTab(p, t);\n            this._promoteTab(p, r, s);\n            this._notify(p, q, t);\n            n.log(\"message\", t);\n        }\n    };\n    l.subscribe(\"before-alert\", function(p, JSBNG__event) {\n        var q = JSBNG__event.threadID, r = i.get(q), s = h.getTab(q);\n        if (((((((((((s && s.raised)) && r)) && r.isVisible())) && r.isFocused())) && r.tryMarkAsRead()))) {\n            m.markThreadSeen(q);\n            JSBNG__event.cancelAlert();\n        }\n    ;\n    ;\n    });\n    e.exports = o;\n});\n__d(\"ChatTabPresence\", [\"AvailableList\",\"ChatTabModel\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AvailableList\"), h = b(\"ChatTabModel\"), i = b(\"MercuryThreads\").get(), j = {\n    };\n    function k(l) {\n        var m = i.getCanonicalUserInThread(l);\n        if (m) {\n            g.updateForID(m);\n        }\n    ;\n    ;\n    };\n;\n    h.subscribe(\"chat/tabs-changed\", function(JSBNG__event, l) {\n        l.tabs.forEach(function(m) {\n            if (((m.raised && !j[m.id]))) {\n                k(m.id);\n            }\n        ;\n        ;\n        });\n        j = {\n        };\n        l.tabs.forEach(function(m) {\n            if (m.raised) {\n                j[m.id] = true;\n            }\n        ;\n        ;\n        });\n    });\n    e.exports = {\n    };\n});\n__d(\"ChatTabPolicy\", [\"ChatBehavior\",\"FBDesktopPlugin\",\"JSLogger\",\"MercuryActionTypeConstants\",\"MercuryAssert\",\"MercuryParticipants\",\"MercuryParticipantTypes\",\"MercurySourceType\",\"MercuryThreadMode\",\"MercuryThreadMuter\",\"MercuryUnseenState\",\"MessagingTag\",\"PresencePrivacy\",\"ShortProfiles\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatBehavior\"), h = b(\"FBDesktopPlugin\"), i = b(\"JSLogger\"), j = b(\"MercuryActionTypeConstants\"), k = b(\"MercuryAssert\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryParticipantTypes\"), n = b(\"MercurySourceType\"), o = b(\"MercuryThreadMode\"), p = b(\"MercuryThreadMuter\"), q = b(\"MercuryUnseenState\").get(), r = b(\"MessagingTag\"), s = b(\"PresencePrivacy\"), t = b(\"ShortProfiles\"), u = i.create(\"tab_policy\");\n    function v(w, x) {\n        q.markThreadSeen(w, x);\n    };\n;\n    e.exports = {\n        messageIsAllowed: function(w, x, y) {\n            var z = w.thread_id, aa = x.message_id;\n            k.isThreadID(z);\n            k.isParticipantID(x.author);\n            var ba;\n            if (p.isThreadMuted(w)) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mute_settings: w.mute_settings\n                };\n                u.log(\"message_thread_muted\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((w.mode == o.OBJECT_ORIGINATED))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    mode: w.mode\n                };\n                u.log(\"message_object_originated\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((((x.source == n.EMAIL)) || ((x.source == n.TITAN_EMAIL_REPLY))))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    source: x.source\n                };\n                u.log(\"message_source_not_allowed\", ba);\n                return;\n            }\n        ;\n        ;\n            var ca = l.getUserID(x.author);\n            if (!ca) {\n                u.log(\"message_bad_author\", {\n                    thread_id: z,\n                    message_id: aa,\n                    user: ca\n                });\n                return;\n            }\n        ;\n        ;\n            if (((x.action_type != j.USER_GENERATED_MESSAGE))) {\n                ba = {\n                    thread_id: z,\n                    message_id: aa,\n                    type: x.action_type\n                };\n                u.log(\"message_non_user_generated\", ba);\n                return;\n            }\n        ;\n        ;\n            if (((w.is_canonical_user && !g.notifiesUserMessages()))) {\n                u.log(\"message_jabber\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                v(z, true);\n                return;\n            }\n        ;\n        ;\n            if (((w.is_canonical && !w.canonical_fbid))) {\n                u.log(\"message_canonical_contact\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n        ;\n            if (h.shouldSuppressMessages()) {\n                u.log(\"message_desktop\", {\n                    thread_id: z,\n                    message_id: aa\n                });\n                return;\n            }\n        ;\n        ;\n            if (((w.folder != r.INBOX))) {\n                u.log(\"message_folder\", {\n                    thread_id: z,\n                    message_id: aa,\n                    folder: w.folder\n                });\n                return;\n            }\n        ;\n        ;\n            var da = l.getUserID(l.user);\n            t.getMulti([ca,da,], function(ea) {\n                if (!s.allows(ca)) {\n                    u.log(\"message_privacy\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n            ;\n                var fa = ((ea[ca].employee && ea[da].employee));\n                if (((!fa && ((ea[ca].type !== m.FRIEND))))) {\n                    u.log(\"message_non_friend\", {\n                        thread_id: z,\n                        message_id: aa,\n                        user: ca\n                    });\n                    return;\n                }\n            ;\n            ;\n                y();\n            });\n        }\n    };\n});\n__d(\"ChatTabViewSelector\", [\"JSBNG__Event\",\"Arbiter\",\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"MenuDeprecated\",\"MercuryThreadInformer\",\"MercuryThreads\",\"NubController\",\"ChatTabTemplates\",\"MercuryThreadMetadataRenderer\",\"Toggler\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"JSBNG__CSS\"), j = b(\"DataStore\"), k = b(\"DOM\"), l = b(\"MenuDeprecated\"), m = b(\"MercuryThreadInformer\").get(), n = b(\"MercuryThreads\").get(), o = b(\"NubController\"), p = b(\"ChatTabTemplates\"), q = b(\"MercuryThreadMetadataRenderer\").get(), r = b(\"Toggler\"), s = b(\"copyProperties\");\n    function t(u) {\n        var v = p[\":fb:chat:tab:selector\"].build(), w = v.getRoot(), x = v.getNode(\"menu\"), y = k.JSBNG__find(x, \".uiMenuInner\"), z = {\n        }, aa = new o().init(w);\n        i.hide(w);\n        k.insertBefore(u, w);\n        function ba(ea) {\n            var fa = 0;\n            {\n                var fin302keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin302i = (0);\n                var ga;\n                for (; (fin302i < fin302keys.length); (fin302i++)) {\n                    ((ga) = (fin302keys[fin302i]));\n                    {\n                        var ha = z[ga], ia = n.getThreadMetaNow(ga), ja = ha.getNode(\"unreadCount\"), ka = ((((ia && ia.unread_count)) || 0));\n                        fa += ka;\n                        if (((ka > 9))) {\n                            ka = \"+\";\n                        }\n                    ;\n                    ;\n                        i.conditionClass(ja, \"invisible_elem\", !ka);\n                        k.setContent(ja, ka);\n                    };\n                };\n            };\n        ;\n            var la = v.getNode(\"numMessages\");\n            i.conditionShow(la, fa);\n            k.setContent(la, fa);\n        };\n    ;\n        this.setTabData = function(ea) {\n            z = {\n            };\n            if (((ea.length < 1))) {\n                i.hide(w);\n                return;\n            }\n        ;\n        ;\n            i.show(w);\n            k.empty(y);\n            ea.forEach(function(fa) {\n                var ga = p[\":fb:chat:tab:selector:item\"].build();\n                z[fa.id] = ga;\n                var ha = ga.getNode(\"JSBNG__content\");\n                q.renderAndSeparatedParticipantList(fa.id, ha);\n                k.prependContent(y, ga.getRoot());\n                j.set(ga.getRoot(), \"threadID\", fa.id);\n                var ia = ga.getNode(\"closeButton\");\n                g.listen(ia, \"click\", function(JSBNG__event) {\n                    t.inform(\"selector/close-tab\", fa.id);\n                    JSBNG__event.kill();\n                });\n            });\n            aa.flyoutContentChanged();\n            k.setContent(v.getNode(\"numTabs\"), ea.length);\n            ba();\n        };\n        function ca(JSBNG__event, ea) {\n            if (((ea.menu != x))) {\n                return;\n            }\n        ;\n        ;\n            var fa = j.get(ea.JSBNG__item, \"threadID\");\n            t.inform(\"selected\", fa);\n            r.hide(w);\n        };\n    ;\n        function da(JSBNG__event, ea) {\n            l.register(x);\n        };\n    ;\n        l.subscribe(\"select\", ca.bind(this));\n        r.listen(\"show\", w, function() {\n            h.inform(\"layer_shown\", {\n                type: \"ChatTabSelector\"\n            });\n            da();\n        });\n        r.listen(\"hide\", w, function() {\n            h.inform(\"layer_hidden\", {\n                type: \"ChatTabSelector\"\n            });\n        });\n        m.subscribe(\"threads-updated\", ba);\n    };\n;\n    s(t, new h());\n    e.exports = t;\n});\n__d(\"ChatTabController\", [\"ChatTabPresence\",\"ChatTypeaheadBehavior\",\"Arbiter\",\"ChatActivity\",\"ChatConfig\",\"ChatNewMessageHandler\",\"ChatTabMessagesView\",\"ChatTabModel\",\"ChatTabPolicy\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSLogger\",\"MercuryParticipants\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MercuryUnseenState\",\"Style\",\"UserAgent\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    b(\"ChatTabPresence\");\n    b(\"ChatTypeaheadBehavior\");\n    var g = b(\"Arbiter\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatNewMessageHandler\"), k = b(\"ChatTabMessagesView\"), l = b(\"ChatTabModel\"), m = b(\"ChatTabPolicy\"), n = b(\"ChatTabView\"), o = b(\"ChatTabViewSelector\"), p = b(\"JSLogger\"), q = b(\"MercuryParticipants\"), r = b(\"MercuryThreadInformer\").get(), s = b(\"MercuryThreads\").get(), t = b(\"MercuryUnseenState\").get(), u = b(\"Style\"), v = b(\"UserAgent\"), w = b(\"VideoCallCore\"), x = ((i.get(\"tab_auto_close_timeout\") || 7200000)), y = p.create(\"tab_controller\");\n    function z(la) {\n        s.changeThreadReadStatus(la, true);\n        aa(la);\n    };\n;\n    function aa(la) {\n        t.markThreadSeen(la);\n    };\n;\n    function ba(la, ma, na) {\n        var oa = l.get().tabs;\n        la += ((ma ? 1 : -1));\n        while (((((la >= 0)) && ((la < oa.length))))) {\n            var pa = oa[la], qa = n.get(pa.id);\n            if (((((qa && qa.isVisible())) && ((!na || pa.raised))))) {\n                qa.JSBNG__focus();\n                return true;\n            }\n        ;\n        ;\n            la += ((ma ? 1 : -1));\n        };\n    ;\n        return false;\n    };\n;\n    function ca(la, ma, na) {\n        var oa = ma.shouldPromoteOnRaise(la);\n        g.inform(\"chat/promote-tab\", la);\n        if (oa) {\n            l.raiseAndPromoteTab(la, true, na);\n        }\n         else l.raiseTab(la, true, na);\n    ;\n    ;\n        var pa = n.get(la);\n        ((pa && pa.JSBNG__focus()));\n    };\n;\n    function da(la, ma, na) {\n        var oa = na.getMaxTabsToShow(), pa = l.indexOf(la);\n        l.closeTabAndDemote(la, ((oa - 2)), ma);\n        return pa;\n    };\n;\n    function ea(la) {\n        var ma = Object.keys(((la.getTabsToShow() || {\n        }))), na = ((1 * 60)), oa = null, pa = Infinity;\n        for (var qa = 0; ((qa < ma.length)); qa++) {\n            var ra = ma[qa], sa = s.getThreadMetaNow(ra);\n            if (((!n.get(ra).hasEmptyInput() || !sa))) {\n                continue;\n            }\n        ;\n        ;\n            var ta = ((((l.getServerTime() - sa.timestamp)) / 1000));\n            if (((!sa.timestamp || ((((sa.timestamp && ((sa.timestamp < pa)))) && ((ta > na))))))) {\n                oa = sa.thread_id;\n                pa = sa.timestamp;\n            }\n        ;\n        ;\n        };\n    ;\n        return oa;\n    };\n;\n    function fa(la) {\n        o.subscribe(\"selected\", function(na, oa) {\n            ca(oa, la);\n        });\n        g.subscribe(\"chat/open-tab\", function(na, oa) {\n            ca(oa.thread_id, la, oa.signature_id);\n        });\n        g.subscribe(\"page_transition\", function(na, oa) {\n            l.closeFragileTabs();\n        });\n        n.subscribe(\"read\", function(JSBNG__event, na) {\n            z(na);\n        });\n        h.subscribe(\"idle\", function(na, oa) {\n            if (((oa > x))) {\n                var pa = l.get().tabs;\n                pa.forEach(function(qa) {\n                    var ra = qa.id;\n                    s.getThreadMeta(ra, function(sa) {\n                        if (!sa.unread_count) {\n                            y.log(\"autoclose_idle_seen\", {\n                                thread_id: ra,\n                                idleness: oa\n                            });\n                            l.closeTab(ra, \"autoclose_idle_seen\");\n                        }\n                    ;\n                    ;\n                    });\n                });\n            }\n        ;\n        ;\n        });\n        n.subscribe(\"nub-activated\", function(na, oa) {\n            ca(oa, la);\n        });\n        n.subscribe(\"lower-activated\", function(na, oa) {\n            l.lowerTab(oa);\n            var pa = n.get(oa);\n            ((pa && pa.JSBNG__focus()));\n        });\n        function ma(na, oa) {\n            w.showOutgoingCallDialog(oa.userID, oa.clickSource);\n            l.lowerTab(oa.threadID);\n        };\n    ;\n        n.subscribe(\"video-call-clicked\", ma);\n        k.subscribe(\"video-call-clicked\", ma);\n        k.subscribe(\"interaction-with-tab\", function(na, oa) {\n            var pa = l.getTab(oa);\n            ((((pa && pa.raised)) && aa(oa)));\n        });\n        n.subscribe(\"closed-tab\", function(na, oa) {\n            y.log(\"close_view\", {\n                thread_id: oa\n            });\n            da(oa, \"close_view\", la);\n            return false;\n        });\n        n.subscribe(\"thread-deleted\", function(na, oa) {\n            y.log(\"close_thread_deleted\", {\n                thread_id: oa\n            });\n            da(oa, \"close_thread_deleted\", la);\n            return false;\n        });\n        n.subscribe(\"unsubscribed\", function(na, oa) {\n            y.log(\"close_view_unsubscribed\", {\n                thread_id: oa\n            });\n            da(oa, \"close_view_unsubscribed\", la);\n            return false;\n        });\n        n.subscribe(\"esc-pressed\", function(na, oa) {\n            y.log(\"close_esc\", {\n                thread_id: oa\n            });\n            var pa = da(oa, \"close_esc\", la);\n            (function() {\n                ((ba(((pa - 1)), true, true) || ba(pa, false, true)));\n            }).defer();\n        });\n        o.subscribe(\"selector/close-tab\", function(na, oa) {\n            y.log(\"close_chat_from_selector\", {\n                thread_id: oa\n            });\n            da(oa, \"close_chat_from_selector\", la);\n        });\n        r.subscribe(\"messages-received\", function(na, oa) {\n            {\n                var fin303keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin303i = (0);\n                var pa;\n                for (; (fin303i < fin303keys.length); (fin303i++)) {\n                    ((pa) = (fin303keys[fin303i]));\n                    {\n                        var qa = oa[pa];\n                        for (var ra = 0; ((ra < qa.length)); ra++) {\n                            var sa = qa[ra];\n                            if (((sa.author != q.user))) {\n                                if (!sa.is_unread) {\n                                    y.log(\"message_already_read\", {\n                                        action_id: sa.action_id,\n                                        thread_id: sa.thread_id\n                                    });\n                                    continue;\n                                }\n                            ;\n                            ;\n                                s.getThreadMeta(pa, function(ta) {\n                                    m.messageIsAllowed(ta, sa, function() {\n                                        var ua = ((la.hasRoomForRaisedTab() ? undefined : ea(la)));\n                                        j.newMessage(pa, sa, ua, la.getTabsToShow());\n                                    });\n                                });\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    };\n                };\n            };\n        ;\n        });\n        r.subscribe(\"thread-read-changed\", function(na, oa) {\n            {\n                var fin304keys = ((window.top.JSBNG_Replay.forInKeys)((oa))), fin304i = (0);\n                var pa;\n                for (; (fin304i < fin304keys.length); (fin304i++)) {\n                    ((pa) = (fin304keys[fin304i]));\n                    {\n                        if (!oa[pa].mark_as_read) {\n                            y.log(\"autoclose_marked_unread\", {\n                                thread_id: pa\n                            });\n                            l.closeTab(pa, \"autoclose_marked_unread\");\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        });\n        n.subscribe(\"tab-pressed\", function(na, oa) {\n            return !ba(l.indexOf(oa.id), oa.shiftPressed);\n        });\n        g.subscribe(p.DUMP_EVENT, function(na, oa) {\n            oa.chat_controller = {\n                auto_close_timeout: x\n            };\n        });\n    };\n;\n    if (v.firefox()) {\n        var ga = function() {\n            return ((((u.get(JSBNG__document.body, \"overflowX\") + \" \")) + u.get(JSBNG__document.body, \"overflowY\")));\n        }, ha = ga(), ia = function() {\n            var la = ga();\n            if (((la !== ha))) {\n                ha = la;\n                g.inform(\"overflow-applied-to-body\");\n            }\n        ;\n        ;\n        };\n        if (((\"JSBNG__MutationObserver\" in window))) {\n            var ja = new JSBNG__MutationObserver(ia), ka = {\n                attributes: true,\n                attributeFilter: [\"class\",\"style\",]\n            };\n            ja.observe(JSBNG__document.documentElement, ka);\n        }\n         else JSBNG__document.documentElement.JSBNG__addEventListener(\"DOMAttrModified\", function(JSBNG__event) {\n            if (((((JSBNG__event.getTarget() === JSBNG__document.documentElement)) && ((((JSBNG__event.attrName === \"class\")) || ((JSBNG__event.attrName === \"style\"))))))) {\n                ia();\n            }\n        ;\n        ;\n        }, false);\n    ;\n    ;\n    }\n;\n;\n    e.exports = fa;\n});\n__d(\"ChatTabViewCoordinator\", [\"Arbiter\",\"ChatTabModel\",\"ChatTabView\",\"ChatTabViewSelector\",\"JSBNG__CSS\",\"VideoCallCore\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatTabModel\"), i = b(\"ChatTabView\"), j = b(\"ChatTabViewSelector\"), k = b(\"JSBNG__CSS\"), l = b(\"VideoCallCore\");\n    function m(n, o) {\n        var p = new j(n), q = {\n        }, r = false;\n        function s() {\n            var w = h.get(), x = {\n            };\n            w.tabs.forEach(function(z) {\n                x[z.id] = 1;\n            });\n            {\n                var fin305keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin305i = (0);\n                var y;\n                for (; (fin305i < fin305keys.length); (fin305i++)) {\n                    ((y) = (fin305keys[fin305i]));\n                    {\n                        if (!x[y]) {\n                            q[y].destroy();\n                            delete (q[y]);\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            t(w);\n            u(w);\n        };\n    ;\n        function t(w) {\n            var x = null;\n            w.tabs.forEach(function(y) {\n                var z = y.id, aa = false;\n                if (!q[z]) {\n                    q[z] = new i(z, y.server_id, y.signatureID);\n                    aa = true;\n                }\n                 else q[z].updateSignatureID(y.signatureID);\n            ;\n            ;\n                if (((aa || !q[z].nextTabIs(x)))) {\n                    var ba = q[z].getScrollTop();\n                    if (x) {\n                        q[z].insertBefore(x);\n                    }\n                     else q[z].appendTo(n);\n                ;\n                ;\n                    if (ba) {\n                        q[z].setScrollTop(ba);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                x = q[z];\n            });\n        };\n    ;\n        function u(w) {\n            var x = o.getTabsToShow(w), y = [], z = false;\n            w.tabs.forEach(function(aa) {\n                if (!x[aa.id]) {\n                    q[aa.id].setVisibleState(false, aa.raised);\n                    y.push(aa);\n                }\n            ;\n            ;\n            });\n            w.tabs.forEach(function(aa) {\n                if (x[aa.id]) {\n                    q[aa.id].setVisibleState(true, aa.raised);\n                    z |= aa.raised;\n                }\n            ;\n            ;\n            });\n            p.setTabData(y);\n            v(z);\n        };\n    ;\n        function v(w) {\n            if (((!w && r))) {\n                g.inform(\"layer_hidden\", {\n                    type: \"ChatTab\"\n                });\n                r = false;\n            }\n             else if (((w && !r))) {\n                g.inform(\"layer_shown\", {\n                    type: \"ChatTab\"\n                });\n                r = true;\n            }\n            \n        ;\n        ;\n        };\n    ;\n        if (l.isSupported()) {\n            k.addClass(n, \"videoCallEnabled\");\n        }\n    ;\n    ;\n        o.subscribe(\"tabs-changed\", s);\n        s();\n    };\n;\n    e.exports = m;\n});\n__d(\"TabsViewport\", [\"Arbiter\",\"ArbiterMixin\",\"ChatTabModel\",\"Dock\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"Parent\",\"Vector\",\"ViewportBounds\",\"areObjectsEqual\",\"copyProperties\",\"csx\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatTabModel\"), j = b(\"Dock\"), k = b(\"DOM\"), l = b(\"DOMDimensions\"), m = b(\"JSBNG__Event\"), n = b(\"Parent\"), o = b(\"Vector\"), p = b(\"ViewportBounds\"), q = b(\"areObjectsEqual\"), r = b(\"copyProperties\"), s = b(\"csx\"), t = b(\"shield\"), u = 164, v = 264;\n    function w(x) {\n        this._root = x;\n        var y = this._recalculateWidth.bind(this);\n        m.listen(window, \"resize\", y);\n        j.subscribe(\"resize\", y);\n        g.subscribe([\"LitestandSidebar/expand\",\"LitestandSidebar/collapse\",], y);\n        g.subscribeOnce([\"sidebar/initialized\",\"LitestandSidebar/initialized\",], y, g.SUBSCRIBE_NEW);\n        i.subscribe(\"chat/tabs-changed\", t(this._recalculateTabs, this, true));\n        this._recalculateWidth();\n        this._initialized = true;\n    };\n;\n    r(w.prototype, h, {\n        _root: null,\n        _initialized: false,\n        _availableWidth: 0,\n        _maxShown: 1,\n        _viewState: null,\n        _recalculateWidth: function() {\n            var x = w._getAvailableDockWidth(this._root), y = Math.max(1, Math.floor(((x / v)))), z = ((y != this._maxShown));\n            if (((((((!this._viewState || z)) || ((x <= this._viewState.usedWidth)))) || ((x > this._viewState.widthToShowNext))))) {\n                this._availableWidth = x;\n                this._maxShown = y;\n                this._viewState = null;\n                this._recalculateTabs(z);\n            }\n        ;\n        ;\n        },\n        _onTabsChanged: function() {\n            if (this._initialized) {\n                this.inform(\"tabs-changed\");\n                this.inform(\"max-to-show-changed\", this._maxShown);\n                this.inform(\"max-to-show-change-completed\");\n            }\n        ;\n        ;\n        },\n        _recalculateTabs: function(x) {\n            var y = w._getTabsToShow(i.get(), this._availableWidth);\n            if (((x || !q(this._viewState, y)))) {\n                this._viewState = y;\n                this._onTabsChanged();\n            }\n        ;\n        ;\n        },\n        getMaxTabsToShow: function() {\n            return this._maxShown;\n        },\n        checkWidth: function() {\n            this._recalculateWidth();\n        },\n        hasRoomForRaisedTab: function() {\n            return ((((this._availableWidth - this._viewState.usedWidth)) > v));\n        },\n        getTabsToShow: function() {\n            return JSON.parse(JSON.stringify(this._viewState.tabsToShow));\n        },\n        shouldPromoteOnRaise: function(x) {\n            if (!this._viewState.tabsToShow[x]) {\n                return true;\n            }\n        ;\n        ;\n            if (((this._viewState.nextToHide != x))) {\n                return false;\n            }\n        ;\n        ;\n            var y = i.getTab(x), z = ((y && y.raised));\n            return ((!z && ((((this._availableWidth - this._viewState.usedWidth)) < 100))));\n        }\n    });\n    r(w, {\n        _getAvailableDockWidth: function(x) {\n            var y = l.getViewportWithoutScrollbarDimensions().width;\n            y -= ((p.getLeft() + p.getRight()));\n            y -= 50;\n            var z = n.byClass(x, \"fbDock\"), aa = k.JSBNG__find(z, \".-cx-PUBLIC-fbDockChatBuddyListNub__container\"), ba = o.getElementDimensions(aa).x;\n            y -= ba;\n            var ca = k.JSBNG__find(z, \".-cx-PUBLIC-fbMercuryChatTab__container\");\n            ba += o.getElementDimensions(ca).x;\n            var da = o.getElementDimensions(z), ea = ((da.x - ba));\n            y -= ea;\n            y -= 15;\n            return Math.max(y, 0);\n        },\n        _getTabsToShow: function(x, y) {\n            y = Math.max(y, ((v + 1)));\n            function z(oa) {\n                return ((oa.raised ? v : u));\n            };\n        ;\n            var aa = JSON.parse(JSON.stringify(x.tabs)), ba = -1, ca = null;\n            if (x.promoted) {\n                aa.forEach(function(oa, pa) {\n                    if (((oa.id === x.promoted))) {\n                        ba = pa;\n                        ca = oa;\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            var da = 0, ea = 0, fa = !ca;\n            aa.forEach(function(oa, pa) {\n                var qa = z(oa);\n                oa.leftmostOffset = ((da + v));\n                da += qa;\n                if (((oa.leftmostOffset < y))) {\n                    ea++;\n                }\n            ;\n            ;\n                fa |= ((pa == ba));\n                oa.alreadyPlacedPromoted = fa;\n            });\n            function ga(oa, pa, qa) {\n                var ra = {\n                };\n                for (var sa = 0; ((sa < pa)); sa++) {\n                    var ta = oa[sa];\n                    if (((!ta.alreadyPlacedPromoted && ((sa == ((pa - 1))))))) {\n                        ra[qa] = true;\n                    }\n                     else ra[ta.id] = true;\n                ;\n                ;\n                };\n            ;\n                return ra;\n            };\n        ;\n            var ha = ga(aa, ea, x.promoted), ia = ga(aa, ((ea - 1)), x.promoted), ja = null;\n            {\n                var fin306keys = ((window.top.JSBNG_Replay.forInKeys)((ha))), fin306i = (0);\n                var ka;\n                for (; (fin306i < fin306keys.length); (fin306i++)) {\n                    ((ka) = (fin306keys[fin306i]));\n                    {\n                        if (!ia[ka]) {\n                            ja = ka;\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            var la = aa[((ea - 1))], ma = ((la ? la.leftmostOffset : 0)), na = Infinity;\n            if (((ea < aa.length))) {\n                na = aa[ea].leftmostOffset;\n            }\n        ;\n        ;\n            return {\n                nextToHide: ja,\n                tabsToShow: ha,\n                usedWidth: ma,\n                widthToShowNext: na\n            };\n        }\n    });\n    e.exports = w;\n});");
// 16064
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o191,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yf/r/_oJ2eyBZFAi.js",o192);
// undefined
o191 = null;
// undefined
o192 = null;
// 16069
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"4/uwC\",]);\n}\n;\n__d(\"MercuryAudioPlayer\", [\"Event\",\"Arbiter\",\"DOM\",\"Flash\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"Flash\"), k = b(\"copyProperties\"), l = 200;\n    function m() {\n        var v = i.create(\"audio\"), w = false;\n        try {\n            if (!!v.canPlayType) {\n                if (v.canPlayType(\"video/mp4;\").replace(/^no$/, \"\")) {\n                    w = true;\n                }\n            };\n        } finally {\n            return w;\n        };\n    };\n    function n() {\n        return j.isAvailable();\n    };\n    var o = function() {\n        this.interval = null;\n        this.arbiterInstance = null;\n        this.audio = i.create(\"audio\");\n        g.listen(this.audio, \"playing\", function() {\n            this.informAttachment(\"playing\", this.audio.currentTime);\n            this.interval = setInterval(function() {\n                this.informAttachment(\"playing\", this.audio.currentTime);\n            }.bind(this), l);\n        }.bind(this));\n        g.listen(this.audio, \"ended\", function() {\n            clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(o.prototype, {\n        setAudio: function(v, w) {\n            this.audio.setAttribute(\"src\", v);\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            };\n        },\n        play: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            this.audio.pause();\n            clearInterval(this.interval);\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"html5\";\n        }\n    });\n    var p = function() {\n        this.src = null;\n        this.arbiterInstance = null;\n        var v = i.create(\"div\");\n        document.body.appendChild(v);\n        this.swf = j.embed(\"/swf/SoundStreamPlayer.swf\", v, null, {\n        });\n        this.interval = null;\n        h.subscribe(\"soundstream/finished\", function() {\n            clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(p.prototype, {\n        setAudio: function(v, w) {\n            this.src = v;\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            };\n        },\n        play: function() {\n            this.swf.playSound(this.src);\n            this.interval = setInterval(function() {\n                var v = this.swf.getCurrentTime();\n                this.informAttachment(\"playing\", v);\n            }.bind(this), l);\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.swf.resume();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            clearInterval(this.interval);\n            this.swf.pause();\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"flash\";\n        }\n    });\n    function q() {\n        if (m()) {\n            return new o();\n        }\n         else if (n()) {\n            return new p()\n        }\n    ;\n        return false;\n    };\n    var r = null, s = null, t = 0;\n    function u(v, w) {\n        this.src = v;\n        this.arbiterInstance = w;\n        this.audio_id = ++t;\n        ((r !== null) || (r = q()));\n        if (!r) {\n            return false\n        };\n    };\n    k(u.prototype, {\n        getType: function() {\n            if (!r) {\n                return false;\n            }\n             else return r.getType()\n        ;\n        },\n        play: function(v) {\n            if ((v && (s == this.audio_id))) {\n                r.resume();\n            }\n             else {\n                this.pause();\n                s = this.audio_id;\n                r.setAudio(this.src, this.arbiterInstance);\n                r.play();\n            }\n        ;\n        },\n        pause: function() {\n            r.pause();\n        }\n    });\n    e.exports = u;\n});\n__d(\"MercuryAttachmentAudioClip.react\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryAudioPlayer\",\"Env\",\"JSLogger\",\"LeftRight.react\",\"React\",\"cx\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryAudioPlayer\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"LeftRight.react\"), m = b(\"React\"), n = b(\"cx\"), o = b(\"shield\"), p = b(\"tx\"), q = \"MercuryAttachmentAudioClip/play\", r = k.create(\"mercury_audio_clip\"), s = m.createClass({\n        displayName: \"AudioClip\",\n        mixins: [h,],\n        getInitialState: function() {\n            this.subscribe(\"playing\", this.updateTime);\n            this.subscribe(\"played\", o(this.setState, this, {\n                playing: true,\n                started: true\n            }));\n            this.subscribe(\"paused\", o(this.setState, this, {\n                playing: false\n            }));\n            this.subscribe(\"finished\", o(this.setState, this, {\n                playing: false,\n                started: false,\n                time: this.props.duration\n            }));\n            this.logged = false;\n            var t = (this.props.downloadOnly ? false : new i(this.props.src, this));\n            g.subscribe(q, function(u, v) {\n                if ((this.props.src != v)) {\n                    this.setState({\n                        time: 0\n                    });\n                };\n            }.bind(this));\n            return {\n                time: 0,\n                playing: false,\n                started: false,\n                duration: this.props.duration,\n                audioPlayer: t\n            };\n        },\n        updateTime: function(t, u) {\n            this.setState({\n                time: u\n            });\n        },\n        play: function() {\n            if (this.state.playing) {\n                this.state.audioPlayer.pause();\n            }\n             else {\n                this.state.audioPlayer.play(this.state.started);\n                g.inform(q, this.props.src);\n                if (!this.logged) {\n                    this.logged = true;\n                    r.log(\"play\", {\n                        uid: j.user,\n                        duration: this.props.duration\n                    });\n                }\n            ;\n            }\n        ;\n        },\n        _formatSeconds: function(t) {\n            if (t) {\n                t = Math.ceil(t);\n                var u = (t % 60);\n                if ((u < 10)) {\n                    u = (\"0\" + u);\n                };\n                var v = Math.floor((t / 60));\n                return ((v + \":\") + u);\n            }\n             else return null\n        ;\n        },\n        _renderPlayer: function(t, u) {\n            return (m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\",\n                style: {\n                    width: t\n                },\n                onClick: this.play\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__play\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__playicon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__duration\"\n            }, u), m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__scrubber\"\n            })));\n        },\n        render: function() {\n            var t = this.state.time, u = this.state.playing, v = this._formatSeconds(this.state.duration), w = (this.props.width || 170), x = null, y = Math.ceil((((t * ((w + 2)))) / this.state.duration));\n            if ((this.state.audioPlayer && this.state.audioPlayer.getType())) {\n                var z = this._renderPlayer(w, v), aa = this._renderPlayer(w, v), ba = ((((\"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\") + (((u && ((t !== 0))) ? (\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__playing\") : \"\"))) + (((u && ((t === 0))) ? (\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__loading\") : \"\"))));\n                x = (m.DOM.div({\n                    className: ba\n                }, z, m.DOM.div({\n                    className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__progresser\",\n                    style: {\n                        width: y\n                    }\n                }, aa)));\n            }\n             else x = (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\"\n            }, l(null, m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadbox\",\n                href: this.props.src\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speaker\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speakericon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadtext\"\n            }, \"Voice Message\"), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__durationinline\"\n            }, v)), m.DOM.a({\n                href: this.props.src,\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__download\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadicon\"\n            }))))));\n        ;\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__root\"\n            }, x));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryStickersFlyoutList.react\", [\"Animation\",\"React\",\"Image.react\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"React\"), i = b(\"Image.react\"), j = b(\"cx\"), k = b(\"fbt\"), l = b(\"ix\"), m = 5, n = \"Sticker Store\", o = h.createClass({\n        displayName: \"MercuryStickersFlyoutList\",\n        _calculateNumPages: function(q) {\n            return Math.max(1, Math.ceil((((q.length - 1)) / m)));\n        },\n        getInitialState: function() {\n            return {\n                animating: false,\n                selectedId: this.props.packs[0].id,\n                page: 0,\n                numPages: this._calculateNumPages(this.props.packs)\n            };\n        },\n        componentWillReceiveProps: function(q) {\n            this.setState({\n                numPages: this._calculateNumPages(q.packs)\n            });\n        },\n        shouldComponentUpdate: function(q, r) {\n            return !r.animating;\n        },\n        _canGoPrev: function() {\n            return (this.state.page > 0);\n        },\n        _canGoNext: function() {\n            return ((this.state.page + 1) < this.state.numPages);\n        },\n        _setPage: function(q) {\n            if (this.state.animating) {\n                return\n            };\n            this.setState({\n                animating: true,\n                page: q\n            });\n            var r = this.refs.positioner.getDOMNode();\n            new g(r).to(\"marginLeft\", (-r.childNodes[q].offsetLeft + \"px\")).ondone(function() {\n                this.setState({\n                    animating: false\n                });\n            }.bind(this)).duration(200).go();\n        },\n        _back: function() {\n            (this._canGoPrev() && this._setPage((this.state.page - 1)));\n        },\n        _next: function() {\n            (this._canGoNext() && this._setPage((this.state.page + 1)));\n        },\n        render: function() {\n            var q = this.props.packs, r = this.props.onPackClick, s = [];\n            q.forEach(function(y, z) {\n                s.push(p({\n                    key: y.id,\n                    onClick: function() {\n                        (r && r(y.id));\n                        this.setState({\n                            selectedId: y.id\n                        });\n                    }.bind(this),\n                    pack: y,\n                    selected: (this.state.selectedId === y.id)\n                }));\n            }.bind(this));\n            var t = [], u = [];\n            s.forEach(function(y, z) {\n                u.push(y);\n                if (((z > 0) && ((((z % m) === 0) || (z === (s.length - 1)))))) {\n                    t.push(h.DOM.div({\n                        className: \"-cx-PRIVATE-fbMercuryStickersSelector__page\"\n                    }, u));\n                    u = [];\n                }\n            ;\n            });\n            var v = ((((\"-cx-PRIVATE-fbMercuryStickersSelector__left\") + ((\" \" + \"lfloat\"))) + ((!this._canGoPrev() ? (\" \" + \"hidden_elem\") : \"\")))), w = ((((\"-cx-PRIVATE-fbMercuryStickersSelector__right\") + ((\" \" + \"rfloat\"))) + ((!this._canGoNext() ? (\" \" + \"hidden_elem\") : \"\")))), x;\n            if ((t.length > 1)) {\n                x = h.DOM.a({\n                    className: w,\n                    onClick: this._next\n                }, i({\n                    className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                    src: l(\"/images/messaging/stickers/selector/rightarrow.png\")\n                }));\n            };\n            return (h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__root\"\n            }, h.DOM.a({\n                ajaxify: \"/ajax/messaging/stickers/store\",\n                \"aria-label\": n,\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__store rfloat\",\n                \"data-hover\": \"tooltip\",\n                ref: \"store\",\n                rel: \"dialog\"\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__storeicon\",\n                src: l(\"/images/messaging/stickers/selector/store.png\")\n            })), h.DOM.a({\n                className: v,\n                onClick: this._back\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                src: l(\"/images/messaging/stickers/selector/leftarrow.png\")\n            })), x, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__icons\"\n            }, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__positioner\",\n                ref: \"positioner\"\n            }, t))));\n        }\n    }), p = h.createClass({\n        displayName: \"PackIcon\",\n        render: function() {\n            var q = this.props.pack, r = (((\"-cx-PRIVATE-fbMercuryStickersFlyout__packselector\") + ((this.props.selected ? (\" \" + \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedpack\") : \"\"))));\n            return (h.DOM.a({\n                \"aria-label\": q.name,\n                className: r,\n                \"data-id\": q.id,\n                \"data-hover\": \"tooltip\",\n                onClick: function() {\n                    (this.props.onClick && this.props.onClick(q.id));\n                }.bind(this),\n                tabIndex: \"0\"\n            }, h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__packicon\",\n                src: q.icon\n            }), h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedicon\",\n                src: q.selectedIcon\n            })));\n        }\n    });\n    e.exports = o;\n});\n__d(\"str2rstr\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = \"\", j, k;\n        for (var l = 0; (l < h.length); l++) {\n            j = h.charCodeAt(l);\n            k = (((l + 1) < h.length) ? h.charCodeAt((l + 1)) : 0);\n            if (((((55296 <= j) && (j <= 56319)) && (56320 <= k)) && (k <= 57343))) {\n                j = ((65536 + ((((j & 1023)) << 10))) + ((k & 1023)));\n                l++;\n            }\n        ;\n            if ((j <= 127)) {\n                i += String.fromCharCode(j);\n            }\n             else if ((j <= 2047)) {\n                i += String.fromCharCode((192 | ((((j >>> 6)) & 31))), (128 | ((j & 63))));\n            }\n             else if ((j <= 65535)) {\n                i += String.fromCharCode((224 | ((((j >>> 12)) & 15))), (128 | ((((j >>> 6)) & 63))), (128 | ((j & 63))));\n            }\n             else if ((j <= 2097151)) {\n                i += String.fromCharCode((240 | ((((j >>> 18)) & 7))), (128 | ((((j >>> 12)) & 63))), (128 | ((((j >>> 6)) & 63))), (128 | ((j & 63))));\n            }\n            \n            \n        ;\n        };\n        return i;\n    };\n    e.exports = g;\n});\n__d(\"md5\", [\"str2rstr\",], function(a, b, c, d, e, f) {\n    var g = b(\"str2rstr\");\n    function h(u, v) {\n        var w = u[0], x = u[1], y = u[2], z = u[3];\n        w = j(w, x, y, z, v[0], 7, -680876936);\n        z = j(z, w, x, y, v[1], 12, -389564586);\n        y = j(y, z, w, x, v[2], 17, 606105819);\n        x = j(x, y, z, w, v[3], 22, -1044525330);\n        w = j(w, x, y, z, v[4], 7, -176418897);\n        z = j(z, w, x, y, v[5], 12, 1200080426);\n        y = j(y, z, w, x, v[6], 17, -1473231341);\n        x = j(x, y, z, w, v[7], 22, -45705983);\n        w = j(w, x, y, z, v[8], 7, 1770035416);\n        z = j(z, w, x, y, v[9], 12, -1958414417);\n        y = j(y, z, w, x, v[10], 17, -42063);\n        x = j(x, y, z, w, v[11], 22, -1990404162);\n        w = j(w, x, y, z, v[12], 7, 1804603682);\n        z = j(z, w, x, y, v[13], 12, -40341101);\n        y = j(y, z, w, x, v[14], 17, -1502002290);\n        x = j(x, y, z, w, v[15], 22, 1236535329);\n        w = k(w, x, y, z, v[1], 5, -165796510);\n        z = k(z, w, x, y, v[6], 9, -1069501632);\n        y = k(y, z, w, x, v[11], 14, 643717713);\n        x = k(x, y, z, w, v[0], 20, -373897302);\n        w = k(w, x, y, z, v[5], 5, -701558691);\n        z = k(z, w, x, y, v[10], 9, 38016083);\n        y = k(y, z, w, x, v[15], 14, -660478335);\n        x = k(x, y, z, w, v[4], 20, -405537848);\n        w = k(w, x, y, z, v[9], 5, 568446438);\n        z = k(z, w, x, y, v[14], 9, -1019803690);\n        y = k(y, z, w, x, v[3], 14, -187363961);\n        x = k(x, y, z, w, v[8], 20, 1163531501);\n        w = k(w, x, y, z, v[13], 5, -1444681467);\n        z = k(z, w, x, y, v[2], 9, -51403784);\n        y = k(y, z, w, x, v[7], 14, 1735328473);\n        x = k(x, y, z, w, v[12], 20, -1926607734);\n        w = l(w, x, y, z, v[5], 4, -378558);\n        z = l(z, w, x, y, v[8], 11, -2022574463);\n        y = l(y, z, w, x, v[11], 16, 1839030562);\n        x = l(x, y, z, w, v[14], 23, -35309556);\n        w = l(w, x, y, z, v[1], 4, -1530992060);\n        z = l(z, w, x, y, v[4], 11, 1272893353);\n        y = l(y, z, w, x, v[7], 16, -155497632);\n        x = l(x, y, z, w, v[10], 23, -1094730640);\n        w = l(w, x, y, z, v[13], 4, 681279174);\n        z = l(z, w, x, y, v[0], 11, -358537222);\n        y = l(y, z, w, x, v[3], 16, -722521979);\n        x = l(x, y, z, w, v[6], 23, 76029189);\n        w = l(w, x, y, z, v[9], 4, -640364487);\n        z = l(z, w, x, y, v[12], 11, -421815835);\n        y = l(y, z, w, x, v[15], 16, 530742520);\n        x = l(x, y, z, w, v[2], 23, -995338651);\n        w = m(w, x, y, z, v[0], 6, -198630844);\n        z = m(z, w, x, y, v[7], 10, 1126891415);\n        y = m(y, z, w, x, v[14], 15, -1416354905);\n        x = m(x, y, z, w, v[5], 21, -57434055);\n        w = m(w, x, y, z, v[12], 6, 1700485571);\n        z = m(z, w, x, y, v[3], 10, -1894986606);\n        y = m(y, z, w, x, v[10], 15, -1051523);\n        x = m(x, y, z, w, v[1], 21, -2054922799);\n        w = m(w, x, y, z, v[8], 6, 1873313359);\n        z = m(z, w, x, y, v[15], 10, -30611744);\n        y = m(y, z, w, x, v[6], 15, -1560198380);\n        x = m(x, y, z, w, v[13], 21, 1309151649);\n        w = m(w, x, y, z, v[4], 6, -145523070);\n        z = m(z, w, x, y, v[11], 10, -1120210379);\n        y = m(y, z, w, x, v[2], 15, 718787259);\n        x = m(x, y, z, w, v[9], 21, -343485551);\n        u[0] = s(w, u[0]);\n        u[1] = s(x, u[1]);\n        u[2] = s(y, u[2]);\n        u[3] = s(z, u[3]);\n    };\n    function i(u, v, w, x, y, z) {\n        v = s(s(v, u), s(x, z));\n        return s((((v << y)) | ((v >>> ((32 - y))))), w);\n    };\n    function j(u, v, w, x, y, z, aa) {\n        return i((((v & w)) | (((~v) & x))), u, v, y, z, aa);\n    };\n    function k(u, v, w, x, y, z, aa) {\n        return i((((v & x)) | ((w & (~x)))), u, v, y, z, aa);\n    };\n    function l(u, v, w, x, y, z, aa) {\n        return i(((v ^ w) ^ x), u, v, y, z, aa);\n    };\n    function m(u, v, w, x, y, z, aa) {\n        return i((w ^ ((v | (~x)))), u, v, y, z, aa);\n    };\n    function n(u) {\n        var v = u.length, w = [1732584193,-271733879,-1732584194,271733878,], x;\n        for (x = 64; (x <= u.length); x += 64) {\n            h(w, o(u.substring((x - 64), x)));;\n        };\n        u = u.substring((x - 64));\n        var y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,];\n        for (x = 0; (x < u.length); x++) {\n            y[(x >> 2)] |= (u.charCodeAt(x) << ((((x & 3)) << 3)));;\n        };\n        y[(x >> 2)] |= (128 << ((((x & 3)) << 3)));\n        if ((x > 55)) {\n            h(w, y);\n            for (x = 0; (x < 16); x++) {\n                y[x] = 0;;\n            };\n        }\n    ;\n        y[14] = (v * 8);\n        h(w, y);\n        return w;\n    };\n    function o(u) {\n        var v = [], w = 0;\n        while ((w < 64)) {\n            v[(w >> 2)] = (((u.charCodeAt(w++) | ((u.charCodeAt(w++) << 8))) | ((u.charCodeAt(w++) << 16))) | ((u.charCodeAt(w++) << 24)));;\n        };\n        return v;\n    };\n    var p = \"0123456789abcdef\".split(\"\");\n    function q(u) {\n        var v = \"\", w = 0;\n        for (; (w < 4); w++) {\n            v += (p[(((u >> ((((w << 3)) + 4)))) & 15)] + p[(((u >> ((w << 3)))) & 15)]);;\n        };\n        return v;\n    };\n    function r(u) {\n        for (var v = 0; (v < u.length); v++) {\n            u[v] = q(u[v]);;\n        };\n        return u.join(\"\");\n    };\n    var s = function(u, v) {\n        return (((u + v)) & 4294967295);\n    };\n    function t(u) {\n        if (((null === u) || (undefined === u))) {\n            return null;\n        }\n         else {\n            for (var v = 0; (v < u.length); v++) {\n                if ((u[v] > \"\")) {\n                    u = g(u);\n                    break;\n                }\n            ;\n            };\n            return r(n(u));\n        }\n    ;\n    };\n    if ((t(\"hello\") != \"5d41402abc4b2a76b9719d911017c592\")) {\n        s = function(u, v) {\n            var w = (((u & 65535)) + ((v & 65535))), x = ((((u >> 16)) + ((v >> 16))) + ((w >> 16)));\n            return (((x << 16)) | ((w & 65535)));\n        };\n    };\n    e.exports = t;\n});\n__d(\"isRTL\", [], function(a, b, c, d, e, f) {\n    var g = (\"A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u0300-\\u0590\\u0800-\\u1fff\" + \"\\u200e\\u2c00-\\ufb1c\\ufe00-\\ufe6f\\ufefd-\\uffff\"), h = \"\\u0591-\\u07ff\\u200f\\ufb1d-\\ufdff\\ufe70-\\ufefc\", i = new RegExp(((((\"^[^\" + g) + \"]*[\") + h) + \"]\")), j = new RegExp(((\"[\" + g) + \"]\"));\n    function k(l) {\n        var m = 0, n = 0;\n        l.split(/\\s+/, 20).forEach(function(o) {\n            if (/^https?:\\/\\//.test(o)) {\n                return\n            };\n            if (i.test(o)) {\n                n++;\n                m++;\n            }\n             else if (j.test(o)) {\n                m++;\n            }\n        ;\n        });\n        return !!((m && (((n / m) > 13944))));\n    };\n    e.exports = k;\n});\n__d(\"WaterfallIDGenerator\", [\"Env\",\"md5\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"md5\");\n    function i() {\n        var l = 2147483647;\n        return (Math.random() * l);\n    };\n    function j() {\n        return Math.floor((Date.now() / 1000));\n    };\n    var k = {\n        generate: function() {\n            return h([g.user,j(),i(),].join(\":\"));\n        }\n    };\n    e.exports = k;\n});\n__d(\"FileForm\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"AsyncUploadRequest\",\"BehaviorsMixin\",\"DataStore\",\"DOMQuery\",\"Env\",\"Event\",\"Form\",\"JSONPTransport\",\"Parent\",\"URI\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"AsyncUploadRequest\"), k = b(\"BehaviorsMixin\"), l = b(\"DataStore\"), m = b(\"DOMQuery\"), n = b(\"Env\"), o = b(\"Event\"), p = b(\"Form\"), q = b(\"JSONPTransport\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"copyProperties\"), u = b(\"shield\");\n    function v(y) {\n        var z = {\n        }, aa = m.scry(y, \"input[type=\\\"file\\\"]\");\n        aa.forEach(function(ba) {\n            z[ba.name] = ba.files;\n        });\n        return z;\n    };\n    function w(y) {\n        var z = m.scry(y, \"input[type=\\\"file\\\"]\");\n        z.forEach(function(aa) {\n            aa.files = null;\n        });\n    };\n    function x(y, z, aa) {\n        if ((y.getAttribute(\"rel\") === \"async\")) {\n            throw new Error(\"FileForm cannot be used with Primer forms.\")\n        };\n        if ((y.getAttribute(\"method\").toUpperCase() !== \"POST\")) {\n            throw new Error(\"FileForm must be used with POST forms.\")\n        };\n        this._form = y;\n        this._previousEncoding = this._form.enctype;\n        this._form.enctype = this._form.encoding = \"multipart/form-data\";\n        (z && this.enableBehaviors(z));\n        this._options = (aa || {\n        });\n        this.setAllowCrossOrigin(this._options.allowCrossOrigin);\n        this.setUploadInParallel(this._options.uploadInParallel);\n        this._listener = o.listen(this._form, \"submit\", this._submit.bind(this));\n        l.set(this._form, \"FileForm\", this);\n    };\n    t(x, {\n        EVENTS: [\"start\",\"submit\",\"initial\",\"progress\",\"success\",\"failure\",],\n        getInstance: function(y) {\n            return l.get(y, \"FileForm\");\n        }\n    });\n    t(x.prototype, g, k, {\n        getRoot: function() {\n            return this._form;\n        },\n        setAllowCrossOrigin: function(y) {\n            this._allowCrossOrigin = !!y;\n            return this;\n        },\n        setUploadInParallel: function(y) {\n            this._uploadInParallel = !!y;\n            return this;\n        },\n        _submit: function(event) {\n            if ((this.inform(\"submit\") === false)) {\n                event.prevent();\n                return;\n            }\n        ;\n            var y = (\"FormData\" in window);\n            if (y) {\n                if ((!s(this._form.action).isSameOrigin() && !this._allowCrossOrigin)) {\n                    y = false;\n                }\n            };\n            return (y ? this._sendViaXHR(event) : this._sendViaFrame(event));\n        },\n        _sendViaFrame: function(event) {\n            var y = this._request = new h();\n            y.setStatusElement(this._getStatusElement());\n            y.addStatusIndicator();\n            y.setOption(\"useIframeTransport\", true);\n            var z = y.handleResponse.bind(y), aa = new q(\"iframe\", this._form.action, z), ba = aa.getTransportFrame(), ca = aa.getRequestURI().addQueryData({\n                __iframe: true,\n                __user: n.user\n            });\n            this._form.setAttribute(\"action\", ca.toString());\n            this._form.setAttribute(\"target\", ba.name);\n            y.setJSONPTransport(aa);\n            y.setURI(ca);\n            y.setHandler(this.success.bind(this, null));\n            y.setErrorHandler(this.failure.bind(this, null));\n            y.setInitialHandler(u(this.initial, this, null));\n        },\n        _sendViaXHR: function(event) {\n            var y;\n            if ((this._uploadInParallel && j.isSupported())) {\n                y = new j().setData(p.serialize(this._form)).setFiles(v(this._form));\n                var z = [y.subscribe(\"progress\", function(aa, ba) {\n                    this.progress(ba, ba.getProgressEvent());\n                }.bind(this)),y.subscribe(\"initial\", function(aa, ba) {\n                    this.initial(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"success\", function(aa, ba) {\n                    this.success(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"start\", function(aa, ba) {\n                    this.inform(\"start\", {\n                        upload: ba\n                    });\n                }.bind(this)),y.subscribe(\"failure\", function(aa, ba) {\n                    this.failure(ba, ba.getResponse());\n                    return false;\n                }.bind(this)),y.subscribe(\"complete\", function() {\n                    while (z.length) {\n                        z.pop().unsubscribe();;\n                    };\n                }),];\n            }\n             else y = new h().setRawData(p.createFormData(this._form)).setHandler(this.success.bind(this, null)).setErrorHandler(this.failure.bind(this, null)).setUploadProgressHandler(this.progress.bind(this, null)).setInitialHandler(u(this.initial, this, null));\n        ;\n            y.setAllowCrossOrigin(this._allowCrossOrigin).setRelativeTo(this._form).setStatusElement(this._getStatusElement()).setURI(this._form.action).send();\n            this._request = y;\n            event.prevent();\n        },\n        initial: function(y) {\n            return this.inform(\"initial\", {\n                upload: y\n            });\n        },\n        success: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if ((this.inform(\"success\", aa) !== false)) {\n                o.fire(this._form, \"success\", aa);\n            };\n            this._cleanup();\n        },\n        failure: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if ((this.inform(\"failure\", aa) !== false)) {\n                if ((o.fire(this._form, \"error\", aa) !== false)) {\n                    i.defaultErrorHandler(z);\n                }\n            };\n            this._cleanup();\n        },\n        progress: function(y, event) {\n            this.inform(\"progress\", {\n                event: event,\n                upload: y\n            });\n        },\n        abort: function() {\n            if (this._request) {\n                this._request.abort();\n                this._cleanup();\n            }\n        ;\n        },\n        clear: function() {\n            w(this._form);\n        },\n        destroy: function() {\n            this._cleanup();\n            this._listener.remove();\n            this._listener = null;\n            this._form.enctype = this._form.encoding = this._previousEncoding;\n            l.remove(this._form, \"FileForm\");\n        },\n        _cleanup: function() {\n            this._request = null;\n        },\n        _getStatusElement: function() {\n            return (r.byClass(this._form, \"stat_elem\") || this._form);\n        }\n    });\n    e.exports = x;\n});\n__d(\"FileFormResetOnSubmit\", [\"DOMQuery\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._form = j;\n    };\n    h(i.prototype, {\n        enable: function() {\n            this._subscription = this._form.subscribe(\"submit\", Function.prototype.defer.bind(this._reset.bind(this)));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _reset: function() {\n            var j = g.scry(this._form.getRoot(), \"input[type=\\\"file\\\"]\");\n            j.forEach(function(k) {\n                k.value = \"\";\n            });\n        }\n    });\n    e.exports = i;\n});\n__d(\"submitForm\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = function(i) {\n        var j = g.scry(i, \"input[type=\\\"submit\\\"]\")[0];\n        if (j) {\n            j.click();\n        }\n         else {\n            j = g.create(\"input\", {\n                type: \"submit\",\n                className: \"hidden_elem\"\n            });\n            g.appendContent(i, j);\n            j.click();\n            g.remove(j);\n        }\n    ;\n    };\n    e.exports = h;\n});\n__d(\"FormSubmitOnChange\", [\"Event\",\"copyProperties\",\"submitForm\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"copyProperties\"), i = b(\"submitForm\");\n    function j(k) {\n        this._form = k;\n    };\n    h(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._form.getRoot(), \"change\", this._submit.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _submit: function() {\n            i(this._form.getRoot());\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFileUploader\", [\"ArbiterMixin\",\"CSS\",\"Dialog\",\"DOM\",\"Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachment\",\"MercuryAttachmentTemplates\",\"MercuryConstants\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getObjectValues\",\"shield\",\"startsWith\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"CSS\"), i = b(\"Dialog\"), j = b(\"DOM\"), k = b(\"Event\"), l = b(\"FileForm\"), m = b(\"FileFormResetOnSubmit\"), n = b(\"FileInput\"), o = b(\"FormSubmitOnChange\"), p = b(\"MercuryAttachment\"), q = b(\"MercuryAttachmentTemplates\"), r = b(\"MercuryConstants\"), s = b(\"SubscriptionsHandler\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"getObjectValues\"), w = b(\"shield\"), x = b(\"startsWith\"), y = b(\"tx\"), z = 0;\n    function aa(ca, da, ea, fa) {\n        this._parentElem = ca;\n        this._attachments = {\n        };\n        this._imageIDs = {\n        };\n        this._uploading = {\n        };\n        this._uploadTemplates = {\n        };\n        this._uploadStartTimes = {\n        };\n        this._subscriptionsHandler = new s();\n        this._fileForm = new l(da, [o,m,]);\n        this._fileForm.setAllowCrossOrigin(true);\n        this._fileForm.setUploadInParallel(true);\n        var ga = j.find(da, \".-cx-PRIVATE-mercuryFileUploader__root\"), ha = j.find(ga, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new n(ga, ha, ea);\n        h.hide(this._parentElem);\n        this._subscriptionsHandler.addSubscriptions(this._fileForm.subscribe(\"submit\", function() {\n            var ia = (\"upload_\" + z++);\n            fa.value = ia;\n            var ja = {\n                count: 0,\n                file_sizes: []\n            };\n            if (ea.files) {\n                for (var ka = 0; (ka < ea.files.length); ka++) {\n                    if ((ea.files[ka].size > r.AttachmentMaxSize)) {\n                        this._fileForm.abort();\n                        this._fileForm.clear();\n                        new i().setTitle(\"The file you have selected is too large\").setBody(\"The file you have selected is too large. The maximum size is 25MB.\").setButtons(i.OK).setSemiModal(true).show();\n                        return false;\n                    }\n                ;\n                };\n                for (var la = 0; (la < ea.files.length); la++) {\n                    this._addFileUploadRow(ia, ea.files[la].name);\n                    ja.count++;\n                    ja.file_sizes.push(ea.files[la].size);\n                };\n            }\n             else {\n                this._addFileUploadRow(ia, ea.value);\n                ja.count = 1;\n            }\n        ;\n            this.inform(\"submit\", ja);\n        }.bind(this)), this._fileForm.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), this._fileForm.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), k.listen(ha, \"click\", w(this.inform, this, \"open\")));\n    };\n    t(aa.prototype, g, {\n        isUploading: function() {\n            return !!Object.keys(this._uploading).length;\n        },\n        getAttachments: function() {\n            return v(this._attachments);\n        },\n        getImageIDs: function() {\n            return v(this._imageIDs);\n        },\n        removeAttachments: function() {\n            v(this._uploadTemplates).forEach(function(ca) {\n                if (ca) {\n                    j.remove(ca.getRoot());\n                };\n            });\n            this._attachments = {\n            };\n            this._imageIDs = {\n            };\n            this._uploadTemplates = {\n            };\n            this._uploading = {\n            };\n            this._uploadStartTimes = {\n            };\n            h.hide(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n            this._fileForm.destroy();\n            this.removeAttachments();\n        },\n        _addFileUploadRow: function(ca, da) {\n            var ea = q[\":fb:mercury:upload-file-row\"].build(), fa = ba(da), ga = ((ca + \"/\") + fa);\n            this._uploadTemplates[ga] = ea;\n            this._uploading[ga] = true;\n            this._uploadStartTimes[ga] = Date.now();\n            j.appendContent(ea.getNode(\"iconText\"), fa);\n            k.listen(ea.getNode(\"closeFileUpload\"), \"click\", this._removeFileUploader.bind(this, ga));\n            j.appendContent(this._parentElem, ea.getRoot());\n            h.show(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        _removeFileUploader: function(ca, event) {\n            if (this._uploading[ca]) {\n                this.inform(\"upload-canceled-during-upload\");\n            }\n             else if ((this._attachments[ca] || this._imageIDs[ca])) {\n                this.inform(\"upload-canceled-after-uploaded\");\n            }\n        ;\n            delete this._attachments[ca];\n            delete this._imageIDs[ca];\n            delete this._uploading[ca];\n            delete this._uploadStartTimes[ca];\n            var da = this._uploadTemplates[ca];\n            delete this._uploadTemplates[ca];\n            if (da) {\n                j.remove(da.getRoot());\n                this.inform(\"dom-updated\");\n            }\n        ;\n            this.inform(\"upload-canceled\");\n            return false;\n        },\n        _updateFileUploader: function(ca, da) {\n            var ea = this._uploadTemplates[ca], fa = p.getAttachIconClassByMime(da);\n            h.addClass(ea.getNode(\"iconText\"), fa);\n            h.addClass(ea.getRoot(), \"done\");\n        },\n        _onFileUploadSuccess: function(event, ca) {\n            var da = ca.response.getPayload(), ea = da.uploadID, fa = da.metadata;\n            for (var ga = 0; (ga < fa.length); ga++) {\n                var ha = ((ea + \"/\") + fa[ga].filename);\n                if (this._uploading[ha]) {\n                    delete this._uploading[ha];\n                    if (fa[ga].image_id) {\n                        this._imageIDs[ha] = fa[ga].image_id;\n                    }\n                     else this._attachments[ha] = fa[ga];\n                ;\n                    this._updateFileUploader(ha, fa[ga].filetype);\n                    this.inform(\"one-upload-completed\", {\n                        upload_time_ms: (Date.now() - this._uploadStartTimes[ha])\n                    });\n                }\n            ;\n            };\n            if (!this.isUploading()) {\n                this.inform(\"all-uploads-completed\", {\n                    count: this.getAttachments().length\n                });\n            };\n        },\n        _onFileUploadFailure: function(event, ca) {\n            this.inform(\"one-upload-failed\");\n        }\n    });\n    function ba(ca) {\n        if ((ca && x(ca, \"C:\\\\fakepath\\\\\"))) {\n            return ca.substring(12)\n        };\n        return ca;\n    };\n    e.exports = aa;\n});\n__d(\"JoinableConversationMessageFilter\", [\"MercuryLogMessageType\",\"MercuryThreads\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryLogMessageType\"), h = b(\"MercuryThreads\").get(), i = b(\"MercuryParticipants\"), j = {\n        _isFilterable: function(k) {\n            var l = k.log_message_type;\n            if (!l) {\n                return false\n            };\n            if ((l == g.JOINABLE_JOINED)) {\n                return (k.log_message_data.joined_participant !== i.user)\n            };\n            if (((l == g.UNSUBSCRIBE) || (l == g.SUBSCRIBE))) {\n                var m = h.getThreadMetaNow(k.thread_id);\n                if ((m && m.is_joinable)) {\n                    return (k.author !== i.user)\n                };\n                return false;\n            }\n        ;\n            return false;\n        },\n        filterMessages: function(k, l, m) {\n            var n = [];\n            for (var o = 0; (o < l.length); o++) {\n                var p = l[o];\n                if (j._isFilterable(p)) {\n                    if (m) {\n                        k(p);\n                    };\n                }\n                 else n.push(p);\n            ;\n            };\n            return n;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreadMuter\", [\"AsyncDialog\",\"AsyncRequest\",\"Env\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"MercuryThreads\").get(), k = {\n        getUserIDEmail: function() {\n            return (i.user + \"@facebook.com\");\n        },\n        getThreadMuteSettingForUser: function(l) {\n            return (l.mute_settings && l.mute_settings[k.getUserIDEmail()]);\n        },\n        isThreadMuted: function(l) {\n            return (k.getThreadMuteSettingForUser(l) !== undefined);\n        },\n        showMuteChangeDialog: function(l, m) {\n            g.send(new h(\"/ajax/mercury/mute_thread_dialog.php\").setData({\n                muting: l\n            }), function(n) {\n                n.subscribe(\"confirm\", function() {\n                    this.hide();\n                    j.updateThreadMuteSetting(m, l);\n                }.bind(n));\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"JoinStatusTabSheet\", [\"copyProperties\",\"DOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"DOM\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercuryParticipants\");\n    function k(l, m) {\n        this._rootElement = l;\n        this._messageQueue = [];\n        this._sheetView = m;\n    };\n    g(k.prototype, {\n        _setMessage: function(l, m) {\n            var n = l.author, o = l.log_message_type;\n            if ((o == i.JOINABLE_JOINED)) {\n                var p = l.log_message_data.joined_participant;\n                if ((p !== j.user)) {\n                    j.get(p, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} joined the chat.\", {\n                            actor: s.name\n                        }));\n                    });\n                };\n            }\n             else if ((o == i.UNSUBSCRIBE)) {\n                if ((n !== j.user)) {\n                    j.get(n, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} left the conversation.\", {\n                            actor: s.name\n                        }));\n                    });\n                };\n            }\n             else if ((o == i.SUBSCRIBE)) {\n                if ((n !== j.user)) {\n                    var q = l.log_message_data.added_participants;\n                    if ((q && (q.length > 0))) {\n                        var r = [n,q[0],];\n                        j.getMulti(r, function(s) {\n                            h.setContent(m, h.tx._(\"{actor} added {subscriber1}.\", {\n                                actor: s[n].name,\n                                subscriber1: s[q[0]].name\n                            }));\n                        });\n                    }\n                ;\n                }\n            \n            }\n            \n        ;\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getCloseTimeout: function() {\n            return 3000;\n        },\n        getType: function() {\n            return \"join_status_type\";\n        },\n        addToQueue: function(l) {\n            this._messageQueue.push(l);\n            if ((this._messageQueue.length === 1)) {\n                this._open();\n            };\n        },\n        render: function() {\n            var l = this._messageQueue[0], m = this._getTemplate().build();\n            this._setMessage(l, m.getNode(\"text\"));\n            h.setContent(this._rootElement, m.getRoot());\n        },\n        _open: function() {\n            this._sheetView.open(this);\n        },\n        autoCloseCallback: function() {\n            this._messageQueue.shift();\n            if ((this._messageQueue.length > 0)) {\n                this._open();\n            };\n        },\n        couldNotReplace: function() {\n            this._open.bind(this).defer(this.getCloseTimeout(), false);\n        }\n    });\n    e.exports = k;\n});\n__d(\"WebMessengerEvents\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = h(new g(), {\n        MASTER_DOM_CHANGED: \"master-dom-changed\",\n        DETAIL_DOM_CHANGED: \"detail-dom-changed\",\n        FOCUS_COMPOSER: \"focus-composer\",\n        FOCUS_SEARCH: \"focus-search\",\n        FOCUS_AND_SELECT_SEARCH: \"focus-and-select-search\",\n        SUBMIT_REPLY: \"submit-reply\",\n        UPDATE_SELECTION: \"update-selection\",\n        masterDOMChanged: function() {\n            this.inform(i.MASTER_DOM_CHANGED);\n        },\n        detailDOMChanged: function() {\n            this.inform(i.DETAIL_DOM_CHANGED);\n        },\n        focusComposer: function() {\n            this.inform(i.FOCUS_COMPOSER);\n        },\n        focusSearch: function() {\n            this.inform(i.FOCUS_SEARCH);\n        },\n        focusAndSelectSearch: function() {\n            this.inform(i.FOCUS_AND_SELECT_SEARCH);\n        },\n        updateSelection: function(j) {\n            this.inform(i.UPDATE_SELECTION, j);\n        },\n        submitReply: function() {\n            this.inform(i.SUBMIT_REPLY);\n        }\n    });\n    e.exports = i;\n});\n__d(\"WebMessengerSubscriptionsHandler\", [\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"SubscriptionsHandler\"), h = new g(\"webmessenger\");\n    e.exports = h;\n});\n__d(\"isWebMessengerURI\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/^(\\/messages)/).test(h.getPath());\n    };\n    e.exports = g;\n});\n__d(\"WebMessengerWidthControl\", [\"Arbiter\",\"CSS\",\"CSSClassTransition\",\"DOMDimensions\",\"Event\",\"Style\",\"URI\",\"ViewportBounds\",\"WebMessengerEvents\",\"shield\",\"WebMessengerSubscriptionsHandler\",\"$\",\"cx\",\"isWebMessengerURI\",\"requestAnimationFrame\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"CSS\"), i = b(\"CSSClassTransition\"), j = b(\"DOMDimensions\"), k = b(\"Event\"), l = b(\"Style\"), m = b(\"URI\"), n = b(\"ViewportBounds\"), o = b(\"WebMessengerEvents\"), p = b(\"shield\"), q = b(\"WebMessengerSubscriptionsHandler\"), r = b(\"$\"), s = b(\"cx\"), t = b(\"isWebMessengerURI\"), u = b(\"requestAnimationFrame\"), v = b(\"throttle\"), w = 205, x = 981, y = 257, z = 18, aa = 848, ba = 724, ca = 28942, da = 56, ea, fa, ga;\n    function ha(ma, na, oa) {\n        this.masterChanged = ma;\n        this.detailChaned = na;\n        q.addSubscriptions(k.listen(window, \"resize\", v(p(ia, this, this), 100)), g.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], p(ia, this, this), g.SUBSCRIBE_NEW));\n        var pa = (la() ? da : 0);\n        if (oa) {\n            pa = w;\n        };\n        this._width = (la() ? 0 : aa);\n        ga = true;\n        ia(this, pa);\n    };\n    function ia(ma, na) {\n        var oa = (n.getRight() + n.getLeft());\n        oa = ((oa || na) || 0);\n        var pa = (j.getViewportWithoutScrollbarDimensions().width - oa), qa = Math.round(Math.max(0, ((pa / 2) - (x / 2))));\n        pa = ((x + qa) - y);\n        pa -= z;\n        pa = Math.max(ba, Math.min(aa, pa));\n        if ((!isNaN(pa) && (ma._width !== pa))) {\n            ma._width = pa;\n            var ra = Math.round((pa / ((1 + ca)))), sa = (pa - ra);\n            ma.masterChanged(sa);\n            ma.detailChaned(ra);\n            if (la()) {\n                var ta = (pa + y);\n                ja(function() {\n                    if (fa) {\n                        document.body.className = fa;\n                        fa = \"\";\n                    }\n                ;\n                    ka((ta + \"px\"));\n                    h.removeClass(document.body, \"-cx-PRIVATE-fbWMWidthControl__firstload\");\n                    (ga && o.detailDOMChanged());\n                    ga = false;\n                }, fa);\n            }\n        ;\n        }\n    ;\n    };\n    function ja(ma, na) {\n        (na && h.addClass(document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\"));\n        u(ma);\n        (na && h.removeClass.curry(document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\").defer(1000, false));\n    };\n    function ka(ma) {\n        l.set(r(\"pageHead\"), \"width\", ma);\n        l.set(r(\"globalContainer\"), \"width\", ma);\n    };\n    function la() {\n        if (!ea) {\n            ea = h.hasClass(document.body, \"-cx-PUBLIC-hasLitestand__body\");\n        };\n        return ea;\n    };\n    i.registerHandler(function(ma, na, oa, pa) {\n        function qa(ra) {\n            return (la() && t(m(ra)));\n        };\n        if (qa(pa)) {\n            fa = na;\n            return true;\n        }\n         else if (qa(oa)) {\n            ja(function() {\n                ma.className = na;\n                ka(\"\");\n            }, true);\n            return true;\n        }\n        \n    ;\n    });\n    e.exports = ha;\n});\n__d(\"TextInputControl\", [\"Event\",\"function-extensions\",\"Class\",\"DOMControl\",\"Input\",\"copyProperties\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"Class\"), i = b(\"DOMControl\"), j = b(\"Input\"), k = b(\"copyProperties\"), l = b(\"debounce\");\n    function m(n) {\n        this.parent.construct(this, n);\n        var o = this.getRoot(), p = l(this.update.bind(this), 0);\n        g.listen(o, {\n            input: p,\n            keydown: p,\n            paste: p\n        });\n    };\n    h.extend(m, i);\n    k(m.prototype, {\n        setMaxLength: function(n) {\n            j.setMaxLength(this.getRoot(), n);\n            return this;\n        },\n        getValue: function() {\n            return j.getValue(this.getRoot());\n        },\n        isEmpty: function() {\n            return j.isEmpty(this.getRoot());\n        },\n        setValue: function(n) {\n            j.setValue(this.getRoot(), n);\n            this.update();\n            return this;\n        },\n        clear: function() {\n            return this.setValue(\"\");\n        },\n        setPlaceholderText: function(n) {\n            j.setPlaceholder(this.getRoot(), n);\n            return this;\n        }\n    });\n    e.exports = m;\n});\n__d(\"TextMetrics\", [\"Event\",\"DOM\",\"Style\",\"UserAgent\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"debounce\"), l;\n    function m() {\n        if ((typeof l === \"undefined\")) {\n            var p = h.create(\"div\", {\n                className: \"webkitZoomTest\"\n            }), q = function() {\n                h.appendContent(document.body, p);\n                l = (100 / p.clientHeight);\n                h.remove(p);\n            };\n            g.listen(window, \"resize\", k(q, 100));\n            q();\n        }\n    ;\n        return l;\n    };\n    function n(p) {\n        var q = p.clientWidth, r = ((i.get(p, \"-moz-box-sizing\") == \"border-box\"));\n        if (r) {\n            return q\n        };\n        var s = (i.getFloat(p, \"paddingLeft\") + i.getFloat(p, \"paddingRight\"));\n        return (q - s);\n    };\n    function o(p, q) {\n        this._node = p;\n        this._flexible = !!q;\n        var r = \"textarea\", s = \"textMetrics\";\n        if (this._flexible) {\n            r = \"div\";\n            s += \" textMetricsInline\";\n        }\n    ;\n        this._shadow = h.create(r, {\n            className: s\n        });\n        var t = [\"fontSize\",\"fontStyle\",\"fontWeight\",\"fontFamily\",\"wordWrap\",];\n        t.forEach(function(v) {\n            i.set(this._shadow, v, i.get(p, v));\n        }.bind(this));\n        var u = i.get(p, \"lineHeight\");\n        if ((j.chrome() || j.webkit())) {\n            u = (Math.round((parseInt(u, 10) * m())) + \"px\");\n        };\n        i.set(this._shadow, \"lineHeight\", u);\n        document.body.appendChild(this._shadow);\n    };\n    o.prototype.measure = function(p) {\n        var q = this._node, r = this._shadow;\n        p = (((p || q.value)) + \"...\");\n        if (!this._flexible) {\n            var s = n(q);\n            i.set(r, \"width\", (Math.max(s, 0) + \"px\"));\n        }\n    ;\n        h.setContent(r, p);\n        return {\n            width: r.scrollWidth,\n            height: r.scrollHeight\n        };\n    };\n    o.prototype.destroy = function() {\n        h.remove(this._shadow);\n    };\n    e.exports = o;\n});\n__d(\"TextAreaControl\", [\"Event\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"CSS\",\"DOMControl\",\"Style\",\"TextInputControl\",\"TextMetrics\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"CSS\"), l = b(\"DOMControl\"), m = b(\"Style\"), n = b(\"TextInputControl\"), o = b(\"TextMetrics\"), p = b(\"copyProperties\");\n    function q(s, t) {\n        return (m.getFloat(s, t) || 0);\n    };\n    function r(s) {\n        this.autogrow = k.hasClass(s, \"uiTextareaAutogrow\");\n        this.parent.construct(this, s);\n        this.width = null;\n        g.listen(s, \"focus\", this._handleFocus.bind(this));\n    };\n    j.extend(r, n);\n    p(r.prototype, i, {\n        setAutogrow: function(s) {\n            this.autogrow = s;\n            return this;\n        },\n        onupdate: function() {\n            this.parent.onupdate();\n            if (this.autogrow) {\n                var s = this.getRoot();\n                if (!this.metrics) {\n                    this.metrics = new o(s);\n                };\n                if ((typeof this.initialHeight === \"undefined\")) {\n                    this.isBorderBox = (((m.get(s, \"box-sizing\") === \"border-box\") || (m.get(s, \"-moz-box-sizing\") === \"border-box\")) || (m.get(s, \"-webkit-box-sizing\") === \"border-box\"));\n                    this.borderBoxOffset = (((q(s, \"padding-top\") + q(s, \"padding-bottom\")) + q(s, \"border-top-width\")) + q(s, \"border-bottom-width\"));\n                    this.initialHeight = (s.offsetHeight - this.borderBoxOffset);\n                }\n            ;\n                var t = this.metrics.measure(), u = Math.max(this.initialHeight, t.height);\n                if (this.isBorderBox) {\n                    u += this.borderBoxOffset;\n                };\n                if ((u !== this.height)) {\n                    this.height = u;\n                    m.set(s, \"height\", (u + \"px\"));\n                    h.inform(\"reflow\");\n                    this.inform(\"resize\");\n                }\n            ;\n            }\n             else if (this.metrics) {\n                this.metrics.destroy();\n                this.metrics = null;\n            }\n            \n        ;\n        },\n        resetHeight: function() {\n            this.height = -1;\n            this.update();\n        },\n        _handleFocus: function() {\n            this.width = null;\n        }\n    });\n    r.getInstance = function(s) {\n        return (l.getInstance(s) || new r(s));\n    };\n    e.exports = r;\n});\n__d(\"MessagesEmoticonView\", [\"DOM\",\"EmoticonsList\",\"Event\",\"Focus\",\"InputSelection\",\"Keys\",\"Parent\",\"SubscriptionsHandler\",\"TextAreaControl\",\"Toggler\",\"copyProperties\",\"endsWith\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoticonsList\"), i = b(\"Event\"), j = b(\"Focus\"), k = b(\"InputSelection\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"SubscriptionsHandler\"), o = b(\"TextAreaControl\"), p = b(\"Toggler\"), q = b(\"copyProperties\"), r = b(\"endsWith\"), s = b(\"startsWith\"), t = h.symbols;\n    function u(w, x, y) {\n        var z = m.byClass(w, \"emoticon\");\n        if (!z) {\n            return\n        };\n        var aa = \"emoticon_\", ba = null;\n        z.className.split(\" \").forEach(function(ia) {\n            if (s(ia, aa)) {\n                ba = ia.substring(aa.length);\n            };\n        });\n        if (!t[ba]) {\n            return\n        };\n        var ca = o.getInstance(x), da = ca.getValue(), ea = t[ba], fa = da.substring(0, y.start), ga = da.substring(y.end);\n        if (((y.start > 0) && !r(fa, \" \"))) {\n            ea = (\" \" + ea);\n        };\n        if (!s(ga, \" \")) {\n            ea += \" \";\n        };\n        var ha = ((fa + ea) + ga);\n        y.start += ea.length;\n        y.end = y.start;\n        ca.setValue(ha);\n        k.set(x, y.start, y.end);\n        return true;\n    };\n    function v(w, x) {\n        var y = {\n            start: 0,\n            end: 0\n        };\n        function z() {\n            y = k.get(x);\n        };\n        var aa = g.find(w, \".uiToggleFlyout\");\n        this._subscriptions = new n();\n        this._subscriptions.addSubscriptions(p.subscribe(\"show\", function(ba, ca) {\n            if ((ca.active && g.contains(w, ca.active))) {\n                k.set(x, y.start, y.end);\n                var da = g.scry(aa, \"a.emoticon\")[0];\n                j.setWithoutOutline(da);\n            }\n        ;\n        }), i.listen(aa, \"click\", function(event) {\n            var ba = u(event.getTarget(), x, y);\n            (ba && p.hide(w));\n        }), i.listen(aa, \"keyup\", function(event) {\n            if ((event.keyCode === l.ESC)) {\n                p.hide(w);\n                k.set(x, y.start, y.end);\n            }\n        ;\n        }), i.listen(x, \"keyup\", z), i.listen(x, \"click\", z));\n    };\n    q(v.prototype, {\n        destroy: function() {\n            this._subscriptions.release();\n            this._subscriptions = null;\n        }\n    });\n    q(v, {\n        create: function(w, x) {\n            return new v(w, x);\n        }\n    });\n    e.exports = v;\n});\n__d(\"MercuryTypingReceiver\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryParticipants\",\"MercuryPayloadSource\",\"MercuryServerRequests\",\"MercuryThreads\",\"TypingDetector\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"TypingDetector\"), o = b(\"setTimeoutAcrossTransitions\"), p, q = {\n    }, r = 30000, s = new g();\n    function t(y) {\n        var z = (q[y] || {\n        }), aa = Object.keys(z);\n        aa.sort(function(ba, ca) {\n            return (z[ba] - z[ca]);\n        });\n        return aa;\n    };\n    function u() {\n        p = null;\n        var y = Date.now(), z = {\n        }, aa = false;\n        for (var ba in q) {\n            var ca = false;\n            for (var da in (q[ba] || {\n            })) {\n                if ((q[ba][da] < (y - r))) {\n                    delete q[ba][da];\n                    ca = true;\n                }\n                 else aa = true;\n            ;\n            };\n            if (ca) {\n                z[ba] = t(ba);\n            };\n        };\n        for (var ea in z) {\n            s.inform(\"state-changed\", z);\n            break;\n        };\n        if (aa) {\n            p = o(u, 3000);\n        };\n    };\n    function v(y, z) {\n        if ((y in q)) {\n            if ((z in q[y])) {\n                delete q[y][z];\n                w(y);\n            }\n        \n        };\n    };\n    function w(y) {\n        var z = {\n        };\n        z[y] = t(y);\n        s.inform(\"state-changed\", z);\n    };\n    function x(y) {\n        if (y.thread) {\n            return l.getClientThreadIDNow(y.thread)\n        };\n        if ((y.type === \"typ\")) {\n            return m.getThreadIdForUser(y.from)\n        };\n        return null;\n    };\n    g.subscribe([h.getArbiterType(\"typ\"),h.getArbiterType(\"ttyp\"),], function(y, z) {\n        var aa = z.obj, ba = x(aa);\n        if (ba) {\n            var ca = j.getIDForUser(aa.from);\n            if ((aa.st == n.TYPING)) {\n                q[ba] = (q[ba] || {\n                });\n                var da = q[ba][ca];\n                q[ba][ca] = Date.now();\n                if (!p) {\n                    p = o(u, 3000);\n                };\n                (!da && w(ba));\n            }\n             else if ((aa.st == n.INACTIVE)) {\n                v(ba, ca);\n            }\n        ;\n        }\n    ;\n    });\n    l.subscribe(\"update-typing-state\", function(y, z) {\n        var aa = z.payload_source;\n        if ((aa != k.CLIENT_CHANNEL_MESSAGE)) {\n            return\n        };\n        var ba = z.actions;\n        if ((!ba || !ba.length)) {\n            return\n        };\n        var ca = i.USER_GENERATED_MESSAGE;\n        ba.forEach(function(da) {\n            if (((da.action_type == ca) && (da.author != j.user))) {\n                v(da.thread_id, da.author);\n            };\n        });\n    });\n    e.exports = s;\n});\n__d(\"formatUnixTimestamp\", [\"formatDate\",], function(a, b, c, d, e, f) {\n    var g = b(\"formatDate\");\n    function h(i, j, k, l) {\n        var m = new Date((i * 1000));\n        return g(m, j, k, l);\n    };\n    e.exports = h;\n});\n__d(\"MercuryIndicatorController\", [\"ArbiterMixin\",\"DOM\",\"MercuryActionTypeConstants\",\"MercuryConfig\",\"MercuryDelayedRoger\",\"MercuryMessageSourceTags\",\"MercuryParticipants\",\"MercuryRoger\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"DateFormatConfig\",\"arrayContains\",\"copyProperties\",\"formatUnixTimestamp\",\"removeFromArray\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryConfig\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryMessageSourceTags\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryRoger\"), o = b(\"MercuryThreads\").get(), p = b(\"MercuryTypingReceiver\"), q = b(\"DateFormatConfig\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = b(\"formatUnixTimestamp\"), u = b(\"removeFromArray\"), v = b(\"tx\"), w = [];\n    function x(y) {\n        this._threadID = y;\n        this._canonicalUser = o.getCanonicalUserInThread(y);\n        w.push(this);\n    };\n    s(x.prototype, g, {\n        destroy: function() {\n            u(w, this);\n        },\n        setLastMessage: function(y) {\n            this._lastMsg = y;\n            this._handleStateChange();\n        },\n        _informStateChanged: function(y) {\n            if (((y.activity == \"none\") && (this._currentActivity == \"none\"))) {\n                return\n            };\n            if ((this._lastMsg && m.isAuthor(this._lastMsg.author))) {\n                y.self_authored = true;\n            };\n            this._currentActivity = y.activity;\n            this.inform(\"state-changed\", y);\n        },\n        _notifySentFrom: function() {\n            var y, z, aa = this._lastMsg.location_text, ba = (this._lastMsg.source_tags || []);\n            if (aa) {\n                y = v._(\"Sent from {location}\", {\n                    location: aa\n                });\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MESSENGER)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile/messenger\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Messenger\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MOBILE)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Mobile\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.EMAIL)) {\n                y = \"Sent from email\";\n                z = \"sentFromEmail\";\n            }\n             else {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n            \n            \n            \n        ;\n            this._informStateChanged({\n                activity: z,\n                text: y\n            });\n        },\n        _notifySeenTimestamp: function(y) {\n            var z = (n.getSeenTimestamp(this._threadID, y[0]) * 39458), aa = (Date.now() * 39477);\n            if ((z < (aa - 518400))) {\n                ba = \"M j\";\n            }\n             else if ((z < (aa - 86400))) {\n                ba = \"D g:ia\";\n            }\n             else ba = \"g:ia\";\n            \n        ;\n            var ba = (q.formats[ba] || ba), ca = t(z, ba, false, true);\n            this._informStateChanged({\n                activity: \"seen-timestamp\",\n                text: v._(\"Seen {timestamp}\", {\n                    timestamp: ca\n                })\n            });\n        },\n        _checkNamesForCollision: function(y, z) {\n            var aa = false;\n            m.getMulti(y, function(ba) {\n                function ca(fa) {\n                    if ((typeof ba[fa] !== \"undefined\")) {\n                        return ba[fa].short_name.toLowerCase();\n                    }\n                     else return fa\n                ;\n                };\n                var da = z.map(ca), ea = y.map(ca);\n                aa = da.some(function(fa) {\n                    return (ea.indexOf(fa) !== ea.lastIndexOf(fa));\n                });\n            });\n            return aa;\n        },\n        _notifySeenBy: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if ((this._lastMsg != z)) {\n                    return\n                };\n                var ca = o.getThreadMetaNow(this._threadID), da = (ca ? ca.participants.length : 0), ea = (y.length + ((z.author != m.user))), fa, ga = false, ha = false, ia = ((da > 2) && (ea >= (da - 1)));\n                if ((!(ia) && (da > 0))) {\n                    ha = this._checkNamesForCollision(ca.participants, y);\n                };\n                if (ia) {\n                    fa = \"Seen by everyone\";\n                }\n                 else if ((y.length == 1)) {\n                    fa = v._(\"Seen by {user}\", {\n                        user: ba[y[0]].short_name\n                    });\n                }\n                 else if ((y.length == 2)) {\n                    fa = v._(\"Seen by {user1}, {user2}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name\n                    });\n                }\n                 else if ((y.length == 3)) {\n                    fa = v._(\"Seen by {user1}, {user2}, {user3}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        user3: ba[y[2]].short_name\n                    });\n                }\n                 else if ((y.length > 3)) {\n                    var ja = (Object.keys(ba).length - 2), ka = v._(\"{num} more\", {\n                        num: ja\n                    }), la = h.create(\"span\", {\n                        className: \"more\"\n                    }, ka);\n                    fa = h.tx._(\"Seen by {user1}, {user2}, {=num more link}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        \"=num more link\": la\n                    });\n                    ga = true;\n                }\n                \n                \n                \n                \n            ;\n                ga = (ga || ha);\n                this._informStateChanged({\n                    activity: \"seen-by\",\n                    text: fa,\n                    seenBy: y,\n                    hasNameCollision: ha,\n                    tooltip: ga\n                });\n            }.bind(this));\n            (aa && this._informStateChanged({\n                activity: \"none\"\n            }));\n        },\n        _notifyTyping: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if ((this._lastMsg != z)) {\n                    return\n                };\n                if ((this._canonicalUser || j.ChatMultiTypGK)) {\n                    var ca = o.getThreadMetaNow(this._threadID), da = (ca ? ca.participants.length : 0), ea, fa = false;\n                    if (((da > 2) && (y.length >= (da - 1)))) {\n                        ea = \"Everyone is typing...\";\n                    }\n                     else if ((y.length == 1)) {\n                        ea = v._(\"{name} is typing...\", {\n                            name: ba[y[0]].short_name\n                        });\n                    }\n                     else if ((y.length == 2)) {\n                        ea = v._(\"{user1} and {user2} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name\n                        });\n                    }\n                     else if ((y.length == 3)) {\n                        ea = v._(\"{user1}, {user2}, and {user3} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            user3: ba[y[2]].short_name\n                        });\n                    }\n                     else if ((y.length > 3)) {\n                        var ga = (Object.keys(ba).length - 2), ha = v._(\"{num} more\", {\n                            num: ga\n                        }), ia = h.create(\"a\", {\n                            href: \"#\"\n                        }, ha);\n                        ea = h.tx._(\"{user1}, {user2}, and {=num more link} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            \"=num more link\": ia\n                        });\n                        fa = true;\n                    }\n                    \n                    \n                    \n                    \n                ;\n                    this._informStateChanged({\n                        activity: \"typing\",\n                        text: ea,\n                        typing: y,\n                        tooltip: fa\n                    });\n                }\n            ;\n            }.bind(this));\n            (aa && this._informStateChanged({\n                activity: \"none\"\n            }));\n        },\n        _handleStateChange: function() {\n            var y = i.LOG_MESSAGE;\n            if ((!this._lastMsg || (this._lastMsg.action_type == y))) {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n        ;\n            if ((this._typing && this._typing.length)) {\n                this._notifyTyping(this._typing);\n                return;\n            }\n        ;\n            if ((this._canonicalUser && (this._lastMsg.author != m.user))) {\n                this._notifySentFrom();\n                return;\n            }\n        ;\n            var z = k.getSeenBy(this._threadID, true);\n            if (z.length) {\n                if (this._canonicalUser) {\n                    this._notifySeenTimestamp(z);\n                    return;\n                }\n                 else {\n                    this._notifySeenBy(z);\n                    return;\n                }\n            \n            };\n            this._informStateChanged({\n                activity: \"none\"\n            });\n        }\n    });\n    p.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            var ba = z[aa._threadID];\n            if ((ba !== undefined)) {\n                aa._typing = ba;\n                aa._handleStateChange();\n            }\n        ;\n        });\n    });\n    k.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            (z[aa._threadID] && aa._handleStateChange());\n        });\n    });\n    e.exports = x;\n});\n__d(\"MercuryLastMessageIndicator\", [\"CSS\",\"MercuryIndicatorController\",\"DOM\",\"MercuryParticipants\",\"Tooltip\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"MercuryIndicatorController\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"Tooltip\"), l = b(\"copyProperties\"), m = b(\"csx\"), n = b(\"cx\");\n    function o(p, q, r, s) {\n        this._lastMessageIndicator = q;\n        this._hideTyping = (r || false);\n        this._messagesView = s;\n        this._controller = new h(p);\n        this._subscription = this._controller.subscribe(\"state-changed\", this._handleStateChanged.bind(this));\n    };\n    l(o.prototype, {\n        destroy: function() {\n            this._setClass(null);\n            this._subscription.unsubscribe();\n            this._controller.destroy();\n        },\n        setLastMessage: function(p) {\n            this._controller.setLastMessage(p);\n        },\n        _handleStateChanged: function(p, q) {\n            var r = this._messagesView.isScrolledToBottom();\n            this._rerender(q);\n            (r && this._messagesView.scrollToBottom());\n        },\n        _rerender: function(p) {\n            if ((p.activity == \"none\")) {\n                this._setClass(null);\n                return;\n            }\n        ;\n            if ((this._hideTyping && (p.activity == \"typing\"))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n            g.conditionClass(this._lastMessageIndicator, \"-cx-PRIVATE-mercuryLastMessageIndicator__selfauthored\", p.self_authored);\n            var q = i.find(this._lastMessageIndicator, \".-cx-PRIVATE-mercuryLastMessageIndicator__text\");\n            if (p.text) {\n                i.setContent(q, p.text);\n            }\n             else i.empty(q);\n        ;\n            if ((p.activity.substring(0, 4) == \"seen\")) {\n                this._setClass(\"seen\");\n                if (((p.activity == \"seen-by\") && p.tooltip)) {\n                    j.getMulti(p.seenBy, function(r) {\n                        var s = i.create(\"div\");\n                        for (var t in r) {\n                            var u = i.create(\"div\");\n                            i.setContent(u, r[t].name);\n                            i.appendContent(s, u);\n                        };\n                        var v = p.hasNameCollision, w;\n                        if (v) {\n                            w = this._lastMessageIndicator;\n                        }\n                         else w = i.find(this._lastMessageIndicator, \"span.more\");\n                    ;\n                        k.set(w, s, \"above\", \"center\");\n                    }.bind(this));\n                }\n                 else k.remove(this._lastMessageIndicator);\n            ;\n            }\n             else this._setClass(p.activity);\n        ;\n        },\n        _setClass: function(p) {\n            if ((this._lastClass === p)) {\n                return\n            };\n            (this._lastClass && g.removeClass(this._lastMessageIndicator, this._lastClass));\n            (p && g.addClass(this._lastMessageIndicator, p));\n            this._lastClass = p;\n        }\n    });\n    e.exports = o;\n});\n__d(\"MercuryStateCheck\", [\"Arbiter\",\"ChannelConstants\",\"MercuryFolders\",\"MessagingTag\",\"MercuryServerRequests\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryFolders\"), j = b(\"MessagingTag\"), k = b(\"MercuryServerRequests\").get(), l = b(\"URI\"), m = b(\"copyProperties\"), n = m(new g(), {\n        initialize: function() {\n            g.subscribe(h.ON_INVALID_HISTORY, o);\n            d([\"ChannelConnection\",], function(p) {\n                p.subscribe(p.CONNECTED, function(q, r) {\n                    if (!r.init) {\n                        o();\n                    };\n                });\n            });\n        }\n    });\n    function o() {\n        var p;\n        if ((l.getRequestURI().getPath().search(/messages/) !== -1)) {\n            p = i.getSupportedFolders();\n        }\n         else p = [j.INBOX,];\n    ;\n        k.fetchMissedMessages(p);\n    };\n    n.initialize();\n    e.exports = n;\n});\n__d(\"MercuryAttachmentRenderer\", [\"MercuryAttachmentTemplates\",\"MercuryAttachmentAudioClip.react\",\"CSS\",\"MercuryConstants\",\"DOM\",\"Image.react\",\"JSXDOM\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessages\",\"MercuryParticipants\",\"React\",\"Style\",\"URI\",\"UserAgent\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentTemplates\"), h = b(\"MercuryAttachmentAudioClip.react\"), i = b(\"CSS\"), j = b(\"MercuryConstants\"), k = b(\"DOM\"), l = b(\"Image.react\"), m = b(\"JSXDOM\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryMessages\").get(), q = b(\"MercuryParticipants\"), r = b(\"React\"), s = b(\"Style\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"cx\"), w = b(\"tx\"), x = (u.ie() <= 8);\n    function y(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.name), ea = da.getNode(\"link\");\n        ea.setAttribute(\"href\", ba.url);\n        (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n    function z(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.name);\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n    var aa = {\n        renderAttachment: function(ba, ca, da, ea, fa) {\n            var ga = 100, ha = (ba ? 160 : 400), ia = ca.attach_type, ja = null, ka = null, la = true, ma = j.MercurySupportedShareType;\n            if ((ia == o.ERROR)) {\n                ja = aa.renderError(ca);\n            };\n            if (((!ba && (ia == o.SHARE)) && ca.share_xhp)) {\n                ka = aa.renderShareXHP(ca, da.id);\n            };\n            if ((ia == o.STICKER)) {\n                la = false;\n                ka = aa.renderSticker(ca);\n            }\n        ;\n            if ((!ka && (ia == o.SHARE))) {\n                var na = ca.share_data_type;\n                switch (na) {\n                  case ma.FB_PHOTO:\n                    ka = aa.renderPreview(ca, da, ea, fa);\n                    break;\n                  case ma.FB_VIDEO:\n                    ka = aa.renderVideoThumb(ca);\n                    break;\n                  case ma.FB_MUSIC_ALBUM:\n                \n                  case ma.FB_SONG:\n                \n                  case ma.FB_PLAYLIST:\n                \n                  case ma.FB_MUSICIAN:\n                \n                  case ma.FB_RADIO_STATION:\n                    ka = aa.renderMusic(ca);\n                    break;\n                  case ma.EXTERNAL:\n                \n                  case ma.FB_TEMPLATE:\n                \n                  case ma.FB_COUPON:\n                \n                  case ma.FB_SOCIAL_REPORT_PHOTO:\n                    ka = aa.renderExternalLink(ca);\n                    break;\n                  default:\n                    if (ca.name) {\n                        ka = aa.renderShareLink(ca, (da && da.id), ba);\n                    };\n                    break;\n                };\n            }\n        ;\n            if ((!ka && ca.preview_loading)) {\n                ka = aa.renderPreview(null);\n            };\n            if ((!ka && ca.preview_url)) {\n                ka = aa.renderPreview(ca, da, ea, fa);\n            };\n            if ((!ka && (ia == o.FILE))) {\n                if ((ca.metadata && (ca.metadata.type == j.MercuryAttachmentAudioClip))) {\n                    ka = k.create(\"div\");\n                    var oa = aa.renderAudioClip(ca, da.message_id, ga, ha);\n                    r.renderComponent(oa, ka);\n                }\n                 else ka = (ba ? aa.renderFileLink(ca) : aa.renderExtendedFileLink(ca));\n            \n            };\n            return {\n                error: ja,\n                content: ka,\n                bubblePreferred: la\n            };\n        },\n        renderError: function(ba) {\n            var ca = g[\":fb:mercury:attachment:error\"].build();\n            k.appendContent(ca.getNode(\"error\"), ba.error_msg);\n            return ca.getRoot();\n        },\n        renderExternalLink: function(ba) {\n            var ca = g[\":fb:mercury:attachment:external-link\"].build().setNodeContent(\"name\", ba.name);\n            (ba.base_url && ca.setNodeContent(\"shortLink\", ba.base_url));\n            var da = ca.getNode(\"preview\"), ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n            if (ba.preview_url) {\n                var fa = ca.getNode(\"preview-image\");\n                fa.setAttribute(\"src\", ba.preview_url);\n                i.addClass(da, ba.preview_class);\n                i.show(fa);\n            }\n             else {\n                i.addClass(ca.getRoot(), \"noMedia\");\n                i.hide(da);\n            }\n        ;\n            ca.getNode(\"name\").setAttribute(\"href\", ba.url);\n            d([\"LinkshimHandler\",], function(ga) {\n                ga.setUpLinkshimHandling(ca.getNode(\"name\"));\n                ga.setUpLinkshimHandling(ca.getNode(\"image-link\"));\n            });\n            if (ba.rel) {\n                ca.getNode(\"name\").setAttribute(\"rel\", ba.rel);\n            };\n            return ca.getRoot();\n        },\n        renderFileLink: function(ba) {\n            var ca = null;\n            if ((ba.url === \"\")) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n             else {\n                ca = \":fb:mercury:attachment:file-link\";\n                return y(ba, ca).getRoot();\n            }\n        ;\n        },\n        renderAudioClip: function(ba, ca, da, ea) {\n            var fa = (ba.metadata.duration / 1000), ga = 200;\n            if ((da && ea)) {\n                if ((fa < 5)) {\n                    ga = da;\n                }\n                 else ga = ((((1 - Math.pow(10, (((fa - 5)) / -30)))) * ((ea - da))) + da);\n            \n            };\n            return h({\n                src: ba.url,\n                duration: (ba.metadata.duration / 1000),\n                showHelp: false,\n                width: ga\n            });\n        },\n        renderExtendedFileLink: function(ba) {\n            var ca = null;\n            if ((ba.url === \"\")) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n        ;\n            var ca = \":fb:mercury:attachment:extended-file-link\", da = y(ba, ca);\n            if (ba.open_url) {\n                var ea = da.getNode(\"openLinkContainer\");\n                i.show(ea);\n                var fa = da.getNode(\"openFile\");\n                fa.setAttribute(\"href\", ba.open_url);\n            }\n        ;\n            var ga = da.getNode(\"downloadFile\");\n            ga.setAttribute(\"href\", ba.url);\n            (ba.rel && ga.setAttribute(\"rel\", ba.rel));\n            return da.getRoot();\n        },\n        renderMusic: function(ba) {\n            var ca = g[\":fb:mercury:attachment:music\"].build().setNodeContent(\"filename\", ba.name), da = ca.getNode(\"link\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"target\", \"_blank\");\n            (ba.rel && da.setAttribute(\"rel\", ba.rel));\n            var ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            (ba.rel && ea.setAttribute(\"rel\", ba.rel));\n            var fa = ca.getNode(\"preview-image\");\n            fa.setAttribute(\"src\", ba.preview_url);\n            i.show(fa);\n            i.addClass(ca.getNode(\"icon_link\"), \"MercuryMusicIcon\");\n            return ca.getRoot();\n        },\n        resizeContain: function(ba, ca) {\n            var da = (ba.width / ba.height), ea = (ca.width / ca.height);\n            if ((ea < da)) {\n                return {\n                    width: Math.min((ba.height * ea), ca.width),\n                    height: Math.min(ba.height, ca.height)\n                };\n            }\n             else return {\n                width: Math.min(ba.width, ca.width),\n                height: Math.min((ba.width / ea), ca.height)\n            }\n        ;\n        },\n        renderPreview: function(ba, ca, da, ea) {\n            var fa = g[\":fb:mercury:attachment:preview\"].build(), ga = fa.getNode(\"image-link\");\n            if (ba) {\n                (ba.url && ga.setAttribute(\"href\", ba.url));\n                (ba.rel && ga.setAttribute(\"rel\", ba.rel));\n                var ha;\n                if (ba.preview_uploading) {\n                    i.addClass(ga, \"-cx-PRIVATE-mercuryImages__uploading\");\n                    if ((da >= 176)) {\n                        ha = \"/images/photos/dots_large.png\";\n                    }\n                     else if ((da >= 86)) {\n                        ha = \"/images/photos/dots_medium.png\";\n                    }\n                     else ha = \"/images/photos/dots_small.png\";\n                    \n                ;\n                    s.set(ga, \"width\", (da + \"px\"));\n                    s.set(ga, \"max-width\", (da + \"px\"));\n                    if ((ba.preview_width && ba.preview_height)) {\n                        s.set(ga, \"padding-bottom\", (((((ba.preview_height / ba.preview_width)) * 100)) + \"%\"));\n                    };\n                }\n                 else if ((ba.metadata && ba.metadata.fbid)) {\n                    ha = t(\"/ajax/mercury/attachments/photo.php\").addQueryData({\n                        fbid: ba.metadata.fbid,\n                        mode: ea,\n                        width: da,\n                        height: da\n                    }).toString();\n                }\n                 else ha = t(ba.preview_url).addQueryData({\n                    mode: ea,\n                    width: da,\n                    height: da\n                }).toString();\n                \n            ;\n                var ia = fa.getNode(\"preview-image\");\n                if (ha) {\n                    if ((((ea === \"contain\") && ba.preview_width) && ba.preview_height)) {\n                        var ja = aa.resizeContain({\n                            width: da,\n                            height: da\n                        }, {\n                            width: ba.preview_width,\n                            height: ba.preview_height\n                        });\n                        ia.setAttribute(\"width\", ja.width);\n                        ia.setAttribute(\"height\", ja.height);\n                    }\n                ;\n                    if ((ba.preview_uploading || (((ea === \"cover\") && !x)))) {\n                        i.addClass(ga, \"-cx-PRIVATE-mercuryImages__usebackgroundimage\");\n                        s.set(ga, \"backgroundImage\", ((\"url(\" + ha) + \")\"));\n                    }\n                     else {\n                        ia.onload = function() {\n                            ia.removeAttribute(\"width\");\n                            ia.removeAttribute(\"height\");\n                        };\n                        ia.setAttribute(\"src\", ha);\n                    }\n                ;\n                }\n            ;\n                if (ca) {\n                    this.renderReportRespondLink(fa.getRoot(), ba, ca.message_id);\n                };\n            }\n             else i.addClass(ga, \"-cx-PUBLIC-mercuryImages__loading\");\n        ;\n            return fa.getRoot();\n        },\n        renderShareLink: function(ba, ca, da) {\n            var ea = g[\":fb:mercury:attachment:share-link\"].build().setNodeContent(\"name\", ba.name), fa = ea.getNode(\"link\");\n            fa.setAttribute(\"href\", ba.url);\n            (ba.rel && fa.setAttribute(\"rel\", ba.rel));\n            return ea.getRoot();\n        },\n        renderVideoThumb: function(ba) {\n            var ca = g[\":fb:mercury:attachment:video-thumb\"].build(), da = ca.getNode(\"thumb\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"rel\", ba.rel);\n            var ea = k.find(ca.getRoot(), \"img\");\n            ea.src = ba.preview_url;\n            return ca.getRoot();\n        },\n        renderShareXHP: function(ba, ca) {\n            var da = k.create(\"div\");\n            if (ba) {\n                k.appendContent(da, ba.share_xhp);\n                this.renderReportRespondLink(da, ba, ca);\n            }\n        ;\n            return da;\n        },\n        renderSticker: function(ba) {\n            var ca = k.create(\"div\"), da = {\n                uri: ba.url,\n                width: ba.metadata.width,\n                height: ba.metadata.height\n            }, ea = l({\n                className: \"mvs\",\n                src: da\n            });\n            r.renderComponent(ea, ca);\n            return ca;\n        },\n        renderReportRespondLink: function(ba, ca, da) {\n            if (!ca.is_social_report_attachment) {\n                return null\n            };\n            switch (ca.share_data_type) {\n              case j.MercurySupportedShareType.FB_PHOTO:\n                break;\n              case j.MercurySupportedShareType.FB_SOCIAL_REPORT_PHOTO:\n                return null;\n              default:\n                return null;\n            };\n            var ea = null;\n            if (da) {\n                ea = p.getMessagesFromIDs([da,])[0];\n            };\n            if (!ea) {\n                return null\n            };\n            if ((ea.author === q.user)) {\n                return null\n            };\n            var fa = null;\n            q.get(ea.author, function(ga) {\n                fa = k.create(\"a\", {\n                    rel: \"dialog-post\",\n                    className: \"-cx-PRIVATE-fbChatMessage__socialreportlink\",\n                    id: \"respond-link\",\n                    ajaxify: t(\"/ajax/report/social_resolution/photo/\").setQueryData({\n                        attachment_fbid: ca.attach_id,\n                        photo_fbid: ca.shared_object_id,\n                        sender_id: q.getUserID(ga.id)\n                    }).toString()\n                });\n                k.setContent(fa, w._(\"Respond to {name}'s request\", {\n                    name: ga.name\n                }));\n                k.appendContent(ba, fa);\n            });\n        },\n        renderPhotoAttachments: function(ba, ca, da, ea) {\n            var fa = ba.length;\n            if (!fa) {\n                return null\n            };\n            var ga = m.div({\n                className: \"-cx-PRIVATE-mercuryImages__photoattachment\"\n            }), ha = (m.div({\n                className: \"-cx-PUBLIC-fbChatMessage__resetpadding\"\n            }, ga));\n            if ((fa === 1)) {\n                var ia = aa.renderPreview(ba[0], ca, da, \"contain\");\n                k.appendContent(ga, ia);\n                return ha;\n            }\n        ;\n            var ja = ((((fa == 2) || (fa == 4))) ? 2 : 3), ka = (((da - (((ja - 1)) * ea))) / ja), la = Math.ceil((fa / ja)), ma = ((la * ka) + (((la - 1)) * ea)), na = (m.div({\n                className: \"-cx-PRIVATE-mercuryImages__grid\",\n                style: ((\"padding-bottom: \" + (((ma / da) * 100))) + \"%;\")\n            }));\n            k.appendContent(ga, na);\n            for (var oa = 0; (oa < fa); ++oa) {\n                var pa = aa.renderPreview(ba[oa], ca, ka, \"cover\"), qa = (oa % ja), ra = Math.floor((oa / ja));\n                i.addClass(pa, \"-cx-PRIVATE-mercuryImages__griditem\");\n                s.apply(pa, {\n                    width: ((((ka / da) * 100)) + \"%\"),\n                    left: ((((((qa * ((ka + ea)))) / da) * 100)) + \"%\"),\n                    top: ((((((ra * ((ka + ea)))) / ma) * 100)) + \"%\")\n                });\n                k.appendContent(na, pa);\n            };\n            return ha;\n        },\n        isPhotoAttachment: function(ba) {\n            return ((ba.attach_type == o.PHOTO) || (((ba.attach_type == o.FILE) && ba.preview_url)));\n        },\n        isShareAttachment: function(ba) {\n            return (ba.attach_type == o.SHARE);\n        },\n        isFileAttachment: function(ba) {\n            return (ba.attach_type == o.FILE);\n        },\n        isErrorAttachment: function(ba) {\n            return (ba.attach_type == o.ERROR);\n        },\n        booleanLexicographicComparator: function(ba) {\n            return function(ca, da) {\n                for (var ea = 0; (ea < ba.length); ++ea) {\n                    var fa = ba[ea](ca), ga = ba[ea](da);\n                    if ((fa && !ga)) {\n                        return -1;\n                    }\n                     else if ((!fa && ga)) {\n                        return 1\n                    }\n                ;\n                };\n                return 0;\n            };\n        }\n    };\n    e.exports = aa;\n});\n__d(\"URLScraper\", [\"ArbiterMixin\",\"DataStore\",\"Event\",\"URLMatcher\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DataStore\"), i = b(\"Event\"), j = b(\"URLMatcher\"), k = b(\"copyProperties\"), l = \"scraperLastPermissiveMatch\";\n    function m(n) {\n        this.input = n;\n        this.enable();\n    };\n    k(m.prototype, g, {\n        reset: function() {\n            h.set(this.input, l, null);\n        },\n        enable: function() {\n            if (this.events) {\n                return\n            };\n            var n = function(o) {\n                setTimeout(this.check.bind(this, o), 30);\n            };\n            this.events = i.listen(this.input, {\n                paste: n.bind(this, false),\n                keydown: n.bind(this, true)\n            });\n        },\n        disable: function() {\n            if (!this.events) {\n                return\n            };\n            for (var event in this.events) {\n                this.events[event].remove();;\n            };\n            this.events = null;\n        },\n        check: function(n) {\n            var o = this.input.value;\n            if ((n && m.trigger(o))) {\n                return\n            };\n            var p = m.match(o), q = j.permissiveMatch(o);\n            if ((q && ((q != h.get(this.input, l))))) {\n                h.set(this.input, l, q);\n                this.inform(\"match\", {\n                    url: (p || q),\n                    alt_url: q\n                });\n            }\n        ;\n        }\n    });\n    k(m, j);\n    e.exports = m;\n});\n__d(\"DOMHyperlink\", [\"Env\",\"JSXDOM\",\"TransformTextToDOMMixin\",\"UntrustedLink\",\"URI\",\"URLScraper\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"JSXDOM\"), i = b(\"TransformTextToDOMMixin\"), j = b(\"UntrustedLink\"), k = b(\"URI\"), l = b(\"URLScraper\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        MAX_ITEMS: 40,\n        match: function(p, q) {\n            var r = l.match(p);\n            if (!r) {\n                return false\n            };\n            var s = p.indexOf(r), t = (s + r.length);\n            return {\n                startIndex: s,\n                endIndex: t,\n                element: this._element(r, q)\n            };\n        },\n        _element: function(p, q) {\n            var r = p, s = r.replace(/\"/g, \"%22\");\n            if (!(/^[a-z][a-z0-9\\-+.]+:\\/\\//i.test(p))) {\n                s = (\"http://\" + s);\n            };\n            if (!k.isValidURI(s)) {\n                return r\n            };\n            var t = h.a({\n                className: \"-cx-PUBLIC-fbHTMLHyperlink__link\",\n                href: s,\n                target: \"_blank\",\n                rel: \"nofollow\"\n            }, r);\n            if ((q && !k(s).isFacebookURI())) {\n                t.onmousedown = function(u) {\n                    j.bootstrap(this, g.lhsh, u);\n                };\n            };\n            return t;\n        }\n    };\n    e.exports = m(o, i);\n});\n__d(\"MercuryMessageRenderer\", [\"MercuryAttachmentRenderer\",\"CSS\",\"DOM\",\"DOMEmoji\",\"DOMEmote\",\"DOMHyperlink\",\"DOMQuery\",\"FBIDEmote\",\"JSXDOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",\"Tooltip\",\"cx\",\"transformTextToDOM\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentRenderer\"), h = b(\"CSS\"), i = b(\"DOM\"), j = b(\"DOMEmoji\"), k = b(\"DOMEmote\"), l = b(\"DOMHyperlink\"), m = b(\"DOMQuery\"), n = b(\"FBIDEmote\"), o = b(\"JSXDOM\"), p = b(\"MercuryLogMessageType\"), q = b(\"MercuryParticipants\"), r = b(\"Tooltip\"), s = b(\"cx\"), t = b(\"transformTextToDOM\"), u = b(\"tx\"), v = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",], w = {\n        renderDate: function(pa) {\n            var qa = new Date();\n            qa.setHours(0);\n            qa.setMinutes(0);\n            qa.setSeconds(0);\n            qa.setMilliseconds(0);\n            var ra = (((24 * 60) * 60) * 1000), sa = (qa.getTime() - pa.getTime());\n            if ((sa <= 0)) {\n                return \"Today\";\n            }\n             else if ((sa < ra)) {\n                return \"Yesterday\"\n            }\n        ;\n            var ta = v[pa.getMonth()], ua = pa.getDate(), va = pa.getFullYear();\n            if ((va != qa.getFullYear())) {\n                return u._(\"{month} {date}, {year}\", {\n                    month: ta,\n                    date: ua,\n                    year: va\n                });\n            }\n             else return u._(\"{month} {date}\", {\n                month: ta,\n                date: ua\n            })\n        ;\n        },\n        renderTooltipFlyout: function(pa, qa) {\n            qa.forEach(function(ra) {\n                var sa = i.create(\"div\");\n                i.setContent(sa, ra.name);\n                i.appendContent(pa, sa);\n            });\n        },\n        renderLogMessage: function(pa, qa, ra, sa) {\n            z(pa, sa);\n            aa(qa, sa);\n            ba(ra, sa);\n        },\n        formatMessageBody: function(pa, qa, ra) {\n            var sa = ((pa || \"\")).replace(/\\s+$/, \"\");\n            if (!qa) {\n                return y(sa, false, ra)\n            };\n            var ta = Object.keys(qa).map(function(wa) {\n                return window.parseInt(wa);\n            }).sort(function(wa, xa) {\n                return (wa - xa);\n            }), ua = [], va = 0;\n            ta.forEach(function(wa) {\n                var xa = sa.slice(va, wa);\n                if (xa) {\n                    ua.push(y(xa, false, ra));\n                };\n                va = (wa + qa[wa].length);\n                var ya = sa.slice(wa, va);\n                if (ya) {\n                    ua.push(y(ya, true, ra));\n                };\n            });\n            if ((va < sa.length)) {\n                ua.push(y(sa.slice(va), false, ra));\n            };\n            return ((ua.length === 0) ? null : ((ua.length === 1) ? ua[0] : i.create(\"span\", {\n            }, ua)));\n        }\n    };\n    function x(pa, qa) {\n        var ra = pa.replace(/\\r\\n?/g, \"\\u000a\").split(/\\n{2,}/);\n        return ra.filter(function(sa) {\n            return sa.length;\n        }).map(function(sa) {\n            return o.p(null, qa(sa));\n        });\n    };\n    function y(pa, qa, ra) {\n        if (((pa.length === 0) && !qa)) {\n            return null\n        };\n        var sa = function(ta) {\n            return t(ta, [l.params(true),j,n,k,]);\n        };\n        return (o.span({\n            className: (qa ? \"highlight\" : null)\n        }, (ra ? x(pa, sa) : sa(pa))));\n    };\n    function z(pa, qa) {\n        var ra = \"\", sa;\n        switch (qa.log_message_type) {\n          case p.JOINABLE_CREATED:\n        \n          case p.JOINABLE_JOINED:\n        \n          case p.SUBSCRIBE:\n            ra = \"mercurySubscribeIcon\";\n            break;\n          case p.UNSUBSCRIBE:\n            ra = \"mercuryUnsubscribeIcon\";\n            break;\n          case p.THREAD_NAME:\n            ra = \"mercuryThreadNameIcon\";\n            break;\n          case p.THREAD_IMAGE:\n            ra = \"mercuryThreadImageIcon\";\n            break;\n          case p.VIDEO_CALL:\n            sa = qa.log_message_data.answered;\n            if ((sa || oa(qa))) {\n                ra = \"mercuryVideoCallIcon\";\n            }\n             else ra = \"mercuryMissedVideoCallIcon\";\n        ;\n            break;\n          case p.PHONE_CALL:\n            sa = qa.log_message_data.answered;\n            if (sa) {\n                ra = \"mercuryPhoneCallIcon\";\n            }\n             else ra = \"mercuryMissedPhoneCallIcon\";\n        ;\n            break;\n          case p.SERVER_ERROR:\n            ra = \"mercuryErrorIcon\";\n            break;\n        };\n        h.addClass(pa, ra);\n    };\n    function aa(pa, qa) {\n        switch (qa.log_message_type) {\n          case p.JOINABLE_CREATED:\n            ga(pa, qa);\n            break;\n          case p.JOINABLE_JOINED:\n            ha(pa, qa);\n            break;\n          case p.SUBSCRIBE:\n            la(pa, qa);\n            break;\n          case p.UNSUBSCRIBE:\n            ma(pa, qa);\n            break;\n          case p.VIDEO_CALL:\n            if (oa(qa)) {\n                ca(pa, qa);\n            }\n             else ea(pa, qa);\n        ;\n            break;\n          case p.PHONE_CALL:\n            da(pa, qa);\n            break;\n          case p.THREAD_NAME:\n            fa(pa, qa);\n            break;\n          case p.THREAD_IMAGE:\n            ia(pa, qa);\n            break;\n          case p.SERVER_ERROR:\n            na(pa, qa);\n            break;\n        };\n    };\n    function ba(pa, qa) {\n        var ra = qa.log_message_type;\n        if ((ra == p.THREAD_IMAGE)) {\n            var sa = qa.log_message_data.image;\n            if (sa) {\n                var ta = g.renderPreview((sa.preview_url ? sa : null));\n                i.setContent(pa, ta);\n                h.addClass(ta, \"-cx-PRIVATE-mercuryImages__logmessageattachment\");\n                h.show(pa);\n            }\n        ;\n        }\n    ;\n    };\n    var ca = function(pa, qa) {\n        q.get(qa.author, function(ra) {\n            var sa = i.create(\"span\", {\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, ra.short_name), ta;\n            switch (qa.log_message_data.event_name) {\n              case \"installing\":\n                ta = i.tx._(\"{firstname} is setting up video calling...\", {\n                    firstname: sa\n                });\n                break;\n              case \"installed\":\n                ta = i.tx._(\"{firstname} finished setting up video calling.\", {\n                    firstname: sa\n                });\n                break;\n              case \"install_canceled\":\n                ta = i.tx._(\"You canceled the video calling installation. \", {\n                    firstname: sa\n                });\n                break;\n            };\n            if (ta) {\n                i.setContent(pa, ta);\n            };\n        });\n    }, da = function(pa, qa) {\n        var ra = qa.log_message_data.caller, sa = qa.log_message_data.callee, ta = [ra,sa,];\n        q.getMulti(ta, function(ua) {\n            if ((ra == q.user)) {\n                var va = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[sa].short_name), wa;\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"You called {firstname}.\", {\n                        firstname: va\n                    });\n                }\n                 else wa = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: va\n                });\n            ;\n            }\n             else {\n                var xa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[ra].short_name);\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"{firstname} called you.\", {\n                        firstname: xa\n                    });\n                }\n                 else wa = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: xa\n                });\n            ;\n            }\n        ;\n            i.setContent(pa, wa);\n        });\n    }, ea = function(pa, qa) {\n        var ra = qa.log_message_data.caller, sa = qa.log_message_data.callee, ta = [ra,sa,];\n        q.getMulti(ta, function(ua) {\n            if ((ra == q.user)) {\n                var va = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[sa].short_name), wa;\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"You called {firstname}.\", {\n                        firstname: va\n                    });\n                }\n                 else wa = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: va\n                });\n            ;\n            }\n             else {\n                var xa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[ra].short_name);\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"{firstname} called you.\", {\n                        firstname: xa\n                    });\n                }\n                 else wa = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: xa\n                });\n            ;\n            }\n        ;\n            i.setContent(pa, wa);\n        });\n    }, fa = function(pa, qa) {\n        var ra = qa.log_message_data.name, sa = i.create(\"b\", {\n        }, ra);\n        if ((qa.author == q.user)) {\n            if (ra) {\n                i.setContent(pa, i.tx._(\"You named the conversation: {name}.\", {\n                    name: sa\n                }));\n            }\n             else i.setContent(pa, i.tx._(\"You removed the conversation name.\"));\n        ;\n        }\n         else q.get(qa.author, function(ta) {\n            var ua, va = ja(ta);\n            if (ra) {\n                ua = i.tx._(\"{actor} named the conversation: {name}.\", {\n                    actor: va,\n                    name: sa\n                });\n            }\n             else ua = i.tx._(\"{actor} removed the conversation name.\", {\n                actor: va\n            });\n        ;\n            i.setContent(pa, ua);\n        });\n    ;\n    }, ga = function(pa, qa) {\n        if ((qa.author == q.user)) {\n            i.setContent(pa, i.tx._(\"Other people can join this chat from News Feed and add their friends.\"));\n        }\n         else q.get(qa.author, function(ra) {\n            var sa = ja(ra);\n            i.setContent(pa, i.tx._(\"{actor} shared this chat to News Feed. Other people can join and add their friends.\", {\n                actor: sa\n            }));\n        });\n    ;\n    }, ha = function(pa, qa) {\n        var ra = qa.log_message_data.joined_participant;\n        if ((ra == q.user)) {\n            i.setContent(pa, i.tx._(\"You joined the chat. Other people can join from News Feed and add their friends.\"));\n        }\n         else q.get(ra, function(sa) {\n            var ta = ja(sa);\n            i.setContent(pa, i.tx._(\"{actor} joined the chat.\", {\n                actor: ta\n            }));\n        });\n    ;\n    }, ia = function(pa, qa) {\n        if ((qa.author == q.user)) {\n            if (qa.log_message_data.image) {\n                i.setContent(pa, i.tx._(\"You changed the conversation picture.\"));\n            }\n             else i.setContent(pa, i.tx._(\"You removed the conversation picture.\"));\n        ;\n        }\n         else q.get(qa.author, function(ra) {\n            var sa = ja(ra), ta;\n            if (qa.log_message_data.image) {\n                ta = i.tx._(\"{actor} changed the conversation picture.\", {\n                    actor: sa\n                });\n            }\n             else ta = i.tx._(\"{actor} removed the conversation picture.\", {\n                actor: sa\n            });\n        ;\n            i.setContent(pa, ta);\n        });\n    ;\n    }, ja = function(pa) {\n        if (pa.href) {\n            return i.create(\"a\", {\n                href: pa.href,\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, pa.name)\n        };\n        return pa.name;\n    }, ka = function(pa) {\n        var qa = pa.indexOf(q.user);\n        if ((qa > 0)) {\n            return pa.splice(qa, 1).concat(pa)\n        };\n        return pa;\n    }, la = function(pa, qa) {\n        var ra = ka(qa.log_message_data.added_participants), sa = null, ta;\n        if ((ra.length == 1)) {\n            sa = [qa.author,ra[0],];\n            q.getMulti(sa, function(ua) {\n                if ((qa.author == q.user)) {\n                    ta = i.tx._(\"You added {subscriber1}.\", {\n                        subscriber1: ja(ua[ra[0]])\n                    });\n                }\n                 else if ((ra[0] == q.user)) {\n                    ta = i.tx._(\"{actor} added you.\", {\n                        actor: ja(ua[qa.author])\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]])\n                });\n                \n            ;\n                i.setContent(pa, ta);\n            });\n        }\n         else if ((ra.length == 2)) {\n            sa = [qa.author,].concat(ra);\n            q.getMulti(sa, function(ua) {\n                if ((qa.author == q.user)) {\n                    ta = i.tx._(\"You added {subscriber1} and {subscriber2}.\", {\n                        subscriber1: ja(ua[ra[0]]),\n                        subscriber2: ja(ua[ra[1]])\n                    });\n                }\n                 else if ((ra[0] == q.user)) {\n                    ta = i.tx._(\"{actor} added you and {subscriber2}.\", {\n                        actor: ja(ua[qa.author]),\n                        subscriber2: ja(ua[ra[1]])\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1} and {subscriber2}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]]),\n                    subscriber2: ja(ua[ra[1]])\n                });\n                \n            ;\n                i.setContent(pa, ta);\n            });\n        }\n         else if ((ra.length == 3)) {\n            sa = [qa.author,].concat(ra);\n            q.getMulti(sa, function(ua) {\n                if ((qa.author == q.user)) {\n                    ta = i.tx._(\"You added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                        subscriber1: ja(ua[ra[0]]),\n                        subscriber2: ja(ua[ra[1]]),\n                        subscriber3: ja(ua[ra[2]])\n                    });\n                }\n                 else if ((ra[0] == q.user)) {\n                    ta = i.tx._(\"{actor} added you, {subscriber2} and {subscriber3}.\", {\n                        actor: ja(ua[qa.author]),\n                        subscriber2: ja(ua[ra[1]]),\n                        subscriber3: ja(ua[ra[2]])\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]]),\n                    subscriber2: ja(ua[ra[1]]),\n                    subscriber3: ja(ua[ra[2]])\n                });\n                \n            ;\n                i.setContent(pa, ta);\n            });\n        }\n         else {\n            sa = [qa.author,].concat(ra);\n            q.getMulti(sa, function(ua) {\n                var va = i.tx._(\"{num} more\", {\n                    num: (ra.length - 2)\n                }), wa = i.create(\"span\", {\n                    className: \"more\"\n                }, va), xa = i.create(\"div\");\n                w.renderTooltipFlyout(xa, ra.slice(2).map(function(za) {\n                    return ua[za];\n                }));\n                if ((qa.author == q.user)) {\n                    ta = i.tx._(\"You added {subscriber1}, {subscriber2} and {more_people}.\", {\n                        subscriber1: ja(ua[ra[0]]),\n                        subscriber2: ja(ua[ra[1]]),\n                        more_people: wa\n                    });\n                }\n                 else if ((ra[0] == q.user)) {\n                    ta = i.tx._(\"{actor} added you, {subscriber2} and {more_people}.\", {\n                        actor: ja(ua[qa.author]),\n                        subscriber2: ja(ua[ra[1]]),\n                        more_people: wa\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {more_people}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]]),\n                    subscriber2: ja(ua[ra[1]]),\n                    more_people: wa\n                });\n                \n            ;\n                i.setContent(pa, ta);\n                var ya = m.find(pa, \"span.more\");\n                r.set(ya, xa, \"above\", \"center\");\n            });\n        }\n        \n        \n    ;\n    }, ma = function(pa, qa) {\n        q.get(qa.author, function(ra) {\n            var sa;\n            if ((qa.author == q.user)) {\n                sa = i.tx._(\"You left the conversation.\");\n            }\n             else sa = i.tx._(\"{actor} left the conversation.\", {\n                actor: ja(ra)\n            });\n        ;\n            i.setContent(pa, sa);\n        });\n    }, na = function(pa, qa) {\n        var ra = \"We were unable to fetch previous messages in this conversation.\";\n        i.setContent(pa, ra);\n    }, oa = function(pa) {\n        return ((pa.log_message_data.event_name === \"installing\") || (pa.log_message_data.event_name === \"install_canceled\"));\n    };\n    e.exports = w;\n});\n__d(\"MercurySheetPolicy\", [], function(a, b, c, d, e, f) {\n    var g = {\n        canReplaceOpenSheet: function(h, i) {\n            if ((h.getType() == i.getType())) {\n                return false\n            };\n            if ((h.isPermanent() && !i.isPermanent())) {\n                return false\n            };\n            return true;\n        }\n    };\n    e.exports = g;\n});\n__d(\"MercurySheetView\", [\"Animation\",\"ArbiterMixin\",\"MercurySheetPolicy\",\"CSS\",\"DOM\",\"Style\",\"MercurySheetTemplates\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"MercurySheetPolicy\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"MercurySheetTemplates\"), n = b(\"Vector\"), o = b(\"copyProperties\"), p = b(\"cx\"), q = 5000, r = function(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._tabMainElement = u;\n        this._openSheet = null;\n    };\n    o(r.prototype, h, {\n        destroy: function() {\n            k.empty(this._rootElement);\n        },\n        _openCommon: function(s, t) {\n            if ((this._openSheet && !i.canReplaceOpenSheet(this._openSheet, s))) {\n                if (s.couldNotReplace) {\n                    s.couldNotReplace();\n                };\n                return;\n            }\n        ;\n            this.clear(function() {\n                this._openSheet = s;\n                var u = m[\":fb:mercury:tab-sheet:loading\"].build().getRoot();\n                k.setContent(this._rootElement, u);\n                j.show(u);\n                j.show(this._rootElement);\n                s.render();\n                if (t) {\n                    j.addClass(this._tabMainElement, \"sheetSlide\");\n                    j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                    var v = n.getElementDimensions(this._rootElement).y;\n                    l.set(this._rootElement, \"bottom\", (v + \"px\"));\n                    this.resize();\n                    this._animation = new g(this._rootElement).to(\"bottom\", 0).duration(150).ease(g.ease.both).ondone(function() {\n                        j.removeClass(this._tabMainElement, \"sheetSlide\");\n                        j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                        this.resize();\n                    }.bind(this)).go();\n                }\n                 else this.resize();\n            ;\n                if (!s.isPermanent()) {\n                    var w = q;\n                    if (s.getCloseTimeout) {\n                        w = s.getCloseTimeout();\n                    };\n                    var x = this.getAutoCloseCallback(s);\n                    this._sheetCloseHandler = this.close.bind(this, s, x).defer(w, false);\n                    if (s.timeoutCanBeReset) {\n                        s.setResetTimeoutCallback(this.resetTimeout.bind(this));\n                    };\n                }\n            ;\n            }.bind(this));\n        },\n        getAutoCloseCallback: function(s) {\n            if (!s.autoCloseCallback) {\n                return null\n            };\n            return s.autoCloseCallback.bind(s);\n        },\n        resetTimeout: function(s, t) {\n            clearTimeout(this._sheetCloseHandler);\n            var u = this.getAutoCloseCallback(s);\n            this._sheetCloseHandler = this.close.bind(this, s, u).defer(t, false);\n        },\n        set: function(s) {\n            return this._openCommon(s, false);\n        },\n        open: function(s) {\n            return this._openCommon(s, true);\n        },\n        close: function(s, t) {\n            if ((this._openSheet != s)) {\n                return\n            };\n            if (!this._openSheet) {\n                (t && t());\n                return;\n            }\n        ;\n            if (this._animation) {\n                this._animation.stop();\n            };\n            if (this._sheetCloseHandler) {\n                clearTimeout(this._sheetCloseHandler);\n                this._sheetCloseHandler = null;\n            }\n        ;\n            j.addClass(this._tabMainElement, \"sheetSlide\");\n            j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n            var u = n.getElementDimensions(this._rootElement).y;\n            this.resize();\n            this._animation = new g(this._rootElement).to(\"bottom\", (u + \"px\")).duration(100).ease(g.ease.begin).ondone(function() {\n                k.empty(this._rootElement);\n                j.hide(this._rootElement);\n                j.removeClass(this._tabMainElement, \"sheetSlide\");\n                j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                this._openSheet = null;\n                this.resize();\n                (t && t());\n            }.bind(this)).go();\n        },\n        clear: function(s) {\n            this.close(this._openSheet, s);\n        },\n        resize: function() {\n            this.inform(\"resize\");\n        }\n    });\n    e.exports = r;\n});\n__d(\"BanzaiLogger\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = \"logger\";\n    function i(k) {\n        return {\n            log: function(l, m) {\n                g.post(((h + \":\") + l), m, k);\n            }\n        };\n    };\n    var j = i();\n    j.create = i;\n    e.exports = j;\n});\n__d(\"MercuryStickersData\", [\"Arbiter\",\"MercuryStickersInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryStickersInitialData\"), i = h.packs, j = {\n        getPacks: function() {\n            return i;\n        },\n        updatePackData: function(k) {\n            i = k.packs;\n            g.inform(\"MercuryStickers/updatedPacks\");\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryStickers\", [\"Arbiter\",\"ArbiterMixin\",\"BanzaiLogger\",\"CSS\",\"DOM\",\"Event\",\"MercuryStickersData\",\"MercuryStickersFlyoutList.react\",\"Parent\",\"React\",\"SubscriptionsHandler\",\"Toggler\",\"UIPagelet\",\"XUISpinner.react\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"BanzaiLogger\"), j = b(\"CSS\"), k = b(\"DOM\"), l = b(\"Event\"), m = b(\"MercuryStickersData\"), n = b(\"MercuryStickersFlyoutList.react\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"SubscriptionsHandler\"), r = b(\"Toggler\"), s = b(\"UIPagelet\"), t = b(\"XUISpinner.react\"), u = b(\"copyProperties\"), v = b(\"csx\"), w = b(\"cx\");\n    function x(y) {\n        this._packs = k.find(y, \".-cx-PRIVATE-fbMercuryStickersFlyout__packs\");\n        this._packSelector = k.find(y, \".-cx-PRIVATE-fbMercuryStickersFlyout__selector\");\n        this._loadedPacks = {\n            emoticons: true\n        };\n        var z = o.byClass(y, \"uiToggle\"), aa = r.listen(\"show\", z, function() {\n            this._renderPackList();\n            this._subscriptions.addSubscriptions(g.subscribe(\"MercuryStickers/updatedPacks\", this._renderPackList.bind(this)));\n            this._selectPack(m.getPacks()[0].id);\n            r.unsubscribe(aa);\n        }.bind(this));\n        r.listen(\"show\", z, function() {\n            i.log(\"MercuryStickersLoggerConfig\", {\n                event: \"open_tray\"\n            });\n        });\n        this._subscriptions = new q();\n        this._subscriptions.addSubscriptions(l.listen(this._packs, \"click\", function(event) {\n            var ba = o.byClass(event.getTarget(), \"-cx-PRIVATE-fbMercuryStickersFlyout__sticker\");\n            if (ba) {\n                this._selectedSticker(ba);\n                r.hide(z);\n            }\n        ;\n        }.bind(this)));\n    };\n    u(x.prototype, h, {\n        _renderPackList: function() {\n            p.renderComponent(n({\n                onPackClick: this._selectPack.bind(this),\n                packs: m.getPacks()\n            }), this._packSelector);\n        },\n        _loadPack: function(y) {\n            if (this._loadedPacks[y]) {\n                return\n            };\n            var z = this._getPackWithID(y);\n            p.renderComponent(t({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__spinner\"\n            }), z);\n            this._loadedPacks[y] = true;\n            s.loadFromEndpoint(\"StickerPackPagelet\", z, {\n                id: y\n            }, {\n                crossPage: true\n            });\n        },\n        _getPackWithID: function(y) {\n            var z = k.scry(this._packs, (((\".-cx-PRIVATE-fbMercuryStickersFlyout__pack\" + \"[data-id=\\\"\") + y) + \"\\\"]\"))[0];\n            if (!z) {\n                z = k.create(\"div\", {\n                    className: \"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\",\n                    \"data-id\": y\n                });\n                k.appendContent(this._packs, z);\n            }\n        ;\n            return z;\n        },\n        _selectedSticker: function(y) {\n            var z = parseInt(y.getAttribute(\"data-id\"), 10);\n            this.inform(\"stickerselected\", {\n                id: z\n            });\n        },\n        _selectPack: function(y) {\n            k.scry(this._packs, \".-cx-PRIVATE-fbMercuryStickersFlyout__pack\").forEach(j.hide);\n            this._loadPack(y);\n            j.show(this._getPackWithID(y));\n            i.log(\"MercuryStickersLoggerConfig\", {\n                event: \"select_pack\",\n                packid: y\n            });\n        },\n        destroy: function() {\n            (this._subscriptions && this._subscriptions.release());\n            this._subscriptions = null;\n        }\n    });\n    e.exports = x;\n});\n__d(\"Token\", [\"CSS\",\"DataStore\",\"DOM\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m, n) {\n        this.info = m;\n        this.paramName = n;\n    };\n    j(l.prototype, {\n        getInfo: function() {\n            return this.info;\n        },\n        getText: function() {\n            return this.info.text;\n        },\n        getValue: function() {\n            return this.info.uid;\n        },\n        isFreeform: function() {\n            return !!this.info.freeform;\n        },\n        setSelected: function(m) {\n            g.conditionClass(this.getElement(), \"uiTokenSelected\", m);\n            return this;\n        },\n        getElement: function() {\n            if (!this.element) {\n                this.setElement(this.createElement());\n            };\n            return this.element;\n        },\n        setElement: function(m) {\n            h.set(m, \"Token\", this);\n            this.element = m;\n            return this;\n        },\n        isRemovable: function() {\n            return g.hasClass(this.element, \"removable\");\n        },\n        createElement: function(m, n) {\n            var o = this.paramName, p = this.getText(), q = this.getValue(), r = i.create(\"a\", {\n                href: \"#\",\n                \"aria-label\": k._(\"Remove {item}\", {\n                    item: p\n                }),\n                className: \"remove uiCloseButton uiCloseButtonSmall\"\n            });\n            if (m) {\n                g.addClass(r, \"uiCloseButtonSmallGray\");\n            };\n            var s = i.create(\"input\", {\n                type: \"hidden\",\n                value: q,\n                name: (o + \"[]\"),\n                autocomplete: \"off\"\n            }), t = i.create(\"input\", {\n                type: \"hidden\",\n                value: p,\n                name: ((\"text_\" + o) + \"[]\"),\n                autocomplete: \"off\"\n            }), u = i.create(\"span\", {\n                className: \"removable uiToken\"\n            }, [p,s,t,r,]);\n            if (m) {\n                g.addClass(u, \"uiTokenGray\");\n            };\n            if (n) {\n                var v = i.create(\"i\", {\n                    className: n\n                });\n                i.prependContent(u, v);\n            }\n        ;\n            return u;\n        }\n    });\n    e.exports = l;\n});\n__d(\"WeakToken\", [\"Class\",\"CSS\",\"Token\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"CSS\"), i = b(\"Token\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n    g.extend(k, i);\n    j(k.prototype, {\n        createElement: function() {\n            var l = this.parent.createElement(true, \"UFIWeakReferenceIcon\");\n            h.addClass(l, \"uiTokenWeakReference\");\n            return l;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Tokenizer\", [\"Arbiter\",\"ArbiterMixin\",\"CSS\",\"DOM\",\"DOMQuery\",\"DataStore\",\"Event\",\"Focus\",\"Input\",\"Keys\",\"Parent\",\"StickyPlaceholderInput\",\"Style\",\"TextMetrics\",\"Token\",\"UserAgent\",\"WeakToken\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DataStore\"), m = b(\"Event\"), n = b(\"Focus\"), o = b(\"Input\"), p = b(\"Keys\"), q = b(\"Parent\"), r = b(\"StickyPlaceholderInput\"), s = b(\"Style\"), t = b(\"TextMetrics\"), u = b(\"Token\"), v = b(\"UserAgent\"), w = b(\"WeakToken\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"emptyFunction\"), aa = 20;\n    function ba(ca, da) {\n        this.element = ca;\n        this.typeahead = da;\n        this.input = da.getCore().getElement();\n        l.set(this.element, \"Tokenizer\", this);\n    };\n    ba.getInstance = function(ca) {\n        var da = q.byClass(ca, \"uiTokenizer\");\n        return (da ? l.get(da, \"Tokenizer\") : null);\n    };\n    x(ba.prototype, h, {\n        inline: false,\n        maxTokens: null,\n        excludeDuplicates: true,\n        placeholder: \"\",\n        init: function(ca, da, ea, fa) {\n            this.init = z;\n            this.tokenarea = ca;\n            this.paramName = da;\n            if (!this.placeholder) {\n                this.placeholder = (this.input.getAttribute(\"data-placeholder\") || \"\");\n            };\n            x(this, (fa || {\n            }));\n            this.initEvents();\n            this.initTypeahead();\n            this.reset(ea);\n            this.initBehaviors();\n            this.adjustWidth.bind(this).defer();\n            g.inform(\"Tokenizer/init\", this, g.BEHAVIOR_PERSISTENT);\n        },\n        reset: function(ca) {\n            this.tokens = [];\n            this.unique = {\n            };\n            if (ca) {\n                this.populate(ca);\n            }\n             else j.empty(this.tokenarea);\n        ;\n            this.updateTokenarea();\n        },\n        populate: function(ca) {\n            var da = [];\n            this.tokens = this.getTokenElements().map(function(ea, fa) {\n                var ga = ca[fa];\n                da.push(this._tokenKey(ga));\n                return this.createToken(ga, ea);\n            }, this);\n            this.unique = y(da, this.tokens);\n        },\n        getElement: function() {\n            return this.element;\n        },\n        getTypeahead: function() {\n            return this.typeahead;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        initBehaviors: function() {\n            this.behaviors = (this.behaviors || []);\n            if ((this.behaviors instanceof Array)) {\n                this.behaviors.forEach(function(ea) {\n                    ea.behavior(this, ea.config);\n                }.bind(this));\n            }\n             else for (var ca in ((this.behaviors || {\n            }))) {\n                var da = (window.TokenizerBehaviors && window.TokenizerBehaviors[ca]);\n                da.call(null, this, this.behaviors[ca]);\n            }\n        ;\n        },\n        initTypeahead: function() {\n            var ca = this.typeahead.getCore();\n            ca.resetOnSelect = true;\n            ca.setValueOnSelect = false;\n            ca.preventFocusChangeOnTab = true;\n            if (this.inline) {\n                var da = this.typeahead.getView();\n                i.addClass(da.getElement(), \"uiInlineTokenizerView\");\n            }\n        ;\n            this.typeahead.subscribe(\"select\", function(ea, fa) {\n                var ga = fa.selected;\n                if ((\"uid\" in ga)) {\n                    this.updateInput();\n                    this.addToken(this.createToken(ga));\n                }\n            ;\n            }.bind(this));\n            this.typeahead.subscribe(\"blur\", this.handleBlur.bind(this));\n        },\n        handleBlur: function(event) {\n            this.inform(\"blur\", {\n                event: event\n            });\n            this.updatePlaceholder();\n        },\n        initEvents: function() {\n            var ca = this.handleEvents.bind(this), da = ((v.firefox() < 4) ? \"keypress\" : \"keydown\");\n            m.listen(this.tokenarea, {\n                click: ca,\n                keydown: ca\n            });\n            m.listen(this.input, \"paste\", this.paste.bind(this));\n            m.listen(this.input, da, this.keydown.bind(this));\n        },\n        handleEvents: function(event) {\n            var ca = event.getTarget(), da = (ca && this.getTokenElementFromTarget(ca));\n            if (!da) {\n                return\n            };\n            if (((event.type != \"keydown\") || (m.getKeyCode(event) == p.RETURN))) {\n                this.processEvents(event, ca, da);\n            };\n        },\n        processEvents: function(event, ca, da) {\n            if (q.byClass(ca, \"remove\")) {\n                var ea = da.nextSibling;\n                ea = (ea && k.scry(da.nextSibling, \".remove\")[0]);\n                var fa = this.getTokenFromElement(da);\n                fa = this.addTokenData(fa, ca);\n                this.removeToken(fa);\n                this.focusOnTokenRemoval(event, ea);\n                event.kill();\n            }\n        ;\n        },\n        focusOnTokenRemoval: function(event, ca) {\n            n.set((((event.type == \"keydown\") && ca) || this.input));\n        },\n        addTokenData: function(ca, da) {\n            return ca;\n        },\n        keydown: function(event) {\n            this.inform(\"keydown\", {\n                event: event\n            });\n            var ca = m.getKeyCode(event), da = this.input;\n            if (((this.inline && (ca == p.BACKSPACE)) && o.isEmpty(da))) {\n                var ea = this.getLastToken();\n                if ((ea && ea.isRemovable())) {\n                    this.removeToken(ea);\n                };\n            }\n        ;\n            this.updateInput();\n        },\n        paste: function(event) {\n            this.inform(\"paste\", {\n                event: event\n            });\n            this.updateInput(true);\n        },\n        focusInput: function() {\n            n.set(this.input);\n        },\n        updateInput: function(ca) {\n            if (!this.inline) {\n                return\n            };\n            setTimeout(function() {\n                this.adjustWidth(this.input.value);\n                if (ca) {\n                    this.input.value = this.input.value;\n                };\n            }.bind(this), 20);\n            r.setPlaceholderText(this.input, \"\");\n            this.inform(\"resize\");\n        },\n        setPlaceholder: function(ca) {\n            this.placeholder = ca;\n            if (this.stickyPlaceholder) {\n                r.setPlaceholderText(this.input, ca);\n            };\n            this.updatePlaceholder();\n        },\n        updatePlaceholder: function() {\n            if ((!this.inline || this.input.value)) {\n                return\n            };\n            var ca = !this.tokens.length, da = \"\";\n            if ((ca || this.stickyPlaceholder)) {\n                this.adjustWidth(this.placeholder);\n                da = this.placeholder;\n            }\n             else this.adjustWidth(this.input.value);\n        ;\n            r.setPlaceholderText(this.input, da);\n        },\n        adjustWidth: function(ca) {\n            if ((!this.inline || !this._getIsInDOM())) {\n                return\n            };\n            if ((!ca && (this.input.value === \"\"))) {\n                ca = this.placeholder;\n            };\n            var da = aa;\n            if ((((ca !== this.placeholder) || !this.getTokens().length) || this.stickyPlaceholder)) {\n                var ea = this._getMetrics().measure(ca);\n                da = ((ea.width + this._getWidthOffset()) + 10);\n            }\n        ;\n            s.set(this.input, \"width\", (da + \"px\"));\n            this.inform(\"resize\");\n        },\n        getToken: function(ca) {\n            return (this.unique[ca] || null);\n        },\n        getTokens: function() {\n            return (this.tokens || []);\n        },\n        getTokenElements: function() {\n            return k.scry(this.tokenarea, \"span.uiToken\");\n        },\n        getTokenElementFromTarget: function(ca) {\n            return q.byClass(ca, \"uiToken\");\n        },\n        getTokenFromElement: function(ca) {\n            return l.get(ca, \"Token\");\n        },\n        getTokenValues: function() {\n            if (!this.tokens) {\n                return []\n            };\n            return this.tokens.map(function(ca) {\n                return ca.getValue();\n            });\n        },\n        getFirstToken: function() {\n            return (this.tokens[0] || null);\n        },\n        getLastToken: function() {\n            return (this.tokens[(this.tokens.length - 1)] || null);\n        },\n        hasMaxTokens: function() {\n            return (this.maxTokens && (this.maxTokens <= this.tokens.length));\n        },\n        createToken: function(ca, da) {\n            var ea = this.getToken(this._tokenKey(ca));\n            if (!ea) {\n                ea = (ca.weak_reference ? new w(ca, this.paramName) : new u(ca, this.paramName));\n            };\n            (da && ea.setElement(da));\n            return ea;\n        },\n        addToken: function(ca) {\n            if (this.hasMaxTokens()) {\n                return\n            };\n            var da = this._tokenKey(ca.getInfo());\n            if ((da in this.unique)) {\n                return\n            };\n            this.unique[da] = ca;\n            this.tokens.push(ca);\n            this.insertToken(ca);\n            this.updateTokenarea();\n            this.inform(\"addToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        insertToken: function(ca) {\n            j.appendContent(this.tokenarea, ca.getElement());\n        },\n        removeToken: function(ca) {\n            if (!ca) {\n                return\n            };\n            var da = this.tokens.indexOf(ca);\n            if ((da < 0)) {\n                return\n            };\n            this.tokens.splice(this.tokens.indexOf(ca), 1);\n            delete this.unique[this._tokenKey(ca.getInfo())];\n            j.remove(ca.getElement());\n            this.updateTokenarea();\n            this.inform(\"removeToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        removeAllTokens: function() {\n            this.reset();\n            this.inform(\"removeAllTokens\");\n        },\n        updateTokenarea: function() {\n            var ca = this.typeahead.getCore(), da = this.getTokenValues();\n            if (this.excludeDuplicates) {\n                (this._exclusions || (this._exclusions = ca.getExclusions()));\n                ca.setExclusions(da.concat(this._exclusions));\n            }\n        ;\n            ca.setEnabled(!this.hasMaxTokens());\n            this.updateTokenareaVisibility();\n            this.updatePlaceholder();\n            this.inform(\"resize\");\n        },\n        updateTokenareaVisibility: function() {\n            i.conditionShow(this.tokenarea, (this.tokens.length !== 0));\n        },\n        _tokenKey: function(ca) {\n            return (ca.uid + ((ca.freeform ? \":\" : \"\")));\n        },\n        _widthOffset: null,\n        _getWidthOffset: function() {\n            if ((this._widthOffset === null)) {\n                var ca = this.input.clientWidth, da = s.getFloat(this.input, \"width\");\n                if ((ca == da)) {\n                    this._widthOffset = (s.getFloat(this.input, \"paddingLeft\") + s.getFloat(this.input, \"paddingRight\"));\n                }\n                 else this._widthOffset = 0;\n            ;\n            }\n        ;\n            return this._widthOffset;\n        },\n        _metrics: null,\n        _getMetrics: function() {\n            if (!this._metrics) {\n                this._metrics = new t(this.input, this.inline);\n            };\n            return this._metrics;\n        },\n        _getIsInDOM: function() {\n            return (this._isInDOM || (this._isInDOM = k.contains(document.body, this.input)));\n        }\n    });\n    ba.init = function(ca, da) {\n        ca.init(da.tokenarea, da.param_name, da.initial_info, da.options);\n    };\n    e.exports = ba;\n});\n__d(\"MercuryTypeahead\", [\"Event\",\"ArbiterMixin\",\"DOM\",\"DOMDimensions\",\"Input\",\"Keys\",\"MercuryTypeaheadTemplates\",\"Tokenizer\",\"Typeahead\",\"TypeaheadCore\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"Input\"), l = b(\"Keys\"), m = b(\"MercuryTypeaheadTemplates\"), n = b(\"Tokenizer\"), o = b(\"Typeahead\"), p = b(\"TypeaheadCore\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = function(t, u) {\n        this._domElement = null;\n        this._typeahead = null;\n        this._tokenizer = null;\n        this._placeholder = \"\";\n        this._exclusions = [];\n        this._viewNodeOrID = null;\n        this._viewOptions = {\n            renderer: \"compact\",\n            autoSelect: true\n        };\n        this._tokenizerBehaviors = [];\n        this._heightPrev = null;\n        this._dataSource = t;\n        this._view = u;\n    };\n    q(s.prototype, h);\n    q(s.prototype, {\n        setPlaceholder: function(t) {\n            this._placeholder = t;\n            return this;\n        },\n        setExcludedParticipants: function(t) {\n            this._exclusions = [];\n            t.forEach(function(u) {\n                var v = u.indexOf(\":\");\n                if ((u.substr(0, v) == \"fbid\")) {\n                    this._exclusions.push(u.substr((v + 1)));\n                };\n            }.bind(this));\n            return this;\n        },\n        setViewNodeID: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setViewNode: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setFullWidthView: function(t) {\n            var u = i.create(\"div\", {\n                className: \"-cx-PRIVATE-mercuryTypeahead__typeaheadview uiTypeaheadView\"\n            });\n            i.setContent(t, u);\n            this.setViewNode(u);\n        },\n        setViewOption: function(t, u) {\n            this._viewOptions[t] = u;\n        },\n        addTokenizerBehavior: function(t) {\n            this._tokenizerBehaviors.push(t);\n        },\n        build: function(t) {\n            if (this._domElement) {\n                return\n            };\n            var u = m[\":fb:mercury:tokenizer\"].build(), v = m[\":fb:mercury:typeahead\"].build();\n            this._domElement = u.getRoot();\n            i.appendContent(this._domElement, v.getRoot());\n            var w = v.getNode(\"textfield\");\n            k.setPlaceholder(w, this._placeholder);\n            w.setAttribute(\"data-placeholder\", this._placeholder);\n            this._input = w;\n            var x = {\n                node_id: this._viewNodeOrID,\n                ctor: this._view,\n                options: this._viewOptions\n            }, y = {\n                ctor: p,\n                options: {\n                    setValueOnSelect: true\n                }\n            };\n            this._typeahead = new o(this._dataSource, x, y, v.getRoot());\n            this._typeahead.init();\n            var z = {\n                inline: true,\n                behaviors: this._tokenizerBehaviors\n            };\n            this._tokenizer = new n(this._domElement, this._typeahead);\n            this._tokenizer.init(u.getNode(\"tokenarea\"), \"participants\", [], z);\n            this._tokenizer.subscribe([\"addToken\",\"removeToken\",\"removeAllTokens\",], this._tokensChanged.bind(this));\n            this._tokenizer.subscribe(\"resize\", function() {\n                this.inform(\"resize\");\n            }.bind(this));\n            g.listen(w, \"focus\", function() {\n                this._resetDataSource();\n                this._typeahead.init();\n            }.bind(this));\n            g.listen(this._domElement, \"click\", this.focus.bind(this));\n            g.listen(w, \"keydown\", this.keydown.bind(this));\n            this._heightPrev = j.getElementDimensions(this._domElement).height;\n        },\n        getElement: function() {\n            return this._domElement;\n        },\n        getSelectedParticipantIDs: function() {\n            var t = [];\n            if (this._tokenizer) {\n                ((this._tokenizer.getTokenValues() || [])).forEach(function(u) {\n                    t.push((\"fbid:\" + u));\n                });\n            };\n            return t;\n        },\n        getTokens: function() {\n            var t = [];\n            if (this._tokenizer) {\n                t = this._tokenizer.getTokens();\n            };\n            return t;\n        },\n        getTokenizer: function() {\n            return this._tokenizer;\n        },\n        keydown: function(event) {\n            if ((this._tokenizer.inline && (event.keyCode == l.ESC))) {\n                if (k.isEmpty(this._input)) {\n                    var t = this._tokenizer.getLastToken();\n                    if ((t && t.isRemovable())) {\n                        this._tokenizer.removeToken(t);\n                    };\n                }\n                 else this._typeahead.getCore().reset();\n            ;\n                return false;\n            }\n        ;\n        },\n        reset: function() {\n            (this._tokenizer && this._tokenizer.removeAllTokens());\n            (this._typeahead && this._typeahead.getCore().reset());\n        },\n        focus: function() {\n            (this._tokenizer && this._tokenizer.focusInput());\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _resetDataSource: function() {\n            this._dataSource.setExclusions(this._exclusions);\n        },\n        _tokensChanged: function() {\n            this.inform(\"tokens-changed\");\n        }\n    });\n    e.exports = s;\n});");
// 16070
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s97b96e14e87652e83077727426b04b05027d1f39");
// 16071
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"4/uwC\",]);\n}\n;\n;\n__d(\"MercuryAudioPlayer\", [\"JSBNG__Event\",\"Arbiter\",\"DOM\",\"Flash\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"DOM\"), j = b(\"Flash\"), k = b(\"copyProperties\"), l = 200;\n    function m() {\n        var v = i.create(\"audio\"), w = false;\n        try {\n            if (!!v.canPlayType) {\n                if (v.canPlayType(\"video/mp4;\").replace(/^no$/, \"\")) {\n                    w = true;\n                }\n            ;\n            }\n        ;\n        ;\n        } finally {\n            return w;\n        };\n    ;\n    };\n;\n    function n() {\n        return j.isAvailable();\n    };\n;\n    var o = function() {\n        this.interval = null;\n        this.arbiterInstance = null;\n        this.audio = i.create(\"audio\");\n        g.listen(this.audio, \"playing\", function() {\n            this.informAttachment(\"playing\", this.audio.currentTime);\n            this.interval = JSBNG__setInterval(function() {\n                this.informAttachment(\"playing\", this.audio.currentTime);\n            }.bind(this), l);\n        }.bind(this));\n        g.listen(this.audio, \"ended\", function() {\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(o.prototype, {\n        setAudio: function(v, w) {\n            this.audio.setAttribute(\"src\", v);\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            }\n        ;\n        ;\n        },\n        play: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.audio.play();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            this.audio.pause();\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"html5\";\n        }\n    });\n    var p = function() {\n        this.src = null;\n        this.arbiterInstance = null;\n        var v = i.create(\"div\");\n        JSBNG__document.body.appendChild(v);\n        this.swf = j.embed(\"/swf/SoundStreamPlayer.swf\", v, null, {\n        });\n        this.interval = null;\n        h.subscribe(\"soundstream/finished\", function() {\n            JSBNG__clearInterval(this.interval);\n            this.informAttachment(\"finished\");\n        }.bind(this));\n    };\n    k(p.prototype, {\n        setAudio: function(v, w) {\n            this.src = v;\n            this.arbiterInstance = w;\n        },\n        informAttachment: function(v, w) {\n            if (this.arbiterInstance) {\n                this.arbiterInstance.inform(v, w);\n            }\n        ;\n        ;\n        },\n        play: function() {\n            this.swf.playSound(this.src);\n            this.interval = JSBNG__setInterval(function() {\n                var v = this.swf.getCurrentTime();\n                this.informAttachment(\"playing\", v);\n            }.bind(this), l);\n            this.informAttachment(\"played\");\n        },\n        resume: function() {\n            this.swf.resume();\n            this.informAttachment(\"played\");\n        },\n        pause: function() {\n            JSBNG__clearInterval(this.interval);\n            this.swf.pause();\n            this.informAttachment(\"paused\");\n        },\n        getType: function() {\n            return \"flash\";\n        }\n    });\n    function q() {\n        if (m()) {\n            return new o();\n        }\n         else if (n()) {\n            return new p();\n        }\n        \n    ;\n    ;\n        return false;\n    };\n;\n    var r = null, s = null, t = 0;\n    function u(v, w) {\n        this.src = v;\n        this.arbiterInstance = w;\n        this.audio_id = ++t;\n        ((((r !== null)) || (r = q())));\n        if (!r) {\n            return false;\n        }\n    ;\n    ;\n    };\n;\n    k(u.prototype, {\n        getType: function() {\n            if (!r) {\n                return false;\n            }\n             else return r.getType()\n        ;\n        },\n        play: function(v) {\n            if (((v && ((s == this.audio_id))))) {\n                r.resume();\n            }\n             else {\n                this.pause();\n                s = this.audio_id;\n                r.setAudio(this.src, this.arbiterInstance);\n                r.play();\n            }\n        ;\n        ;\n        },\n        pause: function() {\n            r.pause();\n        }\n    });\n    e.exports = u;\n});\n__d(\"MercuryAttachmentAudioClip.react\", [\"Arbiter\",\"ArbiterMixin\",\"MercuryAudioPlayer\",\"Env\",\"JSLogger\",\"LeftRight.react\",\"React\",\"cx\",\"shield\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"MercuryAudioPlayer\"), j = b(\"Env\"), k = b(\"JSLogger\"), l = b(\"LeftRight.react\"), m = b(\"React\"), n = b(\"cx\"), o = b(\"shield\"), p = b(\"tx\"), q = \"MercuryAttachmentAudioClip/play\", r = k.create(\"mercury_audio_clip\"), s = m.createClass({\n        displayName: \"AudioClip\",\n        mixins: [h,],\n        getInitialState: function() {\n            this.subscribe(\"playing\", this.updateTime);\n            this.subscribe(\"played\", o(this.setState, this, {\n                playing: true,\n                started: true\n            }));\n            this.subscribe(\"paused\", o(this.setState, this, {\n                playing: false\n            }));\n            this.subscribe(\"finished\", o(this.setState, this, {\n                playing: false,\n                started: false,\n                time: this.props.duration\n            }));\n            this.logged = false;\n            var t = ((this.props.downloadOnly ? false : new i(this.props.src, this)));\n            g.subscribe(q, function(u, v) {\n                if (((this.props.src != v))) {\n                    this.setState({\n                        time: 0\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            return {\n                time: 0,\n                playing: false,\n                started: false,\n                duration: this.props.duration,\n                audioPlayer: t\n            };\n        },\n        updateTime: function(t, u) {\n            this.setState({\n                time: u\n            });\n        },\n        play: function() {\n            if (this.state.playing) {\n                this.state.audioPlayer.pause();\n            }\n             else {\n                this.state.audioPlayer.play(this.state.started);\n                g.inform(q, this.props.src);\n                if (!this.logged) {\n                    this.logged = true;\n                    r.log(\"play\", {\n                        uid: j.user,\n                        duration: this.props.duration\n                    });\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        _formatSeconds: function(t) {\n            if (t) {\n                t = Math.ceil(t);\n                var u = ((t % 60));\n                if (((u < 10))) {\n                    u = ((\"0\" + u));\n                }\n            ;\n            ;\n                var v = Math.floor(((t / 60)));\n                return ((((v + \":\")) + u));\n            }\n             else return null\n        ;\n        },\n        _renderPlayer: function(t, u) {\n            return (m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\",\n                style: {\n                    width: t\n                },\n                onClick: this.play\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__play\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__playicon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__duration\"\n            }, u), m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__scrubber\"\n            })));\n        },\n        render: function() {\n            var t = this.state.time, u = this.state.playing, v = this._formatSeconds(this.state.duration), w = ((this.props.width || 170)), x = null, y = Math.ceil(((((t * ((w + 2)))) / this.state.duration)));\n            if (((this.state.audioPlayer && this.state.audioPlayer.getType()))) {\n                var z = this._renderPlayer(w, v), aa = this._renderPlayer(w, v), ba = (((((\"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\") + ((((u && ((t !== 0)))) ? ((\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__playing\")) : \"\")))) + ((((u && ((t === 0)))) ? ((\" \" + \"-cx-PRIVATE-mercuryAttachmentAudioClip__loading\")) : \"\"))));\n                x = (m.DOM.div({\n                    className: ba\n                }, z, m.DOM.div({\n                    className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__progresser\",\n                    style: {\n                        width: y\n                    }\n                }, aa)));\n            }\n             else x = (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__controls\"\n            }, m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__player\"\n            }, l(null, m.DOM.a({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadbox\",\n                href: this.props.src\n            }, m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speaker\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__speakericon\"\n            })), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadtext\"\n            }, \"Voice Message\"), m.DOM.span({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__durationinline\"\n            }, v)), m.DOM.a({\n                href: this.props.src,\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__download\"\n            }, m.DOM.i({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__downloadicon\"\n            }))))));\n        ;\n        ;\n            return (m.DOM.div({\n                className: \"-cx-PRIVATE-mercuryAttachmentAudioClip__root\"\n            }, x));\n        }\n    });\n    e.exports = s;\n});\n__d(\"MercuryStickersFlyoutList.react\", [\"Animation\",\"React\",\"JSBNG__Image.react\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"React\"), i = b(\"JSBNG__Image.react\"), j = b(\"cx\"), k = b(\"fbt\"), l = b(\"ix\"), m = 5, n = \"Sticker Store\", o = h.createClass({\n        displayName: \"MercuryStickersFlyoutList\",\n        _calculateNumPages: function(q) {\n            return Math.max(1, Math.ceil(((((q.length - 1)) / m))));\n        },\n        getInitialState: function() {\n            return {\n                animating: false,\n                selectedId: this.props.packs[0].id,\n                page: 0,\n                numPages: this._calculateNumPages(this.props.packs)\n            };\n        },\n        componentWillReceiveProps: function(q) {\n            this.setState({\n                numPages: this._calculateNumPages(q.packs)\n            });\n        },\n        shouldComponentUpdate: function(q, r) {\n            return !r.animating;\n        },\n        _canGoPrev: function() {\n            return ((this.state.page > 0));\n        },\n        _canGoNext: function() {\n            return ((((this.state.page + 1)) < this.state.numPages));\n        },\n        _setPage: function(q) {\n            if (this.state.animating) {\n                return;\n            }\n        ;\n        ;\n            this.setState({\n                animating: true,\n                page: q\n            });\n            var r = this.refs.positioner.getDOMNode();\n            new g(r).to(\"marginLeft\", ((-r.childNodes[q].offsetLeft + \"px\"))).ondone(function() {\n                this.setState({\n                    animating: false\n                });\n            }.bind(this)).duration(200).go();\n        },\n        _back: function() {\n            ((this._canGoPrev() && this._setPage(((this.state.page - 1)))));\n        },\n        _next: function() {\n            ((this._canGoNext() && this._setPage(((this.state.page + 1)))));\n        },\n        render: function() {\n            var q = this.props.packs, r = this.props.onPackClick, s = [];\n            q.forEach(function(y, z) {\n                s.push(p({\n                    key: y.id,\n                    onClick: function() {\n                        ((r && r(y.id)));\n                        this.setState({\n                            selectedId: y.id\n                        });\n                    }.bind(this),\n                    pack: y,\n                    selected: ((this.state.selectedId === y.id))\n                }));\n            }.bind(this));\n            var t = [], u = [];\n            s.forEach(function(y, z) {\n                u.push(y);\n                if (((((z > 0)) && ((((((z % m)) === 0)) || ((z === ((s.length - 1))))))))) {\n                    t.push(h.DOM.div({\n                        className: \"-cx-PRIVATE-fbMercuryStickersSelector__page\"\n                    }, u));\n                    u = [];\n                }\n            ;\n            ;\n            });\n            var v = (((((\"-cx-PRIVATE-fbMercuryStickersSelector__left\") + ((\" \" + \"lfloat\")))) + ((!this._canGoPrev() ? ((\" \" + \"hidden_elem\")) : \"\")))), w = (((((\"-cx-PRIVATE-fbMercuryStickersSelector__right\") + ((\" \" + \"rfloat\")))) + ((!this._canGoNext() ? ((\" \" + \"hidden_elem\")) : \"\")))), x;\n            if (((t.length > 1))) {\n                x = h.DOM.a({\n                    className: w,\n                    onClick: this._next\n                }, i({\n                    className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                    src: l(\"/images/messaging/stickers/selector/rightarrow.png\")\n                }));\n            }\n        ;\n        ;\n            return (h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__root\"\n            }, h.DOM.a({\n                ajaxify: \"/ajax/messaging/stickers/store\",\n                \"aria-label\": n,\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__store rfloat\",\n                \"data-hover\": \"tooltip\",\n                ref: \"store\",\n                rel: \"dialog\"\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__storeicon\",\n                src: l(\"/images/messaging/stickers/selector/store.png\")\n            })), h.DOM.a({\n                className: v,\n                onClick: this._back\n            }, i({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__arrow\",\n                src: l(\"/images/messaging/stickers/selector/leftarrow.png\")\n            })), x, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__icons\"\n            }, h.DOM.div({\n                className: \"-cx-PRIVATE-fbMercuryStickersSelector__positioner\",\n                ref: \"positioner\"\n            }, t))));\n        }\n    }), p = h.createClass({\n        displayName: \"PackIcon\",\n        render: function() {\n            var q = this.props.pack, r = (((\"-cx-PRIVATE-fbMercuryStickersFlyout__packselector\") + ((this.props.selected ? ((\" \" + \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedpack\")) : \"\"))));\n            return (h.DOM.a({\n                \"aria-label\": q.JSBNG__name,\n                className: r,\n                \"data-id\": q.id,\n                \"data-hover\": \"tooltip\",\n                onClick: function() {\n                    ((this.props.onClick && this.props.onClick(q.id)));\n                }.bind(this),\n                tabIndex: \"0\"\n            }, h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__packicon\",\n                src: q.icon\n            }), h.DOM.img({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__selectedicon\",\n                src: q.selectedIcon\n            })));\n        }\n    });\n    e.exports = o;\n});\n__d(\"str2rstr\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        var i = \"\", j, k;\n        for (var l = 0; ((l < h.length)); l++) {\n            j = h.charCodeAt(l);\n            k = ((((((l + 1)) < h.length)) ? h.charCodeAt(((l + 1))) : 0));\n            if (((((((((55296 <= j)) && ((j <= 56319)))) && ((56320 <= k)))) && ((k <= 57343))))) {\n                j = ((((65536 + ((((j & 1023)) << 10)))) + ((k & 1023))));\n                l++;\n            }\n        ;\n        ;\n            if (((j <= 127))) {\n                i += String.fromCharCode(j);\n            }\n             else if (((j <= 2047))) {\n                i += String.fromCharCode(((192 | ((((j >>> 6)) & 31)))), ((128 | ((j & 63)))));\n            }\n             else if (((j <= 65535))) {\n                i += String.fromCharCode(((224 | ((((j >>> 12)) & 15)))), ((128 | ((((j >>> 6)) & 63)))), ((128 | ((j & 63)))));\n            }\n             else if (((j <= 2097151))) {\n                i += String.fromCharCode(((240 | ((((j >>> 18)) & 7)))), ((128 | ((((j >>> 12)) & 63)))), ((128 | ((((j >>> 6)) & 63)))), ((128 | ((j & 63)))));\n            }\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        return i;\n    };\n;\n    e.exports = g;\n});\n__d(\"md5\", [\"str2rstr\",], function(a, b, c, d, e, f) {\n    var g = b(\"str2rstr\");\n    function h(u, v) {\n        var w = u[0], x = u[1], y = u[2], z = u[3];\n        w = j(w, x, y, z, v[0], 7, -680876936);\n        z = j(z, w, x, y, v[1], 12, -389564586);\n        y = j(y, z, w, x, v[2], 17, 606105819);\n        x = j(x, y, z, w, v[3], 22, -1044525330);\n        w = j(w, x, y, z, v[4], 7, -176418897);\n        z = j(z, w, x, y, v[5], 12, 1200080426);\n        y = j(y, z, w, x, v[6], 17, -1473231341);\n        x = j(x, y, z, w, v[7], 22, -45705983);\n        w = j(w, x, y, z, v[8], 7, 1770035416);\n        z = j(z, w, x, y, v[9], 12, -1958414417);\n        y = j(y, z, w, x, v[10], 17, -42063);\n        x = j(x, y, z, w, v[11], 22, -1990404162);\n        w = j(w, x, y, z, v[12], 7, 1804603682);\n        z = j(z, w, x, y, v[13], 12, -40341101);\n        y = j(y, z, w, x, v[14], 17, -1502002290);\n        x = j(x, y, z, w, v[15], 22, 1236535329);\n        w = k(w, x, y, z, v[1], 5, -165796510);\n        z = k(z, w, x, y, v[6], 9, -1069501632);\n        y = k(y, z, w, x, v[11], 14, 643717713);\n        x = k(x, y, z, w, v[0], 20, -373897302);\n        w = k(w, x, y, z, v[5], 5, -701558691);\n        z = k(z, w, x, y, v[10], 9, 38016083);\n        y = k(y, z, w, x, v[15], 14, -660478335);\n        x = k(x, y, z, w, v[4], 20, -405537848);\n        w = k(w, x, y, z, v[9], 5, 568446438);\n        z = k(z, w, x, y, v[14], 9, -1019803690);\n        y = k(y, z, w, x, v[3], 14, -187363961);\n        x = k(x, y, z, w, v[8], 20, 1163531501);\n        w = k(w, x, y, z, v[13], 5, -1444681467);\n        z = k(z, w, x, y, v[2], 9, -51403784);\n        y = k(y, z, w, x, v[7], 14, 1735328473);\n        x = k(x, y, z, w, v[12], 20, -1926607734);\n        w = l(w, x, y, z, v[5], 4, -378558);\n        z = l(z, w, x, y, v[8], 11, -2022574463);\n        y = l(y, z, w, x, v[11], 16, 1839030562);\n        x = l(x, y, z, w, v[14], 23, -35309556);\n        w = l(w, x, y, z, v[1], 4, -1530992060);\n        z = l(z, w, x, y, v[4], 11, 1272893353);\n        y = l(y, z, w, x, v[7], 16, -155497632);\n        x = l(x, y, z, w, v[10], 23, -1094730640);\n        w = l(w, x, y, z, v[13], 4, 681279174);\n        z = l(z, w, x, y, v[0], 11, -358537222);\n        y = l(y, z, w, x, v[3], 16, -722521979);\n        x = l(x, y, z, w, v[6], 23, 76029189);\n        w = l(w, x, y, z, v[9], 4, -640364487);\n        z = l(z, w, x, y, v[12], 11, -421815835);\n        y = l(y, z, w, x, v[15], 16, 530742520);\n        x = l(x, y, z, w, v[2], 23, -995338651);\n        w = m(w, x, y, z, v[0], 6, -198630844);\n        z = m(z, w, x, y, v[7], 10, 1126891415);\n        y = m(y, z, w, x, v[14], 15, -1416354905);\n        x = m(x, y, z, w, v[5], 21, -57434055);\n        w = m(w, x, y, z, v[12], 6, 1700485571);\n        z = m(z, w, x, y, v[3], 10, -1894986606);\n        y = m(y, z, w, x, v[10], 15, -1051523);\n        x = m(x, y, z, w, v[1], 21, -2054922799);\n        w = m(w, x, y, z, v[8], 6, 1873313359);\n        z = m(z, w, x, y, v[15], 10, -30611744);\n        y = m(y, z, w, x, v[6], 15, -1560198380);\n        x = m(x, y, z, w, v[13], 21, 1309151649);\n        w = m(w, x, y, z, v[4], 6, -145523070);\n        z = m(z, w, x, y, v[11], 10, -1120210379);\n        y = m(y, z, w, x, v[2], 15, 718787259);\n        x = m(x, y, z, w, v[9], 21, -343485551);\n        u[0] = s(w, u[0]);\n        u[1] = s(x, u[1]);\n        u[2] = s(y, u[2]);\n        u[3] = s(z, u[3]);\n    };\n;\n    function i(u, v, w, x, y, z) {\n        v = s(s(v, u), s(x, z));\n        return s(((((v << y)) | ((v >>> ((32 - y)))))), w);\n    };\n;\n    function j(u, v, w, x, y, z, aa) {\n        return i(((((v & w)) | (((~v) & x)))), u, v, y, z, aa);\n    };\n;\n    function k(u, v, w, x, y, z, aa) {\n        return i(((((v & x)) | ((w & (~x))))), u, v, y, z, aa);\n    };\n;\n    function l(u, v, w, x, y, z, aa) {\n        return i(((((v ^ w)) ^ x)), u, v, y, z, aa);\n    };\n;\n    function m(u, v, w, x, y, z, aa) {\n        return i(((w ^ ((v | (~x))))), u, v, y, z, aa);\n    };\n;\n    function n(u) {\n        var v = u.length, w = [1732584193,-271733879,-1732584194,271733878,], x;\n        for (x = 64; ((x <= u.length)); x += 64) {\n            h(w, o(u.substring(((x - 64)), x)));\n        ;\n        };\n    ;\n        u = u.substring(((x - 64)));\n        var y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,];\n        for (x = 0; ((x < u.length)); x++) {\n            y[((x >> 2))] |= ((u.charCodeAt(x) << ((((x & 3)) << 3))));\n        ;\n        };\n    ;\n        y[((x >> 2))] |= ((128 << ((((x & 3)) << 3))));\n        if (((x > 55))) {\n            h(w, y);\n            for (x = 0; ((x < 16)); x++) {\n                y[x] = 0;\n            ;\n            };\n        ;\n        }\n    ;\n    ;\n        y[14] = ((v * 8));\n        h(w, y);\n        return w;\n    };\n;\n    function o(u) {\n        var v = [], w = 0;\n        while (((w < 64))) {\n            v[((w >> 2))] = ((((((u.charCodeAt(w++) | ((u.charCodeAt(w++) << 8)))) | ((u.charCodeAt(w++) << 16)))) | ((u.charCodeAt(w++) << 24))));\n        ;\n        };\n    ;\n        return v;\n    };\n;\n    var p = \"0123456789abcdef\".split(\"\");\n    function q(u) {\n        var v = \"\", w = 0;\n        for (; ((w < 4)); w++) {\n            v += ((p[((((u >> ((((w << 3)) + 4)))) & 15))] + p[((((u >> ((w << 3)))) & 15))]));\n        ;\n        };\n    ;\n        return v;\n    };\n;\n    function r(u) {\n        for (var v = 0; ((v < u.length)); v++) {\n            u[v] = q(u[v]);\n        ;\n        };\n    ;\n        return u.join(\"\");\n    };\n;\n    var s = function(u, v) {\n        return ((((u + v)) & 4294967295));\n    };\n    function t(u) {\n        if (((((null === u)) || ((undefined === u))))) {\n            return null;\n        }\n         else {\n            for (var v = 0; ((v < u.length)); v++) {\n                if (((u[v] > \"\"))) {\n                    u = g(u);\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            return r(n(u));\n        }\n    ;\n    ;\n    };\n;\n    if (((t(\"hello\") != \"5d41402abc4b2a76b9719d911017c592\"))) {\n        s = function(u, v) {\n            var w = ((((u & 65535)) + ((v & 65535)))), x = ((((((u >> 16)) + ((v >> 16)))) + ((w >> 16))));\n            return ((((x << 16)) | ((w & 65535))));\n        };\n    }\n;\n;\n    e.exports = t;\n});\n__d(\"isRTL\", [], function(a, b, c, d, e, f) {\n    var g = ((\"A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u0300-\\u0590\\u0800-\\u1fff\" + \"\\u200e\\u2c00-\\ufb1c\\ufe00-\\ufe6f\\ufefd-\\uffff\")), h = \"\\u0591-\\u07ff\\u200f\\ufb1d-\\ufdff\\ufe70-\\ufefc\", i = new RegExp(((((((((\"^[^\" + g)) + \"]*[\")) + h)) + \"]\"))), j = new RegExp(((((\"[\" + g)) + \"]\")));\n    function k(l) {\n        var m = 0, n = 0;\n        l.split(/\\s+/, 20).forEach(function(o) {\n            if (/^https?:\\/\\//.test(o)) {\n                return;\n            }\n        ;\n        ;\n            if (i.test(o)) {\n                n++;\n                m++;\n            }\n             else if (j.test(o)) {\n                m++;\n            }\n            \n        ;\n        ;\n        });\n        return !!((m && ((((n / m)) > 13944))));\n    };\n;\n    e.exports = k;\n});\n__d(\"WaterfallIDGenerator\", [\"Env\",\"md5\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"md5\");\n    function i() {\n        var l = 2147483647;\n        return ((Math.JSBNG__random() * l));\n    };\n;\n    function j() {\n        return Math.floor(((JSBNG__Date.now() / 1000)));\n    };\n;\n    var k = {\n        generate: function() {\n            return h([g.user,j(),i(),].join(\":\"));\n        }\n    };\n    e.exports = k;\n});\n__d(\"FileForm\", [\"ArbiterMixin\",\"AsyncRequest\",\"AsyncResponse\",\"AsyncUploadRequest\",\"BehaviorsMixin\",\"DataStore\",\"DOMQuery\",\"Env\",\"JSBNG__Event\",\"Form\",\"JSONPTransport\",\"Parent\",\"URI\",\"copyProperties\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"AsyncRequest\"), i = b(\"AsyncResponse\"), j = b(\"AsyncUploadRequest\"), k = b(\"BehaviorsMixin\"), l = b(\"DataStore\"), m = b(\"DOMQuery\"), n = b(\"Env\"), o = b(\"JSBNG__Event\"), p = b(\"Form\"), q = b(\"JSONPTransport\"), r = b(\"Parent\"), s = b(\"URI\"), t = b(\"copyProperties\"), u = b(\"shield\");\n    function v(y) {\n        var z = {\n        }, aa = m.scry(y, \"input[type=\\\"file\\\"]\");\n        aa.forEach(function(ba) {\n            z[ba.JSBNG__name] = ba.files;\n        });\n        return z;\n    };\n;\n    function w(y) {\n        var z = m.scry(y, \"input[type=\\\"file\\\"]\");\n        z.forEach(function(aa) {\n            aa.files = null;\n        });\n    };\n;\n    function x(y, z, aa) {\n        if (((y.getAttribute(\"rel\") === \"async\"))) {\n            throw new Error(\"FileForm cannot be used with Primer forms.\");\n        }\n    ;\n    ;\n        if (((y.getAttribute(\"method\").toUpperCase() !== \"POST\"))) {\n            throw new Error(\"FileForm must be used with POST forms.\");\n        }\n    ;\n    ;\n        this._form = y;\n        this._previousEncoding = this._form.enctype;\n        this._form.enctype = this._form.encoding = \"multipart/form-data\";\n        ((z && this.enableBehaviors(z)));\n        this._options = ((aa || {\n        }));\n        this.setAllowCrossOrigin(this._options.allowCrossOrigin);\n        this.setUploadInParallel(this._options.uploadInParallel);\n        this._listener = o.listen(this._form, \"submit\", this._submit.bind(this));\n        l.set(this._form, \"FileForm\", this);\n    };\n;\n    t(x, {\n        EVENTS: [\"start\",\"submit\",\"initial\",\"progress\",\"success\",\"failure\",],\n        getInstance: function(y) {\n            return l.get(y, \"FileForm\");\n        }\n    });\n    t(x.prototype, g, k, {\n        getRoot: function() {\n            return this._form;\n        },\n        setAllowCrossOrigin: function(y) {\n            this._allowCrossOrigin = !!y;\n            return this;\n        },\n        setUploadInParallel: function(y) {\n            this._uploadInParallel = !!y;\n            return this;\n        },\n        _submit: function(JSBNG__event) {\n            if (((this.inform(\"submit\") === false))) {\n                JSBNG__event.prevent();\n                return;\n            }\n        ;\n        ;\n            var y = ((\"JSBNG__FormData\" in window));\n            if (y) {\n                if (((!s(this._form.action).isSameOrigin() && !this._allowCrossOrigin))) {\n                    y = false;\n                }\n            ;\n            }\n        ;\n        ;\n            return ((y ? this._sendViaXHR(JSBNG__event) : this._sendViaFrame(JSBNG__event)));\n        },\n        _sendViaFrame: function(JSBNG__event) {\n            var y = this._request = new h();\n            y.setStatusElement(this._getStatusElement());\n            y.addStatusIndicator();\n            y.setOption(\"useIframeTransport\", true);\n            var z = y.handleResponse.bind(y), aa = new q(\"div\", this._form.action, z), ba = aa.getTransportFrame(), ca = aa.getRequestURI().addQueryData({\n                __iframe: true,\n                __user: n.user\n            });\n            this._form.setAttribute(\"action\", ca.toString());\n            this._form.setAttribute(\"target\", ba.JSBNG__name);\n            y.setJSONPTransport(aa);\n            y.setURI(ca);\n            y.setHandler(this.success.bind(this, null));\n            y.setErrorHandler(this.failure.bind(this, null));\n            y.setInitialHandler(u(this.initial, this, null));\n        },\n        _sendViaXHR: function(JSBNG__event) {\n            var y;\n            if (((this._uploadInParallel && j.isSupported()))) {\n                y = new j().setData(p.serialize(this._form)).setFiles(v(this._form));\n                var z = [y.subscribe(\"progress\", function(aa, ba) {\n                    this.progress(ba, ba.getProgressEvent());\n                }.bind(this)),y.subscribe(\"initial\", function(aa, ba) {\n                    this.initial(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"success\", function(aa, ba) {\n                    this.success(ba, ba.getResponse());\n                }.bind(this)),y.subscribe(\"start\", function(aa, ba) {\n                    this.inform(\"start\", {\n                        upload: ba\n                    });\n                }.bind(this)),y.subscribe(\"failure\", function(aa, ba) {\n                    this.failure(ba, ba.getResponse());\n                    return false;\n                }.bind(this)),y.subscribe(\"complete\", function() {\n                    while (z.length) {\n                        z.pop().unsubscribe();\n                    ;\n                    };\n                ;\n                }),];\n            }\n             else y = new h().setRawData(p.createFormData(this._form)).setHandler(this.success.bind(this, null)).setErrorHandler(this.failure.bind(this, null)).setUploadProgressHandler(this.progress.bind(this, null)).setInitialHandler(u(this.initial, this, null));\n        ;\n        ;\n            y.setAllowCrossOrigin(this._allowCrossOrigin).setRelativeTo(this._form).setStatusElement(this._getStatusElement()).setURI(this._form.action).send();\n            this._request = y;\n            JSBNG__event.prevent();\n        },\n        initial: function(y) {\n            return this.inform(\"initial\", {\n                upload: y\n            });\n        },\n        success: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if (((this.inform(\"success\", aa) !== false))) {\n                o.fire(this._form, \"success\", aa);\n            }\n        ;\n        ;\n            this._cleanup();\n        },\n        failure: function(y, z) {\n            var aa = {\n                response: z,\n                upload: y\n            };\n            if (((this.inform(\"failure\", aa) !== false))) {\n                if (((o.fire(this._form, \"error\", aa) !== false))) {\n                    i.defaultErrorHandler(z);\n                }\n            ;\n            }\n        ;\n        ;\n            this._cleanup();\n        },\n        progress: function(y, JSBNG__event) {\n            this.inform(\"progress\", {\n                JSBNG__event: JSBNG__event,\n                upload: y\n            });\n        },\n        abort: function() {\n            if (this._request) {\n                this._request.abort();\n                this._cleanup();\n            }\n        ;\n        ;\n        },\n        clear: function() {\n            w(this._form);\n        },\n        destroy: function() {\n            this._cleanup();\n            this._listener.remove();\n            this._listener = null;\n            this._form.enctype = this._form.encoding = this._previousEncoding;\n            l.remove(this._form, \"FileForm\");\n        },\n        _cleanup: function() {\n            this._request = null;\n        },\n        _getStatusElement: function() {\n            return ((r.byClass(this._form, \"stat_elem\") || this._form));\n        }\n    });\n    e.exports = x;\n});\n__d(\"FileFormResetOnSubmit\", [\"DOMQuery\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOMQuery\"), h = b(\"copyProperties\");\n    function i(j) {\n        this._form = j;\n    };\n;\n    h(i.prototype, {\n        enable: function() {\n            this._subscription = this._form.subscribe(\"submit\", Function.prototype.defer.bind(this._reset.bind(this)));\n        },\n        disable: function() {\n            this._subscription.unsubscribe();\n            this._subscription = null;\n        },\n        _reset: function() {\n            var j = g.scry(this._form.getRoot(), \"input[type=\\\"file\\\"]\");\n            j.forEach(function(k) {\n                k.value = \"\";\n            });\n        }\n    });\n    e.exports = i;\n});\n__d(\"submitForm\", [\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = function(i) {\n        var j = g.scry(i, \"input[type=\\\"submit\\\"]\")[0];\n        if (j) {\n            j.click();\n        }\n         else {\n            j = g.create(\"input\", {\n                type: \"submit\",\n                className: \"hidden_elem\"\n            });\n            g.appendContent(i, j);\n            j.click();\n            g.remove(j);\n        }\n    ;\n    ;\n    };\n    e.exports = h;\n});\n__d(\"FormSubmitOnChange\", [\"JSBNG__Event\",\"copyProperties\",\"submitForm\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"copyProperties\"), i = b(\"submitForm\");\n    function j(k) {\n        this._form = k;\n    };\n;\n    h(j.prototype, {\n        _listener: null,\n        enable: function() {\n            this._listener = g.listen(this._form.getRoot(), \"change\", this._submit.bind(this));\n        },\n        disable: function() {\n            this._listener.remove();\n            this._listener = null;\n        },\n        _submit: function() {\n            i(this._form.getRoot());\n        }\n    });\n    e.exports = j;\n});\n__d(\"MercuryFileUploader\", [\"ArbiterMixin\",\"JSBNG__CSS\",\"Dialog\",\"DOM\",\"JSBNG__Event\",\"FileForm\",\"FileFormResetOnSubmit\",\"FileInput\",\"FormSubmitOnChange\",\"MercuryAttachment\",\"MercuryAttachmentTemplates\",\"MercuryConstants\",\"SubscriptionsHandler\",\"copyProperties\",\"csx\",\"getObjectValues\",\"shield\",\"startsWith\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"JSBNG__CSS\"), i = b(\"Dialog\"), j = b(\"DOM\"), k = b(\"JSBNG__Event\"), l = b(\"FileForm\"), m = b(\"FileFormResetOnSubmit\"), n = b(\"FileInput\"), o = b(\"FormSubmitOnChange\"), p = b(\"MercuryAttachment\"), q = b(\"MercuryAttachmentTemplates\"), r = b(\"MercuryConstants\"), s = b(\"SubscriptionsHandler\"), t = b(\"copyProperties\"), u = b(\"csx\"), v = b(\"getObjectValues\"), w = b(\"shield\"), x = b(\"startsWith\"), y = b(\"tx\"), z = 0;\n    function aa(ca, da, ea, fa) {\n        this._parentElem = ca;\n        this._attachments = {\n        };\n        this._imageIDs = {\n        };\n        this._uploading = {\n        };\n        this._uploadTemplates = {\n        };\n        this._uploadStartTimes = {\n        };\n        this._subscriptionsHandler = new s();\n        this._fileForm = new l(da, [o,m,]);\n        this._fileForm.setAllowCrossOrigin(true);\n        this._fileForm.setUploadInParallel(true);\n        var ga = j.JSBNG__find(da, \".-cx-PRIVATE-mercuryFileUploader__root\"), ha = j.JSBNG__find(ga, \".-cx-PRIVATE-mercuryFileUploader__button\");\n        new n(ga, ha, ea);\n        h.hide(this._parentElem);\n        this._subscriptionsHandler.addSubscriptions(this._fileForm.subscribe(\"submit\", function() {\n            var ia = ((\"upload_\" + z++));\n            fa.value = ia;\n            var ja = {\n                count: 0,\n                file_sizes: []\n            };\n            if (ea.files) {\n                for (var ka = 0; ((ka < ea.files.length)); ka++) {\n                    if (((ea.files[ka].size > r.AttachmentMaxSize))) {\n                        this._fileForm.abort();\n                        this._fileForm.clear();\n                        new i().setTitle(\"The file you have selected is too large\").setBody(\"The file you have selected is too large. The maximum size is 25MB.\").setButtons(i.OK).setSemiModal(true).show();\n                        return false;\n                    }\n                ;\n                ;\n                };\n            ;\n                for (var la = 0; ((la < ea.files.length)); la++) {\n                    this._addFileUploadRow(ia, ea.files[la].JSBNG__name);\n                    ja.count++;\n                    ja.file_sizes.push(ea.files[la].size);\n                };\n            ;\n            }\n             else {\n                this._addFileUploadRow(ia, ea.value);\n                ja.count = 1;\n            }\n        ;\n        ;\n            this.inform(\"submit\", ja);\n        }.bind(this)), this._fileForm.subscribe(\"success\", this._onFileUploadSuccess.bind(this)), this._fileForm.subscribe(\"failure\", this._onFileUploadFailure.bind(this)), k.listen(ha, \"click\", w(this.inform, this, \"open\")));\n    };\n;\n    t(aa.prototype, g, {\n        isUploading: function() {\n            return !!Object.keys(this._uploading).length;\n        },\n        getAttachments: function() {\n            return v(this._attachments);\n        },\n        getImageIDs: function() {\n            return v(this._imageIDs);\n        },\n        removeAttachments: function() {\n            v(this._uploadTemplates).forEach(function(ca) {\n                if (ca) {\n                    j.remove(ca.getRoot());\n                }\n            ;\n            ;\n            });\n            this._attachments = {\n            };\n            this._imageIDs = {\n            };\n            this._uploadTemplates = {\n            };\n            this._uploading = {\n            };\n            this._uploadStartTimes = {\n            };\n            h.hide(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        destroy: function() {\n            this._subscriptionsHandler.release();\n            this._fileForm.destroy();\n            this.removeAttachments();\n        },\n        _addFileUploadRow: function(ca, da) {\n            var ea = q[\":fb:mercury:upload-file-row\"].build(), fa = ba(da), ga = ((((ca + \"/\")) + fa));\n            this._uploadTemplates[ga] = ea;\n            this._uploading[ga] = true;\n            this._uploadStartTimes[ga] = JSBNG__Date.now();\n            j.appendContent(ea.getNode(\"iconText\"), fa);\n            k.listen(ea.getNode(\"closeFileUpload\"), \"click\", this._removeFileUploader.bind(this, ga));\n            j.appendContent(this._parentElem, ea.getRoot());\n            h.show(this._parentElem);\n            this.inform(\"dom-updated\");\n        },\n        _removeFileUploader: function(ca, JSBNG__event) {\n            if (this._uploading[ca]) {\n                this.inform(\"upload-canceled-during-upload\");\n            }\n             else if (((this._attachments[ca] || this._imageIDs[ca]))) {\n                this.inform(\"upload-canceled-after-uploaded\");\n            }\n            \n        ;\n        ;\n            delete this._attachments[ca];\n            delete this._imageIDs[ca];\n            delete this._uploading[ca];\n            delete this._uploadStartTimes[ca];\n            var da = this._uploadTemplates[ca];\n            delete this._uploadTemplates[ca];\n            if (da) {\n                j.remove(da.getRoot());\n                this.inform(\"dom-updated\");\n            }\n        ;\n        ;\n            this.inform(\"upload-canceled\");\n            return false;\n        },\n        _updateFileUploader: function(ca, da) {\n            var ea = this._uploadTemplates[ca], fa = p.getAttachIconClassByMime(da);\n            h.addClass(ea.getNode(\"iconText\"), fa);\n            h.addClass(ea.getRoot(), \"done\");\n        },\n        _onFileUploadSuccess: function(JSBNG__event, ca) {\n            var da = ca.response.getPayload(), ea = da.uploadID, fa = da.metadata;\n            for (var ga = 0; ((ga < fa.length)); ga++) {\n                var ha = ((((ea + \"/\")) + fa[ga].filename));\n                if (this._uploading[ha]) {\n                    delete this._uploading[ha];\n                    if (fa[ga].image_id) {\n                        this._imageIDs[ha] = fa[ga].image_id;\n                    }\n                     else this._attachments[ha] = fa[ga];\n                ;\n                ;\n                    this._updateFileUploader(ha, fa[ga].filetype);\n                    this.inform(\"one-upload-completed\", {\n                        upload_time_ms: ((JSBNG__Date.now() - this._uploadStartTimes[ha]))\n                    });\n                }\n            ;\n            ;\n            };\n        ;\n            if (!this.isUploading()) {\n                this.inform(\"all-uploads-completed\", {\n                    count: this.getAttachments().length\n                });\n            }\n        ;\n        ;\n        },\n        _onFileUploadFailure: function(JSBNG__event, ca) {\n            this.inform(\"one-upload-failed\");\n        }\n    });\n    function ba(ca) {\n        if (((ca && x(ca, \"C:\\\\fakepath\\\\\")))) {\n            return ca.substring(12);\n        }\n    ;\n    ;\n        return ca;\n    };\n;\n    e.exports = aa;\n});\n__d(\"JoinableConversationMessageFilter\", [\"MercuryLogMessageType\",\"MercuryThreads\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryLogMessageType\"), h = b(\"MercuryThreads\").get(), i = b(\"MercuryParticipants\"), j = {\n        _isFilterable: function(k) {\n            var l = k.log_message_type;\n            if (!l) {\n                return false;\n            }\n        ;\n        ;\n            if (((l == g.JOINABLE_JOINED))) {\n                return ((k.log_message_data.joined_participant !== i.user));\n            }\n        ;\n        ;\n            if (((((l == g.UNSUBSCRIBE)) || ((l == g.SUBSCRIBE))))) {\n                var m = h.getThreadMetaNow(k.thread_id);\n                if (((m && m.is_joinable))) {\n                    return ((k.author !== i.user));\n                }\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n            return false;\n        },\n        filterMessages: function(k, l, m) {\n            var n = [];\n            for (var o = 0; ((o < l.length)); o++) {\n                var p = l[o];\n                if (j._isFilterable(p)) {\n                    if (m) {\n                        k(p);\n                    }\n                ;\n                ;\n                }\n                 else n.push(p);\n            ;\n            ;\n            };\n        ;\n            return n;\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryThreadMuter\", [\"AsyncDialog\",\"AsyncRequest\",\"Env\",\"MercuryThreads\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Env\"), j = b(\"MercuryThreads\").get(), k = {\n        getUserIDEmail: function() {\n            return ((i.user + \"@facebook.com\"));\n        },\n        getThreadMuteSettingForUser: function(l) {\n            return ((l.mute_settings && l.mute_settings[k.getUserIDEmail()]));\n        },\n        isThreadMuted: function(l) {\n            return ((k.getThreadMuteSettingForUser(l) !== undefined));\n        },\n        showMuteChangeDialog: function(l, m) {\n            g.send(new h(\"/ajax/mercury/mute_thread_dialog.php\").setData({\n                muting: l\n            }), function(n) {\n                n.subscribe(\"JSBNG__confirm\", function() {\n                    this.hide();\n                    j.updateThreadMuteSetting(m, l);\n                }.bind(n));\n            });\n        }\n    };\n    e.exports = k;\n});\n__d(\"JoinStatusTabSheet\", [\"copyProperties\",\"DOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"DOM\"), i = b(\"MercuryLogMessageType\"), j = b(\"MercuryParticipants\");\n    function k(l, m) {\n        this._rootElement = l;\n        this._messageQueue = [];\n        this._sheetView = m;\n    };\n;\n    g(k.prototype, {\n        _setMessage: function(l, m) {\n            var n = l.author, o = l.log_message_type;\n            if (((o == i.JOINABLE_JOINED))) {\n                var p = l.log_message_data.joined_participant;\n                if (((p !== j.user))) {\n                    j.get(p, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} joined the chat.\", {\n                            actor: s.JSBNG__name\n                        }));\n                    });\n                }\n            ;\n            ;\n            }\n             else if (((o == i.UNSUBSCRIBE))) {\n                if (((n !== j.user))) {\n                    j.get(n, function(s) {\n                        h.setContent(m, h.tx._(\"{actor} left the conversation.\", {\n                            actor: s.JSBNG__name\n                        }));\n                    });\n                }\n            ;\n            ;\n            }\n             else if (((o == i.SUBSCRIBE))) {\n                if (((n !== j.user))) {\n                    var q = l.log_message_data.added_participants;\n                    if (((q && ((q.length > 0))))) {\n                        var r = [n,q[0],];\n                        j.getMulti(r, function(s) {\n                            h.setContent(m, h.tx._(\"{actor} added {subscriber1}.\", {\n                                actor: s[n].JSBNG__name,\n                                subscriber1: s[q[0]].JSBNG__name\n                            }));\n                        });\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n            \n            \n        ;\n        ;\n        },\n        isPermanent: function() {\n            return false;\n        },\n        getCloseTimeout: function() {\n            return 3000;\n        },\n        getType: function() {\n            return \"join_status_type\";\n        },\n        addToQueue: function(l) {\n            this._messageQueue.push(l);\n            if (((this._messageQueue.length === 1))) {\n                this._open();\n            }\n        ;\n        ;\n        },\n        render: function() {\n            var l = this._messageQueue[0], m = this._getTemplate().build();\n            this._setMessage(l, m.getNode(\"text\"));\n            h.setContent(this._rootElement, m.getRoot());\n        },\n        _open: function() {\n            this._sheetView.open(this);\n        },\n        autoCloseCallback: function() {\n            this._messageQueue.shift();\n            if (((this._messageQueue.length > 0))) {\n                this._open();\n            }\n        ;\n        ;\n        },\n        couldNotReplace: function() {\n            this._open.bind(this).defer(this.getCloseTimeout(), false);\n        }\n    });\n    e.exports = k;\n});\n__d(\"WebMessengerEvents\", [\"Arbiter\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"copyProperties\"), i = h(new g(), {\n        MASTER_DOM_CHANGED: \"master-dom-changed\",\n        DETAIL_DOM_CHANGED: \"detail-dom-changed\",\n        FOCUS_COMPOSER: \"focus-composer\",\n        FOCUS_SEARCH: \"focus-search\",\n        FOCUS_AND_SELECT_SEARCH: \"focus-and-select-search\",\n        SUBMIT_REPLY: \"submit-reply\",\n        UPDATE_SELECTION: \"update-selection\",\n        masterDOMChanged: function() {\n            this.inform(i.MASTER_DOM_CHANGED);\n        },\n        detailDOMChanged: function() {\n            this.inform(i.DETAIL_DOM_CHANGED);\n        },\n        focusComposer: function() {\n            this.inform(i.FOCUS_COMPOSER);\n        },\n        focusSearch: function() {\n            this.inform(i.FOCUS_SEARCH);\n        },\n        focusAndSelectSearch: function() {\n            this.inform(i.FOCUS_AND_SELECT_SEARCH);\n        },\n        updateSelection: function(j) {\n            this.inform(i.UPDATE_SELECTION, j);\n        },\n        submitReply: function() {\n            this.inform(i.SUBMIT_REPLY);\n        }\n    });\n    e.exports = i;\n});\n__d(\"WebMessengerSubscriptionsHandler\", [\"SubscriptionsHandler\",], function(a, b, c, d, e, f) {\n    var g = b(\"SubscriptionsHandler\"), h = new g(\"webmessenger\");\n    e.exports = h;\n});\n__d(\"isWebMessengerURI\", [], function(a, b, c, d, e, f) {\n    function g(h) {\n        return (/^(\\/messages)/).test(h.getPath());\n    };\n;\n    e.exports = g;\n});\n__d(\"WebMessengerWidthControl\", [\"Arbiter\",\"JSBNG__CSS\",\"CSSClassTransition\",\"DOMDimensions\",\"JSBNG__Event\",\"Style\",\"URI\",\"ViewportBounds\",\"WebMessengerEvents\",\"shield\",\"WebMessengerSubscriptionsHandler\",\"$\",\"cx\",\"isWebMessengerURI\",\"JSBNG__requestAnimationFrame\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__CSS\"), i = b(\"CSSClassTransition\"), j = b(\"DOMDimensions\"), k = b(\"JSBNG__Event\"), l = b(\"Style\"), m = b(\"URI\"), n = b(\"ViewportBounds\"), o = b(\"WebMessengerEvents\"), p = b(\"shield\"), q = b(\"WebMessengerSubscriptionsHandler\"), r = b(\"$\"), s = b(\"cx\"), t = b(\"isWebMessengerURI\"), u = b(\"JSBNG__requestAnimationFrame\"), v = b(\"throttle\"), w = 205, x = 981, y = 257, z = 18, aa = 848, ba = 724, ca = 28942, da = 56, ea, fa, ga;\n    function ha(ma, na, oa) {\n        this.masterChanged = ma;\n        this.detailChaned = na;\n        q.addSubscriptions(k.listen(window, \"resize\", v(p(ia, this, this), 100)), g.subscribe([\"sidebar/initialized\",\"sidebar/show\",\"sidebar/hide\",], p(ia, this, this), g.SUBSCRIBE_NEW));\n        var pa = ((la() ? da : 0));\n        if (oa) {\n            pa = w;\n        }\n    ;\n    ;\n        this._width = ((la() ? 0 : aa));\n        ga = true;\n        ia(this, pa);\n    };\n;\n    function ia(ma, na) {\n        var oa = ((n.getRight() + n.getLeft()));\n        oa = ((((oa || na)) || 0));\n        var pa = ((j.getViewportWithoutScrollbarDimensions().width - oa)), qa = Math.round(Math.max(0, ((((pa / 2)) - ((x / 2))))));\n        pa = ((((x + qa)) - y));\n        pa -= z;\n        pa = Math.max(ba, Math.min(aa, pa));\n        if (((!isNaN(pa) && ((ma._width !== pa))))) {\n            ma._width = pa;\n            var ra = Math.round(((pa / ((1 + ca))))), sa = ((pa - ra));\n            ma.masterChanged(sa);\n            ma.detailChaned(ra);\n            if (la()) {\n                var ta = ((pa + y));\n                ja(function() {\n                    if (fa) {\n                        JSBNG__document.body.className = fa;\n                        fa = \"\";\n                    }\n                ;\n                ;\n                    ka(((ta + \"px\")));\n                    h.removeClass(JSBNG__document.body, \"-cx-PRIVATE-fbWMWidthControl__firstload\");\n                    ((ga && o.detailDOMChanged()));\n                    ga = false;\n                }, fa);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function ja(ma, na) {\n        ((na && h.addClass(JSBNG__document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\")));\n        u(ma);\n        ((na && h.removeClass.curry(JSBNG__document.documentElement, \"-cx-PRIVATE-fbWMWidthControl__animate\").defer(1000, false)));\n    };\n;\n    function ka(ma) {\n        l.set(r(\"pageHead\"), \"width\", ma);\n        l.set(r(\"globalContainer\"), \"width\", ma);\n    };\n;\n    function la() {\n        if (!ea) {\n            ea = h.hasClass(JSBNG__document.body, \"-cx-PUBLIC-hasLitestand__body\");\n        }\n    ;\n    ;\n        return ea;\n    };\n;\n    i.registerHandler(function(ma, na, oa, pa) {\n        function qa(ra) {\n            return ((la() && t(m(ra))));\n        };\n    ;\n        if (qa(pa)) {\n            fa = na;\n            return true;\n        }\n         else if (qa(oa)) {\n            ja(function() {\n                ma.className = na;\n                ka(\"\");\n            }, true);\n            return true;\n        }\n        \n    ;\n    ;\n    });\n    e.exports = ha;\n});\n__d(\"TextInputControl\", [\"JSBNG__Event\",\"function-extensions\",\"Class\",\"DOMControl\",\"Input\",\"copyProperties\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"Class\"), i = b(\"DOMControl\"), j = b(\"Input\"), k = b(\"copyProperties\"), l = b(\"debounce\");\n    function m(n) {\n        this.parent.construct(this, n);\n        var o = this.getRoot(), p = l(this.update.bind(this), 0);\n        g.listen(o, {\n            input: p,\n            keydown: p,\n            paste: p\n        });\n    };\n;\n    h.extend(m, i);\n    k(m.prototype, {\n        setMaxLength: function(n) {\n            j.setMaxLength(this.getRoot(), n);\n            return this;\n        },\n        getValue: function() {\n            return j.getValue(this.getRoot());\n        },\n        isEmpty: function() {\n            return j.isEmpty(this.getRoot());\n        },\n        setValue: function(n) {\n            j.setValue(this.getRoot(), n);\n            this.update();\n            return this;\n        },\n        clear: function() {\n            return this.setValue(\"\");\n        },\n        setPlaceholderText: function(n) {\n            j.setPlaceholder(this.getRoot(), n);\n            return this;\n        }\n    });\n    e.exports = m;\n});\n__d(\"JSBNG__TextMetrics\", [\"JSBNG__Event\",\"DOM\",\"Style\",\"UserAgent\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"Style\"), j = b(\"UserAgent\"), k = b(\"debounce\"), l;\n    function m() {\n        if (((typeof l === \"undefined\"))) {\n            var p = h.create(\"div\", {\n                className: \"webkitZoomTest\"\n            }), q = function() {\n                h.appendContent(JSBNG__document.body, p);\n                l = ((100 / p.clientHeight));\n                h.remove(p);\n            };\n            g.listen(window, \"resize\", k(q, 100));\n            q();\n        }\n    ;\n    ;\n        return l;\n    };\n;\n    function n(p) {\n        var q = p.clientWidth, r = ((i.get(p, \"-moz-box-sizing\") == \"border-box\"));\n        if (r) {\n            return q;\n        }\n    ;\n    ;\n        var s = ((i.getFloat(p, \"paddingLeft\") + i.getFloat(p, \"paddingRight\")));\n        return ((q - s));\n    };\n;\n    function o(p, q) {\n        this._node = p;\n        this._flexible = !!q;\n        var r = \"textarea\", s = \"textMetrics\";\n        if (this._flexible) {\n            r = \"div\";\n            s += \" textMetricsInline\";\n        }\n    ;\n    ;\n        this._shadow = h.create(r, {\n            className: s\n        });\n        var t = [\"fontSize\",\"fontStyle\",\"fontWeight\",\"fontFamily\",\"wordWrap\",];\n        t.forEach(function(v) {\n            i.set(this._shadow, v, i.get(p, v));\n        }.bind(this));\n        var u = i.get(p, \"lineHeight\");\n        if (((j.chrome() || j.webkit()))) {\n            u = ((Math.round(((parseInt(u, 10) * m()))) + \"px\"));\n        }\n    ;\n    ;\n        i.set(this._shadow, \"lineHeight\", u);\n        JSBNG__document.body.appendChild(this._shadow);\n    };\n;\n    o.prototype.measure = function(p) {\n        var q = this._node, r = this._shadow;\n        p = ((((p || q.value)) + \"...\"));\n        if (!this._flexible) {\n            var s = n(q);\n            i.set(r, \"width\", ((Math.max(s, 0) + \"px\")));\n        }\n    ;\n    ;\n        h.setContent(r, p);\n        return {\n            width: r.scrollWidth,\n            height: r.scrollHeight\n        };\n    };\n    o.prototype.destroy = function() {\n        h.remove(this._shadow);\n    };\n    e.exports = o;\n});\n__d(\"TextAreaControl\", [\"JSBNG__Event\",\"Arbiter\",\"ArbiterMixin\",\"Class\",\"JSBNG__CSS\",\"DOMControl\",\"Style\",\"TextInputControl\",\"JSBNG__TextMetrics\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"Class\"), k = b(\"JSBNG__CSS\"), l = b(\"DOMControl\"), m = b(\"Style\"), n = b(\"TextInputControl\"), o = b(\"JSBNG__TextMetrics\"), p = b(\"copyProperties\");\n    function q(s, t) {\n        return ((m.getFloat(s, t) || 0));\n    };\n;\n    function r(s) {\n        this.autogrow = k.hasClass(s, \"uiTextareaAutogrow\");\n        this.parent.construct(this, s);\n        this.width = null;\n        g.listen(s, \"JSBNG__focus\", this._handleFocus.bind(this));\n    };\n;\n    j.extend(r, n);\n    p(r.prototype, i, {\n        setAutogrow: function(s) {\n            this.autogrow = s;\n            return this;\n        },\n        onupdate: function() {\n            this.parent.onupdate();\n            if (this.autogrow) {\n                var s = this.getRoot();\n                if (!this.metrics) {\n                    this.metrics = new o(s);\n                }\n            ;\n            ;\n                if (((typeof this.initialHeight === \"undefined\"))) {\n                    this.isBorderBox = ((((((m.get(s, \"box-sizing\") === \"border-box\")) || ((m.get(s, \"-moz-box-sizing\") === \"border-box\")))) || ((m.get(s, \"-webkit-box-sizing\") === \"border-box\"))));\n                    this.borderBoxOffset = ((((((q(s, \"padding-top\") + q(s, \"padding-bottom\"))) + q(s, \"border-top-width\"))) + q(s, \"border-bottom-width\")));\n                    this.initialHeight = ((s.offsetHeight - this.borderBoxOffset));\n                }\n            ;\n            ;\n                var t = this.metrics.measure(), u = Math.max(this.initialHeight, t.height);\n                if (this.isBorderBox) {\n                    u += this.borderBoxOffset;\n                }\n            ;\n            ;\n                if (((u !== this.height))) {\n                    this.height = u;\n                    m.set(s, \"height\", ((u + \"px\")));\n                    h.inform(\"reflow\");\n                    this.inform(\"resize\");\n                }\n            ;\n            ;\n            }\n             else if (this.metrics) {\n                this.metrics.destroy();\n                this.metrics = null;\n            }\n            \n        ;\n        ;\n        },\n        resetHeight: function() {\n            this.height = -1;\n            this.update();\n        },\n        _handleFocus: function() {\n            this.width = null;\n        }\n    });\n    r.getInstance = function(s) {\n        return ((l.getInstance(s) || new r(s)));\n    };\n    e.exports = r;\n});\n__d(\"MessagesEmoticonView\", [\"DOM\",\"EmoticonsList\",\"JSBNG__Event\",\"Focus\",\"InputSelection\",\"Keys\",\"Parent\",\"SubscriptionsHandler\",\"TextAreaControl\",\"Toggler\",\"copyProperties\",\"endsWith\",\"startsWith\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"EmoticonsList\"), i = b(\"JSBNG__Event\"), j = b(\"Focus\"), k = b(\"InputSelection\"), l = b(\"Keys\"), m = b(\"Parent\"), n = b(\"SubscriptionsHandler\"), o = b(\"TextAreaControl\"), p = b(\"Toggler\"), q = b(\"copyProperties\"), r = b(\"endsWith\"), s = b(\"startsWith\"), t = h.symbols;\n    function u(w, x, y) {\n        var z = m.byClass(w, \"emoticon\");\n        if (!z) {\n            return;\n        }\n    ;\n    ;\n        var aa = \"emoticon_\", ba = null;\n        z.className.split(\" \").forEach(function(ia) {\n            if (s(ia, aa)) {\n                ba = ia.substring(aa.length);\n            }\n        ;\n        ;\n        });\n        if (!t[ba]) {\n            return;\n        }\n    ;\n    ;\n        var ca = o.getInstance(x), da = ca.getValue(), ea = t[ba], fa = da.substring(0, y.start), ga = da.substring(y.end);\n        if (((((y.start > 0)) && !r(fa, \" \")))) {\n            ea = ((\" \" + ea));\n        }\n    ;\n    ;\n        if (!s(ga, \" \")) {\n            ea += \" \";\n        }\n    ;\n    ;\n        var ha = ((((fa + ea)) + ga));\n        y.start += ea.length;\n        y.end = y.start;\n        ca.setValue(ha);\n        k.set(x, y.start, y.end);\n        return true;\n    };\n;\n    function v(w, x) {\n        var y = {\n            start: 0,\n            end: 0\n        };\n        function z() {\n            y = k.get(x);\n        };\n    ;\n        var aa = g.JSBNG__find(w, \".uiToggleFlyout\");\n        this._subscriptions = new n();\n        this._subscriptions.addSubscriptions(p.subscribe(\"show\", function(ba, ca) {\n            if (((ca.active && g.contains(w, ca.active)))) {\n                k.set(x, y.start, y.end);\n                var da = g.scry(aa, \"a.emoticon\")[0];\n                j.setWithoutOutline(da);\n            }\n        ;\n        ;\n        }), i.listen(aa, \"click\", function(JSBNG__event) {\n            var ba = u(JSBNG__event.getTarget(), x, y);\n            ((ba && p.hide(w)));\n        }), i.listen(aa, \"keyup\", function(JSBNG__event) {\n            if (((JSBNG__event.keyCode === l.ESC))) {\n                p.hide(w);\n                k.set(x, y.start, y.end);\n            }\n        ;\n        ;\n        }), i.listen(x, \"keyup\", z), i.listen(x, \"click\", z));\n    };\n;\n    q(v.prototype, {\n        destroy: function() {\n            this._subscriptions.release();\n            this._subscriptions = null;\n        }\n    });\n    q(v, {\n        create: function(w, x) {\n            return new v(w, x);\n        }\n    });\n    e.exports = v;\n});\n__d(\"MercuryTypingReceiver\", [\"Arbiter\",\"ChannelConstants\",\"MercuryActionTypeConstants\",\"MercuryParticipants\",\"MercuryPayloadSource\",\"MercuryServerRequests\",\"MercuryThreads\",\"TypingDetector\",\"setTimeoutAcrossTransitions\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryParticipants\"), k = b(\"MercuryPayloadSource\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"TypingDetector\"), o = b(\"setTimeoutAcrossTransitions\"), p, q = {\n    }, r = 30000, s = new g();\n    function t(y) {\n        var z = ((q[y] || {\n        })), aa = Object.keys(z);\n        aa.sort(function(ba, ca) {\n            return ((z[ba] - z[ca]));\n        });\n        return aa;\n    };\n;\n    function u() {\n        p = null;\n        var y = JSBNG__Date.now(), z = {\n        }, aa = false;\n        {\n            var fin307keys = ((window.top.JSBNG_Replay.forInKeys)((q))), fin307i = (0);\n            var ba;\n            for (; (fin307i < fin307keys.length); (fin307i++)) {\n                ((ba) = (fin307keys[fin307i]));\n                {\n                    var ca = false;\n                    {\n                        var fin308keys = ((window.top.JSBNG_Replay.forInKeys)(((q[ba] || {\n                        })))), fin308i = (0);\n                        var da;\n                        for (; (fin308i < fin308keys.length); (fin308i++)) {\n                            ((da) = (fin308keys[fin308i]));\n                            {\n                                if (((q[ba][da] < ((y - r))))) {\n                                    delete q[ba][da];\n                                    ca = true;\n                                }\n                                 else aa = true;\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    if (ca) {\n                        z[ba] = t(ba);\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        {\n            var fin309keys = ((window.top.JSBNG_Replay.forInKeys)((z))), fin309i = (0);\n            var ea;\n            for (; (fin309i < fin309keys.length); (fin309i++)) {\n                ((ea) = (fin309keys[fin309i]));\n                {\n                    s.inform(\"state-changed\", z);\n                    break;\n                };\n            };\n        };\n    ;\n        if (aa) {\n            p = o(u, 3000);\n        }\n    ;\n    ;\n    };\n;\n    function v(y, z) {\n        if (((y in q))) {\n            if (((z in q[y]))) {\n                delete q[y][z];\n                w(y);\n            }\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function w(y) {\n        var z = {\n        };\n        z[y] = t(y);\n        s.inform(\"state-changed\", z);\n    };\n;\n    function x(y) {\n        if (y.thread) {\n            return l.getClientThreadIDNow(y.thread);\n        }\n    ;\n    ;\n        if (((y.type === \"typ\"))) {\n            return m.getThreadIdForUser(y.from);\n        }\n    ;\n    ;\n        return null;\n    };\n;\n    g.subscribe([h.getArbiterType(\"typ\"),h.getArbiterType(\"ttyp\"),], function(y, z) {\n        var aa = z.obj, ba = x(aa);\n        if (ba) {\n            var ca = j.getIDForUser(aa.from);\n            if (((aa.st == n.TYPING))) {\n                q[ba] = ((q[ba] || {\n                }));\n                var da = q[ba][ca];\n                q[ba][ca] = JSBNG__Date.now();\n                if (!p) {\n                    p = o(u, 3000);\n                }\n            ;\n            ;\n                ((!da && w(ba)));\n            }\n             else if (((aa.st == n.INACTIVE))) {\n                v(ba, ca);\n            }\n            \n        ;\n        ;\n        }\n    ;\n    ;\n    });\n    l.subscribe(\"update-typing-state\", function(y, z) {\n        var aa = z.payload_source;\n        if (((aa != k.CLIENT_CHANNEL_MESSAGE))) {\n            return;\n        }\n    ;\n    ;\n        var ba = z.actions;\n        if (((!ba || !ba.length))) {\n            return;\n        }\n    ;\n    ;\n        var ca = i.USER_GENERATED_MESSAGE;\n        ba.forEach(function(da) {\n            if (((((da.action_type == ca)) && ((da.author != j.user))))) {\n                v(da.thread_id, da.author);\n            }\n        ;\n        ;\n        });\n    });\n    e.exports = s;\n});\n__d(\"formatUnixTimestamp\", [\"formatDate\",], function(a, b, c, d, e, f) {\n    var g = b(\"formatDate\");\n    function h(i, j, k, l) {\n        var m = new JSBNG__Date(((i * 1000)));\n        return g(m, j, k, l);\n    };\n;\n    e.exports = h;\n});\n__d(\"MercuryIndicatorController\", [\"ArbiterMixin\",\"DOM\",\"MercuryActionTypeConstants\",\"MercuryConfig\",\"MercuryDelayedRoger\",\"MercuryMessageSourceTags\",\"MercuryParticipants\",\"MercuryRoger\",\"MercuryThreads\",\"MercuryTypingReceiver\",\"DateFormatConfig\",\"arrayContains\",\"copyProperties\",\"formatUnixTimestamp\",\"removeFromArray\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DOM\"), i = b(\"MercuryActionTypeConstants\"), j = b(\"MercuryConfig\"), k = b(\"MercuryDelayedRoger\"), l = b(\"MercuryMessageSourceTags\"), m = b(\"MercuryParticipants\"), n = b(\"MercuryRoger\"), o = b(\"MercuryThreads\").get(), p = b(\"MercuryTypingReceiver\"), q = b(\"DateFormatConfig\"), r = b(\"arrayContains\"), s = b(\"copyProperties\"), t = b(\"formatUnixTimestamp\"), u = b(\"removeFromArray\"), v = b(\"tx\"), w = [];\n    function x(y) {\n        this._threadID = y;\n        this._canonicalUser = o.getCanonicalUserInThread(y);\n        w.push(this);\n    };\n;\n    s(x.prototype, g, {\n        destroy: function() {\n            u(w, this);\n        },\n        setLastMessage: function(y) {\n            this._lastMsg = y;\n            this._handleStateChange();\n        },\n        _informStateChanged: function(y) {\n            if (((((y.activity == \"none\")) && ((this._currentActivity == \"none\"))))) {\n                return;\n            }\n        ;\n        ;\n            if (((this._lastMsg && m.isAuthor(this._lastMsg.author)))) {\n                y.self_authored = true;\n            }\n        ;\n        ;\n            this._currentActivity = y.activity;\n            this.inform(\"state-changed\", y);\n        },\n        _notifySentFrom: function() {\n            var y, z, aa = this._lastMsg.location_text, ba = ((this._lastMsg.source_tags || []));\n            if (aa) {\n                y = v._(\"Sent from {location}\", {\n                    JSBNG__location: aa\n                });\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MESSENGER)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile/messenger\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Messenger\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.MOBILE)) {\n                y = h.create(\"a\", {\n                    href: \"/mobile\",\n                    class: \"fcg\",\n                    target: \"_blank\"\n                }, \"Sent from Mobile\");\n                z = \"sentFromMobile\";\n            }\n             else if (r(ba, l.EMAIL)) {\n                y = \"Sent from email\";\n                z = \"sentFromEmail\";\n            }\n             else {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n            \n            \n            \n        ;\n        ;\n            this._informStateChanged({\n                activity: z,\n                text: y\n            });\n        },\n        _notifySeenTimestamp: function(y) {\n            var z = ((n.getSeenTimestamp(this._threadID, y[0]) * 39458)), aa = ((JSBNG__Date.now() * 39477));\n            if (((z < ((aa - 518400))))) {\n                ba = \"M j\";\n            }\n             else if (((z < ((aa - 86400))))) {\n                ba = \"D g:ia\";\n            }\n             else ba = \"g:ia\";\n            \n        ;\n        ;\n            var ba = ((q.formats[ba] || ba)), ca = t(z, ba, false, true);\n            this._informStateChanged({\n                activity: \"seen-timestamp\",\n                text: v._(\"Seen {timestamp}\", {\n                    timestamp: ca\n                })\n            });\n        },\n        _checkNamesForCollision: function(y, z) {\n            var aa = false;\n            m.getMulti(y, function(ba) {\n                function ca(fa) {\n                    if (((typeof ba[fa] !== \"undefined\"))) {\n                        return ba[fa].short_name.toLowerCase();\n                    }\n                     else return fa\n                ;\n                };\n            ;\n                var da = z.map(ca), ea = y.map(ca);\n                aa = da.some(function(fa) {\n                    return ((ea.indexOf(fa) !== ea.lastIndexOf(fa)));\n                });\n            });\n            return aa;\n        },\n        _notifySeenBy: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if (((this._lastMsg != z))) {\n                    return;\n                }\n            ;\n            ;\n                var ca = o.getThreadMetaNow(this._threadID), da = ((ca ? ca.participants.length : 0)), ea = ((y.length + ((z.author != m.user)))), fa, ga = false, ha = false, ia = ((((da > 2)) && ((ea >= ((da - 1))))));\n                if (((!(ia) && ((da > 0))))) {\n                    ha = this._checkNamesForCollision(ca.participants, y);\n                }\n            ;\n            ;\n                if (ia) {\n                    fa = \"Seen by everyone\";\n                }\n                 else if (((y.length == 1))) {\n                    fa = v._(\"Seen by {user}\", {\n                        user: ba[y[0]].short_name\n                    });\n                }\n                 else if (((y.length == 2))) {\n                    fa = v._(\"Seen by {user1}, {user2}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name\n                    });\n                }\n                 else if (((y.length == 3))) {\n                    fa = v._(\"Seen by {user1}, {user2}, {user3}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        user3: ba[y[2]].short_name\n                    });\n                }\n                 else if (((y.length > 3))) {\n                    var ja = ((Object.keys(ba).length - 2)), ka = v._(\"{num} more\", {\n                        num: ja\n                    }), la = h.create(\"span\", {\n                        className: \"more\"\n                    }, ka);\n                    fa = h.tx._(\"Seen by {user1}, {user2}, {=num more link}\", {\n                        user1: ba[y[0]].short_name,\n                        user2: ba[y[1]].short_name,\n                        \"=num more link\": la\n                    });\n                    ga = true;\n                }\n                \n                \n                \n                \n            ;\n            ;\n                ga = ((ga || ha));\n                this._informStateChanged({\n                    activity: \"seen-by\",\n                    text: fa,\n                    seenBy: y,\n                    hasNameCollision: ha,\n                    tooltip: ga\n                });\n            }.bind(this));\n            ((aa && this._informStateChanged({\n                activity: \"none\"\n            })));\n        },\n        _notifyTyping: function(y) {\n            var z = this._lastMsg, aa = true;\n            m.getMulti(y, function(ba) {\n                aa = false;\n                if (((this._lastMsg != z))) {\n                    return;\n                }\n            ;\n            ;\n                if (((this._canonicalUser || j.ChatMultiTypGK))) {\n                    var ca = o.getThreadMetaNow(this._threadID), da = ((ca ? ca.participants.length : 0)), ea, fa = false;\n                    if (((((da > 2)) && ((y.length >= ((da - 1))))))) {\n                        ea = \"Everyone is typing...\";\n                    }\n                     else if (((y.length == 1))) {\n                        ea = v._(\"{name} is typing...\", {\n                            JSBNG__name: ba[y[0]].short_name\n                        });\n                    }\n                     else if (((y.length == 2))) {\n                        ea = v._(\"{user1} and {user2} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name\n                        });\n                    }\n                     else if (((y.length == 3))) {\n                        ea = v._(\"{user1}, {user2}, and {user3} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            user3: ba[y[2]].short_name\n                        });\n                    }\n                     else if (((y.length > 3))) {\n                        var ga = ((Object.keys(ba).length - 2)), ha = v._(\"{num} more\", {\n                            num: ga\n                        }), ia = h.create(\"a\", {\n                            href: \"#\"\n                        }, ha);\n                        ea = h.tx._(\"{user1}, {user2}, and {=num more link} are typing...\", {\n                            user1: ba[y[0]].short_name,\n                            user2: ba[y[1]].short_name,\n                            \"=num more link\": ia\n                        });\n                        fa = true;\n                    }\n                    \n                    \n                    \n                    \n                ;\n                ;\n                    this._informStateChanged({\n                        activity: \"typing\",\n                        text: ea,\n                        typing: y,\n                        tooltip: fa\n                    });\n                }\n            ;\n            ;\n            }.bind(this));\n            ((aa && this._informStateChanged({\n                activity: \"none\"\n            })));\n        },\n        _handleStateChange: function() {\n            var y = i.LOG_MESSAGE;\n            if (((!this._lastMsg || ((this._lastMsg.action_type == y))))) {\n                this._informStateChanged({\n                    activity: \"none\"\n                });\n                return;\n            }\n        ;\n        ;\n            if (((this._typing && this._typing.length))) {\n                this._notifyTyping(this._typing);\n                return;\n            }\n        ;\n        ;\n            if (((this._canonicalUser && ((this._lastMsg.author != m.user))))) {\n                this._notifySentFrom();\n                return;\n            }\n        ;\n        ;\n            var z = k.getSeenBy(this._threadID, true);\n            if (z.length) {\n                if (this._canonicalUser) {\n                    this._notifySeenTimestamp(z);\n                    return;\n                }\n                 else {\n                    this._notifySeenBy(z);\n                    return;\n                }\n            ;\n            }\n        ;\n        ;\n            this._informStateChanged({\n                activity: \"none\"\n            });\n        }\n    });\n    p.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            var ba = z[aa._threadID];\n            if (((ba !== undefined))) {\n                aa._typing = ba;\n                aa._handleStateChange();\n            }\n        ;\n        ;\n        });\n    });\n    k.subscribe(\"state-changed\", function(y, z) {\n        w.forEach(function(aa) {\n            ((z[aa._threadID] && aa._handleStateChange()));\n        });\n    });\n    e.exports = x;\n});\n__d(\"MercuryLastMessageIndicator\", [\"JSBNG__CSS\",\"MercuryIndicatorController\",\"DOM\",\"MercuryParticipants\",\"Tooltip\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"MercuryIndicatorController\"), i = b(\"DOM\"), j = b(\"MercuryParticipants\"), k = b(\"Tooltip\"), l = b(\"copyProperties\"), m = b(\"csx\"), n = b(\"cx\");\n    function o(p, q, r, s) {\n        this._lastMessageIndicator = q;\n        this._hideTyping = ((r || false));\n        this._messagesView = s;\n        this._controller = new h(p);\n        this._subscription = this._controller.subscribe(\"state-changed\", this._handleStateChanged.bind(this));\n    };\n;\n    l(o.prototype, {\n        destroy: function() {\n            this._setClass(null);\n            this._subscription.unsubscribe();\n            this._controller.destroy();\n        },\n        setLastMessage: function(p) {\n            this._controller.setLastMessage(p);\n        },\n        _handleStateChanged: function(p, q) {\n            var r = this._messagesView.isScrolledToBottom();\n            this._rerender(q);\n            ((r && this._messagesView.scrollToBottom()));\n        },\n        _rerender: function(p) {\n            if (((p.activity == \"none\"))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n        ;\n            if (((this._hideTyping && ((p.activity == \"typing\"))))) {\n                this._setClass(null);\n                return;\n            }\n        ;\n        ;\n            g.conditionClass(this._lastMessageIndicator, \"-cx-PRIVATE-mercuryLastMessageIndicator__selfauthored\", p.self_authored);\n            var q = i.JSBNG__find(this._lastMessageIndicator, \".-cx-PRIVATE-mercuryLastMessageIndicator__text\");\n            if (p.text) {\n                i.setContent(q, p.text);\n            }\n             else i.empty(q);\n        ;\n        ;\n            if (((p.activity.substring(0, 4) == \"seen\"))) {\n                this._setClass(\"seen\");\n                if (((((p.activity == \"seen-by\")) && p.tooltip))) {\n                    j.getMulti(p.seenBy, function(r) {\n                        var s = i.create(\"div\");\n                        {\n                            var fin310keys = ((window.top.JSBNG_Replay.forInKeys)((r))), fin310i = (0);\n                            var t;\n                            for (; (fin310i < fin310keys.length); (fin310i++)) {\n                                ((t) = (fin310keys[fin310i]));\n                                {\n                                    var u = i.create(\"div\");\n                                    i.setContent(u, r[t].JSBNG__name);\n                                    i.appendContent(s, u);\n                                };\n                            };\n                        };\n                    ;\n                        var v = p.hasNameCollision, w;\n                        if (v) {\n                            w = this._lastMessageIndicator;\n                        }\n                         else w = i.JSBNG__find(this._lastMessageIndicator, \"span.more\");\n                    ;\n                    ;\n                        k.set(w, s, \"above\", \"center\");\n                    }.bind(this));\n                }\n                 else k.remove(this._lastMessageIndicator);\n            ;\n            ;\n            }\n             else this._setClass(p.activity);\n        ;\n        ;\n        },\n        _setClass: function(p) {\n            if (((this._lastClass === p))) {\n                return;\n            }\n        ;\n        ;\n            ((this._lastClass && g.removeClass(this._lastMessageIndicator, this._lastClass)));\n            ((p && g.addClass(this._lastMessageIndicator, p)));\n            this._lastClass = p;\n        }\n    });\n    e.exports = o;\n});\n__d(\"MercuryStateCheck\", [\"Arbiter\",\"ChannelConstants\",\"MercuryFolders\",\"MessagingTag\",\"MercuryServerRequests\",\"URI\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"MercuryFolders\"), j = b(\"MessagingTag\"), k = b(\"MercuryServerRequests\").get(), l = b(\"URI\"), m = b(\"copyProperties\"), n = m(new g(), {\n        initialize: function() {\n            g.subscribe(h.ON_INVALID_HISTORY, o);\n            d([\"ChannelConnection\",], function(p) {\n                p.subscribe(p.CONNECTED, function(q, r) {\n                    if (!r.init) {\n                        o();\n                    }\n                ;\n                ;\n                });\n            });\n        }\n    });\n    function o() {\n        var p;\n        if (((l.getRequestURI().getPath().search(/messages/) !== -1))) {\n            p = i.getSupportedFolders();\n        }\n         else p = [j.INBOX,];\n    ;\n    ;\n        k.fetchMissedMessages(p);\n    };\n;\n    n.initialize();\n    e.exports = n;\n});\n__d(\"MercuryAttachmentRenderer\", [\"MercuryAttachmentTemplates\",\"MercuryAttachmentAudioClip.react\",\"JSBNG__CSS\",\"MercuryConstants\",\"DOM\",\"JSBNG__Image.react\",\"JSXDOM\",\"MercuryAttachment\",\"MercuryAttachmentType\",\"MercuryMessages\",\"MercuryParticipants\",\"React\",\"Style\",\"URI\",\"UserAgent\",\"cx\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentTemplates\"), h = b(\"MercuryAttachmentAudioClip.react\"), i = b(\"JSBNG__CSS\"), j = b(\"MercuryConstants\"), k = b(\"DOM\"), l = b(\"JSBNG__Image.react\"), m = b(\"JSXDOM\"), n = b(\"MercuryAttachment\"), o = b(\"MercuryAttachmentType\"), p = b(\"MercuryMessages\").get(), q = b(\"MercuryParticipants\"), r = b(\"React\"), s = b(\"Style\"), t = b(\"URI\"), u = b(\"UserAgent\"), v = b(\"cx\"), w = b(\"tx\"), x = ((u.ie() <= 8));\n    function y(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.JSBNG__name), ea = da.getNode(\"link\");\n        ea.setAttribute(\"href\", ba.url);\n        ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n;\n    function z(ba, ca) {\n        var da = g[ca].build().setNodeContent(\"filename\", ba.JSBNG__name);\n        i.addClass(da.getRoot(), n.getAttachIconClass(ba.icon_type));\n        return da;\n    };\n;\n    var aa = {\n        renderAttachment: function(ba, ca, da, ea, fa) {\n            var ga = 100, ha = ((ba ? 160 : 400)), ia = ca.attach_type, ja = null, ka = null, la = true, ma = j.MercurySupportedShareType;\n            if (((ia == o.ERROR))) {\n                ja = aa.renderError(ca);\n            }\n        ;\n        ;\n            if (((((!ba && ((ia == o.SHARE)))) && ca.share_xhp))) {\n                ka = aa.renderShareXHP(ca, da.id);\n            }\n        ;\n        ;\n            if (((ia == o.STICKER))) {\n                la = false;\n                ka = aa.renderSticker(ca);\n            }\n        ;\n        ;\n            if (((!ka && ((ia == o.SHARE))))) {\n                var na = ca.share_data_type;\n                switch (na) {\n                  case ma.FB_PHOTO:\n                    ka = aa.renderPreview(ca, da, ea, fa);\n                    break;\n                  case ma.FB_VIDEO:\n                    ka = aa.renderVideoThumb(ca);\n                    break;\n                  case ma.FB_MUSIC_ALBUM:\n                \n                  case ma.FB_SONG:\n                \n                  case ma.FB_PLAYLIST:\n                \n                  case ma.FB_MUSICIAN:\n                \n                  case ma.FB_RADIO_STATION:\n                    ka = aa.renderMusic(ca);\n                    break;\n                  case ma.EXTERNAL:\n                \n                  case ma.FB_TEMPLATE:\n                \n                  case ma.FB_COUPON:\n                \n                  case ma.FB_SOCIAL_REPORT_PHOTO:\n                    ka = aa.renderExternalLink(ca);\n                    break;\n                  default:\n                    if (ca.JSBNG__name) {\n                        ka = aa.renderShareLink(ca, ((da && da.id)), ba);\n                    }\n                ;\n                ;\n                    break;\n                };\n            ;\n            }\n        ;\n        ;\n            if (((!ka && ca.preview_loading))) {\n                ka = aa.renderPreview(null);\n            }\n        ;\n        ;\n            if (((!ka && ca.preview_url))) {\n                ka = aa.renderPreview(ca, da, ea, fa);\n            }\n        ;\n        ;\n            if (((!ka && ((ia == o.FILE))))) {\n                if (((ca.metadata && ((ca.metadata.type == j.MercuryAttachmentAudioClip))))) {\n                    ka = k.create(\"div\");\n                    var oa = aa.renderAudioClip(ca, da.message_id, ga, ha);\n                    r.renderComponent(oa, ka);\n                }\n                 else ka = ((ba ? aa.renderFileLink(ca) : aa.renderExtendedFileLink(ca)));\n            ;\n            }\n        ;\n        ;\n            return {\n                error: ja,\n                JSBNG__content: ka,\n                bubblePreferred: la\n            };\n        },\n        renderError: function(ba) {\n            var ca = g[\":fb:mercury:attachment:error\"].build();\n            k.appendContent(ca.getNode(\"error\"), ba.error_msg);\n            return ca.getRoot();\n        },\n        renderExternalLink: function(ba) {\n            var ca = g[\":fb:mercury:attachment:external-link\"].build().setNodeContent(\"JSBNG__name\", ba.JSBNG__name);\n            ((ba.base_url && ca.setNodeContent(\"shortLink\", ba.base_url)));\n            var da = ca.getNode(\"preview\"), ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n            if (ba.preview_url) {\n                var fa = ca.getNode(\"preview-image\");\n                fa.setAttribute(\"src\", ba.preview_url);\n                i.addClass(da, ba.preview_class);\n                i.show(fa);\n            }\n             else {\n                i.addClass(ca.getRoot(), \"noMedia\");\n                i.hide(da);\n            }\n        ;\n        ;\n            ca.getNode(\"JSBNG__name\").setAttribute(\"href\", ba.url);\n            d([\"LinkshimHandler\",], function(ga) {\n                ga.setUpLinkshimHandling(ca.getNode(\"JSBNG__name\"));\n                ga.setUpLinkshimHandling(ca.getNode(\"image-link\"));\n            });\n            if (ba.rel) {\n                ca.getNode(\"JSBNG__name\").setAttribute(\"rel\", ba.rel);\n            }\n        ;\n        ;\n            return ca.getRoot();\n        },\n        renderFileLink: function(ba) {\n            var ca = null;\n            if (((ba.url === \"\"))) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n             else {\n                ca = \":fb:mercury:attachment:file-link\";\n                return y(ba, ca).getRoot();\n            }\n        ;\n        ;\n        },\n        renderAudioClip: function(ba, ca, da, ea) {\n            var fa = ((ba.metadata.duration / 1000)), ga = 200;\n            if (((da && ea))) {\n                if (((fa < 5))) {\n                    ga = da;\n                }\n                 else ga = ((((((1 - Math.pow(10, ((((fa - 5)) / -30))))) * ((ea - da)))) + da));\n            ;\n            }\n        ;\n        ;\n            return h({\n                src: ba.url,\n                duration: ((ba.metadata.duration / 1000)),\n                JSBNG__showHelp: false,\n                width: ga\n            });\n        },\n        renderExtendedFileLink: function(ba) {\n            var ca = null;\n            if (((ba.url === \"\"))) {\n                ca = \":fb:mercury:attachment:file-name\";\n                return z(ba, ca).getRoot();\n            }\n        ;\n        ;\n            var ca = \":fb:mercury:attachment:extended-file-link\", da = y(ba, ca);\n            if (ba.open_url) {\n                var ea = da.getNode(\"openLinkContainer\");\n                i.show(ea);\n                var fa = da.getNode(\"openFile\");\n                fa.setAttribute(\"href\", ba.open_url);\n            }\n        ;\n        ;\n            var ga = da.getNode(\"downloadFile\");\n            ga.setAttribute(\"href\", ba.url);\n            ((ba.rel && ga.setAttribute(\"rel\", ba.rel)));\n            return da.getRoot();\n        },\n        renderMusic: function(ba) {\n            var ca = g[\":fb:mercury:attachment:music\"].build().setNodeContent(\"filename\", ba.JSBNG__name), da = ca.getNode(\"link\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"target\", \"_blank\");\n            ((ba.rel && da.setAttribute(\"rel\", ba.rel)));\n            var ea = ca.getNode(\"image-link\");\n            ea.setAttribute(\"href\", ba.url);\n            ((ba.rel && ea.setAttribute(\"rel\", ba.rel)));\n            var fa = ca.getNode(\"preview-image\");\n            fa.setAttribute(\"src\", ba.preview_url);\n            i.show(fa);\n            i.addClass(ca.getNode(\"icon_link\"), \"MercuryMusicIcon\");\n            return ca.getRoot();\n        },\n        resizeContain: function(ba, ca) {\n            var da = ((ba.width / ba.height)), ea = ((ca.width / ca.height));\n            if (((ea < da))) {\n                return {\n                    width: Math.min(((ba.height * ea)), ca.width),\n                    height: Math.min(ba.height, ca.height)\n                };\n            }\n             else return {\n                width: Math.min(ba.width, ca.width),\n                height: Math.min(((ba.width / ea)), ca.height)\n            }\n        ;\n        },\n        renderPreview: function(ba, ca, da, ea) {\n            var fa = g[\":fb:mercury:attachment:preview\"].build(), ga = fa.getNode(\"image-link\");\n            if (ba) {\n                ((ba.url && ga.setAttribute(\"href\", ba.url)));\n                ((ba.rel && ga.setAttribute(\"rel\", ba.rel)));\n                var ha;\n                if (ba.preview_uploading) {\n                    i.addClass(ga, \"-cx-PRIVATE-mercuryImages__uploading\");\n                    if (((da >= 176))) {\n                        ha = \"/images/photos/dots_large.png\";\n                    }\n                     else if (((da >= 86))) {\n                        ha = \"/images/photos/dots_medium.png\";\n                    }\n                     else ha = \"/images/photos/dots_small.png\";\n                    \n                ;\n                ;\n                    s.set(ga, \"width\", ((da + \"px\")));\n                    s.set(ga, \"max-width\", ((da + \"px\")));\n                    if (((ba.preview_width && ba.preview_height))) {\n                        s.set(ga, \"padding-bottom\", ((((((ba.preview_height / ba.preview_width)) * 100)) + \"%\")));\n                    }\n                ;\n                ;\n                }\n                 else if (((ba.metadata && ba.metadata.fbid))) {\n                    ha = t(\"/ajax/mercury/attachments/photo.php\").addQueryData({\n                        fbid: ba.metadata.fbid,\n                        mode: ea,\n                        width: da,\n                        height: da\n                    }).toString();\n                }\n                 else ha = t(ba.preview_url).addQueryData({\n                    mode: ea,\n                    width: da,\n                    height: da\n                }).toString();\n                \n            ;\n            ;\n                var ia = fa.getNode(\"preview-image\");\n                if (ha) {\n                    if (((((((ea === \"contain\")) && ba.preview_width)) && ba.preview_height))) {\n                        var ja = aa.resizeContain({\n                            width: da,\n                            height: da\n                        }, {\n                            width: ba.preview_width,\n                            height: ba.preview_height\n                        });\n                        ia.setAttribute(\"width\", ja.width);\n                        ia.setAttribute(\"height\", ja.height);\n                    }\n                ;\n                ;\n                    if (((ba.preview_uploading || ((((ea === \"cover\")) && !x))))) {\n                        i.addClass(ga, \"-cx-PRIVATE-mercuryImages__usebackgroundimage\");\n                        s.set(ga, \"backgroundImage\", ((((\"url(\" + ha)) + \")\")));\n                    }\n                     else {\n                        ia.JSBNG__onload = function() {\n                            ia.removeAttribute(\"width\");\n                            ia.removeAttribute(\"height\");\n                        };\n                        ia.setAttribute(\"src\", ha);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (ca) {\n                    this.renderReportRespondLink(fa.getRoot(), ba, ca.message_id);\n                }\n            ;\n            ;\n            }\n             else i.addClass(ga, \"-cx-PUBLIC-mercuryImages__loading\");\n        ;\n        ;\n            return fa.getRoot();\n        },\n        renderShareLink: function(ba, ca, da) {\n            var ea = g[\":fb:mercury:attachment:share-link\"].build().setNodeContent(\"JSBNG__name\", ba.JSBNG__name), fa = ea.getNode(\"link\");\n            fa.setAttribute(\"href\", ba.url);\n            ((ba.rel && fa.setAttribute(\"rel\", ba.rel)));\n            return ea.getRoot();\n        },\n        renderVideoThumb: function(ba) {\n            var ca = g[\":fb:mercury:attachment:video-thumb\"].build(), da = ca.getNode(\"thumb\");\n            da.setAttribute(\"href\", ba.url);\n            da.setAttribute(\"rel\", ba.rel);\n            var ea = k.JSBNG__find(ca.getRoot(), \"img\");\n            ea.src = ba.preview_url;\n            return ca.getRoot();\n        },\n        renderShareXHP: function(ba, ca) {\n            var da = k.create(\"div\");\n            if (ba) {\n                k.appendContent(da, ba.share_xhp);\n                this.renderReportRespondLink(da, ba, ca);\n            }\n        ;\n        ;\n            return da;\n        },\n        renderSticker: function(ba) {\n            var ca = k.create(\"div\"), da = {\n                uri: ba.url,\n                width: ba.metadata.width,\n                height: ba.metadata.height\n            }, ea = l({\n                className: \"mvs\",\n                src: da\n            });\n            r.renderComponent(ea, ca);\n            return ca;\n        },\n        renderReportRespondLink: function(ba, ca, da) {\n            if (!ca.is_social_report_attachment) {\n                return null;\n            }\n        ;\n        ;\n            switch (ca.share_data_type) {\n              case j.MercurySupportedShareType.FB_PHOTO:\n                break;\n              case j.MercurySupportedShareType.FB_SOCIAL_REPORT_PHOTO:\n                return null;\n              default:\n                return null;\n            };\n        ;\n            var ea = null;\n            if (da) {\n                ea = p.getMessagesFromIDs([da,])[0];\n            }\n        ;\n        ;\n            if (!ea) {\n                return null;\n            }\n        ;\n        ;\n            if (((ea.author === q.user))) {\n                return null;\n            }\n        ;\n        ;\n            var fa = null;\n            q.get(ea.author, function(ga) {\n                fa = k.create(\"a\", {\n                    rel: \"dialog-post\",\n                    className: \"-cx-PRIVATE-fbChatMessage__socialreportlink\",\n                    id: \"respond-link\",\n                    ajaxify: t(\"/ajax/report/social_resolution/photo/\").setQueryData({\n                        attachment_fbid: ca.attach_id,\n                        photo_fbid: ca.shared_object_id,\n                        sender_id: q.getUserID(ga.id)\n                    }).toString()\n                });\n                k.setContent(fa, w._(\"Respond to {name}'s request\", {\n                    JSBNG__name: ga.JSBNG__name\n                }));\n                k.appendContent(ba, fa);\n            });\n        },\n        renderPhotoAttachments: function(ba, ca, da, ea) {\n            var fa = ba.length;\n            if (!fa) {\n                return null;\n            }\n        ;\n        ;\n            var ga = m.div({\n                className: \"-cx-PRIVATE-mercuryImages__photoattachment\"\n            }), ha = (m.div({\n                className: \"-cx-PUBLIC-fbChatMessage__resetpadding\"\n            }, ga));\n            if (((fa === 1))) {\n                var ia = aa.renderPreview(ba[0], ca, da, \"contain\");\n                k.appendContent(ga, ia);\n                return ha;\n            }\n        ;\n        ;\n            var ja = ((((((fa == 2)) || ((fa == 4)))) ? 2 : 3)), ka = ((((da - ((((ja - 1)) * ea)))) / ja)), la = Math.ceil(((fa / ja))), ma = ((((la * ka)) + ((((la - 1)) * ea)))), na = (m.div({\n                className: \"-cx-PRIVATE-mercuryImages__grid\",\n                style: ((((\"padding-bottom: \" + ((((ma / da)) * 100)))) + \"%;\"))\n            }));\n            k.appendContent(ga, na);\n            for (var oa = 0; ((oa < fa)); ++oa) {\n                var pa = aa.renderPreview(ba[oa], ca, ka, \"cover\"), qa = ((oa % ja)), ra = Math.floor(((oa / ja)));\n                i.addClass(pa, \"-cx-PRIVATE-mercuryImages__griditem\");\n                s.apply(pa, {\n                    width: ((((((ka / da)) * 100)) + \"%\")),\n                    left: ((((((((qa * ((ka + ea)))) / da)) * 100)) + \"%\")),\n                    JSBNG__top: ((((((((ra * ((ka + ea)))) / ma)) * 100)) + \"%\"))\n                });\n                k.appendContent(na, pa);\n            };\n        ;\n            return ha;\n        },\n        isPhotoAttachment: function(ba) {\n            return ((((ba.attach_type == o.PHOTO)) || ((((ba.attach_type == o.FILE)) && ba.preview_url))));\n        },\n        isShareAttachment: function(ba) {\n            return ((ba.attach_type == o.SHARE));\n        },\n        isFileAttachment: function(ba) {\n            return ((ba.attach_type == o.FILE));\n        },\n        isErrorAttachment: function(ba) {\n            return ((ba.attach_type == o.ERROR));\n        },\n        booleanLexicographicComparator: function(ba) {\n            return function(ca, da) {\n                for (var ea = 0; ((ea < ba.length)); ++ea) {\n                    var fa = ba[ea](ca), ga = ba[ea](da);\n                    if (((fa && !ga))) {\n                        return -1;\n                    }\n                     else if (((!fa && ga))) {\n                        return 1;\n                    }\n                    \n                ;\n                ;\n                };\n            ;\n                return 0;\n            };\n        }\n    };\n    e.exports = aa;\n});\n__d(\"URLScraper\", [\"ArbiterMixin\",\"DataStore\",\"JSBNG__Event\",\"URLMatcher\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"DataStore\"), i = b(\"JSBNG__Event\"), j = b(\"URLMatcher\"), k = b(\"copyProperties\"), l = \"scraperLastPermissiveMatch\";\n    function m(n) {\n        this.input = n;\n        this.enable();\n    };\n;\n    k(m.prototype, g, {\n        reset: function() {\n            h.set(this.input, l, null);\n        },\n        enable: function() {\n            if (this.events) {\n                return;\n            }\n        ;\n        ;\n            var n = function(o) {\n                JSBNG__setTimeout(this.check.bind(this, o), 30);\n            };\n            this.events = i.listen(this.input, {\n                paste: n.bind(this, false),\n                keydown: n.bind(this, true)\n            });\n        },\n        disable: function() {\n            if (!this.events) {\n                return;\n            }\n        ;\n        ;\n            {\n                var fin311keys = ((window.top.JSBNG_Replay.forInKeys)((this.events))), fin311i = (0);\n                var JSBNG__event;\n                for (; (fin311i < fin311keys.length); (fin311i++)) {\n                    ((event) = (fin311keys[fin311i]));\n                    {\n                        this.events[JSBNG__event].remove();\n                    ;\n                    };\n                };\n            };\n        ;\n            this.events = null;\n        },\n        check: function(n) {\n            var o = this.input.value;\n            if (((n && m.trigger(o)))) {\n                return;\n            }\n        ;\n        ;\n            var p = m.match(o), q = j.permissiveMatch(o);\n            if (((q && ((q != h.get(this.input, l)))))) {\n                h.set(this.input, l, q);\n                this.inform(\"match\", {\n                    url: ((p || q)),\n                    alt_url: q\n                });\n            }\n        ;\n        ;\n        }\n    });\n    k(m, j);\n    e.exports = m;\n});\n__d(\"DOMHyperlink\", [\"Env\",\"JSXDOM\",\"TransformTextToDOMMixin\",\"UntrustedLink\",\"URI\",\"URLScraper\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Env\"), h = b(\"JSXDOM\"), i = b(\"TransformTextToDOMMixin\"), j = b(\"UntrustedLink\"), k = b(\"URI\"), l = b(\"URLScraper\"), m = b(\"copyProperties\"), n = b(\"cx\"), o = {\n        MAX_ITEMS: 40,\n        match: function(p, q) {\n            var r = l.match(p);\n            if (!r) {\n                return false;\n            }\n        ;\n        ;\n            var s = p.indexOf(r), t = ((s + r.length));\n            return {\n                startIndex: s,\n                endIndex: t,\n                element: this._element(r, q)\n            };\n        },\n        _element: function(p, q) {\n            var r = p, s = r.replace(/\"/g, \"%22\");\n            if (!(/^[a-z][a-z0-9\\-+.]+:\\/\\//i.test(p))) {\n                s = ((\"http://\" + s));\n            }\n        ;\n        ;\n            if (!k.isValidURI(s)) {\n                return r;\n            }\n        ;\n        ;\n            var t = h.a({\n                className: \"-cx-PUBLIC-fbHTMLHyperlink__link\",\n                href: s,\n                target: \"_blank\",\n                rel: \"nofollow\"\n            }, r);\n            if (((q && !k(s).isFacebookURI()))) {\n                t.JSBNG__onmousedown = function(u) {\n                    j.bootstrap(this, g.lhsh, u);\n                };\n            }\n        ;\n        ;\n            return t;\n        }\n    };\n    e.exports = m(o, i);\n});\n__d(\"MercuryMessageRenderer\", [\"MercuryAttachmentRenderer\",\"JSBNG__CSS\",\"DOM\",\"DOMEmoji\",\"DOMEmote\",\"DOMHyperlink\",\"DOMQuery\",\"FBIDEmote\",\"JSXDOM\",\"MercuryLogMessageType\",\"MercuryParticipants\",\"Tooltip\",\"cx\",\"transformTextToDOM\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAttachmentRenderer\"), h = b(\"JSBNG__CSS\"), i = b(\"DOM\"), j = b(\"DOMEmoji\"), k = b(\"DOMEmote\"), l = b(\"DOMHyperlink\"), m = b(\"DOMQuery\"), n = b(\"FBIDEmote\"), o = b(\"JSXDOM\"), p = b(\"MercuryLogMessageType\"), q = b(\"MercuryParticipants\"), r = b(\"Tooltip\"), s = b(\"cx\"), t = b(\"transformTextToDOM\"), u = b(\"tx\"), v = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",], w = {\n        renderDate: function(pa) {\n            var qa = new JSBNG__Date();\n            qa.setHours(0);\n            qa.setMinutes(0);\n            qa.setSeconds(0);\n            qa.setMilliseconds(0);\n            var ra = ((((((24 * 60)) * 60)) * 1000)), sa = ((qa.getTime() - pa.getTime()));\n            if (((sa <= 0))) {\n                return \"Today\";\n            }\n             else if (((sa < ra))) {\n                return \"Yesterday\";\n            }\n            \n        ;\n        ;\n            var ta = v[pa.getMonth()], ua = pa.getDate(), va = pa.getFullYear();\n            if (((va != qa.getFullYear()))) {\n                return u._(\"{month} {date}, {year}\", {\n                    month: ta,\n                    date: ua,\n                    year: va\n                });\n            }\n             else return u._(\"{month} {date}\", {\n                month: ta,\n                date: ua\n            })\n        ;\n        },\n        renderTooltipFlyout: function(pa, qa) {\n            qa.forEach(function(ra) {\n                var sa = i.create(\"div\");\n                i.setContent(sa, ra.JSBNG__name);\n                i.appendContent(pa, sa);\n            });\n        },\n        renderLogMessage: function(pa, qa, ra, sa) {\n            z(pa, sa);\n            aa(qa, sa);\n            ba(ra, sa);\n        },\n        formatMessageBody: function(pa, qa, ra) {\n            var sa = ((pa || \"\")).replace(/\\s+$/, \"\");\n            if (!qa) {\n                return y(sa, false, ra);\n            }\n        ;\n        ;\n            var ta = Object.keys(qa).map(function(wa) {\n                return window.parseInt(wa);\n            }).sort(function(wa, xa) {\n                return ((wa - xa));\n            }), ua = [], va = 0;\n            ta.forEach(function(wa) {\n                var xa = sa.slice(va, wa);\n                if (xa) {\n                    ua.push(y(xa, false, ra));\n                }\n            ;\n            ;\n                va = ((wa + qa[wa].length));\n                var ya = sa.slice(wa, va);\n                if (ya) {\n                    ua.push(y(ya, true, ra));\n                }\n            ;\n            ;\n            });\n            if (((va < sa.length))) {\n                ua.push(y(sa.slice(va), false, ra));\n            }\n        ;\n        ;\n            return ((((ua.length === 0)) ? null : ((((ua.length === 1)) ? ua[0] : i.create(\"span\", {\n            }, ua)))));\n        }\n    };\n    function x(pa, qa) {\n        var ra = pa.replace(/\\r\\n?/g, \"\\u000a\").split(/\\n{2,}/);\n        return ra.filter(function(sa) {\n            return sa.length;\n        }).map(function(sa) {\n            return o.p(null, qa(sa));\n        });\n    };\n;\n    function y(pa, qa, ra) {\n        if (((((pa.length === 0)) && !qa))) {\n            return null;\n        }\n    ;\n    ;\n        var sa = function(ta) {\n            return t(ta, [l.params(true),j,n,k,]);\n        };\n        return (o.span({\n            className: ((qa ? \"highlight\" : null))\n        }, ((ra ? x(pa, sa) : sa(pa)))));\n    };\n;\n    function z(pa, qa) {\n        var ra = \"\", sa;\n        switch (qa.log_message_type) {\n          case p.JOINABLE_CREATED:\n        \n          case p.JOINABLE_JOINED:\n        \n          case p.SUBSCRIBE:\n            ra = \"mercurySubscribeIcon\";\n            break;\n          case p.UNSUBSCRIBE:\n            ra = \"mercuryUnsubscribeIcon\";\n            break;\n          case p.THREAD_NAME:\n            ra = \"mercuryThreadNameIcon\";\n            break;\n          case p.THREAD_IMAGE:\n            ra = \"mercuryThreadImageIcon\";\n            break;\n          case p.VIDEO_CALL:\n            sa = qa.log_message_data.answered;\n            if (((sa || oa(qa)))) {\n                ra = \"mercuryVideoCallIcon\";\n            }\n             else ra = \"mercuryMissedVideoCallIcon\";\n        ;\n        ;\n            break;\n          case p.PHONE_CALL:\n            sa = qa.log_message_data.answered;\n            if (sa) {\n                ra = \"mercuryPhoneCallIcon\";\n            }\n             else ra = \"mercuryMissedPhoneCallIcon\";\n        ;\n        ;\n            break;\n          case p.SERVER_ERROR:\n            ra = \"mercuryErrorIcon\";\n            break;\n        };\n    ;\n        h.addClass(pa, ra);\n    };\n;\n    function aa(pa, qa) {\n        switch (qa.log_message_type) {\n          case p.JOINABLE_CREATED:\n            ga(pa, qa);\n            break;\n          case p.JOINABLE_JOINED:\n            ha(pa, qa);\n            break;\n          case p.SUBSCRIBE:\n            la(pa, qa);\n            break;\n          case p.UNSUBSCRIBE:\n            ma(pa, qa);\n            break;\n          case p.VIDEO_CALL:\n            if (oa(qa)) {\n                ca(pa, qa);\n            }\n             else ea(pa, qa);\n        ;\n        ;\n            break;\n          case p.PHONE_CALL:\n            da(pa, qa);\n            break;\n          case p.THREAD_NAME:\n            fa(pa, qa);\n            break;\n          case p.THREAD_IMAGE:\n            ia(pa, qa);\n            break;\n          case p.SERVER_ERROR:\n            na(pa, qa);\n            break;\n        };\n    ;\n    };\n;\n    function ba(pa, qa) {\n        var ra = qa.log_message_type;\n        if (((ra == p.THREAD_IMAGE))) {\n            var sa = qa.log_message_data.image;\n            if (sa) {\n                var ta = g.renderPreview(((sa.preview_url ? sa : null)));\n                i.setContent(pa, ta);\n                h.addClass(ta, \"-cx-PRIVATE-mercuryImages__logmessageattachment\");\n                h.show(pa);\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var ca = function(pa, qa) {\n        q.get(qa.author, function(ra) {\n            var sa = i.create(\"span\", {\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, ra.short_name), ta;\n            switch (qa.log_message_data.event_name) {\n              case \"installing\":\n                ta = i.tx._(\"{firstname} is setting up video calling...\", {\n                    firstname: sa\n                });\n                break;\n              case \"installed\":\n                ta = i.tx._(\"{firstname} finished setting up video calling.\", {\n                    firstname: sa\n                });\n                break;\n              case \"install_canceled\":\n                ta = i.tx._(\"You canceled the video calling installation. \", {\n                    firstname: sa\n                });\n                break;\n            };\n        ;\n            if (ta) {\n                i.setContent(pa, ta);\n            }\n        ;\n        ;\n        });\n    }, da = function(pa, qa) {\n        var ra = qa.log_message_data.caller, sa = qa.log_message_data.callee, ta = [ra,sa,];\n        q.getMulti(ta, function(ua) {\n            if (((ra == q.user))) {\n                var va = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[sa].short_name), wa;\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"You called {firstname}.\", {\n                        firstname: va\n                    });\n                }\n                 else wa = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: va\n                });\n            ;\n            ;\n            }\n             else {\n                var xa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[ra].short_name);\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"{firstname} called you.\", {\n                        firstname: xa\n                    });\n                }\n                 else wa = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: xa\n                });\n            ;\n            ;\n            }\n        ;\n        ;\n            i.setContent(pa, wa);\n        });\n    }, ea = function(pa, qa) {\n        var ra = qa.log_message_data.caller, sa = qa.log_message_data.callee, ta = [ra,sa,];\n        q.getMulti(ta, function(ua) {\n            if (((ra == q.user))) {\n                var va = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[sa].short_name), wa;\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"You called {firstname}.\", {\n                        firstname: va\n                    });\n                }\n                 else wa = i.tx._(\"{firstname} missed a call from you. \", {\n                    firstname: va\n                });\n            ;\n            ;\n            }\n             else {\n                var xa = i.create(\"span\", {\n                    className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n                }, ua[ra].short_name);\n                if (qa.log_message_data.answered) {\n                    wa = i.tx._(\"{firstname} called you.\", {\n                        firstname: xa\n                    });\n                }\n                 else wa = i.tx._(\"You missed a call from {firstname}. \", {\n                    firstname: xa\n                });\n            ;\n            ;\n            }\n        ;\n        ;\n            i.setContent(pa, wa);\n        });\n    }, fa = function(pa, qa) {\n        var ra = qa.log_message_data.JSBNG__name, sa = i.create(\"b\", {\n        }, ra);\n        if (((qa.author == q.user))) {\n            if (ra) {\n                i.setContent(pa, i.tx._(\"You named the conversation: {name}.\", {\n                    JSBNG__name: sa\n                }));\n            }\n             else i.setContent(pa, i.tx._(\"You removed the conversation name.\"));\n        ;\n        ;\n        }\n         else q.get(qa.author, function(ta) {\n            var ua, va = ja(ta);\n            if (ra) {\n                ua = i.tx._(\"{actor} named the conversation: {name}.\", {\n                    actor: va,\n                    JSBNG__name: sa\n                });\n            }\n             else ua = i.tx._(\"{actor} removed the conversation name.\", {\n                actor: va\n            });\n        ;\n        ;\n            i.setContent(pa, ua);\n        });\n    ;\n    ;\n    }, ga = function(pa, qa) {\n        if (((qa.author == q.user))) {\n            i.setContent(pa, i.tx._(\"Other people can join this chat from News Feed and add their friends.\"));\n        }\n         else q.get(qa.author, function(ra) {\n            var sa = ja(ra);\n            i.setContent(pa, i.tx._(\"{actor} shared this chat to News Feed. Other people can join and add their friends.\", {\n                actor: sa\n            }));\n        });\n    ;\n    ;\n    }, ha = function(pa, qa) {\n        var ra = qa.log_message_data.joined_participant;\n        if (((ra == q.user))) {\n            i.setContent(pa, i.tx._(\"You joined the chat. Other people can join from News Feed and add their friends.\"));\n        }\n         else q.get(ra, function(sa) {\n            var ta = ja(sa);\n            i.setContent(pa, i.tx._(\"{actor} joined the chat.\", {\n                actor: ta\n            }));\n        });\n    ;\n    ;\n    }, ia = function(pa, qa) {\n        if (((qa.author == q.user))) {\n            if (qa.log_message_data.image) {\n                i.setContent(pa, i.tx._(\"You changed the conversation picture.\"));\n            }\n             else i.setContent(pa, i.tx._(\"You removed the conversation picture.\"));\n        ;\n        ;\n        }\n         else q.get(qa.author, function(ra) {\n            var sa = ja(ra), ta;\n            if (qa.log_message_data.image) {\n                ta = i.tx._(\"{actor} changed the conversation picture.\", {\n                    actor: sa\n                });\n            }\n             else ta = i.tx._(\"{actor} removed the conversation picture.\", {\n                actor: sa\n            });\n        ;\n        ;\n            i.setContent(pa, ta);\n        });\n    ;\n    ;\n    }, ja = function(pa) {\n        if (pa.href) {\n            return i.create(\"a\", {\n                href: pa.href,\n                className: \"-cx-PRIVATE-fbChatEventMsg__participant\"\n            }, pa.JSBNG__name);\n        }\n    ;\n    ;\n        return pa.JSBNG__name;\n    }, ka = function(pa) {\n        var qa = pa.indexOf(q.user);\n        if (((qa > 0))) {\n            return pa.splice(qa, 1).concat(pa);\n        }\n    ;\n    ;\n        return pa;\n    }, la = function(pa, qa) {\n        var ra = ka(qa.log_message_data.added_participants), sa = null, ta;\n        if (((ra.length == 1))) {\n            sa = [qa.author,ra[0],];\n            q.getMulti(sa, function(ua) {\n                if (((qa.author == q.user))) {\n                    ta = i.tx._(\"You added {subscriber1}.\", {\n                        subscriber1: ja(ua[ra[0]])\n                    });\n                }\n                 else if (((ra[0] == q.user))) {\n                    ta = i.tx._(\"{actor} added you.\", {\n                        actor: ja(ua[qa.author])\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]])\n                });\n                \n            ;\n            ;\n                i.setContent(pa, ta);\n            });\n        }\n         else if (((ra.length == 2))) {\n            sa = [qa.author,].concat(ra);\n            q.getMulti(sa, function(ua) {\n                if (((qa.author == q.user))) {\n                    ta = i.tx._(\"You added {subscriber1} and {subscriber2}.\", {\n                        subscriber1: ja(ua[ra[0]]),\n                        subscriber2: ja(ua[ra[1]])\n                    });\n                }\n                 else if (((ra[0] == q.user))) {\n                    ta = i.tx._(\"{actor} added you and {subscriber2}.\", {\n                        actor: ja(ua[qa.author]),\n                        subscriber2: ja(ua[ra[1]])\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1} and {subscriber2}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]]),\n                    subscriber2: ja(ua[ra[1]])\n                });\n                \n            ;\n            ;\n                i.setContent(pa, ta);\n            });\n        }\n         else if (((ra.length == 3))) {\n            sa = [qa.author,].concat(ra);\n            q.getMulti(sa, function(ua) {\n                if (((qa.author == q.user))) {\n                    ta = i.tx._(\"You added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                        subscriber1: ja(ua[ra[0]]),\n                        subscriber2: ja(ua[ra[1]]),\n                        subscriber3: ja(ua[ra[2]])\n                    });\n                }\n                 else if (((ra[0] == q.user))) {\n                    ta = i.tx._(\"{actor} added you, {subscriber2} and {subscriber3}.\", {\n                        actor: ja(ua[qa.author]),\n                        subscriber2: ja(ua[ra[1]]),\n                        subscriber3: ja(ua[ra[2]])\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {subscriber3}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]]),\n                    subscriber2: ja(ua[ra[1]]),\n                    subscriber3: ja(ua[ra[2]])\n                });\n                \n            ;\n            ;\n                i.setContent(pa, ta);\n            });\n        }\n         else {\n            sa = [qa.author,].concat(ra);\n            q.getMulti(sa, function(ua) {\n                var va = i.tx._(\"{num} more\", {\n                    num: ((ra.length - 2))\n                }), wa = i.create(\"span\", {\n                    className: \"more\"\n                }, va), xa = i.create(\"div\");\n                w.renderTooltipFlyout(xa, ra.slice(2).map(function(za) {\n                    return ua[za];\n                }));\n                if (((qa.author == q.user))) {\n                    ta = i.tx._(\"You added {subscriber1}, {subscriber2} and {more_people}.\", {\n                        subscriber1: ja(ua[ra[0]]),\n                        subscriber2: ja(ua[ra[1]]),\n                        more_people: wa\n                    });\n                }\n                 else if (((ra[0] == q.user))) {\n                    ta = i.tx._(\"{actor} added you, {subscriber2} and {more_people}.\", {\n                        actor: ja(ua[qa.author]),\n                        subscriber2: ja(ua[ra[1]]),\n                        more_people: wa\n                    });\n                }\n                 else ta = i.tx._(\"{actor} added {subscriber1}, {subscriber2} and {more_people}.\", {\n                    actor: ja(ua[qa.author]),\n                    subscriber1: ja(ua[ra[0]]),\n                    subscriber2: ja(ua[ra[1]]),\n                    more_people: wa\n                });\n                \n            ;\n            ;\n                i.setContent(pa, ta);\n                var ya = m.JSBNG__find(pa, \"span.more\");\n                r.set(ya, xa, \"above\", \"center\");\n            });\n        }\n        \n        \n    ;\n    ;\n    }, ma = function(pa, qa) {\n        q.get(qa.author, function(ra) {\n            var sa;\n            if (((qa.author == q.user))) {\n                sa = i.tx._(\"You left the conversation.\");\n            }\n             else sa = i.tx._(\"{actor} left the conversation.\", {\n                actor: ja(ra)\n            });\n        ;\n        ;\n            i.setContent(pa, sa);\n        });\n    }, na = function(pa, qa) {\n        var ra = \"We were unable to fetch previous messages in this conversation.\";\n        i.setContent(pa, ra);\n    }, oa = function(pa) {\n        return ((((pa.log_message_data.event_name === \"installing\")) || ((pa.log_message_data.event_name === \"install_canceled\"))));\n    };\n    e.exports = w;\n});\n__d(\"MercurySheetPolicy\", [], function(a, b, c, d, e, f) {\n    var g = {\n        canReplaceOpenSheet: function(h, i) {\n            if (((h.getType() == i.getType()))) {\n                return false;\n            }\n        ;\n        ;\n            if (((h.isPermanent() && !i.isPermanent()))) {\n                return false;\n            }\n        ;\n        ;\n            return true;\n        }\n    };\n    e.exports = g;\n});\n__d(\"MercurySheetView\", [\"Animation\",\"ArbiterMixin\",\"MercurySheetPolicy\",\"JSBNG__CSS\",\"DOM\",\"Style\",\"MercurySheetTemplates\",\"Vector\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"ArbiterMixin\"), i = b(\"MercurySheetPolicy\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"Style\"), m = b(\"MercurySheetTemplates\"), n = b(\"Vector\"), o = b(\"copyProperties\"), p = b(\"cx\"), q = 5000, r = function(s, t, u) {\n        this._threadID = s;\n        this._rootElement = t;\n        this._tabMainElement = u;\n        this._openSheet = null;\n    };\n    o(r.prototype, h, {\n        destroy: function() {\n            k.empty(this._rootElement);\n        },\n        _openCommon: function(s, t) {\n            if (((this._openSheet && !i.canReplaceOpenSheet(this._openSheet, s)))) {\n                if (s.couldNotReplace) {\n                    s.couldNotReplace();\n                }\n            ;\n            ;\n                return;\n            }\n        ;\n        ;\n            this.clear(function() {\n                this._openSheet = s;\n                var u = m[\":fb:mercury:tab-sheet:loading\"].build().getRoot();\n                k.setContent(this._rootElement, u);\n                j.show(u);\n                j.show(this._rootElement);\n                s.render();\n                if (t) {\n                    j.addClass(this._tabMainElement, \"sheetSlide\");\n                    j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                    var v = n.getElementDimensions(this._rootElement).y;\n                    l.set(this._rootElement, \"bottom\", ((v + \"px\")));\n                    this.resize();\n                    this._animation = new g(this._rootElement).to(\"bottom\", 0).duration(150).ease(g.ease.both).ondone(function() {\n                        j.removeClass(this._tabMainElement, \"sheetSlide\");\n                        j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                        this.resize();\n                    }.bind(this)).go();\n                }\n                 else this.resize();\n            ;\n            ;\n                if (!s.isPermanent()) {\n                    var w = q;\n                    if (s.getCloseTimeout) {\n                        w = s.getCloseTimeout();\n                    }\n                ;\n                ;\n                    var x = this.getAutoCloseCallback(s);\n                    this._sheetCloseHandler = this.close.bind(this, s, x).defer(w, false);\n                    if (s.timeoutCanBeReset) {\n                        s.setResetTimeoutCallback(this.resetTimeout.bind(this));\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }.bind(this));\n        },\n        getAutoCloseCallback: function(s) {\n            if (!s.autoCloseCallback) {\n                return null;\n            }\n        ;\n        ;\n            return s.autoCloseCallback.bind(s);\n        },\n        resetTimeout: function(s, t) {\n            JSBNG__clearTimeout(this._sheetCloseHandler);\n            var u = this.getAutoCloseCallback(s);\n            this._sheetCloseHandler = this.close.bind(this, s, u).defer(t, false);\n        },\n        set: function(s) {\n            return this._openCommon(s, false);\n        },\n        open: function(s) {\n            return this._openCommon(s, true);\n        },\n        close: function(s, t) {\n            if (((this._openSheet != s))) {\n                return;\n            }\n        ;\n        ;\n            if (!this._openSheet) {\n                ((t && t()));\n                return;\n            }\n        ;\n        ;\n            if (this._animation) {\n                this._animation.JSBNG__stop();\n            }\n        ;\n        ;\n            if (this._sheetCloseHandler) {\n                JSBNG__clearTimeout(this._sheetCloseHandler);\n                this._sheetCloseHandler = null;\n            }\n        ;\n        ;\n            j.addClass(this._tabMainElement, \"sheetSlide\");\n            j.addClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n            var u = n.getElementDimensions(this._rootElement).y;\n            this.resize();\n            this._animation = new g(this._rootElement).to(\"bottom\", ((u + \"px\"))).duration(100).ease(g.ease.begin).ondone(function() {\n                k.empty(this._rootElement);\n                j.hide(this._rootElement);\n                j.removeClass(this._tabMainElement, \"sheetSlide\");\n                j.removeClass(this._tabMainElement, \"-cx-PRIVATE-fbMercuryTabSheet__sheetslide\");\n                this._openSheet = null;\n                this.resize();\n                ((t && t()));\n            }.bind(this)).go();\n        },\n        clear: function(s) {\n            this.close(this._openSheet, s);\n        },\n        resize: function() {\n            this.inform(\"resize\");\n        }\n    });\n    e.exports = r;\n});\n__d(\"BanzaiLogger\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\"), h = \"logger\";\n    function i(k) {\n        return {\n            log: function(l, m) {\n                g.post(((((h + \":\")) + l)), m, k);\n            }\n        };\n    };\n;\n    var j = i();\n    j.create = i;\n    e.exports = j;\n});\n__d(\"MercuryStickersData\", [\"Arbiter\",\"MercuryStickersInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"MercuryStickersInitialData\"), i = h.packs, j = {\n        getPacks: function() {\n            return i;\n        },\n        updatePackData: function(k) {\n            i = k.packs;\n            g.inform(\"MercuryStickers/updatedPacks\");\n        }\n    };\n    e.exports = j;\n});\n__d(\"MercuryStickers\", [\"Arbiter\",\"ArbiterMixin\",\"BanzaiLogger\",\"JSBNG__CSS\",\"DOM\",\"JSBNG__Event\",\"MercuryStickersData\",\"MercuryStickersFlyoutList.react\",\"Parent\",\"React\",\"SubscriptionsHandler\",\"Toggler\",\"UIPagelet\",\"XUISpinner.react\",\"copyProperties\",\"csx\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"BanzaiLogger\"), j = b(\"JSBNG__CSS\"), k = b(\"DOM\"), l = b(\"JSBNG__Event\"), m = b(\"MercuryStickersData\"), n = b(\"MercuryStickersFlyoutList.react\"), o = b(\"Parent\"), p = b(\"React\"), q = b(\"SubscriptionsHandler\"), r = b(\"Toggler\"), s = b(\"UIPagelet\"), t = b(\"XUISpinner.react\"), u = b(\"copyProperties\"), v = b(\"csx\"), w = b(\"cx\");\n    function x(y) {\n        this._packs = k.JSBNG__find(y, \".-cx-PRIVATE-fbMercuryStickersFlyout__packs\");\n        this._packSelector = k.JSBNG__find(y, \".-cx-PRIVATE-fbMercuryStickersFlyout__selector\");\n        this._loadedPacks = {\n            emoticons: true\n        };\n        var z = o.byClass(y, \"uiToggle\"), aa = r.listen(\"show\", z, function() {\n            this._renderPackList();\n            this._subscriptions.addSubscriptions(g.subscribe(\"MercuryStickers/updatedPacks\", this._renderPackList.bind(this)));\n            this._selectPack(m.getPacks()[0].id);\n            r.unsubscribe(aa);\n        }.bind(this));\n        r.listen(\"show\", z, function() {\n            i.log(\"MercuryStickersLoggerConfig\", {\n                JSBNG__event: \"open_tray\"\n            });\n        });\n        this._subscriptions = new q();\n        this._subscriptions.addSubscriptions(l.listen(this._packs, \"click\", function(JSBNG__event) {\n            var ba = o.byClass(JSBNG__event.getTarget(), \"-cx-PRIVATE-fbMercuryStickersFlyout__sticker\");\n            if (ba) {\n                this._selectedSticker(ba);\n                r.hide(z);\n            }\n        ;\n        ;\n        }.bind(this)));\n    };\n;\n    u(x.prototype, h, {\n        _renderPackList: function() {\n            p.renderComponent(n({\n                onPackClick: this._selectPack.bind(this),\n                packs: m.getPacks()\n            }), this._packSelector);\n        },\n        _loadPack: function(y) {\n            if (this._loadedPacks[y]) {\n                return;\n            }\n        ;\n        ;\n            var z = this._getPackWithID(y);\n            p.renderComponent(t({\n                className: \"-cx-PRIVATE-fbMercuryStickersFlyout__spinner\"\n            }), z);\n            this._loadedPacks[y] = true;\n            s.loadFromEndpoint(\"StickerPackPagelet\", z, {\n                id: y\n            }, {\n                crossPage: true\n            });\n        },\n        _getPackWithID: function(y) {\n            var z = k.scry(this._packs, ((((((\".-cx-PRIVATE-fbMercuryStickersFlyout__pack\" + \"[data-id=\\\"\")) + y)) + \"\\\"]\")))[0];\n            if (!z) {\n                z = k.create(\"div\", {\n                    className: \"-cx-PRIVATE-fbMercuryStickersFlyout__pack hidden_elem\",\n                    \"data-id\": y\n                });\n                k.appendContent(this._packs, z);\n            }\n        ;\n        ;\n            return z;\n        },\n        _selectedSticker: function(y) {\n            var z = parseInt(y.getAttribute(\"data-id\"), 10);\n            this.inform(\"stickerselected\", {\n                id: z\n            });\n        },\n        _selectPack: function(y) {\n            k.scry(this._packs, \".-cx-PRIVATE-fbMercuryStickersFlyout__pack\").forEach(j.hide);\n            this._loadPack(y);\n            j.show(this._getPackWithID(y));\n            i.log(\"MercuryStickersLoggerConfig\", {\n                JSBNG__event: \"select_pack\",\n                packid: y\n            });\n        },\n        destroy: function() {\n            ((this._subscriptions && this._subscriptions.release()));\n            this._subscriptions = null;\n        }\n    });\n    e.exports = x;\n});\n__d(\"Token\", [\"JSBNG__CSS\",\"DataStore\",\"DOM\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DataStore\"), i = b(\"DOM\"), j = b(\"copyProperties\"), k = b(\"tx\");\n    function l(m, n) {\n        this.info = m;\n        this.paramName = n;\n    };\n;\n    j(l.prototype, {\n        getInfo: function() {\n            return this.info;\n        },\n        getText: function() {\n            return this.info.text;\n        },\n        getValue: function() {\n            return this.info.uid;\n        },\n        isFreeform: function() {\n            return !!this.info.freeform;\n        },\n        setSelected: function(m) {\n            g.conditionClass(this.getElement(), \"uiTokenSelected\", m);\n            return this;\n        },\n        getElement: function() {\n            if (!this.element) {\n                this.setElement(this.createElement());\n            }\n        ;\n        ;\n            return this.element;\n        },\n        setElement: function(m) {\n            h.set(m, \"Token\", this);\n            this.element = m;\n            return this;\n        },\n        isRemovable: function() {\n            return g.hasClass(this.element, \"removable\");\n        },\n        createElement: function(m, n) {\n            var o = this.paramName, p = this.getText(), q = this.getValue(), r = i.create(\"a\", {\n                href: \"#\",\n                \"aria-label\": k._(\"Remove {item}\", {\n                    JSBNG__item: p\n                }),\n                className: \"remove uiCloseButton uiCloseButtonSmall\"\n            });\n            if (m) {\n                g.addClass(r, \"uiCloseButtonSmallGray\");\n            }\n        ;\n        ;\n            var s = i.create(\"input\", {\n                type: \"hidden\",\n                value: q,\n                JSBNG__name: ((o + \"[]\")),\n                autocomplete: \"off\"\n            }), t = i.create(\"input\", {\n                type: \"hidden\",\n                value: p,\n                JSBNG__name: ((((\"text_\" + o)) + \"[]\")),\n                autocomplete: \"off\"\n            }), u = i.create(\"span\", {\n                className: \"removable uiToken\"\n            }, [p,s,t,r,]);\n            if (m) {\n                g.addClass(u, \"uiTokenGray\");\n            }\n        ;\n        ;\n            if (n) {\n                var v = i.create(\"i\", {\n                    className: n\n                });\n                i.prependContent(u, v);\n            }\n        ;\n        ;\n            return u;\n        }\n    });\n    e.exports = l;\n});\n__d(\"WeakToken\", [\"Class\",\"JSBNG__CSS\",\"Token\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Class\"), h = b(\"JSBNG__CSS\"), i = b(\"Token\"), j = b(\"copyProperties\");\n    function k(l, m) {\n        this.parent.construct(this, l, m);\n    };\n;\n    g.extend(k, i);\n    j(k.prototype, {\n        createElement: function() {\n            var l = this.parent.createElement(true, \"UFIWeakReferenceIcon\");\n            h.addClass(l, \"uiTokenWeakReference\");\n            return l;\n        }\n    });\n    e.exports = k;\n});\n__d(\"Tokenizer\", [\"Arbiter\",\"ArbiterMixin\",\"JSBNG__CSS\",\"DOM\",\"DOMQuery\",\"DataStore\",\"JSBNG__Event\",\"Focus\",\"Input\",\"Keys\",\"Parent\",\"StickyPlaceholderInput\",\"Style\",\"JSBNG__TextMetrics\",\"Token\",\"UserAgent\",\"WeakToken\",\"copyProperties\",\"createObjectFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"DOMQuery\"), l = b(\"DataStore\"), m = b(\"JSBNG__Event\"), n = b(\"Focus\"), o = b(\"Input\"), p = b(\"Keys\"), q = b(\"Parent\"), r = b(\"StickyPlaceholderInput\"), s = b(\"Style\"), t = b(\"JSBNG__TextMetrics\"), u = b(\"Token\"), v = b(\"UserAgent\"), w = b(\"WeakToken\"), x = b(\"copyProperties\"), y = b(\"createObjectFrom\"), z = b(\"emptyFunction\"), aa = 20;\n    function ba(ca, da) {\n        this.element = ca;\n        this.typeahead = da;\n        this.input = da.getCore().getElement();\n        l.set(this.element, \"Tokenizer\", this);\n    };\n;\n    ba.getInstance = function(ca) {\n        var da = q.byClass(ca, \"uiTokenizer\");\n        return ((da ? l.get(da, \"Tokenizer\") : null));\n    };\n    x(ba.prototype, h, {\n        inline: false,\n        maxTokens: null,\n        excludeDuplicates: true,\n        placeholder: \"\",\n        init: function(ca, da, ea, fa) {\n            this.init = z;\n            this.tokenarea = ca;\n            this.paramName = da;\n            if (!this.placeholder) {\n                this.placeholder = ((this.input.getAttribute(\"data-placeholder\") || \"\"));\n            }\n        ;\n        ;\n            x(this, ((fa || {\n            })));\n            this.initEvents();\n            this.initTypeahead();\n            this.reset(ea);\n            this.initBehaviors();\n            this.adjustWidth.bind(this).defer();\n            g.inform(\"Tokenizer/init\", this, g.BEHAVIOR_PERSISTENT);\n        },\n        reset: function(ca) {\n            this.tokens = [];\n            this.unique = {\n            };\n            if (ca) {\n                this.populate(ca);\n            }\n             else j.empty(this.tokenarea);\n        ;\n        ;\n            this.updateTokenarea();\n        },\n        populate: function(ca) {\n            var da = [];\n            this.tokens = this.getTokenElements().map(function(ea, fa) {\n                var ga = ca[fa];\n                da.push(this._tokenKey(ga));\n                return this.createToken(ga, ea);\n            }, this);\n            this.unique = y(da, this.tokens);\n        },\n        getElement: function() {\n            return this.element;\n        },\n        getTypeahead: function() {\n            return this.typeahead;\n        },\n        getInput: function() {\n            return this.input;\n        },\n        initBehaviors: function() {\n            this.behaviors = ((this.behaviors || []));\n            if (((this.behaviors instanceof Array))) {\n                this.behaviors.forEach(function(ea) {\n                    ea.behavior(this, ea.config);\n                }.bind(this));\n            }\n             else {\n                var fin312keys = ((window.top.JSBNG_Replay.forInKeys)(((this.behaviors || {\n                })))), fin312i = (0);\n                var ca;\n                for (; (fin312i < fin312keys.length); (fin312i++)) {\n                    ((ca) = (fin312keys[fin312i]));\n                    {\n                        var da = ((window.TokenizerBehaviors && window.TokenizerBehaviors[ca]));\n                        da.call(null, this, this.behaviors[ca]);\n                    };\n                };\n            }\n        ;\n        ;\n        },\n        initTypeahead: function() {\n            var ca = this.typeahead.getCore();\n            ca.resetOnSelect = true;\n            ca.setValueOnSelect = false;\n            ca.preventFocusChangeOnTab = true;\n            if (this.inline) {\n                var da = this.typeahead.getView();\n                i.addClass(da.getElement(), \"uiInlineTokenizerView\");\n            }\n        ;\n        ;\n            this.typeahead.subscribe(\"select\", function(ea, fa) {\n                var ga = fa.selected;\n                if (((\"uid\" in ga))) {\n                    this.updateInput();\n                    this.addToken(this.createToken(ga));\n                }\n            ;\n            ;\n            }.bind(this));\n            this.typeahead.subscribe(\"JSBNG__blur\", this.handleBlur.bind(this));\n        },\n        handleBlur: function(JSBNG__event) {\n            this.inform(\"JSBNG__blur\", {\n                JSBNG__event: JSBNG__event\n            });\n            this.updatePlaceholder();\n        },\n        initEvents: function() {\n            var ca = this.handleEvents.bind(this), da = ((((v.firefox() < 4)) ? \"keypress\" : \"keydown\"));\n            m.listen(this.tokenarea, {\n                click: ca,\n                keydown: ca\n            });\n            m.listen(this.input, \"paste\", this.paste.bind(this));\n            m.listen(this.input, da, this.keydown.bind(this));\n        },\n        handleEvents: function(JSBNG__event) {\n            var ca = JSBNG__event.getTarget(), da = ((ca && this.getTokenElementFromTarget(ca)));\n            if (!da) {\n                return;\n            }\n        ;\n        ;\n            if (((((JSBNG__event.type != \"keydown\")) || ((m.getKeyCode(JSBNG__event) == p.RETURN))))) {\n                this.processEvents(JSBNG__event, ca, da);\n            }\n        ;\n        ;\n        },\n        processEvents: function(JSBNG__event, ca, da) {\n            if (q.byClass(ca, \"remove\")) {\n                var ea = da.nextSibling;\n                ea = ((ea && k.scry(da.nextSibling, \".remove\")[0]));\n                var fa = this.getTokenFromElement(da);\n                fa = this.addTokenData(fa, ca);\n                this.removeToken(fa);\n                this.focusOnTokenRemoval(JSBNG__event, ea);\n                JSBNG__event.kill();\n            }\n        ;\n        ;\n        },\n        focusOnTokenRemoval: function(JSBNG__event, ca) {\n            n.set(((((((JSBNG__event.type == \"keydown\")) && ca)) || this.input)));\n        },\n        addTokenData: function(ca, da) {\n            return ca;\n        },\n        keydown: function(JSBNG__event) {\n            this.inform(\"keydown\", {\n                JSBNG__event: JSBNG__event\n            });\n            var ca = m.getKeyCode(JSBNG__event), da = this.input;\n            if (((((this.inline && ((ca == p.BACKSPACE)))) && o.isEmpty(da)))) {\n                var ea = this.getLastToken();\n                if (((ea && ea.isRemovable()))) {\n                    this.removeToken(ea);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            this.updateInput();\n        },\n        paste: function(JSBNG__event) {\n            this.inform(\"paste\", {\n                JSBNG__event: JSBNG__event\n            });\n            this.updateInput(true);\n        },\n        focusInput: function() {\n            n.set(this.input);\n        },\n        updateInput: function(ca) {\n            if (!this.inline) {\n                return;\n            }\n        ;\n        ;\n            JSBNG__setTimeout(function() {\n                this.adjustWidth(this.input.value);\n                if (ca) {\n                    this.input.value = this.input.value;\n                }\n            ;\n            ;\n            }.bind(this), 20);\n            r.setPlaceholderText(this.input, \"\");\n            this.inform(\"resize\");\n        },\n        setPlaceholder: function(ca) {\n            this.placeholder = ca;\n            if (this.stickyPlaceholder) {\n                r.setPlaceholderText(this.input, ca);\n            }\n        ;\n        ;\n            this.updatePlaceholder();\n        },\n        updatePlaceholder: function() {\n            if (((!this.inline || this.input.value))) {\n                return;\n            }\n        ;\n        ;\n            var ca = !this.tokens.length, da = \"\";\n            if (((ca || this.stickyPlaceholder))) {\n                this.adjustWidth(this.placeholder);\n                da = this.placeholder;\n            }\n             else this.adjustWidth(this.input.value);\n        ;\n        ;\n            r.setPlaceholderText(this.input, da);\n        },\n        adjustWidth: function(ca) {\n            if (((!this.inline || !this._getIsInDOM()))) {\n                return;\n            }\n        ;\n        ;\n            if (((!ca && ((this.input.value === \"\"))))) {\n                ca = this.placeholder;\n            }\n        ;\n        ;\n            var da = aa;\n            if (((((((ca !== this.placeholder)) || !this.getTokens().length)) || this.stickyPlaceholder))) {\n                var ea = this._getMetrics().measure(ca);\n                da = ((((ea.width + this._getWidthOffset())) + 10));\n            }\n        ;\n        ;\n            s.set(this.input, \"width\", ((da + \"px\")));\n            this.inform(\"resize\");\n        },\n        getToken: function(ca) {\n            return ((this.unique[ca] || null));\n        },\n        getTokens: function() {\n            return ((this.tokens || []));\n        },\n        getTokenElements: function() {\n            return k.scry(this.tokenarea, \"span.uiToken\");\n        },\n        getTokenElementFromTarget: function(ca) {\n            return q.byClass(ca, \"uiToken\");\n        },\n        getTokenFromElement: function(ca) {\n            return l.get(ca, \"Token\");\n        },\n        getTokenValues: function() {\n            if (!this.tokens) {\n                return [];\n            }\n        ;\n        ;\n            return this.tokens.map(function(ca) {\n                return ca.getValue();\n            });\n        },\n        getFirstToken: function() {\n            return ((this.tokens[0] || null));\n        },\n        getLastToken: function() {\n            return ((this.tokens[((this.tokens.length - 1))] || null));\n        },\n        hasMaxTokens: function() {\n            return ((this.maxTokens && ((this.maxTokens <= this.tokens.length))));\n        },\n        createToken: function(ca, da) {\n            var ea = this.getToken(this._tokenKey(ca));\n            if (!ea) {\n                ea = ((ca.weak_reference ? new w(ca, this.paramName) : new u(ca, this.paramName)));\n            }\n        ;\n        ;\n            ((da && ea.setElement(da)));\n            return ea;\n        },\n        addToken: function(ca) {\n            if (this.hasMaxTokens()) {\n                return;\n            }\n        ;\n        ;\n            var da = this._tokenKey(ca.getInfo());\n            if (((da in this.unique))) {\n                return;\n            }\n        ;\n        ;\n            this.unique[da] = ca;\n            this.tokens.push(ca);\n            this.insertToken(ca);\n            this.updateTokenarea();\n            this.inform(\"addToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        insertToken: function(ca) {\n            j.appendContent(this.tokenarea, ca.getElement());\n        },\n        removeToken: function(ca) {\n            if (!ca) {\n                return;\n            }\n        ;\n        ;\n            var da = this.tokens.indexOf(ca);\n            if (((da < 0))) {\n                return;\n            }\n        ;\n        ;\n            this.tokens.splice(this.tokens.indexOf(ca), 1);\n            delete this.unique[this._tokenKey(ca.getInfo())];\n            j.remove(ca.getElement());\n            this.updateTokenarea();\n            this.inform(\"removeToken\", ca);\n            g.inform(\"Form/change\", {\n                node: this.element\n            });\n        },\n        removeAllTokens: function() {\n            this.reset();\n            this.inform(\"removeAllTokens\");\n        },\n        updateTokenarea: function() {\n            var ca = this.typeahead.getCore(), da = this.getTokenValues();\n            if (this.excludeDuplicates) {\n                ((this._exclusions || (this._exclusions = ca.getExclusions())));\n                ca.setExclusions(da.concat(this._exclusions));\n            }\n        ;\n        ;\n            ca.setEnabled(!this.hasMaxTokens());\n            this.updateTokenareaVisibility();\n            this.updatePlaceholder();\n            this.inform(\"resize\");\n        },\n        updateTokenareaVisibility: function() {\n            i.conditionShow(this.tokenarea, ((this.tokens.length !== 0)));\n        },\n        _tokenKey: function(ca) {\n            return ((ca.uid + ((ca.freeform ? \":\" : \"\"))));\n        },\n        _widthOffset: null,\n        _getWidthOffset: function() {\n            if (((this._widthOffset === null))) {\n                var ca = this.input.clientWidth, da = s.getFloat(this.input, \"width\");\n                if (((ca == da))) {\n                    this._widthOffset = ((s.getFloat(this.input, \"paddingLeft\") + s.getFloat(this.input, \"paddingRight\")));\n                }\n                 else this._widthOffset = 0;\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._widthOffset;\n        },\n        _metrics: null,\n        _getMetrics: function() {\n            if (!this._metrics) {\n                this._metrics = new t(this.input, this.inline);\n            }\n        ;\n        ;\n            return this._metrics;\n        },\n        _getIsInDOM: function() {\n            return ((this._isInDOM || (this._isInDOM = k.contains(JSBNG__document.body, this.input))));\n        }\n    });\n    ba.init = function(ca, da) {\n        ca.init(da.tokenarea, da.param_name, da.initial_info, da.options);\n    };\n    e.exports = ba;\n});\n__d(\"MercuryTypeahead\", [\"JSBNG__Event\",\"ArbiterMixin\",\"DOM\",\"DOMDimensions\",\"Input\",\"Keys\",\"MercuryTypeaheadTemplates\",\"Tokenizer\",\"Typeahead\",\"TypeaheadCore\",\"copyProperties\",\"cx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ArbiterMixin\"), i = b(\"DOM\"), j = b(\"DOMDimensions\"), k = b(\"Input\"), l = b(\"Keys\"), m = b(\"MercuryTypeaheadTemplates\"), n = b(\"Tokenizer\"), o = b(\"Typeahead\"), p = b(\"TypeaheadCore\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = function(t, u) {\n        this._domElement = null;\n        this._typeahead = null;\n        this._tokenizer = null;\n        this._placeholder = \"\";\n        this._exclusions = [];\n        this._viewNodeOrID = null;\n        this._viewOptions = {\n            renderer: \"compact\",\n            autoSelect: true\n        };\n        this._tokenizerBehaviors = [];\n        this._heightPrev = null;\n        this._dataSource = t;\n        this._view = u;\n    };\n    q(s.prototype, h);\n    q(s.prototype, {\n        setPlaceholder: function(t) {\n            this._placeholder = t;\n            return this;\n        },\n        setExcludedParticipants: function(t) {\n            this._exclusions = [];\n            t.forEach(function(u) {\n                var v = u.indexOf(\":\");\n                if (((u.substr(0, v) == \"fbid\"))) {\n                    this._exclusions.push(u.substr(((v + 1))));\n                }\n            ;\n            ;\n            }.bind(this));\n            return this;\n        },\n        setViewNodeID: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setViewNode: function(t) {\n            this._viewNodeOrID = t;\n        },\n        setFullWidthView: function(t) {\n            var u = i.create(\"div\", {\n                className: \"-cx-PRIVATE-mercuryTypeahead__typeaheadview uiTypeaheadView\"\n            });\n            i.setContent(t, u);\n            this.setViewNode(u);\n        },\n        setViewOption: function(t, u) {\n            this._viewOptions[t] = u;\n        },\n        addTokenizerBehavior: function(t) {\n            this._tokenizerBehaviors.push(t);\n        },\n        build: function(t) {\n            if (this._domElement) {\n                return;\n            }\n        ;\n        ;\n            var u = m[\":fb:mercury:tokenizer\"].build(), v = m[\":fb:mercury:typeahead\"].build();\n            this._domElement = u.getRoot();\n            i.appendContent(this._domElement, v.getRoot());\n            var w = v.getNode(\"textfield\");\n            k.setPlaceholder(w, this._placeholder);\n            w.setAttribute(\"data-placeholder\", this._placeholder);\n            this._input = w;\n            var x = {\n                node_id: this._viewNodeOrID,\n                ctor: this._view,\n                options: this._viewOptions\n            }, y = {\n                ctor: p,\n                options: {\n                    setValueOnSelect: true\n                }\n            };\n            this._typeahead = new o(this._dataSource, x, y, v.getRoot());\n            this._typeahead.init();\n            var z = {\n                inline: true,\n                behaviors: this._tokenizerBehaviors\n            };\n            this._tokenizer = new n(this._domElement, this._typeahead);\n            this._tokenizer.init(u.getNode(\"tokenarea\"), \"participants\", [], z);\n            this._tokenizer.subscribe([\"addToken\",\"removeToken\",\"removeAllTokens\",], this._tokensChanged.bind(this));\n            this._tokenizer.subscribe(\"resize\", function() {\n                this.inform(\"resize\");\n            }.bind(this));\n            g.listen(w, \"JSBNG__focus\", function() {\n                this._resetDataSource();\n                this._typeahead.init();\n            }.bind(this));\n            g.listen(this._domElement, \"click\", this.JSBNG__focus.bind(this));\n            g.listen(w, \"keydown\", this.keydown.bind(this));\n            this._heightPrev = j.getElementDimensions(this._domElement).height;\n        },\n        getElement: function() {\n            return this._domElement;\n        },\n        getSelectedParticipantIDs: function() {\n            var t = [];\n            if (this._tokenizer) {\n                ((this._tokenizer.getTokenValues() || [])).forEach(function(u) {\n                    t.push(((\"fbid:\" + u)));\n                });\n            }\n        ;\n        ;\n            return t;\n        },\n        getTokens: function() {\n            var t = [];\n            if (this._tokenizer) {\n                t = this._tokenizer.getTokens();\n            }\n        ;\n        ;\n            return t;\n        },\n        getTokenizer: function() {\n            return this._tokenizer;\n        },\n        keydown: function(JSBNG__event) {\n            if (((this._tokenizer.inline && ((JSBNG__event.keyCode == l.ESC))))) {\n                if (k.isEmpty(this._input)) {\n                    var t = this._tokenizer.getLastToken();\n                    if (((t && t.isRemovable()))) {\n                        this._tokenizer.removeToken(t);\n                    }\n                ;\n                ;\n                }\n                 else this._typeahead.getCore().reset();\n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n        },\n        reset: function() {\n            ((this._tokenizer && this._tokenizer.removeAllTokens()));\n            ((this._typeahead && this._typeahead.getCore().reset()));\n        },\n        JSBNG__focus: function() {\n            ((this._tokenizer && this._tokenizer.focusInput()));\n        },\n        getTypeahead: function() {\n            return this._typeahead;\n        },\n        _resetDataSource: function() {\n            this._dataSource.setExclusions(this._exclusions);\n        },\n        _tokensChanged: function() {\n            this.inform(\"tokens-changed\");\n        }\n    });\n    e.exports = s;\n});");
// 16095
o195.JSBNG__status = null;
// undefined
o195 = null;
// 16074
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o193,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y8/r/9g0s6xsMYpS.js",o194);
// undefined
o193 = null;
// undefined
o194 = null;
// 16149
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"WD1Wm\",]);\n}\n;\n__d(\"BlackbirdUpsellConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        ACTION_UPSELL: \"upsell\",\n        CLICK_TYPE_DISMISS_PROMO: \"dismiss_promo\",\n        ACTION_EDUCATE: \"educate\",\n        CLICK_TYPE_ENABLE_CHAT: \"enable_chat\",\n        CLICK_TYPE_OPEN_SETTINGS: \"open_settings\"\n    };\n});\n__d(\"AsyncLoader\", [\"copyProperties\",\"AsyncRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"AsyncRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        new h(k).setData({\n            ids: l\n        }).setHandler(n).setErrorHandler(o).setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n    };\n    e.exports = j;\n});\n__d(\"BlackbirdUpsell\", [\"Event\",\"Arbiter\",\"AsyncRequest\",\"LegacyContextualDialog\",\"DOM\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"PresencePrivacy\",\"copyProperties\",\"BlackbirdUpsellConfig\",\"BlackbirdUpsellConstants\",\"BlackbirdUpsellTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"LegacyContextualDialog\"), k = b(\"DOM\"), l = b(\"LayerDestroyOnHide\"), m = b(\"LayerHideOnTransition\"), n = b(\"PresencePrivacy\"), o = b(\"copyProperties\"), p = b(\"BlackbirdUpsellConfig\"), q = b(\"BlackbirdUpsellConstants\"), r = b(\"BlackbirdUpsellTemplates\"), s = \"/ajax/chat/blackbird/update_clicks.php\", t = \"/ajax/chat/blackbird/update_impressions.php\", u = \"/ajax/chat/blackbird/dismiss.php\", v = 235, w = null, x = null, y = false, z = false;\n    function aa() {\n    \n    };\n    o(aa, {\n        shouldShow: function() {\n            if (this._dialogDismissed) {\n                return false\n            };\n            if (this.isEducation()) {\n                return ((!!p.EducationGK && !p.EducationDismissed) && (p.EducationImpressions < p.EducationImpressionLimit));\n            }\n             else return (((!!p.UpsellGK && !p.UpsellDismissed) && (p.UpsellImpressions < p.UpsellImpressionLimit)) && (p.FriendCount >= p.UpsellMinFriendCount))\n        ;\n        },\n        isEducation: function() {\n            return (p.TimeOffline <= p.EducationTimeOfflineThresdhold);\n        },\n        getOfflineContent: function() {\n            if (this.isEducation()) {\n                return this._getEducationContent();\n            }\n             else return this._getUpsellContent()\n        ;\n        },\n        _getEducationContent: function() {\n            ga();\n            var ka = r[\":fb:chat:blackbird:offline-educate\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ja(q.CLICK_TYPE_OPEN_SETTINGS);\n                da();\n            });\n            return ka.getRoot();\n        },\n        _getUpsellContent: function() {\n            fa();\n            var ka = r[\":fb:chat:blackbird:upsell\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ia(q.CLICK_TYPE_OPEN_SETTINGS);\n                ca();\n            });\n            var ma = ka.getNode(\"enableChatButton\");\n            g.listen(ma, \"click\", function() {\n                ia(q.CLICK_TYPE_ENABLE_CHAT);\n                ca();\n            });\n            return ka.getRoot();\n        },\n        getBlackbirdContent: function(ka) {\n            ga();\n            switch (ka) {\n              case n.ONLINE:\n                return r[\":fb:chat:blackbird:most-friends-educate\"].build().getRoot();\n              case n.OFFLINE:\n                return r[\":fb:chat:blackbird:some-friends-educate\"].build().getRoot();\n            };\n        },\n        showOfflineDialog: function(ka) {\n            this.showDialog(ka, this.getOfflineContent.bind(this));\n        },\n        showBlackbirdDialog: function(ka, la) {\n            this.showDialog(ka, this.getBlackbirdContent.curry(la));\n        },\n        showDialog: function(ka, la) {\n            (!w && this._constructDialog());\n            k.setContent(x, la());\n            w.setContext(ka);\n            w.show();\n        },\n        hide: function() {\n            if ((w && w.isShown())) {\n                w.hide();\n            };\n        },\n        dismiss: function() {\n            this.hide();\n            if (this.isEducation()) {\n                da();\n            }\n             else ca();\n        ;\n        },\n        registerDismissClick: function() {\n            if (this.isEducation()) {\n                ja(q.CLICK_TYPE_DISMISS_PROMO);\n            }\n             else ia(q.CLICK_TYPE_DISMISS_PROMO);\n        ;\n        },\n        isVisible: function() {\n            return (z && !y);\n        },\n        _constructDialog: function() {\n            var ka = r[\":fb:chat:blackbird:dialog-frame\"].build();\n            x = ka.getNode(\"dialogContent\");\n            w = new j();\n            w.init(ka.getRoot());\n            w.setPosition(\"above\").setWidth(v).setFixed(true).disableBehavior(l).disableBehavior(m);\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.dismiss.bind(this));\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.registerDismissClick.bind(this));\n        }\n    });\n    function ba(ka, la) {\n        if ((!y && z)) {\n            y = true;\n            n.inform(\"privacy-user-presence-changed\");\n            var ma = new i(u);\n            ma.setData({\n                source: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                y = false;\n            });\n            ma.send();\n        }\n    ;\n    };\n    function ca() {\n        ba(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n    function da() {\n        ba(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n    function ea(ka, la) {\n        if (!z) {\n            z = true;\n            var ma = new i(t);\n            ma.setData({\n                action: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                z = false;\n            });\n            ma.send();\n        }\n    ;\n    };\n    function fa() {\n        ea(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n    function ga() {\n        ea(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n    function ha(ka, la, ma, na) {\n        var oa = new i(s);\n        oa.setData({\n            action: ka,\n            impressions: ma,\n            source: la,\n            time_offline: na\n        });\n        oa.send();\n    };\n    function ia(ka) {\n        ha(ka, q.ACTION_UPSELL, p.UpsellImpressions, p.TimeOffline);\n    };\n    function ja(ka) {\n        ha(ka, q.ACTION_EDUCATE, p.EducateImpressions, p.TimeOffline);\n    };\n    h.subscribe(\"chat/advanced-settings-dialog-opened\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-online\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-offline\", aa.dismiss.bind(aa));\n    e.exports = aa;\n});\n__d(\"ChatFavoriteNux\", [\"AsyncRequest\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = null, i = false, j = {\n        tryShow: function(k) {\n            if ((h && !i)) {\n                h.setContext(k);\n                h.show();\n                i = true;\n            }\n        ;\n        },\n        tryHide: function() {\n            if ((h && i)) {\n                h.hide();\n                h = null;\n            }\n        ;\n        },\n        registerDialog: function(k) {\n            h = k;\n            if (k) {\n                k.subscribe(\"confirm\", this.dismissDialog);\n            };\n        },\n        dismissDialog: function() {\n            if (h) {\n                new g(\"/ajax/chat/dismiss_favorite_nux.php\").send();\n                h.hide();\n                h = null;\n            }\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"ChatGroupThreadsController\", [\"ArbiterMixin\",\"ChatConfig\",\"InitialMultichatList\",\"MercuryOrderedThreadlist\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MessagingTag\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatConfig\"), i = b(\"InitialMultichatList\"), j = b(\"MercuryOrderedThreadlist\").get(), k = b(\"MercuryServerRequests\").get(), l = b(\"MercuryThreadInformer\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MessagingTag\"), o = b(\"copyProperties\"), p, q = [], r = h.get(\"max_sidebar_multichats\", 3);\n    function s(x) {\n        var y = m.getThreadMetaNow(x);\n        return ((y && !y.is_canonical) && m.canReply(x));\n    };\n    var t = i.payload;\n    if (t) {\n        k.handleUpdate(t);\n        var u = (t.threads || []);\n        q = u.map(function(x) {\n            return x.thread_id;\n        });\n    }\n;\n    if (q.length) {\n        var v = m.getThreadMetaNow(q[(q.length - 1)]);\n        p = (v && ((v.timestamp - 1)));\n    }\n;\n    if (!p) {\n        p = Date.now();\n    };\n    var w = {\n    };\n    o(w, g, {\n        getThreadIDs: function() {\n            var x = 0;\n            return q.filter(function(y) {\n                return (((x < r) && s(y)) && ++x);\n            });\n        }\n    });\n    l.subscribe(\"threadlist-updated\", function() {\n        q = j.getThreadlistUntilTimestamp(p, n.INBOX, n.GROUPS).filter(s);\n        w.inform(\"update\");\n    });\n    e.exports = w;\n});\n__d(\"ChatHovercard\", [\"Arbiter\",\"AsyncLoader\",\"Hovercard\",\"JSLogger\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncLoader\"), i = b(\"Hovercard\"), j = b(\"JSLogger\"), k = b(\"debounce\"), l = 5, m = new h(\"/ajax/chat/hovercard/sidebar.php\", \"hover\"), n = j.create(\"chat_hovercard\");\n    g.subscribe(\"Hovercard/dirty\", m.reset.bind(m));\n    function o(s, t) {\n        m.get(s, function(u) {\n            (function() {\n                if (!u) {\n                    n.error(\"fetch_failure\", {\n                        id: s\n                    });\n                    return;\n                }\n            ;\n                var v = i.getDialog(u);\n                if (!v) {\n                    n.error(\"no_hovercard\", {\n                        id: s,\n                        endpoint: u\n                    });\n                    return;\n                }\n            ;\n                if ((s == t.getActiveID())) {\n                    t.showHovercard(s, v);\n                };\n            }).defer();\n        });\n    };\n    function p(s, t) {\n        var u = [];\n        function v(y) {\n            if (((y >= 0) && (y < s.length))) {\n                u.push(s[y]);\n            };\n        };\n        var w = s.indexOf(t);\n        if ((w > -1)) {\n            v(w);\n            for (var x = 1; (x < l); x++) {\n                v((w + x));\n                v((w - x));\n            };\n        }\n    ;\n        return u.filter(function(y) {\n            return y;\n        });\n    };\n    function q(s, t) {\n        var u = t.getActiveID();\n        if (u) {\n            var v = s.getShowingUsers(), w = p(v, u);\n            m.get(w, function() {\n            \n            });\n        }\n    ;\n    };\n    function r(s) {\n        var t = s.getHoverController();\n        t.registerDefault(o);\n        t.subscribe(\"hover\", k(q.curry(s, t), 100));\n    };\n    e.exports = r;\n});\n__d(\"ChatOptions\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"PresenceUtil\",\"copyProperties\",\"ChatOptionsInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"PresenceUtil\"), k = b(\"copyProperties\"), l = i.create(\"chat_options\"), m = {\n    };\n    (function() {\n        var o = b(\"ChatOptionsInitialData\");\n        for (var p in o) {\n            var q = o[p];\n            m[p] = !!q;\n        };\n    })();\n    var n = k(new g(), {\n        getSetting: function(o) {\n            return m[o];\n        },\n        setSetting: function(o, p, q) {\n            if ((this.getSetting(o) == p)) {\n                return\n            };\n            if (q) {\n                q = (\"from_\" + q);\n                l.log(q, {\n                    name: o,\n                    new_value: p,\n                    old_value: this.getSetting(o)\n                });\n            }\n        ;\n            m[o] = !!p;\n            g.inform(\"chat/option-changed\", {\n                name: o,\n                value: p\n            });\n        }\n    });\n    g.subscribe(h.getArbiterType(\"setting\"), function(o, p) {\n        var q = p.obj;\n        if ((q.window_id === j.getSessionID())) {\n            return\n        };\n        n.setSetting(q.setting, !!q.value, \"channel\");\n    });\n    g.subscribe(i.DUMP_EVENT, function(o, p) {\n        p.chat_options = m;\n    });\n    e.exports = n;\n});\n__d(\"ChatOrderedListHover\", [\"function-extensions\",\"ArbiterMixin\",\"ChatFavoriteList\",\"CSS\",\"ErrorUtils\",\"Event\",\"LayerHideOnBlur\",\"Parent\",\"copyProperties\",\"cx\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatFavoriteList\"), i = b(\"CSS\"), j = b(\"ErrorUtils\"), k = b(\"Event\"), l = b(\"LayerHideOnBlur\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"setTimeoutAcrossTransitions\"), q = b(\"shield\");\n    function r(u) {\n        i.addClass(u, \"fetching\");\n    };\n    function s(u) {\n        i.removeClass(u, \"fetching\");\n    };\n    function t(u) {\n        this._orderedList = u;\n        this._root = u.getRoot();\n        k.listen(this._root, \"mouseover\", this._mouseOver.bind(this));\n        k.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        u.subscribe(\"click\", q(this._hide, this));\n    };\n    n(t.prototype, g, {\n        _root: null,\n        _activeItem: null,\n        _hideTimeout: null,\n        _showTimeout: null,\n        _showingDialog: null,\n        _showingID: null,\n        _handlers: {\n        },\n        _defaultHandler: null,\n        _mouseOver: function(event) {\n            if (this._paused) {\n                return\n            };\n            var u = event.getTarget(), v = (m.byClass(u, \"-cx-PRIVATE-fbChatOrderedList__item\") || m.byClass(u, \"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\"));\n            (v && this._setActiveItem(v));\n        },\n        _mouseLeave: function(event) {\n            this._setActiveItem(null);\n        },\n        _clearTimeouts: function() {\n            (this._showTimeout && clearTimeout(this._showTimeout));\n            this._showTimeout = null;\n            (this._hideTimeout && clearTimeout(this._hideTimeout));\n            this._hideTimeout = null;\n        },\n        _hide: function() {\n            if (this._showingDialog) {\n                this._showingDialog.hide();\n                this._showingDialog = null;\n                this._showingID = null;\n            }\n        ;\n        },\n        _show: function() {\n            var u = this.getActiveID(), v = false;\n            if (this._handlers[u]) {\n                v = true;\n                j.applyWithGuard(this._handlers[u], {\n                }, [u,this,]);\n            }\n             else if (this._defaultHandler) {\n                v = true;\n                j.applyWithGuard(this._defaultHandler, {\n                }, [u,this,]);\n            }\n            \n        ;\n            if ((v && (this._showingID != this.getActiveID()))) {\n                r(this._activeItem);\n            };\n        },\n        _setActiveItem: function(u) {\n            if (h.isEditMode()) {\n                this._clearTimeouts();\n                this._hide();\n                return;\n            }\n        ;\n            if ((u != this._activeItem)) {\n                this._clearTimeouts();\n                (this._activeItem && s(this._activeItem));\n                this._activeItem = null;\n                var v = (u ? 0 : 100);\n                this._hideTimeout = p(function() {\n                    if ((this.getActiveID() != this._showingID)) {\n                        this._hide();\n                    };\n                }.bind(this), v);\n                if (u) {\n                    this._activeItem = u;\n                    var w = (v + 500);\n                    this._showTimeout = p(function() {\n                        this._show();\n                    }.bind(this), w);\n                    this.inform(\"hover\");\n                }\n                 else this.inform(\"leave\");\n            ;\n            }\n        ;\n        },\n        register: function(u, v) {\n            if (!this._handlers[u]) {\n                this._handlers[u] = v;\n                return {\n                    unregister: function() {\n                        if ((u == this._showingID)) {\n                            this._hide();\n                        };\n                        delete this._handlers[u];\n                        var w = this._orderedList.getAllNodes(), x = w[u];\n                        (x && s(x));\n                    }.bind(this)\n                };\n            }\n        ;\n        },\n        registerDefault: function(u) {\n            this._defaultHandler = u;\n        },\n        getActiveID: function() {\n            var u = (this._activeItem && this._orderedList.getUserForNode(this._activeItem));\n            return (u || null);\n        },\n        showHovercard: function(u, v) {\n            if (((u == this.getActiveID()) && (u != this._showingID))) {\n                this._clearTimeouts();\n                s(this._activeItem);\n                this._hide();\n                this._showingDialog = v;\n                this._showingID = u;\n                var w = v.subscribe(\"mouseenter\", this._setActiveItem.bind(this, this._activeItem)), x = v.subscribe(\"mouseleave\", function() {\n                    w.unsubscribe();\n                    this._setActiveItem(null);\n                }.bind(this)), y = v.subscribe(\"hide\", function() {\n                    this.inform(\"hovercard_hide\");\n                    w.unsubscribe();\n                    x.unsubscribe();\n                    y.unsubscribe();\n                }.bind(this));\n                v.enableBehavior(l).setContext(this._activeItem).setPosition(\"left\").show();\n                this.inform(\"hovercard_show\");\n            }\n        ;\n        },\n        setPaused: function(u) {\n            this._paused = u;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatQuietLinks\", [\"Event\",\"DOM\",\"UserAgent\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = {\n    }, m = {\n        silenceLinks: function(q) {\n            n(q, this.removeEmptyHrefs.bind(this));\n        },\n        nukeLinks: function(q) {\n            n(q, this.removeAllHrefs.bind(this));\n        },\n        removeEmptyHrefs: function(q) {\n            o(q, function(r) {\n                return (!r || (r === \"#\"));\n            });\n        },\n        removeAllHrefs: function(q) {\n            o(q);\n        },\n        removeMessagesHrefs: function(q) {\n            o(q, function(r) {\n                return ((!r || (r === \"#\")) || (r.indexOf(\"/messages/\") != -1));\n            });\n        }\n    };\n    function n(q, r) {\n        var s = !!i.chrome(), t = ((!!i.chrome() || (i.ie() >= 9)) || (i.firefox() >= 4));\n        if (l[h.getID(q)]) {\n            return\n        };\n        l[h.getID(q)] = true;\n        if (!t) {\n            return\n        };\n        if (!s) {\n            (r && r(q));\n            return;\n        }\n    ;\n        g.listen(q, \"mouseover\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\");\n            if (w) {\n                var x = w.getAttribute(\"href\");\n                if (p(x)) {\n                    j.set(w, \"stashedHref\", w.getAttribute(\"href\"));\n                    w.removeAttribute(\"href\");\n                }\n            ;\n            }\n        ;\n        });\n        g.listen(q, \"mouseout\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\"), x = (w && j.remove(w, \"stashedHref\"));\n            if (p(x)) {\n                w.setAttribute(\"href\", x);\n            };\n        });\n        g.listen(q, \"mousedown\", function(u) {\n            if (!u.isDefaultRequested()) {\n                return true\n            };\n            var v = k.byTag(u.getTarget(), \"a\"), w = (v && j.get(v, \"stashedHref\"));\n            if (p(w)) {\n                v.setAttribute(\"href\", w);\n            };\n        });\n    };\n    function o(q, r) {\n        var s = h.scry(q, \"a\");\n        if (r) {\n            s = s.filter(function(t) {\n                return r(t.getAttribute(\"href\"));\n            });\n        };\n        s.forEach(function(t) {\n            t.removeAttribute(\"href\");\n            t.setAttribute(\"tabindex\", 0);\n        });\n    };\n    function p(q) {\n        return (q && (q !== \"#\"));\n    };\n    e.exports = m;\n});\n__d(\"ChatSidebarThreadlist.react\", [\"ChatConfig\",\"ChatGroupThreadsController\",\"ChatSidebarConstants\",\"ChatSidebarItem.react\",\"ChatSidebarThread.react\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",\"copyProperties\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfig\"), h = b(\"ChatGroupThreadsController\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarItem.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MercuryParticipants\"), o = b(\"PresenceStatus\"), p = b(\"React\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"fbt\"), t = b(\"ix\"), u = p.createClass({\n        displayName: \"ChatSidebarThreadlist\",\n        render: function() {\n            var v = this.state.threadData, w = this.state.participantData, x = i.IMAGE_SIZE, y = t(\"/images/chat/sidebar/newGroupChat.png\");\n            if (this.props.litestandSidebar) {\n                x = (g.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE);\n                y = (g.get(\"litestand_blended_sidebar\") ? t(\"/images/litestand/sidebar/blended/new_group_chat.png\") : t(\"/images/chat/sidebar/newGroupChatLitestand.png\"));\n            }\n        ;\n            var z = \"New Group Chat...\";\n            z = g.get(\"divebar_group_new_button_name\", z);\n            var aa = [];\n            if (this.props.showNewGroupsButton) {\n                aa.push(p.DOM.li({\n                    className: ((((\"-cx-PRIVATE-fbChatGroupThreadlist__item\") + ((\" \" + \"-cx-PRIVATE-chatSidebarItem__noborder\"))) + ((this.props.offlineItems ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\") : \"\")))),\n                    key: \"new\"\n                }, j({\n                    images: y,\n                    imageSize: x,\n                    litestandSidebar: this.props.litestandSidebar,\n                    name: z\n                })));\n            };\n            var ba = {\n            };\n            for (var ca in v) {\n                var da = v[ca], ea = da.participants.map(function(ia) {\n                    return ((w || {\n                    }))[ia];\n                }).filter(function(ia) {\n                    return ia;\n                }), fa = da.participants.map(function(ia) {\n                    return n.getUserID(ia);\n                }), ga = fa.sort().join(\"|\");\n                if ((!ba[ga] && ea.length)) {\n                    ba[ga] = 1;\n                    var ha = l.getServerThreadIDNow(ca);\n                    aa.push(p.DOM.li({\n                        className: ((((\"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\") + ((\" \" + \"-cx-PRIVATE-fbChatGroupThreadlist__item\"))) + ((this.props.offlineItems ? (\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\") : \"\")))),\n                        \"data-serverthreadid\": ha,\n                        \"data-threadid\": ca,\n                        key: ca\n                    }, k({\n                        image: da.image_src,\n                        imageSize: x,\n                        litestandSidebar: this.props.litestandSidebar,\n                        name: da.name,\n                        participants: ea,\n                        status: o.getGroup(fa),\n                        threadID: ca,\n                        unreadCount: da.unread_count\n                    })));\n                }\n            ;\n            };\n            return p.DOM.ul(null, aa);\n        },\n        getInitialState: function() {\n            return {\n            };\n        },\n        componentWillMount: function() {\n            var v = function() {\n                this.setState(this._calculateState());\n            }.bind(this);\n            this.token = h.subscribe(\"update\", v);\n            v();\n        },\n        componentWillUnmount: function() {\n            (this.token && this.token.unsubscribe());\n            this.token = null;\n        },\n        _calculateState: function() {\n            var v = false, w = {\n            }, x = {\n            }, y = h.getThreadIDs(), z = y.length;\n            y.forEach(function(ba) {\n                m.getThreadMeta(ba, function(ca) {\n                    x[ba] = ca;\n                    n.getMulti(ca.participants, function(da) {\n                        delete da[n.user];\n                        if (v) {\n                            this.setState(this._calculateState());\n                        }\n                         else q(w, da);\n                    ;\n                        z--;\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n            if ((z === 0)) {\n                return {\n                    threadData: x,\n                    participantData: w\n                };\n            }\n             else {\n                v = true;\n                var aa = (this.state || {\n                });\n                return {\n                    threadData: q(aa.threadData, x),\n                    participantData: q(aa.participantData, w)\n                };\n            }\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"runAfterScrollingStops\", [\"Arbiter\",\"Event\",\"Run\",\"debounceAcrossTransitions\",\"emptyFunction\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"Event\"), i = b(\"Run\"), j = b(\"debounceAcrossTransitions\"), k = b(\"emptyFunction\"), l = b(\"throttle\");\n    function m(x, y, z) {\n        if ((y && p[y])) {\n            return\n        };\n        if (!o) {\n            g.subscribe(\"page_transition\", w);\n            o = true;\n        }\n    ;\n        if (!n) {\n            x();\n            return;\n        }\n    ;\n        (y && (p[y] = 1));\n        q.push(x);\n        if (!z) {\n            if (s) {\n                i.onLeave(w);\n                s = false;\n            }\n        ;\n            r.push((q.length - 1));\n        }\n    ;\n    };\n    var n, o, p = {\n    }, q = [], r = [], s = true, t = 500, u = j(function() {\n        n = false;\n        var x = q;\n        q = [];\n        r = [];\n        p = {\n        };\n        for (var y = 0, z = x.length; (y < z); ++y) {\n            x[y]();;\n        };\n    }, t);\n    function v() {\n        n = true;\n        u();\n    };\n    function w() {\n        var x = r;\n        r = [];\n        s = true;\n        for (var y = 0, z = x.length; (y < z); ++y) {\n            q[x[y]] = k;;\n        };\n    };\n    h.listen(window, \"scroll\", l.acrossTransitions(v, 250));\n    e.exports = m;\n});\n__d(\"ChatOrderedList\", [\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"CSS\",\"ChannelImplementation\",\"Chat\",\"ChatConfig\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatFavoriteNux\",\"ChatGroupThreadsController\",\"ChatOrderedListHover\",\"ChatQuietLinks\",\"ChatSidebarThreadlist.react\",\"ChatTypeaheadConstants\",\"ChatVisibility\",\"DOM\",\"DataStore\",\"Ease\",\"Event\",\"ImageSourceRequest\",\"ImageSourceType\",\"JSLogger\",\"JSXDOM\",\"LastMobileActiveTimes\",\"MercuryParticipantTypes\",\"MercuryThreadInformer\",\"MercuryThreads\",\"OrderedFriendsList\",\"Parent\",\"PhotoResizeModeConst\",\"PresencePrivacy\",\"PresenceStatus\",\"React\",\"Rect\",\"ShortProfiles\",\"Style\",\"Tooltip\",\"TokenizeUtil\",\"URI\",\"Vector\",\"XHPTemplate\",\"copyProperties\",\"createObjectFrom\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"guid\",\"requestAnimationFrame\",\"runAfterScrollingStops\",\"shield\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AvailableList\"), m = b(\"AvailableListConstants\"), n = b(\"Bootloader\"), o = b(\"CSS\"), p = b(\"ChannelImplementation\").instance, q = b(\"Chat\"), r = b(\"ChatConfig\"), s = b(\"ChatContexts\"), t = b(\"ChatFavoriteList\"), u = b(\"ChatFavoriteNux\"), v = b(\"ChatGroupThreadsController\"), w = b(\"ChatOrderedListHover\"), x = b(\"ChatQuietLinks\"), y = b(\"ChatSidebarThreadlist.react\"), z = b(\"ChatTypeaheadConstants\"), aa = b(\"ChatVisibility\"), ba = b(\"DOM\"), ca = b(\"DataStore\"), da = b(\"Ease\"), ea = b(\"Event\"), fa = b(\"ImageSourceRequest\"), ga = b(\"ImageSourceType\"), ha = b(\"JSLogger\"), ia = b(\"JSXDOM\"), ja = b(\"LastMobileActiveTimes\"), ka = b(\"MercuryParticipantTypes\"), la = b(\"MercuryThreadInformer\").get(), ma = b(\"MercuryThreads\").get(), na = b(\"OrderedFriendsList\"), oa = b(\"Parent\"), pa = b(\"PhotoResizeModeConst\"), qa = b(\"PresencePrivacy\"), ra = b(\"PresenceStatus\"), sa = b(\"React\"), ta = b(\"Rect\"), ua = b(\"ShortProfiles\"), va = b(\"Style\"), wa = b(\"Tooltip\"), xa = b(\"TokenizeUtil\"), ya = b(\"URI\"), za = b(\"Vector\"), ab = b(\"XHPTemplate\"), bb = b(\"copyProperties\"), cb = b(\"createObjectFrom\"), db = b(\"csx\"), eb = b(\"cx\"), fb = b(\"debounceAcrossTransitions\"), gb = b(\"guid\"), hb = b(\"requestAnimationFrame\"), ib = b(\"runAfterScrollingStops\"), jb = b(\"shield\"), kb = b(\"throttle\"), lb = b(\"tx\"), mb = r.get(\"chat_ranked_by_coefficient\", 0), nb = null, ob, pb, qb = 9;\n    function rb(yb, zb, ac, bc, cc, dc) {\n        this._isSidebar = yb;\n        this._isLitestand = (r.get(\"litestand\", 0) || r.get(\"test_litestand_sidebar\", 0));\n        this._isLitestandSidebar = (this._isSidebar && this._isLitestand);\n        this._isLeftCollapsedSidebar = !!oa.byClass(zb, \"-cx-PUBLIC-litestandLeftSidebar__root\");\n        this._root = zb;\n        this._itemsMap = {\n        };\n        this._isVisible = false;\n        this._excludedIds = {\n        };\n        this._numTopFriends = 5;\n        this._hasRendered = false;\n        this._preventRendering = false;\n        this._hoverController = null;\n        this._template = ac;\n        this._messageTemplate = bc;\n        this._favoriteMode = r.get(\"divebar_favorite_list\", 0);\n        this._contextualDialog = cc;\n        this._cachedItemHeight = null;\n        this._cachedItemPadding = null;\n        if ((dc && ba.scry(dc, \".-cx-PRIVATE-litestandSidebarPYMK__unit\").length)) {\n            o.show(dc);\n            this._pymk = dc;\n        }\n    ;\n        this._usePlaceholder = (this._isLitestand && this._isSidebar);\n        if (r.get(\"groups_in_divebar\")) {\n            this._groupThreadsNode = ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupthreads\"\n            });\n            this._updateGroupThreads();\n            this._groupsList = (this._favoriteMode && ba.find(this._root, \".-cx-PRIVATE-fbChat__groupslist\"));\n        }\n    ;\n        if (this._favoriteMode) {\n            this._favoriteSidebar = ba.find(this._root, \".-cx-PUBLIC-fbChatOrderedList__favoritesidebar\");\n            this._editButton = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__friendsstickyarea .-cx-PRIVATE-fbChat__editbutton\")[0];\n            this._favoriteList = ba.find(this._root, \".-cx-PRIVATE-fbChat__favoritelist\");\n            this._activeNowList = ba.find(this._root, \".-cx-PRIVATE-fbChat__activenowlist\");\n            this._activeNowLabel = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__activenowlabel\")[0];\n            if (this._activeNowLabel) {\n                this._activeNowArea = oa.byClass(this._activeNowLabel, \"-cx-PRIVATE-fbChatOrderedList__activenowlabelcontainer\");\n            };\n        }\n    ;\n        this._orderedList = ba.find(this._root, \".fbChatOrderedList\");\n        this._scrollableOrderedList = oa.byClass(this._root, \"scrollableOrderedList\");\n        this._chatSidebar = oa.byClass(this._root, \"fbChatSidebar\");\n        this._scrollableArea = oa.byClass(this._root, \"scrollable\");\n        ea.listen(this._root, \"click\", this._onClick.bind(this));\n        ea.listen(this._root, \"mouseenter\", this._mouseEnter.bind(this));\n        ea.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        if (this._editButton) {\n            ea.listen(this._editButton, \"click\", this.toggleEditMode.bind(this));\n            h.subscribe([\"LitestandSidebarBookmarks/close\",\"LitestandSidebar/collapse\",], this._onEditEnd.bind(this));\n        }\n    ;\n        h.subscribe([\"LitestandSidebar/collapse\",\"LitestandSidebar/expand\",], function(event) {\n            if (this._isLitestandSidebar) {\n                this.getHoverController().setPaused((event === \"LitestandSidebar/collapse\"));\n            };\n            this.render();\n        }.bind(this));\n        l.subscribe(m.ON_AVAILABILITY_CHANGED, jb(this.update, this));\n        qa.subscribe(\"privacy-changed\", jb(this.update, this));\n        p.subscribe([p.CONNECTED,p.RECONNECTING,p.SHUTDOWN,p.MUTE_WARNING,p.UNMUTE_WARNING,], jb(this.update, this));\n        this.inform(\"initialized\", this, h.BEHAVIOR_PERSISTENT);\n        this.render();\n        h.subscribe(ha.DUMP_EVENT, function(ec, fc) {\n            fc.chat_lists = (fc.chat_lists || {\n                sorted_list: this.getCachedSortedList(),\n                ordered_list: na.getList(),\n                available_list: rb.getAvailableList(this._excludedIds),\n                excluded_list: this._excludedIds\n            });\n        }.bind(this));\n        h.subscribe(\"ChatOrderedList/itemHeightChange\", function() {\n            this._cachedItemHeight = null;\n            this._cachedItemPadding = null;\n        }.bind(this));\n        this._renderUnreadCount = r.get(\"divebar_message_count\");\n        if (this._renderUnreadCount) {\n            la.subscribe(\"threads-updated\", function(ec, fc) {\n                for (var gc in fc) {\n                    var hc = ma.getCanonicalUserInThread(gc);\n                    if (((!this._renderedTopUsers || !((hc in this._renderedTopUsers))) || !this._itemsMap[hc])) {\n                        continue;\n                    };\n                    ma.getThreadMeta(gc, function(ic) {\n                        var jc = (ic && ic.unread_count);\n                        this._updateUnreadCount(hc, jc);\n                    }.bind(this));\n                };\n            }.bind(this));\n        };\n    };\n    function sb(yb, zb) {\n        var ac = tb(yb, zb);\n        if ((ac !== 0)) {\n            return ac\n        };\n        if (!mb) {\n            var bc = wb(yb, zb);\n            if ((bc !== 0)) {\n                return bc\n            };\n        }\n    ;\n        return na.compare(yb, zb);\n    };\n    function tb(yb, zb) {\n        var ac = qa.allows(yb), bc = qa.allows(zb);\n        if ((ac !== bc)) {\n            return (ac ? -1 : 1)\n        };\n        return 0;\n    };\n    var ub = {\n    };\n    function vb(yb) {\n        return (ub[yb] || (ub[yb] = xa.flatten(yb)));\n    };\n    function wb(yb, zb) {\n        var ac = ua.getNowUnsafe(yb), bc = ua.getNowUnsafe(zb), cc = vb((((ac || {\n        })).name || \"~\")), dc = vb((((bc || {\n        })).name || \"~\"));\n        if ((cc !== dc)) {\n            return ((cc < dc) ? -1 : 1)\n        };\n        return 0;\n    };\n    function xb(yb, zb) {\n        var ac = (l.get(yb) === m.MOBILE), bc = (l.get(zb) === m.MOBILE);\n        if ((ac !== bc)) {\n            return (bc ? -1 : 1)\n        };\n        return wb(yb, zb);\n    };\n    bb(rb, {\n        CONTEXT_CLASSES: {\n            nearby: \"-cx-PRIVATE-fbChatOrderedList__contextnearby\",\n            visiting: \"-cx-PRIVATE-fbChatOrderedList__contextvisiting\",\n            neighbourhood: \"-cx-PRIVATE-fbChatOrderedList__contextneighbourhood\",\n            listening: \"-cx-PRIVATE-fbChatOrderedList__contextlistening\"\n        },\n        getSortedList: function(yb, zb) {\n            var ac = na.getList().filter(function(dc) {\n                return (!((dc in yb)) && (qa.getFriendVisibility(dc) !== qa.BLACKLISTED));\n            }), bc = [];\n            if (!aa.isOnline()) {\n                Array.prototype.push.apply(bc, ac);\n            }\n             else {\n                if ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)) {\n                    ac = this._filterByWhitelist(ac);\n                };\n                if (r.get(\"chat_web_ranking_with_presence\")) {\n                    Array.prototype.push.apply(bc, ac);\n                }\n                 else bc = this._splitOutTopFriends(ac, zb);\n            ;\n            }\n        ;\n            bc = bc.slice(0, zb);\n            if ((bc.length === zb)) {\n                var cc = rb.getAvailableList(bc.concat(yb)).length;\n                (cc && bc.splice(-1));\n            }\n        ;\n            if (!r.get(\"chat_web_ranking_with_presence\")) {\n                bc.sort(sb);\n            };\n            nb = bc.slice();\n            return bc;\n        },\n        _filterByWhitelist: function(yb) {\n            var zb = yb, ac = {\n            }, bc, cc;\n            yb = [];\n            for (bc = 0; (bc < zb.length); ++bc) {\n                cc = zb[bc];\n                if (qa.allows(cc)) {\n                    ac[cc] = true;\n                    yb.push(cc);\n                }\n            ;\n            };\n            var dc = qa.getWhitelist();\n            for (bc = 0; (bc < dc.length); ++bc) {\n                cc = dc[bc];\n                if (!((cc in ac))) {\n                    yb.push(cc);\n                };\n            };\n            for (bc = 0; (bc < zb.length); ++bc) {\n                cc = zb[bc];\n                if (!qa.allows(cc)) {\n                    yb.push(cc);\n                };\n            };\n            return yb;\n        },\n        _splitOutTopFriends: function(yb, zb) {\n            var ac = [], bc = [], cc = r.get(\"ordered_list.top_friends\", 0), dc = r.get(\"ordered_list.top_mobile\", 0), ec = zb, fc = yb.length;\n            for (var gc = 0; ((gc < fc) && (ec > 0)); gc++) {\n                var hc = yb[gc], ic = l.get(hc), jc = (ic === m.ACTIVE);\n                if (((jc || (((ic === m.MOBILE) && (gc < dc)))) || (gc < cc))) {\n                    ac.push(hc);\n                    (jc && ec--);\n                }\n                 else bc.push(hc);\n            ;\n            };\n            if ((gc < fc)) {\n                Array.prototype.push.apply(bc, yb.slice(gc));\n            };\n            if ((ac.length < zb)) {\n                Array.prototype.push.apply(ac, bc);\n            };\n            return ac;\n        },\n        getAvailableList: function(yb) {\n            var zb;\n            if ((r.get(\"divebar_show_mobile_more_friends\") || r.get(\"divebar_show_mobile_more_friends_alphabetical\"))) {\n                zb = l.getAvailableIDs();\n            };\n            if (!zb) {\n                zb = l.getOnlineIDs();\n            };\n            return zb.filter(function(ac) {\n                return !((ac in yb));\n            });\n        },\n        _pause: function() {\n            pb = true;\n        },\n        _unpause: function() {\n            pb = false;\n        },\n        _registerToggleRenderItem: function(yb) {\n            ea.listen(yb, \"click\", function() {\n                pb = !pb;\n                o.conditionClass(yb, \"checked\", pb);\n            });\n        }\n    });\n    bb(rb.prototype, i, {\n        getAllNodes: function() {\n            var yb = {\n            }, zb = ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\");\n            for (var ac = 0; (ac < zb.length); ac++) {\n                var bc = ca.get(zb[ac], \"id\");\n                if (bc) {\n                    yb[bc] = zb[ac];\n                };\n            };\n            return yb;\n        },\n        getShowingUsers: function() {\n            return ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item,li.-cx-PRIVATE-fbChatGroupThreadlist__groupchat\").map(this.getUserForNode);\n        },\n        getUserForNode: function(yb) {\n            return (ca.get(yb, \"id\") || ca.get(yb, \"serverthreadid\"));\n        },\n        getHoverController: function() {\n            if (!this._hoverController) {\n                this._hoverController = new w(this, this._contextualDialog);\n                if ((this._isLitestandSidebar && this._isLitestandSidebarCollapsed())) {\n                    this._hoverController.setPaused(true);\n                };\n            }\n        ;\n            return this._hoverController;\n        },\n        _isLitestandSidebarCollapsed: function() {\n            if (this._isLeftCollapsedSidebar) {\n                return true\n            };\n            if (ob) {\n                return !ob.isExpanded()\n            };\n            n.loadModules([\"LitestandSidebar\",], function(yb) {\n                ob = yb;\n            });\n            return o.hasClass(document.documentElement, \"-cx-PUBLIC-hasLitestandBookmarksSidebar__collapsed\");\n        },\n        getPaddingOffset: function() {\n            return (this._favoriteMode ? 24 : 8);\n        },\n        _calculateItemMeasurements: function() {\n            var yb = this._orderedList, zb = this._template.build(), ac = zb.getRoot();\n            ba.setContent(zb.getNode(\"name\"), \"test\");\n            if (this._favoriteSidebar) {\n                yb = this._favoriteList;\n                o.addClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            }\n        ;\n            ac.style.visibility = \"hidden\";\n            ba.appendContent(yb, ac);\n            this._cachedItemHeight = za.getElementDimensions(ac).y;\n            this._cachedItemPadding = (va.getFloat(zb.getNode(\"anchor\"), \"padding\") || 0);\n            ba.remove(ac);\n            if (this._favoriteSidebar) {\n                o.removeClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            };\n        },\n        getItemHeight: function() {\n            if ((this._cachedItemHeight === null)) {\n                this._calculateItemMeasurements();\n            };\n            return this._cachedItemHeight;\n        },\n        getItemPadding: function() {\n            if ((this._cachedItemPadding === null)) {\n                this._calculateItemMeasurements();\n            };\n            return this._cachedItemPadding;\n        },\n        _updateGroupThreads: function() {\n            if (this._groupThreadsNode) {\n                var yb = qa.getVisibility(), zb = y({\n                    offlineItems: (p.disconnected() || !yb),\n                    litestandSidebar: ((this._isSidebar && this._isLitestand) && !r.get(\"test_old_divebar\")),\n                    showNewGroupsButton: r.get(\"divebar_has_new_groups_button\", false)\n                });\n                sa.renderComponent(zb, this._groupThreadsNode);\n            }\n        ;\n        },\n        _placeholderUpdate: function() {\n            if ((!this._usePlaceholder || !this._scrollContainer)) {\n                return\n            };\n            var yb = (this._root.offsetTop - this._scrollContainer.scrollTop);\n            this._scrollContainerHeight = (this._scrollContainerHeight || this._scrollContainer.offsetHeight);\n            var zb = this.getItemHeight(), ac = Math.ceil((this._scrollContainerHeight / zb)), bc = ((yb < 0) ? Math.max((Math.floor((-yb / zb)) - ac), 0) : 0), cc = ((bc + ac) + ac);\n            this._cachedItems = (this._cachedItems || ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\"));\n            for (var dc = 0, ec = this._cachedItems.length; (dc < ec); dc++) {\n                o.conditionClass(this._cachedItems[dc], \"-cx-PRIVATE-fbChatOrderedList__hiddenitem\", ((dc < bc) || (dc > cc)));;\n            };\n        },\n        _getListItem: function(yb, zb) {\n            var ac = this._itemsMap[yb];\n            if (!ac) {\n                return\n            };\n            var bc = l.get(yb), cc = ra.isBirthday(yb), dc = (qa.allows(yb) && !p.disconnected());\n            if ((ac.buttonNode === undefined)) {\n                ac.buttonNode = ba.scry(ac.node, \".-cx-PRIVATE-fbChat__favoritebutton\")[0];\n                ac.contextNode = ba.find(ac.node, \".-cx-PRIVATE-fbChatOrderedList__context\");\n                ac.timeNode = ba.scry(ac.node, \".active_time\")[0];\n                ac.statusNodes = ba.scry(ac.node, \"img.status\");\n            }\n        ;\n            o.conditionClass(ac.node, \"-cx-PRIVATE-fbChatOrderedList__isfavorite\", zb);\n            o.conditionClass(ac.node, \"-cx-PRIVATE-fbChat__isfavorite\", zb);\n            o.conditionClass(ac.node, \"-cx-PRIVATE-litestandSidebarFavorites__favorite\", (this._isLitestand && zb));\n            if (ac.buttonNode) {\n                if (!this._isLitestand) {\n                    o.conditionClass(ac.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__remove\", zb);\n                    o.conditionClass(ac.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__add\", !zb);\n                }\n            \n            };\n            var ec = {\n                active: false,\n                mobile: false,\n                birthday: false\n            };\n            ec.active = (bc === m.ACTIVE);\n            ec.mobile = (bc === m.MOBILE);\n            ec.birthday = cc;\n            if (ec.mobile) {\n                var fc = ja.getShortDisplay(yb);\n                if ((ac.timeNode && (ac.lastActiveTime !== fc))) {\n                    ac.lastActiveTime = fc;\n                    ba.setContent(ac.timeNode, fc);\n                }\n            ;\n            }\n             else if (ac.lastActiveTime) {\n                ac.lastActiveTime = null;\n                ba.empty(ac.timeNode);\n            }\n            \n        ;\n            for (var gc in ec) {\n                o.conditionClass(ac.node, gc, (ec[gc] && dc));;\n            };\n            o.conditionClass(ac.node, \"invis\", !dc);\n            ac.statusNodes.forEach(function(hc) {\n                if (((bc === m.ACTIVE) && dc)) {\n                    hc.alt = \"Online\";\n                }\n                 else if (((bc === m.MOBILE) && dc)) {\n                    hc.alt = \"Mobile\";\n                }\n                 else hc.alt = \"\";\n                \n            ;\n            });\n            this._applyContext(yb, ac);\n            return ac.node;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getSortedList: function(yb) {\n            return rb.getSortedList((yb || this._excludedIds), this._numTopFriends);\n        },\n        getCachedSortedList: function(yb) {\n            if ((nb == null)) {\n                nb = this.getSortedList(yb);\n            };\n            return nb;\n        },\n        toggleFavoriteSidebar: function(yb, zb) {\n            function ac(dc, ec) {\n                o.conditionShow(ec, dc);\n                var fc = oa.byClass(ec, \"uiContextualLayerPositioner\");\n                (fc && o.conditionShow(fc, dc));\n            };\n            o.conditionShow(this._orderedList, !yb);\n            if (this._favoriteSidebar) {\n                o.conditionShow(this._favoriteSidebar, yb);\n            };\n            var bc = ba.scry((this._scrollableOrderedList || this._root), \".-cx-PRIVATE-fbChatOrderedList__stickyarea\");\n            bc.forEach(ac.curry(yb));\n            var cc = ba.scry((this._scrollableOrderedList || this._root), \".-cx-PRIVATE-fbChatOrderedList__groupsstickyarea\");\n            (cc.length && ac(zb, cc[0]));\n        },\n        hide: function() {\n            if (!this._isVisible) {\n                return\n            };\n            this._isVisible = false;\n            u.tryHide();\n            o.hide((this._scrollableOrderedList || this._root));\n            this.inform(\"hide\");\n        },\n        _onFavoriteOrderChange: function() {\n            var yb = this.sortableGroup.getOrder();\n            t.updateList(yb);\n            t.save();\n        },\n        _getFavoriteItems: function() {\n            var yb = [], zb = t.get();\n            for (var ac = 0; (ac < zb.length); ac++) {\n                var bc = this._itemsMap[zb[ac]];\n                if (bc) {\n                    yb.push(bc.node);\n                };\n            };\n            return yb;\n        },\n        _getChatTabOpenLogData: function(yb) {\n            var zb = o.hasClass(document.documentElement, \"sidebarMode\"), ac = {\n                mode: (zb ? \"sidebar\" : \"chatNub\"),\n                typehead: false\n            };\n            if ((this._scrollableArea && this._scrollContainer)) {\n                var bc = za.getElementPosition(this._scrollableArea, \"viewport\").y, cc = za.getElementPosition(yb, \"viewport\").y, dc = this._scrollContainer.scrollTop;\n                if ((cc > bc)) {\n                    ac.visible_slot = Math.round((((cc - bc)) / 32));\n                    var ec = Math.round((dc / 32));\n                    ac.global_slot = (ac.visible_slot + ec);\n                }\n            ;\n            }\n        ;\n            if (zb) {\n                ac.sidebar_height = (this._chatSidebar && this._chatSidebar.clientHeight);\n                if (this._scrollContainer) {\n                    ac.buddylist_height = this._scrollContainer.clientHeight;\n                };\n            }\n        ;\n            return ac;\n        },\n        _resetFavoriteBounds: function() {\n            var yb = t.get(), zb = yb.length;\n            if (zb) {\n                var ac = yb[0], bc = yb[(zb - 1)], cc = this._itemsMap[ac], dc = this._itemsMap[bc], ec = new ta(za.getElementPosition(cc.node).y, 0, (za.getElementPosition(dc.node).y + za.getElementDimensions(dc.node).y), 0);\n                this.sortableGroup.setBoundingBox(ec);\n            }\n        ;\n        },\n        _createSortableGroup: function() {\n            if (this.sortableGroup) {\n                this.sortableGroup.destroy();\n            };\n            n.loadModules([\"SortableGroup\",], function(yb) {\n                this.sortableGroup = new yb().setBeforeGrabCallback(this._resetFavoriteBounds.bind(this)).setOrderChangeHandler(this._onFavoriteOrderChange.bind(this));\n                if (this._isLitestand) {\n                    this.sortableGroup.gutter = 1;\n                };\n                var zb = this._getFavoriteItems();\n                for (var ac = 0; (ac < zb.length); ac++) {\n                    var bc = zb[ac];\n                    this.sortableGroup.addSortable(ca.get(bc, \"id\"), bc);\n                };\n            }.bind(this));\n        },\n        toggleEditMode: function() {\n            u.dismissDialog();\n            t.toggleEditMode();\n            if (t.isEditMode()) {\n                this._createSortableGroup();\n                ba.setContent(this._editButton, \"DONE\");\n                o.addClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n                this.inform(\"editStart\");\n            }\n             else this._onEditEnd();\n        ;\n        },\n        _onEditEnd: function() {\n            if (t.isEditMode()) {\n                t.toggleEditMode();\n            };\n            ba.setContent(this._editButton, \"EDIT\");\n            o.removeClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n            this.inform(\"editEnd\");\n        },\n        _onClick: function(event) {\n            var yb = event.getTarget(), zb = oa.byTag(yb, \"li\");\n            if (t.isEditMode()) {\n                var ac = oa.byClass(yb, \"-cx-PRIVATE-fbChat__favoritebutton\");\n                if ((ac && zb)) {\n                    var bc = ca.get(zb, \"id\");\n                    if (bc) {\n                        t.toggleID(bc);\n                        t.save();\n                    }\n                ;\n                    this.update();\n                }\n            ;\n                event.prevent();\n                return false;\n            }\n        ;\n            if (zb) {\n                if (o.hasClass(zb, \"blackbirdWhitelist\")) {\n                    var cc = new ya(\"/ajax/chat/privacy/settings_dialog.php\").addQueryData({\n                        ref: \"whitelist_separator\"\n                    });\n                    j.send(new k(cc));\n                    event.prevent();\n                    return false;\n                }\n            ;\n                var dc = ca.get(zb, \"id\"), ec = o.hasClass(zb, \"-cx-PRIVATE-fbChatGroupThreadlist__item\");\n                if ((dc || ec)) {\n                    var fc = this._getChatTabOpenLogData(zb), gc = o.hasClass(document.documentElement, \"sidebarMode\"), hc = (qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST), ic = (hc ? \"white_list\" : \"ordered_list\");\n                    if (ec) {\n                        dc = zb.getAttribute(\"data-threadid\");\n                        ic = (dc ? \"recent_threads_in_divebar\" : \"recent_threads_in_divebar_new\");\n                    }\n                     else if (((gc && this._favoriteMode) && !hc)) {\n                        while (zb.parentNode) {\n                            zb = zb.parentNode;\n                            if (o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__activenowlist\")) {\n                                ic = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                            if (o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__favoritelist\")) {\n                                break;\n                            };\n                        };\n                    }\n                     else while (zb.previousSibling) {\n                        zb = zb.previousSibling;\n                        if (o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\")) {\n                            if (o.hasClass(zb, \"moreOnlineFriends\")) {\n                                ic = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                            if (o.hasClass(zb, \"blackbirdWhitelist\")) {\n                                ic = \"blackbird_offline_section\";\n                                break;\n                            }\n                        ;\n                        }\n                    ;\n                    }\n                    \n                ;\n                    fc.source = ic;\n                    var jc = (ec ? z.THREAD_TYPE : ka.FRIEND);\n                    q.openTab(dc, jc, fc);\n                    this.inform(\"click\", {\n                        id: dc\n                    });\n                }\n                 else if ((o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\") && oa.byClass(yb, \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"))) {\n                    this.scrollTo(zb);\n                }\n                 else if (o.hasClass(zb, \"-cx-PRIVATE-litestandSidebarPYMK__root\")) {\n                    return\n                }\n                \n            ;\n                return false;\n            }\n        ;\n        },\n        _mouseEnter: function() {\n            this._preventRendering = true;\n        },\n        _mouseLeave: function() {\n            this._preventRendering = false;\n        },\n        setExcludedIds: function(yb) {\n            this._excludedIds = cb((yb || []));\n        },\n        setNumTopFriends: function(yb) {\n            if ((yb !== this._numTopFriends)) {\n                this._numTopFriends = yb;\n                this.render();\n            }\n        ;\n        },\n        _getOfflineToSectionItems: function() {\n            var yb = (\"subheader-text-\" + gb()), zb = ba.create(\"a\", {\n                href: \"#\",\n                \"aria-describedby\": yb\n            }, ba.tx._(\"Edit\")), ac = [], bc = ba.tx._(\"MORE FRIENDS\");\n            ac.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n            }, bc), ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n            }))))));\n            ac.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator blackbirdWhitelist\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorInner\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorSubheader\"\n            }, ia.span({\n                id: yb,\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorsubheadertext\"\n            }, lb._(\"These friends can't see you on chat. {=link}\", {\n                \"=link\": zb\n            })))))));\n            return ac;\n        },\n        _renderOrderedList: function() {\n            if (((!this._isVisible || ((this._preventRendering && this._hasRendered))) || pb)) {\n                return\n            };\n            this._hasRendered = true;\n            this._cachedItems = null;\n            var yb = [], zb, ac, bc = false, cc = false, dc = r.get(\"divebar_has_new_groups_button\", false), ec = o.hasClass(document.documentElement, \"sidebarMode\"), fc = qa.getVisibility(), gc = (qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST), hc = (this._isLitestandSidebar && this._isLitestandSidebarCollapsed()), ic = r.get(\"groups_in_divebar\");\n            (ic && this._updateGroupThreads());\n            var jc = (ic && v.getThreadIDs().length), kc = (((ec && this._favoriteMode) && fc) && !gc);\n            if ((((kc && ic) && jc) && this._groupThreadsNode)) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                x.nukeLinks(this._groupThreadsNode);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n        ;\n            var lc = ((kc && this._groupThreadsNode) && this._groupsList), mc = (lc && jc), nc = (this._isLitestand && !oa.byClass(this._root, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\"));\n            if ((lc && ((jc || (nc && dc))))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                o.show(this._groupsList);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n             else (this._groupsList && o.hide(this._groupsList));\n        ;\n            var oc = (jc || 0);\n            if ((dc && ((mc || !kc)))) {\n                oc++;\n            };\n            var pc = [], qc, rc;\n            if (kc) {\n                (this._chatSidebar && o.addClass(this._chatSidebar, \"fbSidebarFavoriteList\"));\n                pc = t.get();\n                if (hc) {\n                    pc = pc.slice(0, Math.max(0, (this._numTopFriends - oc)));\n                };\n                for (qc = 0, rc = pc.length; (qc < rc); qc++) {\n                    zb = pc[qc];\n                    ac = this._getListItem(zb, true);\n                    if (ac) {\n                        yb.push(ac);\n                    }\n                     else {\n                        cc = true;\n                        this._renderListItem(zb, this.update.bind(this));\n                    }\n                ;\n                };\n            }\n        ;\n            this.toggleFavoriteSidebar(kc, mc);\n            var sc = (hc ? 1 : 0), tc = rb.getSortedList(cb(pc), Math.max(0, (((this._numTopFriends - pc.length) - oc) + sc)));\n            if (kc) {\n                if ((pc.length && tc.length)) {\n                    var uc = ba.create(\"li\", {\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separator\"\n                    });\n                    yb.push(uc);\n                }\n            ;\n            }\n             else if ((jc || dc)) {\n                (this._groupThreadsNode && yb.push(this._groupThreadsNode));\n            }\n        ;\n            var vc = (qa.getVisibility() && (qa.getOnlinePolicy() == qa.ONLINE_TO_WHITELIST));\n            for (var wc = 0, xc = tc.length; (wc < xc); wc++) {\n                zb = tc[wc];\n                if (vc) {\n                    if (!qa.allows(zb)) {\n                        if (((wc + 2) >= tc.length)) {\n                            break;\n                        };\n                        vc = false;\n                        var yc = this._getOfflineToSectionItems();\n                        yb.push(yc[0]);\n                        yb.push(yc[1]);\n                        xc -= 2;\n                    }\n                \n                };\n                ac = this._getListItem(zb);\n                if (ac) {\n                    yb.push(ac);\n                }\n                 else this._renderListItem(zb, this.render.bind(this));\n            ;\n            };\n            if (kc) {\n                ba.setContent(this._favoriteList, yb);\n                if (yb.length) {\n                    x.nukeLinks(this._favoriteList);\n                };\n                this.inform(\"render\");\n            }\n        ;\n            var zc;\n            if (hc) {\n                zc = [];\n            }\n             else zc = rb.getAvailableList(this._excludedIds);\n        ;\n            var ad = pc.concat(tc), bd = cb(ad);\n            zc = zc.filter(function(jd) {\n                return !((jd in bd));\n            });\n            if (this._renderUnreadCount) {\n                var cd = [];\n                if (this._renderedTopUsers) {\n                    var dd = Object.keys(this._renderedTopUsers).filter(function(jd) {\n                        return !((jd in bd));\n                    });\n                    dd.forEach(function(jd) {\n                        this._updateUnreadCount(jd, 0);\n                    }.bind(this));\n                    ad.forEach(function(jd) {\n                        if (!((jd in this._renderedTopUsers))) {\n                            cd.push(jd);\n                        };\n                    }.bind(this));\n                }\n                 else cd = ad;\n            ;\n                cd.forEach(function(jd) {\n                    ma.getThreadMeta(ma.getThreadIdForUser(jd), function(kd) {\n                        this._updateUnreadCount(jd, (kd && kd.unread_count));\n                    }.bind(this));\n                }.bind(this));\n                this._renderedTopUsers = bd;\n            }\n        ;\n            if (r.get(\"divebar_show_mobile_more_friends_alphabetical\")) {\n                zc.sort(wb);\n            }\n             else zc.sort(xb);\n        ;\n            var ed = \"MORE FRIENDS\";\n            if (kc) {\n                yb = [];\n            }\n             else if ((zc.length && yb.length)) {\n                var fd;\n                if (this._isLitestand) {\n                    fd = ia.span(null, ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                    }, ed, \" \\u00b7 \", zc.length), ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                    }, \" +\", zc.length));\n                }\n                 else fd = lb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                    \"MORE ONLINE FRIENDS\": ed,\n                    \"=count\": zc.length\n                });\n            ;\n                if (this._pymk) {\n                    bc = true;\n                    yb.push(this._pymk);\n                }\n            ;\n                yb.push(ia.li({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator moreOnlineFriends\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n                }, fd), ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n                }))))));\n            }\n            \n        ;\n            for (qc = 0, rc = zc.length; (qc < rc); qc++) {\n                zb = zc[qc];\n                ac = this._getListItem(zb);\n                if (ac) {\n                    yb.push(ac);\n                }\n                 else this._renderListItem(zb, this.render.bind(this));\n            ;\n            };\n            if (((!tc.length && !zc.length) && !oc)) {\n                var gd = this._messageTemplate.render(), hd = ab.getNode(gd, \"message\");\n                ba.setContent(hd, \"No one is available to chat.\");\n                yb.push(gd);\n            }\n        ;\n            if (yb.length) {\n                if (kc) {\n                    o.show(this._activeNowList);\n                    if (this._activeNowLabel) {\n                        var id;\n                        o.show(this._activeNowArea);\n                        if (this._isLitestand) {\n                            id = ia.span(null, ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                            }, ed, \" \\u00b7 \", zc.length), ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                            }, \" +\", zc.length));\n                        }\n                         else id = lb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                            \"MORE ONLINE FRIENDS\": \"ACTIVE NOW\",\n                            \"=count\": zc.length\n                        });\n                    ;\n                        ba.setContent(this._activeNowLabel, id);\n                    }\n                ;\n                    ba.setContent(this._activeNowList, yb);\n                    x.nukeLinks(this._activeNowList);\n                }\n                 else {\n                    if ((this._pymk && !bc)) {\n                        yb.push(this._pymk);\n                    };\n                    ba.setContent(this._orderedList, yb);\n                    if (this._pymk) {\n                        x.removeMessagesHrefs(this.getRoot());\n                    }\n                     else x.nukeLinks(this.getRoot());\n                ;\n                }\n            ;\n                this.inform(\"render\");\n                this._placeholderUpdate();\n                if (!this._renderingAfterScroll) {\n                    this._renderingAfterScroll = true;\n                    this.render = fb(ib.curry(this._renderOrderedList.bind(this), \"ChatOrderedList/render\", true), 300);\n                }\n            ;\n            }\n             else if (kc) {\n                o.hide(this._activeNowList);\n                if (this._activeNowArea) {\n                    o.hide(this._activeNowArea);\n                };\n            }\n            \n        ;\n            if (kc) {\n                (this._editButton && u.tryShow(this._editButton));\n            }\n             else u.tryHide();\n        ;\n            if ((kc && !cc)) {\n                if ((t.isEditMode() && t.hasChanged())) {\n                    this._createSortableGroup();\n                }\n            };\n        },\n        render: function() {\n            this.render = fb(this._renderOrderedList.bind(this), 300);\n            this.render();\n        },\n        _renderListItem: function(yb, zb) {\n            ua.get(yb, function(ac) {\n                var bc = this._template.render(), cc = ab.getNode(bc, \"profile-photo\");\n                if (r.get(\"chat_use_client_side_image_requests\", 0)) {\n                    var dc = (this._isLitestand ? 24 : 28);\n                    new fa().setFBID(ac.id).setType(ga.PROFILE_PICTURE).setDimensions(dc, dc).setResizeMode(pa.COVER).setCallback(function(ic) {\n                        cc.setAttribute(\"src\", ic.uri);\n                    }).send();\n                }\n                 else cc.setAttribute(\"src\", ac.thumbSrc);\n            ;\n                var ec = ab.getNode(bc, \"name\");\n                ba.setContent(ec, ac.name);\n                var fc = ab.getNode(bc, \"accessible-name\");\n                ba.setContent(fc, ac.name);\n                var gc = ab.getNode(bc, \"anchor\");\n                gc.setAttribute(\"href\", (\"/messages/\" + yb));\n                var hc = ab.getNode(bc, \"tooltip\");\n                (hc && wa.set(hc, ac.name, \"right\"));\n                ca.set(bc, \"id\", yb);\n                this._itemsMap[yb] = {\n                    node: bc\n                };\n                (zb && zb(bc));\n            }.bind(this));\n        },\n        _updateUnreadCount: function(yb, zb) {\n            var ac = this._itemsMap[yb];\n            if (!ac) {\n                return\n            };\n            if (this._isSidebar) {\n                this._unreadMessages = (this._unreadMessages || {\n                });\n                if (!!zb) {\n                    this._unreadMessages[yb] = true;\n                }\n                 else delete this._unreadMessages[yb];\n            ;\n                h.inform(\"buddylist-nub/updateCount\", {\n                    count: Object.keys(this._unreadMessages).length\n                });\n            }\n        ;\n            ac.unreadCount = (ac.unreadCount || ba.find(ac.node, \".-cx-PRIVATE-fbChatOrderedList__unreadcount\"));\n            zb = (zb ? zb : 0);\n            ba.setContent(ac.unreadCount, ((zb > qb) ? (qb + \"+\") : zb));\n            o.conditionClass(ac.unreadCount, \"-cx-PRIVATE-fbChatOrderedList__largecount\", (zb > qb));\n            o.conditionClass(ac.node, \"-cx-PRIVATE-fbChatOrderedList__hasunreadcount\", zb);\n        },\n        show: function() {\n            if (this._isVisible) {\n                return\n            };\n            this._isVisible = true;\n            o.show((this._scrollableOrderedList || this._root));\n            this.render();\n            this.inform(\"show\");\n        },\n        isVisible: function() {\n            return this._isVisible;\n        },\n        update: function() {\n            this._hasRendered = false;\n            if (!this._renderRequest) {\n                this._renderRequest = hb(function() {\n                    this.render();\n                    this._renderRequest = null;\n                }.bind(this));\n            };\n        },\n        setScrollContainer: function(yb) {\n            if (ba.contains(yb, this._root)) {\n                this._scrollContainer = yb;\n                if (this._usePlaceholder) {\n                    ea.listen(yb, \"scroll\", kb.acrossTransitions(this._placeholderUpdate.bind(this)));\n                    ea.listen(window, \"resize\", kb.acrossTransitions(function() {\n                        this._scrollContainerHeight = null;\n                        this._placeholderUpdate();\n                    }.bind(this), 250));\n                }\n            ;\n            }\n        ;\n        },\n        scrollTo: function(yb) {\n            if (!this._scrollContainer) {\n                return\n            };\n            var zb = this._scrollContainer.scrollHeight, ac = this._scrollContainer.clientHeight, bc = this._scrollContainer.scrollTop, cc = Math.min(yb.offsetTop, (zb - ac));\n            if ((bc !== cc)) {\n                var dc = (this._isLitestand ? 600 : ((Math.abs((cc - bc)) / this._scrollContainer.clientHeight) * 500)), ec = (this._isLitestand ? da.easeOutExpo : g.ease.end);\n                new g(this._scrollContainer).to(\"scrollTop\", cc).ease(ec).duration(dc).go();\n            }\n        ;\n        },\n        _applyContext: function(yb, zb) {\n            var ac = (s.getShortDisplay(yb) || \"\");\n            if (zb.contextNode) {\n                ba.setContent(zb.contextNode, ac);\n                o.conditionClass(zb.node, \"-cx-PRIVATE-fbChatOrderedList__hascontext\", ac);\n                var bc = s.get(yb), cc = (bc ? bc.type : null);\n                for (var dc in rb.CONTEXT_CLASSES) {\n                    var ec = ((dc === cc)), fc = (rb.CONTEXT_CLASSES[dc] || \"-cx-PRIVATE-fbChatOrderedList__contextother\");\n                    o.conditionClass(zb.contextNode, fc, ec);\n                };\n            }\n        ;\n        }\n    });\n    e.exports = rb;\n});\n__d(\"TypingDetectorController\", [\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"ChannelConnection\",\"ChatVisibility\",\"Keys\",\"PresencePrivacy\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChannelConnection\"), k = b(\"ChatVisibility\"), l = b(\"Keys\"), m = b(\"PresencePrivacy\"), n = b(\"ShortProfiles\"), o = b(\"TypingDetector\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"shield\");\n    function s(u) {\n        if (!k.isOnline()) {\n            return false\n        };\n        if (u) {\n            var v = n.getNow(u);\n            return ((v && (v.type == \"friend\")) && m.allows(u));\n        }\n    ;\n        return true;\n    };\n    function t(u, v, w, x, y) {\n        this.userID = u;\n        this.input = v;\n        this.source = w;\n        this.threadID = y;\n        this.remoteState = o.INACTIVE;\n        this.notifyTimer = null;\n        x = (x || {\n        });\n        this.notifyDelay = (x.notifyDelay || this.notifyDelay);\n        this._typingDetector = new o(v);\n        this._typingDetector.init(x);\n        this._typingDetector.subscribe(\"change\", this._stateChange.bind(this));\n    };\n    p(t.prototype, {\n        notifyDelay: 1000,\n        setUserAndThread: function(u, v) {\n            if (((this.userID !== u) || (this.threadID !== v))) {\n                this.resetState();\n                this.userID = u;\n                this.threadID = v;\n            }\n        ;\n        },\n        setIgnoreEnter: function(u) {\n            var v = (u ? [l.RETURN,] : []);\n            this._typingDetector.setIgnoreKeys(v);\n        },\n        resetState: function() {\n            this.remoteState = t.INACTIVE;\n            this._typingDetector.reset();\n            clearTimeout(this.notifyTimer);\n            this.notifyTimer = null;\n        },\n        _stateChange: function(u, v) {\n            if ((v != o.QUITTING)) {\n                clearTimeout(this.notifyTimer);\n                this.notifyTimer = r(this._notifyState, this, v).defer(this.notifyDelay, false);\n            }\n             else this._notifyState(v, true);\n        ;\n        },\n        _notifyState: function(u, v) {\n            if ((!this.userID && !this.threadID)) {\n                return\n            };\n            var w = this.userID, x = s(w);\n            if ((x && (u != this.remoteState))) {\n                this.remoteState = u;\n                if (j.disconnected()) {\n                    return\n                };\n                var y = {\n                    typ: u,\n                    to: w,\n                    source: this.source,\n                    thread: this.threadID\n                };\n                new g().setHandler(this._onTypResponse.bind(this, w)).setErrorHandler(q).setData(y).setURI(\"/ajax/messaging/typ.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", !v).send();\n            }\n        ;\n        },\n        _onTypResponse: function(u, v) {\n            var w = (v.getPayload() || {\n            });\n            if (w.offline) {\n                h.set(u, i.OFFLINE, \"typing_response\");\n            };\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatBehavior\", [\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"ChatConfig\",\"copyProperties\",\"MercuryConstants\",\"ChatSidebarCalloutData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChatConfig\"), k = b(\"copyProperties\"), l = b(\"MercuryConstants\").ChatNotificationConstants, m = b(\"ChatSidebarCalloutData\").isShown, n = h.getWebChatNotification(), o = m, p = true, q = k(new g(), {\n        ON_CHANGED: \"changed\",\n        notifiesUserMessages: function() {\n            return (n !== l.NO_USER_MESSAGE_NOTIFICATION);\n        },\n        ignoresRemoteTabRaise: function() {\n            return o;\n        },\n        showsTabUnreadUI: function() {\n            if (j.get(\"web_messenger_suppress_tab_unread\")) {\n                return p\n            };\n            return true;\n        }\n    });\n    function r() {\n        q.inform(q.ON_CHANGED);\n    };\n    h.subscribe(i.ON_CHAT_NOTIFICATION_CHANGED, function() {\n        var s = n, t = h.getWebChatNotification();\n        n = t;\n        if ((s != t)) {\n            r();\n        };\n    });\n    g.subscribe(\"chat/set_does_page_occlude_tabs\", function(s, t) {\n        o = !!t;\n        r();\n    });\n    g.subscribe(\"chat/set_show_tab_unread_ui\", function(s, t) {\n        p = !!t;\n        r();\n    });\n    e.exports = q;\n});\n__d(\"ChatSidebarSheet\", [\"Event\",\"function-extensions\",\"ArbiterMixin\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatVisibility\",\"CSS\",\"DOM\",\"JSLogger\",\"PresencePrivacy\",\"React\",\"XUIButton.react\",\"csx\",\"cx\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BlackbirdUpsell\"), j = b(\"ChannelConnection\"), k = b(\"ChannelConstants\"), l = b(\"ChatBehavior\"), m = b(\"ChatConfig\"), n = b(\"ChatVisibility\"), o = b(\"CSS\"), p = b(\"DOM\"), q = b(\"JSLogger\"), r = b(\"PresencePrivacy\"), s = b(\"React\"), t = b(\"XUIButton.react\"), u = b(\"csx\"), v = b(\"cx\"), w = b(\"copyProperties\"), x = b(\"tx\"), y = q.create(\"sidebar_sheet\");\n    function z(ca) {\n        switch (ca) {\n          case k.HINT_AUTH:\n            return \"Your session has timed out. Please log in.\";\n          case k.HINT_CONN:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n          case k.HINT_MAINT:\n            return x._(\"Facebook {Chat} is currently down for maintenance.\", {\n                Chat: \"Chat\"\n            });\n          default:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n        };\n    };\n    function aa(ca) {\n        var da;\n        if ((ca === null)) {\n            da = \"Unable to connect to chat. Check your Internet connection.\";\n        }\n         else if ((ca > m.get(\"warning_countdown_threshold_msec\"))) {\n            var ea = p.create(\"a\", {\n                href: \"#\",\n                className: \"fbChatReconnectLink\"\n            }, \"Try again\");\n            da = p.tx._(\"Unable to connect to chat. {try-again-link}\", {\n                \"try-again-link\": ea\n            });\n        }\n         else if ((ca > 1000)) {\n            da = x._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                seconds: Math.floor((ca / 1000))\n            });\n        }\n         else da = \"Unable to connect to chat. Reconnecting...\";\n        \n        \n    ;\n        return da;\n    };\n    function ba(ca) {\n        this._root = ca;\n        this._litestandOffline = p.scry(ca, \".-cx-PRIVATE-fbChatSidebarOffline__placeholder\");\n        this._message = p.find(ca, \"div.fbChatSidebarMessage div.message\");\n        j.subscribe([j.CONNECTED,j.SHUTDOWN,j.RECONNECTING,], this._handleConnectionChange.bind(this));\n        j.subscribe([j.MUTE_WARNING,j.UNMUTE_WARNING,], this._render.bind(this));\n        r.subscribe(\"privacy-user-presence-changed\", this._render.bind(this));\n        l.subscribe(l.ON_CHANGED, this._render.bind(this));\n        this._render();\n    };\n    w(ba.prototype, h, {\n        _channelStatus: null,\n        _channelData: null,\n        _handleConnectionChange: function(ca, da) {\n            this._channelStatus = ca;\n            this._channelData = da;\n            this._render();\n        },\n        _showWarningTimeout: null,\n        _warningMsgEventListener: null,\n        _renderChannelDisconnect: function() {\n            if ((this._channelStatus === j.SHUTDOWN)) {\n                return p.setContent(this._message, z(this._channelData));\n            }\n             else if ((this._channelStatus === j.RECONNECTING)) {\n                var ca = this._channelData;\n                p.setContent(this._message, aa(ca));\n                if ((ca > 1000)) {\n                    if ((ca > m.get(\"warning_countdown_threshold_msec\"))) {\n                        this._warningMsgEventListener = g.listen(this._message, \"click\", function(event) {\n                            if (o.hasClass(event.getTarget(), \"fbChatReconnectLink\")) {\n                                j.reconnect();\n                                return false;\n                            }\n                        ;\n                        });\n                    };\n                    this._showWarningTimeout = setTimeout(this._handleConnectionChange.bind(this, j.RECONNECTING, (ca - 1000)), 1000, false);\n                }\n            ;\n            }\n            \n        ;\n        },\n        _goOnlineEventListener: null,\n        _renderOffline: function() {\n            if (this._isLitestand) {\n                return\n            };\n            if ((this._litestandOffline && this._litestandOffline.length)) {\n                this._renderLitestandOffline();\n            };\n            var ca = \"fbChatGoOnlineLink\", da = \"Turn on chat\", ea = p.create(\"a\", {\n                href: \"#\",\n                className: ca\n            }, da), fa = p.tx._(\"{=Go online} to see who's available.\", {\n                \"=Go online\": ea\n            });\n            p.setContent(this._message, fa);\n            this._goOnlineEventListener = g.listen(this._message, \"click\", function(event) {\n                if (o.hasClass(event.getTarget(), ca)) {\n                    y.log(\"sidebar_go_online\");\n                    n.goOnline();\n                    return false;\n                }\n            ;\n            });\n        },\n        _renderLitestandOffline: function() {\n            this._litestandOffline = this._litestandOffline[0];\n            this._isLitestand = true;\n            if (m.get(\"litestand_blended_sidebar\")) {\n                s.renderComponent(t({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__root -cx-PRIVATE-fbChatSidebarOffline__button\",\n                    href: {\n                        url: \"#\"\n                    },\n                    label: \"Turn on Chat\",\n                    onClick: function() {\n                        y.log(\"sidebar_go_online\");\n                        n.goOnline();\n                    }\n                }), this._litestandOffline);\n                this._litestandOffline = null;\n            }\n             else {\n                s.renderComponent(s.DOM.a({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__root -cx-PUBLIC-litestandLiquid__hover\",\n                    href: \"#\",\n                    onClick: function() {\n                        y.log(\"sidebar_go_online\");\n                        n.goOnline();\n                    }\n                }, s.DOM.i({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__leftborder\"\n                }), s.DOM.div({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__center\"\n                }, s.DOM.div({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__content\"\n                }, s.DOM.i({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__offlineicon\"\n                }), s.DOM.div({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__message\"\n                }, p.tx._(\"Turn on Chat\")))), s.DOM.i({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__rightborder\"\n                }), s.DOM.div({\n                    className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-position\": \"right\",\n                    \"aria-label\": \"Turn on Chat\"\n                })), this._litestandOffline);\n                this._litestandOffline = null;\n            }\n        ;\n        },\n        _renderBlackbirdUpsell: function() {\n            p.setContent(this._message, i.getOfflineContent());\n        },\n        _renderBlackbird: function(ca) {\n            p.setContent(this._message, i.getBlackbirdContent(ca));\n        },\n        _clear: function() {\n            if (this._showWarningTimeout) {\n                clearTimeout(this._showWarningTimeout);\n                this._showWarningTimeout = null;\n            }\n        ;\n            if (this._warningMsgEventListener) {\n                this._warningMsgEventListener.remove();\n                this._warningMsgEventListener = null;\n            }\n        ;\n            if (this._goOnlineEventListener) {\n                this._goOnlineEventListener.remove();\n                this._goOnlineEventListener = null;\n            }\n        ;\n            o.removeClass(this._root, \"upsell\");\n            o.removeClass(this._root, \"offline\");\n            o.removeClass(this._root, \"blackbird\");\n            o.removeClass(this._root, \"error\");\n            o.removeClass(this._root, \"notice\");\n            p.empty(this._message);\n        },\n        _render: function() {\n            this._clear();\n            if (i.shouldShow()) {\n                if (n.hasBlackbirdEnabled()) {\n                    var ca = (n.isOnline() ? \"blackbird\" : \"upsell\");\n                    o.addClass(this._root, ca);\n                    this._renderBlackbird(r.getVisibility());\n                }\n                 else if (!n.isOnline()) {\n                    o.addClass(this._root, \"upsell\");\n                    this._renderBlackbirdUpsell();\n                }\n                \n            ;\n            }\n             else if (!n.isOnline()) {\n                o.addClass(this._root, \"offline\");\n                this._renderOffline();\n            }\n             else if (j.disconnected()) {\n                o.addClass(this._root, \"error\");\n                this._renderChannelDisconnect();\n            }\n             else if (!l.notifiesUserMessages()) {\n                o.addClass(this._root, \"notice\");\n                p.setContent(this._message, \"Alerts are off while you use another client to chat.\");\n            }\n            \n            \n            \n        ;\n            this.inform(\"updated\");\n        }\n    });\n    e.exports = ba;\n});\n__d(\"FBDesktopPlugin\", [\"CacheStorage\",\"DOM\",\"Env\",\"FBDesktopDetect\",\"URI\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"CacheStorage\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"FBDesktopDetect\"), k = b(\"URI\"), l = b(\"Style\"), m = new g(\"localstorage\", \"_socialfox_\"), n = {\n        _plugin: \"_not_checked\",\n        arbiterInform: function(o, p) {\n            var q = JSON.stringify({\n                name: o,\n                payload: p\n            });\n            this._transmitCommand(\"arbiterinform\", q);\n        },\n        bringToFront: function() {\n            this._transmitCommand(\"bringtofront\");\n        },\n        dock: function() {\n            this._transmitCommand(\"dock\");\n        },\n        getPlugin: function() {\n            if ((this._plugin === \"_not_checked\")) {\n                this._plugin = null;\n                if (j.isPluginInstalled()) {\n                    var o = h.create(\"object\", {\n                        id: \"kiwi_plugin\",\n                        type: j.mimeType\n                    });\n                    l.set(o, \"width\", 0);\n                    l.set(o, \"height\", 0);\n                    var p = h.create(\"div\", {\n                    }, o);\n                    l.set(p, \"width\", 0);\n                    l.set(p, \"height\", 0);\n                    document.body.appendChild(p);\n                    this._plugin = o;\n                }\n            ;\n            }\n        ;\n            return this._plugin;\n        },\n        getUserID: function() {\n            var o = this.getPlugin();\n            return ((o && (\"getUserID\" in o)) && o.getUserID());\n        },\n        getVersion: function() {\n            var o = this.getPlugin();\n            return ((o && (\"getVersion\" in o)) && o.getVersion());\n        },\n        isAppRunning: function() {\n            var o = this.getPlugin();\n            return ((o && (\"isAppRunning\" in o)) && o.isAppRunning());\n        },\n        launchApp: function() {\n            var o = this.getPlugin();\n            return ((o && (\"launchApp\" in o)) && o.launchApp());\n        },\n        login: function(o, p) {\n            if (((p && o) && (o.length > 0))) {\n                var q = this.getPlugin();\n                if (q) {\n                    this._transmitCommand((((\"relogin\\u000a\" + o) + \"\\u000a\") + p));\n                    return;\n                }\n            ;\n            }\n        ;\n        },\n        logout: function(o) {\n            o = (o || \"0\");\n            var p = this.getPlugin();\n            if (p) {\n                p.logout(o);\n            };\n        },\n        recheck: function() {\n            if ((this._plugin === null)) {\n                this._plugin = \"_not_checked\";\n            };\n        },\n        shouldSuppressBeeper: function() {\n            return this.isAppRunning();\n        },\n        shouldSuppressMessages: function() {\n            if ((m && m.get(\"connected\"))) {\n                return true\n            };\n            var o = this.getUserID();\n            if (o) {\n                return (o === i.user);\n            }\n             else return this.isAppRunning()\n        ;\n        },\n        shouldSuppressSidebar: function() {\n            var o = this.getPlugin(), p = ((o && (\"isAppDocked\" in o)) && o.isAppDocked()), q = (m && (m.get(\"active\") === \"true\"));\n            return (p || q);\n        },\n        transferAuthToken: function(o, p) {\n            if ((o && (o.length > 0))) {\n                var q = this.getPlugin();\n                if (q) {\n                    q.setAccessToken(o, p);\n                    var r = setInterval(function() {\n                        q.setAccessToken(o, p);\n                    }, 500);\n                    setTimeout(function() {\n                        clearInterval(r);\n                    }, (10 * 1000));\n                }\n            ;\n            }\n        ;\n            if (this.redirectHome) {\n                window.location.href = k().setPath().toString();\n            };\n        },\n        _transmitCommand: function(o, p) {\n            p = (p || \"\");\n            var q = this.getPlugin();\n            if ((q && (\"transmitCommand\" in q))) {\n                q.transmitCommand(o, p);\n            };\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatSidebar\", [\"ChatOrderedList\",\"ChatTypeaheadBehavior\",\"ChatTypeaheadCore\",\"ChatTypeaheadDataSource\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadView\",\"Typeahead\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConnection\",\"Chat\",\"ChatConfig\",\"ChatHovercard\",\"ChatImpressionLogger\",\"ChatOptions\",\"ChatSidebarSheet\",\"ChatVisibility\",\"CSS\",\"DOM\",\"DOMDimensions\",\"Event\",\"FBDesktopPlugin\",\"JSLogger\",\"JSXDOM\",\"KeyEventController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"ScrollableArea\",\"Style\",\"UserAgent\",\"ViewportBounds\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"cx\",\"debounce\",\"emptyFunction\",\"fbt\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"ChatTypeaheadBehavior\");\n    b(\"ChatTypeaheadCore\");\n    b(\"ChatTypeaheadDataSource\");\n    b(\"ChatTypeaheadRenderer\");\n    b(\"ChatTypeaheadView\");\n    b(\"Typeahead\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableList\"), k = b(\"AvailableListConstants\"), l = b(\"Bootloader\"), m = b(\"ChannelConnection\"), n = b(\"Chat\"), o = b(\"ChatConfig\"), p = b(\"ChatHovercard\"), q = b(\"ChatImpressionLogger\"), r = b(\"ChatOptions\"), s = b(\"ChatSidebarSheet\"), t = b(\"ChatVisibility\"), u = b(\"CSS\"), v = b(\"DOM\"), w = b(\"DOMDimensions\"), x = b(\"Event\"), y = b(\"FBDesktopPlugin\"), z = b(\"JSLogger\"), aa = b(\"JSXDOM\"), ba = b(\"KeyEventController\"), ca = b(\"OrderedFriendsList\"), da = b(\"Parent\"), ea = b(\"PresencePrivacy\"), fa = b(\"ScrollableArea\"), ga = b(\"Style\"), ha = b(\"UserAgent\"), ia = b(\"ViewportBounds\"), ja = b(\"copyProperties\"), ka = b(\"createArrayFrom\"), la = b(\"csx\"), ma = b(\"cx\"), na = b(\"debounce\"), oa = b(\"emptyFunction\"), pa = b(\"fbt\"), qa = b(\"ge\"), ra = b(\"tx\"), sa, ta = false, ua = false, va = false, wa = false, xa = false, ya = false, za, ab, bb, cb, db, eb = null, fb, gb, hb, ib, jb, kb, lb = 28, mb = 38, nb = z.create(\"chat_sidebar\");\n    function ob() {\n        if (gb) {\n            return\n        };\n        u.removeClass(document.documentElement, \"sidebarMode\");\n        if ((!wa || !yb.isVisible())) {\n            g.inform(\"reflow\");\n            return;\n        }\n    ;\n        va = false;\n        eb = null;\n        za.hide();\n        cb.getCore().reset();\n        u.hide(ab);\n        nb.rate(\"sidebar_hide\", wa);\n        yb.inform(\"sidebar/hide\", yb);\n        g.inform(\"sidebar/hide\", yb);\n        g.inform(\"reflow\");\n    };\n    function pb() {\n        var zb = yb.shouldShowSidebar();\n        u.conditionClass(document.documentElement, \"sidebarCapable\", zb);\n        if ((yb.isEnabled() && zb)) {\n            sb();\n            var ac;\n            if (fb) {\n                var bc = u.hasClass(ab, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\");\n                if (bc) {\n                    return\n                };\n                kb = (kb || v.find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\"));\n                if (fb.has_favorites_editing) {\n                    jb = (jb || v.scry(ab, \".-cx-PRIVATE-litestandSidebarFavorites__sectionheader\")[0]);\n                };\n                ac = [kb,];\n            }\n             else ac = ka(ab.childNodes);\n        ;\n            var cc = rb(ac), dc = (za.getItemHeight() || 32), ec = (za.getPaddingOffset() || 8), fc;\n            if (gb) {\n                if (gb.isExpanded()) {\n                    ec = (ec + lb);\n                    if ((fb && fb.always_show_one_see_more)) {\n                        ec += dc;\n                    };\n                }\n            ;\n                if (!n.isOnline()) {\n                    ec += mb;\n                };\n                var gc = Math.floor((za.getItemPadding() / 2));\n                fc = Math.floor(((((cc - ec) + gc)) / dc));\n                if (!za.isVisible()) {\n                    ga.set(sa, \"height\", (cc + \"px\"));\n                };\n            }\n             else {\n                fc = Math.floor((((cc - ec)) / ((dc + 1))));\n                ga.set(sa, \"height\", (cc + \"px\"));\n            }\n        ;\n            za.setNumTopFriends(fc);\n            var hc = Math.floor((((cc - ec)) / dc));\n            if (ub()) {\n                hc = ((((hc - 2)) > 0) ? (hc - 2) : 0);\n            };\n            cb.getData().setMaxResults(hc);\n            yb.inform(\"sidebar/resized\", yb);\n            g.inform(\"sidebar/resized\", yb);\n            g.inform(\"reflow\");\n        }\n         else ob();\n    ;\n        if (!wa) {\n            wb();\n            wa = true;\n        }\n    ;\n        eb = null;\n    };\n    function qb() {\n        if ((cb && yb.isVisible())) {\n            cb.getCore().getElement().focus();\n        };\n    };\n    function rb(zb) {\n        if (!zb) {\n            if (fb) {\n                kb = (kb || v.find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\"));\n                zb = [kb,];\n            }\n             else zb = ka(ab.childNodes);\n        \n        };\n        var ac = db.height;\n        if ((gb && hb)) {\n            ac -= hb.getFullHeight();\n        };\n        zb.forEach(function(bc) {\n            if ((bc && (bc !== sa))) {\n                ac -= w.getElementDimensions(bc).height;\n            };\n        });\n        return Math.max(0, ac);\n    };\n    function sb() {\n        if (yb.isVisible()) {\n            return\n        };\n        va = true;\n        eb = null;\n        u.show(ab);\n        u.addClass(document.documentElement, \"sidebarMode\");\n        za.show();\n        nb.rate(\"sidebar_show\", wa);\n        yb.inform(\"sidebar/show\", yb);\n        g.inform(\"sidebar/show\", yb);\n        (ib && xb());\n    };\n    function tb() {\n        r.setSetting(\"sidebar_mode\", yb.isEnabled(), \"sidebar\");\n        new i(\"/ajax/chat/settings.php\").setHandler(oa).setErrorHandler(oa).setData({\n            sidebar_mode: yb.isEnabled()\n        }).setAllowCrossPageTransition(true).send();\n    };\n    function ub() {\n        return o.get(\"divebar_typeahead_group_fof\", 0);\n    };\n    function vb() {\n        return (ca.getList().length <= o.get(\"sidebar.min_friends\"));\n    };\n    function wb() {\n        var zb = true;\n        if (!yb.isEnabled()) {\n            nb.log(\"state_not_enabled\");\n            zb = false;\n        }\n    ;\n        if (!yb.isViewportCapable()) {\n            nb.log(\"state_not_shown_viewport\");\n            zb = false;\n        }\n    ;\n        if (ua) {\n            nb.log(\"state_not_shown_hidden\");\n            zb = false;\n        }\n    ;\n        if (vb()) {\n            nb.log(\"state_not_shown_num_friends\");\n            zb = false;\n        }\n    ;\n        if (y.shouldSuppressSidebar()) {\n            nb.log(\"state_not_shown_fbdesktop\");\n            zb = false;\n        }\n    ;\n        nb.log((zb ? \"state_shown\" : \"state_not_shown\"));\n    };\n    function xb() {\n        if (!yb.isVisible()) {\n            return\n        };\n        var zb;\n        if (!t.isOnline()) {\n            zb = \"Offline\";\n        }\n         else if (m.disconnected()) {\n            zb = \"Connection Lost\";\n        }\n         else zb = ra._(\"{Chat} {number-available}\", {\n            Chat: \"Chat\",\n            \"number-available\": ((\"(\" + j.getOnlineCount()) + \")\")\n        });\n        \n    ;\n        v.setContent(ib, zb);\n    };\n    var yb = {\n        init: function(zb, ac, bc, cc) {\n            yb.init = oa;\n            xa = true;\n            ab = zb;\n            za = ac;\n            cb = bc;\n            bb = cc;\n            sa = v.find(zb, \"div.fbChatSidebarBody\");\n            gb = (cc && cc.ls_module);\n            fb = (cc && cc.ls_config);\n            if (gb) {\n                g.subscribe(\"ViewportSizeChange\", function() {\n                    g.inform(\"ChatOrderedList/itemHeightChange\");\n                    pb();\n                });\n                g.subscribe(\"Sidebar/BookmarksHeightChange\", pb);\n                l.loadModules([\"LitestandSidebarBookmarksDisplay\",], function(ec) {\n                    hb = ec;\n                });\n            }\n             else x.listen(window, \"resize\", pb);\n        ;\n            ba.registerKey(\"q\", function() {\n                var ec = null;\n                if (kb) {\n                    ec = v.scry(kb, \".inputsearch\")[0];\n                }\n                 else ec = v.scry(zb, \".inputsearch\")[0];\n            ;\n                if (ec) {\n                    ec.focus();\n                    return false;\n                }\n            ;\n            });\n            new p(ac);\n            var dc = new s(zb);\n            dc.subscribe(\"updated\", pb);\n            g.subscribe(\"sidebar/invalidate\", pb);\n            ac.setScrollContainer(da.byClass(ac.getRoot(), \"uiScrollableAreaWrap\"));\n            ac.subscribe([\"render\",\"show\",\"hide\",], na(function(ec) {\n                if (((ec === \"render\") && !ya)) {\n                    ya = true;\n                    yb.inform(\"sidebar/chatRendered\", null, g.BEHAVIOR_PERSISTENT);\n                }\n            ;\n                var fc = ac.getRoot(), gc = fa.getInstance(fc);\n                (gc && gc.adjustGripper());\n            }));\n            ac.subscribe([\"editStart\",\"editEnd\",], function(ec) {\n                u.conditionClass(cb.getView().element, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\", (ec == \"editStart\"));\n            });\n            if ((ha.firefox() >= 17)) {\n                x.listen(window, \"storage\", function(ec) {\n                    if (((ec.key == \"_socialfox_active\") && (ec.oldValue != ec.newValue))) {\n                        pb();\n                    };\n                });\n            };\n            g.subscribe(\"chat/option-changed\", function(ec, fc) {\n                if ((fc.name == \"sidebar_mode\")) {\n                    ta = !!r.getSetting(\"sidebar_mode\");\n                    pb();\n                }\n            ;\n            });\n            bc.getCore().subscribe(\"sidebar/typeahead/active\", yb.updateOnActiveTypeahead);\n            bc.subscribe(\"reset\", function() {\n                if ((!bc.getCore().getValue() && !za.isVisible())) {\n                    yb.updateOnActiveTypeahead(null, false);\n                };\n            });\n            if (gb) {\n                bc.getCore().subscribe(\"sidebar/typeahead/preActive\", function(ec, fc) {\n                    if ((ta && cb.getView().isVisible())) {\n                        g.inform(ec, fc);\n                    }\n                     else pb();\n                ;\n                });\n            }\n             else g.subscribe(\"buddylist-nub/initialized\", function(ec, fc) {\n                x.listen(fc.getButton(), \"click\", function(event) {\n                    yb.enable();\n                    return !yb.shouldShowSidebar();\n                });\n            });\n        ;\n            ta = !!r.getSetting(\"sidebar_mode\");\n            (ha.ie() && x.listen(zb, \"click\", function(ec) {\n                if (da.byClass(ec.getTarget(), \"-cx-PRIVATE-fbLitestandChatTypeahead__root\")) {\n                    qb();\n                };\n            }));\n            ea.subscribe(\"privacy-user-presence-changed\", pb);\n            pb();\n            q.init(za);\n            if (!gb) {\n                ia.addRight(yb.getVisibleWidth);\n            };\n            yb.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            g.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            if (o.get(\"litestand_blended_sidebar\")) {\n                ib = v.find(zb, \".-cx-PRIVATE-litestandBlendedSidebar__headertext\");\n                j.subscribe(k.ON_AVAILABILITY_CHANGED, na(xb, 2000));\n                m.subscribe([m.CONNECTED,m.RECONNECTING,m.SHUTDOWN,], xb);\n                ea.subscribe(\"privacy-changed\", xb);\n                xb();\n            }\n        ;\n        },\n        updateOnActiveTypeahead: function(zb, ac) {\n            if (!va) {\n                return\n            };\n            if (ac) {\n                za.hide();\n                if (gb) {\n                    u.addClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    var bc = rb();\n                    if (jb) {\n                        bc += w.getElementDimensions(jb).height;\n                    };\n                    ga.set(sa, \"height\", (bc + \"px\"));\n                }\n            ;\n            }\n             else {\n                za.show();\n                if (gb) {\n                    ga.set(sa, \"height\", \"auto\");\n                    u.removeClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    g.inform(\"sidebar/typeahead/active\", false);\n                    pb();\n                }\n                 else pb();\n            ;\n            }\n        ;\n        },\n        isInitialized: function() {\n            return wa;\n        },\n        disable: function() {\n            if (!yb.isEnabled()) {\n                return\n            };\n            ta = false;\n            tb();\n            ob();\n        },\n        enable: function() {\n            if (yb.isEnabled()) {\n                return\n            };\n            ta = true;\n            tb();\n            pb();\n            qb.defer();\n        },\n        forceEnsureLoaded: function() {\n            if (xa) {\n                return\n            };\n            if (qa(\"pagelet_sidebar\")) {\n                return\n            };\n            d([\"UIPagelet\",], function(zb) {\n                var ac = aa.div({\n                    id: \"pagelet_sidebar\"\n                });\n                v.appendContent(document.body, ac);\n                zb.loadFromEndpoint(\"SidebarPagelet\", \"pagelet_sidebar\");\n            });\n            xa = true;\n        },\n        ensureLoaded: function() {\n            if (!ta) {\n                return\n            };\n            yb.forceEnsureLoaded();\n        },\n        hide: function() {\n            if (ua) {\n                return\n            };\n            ua = true;\n            ob();\n        },\n        unhide: function() {\n            if (!ua) {\n                return\n            };\n            ua = false;\n            pb();\n        },\n        getBody: function() {\n            return sa;\n        },\n        getRoot: function() {\n            return ab;\n        },\n        getVisibleWidth: function() {\n            if ((!va || !ab)) {\n                return 0\n            };\n            if ((eb === null)) {\n                eb = ab.offsetWidth;\n            };\n            return eb;\n        },\n        isEnabled: function() {\n            return ta;\n        },\n        isViewportCapable: function() {\n            db = w.getViewportWithoutScrollbarDimensions();\n            if (gb) {\n                return true\n            };\n            var zb = o.get(\"sidebar.minimum_width\");\n            return (db.width > zb);\n        },\n        shouldShowSidebar: function() {\n            var zb = yb.isViewportCapable();\n            return (gb || ((((zb && !ua) && ((!vb() || o.get(\"litestand_blended_sidebar\", false)))) && !y.shouldSuppressSidebar())));\n        },\n        isVisible: function() {\n            return va;\n        },\n        resize: pb,\n        toggle: function() {\n            if (gb) {\n                gb.toggle();\n            }\n             else (yb.isEnabled() ? yb.disable() : yb.enable());\n        ;\n        },\n        isLitestandSidebar: function() {\n            return !!gb;\n        }\n    };\n    ja(yb, h);\n    e.exports = yb;\n});\n__d(\"DropdownContextualHelpLink\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        set: function(j) {\n            var k = h(\"navHelpCenter\");\n            if ((k !== null)) {\n                g.replace(k, j);\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"ChatActivity\", [\"Event\",\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"JSLogger\",\"MercuryConfig\",\"PresenceState\",\"UserActivity\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"Arbiter\"), i = b(\"AvailableList\"), j = b(\"AvailableListConstants\"), k = b(\"JSLogger\"), l = b(\"MercuryConfig\"), m = b(\"PresenceState\"), n = b(\"UserActivity\"), o = b(\"copyProperties\"), p = (l.activity_limit || 60000), q = (l.idle_limit || 1800000), r = (l.idle_poll_interval || 300000), s = k.create(\"chat_activity\"), t = Date.now(), u = t, v = true;\n    function w() {\n        var aa = Date.now();\n        return !!((v && (((aa - t) < p))));\n    };\n    var x = o(new h(), {\n        isActive: w\n    });\n    function y() {\n        var aa = t;\n        t = Date.now();\n        if (((t - aa) > q)) {\n            s.debug(\"idle_to_active\", aa);\n            m.doSync();\n        }\n    ;\n        x.inform(\"activity\");\n    };\n    i.subscribe(j.ON_AVAILABILITY_CHANGED, function() {\n        if (!i.isUserIdle()) {\n            u = Date.now();\n        };\n    });\n    g.listen(window, \"focus\", function() {\n        v = true;\n        y();\n    });\n    g.listen(window, \"blur\", function() {\n        v = false;\n    });\n    n.subscribe(function() {\n        y();\n    });\n    function z(aa) {\n        var ba = ((aa && aa.at) && m.verifyNumber(aa.at));\n        if ((typeof ba !== \"number\")) {\n            ba = null;\n        };\n        return (ba || 0);\n    };\n    setInterval(function() {\n        var aa = Date.now(), ba = z(m.get()), ca = Math.max(t, ba, u);\n        if (((aa - ca) > q)) {\n            s.debug(\"idle\", {\n                cookie: ba,\n                local: t,\n                presence: u\n            });\n            x.inform(\"idle\", (aa - ca));\n        }\n    ;\n    }, r);\n    m.registerStateStorer(function(aa) {\n        var ba = z(aa);\n        if ((ba < t)) {\n            aa.at = t;\n        };\n        return aa;\n    });\n    h.subscribe(k.DUMP_EVENT, function(aa, ba) {\n        ba.chat_activity = {\n            activity_limit: p,\n            idle_limit: q,\n            idle_poll_interval: r,\n            last_active_time: t,\n            last_global_active_time: u\n        };\n    });\n    e.exports = x;\n});\n__d(\"MercuryNotificationRenderer\", [\"MercuryAssert\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryThreads\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAssert\"), h = b(\"MercuryMessages\").get(), i = b(\"MercuryParticipants\"), j = b(\"MercuryThreads\").get(), k = b(\"tx\");\n    function l(m, n) {\n        g.isThreadID(m);\n        j.getThreadMeta(m, function(o) {\n            h.getThreadMessagesRange(m, 0, 1, function(p) {\n                var q = (p.length && p[(p.length - 1)]);\n                if ((q && (q.author != i.user))) {\n                    i.get(q.author, function(r) {\n                        if (o.name) {\n                            n(k._(\"{senderName} messaged {groupName}\", {\n                                senderName: r.short_name,\n                                groupName: o.name\n                            }));\n                        }\n                         else n(k._(\"{name} messaged you\", {\n                            name: r.short_name\n                        }));\n                    ;\n                    });\n                }\n                 else n(\"New message!\");\n            ;\n            });\n        });\n    };\n    e.exports = {\n        renderDocumentTitle: l\n    };\n});\n__d(\"MercuryTimestampTracker\", [\"MercuryActionTypeConstants\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryActionTypeConstants\"), h = b(\"MercuryPayloadSource\"), i = b(\"MercurySingletonMixin\"), j = b(\"MercuryServerRequests\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._fbid = m;\n        this._serverRequests = j.getForFBID(this._fbid);\n        this._lastTimestamp = 0;\n        this._serverRequests.subscribe(\"update-messages\", function(n, o) {\n            if ((!o.actions || !o.actions.length)) {\n                return\n            };\n            if (((o.payload_source == h.CLIENT_SEND_MESSAGE) || (o.payload_source == h.UNKNOWN))) {\n                return\n            };\n            for (var p = 0; (p < o.actions.length); p++) {\n                var q = o.actions[p], r = q.action_type;\n                if ((((r == g.USER_GENERATED_MESSAGE) && q.thread_id) && (q.timestamp > this._lastTimestamp))) {\n                    this._lastTimestamp = q.timestamp;\n                };\n            };\n        }.bind(this));\n    };\n    k(l.prototype, {\n        getLastUserMessageTimestamp: function() {\n            return this._lastTimestamp;\n        }\n    });\n    k(l, i);\n    e.exports = l;\n});\n__d(\"ChatTitleBarBlinker\", [\"ChatActivity\",\"DocumentTitle\",\"JSLogger\",\"MercuryThreadInformer\",\"MercuryNotificationRenderer\",\"PresenceState\",\"MercuryTimestampTracker\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = b(\"MercuryThreadInformer\").get(), k = b(\"MercuryNotificationRenderer\"), l = b(\"PresenceState\"), m = b(\"MercuryTimestampTracker\").get(), n = i.create(\"chat_title\"), o = null, p = 0, q = false;\n    function r() {\n        if (o) {\n            o.stop();\n            o = null;\n            return true;\n        }\n    ;\n        return false;\n    };\n    function s(x) {\n        var y = (x || m.getLastUserMessageTimestamp());\n        if ((p <= y)) {\n            p = y;\n            if ((r() || q)) {\n                l.doSync();\n            };\n        }\n    ;\n    };\n    var t = {\n        blink: function(x, y) {\n            if ((!o && (p < y))) {\n                k.renderDocumentTitle(x, function(z) {\n                    if (!o) {\n                        o = h.blink(z);\n                    };\n                });\n            };\n        },\n        stopBlinking: function() {\n            s();\n        },\n        blinkingElsewhere: function() {\n            q = true;\n        }\n    };\n    function u(x) {\n        var y = l.verifyNumber(x.sb2);\n        if ((!y || (y <= p))) {\n            return null\n        };\n        return y;\n    };\n    function v(x) {\n        var y = (x && u(x));\n        if (y) {\n            p = y;\n            n.debug(\"load\", p);\n            r();\n            q = false;\n        }\n    ;\n    };\n    function w(x) {\n        var y = u(x);\n        if (!y) {\n            n.debug(\"store\", p);\n            x.sb2 = p;\n            q = false;\n        }\n    ;\n        return x;\n    };\n    l.registerStateStorer(w);\n    l.registerStateLoader(v);\n    j.subscribe(\"thread-read-changed\", function(x, y) {\n        var z = m.getLastUserMessageTimestamp(), aa = 0;\n        for (var ba in y) {\n            if (((y[ba].mark_as_read && (y[ba].timestamp >= z)) && (y[ba].timestamp > aa))) {\n                aa = y[ba].timestamp;\n            };\n        };\n        (aa && s(aa));\n    });\n    g.subscribe(\"activity\", function() {\n        s();\n    });\n    (function() {\n        var x = l.getInitial();\n        if (x) {\n            p = (u(x) || 0);\n        };\n    })();\n    e.exports = t;\n});\n__d(\"swfobject\", [\"AsyncRequest\",\"Bootloader\",\"ControlledReferer\",\"copyProperties\",\"CSS\",\"DOM\",\"function-extensions\",\"ge\",\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"ControlledReferer\"), j = b(\"copyProperties\"), k = b(\"CSS\"), l = b(\"DOM\");\n    b(\"function-extensions\");\n    var m = b(\"ge\"), n = b(\"htmlSpecialChars\");\n    if ((typeof o == \"undefined\")) {\n        var o = {\n        }\n    };\n    if ((typeof o.util == \"undefined\")) {\n        o.util = {\n        };\n    };\n    if ((typeof o.SWFObjectUtil == \"undefined\")) {\n        o.SWFObjectUtil = {\n        };\n    };\n    o.SWFObject = function(u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!document.getElementById) {\n            return\n        };\n        this.DETECT_KEY = (da ? da : \"detectflash\");\n        this.skipDetect = o.util.getRequestParameter(this.DETECT_KEY);\n        this.params = {\n        };\n        this.variables = {\n        };\n        this.attributes = [];\n        this.fallback_html = \"\";\n        this.fallback_js_fcn = function() {\n        \n        };\n        if (u) {\n            this.setAttribute(\"swf\", u);\n        };\n        if (v) {\n            this.setAttribute(\"id\", v);\n        };\n        if (w) {\n            this.setAttribute(\"width\", w);\n        };\n        if (x) {\n            this.setAttribute(\"height\", x);\n        };\n        this.installedVer = o.SWFObjectUtil.getPlayerVersion();\n        if (y) {\n            if (!((y instanceof Array))) {\n                y = [y,];\n            };\n            var ea;\n            y.forEach(function(ha) {\n                ea = new o.PlayerVersion(ha.toString().split(\".\"));\n                if ((ea.major == this.installedVer.major)) {\n                    this.setAttribute(\"version\", ea);\n                    return;\n                }\n                 else if ((!this.getAttribute(\"version\") || (ea.major < this.getAttribute(\"version\").major))) {\n                    this.setAttribute(\"version\", ea);\n                }\n            ;\n            }.bind(this));\n        }\n    ;\n        if (((!window.opera && document.all) && (this.installedVer.major > 7))) {\n            if (!o.unloadSet) {\n                o.SWFObjectUtil.prepUnload = function() {\n                    var ha = function() {\n                    \n                    }, ia = function() {\n                    \n                    };\n                    window.attachEvent(\"onunload\", o.SWFObjectUtil.cleanupSWFs);\n                };\n                window.attachEvent(\"onbeforeunload\", o.SWFObjectUtil.prepUnload);\n                o.unloadSet = true;\n            }\n        \n        };\n        if (z) {\n            this.addParam(\"bgcolor\", z);\n        };\n        var fa = (aa ? aa : \"high\");\n        this.addParam(\"quality\", fa);\n        this.setAttribute(\"useExpressInstall\", false);\n        this.setAttribute(\"doExpressInstall\", false);\n        var ga = ((ba) ? ba : window.location);\n        this.setAttribute(\"xiRedirectUrl\", ga);\n        this.setAttribute(\"redirectUrl\", \"\");\n        if (ca) {\n            this.setAttribute(\"redirectUrl\", ca);\n        };\n        this.setAttribute(\"useIframe\", false);\n    };\n    o.SWFObject.ieWorkaroundApplied = false;\n    o.SWFObject.ensureIEWorkaroundAttached = function() {\n        if ((!o.SWFObject.ieWorkaroundApplied && document.attachEvent)) {\n            o.SWFObject.ieWorkaroundApplied = true;\n            document.attachEvent(\"onpropertychange\", o.SWFObject.onDocumentPropertyChange);\n        }\n    ;\n    };\n    o.SWFObject.onDocumentPropertyChange = function(event) {\n        if ((event.propertyName == \"title\")) {\n            var u = document.title;\n            if (((u != null) && (u.indexOf(\"#!\") != -1))) {\n                u = u.substring(0, u.indexOf(\"#!\"));\n                document.title = u;\n            }\n        ;\n        }\n    ;\n    };\n    j(o.SWFObject.prototype, {\n        useExpressInstall: function(u) {\n            this.xiSWFPath = (!u ? \"/swf/expressinstall.swf\" : u);\n            this.setAttribute(\"useExpressInstall\", true);\n        },\n        setAttribute: function(u, v) {\n            this.attributes[u] = v;\n        },\n        getAttribute: function(u) {\n            return (this.attributes[u] || \"\");\n        },\n        addParam: function(u, v) {\n            this.params[u] = v;\n        },\n        getParams: function() {\n            return this.params;\n        },\n        addVariable: function(u, v) {\n            this.variables[u] = v;\n        },\n        getVariable: function(u) {\n            return (this.variables[u] || \"\");\n        },\n        getVariables: function() {\n            return this.variables;\n        },\n        getVariablePairs: function() {\n            var u = [], v, w = this.getVariables();\n            for (v in w) {\n                u[u.length] = ((v + \"=\") + w[v]);;\n            };\n            return u.join(\"&\");\n        },\n        getSWFHTML: function() {\n            var u, v, w;\n            if (((navigator.plugins && navigator.mimeTypes) && navigator.mimeTypes.length)) {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"PlugIn\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n                v = {\n                    type: \"application/x-shockwave-flash\",\n                    src: this.getAttribute(\"swf\"),\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: (this.getAttribute(\"style\") || \"display: block;\"),\n                    id: this.getAttribute(\"id\"),\n                    name: this.getAttribute(\"id\")\n                };\n                var x = this.getParams();\n                for (var y in x) {\n                    v[y] = x[y];;\n                };\n                w = this.getVariablePairs();\n                if (w) {\n                    v.flashvars = w;\n                };\n                u = t(\"embed\", v, null);\n            }\n             else {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"ActiveX\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n                v = {\n                    id: this.getAttribute(\"id\"),\n                    classid: \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: (this.getAttribute(\"style\") || \"display: block;\")\n                };\n                var z = t(\"param\", {\n                    name: \"movie\",\n                    value: this.getAttribute(\"swf\")\n                }, null), x = this.getParams();\n                for (var y in x) {\n                    z += t(\"param\", {\n                        name: y,\n                        value: x[y]\n                    }, null);;\n                };\n                w = this.getVariablePairs();\n                if (w) {\n                    z += t(\"param\", {\n                        name: \"flashvars\",\n                        value: w\n                    }, null);\n                };\n                u = t(\"object\", v, z);\n            }\n        ;\n            return u;\n        },\n        write: function(u) {\n            if (this.getAttribute(\"useExpressInstall\")) {\n                var v = new o.PlayerVersion([6,0,65,]);\n                if ((this.installedVer.versionIsValid(v) && !this.installedVer.versionIsValid(this.getAttribute(\"version\")))) {\n                    this.setAttribute(\"doExpressInstall\", true);\n                    this.addVariable(\"MMredirectURL\", escape(this.getAttribute(\"xiRedirectUrl\")));\n                    document.title = (document.title.slice(0, 47) + \" - Flash Player Installation\");\n                    this.addVariable(\"MMdoctitle\", document.title);\n                }\n            ;\n            }\n        ;\n            var w = (((typeof u == \"string\")) ? document.getElementById(u) : u);\n            if (!w) {\n                return false\n            };\n            k.addClass(w, \"swfObject\");\n            w.setAttribute(\"data-swfid\", this.getAttribute(\"id\"));\n            if (((this.skipDetect || this.getAttribute(\"doExpressInstall\")) || this.installedVer.versionIsValid(this.getAttribute(\"version\")))) {\n                if (!this.getAttribute(\"useIframe\")) {\n                    o.SWFObject.ensureIEWorkaroundAttached();\n                    w.innerHTML = this.getSWFHTML();\n                }\n                 else this._createIframe(w);\n            ;\n                return true;\n            }\n             else {\n                if ((this.getAttribute(\"redirectUrl\") != \"\")) {\n                    document.location.replace(this.getAttribute(\"redirectUrl\"));\n                };\n                var x = ((((((this.getAttribute(\"version\").major + \".\") + this.getAttribute(\"version\").minor) + \".\") + this.getAttribute(\"version\").release) + \".\") + this.getAttribute(\"version\").build), y = ((((((this.installedVer.major + \".\") + this.installedVer.minor) + \".\") + this.installedVer.release) + \".\") + this.installedVer.build);\n                this.fallback_js_fcn(y, x);\n                w.innerHTML = this.fallback_html;\n            }\n        ;\n            return false;\n        },\n        _createIframe: function(u) {\n            var v = l.create(\"iframe\", {\n                width: this.getAttribute(\"width\"),\n                height: this.getAttribute(\"height\"),\n                frameBorder: 0\n            });\n            l.empty(u);\n            u.appendChild(v);\n            i.useFacebookRefererHtml(v, this.getSWFHTML(), this.getAttribute(\"iframeSource\"));\n        }\n    });\n    o.SWFObjectUtil.getPlayerVersion = function() {\n        var u = new o.PlayerVersion([0,0,0,0,]), v;\n        if ((navigator.plugins && navigator.mimeTypes.length)) {\n            for (var w = 0; (w < navigator.plugins.length); w++) {\n                try {\n                    var y = navigator.plugins[w];\n                    if ((y.name == \"Shockwave Flash\")) {\n                        v = new o.PlayerVersion(y.description.replace(/([a-zA-Z]|\\s)+/, \"\").replace(/(\\s+(r|d)|\\s+b[0-9]+)/, \".\").split(\".\"));\n                        if ((((typeof u == \"undefined\") || (v.major > u.major)) || (((v.major == u.major) && (((v.minor > u.minor) || (((v.minor == u.minor) && (((v.release > u.release) || (((v.release == u.release) && (v.build > u.build))))))))))))) {\n                            u = v;\n                        };\n                    }\n                ;\n                } catch (x) {\n                \n                };\n            };\n        }\n         else if ((navigator.userAgent && (navigator.userAgent.indexOf(\"Windows CE\") >= 0))) {\n            var z = 1, aa = 3;\n            while (z) {\n                try {\n                    aa++;\n                    z = new ActiveXObject((\"ShockwaveFlash.ShockwaveFlash.\" + aa));\n                    u = new o.PlayerVersion([aa,0,0,]);\n                } catch (ba) {\n                    z = null;\n                };\n            };\n        }\n         else {\n            try {\n                var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n            } catch (ca) {\n                try {\n                    var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n                    u = new o.PlayerVersion([6,0,21,]);\n                    z.AllowScriptAccess = \"always\";\n                } catch (da) {\n                    if ((u.major == 6)) {\n                        return u\n                    };\n                };\n                try {\n                    z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n                } catch (ea) {\n                \n                };\n            };\n            if ((z != null)) {\n                u = new o.PlayerVersion(z.GetVariable(\"$version\").split(\" \")[1].split(\",\"));\n            };\n        }\n        \n    ;\n        return u;\n    };\n    o.PlayerVersion = function(u) {\n        this.major = ((u[0] != null) ? parseInt(u[0], 10) : 0);\n        this.minor = ((u[1] != null) ? parseInt(u[1], 10) : 0);\n        this.release = ((u[2] != null) ? parseInt(u[2], 10) : 0);\n        this.build = ((u[3] != null) ? parseInt(u[3], 10) : 0);\n    };\n    o.PlayerVersion.prototype.versionIsValid = function(u) {\n        if ((this.major < u.major)) {\n            return false\n        };\n        if ((this.major > u.major)) {\n            return true\n        };\n        if ((this.minor < u.minor)) {\n            return false\n        };\n        if ((this.minor > u.minor)) {\n            return true\n        };\n        if ((this.release < u.release)) {\n            return false\n        };\n        if ((this.release > u.release)) {\n            return true\n        };\n        if ((this.build < u.build)) {\n            return false\n        };\n        return true;\n    };\n    o.util = {\n        getRequestParameter: function(u) {\n            var v = (document.location.search || document.location.hash);\n            if ((u == null)) {\n                return v\n            };\n            if (v) {\n                var w = v.substring(1).split(\"&\");\n                for (var x = 0; (x < w.length); x++) {\n                    if ((w[x].substring(0, w[x].indexOf(\"=\")) == u)) {\n                        return w[x].substring(((w[x].indexOf(\"=\") + 1)))\n                    };\n                };\n            }\n        ;\n            return \"\";\n        }\n    };\n    o.SWFObjectUtil.cleanupSWFs = function() {\n        var u = document.getElementsByTagName(\"OBJECT\");\n        for (var v = (u.length - 1); (v >= 0); v--) {\n            u[v].style.display = \"none\";\n            for (var w in u[v]) {\n                if ((typeof u[v][w] == \"function\")) {\n                    u[v][w] = function() {\n                    \n                    };\n                };\n            };\n        };\n    };\n    if ((!document.getElementById && document.all)) {\n        document.getElementById = function(u) {\n            return document.all[u];\n        };\n    };\n    var p = o.util.getRequestParameter, q = o.SWFObject, r = o.SWFObject;\n    o.spawn_flash_update_dialog = function() {\n        new g().setURI(\"/ajax/flash_update_dialog.php\").setMethod(\"GET\").setReadOnly(true).send();\n    };\n    function s(u, v) {\n        var w = m(u), x = o.SWFObjectUtil.getPlayerVersion(), y;\n        v.forEach(function(ba) {\n            ba = new o.PlayerVersion(ba.toString().split(\".\"));\n            if ((ba.major == x.major)) {\n                y = ba;\n                return;\n            }\n             else if (((typeof y == \"undefined\") || (ba.major < y.major))) {\n                y = ba;\n            }\n        ;\n        }.bind(this));\n        if ((w && (x.major > 0))) {\n            var z = ((((((x.major + \".\") + x.minor) + \".\") + x.release) + \".\") + x.build), aa = ((((((y.major + \".\") + y.minor) + \".\") + y.release) + \".\") + y.build);\n            l.setContent(w, l.tx._(\"Flash {required-version} is required to view this content. Your current version is {current-version}. Please download the latest Flash Player.\", {\n                \"required-version\": aa,\n                \"current-version\": z\n            }));\n        }\n    ;\n    };\n    o.showFlashErrorDialog = function(u, v) {\n        h.loadModules([\"ErrorDialog\",], function(w) {\n            w.show(u, v);\n        });\n    };\n    function t(u, v, w) {\n        var x = /^[A-Za-z0-9\\-]+$/;\n        if (!u.match(x)) {\n            throw new Error((\"Invalid tag \" + u))\n        };\n        var y = (\"\\u003C\" + u);\n        for (var z in v) {\n            if (!z.match(x)) {\n                throw new Error((\"Invalid attr \" + z))\n            };\n            y += ((((\" \" + z) + \"=\\\"\") + n(v[z])) + \"\\\"\");\n        };\n        if ((w === null)) {\n            return (y + \"/\\u003E\");\n        }\n         else return (((((y + \"\\u003E\") + w) + \"\\u003C/\") + u) + \"\\u003E\")\n    ;\n    };\n    e.exports = (a.deconcept || o);\n});\n__d(\"swfobject2\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"undefined\", i = \"object\", j = \"Shockwave Flash\", k = \"ShockwaveFlash.ShockwaveFlash\", l = \"application/x-shockwave-flash\", m = \"SWFObjectExprInst\", n = \"onreadystatechange\", o = window, p = document, q = navigator, r = false, s = [ka,], t = [], u = [], v = [], w, x, y, z, aa = false, ba = false, ca, da, ea = true, fa = function() {\n            var eb = (((typeof p.getElementById != h) && (typeof p.getElementsByTagName != h)) && (typeof p.createElement != h)), fb = q.userAgent.toLowerCase(), gb = q.platform.toLowerCase(), hb = (gb ? /win/.test(gb) : /win/.test(fb)), ib = (gb ? /mac/.test(gb) : /mac/.test(fb)), jb = (/webkit/.test(fb) ? parseFloat(fb.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false), kb = !+\"\\u000b1\", lb = [0,0,0,], mb = null;\n            if (((typeof q.plugins != h) && (typeof q.plugins[j] == i))) {\n                mb = q.plugins[j].description;\n                if ((mb && !((((typeof q.mimeTypes != h) && q.mimeTypes[l]) && !q.mimeTypes[l].enabledPlugin)))) {\n                    r = true;\n                    kb = false;\n                    mb = mb.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n                    lb[0] = parseInt(mb.replace(/^(.*)\\..*$/, \"$1\"), 10);\n                    lb[1] = parseInt(mb.replace(/^.*\\.(.*)\\s.*$/, \"$1\"), 10);\n                    lb[2] = (/[a-zA-Z]/.test(mb) ? parseInt(mb.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\"), 10) : 0);\n                }\n            ;\n            }\n             else if ((typeof o.ActiveXObject != h)) {\n                try {\n                    var ob = new ActiveXObject(k);\n                    if (ob) {\n                        mb = ob.GetVariable(\"$version\");\n                        if (mb) {\n                            kb = true;\n                            mb = mb.split(\" \")[1].split(\",\");\n                            lb = [parseInt(mb[0], 10),parseInt(mb[1], 10),parseInt(mb[2], 10),];\n                        }\n                    ;\n                    }\n                ;\n                } catch (nb) {\n                \n                }\n            }\n        ;\n            return {\n                w3: eb,\n                pv: lb,\n                wk: jb,\n                ie: kb,\n                win: hb,\n                mac: ib\n            };\n        }(), ga = function() {\n            if (!fa.w3) {\n                return\n            };\n            if (((((typeof p.readyState != h) && (p.readyState == \"complete\"))) || (((typeof p.readyState == h) && ((p.getElementsByTagName(\"body\")[0] || p.body)))))) {\n                ha();\n            };\n            if (!aa) {\n                if ((typeof p.addEventListener != h)) {\n                    p.addEventListener(\"DOMContentLoaded\", ha, false);\n                };\n                if ((fa.ie && fa.win)) {\n                    p.attachEvent(n, function() {\n                        if ((p.readyState == \"complete\")) {\n                            p.detachEvent(n, arguments.callee);\n                            ha();\n                        }\n                    ;\n                    });\n                    if ((o == top)) {\n                        (function() {\n                            if (aa) {\n                                return\n                            };\n                            try {\n                                p.documentElement.doScroll(\"left\");\n                            } catch (eb) {\n                                setTimeout(arguments.callee, 0);\n                                return;\n                            };\n                            ha();\n                        })();\n                    };\n                }\n            ;\n                if (fa.wk) {\n                    (function() {\n                        if (aa) {\n                            return\n                        };\n                        if (!/loaded|complete/.test(p.readyState)) {\n                            setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                    ;\n                        ha();\n                    })();\n                };\n                ja(ha);\n            }\n        ;\n        }();\n        function ha() {\n            if (aa) {\n                return\n            };\n            try {\n                var fb = p.getElementsByTagName(\"body\")[0].appendChild(xa(\"span\"));\n                fb.parentNode.removeChild(fb);\n            } catch (eb) {\n                return;\n            };\n            aa = true;\n            var gb = s.length;\n            for (var hb = 0; (hb < gb); hb++) {\n                s[hb]();;\n            };\n        };\n        function ia(eb) {\n            if (aa) {\n                eb();\n            }\n             else s[s.length] = eb;\n        ;\n        };\n        function ja(eb) {\n            if ((typeof o.addEventListener != h)) {\n                o.addEventListener(\"load\", eb, false);\n            }\n             else if ((typeof p.addEventListener != h)) {\n                p.addEventListener(\"load\", eb, false);\n            }\n             else if ((typeof o.attachEvent != h)) {\n                ya(o, \"onload\", eb);\n            }\n             else if ((typeof o.onload == \"function\")) {\n                var fb = o.onload;\n                o.onload = function() {\n                    fb();\n                    eb();\n                };\n            }\n             else o.onload = eb;\n            \n            \n            \n        ;\n        };\n        function ka() {\n            if (r) {\n                la();\n            }\n             else ma();\n        ;\n        };\n        function la() {\n            var eb = p.getElementsByTagName(\"body\")[0], fb = xa(i);\n            fb.setAttribute(\"type\", l);\n            fb.setAttribute(\"style\", \"visibility: hidden; position: absolute; top: -1000px;\");\n            var gb = eb.appendChild(fb);\n            if (gb) {\n                var hb = 0;\n                (function() {\n                    if ((typeof gb.GetVariable != h)) {\n                        var ib = gb.GetVariable(\"$version\");\n                        if (ib) {\n                            ib = ib.split(\" \")[1].split(\",\");\n                            fa.pv = [parseInt(ib[0], 10),parseInt(ib[1], 10),parseInt(ib[2], 10),];\n                        }\n                    ;\n                    }\n                     else if ((hb < 10)) {\n                        hb++;\n                        setTimeout(arguments.callee, 10);\n                        return;\n                    }\n                    \n                ;\n                    gb = null;\n                    ma();\n                })();\n            }\n             else ma();\n        ;\n        };\n        function ma() {\n            var eb = t.length;\n            if ((eb > 0)) {\n                for (var fb = 0; (fb < eb); fb++) {\n                    var gb = t[fb].id, hb = t[fb].callbackFn, ib = {\n                        success: false,\n                        id: gb\n                    };\n                    if ((fa.pv[0] > 0)) {\n                        var jb = wa(gb);\n                        if (jb) {\n                            if ((za(t[fb].swfVersion) && !((fa.wk && (fa.wk < 312))))) {\n                                bb(gb, true);\n                                if (hb) {\n                                    ib.success = true;\n                                    ib.ref = na(gb);\n                                    hb(ib);\n                                }\n                            ;\n                            }\n                             else if ((t[fb].expressInstall && oa())) {\n                                var kb = {\n                                };\n                                kb.data = t[fb].expressInstall;\n                                kb.width = (jb.getAttribute(\"width\") || \"0\");\n                                kb.height = (jb.getAttribute(\"height\") || \"0\");\n                                if (jb.getAttribute(\"class\")) {\n                                    kb.styleclass = jb.getAttribute(\"class\");\n                                };\n                                if (jb.getAttribute(\"align\")) {\n                                    kb.align = jb.getAttribute(\"align\");\n                                };\n                                var lb = {\n                                }, mb = jb.getElementsByTagName(\"param\"), nb = mb.length;\n                                for (var ob = 0; (ob < nb); ob++) {\n                                    if ((mb[ob].getAttribute(\"name\").toLowerCase() != \"movie\")) {\n                                        lb[mb[ob].getAttribute(\"name\")] = mb[ob].getAttribute(\"value\");\n                                    };\n                                };\n                                pa(kb, lb, gb, hb);\n                            }\n                             else {\n                                qa(jb);\n                                if (hb) {\n                                    hb(ib);\n                                };\n                            }\n                            \n                        \n                        };\n                    }\n                     else {\n                        bb(gb, true);\n                        if (hb) {\n                            var pb = na(gb);\n                            if ((pb && (typeof pb.SetVariable != h))) {\n                                ib.success = true;\n                                ib.ref = pb;\n                            }\n                        ;\n                            hb(ib);\n                        }\n                    ;\n                    }\n                ;\n                }\n            };\n        };\n        function na(eb) {\n            var fb = null, gb = wa(eb);\n            if ((gb && (gb.nodeName == \"OBJECT\"))) {\n                if ((typeof gb.SetVariable != h)) {\n                    fb = gb;\n                }\n                 else {\n                    var hb = gb.getElementsByTagName(i)[0];\n                    if (hb) {\n                        fb = hb;\n                    };\n                }\n            \n            };\n            return fb;\n        };\n        function oa() {\n            return (((!ba && za(\"6.0.65\")) && ((fa.win || fa.mac))) && !((fa.wk && (fa.wk < 312))));\n        };\n        function pa(eb, fb, gb, hb) {\n            ba = true;\n            y = (hb || null);\n            z = {\n                success: false,\n                id: gb\n            };\n            var ib = wa(gb);\n            if (ib) {\n                if ((ib.nodeName == \"OBJECT\")) {\n                    w = ra(ib);\n                    x = null;\n                }\n                 else {\n                    w = ib;\n                    x = gb;\n                }\n            ;\n                eb.id = m;\n                if (((typeof eb.width == h) || ((!/%$/.test(eb.width) && (parseInt(eb.width, 10) < 310))))) {\n                    eb.width = \"310\";\n                };\n                if (((typeof eb.height == h) || ((!/%$/.test(eb.height) && (parseInt(eb.height, 10) < 137))))) {\n                    eb.height = \"137\";\n                };\n                p.title = (p.title.slice(0, 47) + \" - Flash Player Installation\");\n                var jb = ((fa.ie && fa.win) ? \"ActiveX\" : \"PlugIn\"), kb = (((((\"MMredirectURL=\" + o.location.toString().replace(/&/g, \"%26\")) + \"&MMplayerType=\") + jb) + \"&MMdoctitle=\") + p.title);\n                if ((typeof fb.flashvars != h)) {\n                    fb.flashvars += (\"&\" + kb);\n                }\n                 else fb.flashvars = kb;\n            ;\n                if (((fa.ie && fa.win) && (ib.readyState != 4))) {\n                    var lb = xa(\"div\");\n                    gb += \"SWFObjectNew\";\n                    lb.setAttribute(\"id\", gb);\n                    ib.parentNode.insertBefore(lb, ib);\n                    ib.style.display = \"none\";\n                    (function() {\n                        if ((ib.readyState == 4)) {\n                            ib.parentNode.removeChild(ib);\n                        }\n                         else setTimeout(arguments.callee, 10);\n                    ;\n                    })();\n                }\n            ;\n                sa(eb, fb, gb);\n            }\n        ;\n        };\n        function qa(eb) {\n            if (((fa.ie && fa.win) && (eb.readyState != 4))) {\n                var fb = xa(\"div\");\n                eb.parentNode.insertBefore(fb, eb);\n                fb.parentNode.replaceChild(ra(eb), fb);\n                eb.style.display = \"none\";\n                (function() {\n                    if ((eb.readyState == 4)) {\n                        eb.parentNode.removeChild(eb);\n                    }\n                     else setTimeout(arguments.callee, 10);\n                ;\n                })();\n            }\n             else eb.parentNode.replaceChild(ra(eb), eb);\n        ;\n        };\n        function ra(eb) {\n            var fb = xa(\"div\");\n            if ((fa.win && fa.ie)) {\n                fb.innerHTML = eb.innerHTML;\n            }\n             else {\n                var gb = eb.getElementsByTagName(i)[0];\n                if (gb) {\n                    var hb = gb.childNodes;\n                    if (hb) {\n                        var ib = hb.length;\n                        for (var jb = 0; (jb < ib); jb++) {\n                            if ((!(((hb[jb].nodeType == 1) && (hb[jb].nodeName == \"PARAM\"))) && !((hb[jb].nodeType == 8)))) {\n                                fb.appendChild(hb[jb].cloneNode(true));\n                            };\n                        };\n                    }\n                ;\n                }\n            ;\n            }\n        ;\n            return fb;\n        };\n        function sa(eb, fb, gb) {\n            var hb, ib = wa(gb);\n            if ((fa.wk && (fa.wk < 312))) {\n                return hb\n            };\n            if (ib) {\n                if ((typeof eb.id == h)) {\n                    eb.id = gb;\n                };\n                if ((fa.ie && fa.win)) {\n                    var jb = \"\";\n                    for (var kb in eb) {\n                        if ((eb[kb] != Object.prototype[kb])) {\n                            if ((kb.toLowerCase() == \"data\")) {\n                                fb.movie = eb[kb];\n                            }\n                             else if ((kb.toLowerCase() == \"styleclass\")) {\n                                jb += ((\" class=\\\"\" + eb[kb]) + \"\\\"\");\n                            }\n                             else if ((kb.toLowerCase() != \"classid\")) {\n                                jb += ((((\" \" + kb) + \"=\\\"\") + eb[kb]) + \"\\\"\");\n                            }\n                            \n                        \n                        };\n                    };\n                    var lb = \"\";\n                    for (var mb in fb) {\n                        if ((fb[mb] != Object.prototype[mb])) {\n                            lb += ((((\"\\u003Cparam name=\\\"\" + mb) + \"\\\" value=\\\"\") + fb[mb]) + \"\\\" /\\u003E\");\n                        };\n                    };\n                    ib.outerHTML = ((((\"\\u003Cobject classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\"\" + jb) + \"\\u003E\") + lb) + \"\\u003C/object\\u003E\");\n                    u[u.length] = eb.id;\n                    hb = wa(eb.id);\n                }\n                 else {\n                    var nb = xa(i);\n                    nb.setAttribute(\"type\", l);\n                    for (var ob in eb) {\n                        if ((eb[ob] != Object.prototype[ob])) {\n                            if ((ob.toLowerCase() == \"styleclass\")) {\n                                nb.setAttribute(\"class\", eb[ob]);\n                            }\n                             else if ((ob.toLowerCase() != \"classid\")) {\n                                nb.setAttribute(ob, eb[ob]);\n                            }\n                        \n                        };\n                    };\n                    for (var pb in fb) {\n                        if (((fb[pb] != Object.prototype[pb]) && (pb.toLowerCase() != \"movie\"))) {\n                            ta(nb, pb, fb[pb]);\n                        };\n                    };\n                    ib.parentNode.replaceChild(nb, ib);\n                    hb = nb;\n                }\n            ;\n            }\n        ;\n            return hb;\n        };\n        function ta(eb, fb, gb) {\n            var hb = xa(\"param\");\n            hb.setAttribute(\"name\", fb);\n            hb.setAttribute(\"value\", gb);\n            eb.appendChild(hb);\n        };\n        function ua(eb) {\n            var fb = wa(eb);\n            if ((fb && (fb.nodeName == \"OBJECT\"))) {\n                if ((fa.ie && fa.win)) {\n                    fb.style.display = \"none\";\n                    (function() {\n                        if ((fb.readyState == 4)) {\n                            va(eb);\n                        }\n                         else setTimeout(arguments.callee, 10);\n                    ;\n                    })();\n                }\n                 else fb.parentNode.removeChild(fb);\n            \n            };\n        };\n        function va(eb) {\n            var fb = wa(eb);\n            if (fb) {\n                for (var gb in fb) {\n                    if ((typeof fb[gb] == \"function\")) {\n                        fb[gb] = null;\n                    };\n                };\n                fb.parentNode.removeChild(fb);\n            }\n        ;\n        };\n        function wa(eb) {\n            var fb = null;\n            try {\n                fb = p.getElementById(eb);\n            } catch (gb) {\n            \n            };\n            return fb;\n        };\n        function xa(eb) {\n            return p.createElement(eb);\n        };\n        function ya(eb, fb, gb) {\n            eb.attachEvent(fb, gb);\n            v[v.length] = [eb,fb,gb,];\n        };\n        function za(eb) {\n            var fb = fa.pv, gb = eb.split(\".\");\n            gb[0] = parseInt(gb[0], 10);\n            gb[1] = (parseInt(gb[1], 10) || 0);\n            gb[2] = (parseInt(gb[2], 10) || 0);\n            return (((((fb[0] > gb[0]) || (((fb[0] == gb[0]) && (fb[1] > gb[1])))) || ((((fb[0] == gb[0]) && (fb[1] == gb[1])) && (fb[2] >= gb[2]))))) ? true : false);\n        };\n        function ab(eb, fb, gb, hb) {\n            if ((fa.ie && fa.mac)) {\n                return\n            };\n            var ib = p.getElementsByTagName(\"head\")[0];\n            if (!ib) {\n                return\n            };\n            var jb = (((gb && (typeof gb == \"string\"))) ? gb : \"screen\");\n            if (hb) {\n                ca = null;\n                da = null;\n            }\n        ;\n            if ((!ca || (da != jb))) {\n                var kb = xa(\"style\");\n                kb.setAttribute(\"type\", \"text/css\");\n                kb.setAttribute(\"media\", jb);\n                ca = ib.appendChild(kb);\n                if ((((fa.ie && fa.win) && (typeof p.styleSheets != h)) && (p.styleSheets.length > 0))) {\n                    ca = p.styleSheets[(p.styleSheets.length - 1)];\n                };\n                da = jb;\n            }\n        ;\n            if ((fa.ie && fa.win)) {\n                if ((ca && (typeof ca.addRule == i))) {\n                    ca.addRule(eb, fb);\n                };\n            }\n             else if ((ca && (typeof p.createTextNode != h))) {\n                ca.appendChild(p.createTextNode((((eb + \" {\") + fb) + \"}\")));\n            }\n        ;\n        };\n        function bb(eb, fb) {\n            if (!ea) {\n                return\n            };\n            var gb = (fb ? \"visible\" : \"hidden\");\n            if ((aa && wa(eb))) {\n                wa(eb).style.visibility = gb;\n            }\n             else ab((\"#\" + eb), (\"visibility:\" + gb));\n        ;\n        };\n        function cb(eb) {\n            var fb = /[\\\\\\\"<>\\.;]/, gb = (fb.exec(eb) != null);\n            return ((gb && (typeof encodeURIComponent != h)) ? encodeURIComponent(eb) : eb);\n        };\n        var db = function() {\n            if ((fa.ie && fa.win)) {\n                window.attachEvent(\"onunload\", function() {\n                    var eb = v.length;\n                    for (var fb = 0; (fb < eb); fb++) {\n                        v[fb][0].detachEvent(v[fb][1], v[fb][2]);;\n                    };\n                    var gb = u.length;\n                    for (var hb = 0; (hb < gb); hb++) {\n                        ua(u[hb]);;\n                    };\n                    for (var ib in fa) {\n                        fa[ib] = null;;\n                    };\n                    fa = null;\n                    for (var jb in g) {\n                        g[jb] = null;;\n                    };\n                    g = null;\n                });\n            };\n        }();\n        return {\n            registerObject: function(eb, fb, gb, hb) {\n                if (((fa.w3 && eb) && fb)) {\n                    var ib = {\n                    };\n                    ib.id = eb;\n                    ib.swfVersion = fb;\n                    ib.expressInstall = gb;\n                    ib.callbackFn = hb;\n                    t[t.length] = ib;\n                    bb(eb, false);\n                }\n                 else if (hb) {\n                    hb({\n                        success: false,\n                        id: eb\n                    });\n                }\n            ;\n            },\n            getObjectById: function(eb) {\n                if (fa.w3) {\n                    return na(eb)\n                };\n            },\n            embedSWF: function(eb, fb, gb, hb, ib, jb, kb, lb, mb, nb) {\n                var ob = {\n                    success: false,\n                    id: fb\n                };\n                if (((((((fa.w3 && !((fa.wk && (fa.wk < 312)))) && eb) && fb) && gb) && hb) && ib)) {\n                    bb(fb, false);\n                    ia(function() {\n                        gb += \"\";\n                        hb += \"\";\n                        var pb = {\n                        };\n                        if ((mb && (typeof mb === i))) {\n                            for (var qb in mb) {\n                                pb[qb] = mb[qb];;\n                            }\n                        };\n                        pb.data = eb;\n                        pb.width = gb;\n                        pb.height = hb;\n                        var rb = {\n                        };\n                        if ((lb && (typeof lb === i))) {\n                            for (var sb in lb) {\n                                rb[sb] = lb[sb];;\n                            }\n                        };\n                        if ((kb && (typeof kb === i))) {\n                            for (var tb in kb) {\n                                if ((typeof rb.flashvars != h)) {\n                                    rb.flashvars += (((\"&\" + tb) + \"=\") + kb[tb]);\n                                }\n                                 else rb.flashvars = ((tb + \"=\") + kb[tb]);\n                            ;\n                            }\n                        };\n                        if (za(ib)) {\n                            var ub = sa(pb, rb, fb);\n                            if ((pb.id == fb)) {\n                                bb(fb, true);\n                            };\n                            ob.success = true;\n                            ob.ref = ub;\n                        }\n                         else if ((jb && oa())) {\n                            pb.data = jb;\n                            pa(pb, rb, fb, nb);\n                            return;\n                        }\n                         else bb(fb, true);\n                        \n                    ;\n                        if (nb) {\n                            nb(ob);\n                        };\n                    });\n                }\n                 else if (nb) {\n                    nb(ob);\n                }\n            ;\n            },\n            switchOffAutoHideShow: function() {\n                ea = false;\n            },\n            ua: fa,\n            getFlashPlayerVersion: function() {\n                return {\n                    major: fa.pv[0],\n                    minor: fa.pv[1],\n                    release: fa.pv[2]\n                };\n            },\n            hasFlashPlayerVersion: za,\n            createSWF: function(eb, fb, gb) {\n                if (fa.w3) {\n                    return sa(eb, fb, gb);\n                }\n                 else return undefined\n            ;\n            },\n            showExpressInstall: function(eb, fb, gb, hb) {\n                if ((fa.w3 && oa())) {\n                    pa(eb, fb, gb, hb);\n                };\n            },\n            removeSWF: function(eb) {\n                if (fa.w3) {\n                    ua(eb);\n                };\n            },\n            createCSS: function(eb, fb, gb, hb) {\n                if (fa.w3) {\n                    ab(eb, fb, gb, hb);\n                };\n            },\n            addDomLoadEvent: ia,\n            addLoadEvent: ja,\n            getQueryParamValue: function(eb) {\n                var fb = (p.location.search || p.location.hash);\n                if (fb) {\n                    if (/\\?/.test(fb)) {\n                        fb = fb.split(\"?\")[1];\n                    };\n                    if ((eb == null)) {\n                        return cb(fb)\n                    };\n                    var gb = fb.split(\"&\");\n                    for (var hb = 0; (hb < gb.length); hb++) {\n                        if ((gb[hb].substring(0, gb[hb].indexOf(\"=\")) == eb)) {\n                            return cb(gb[hb].substring(((gb[hb].indexOf(\"=\") + 1))))\n                        };\n                    };\n                }\n            ;\n                return \"\";\n            },\n            expressInstallCallback: function() {\n                if (ba) {\n                    var eb = wa(m);\n                    if ((eb && w)) {\n                        eb.parentNode.replaceChild(w, eb);\n                        if (x) {\n                            bb(x, true);\n                            if ((fa.ie && fa.win)) {\n                                w.style.display = \"block\";\n                            };\n                        }\n                    ;\n                        if (y) {\n                            y(z);\n                        };\n                    }\n                ;\n                    ba = false;\n                }\n            ;\n            }\n        };\n    }();\n    e.exports = g;\n});\n__d(\"SoundPlayer\", [\"Arbiter\",\"ChatConfig\",\"swfobject\",\"swfobject2\",\"URI\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatConfig\"), i = b(\"swfobject\").SWFObject, j = b(\"swfobject2\"), k = b(\"URI\"), l = b(\"createArrayFrom\"), m = {\n    }, n = null, o = false, p = \"so_sound_player\", q = \"/swf/SoundPlayer.swf?v=1\", r = \"10.0.22.87\", s = null, t = h.get(\"sound.useswfobject_2\", false), u = h.get(\"sound.force_flash\", false);\n    function v(da) {\n        var ea = k(da);\n        if (!ea.getDomain()) {\n            return k().setPath(ea.getPath()).toString()\n        };\n        return da;\n    };\n    function w(da) {\n        var ea = k(da).getPath();\n        if (/\\.mp3$/.test(ea)) {\n            return \"audio/mpeg\"\n        };\n        if (/\\.og[ga]$/.test(ea)) {\n            return \"audio/ogg\"\n        };\n        return \"\";\n    };\n    function x() {\n        if ((!s && !u)) {\n            var da = document.createElement(\"audio\");\n            if ((!da || !da.canPlayType)) {\n                return null\n            };\n            da.setAttribute(\"preload\", \"auto\");\n            document.body.appendChild(da);\n            s = da;\n        }\n    ;\n        return s;\n    };\n    function y() {\n        var da = (document[p] || window[p]);\n        if (da) {\n            if ((!da.playSound && da.length)) {\n                da = da[0];\n            }\n        };\n        return ((((da && da.playSound) && da.loopSound)) ? da : null);\n    };\n    function z() {\n        return o;\n    };\n    function aa(da, ea, fa) {\n        n = {\n            path: da,\n            sync: ea,\n            loop: fa\n        };\n    };\n    function ba() {\n        o = true;\n        if (n) {\n            var da = y();\n            if (n.loop) {\n                da.loopSound(n.path, n.sync);\n            }\n             else da.playSound(n.path, n.sync);\n        ;\n        }\n    ;\n    };\n    var ca = {\n        init: function(da) {\n            da = l(da);\n            var ea;\n            for (var fa = 0; (fa < da.length); ++fa) {\n                ea = da[fa];\n                if (m[ea]) {\n                    return\n                };\n            };\n            var ga = x();\n            for (fa = 0; (ga && (fa < da.length)); ++fa) {\n                ea = da[fa];\n                if (ga.canPlayType(ea)) {\n                    m[ea] = true;\n                    return;\n                }\n            ;\n            };\n            m[\"audio/mpeg\"] = true;\n            if (y()) {\n                return\n            };\n            try {\n                g.registerCallback(ba, [\"sound/player_ready\",\"sound/ready\",]);\n                var ia = document.createElement(\"div\");\n                ia.id = \"sound_player_holder\";\n                document.body.appendChild(ia);\n                if (t) {\n                    j.embedSWF(q, ia.id, \"1px\", \"1px\", r, null, {\n                        swf_id: p\n                    }, {\n                        allowscriptaccess: \"always\",\n                        wmode: \"transparent\"\n                    }, null, function(ka) {\n                        window[p] = ka.ref;\n                        g.inform(\"sound/player_ready\");\n                    });\n                }\n                 else {\n                    var ja = new i(q, p, \"1px\", \"1px\", [r,], \"#ffffff\");\n                    ja.addParam(\"allowscriptaccess\", \"always\");\n                    ja.addParam(\"wmode\", \"transparent\");\n                    ja.addVariable(\"swf_id\", p);\n                    ja.fallback_html = \" \";\n                    ja.write(ia.id);\n                    window[p] = ja;\n                    g.inform(\"sound/player_ready\");\n                }\n            ;\n            } catch (ha) {\n            \n            };\n        },\n        play: function(da, ea) {\n            da = l(da);\n            var fa = x(), ga, ha;\n            for (var ia = 0; (fa && (ia < da.length)); ++ia) {\n                ga = da[ia];\n                ha = w(ga);\n                if (!fa.canPlayType(ha)) {\n                    continue;\n                };\n                ca.init([ha,]);\n                fa.src = v(ga);\n                if (ea) {\n                    fa.setAttribute(\"loop\", \"\");\n                }\n                 else fa.removeAttribute(\"loop\");\n            ;\n                fa.play();\n                return;\n            };\n            for (ia = 0; (ia < da.length); ++ia) {\n                ga = v(da[ia]);\n                ha = w(ga);\n                if ((ha != \"audio/mpeg\")) {\n                    continue;\n                };\n                ca.init([ha,]);\n                var ja = y();\n                if (!z()) {\n                    aa(ga, true, ea);\n                    return;\n                }\n                 else if (ja) {\n                    if (ea) {\n                        ja.loopSound(ga, true);\n                    }\n                     else ja.playSound(ga, true);\n                ;\n                    return;\n                }\n                \n            ;\n            };\n        },\n        stop: function(da) {\n            da = l(da);\n            for (var ea = 0; (ea < da.length); ++ea) {\n                var fa = v(da[ea]), ga = x(), ha = y();\n                if ((ga && (ga.src == fa))) {\n                    ga.pause();\n                    ga.src = undefined;\n                }\n                 else (ha && ha.stopSound(fa));\n            ;\n            };\n        }\n    };\n    e.exports = ca;\n});\n__d(\"SoundSynchronizer\", [\"hasArrayNature\",\"SoundPlayer\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"SoundPlayer\"), i = b(\"createArrayFrom\"), j = \"fb_sounds_playing3\";\n    function k() {\n        if (window.localStorage) {\n            try {\n                var p = window.localStorage[j];\n                if (p) {\n                    p = JSON.parse(p);\n                    if (g(p)) {\n                        return p\n                    };\n                }\n            ;\n            } catch (o) {\n            \n            }\n        };\n        return [];\n    };\n    function l(o) {\n        if (window.localStorage) {\n            var p = k();\n            p.push(o);\n            while ((p.length > 5)) {\n                p.shift();;\n            };\n            try {\n                window.localStorage[j] = JSON.stringify(p);\n            } catch (q) {\n            \n            };\n        }\n    ;\n    };\n    function m(o) {\n        return k().some(function(p) {\n            return (p === o);\n        });\n    };\n    var n = {\n        play: function(o, p, q) {\n            o = i(o);\n            p = (p || ((o[0] + Math.floor((Date.now() / 1000)))));\n            if (m(p)) {\n                return\n            };\n            h.play(o, q);\n            l(p);\n        },\n        isSupported: function() {\n            return !!window.localStorage;\n        }\n    };\n    e.exports = n;\n});\n__d(\"Sound\", [\"SoundPlayer\",\"SoundRPC\",\"SoundSynchronizer\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SoundPlayer\"), h = b(\"SoundRPC\"), i = b(\"SoundSynchronizer\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = null, m = {\n        init: function(q) {\n            if (!l) {\n                g.init(q);\n            };\n        },\n        play: function(q, r, s) {\n            if (l) {\n                h.playRemote(l.contentWindow, q, r, false);\n            }\n             else h.playLocal(q, r, s);\n        ;\n        },\n        stop: function(q) {\n            if (!l) {\n                g.stop(q);\n            };\n        }\n    }, n = new j(location.href);\n    if ((n.getSubdomain() && (n.getSubdomain() !== \"www\"))) {\n        n.setSubdomain(\"www\");\n    };\n    var o = n.getDomain();\n    function p() {\n        if ((k.ie() < 9)) {\n            return false\n        };\n        return (i.isSupported() && h.supportsRPC());\n    };\n    if (((n.isFacebookURI() && (location.host !== o)) && p())) {\n        l = document.createElement(\"iframe\");\n        l.setAttribute(\"src\", ((\"//\" + o) + \"/sound_iframe.php\"));\n        l.style.display = \"none\";\n        document.body.appendChild(l);\n    }\n;\n    e.exports = m;\n});\n__d(\"MercuryBrowserAlerts\", [\"ArbiterMixin\",\"ChatActivity\",\"ChatConfig\",\"ChatOptions\",\"ChatTitleBarBlinker\",\"MercuryParticipants\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MessagingTag\",\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatOptions\"), k = b(\"ChatTitleBarBlinker\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryThreadMuter\"), n = b(\"MercuryThreads\").get(), o = b(\"MessagingTag\"), p = b(\"Sound\"), q = b(\"copyProperties\");\n    p.init([\"audio/ogg\",\"audio/mpeg\",]);\n    function r(t) {\n        if (j.getSetting(\"sound\")) {\n            p.play([i.get(\"sound.notif_ogg_url\"),i.get(\"sound.notif_mp3_url\"),], t, false);\n        };\n    };\n    var s = {\n        messageReceived: function(t) {\n            if ((((t.author == l.user) || !t.is_unread) || (((t.folder != o.INBOX) && (t.folder != o.ARCHIVED))))) {\n                return\n            };\n            var u = t.thread_id, v = h.isActive();\n            if (v) {\n                var w = false;\n                s.inform(\"before-alert\", {\n                    threadID: u,\n                    cancelAlert: function() {\n                        w = true;\n                    }\n                });\n            }\n        ;\n            n.getThreadMeta(u, function(x) {\n                var y = m.isThreadMuted(x);\n                if (y) {\n                    return\n                };\n                var z = t.timestamp;\n                if (v) {\n                    (!w && r(z));\n                }\n                 else {\n                    k.blink(u, z);\n                    r(z);\n                }\n            ;\n                k.blinkingElsewhere();\n            }.bind(this));\n        }\n    };\n    e.exports = q(s, g);\n});\n__d(\"ActiveXSupport\", [], function(a, b, c, d, e, f) {\n    var g = null, h = {\n        isSupported: function() {\n            if ((g !== null)) {\n                return g\n            };\n            try {\n                g = (!!window.ActiveXObject && !!new ActiveXObject(\"htmlfile\"));\n            } catch (i) {\n                g = false;\n            };\n            return g;\n        }\n    };\n    e.exports = h;\n});\n__d(\"VideoCallSupport\", [\"MercuryConfig\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"UserAgent\"), i = {\n        newVCIsSupported: function() {\n            return (g.NewVCGK && (((h.chrome() >= 24) || (h.firefox() >= 22))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"VideoCallRecordMessageDialog\", [\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"URI\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Dialog\"), j = b(\"URI\"), k = b(\"tx\"), l = {\n        get: function(m, n) {\n            var o = \"Would you like to leave a message?\", p = \"New Message\";\n            return new i().setTitle(k._(\"{firstname} is Unavailable\", {\n                firstname: n\n            })).setBody(o).setButtons([{\n                name: \"record-message\",\n                label: p\n            },i.CANCEL,]).setHandler(function() {\n                var q = j(\"/ajax/messaging/composer.php\").setQueryData({\n                    ids: [m,],\n                    autoloadvideo: true\n                }).toString();\n                g.send(new h(q));\n            });\n        }\n    };\n    e.exports = l;\n});\n__d(\"VideoCallCore\", [\"Event\",\"ActiveXSupport\",\"Arbiter\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConstants\",\"Cookie\",\"CSS\",\"Dialog\",\"MercuryConfig\",\"UserAgent\",\"VideoCallSupport\",\"emptyFunction\",\"ge\",\"VideoCallTemplates\",\"ShortProfiles\",\"VideoCallRecordMessageDialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ActiveXSupport\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AvailableList\"), l = b(\"AvailableListConstants\"), m = b(\"Bootloader\"), n = b(\"ChannelConstants\"), o = b(\"Cookie\"), p = b(\"CSS\"), q = b(\"Dialog\"), r = b(\"MercuryConfig\"), s = b(\"UserAgent\"), t = b(\"VideoCallSupport\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    b(\"VideoCallTemplates\");\n    var w = [], x = [], y = {\n        isSupported: function() {\n            if (t.newVCIsSupported()) {\n                return true\n            };\n            if (s.windows()) {\n                if (((s.ie() >= 9) && !s.ie64())) {\n                    return h.isSupported();\n                }\n                 else return ((((((s.ie() >= 7) && !s.ie64())) || (s.firefox() >= 3.6)) || (s.chrome() >= 5)) || (s.opera() >= 12))\n            ;\n            }\n             else if ((s.osx() > 10.4)) {\n                return (((((s.firefox() >= 3.6) || (s.chrome() >= 5)) || (s.webkit() >= 500)) || (s.opera() >= 12)))\n            }\n        ;\n            return false;\n        },\n        isInstalled: function() {\n            var ca = false;\n            if (this.isSupported()) {\n                if (z()) {\n                    var da = null;\n                    try {\n                        da = new ActiveXObject(\"SkypeLimited.SkypeWebPlugin\");\n                        ca = !!da;\n                    } catch (ea) {\n                    \n                    };\n                    da = null;\n                }\n                 else {\n                    ca = aa();\n                    if (r.VideoCallingNoJavaGK) {\n                        if ((ca && (s.osx() >= 10.8))) {\n                            if ((ca.description && (ca.description.charAt(0) != \"v\"))) {\n                                ca = false;\n                            }\n                        }\n                    };\n                }\n            \n            };\n            return ca;\n        },\n        mightReloadPostInstall: function() {\n            return s.windows();\n        },\n        onVideoMessage: function(ca) {\n            w.push(ca);\n            m.loadModules([\"VideoCallController\",], u);\n        },\n        onRTCMessage: function(ca) {\n            if (t.newVCIsSupported()) {\n                x.push(ca);\n                m.loadModules([\"FBRTCCallController\",], u);\n            }\n        ;\n        },\n        setMessageHandler: function(ca) {\n            this.onVideoMessage = ca;\n            if (ca) {\n                while (w.length) {\n                    ca(w.shift());;\n                }\n            };\n        },\n        setRTCMessageHandler: function(ca) {\n            this.onRTCMessage = ca;\n            if (ca) {\n                while (x.length) {\n                    ca(x.shift());;\n                }\n            };\n        },\n        availableForCall: function(ca) {\n            var da = k.get(ca);\n            return ((da == l.ACTIVE) || (da == l.IDLE));\n        },\n        onProfileButtonClick: function(ca) {\n            y.startCallOrLeaveMessage(ca, \"profile_button_click\");\n        },\n        attachListenerToProfileButton: function(ca) {\n            var da = v(\"videoCallProfileButton\");\n            if (da) {\n                if (!y.isSupported()) {\n                    p.hide(da);\n                    return;\n                }\n            ;\n                g.listen(da, \"click\", function(event) {\n                    y.startCallOrLeaveMessage(ca, \"profile_button_click_timeline\");\n                });\n            }\n        ;\n        },\n        startCallOrLeaveMessage: function(ca, da) {\n            if (this.availableForCall(ca)) {\n                y.showOutgoingCallDialog(ca, da);\n            }\n             else b(\"ShortProfiles\").get(ca, function(ea) {\n                b(\"VideoCallRecordMessageDialog\").get(ca, ea.firstName).show();\n            });\n        ;\n        },\n        showOutgoingCallDialog: function(ca, da) {\n            var ea = (da || \"unknown\");\n            y.logClick(ca, ea);\n            var fa = ((y.isInstalled() || r.NewVCGK) ? \"outgoing_dialog.php\" : \"intro.php\"), ga = (((\"/ajax/chat/video/\" + fa) + \"?idTarget=\") + ca);\n            new q().setAllowCrossPageTransition(true).setAsync(new j(ga)).show();\n        },\n        logClick: function(ca, da) {\n            new j().setURI(\"/ajax/chat/video/log_click.php\").setData({\n                targetUserID: ca,\n                clickSource: da\n            }).setAllowCrossPageTransition(true).setErrorHandler(u).send();\n        }\n    };\n    function z() {\n        return ((s.ie() && s.windows()) && !s.opera());\n    };\n    function aa() {\n        if (!navigator) {\n            return null\n        };\n        navigator.plugins.refresh(false);\n        var ca = navigator.mimeTypes[\"application/skypesdk-plugin\"];\n        return (ca && ca.enabledPlugin);\n    };\n    function ba() {\n        if (!y.mightReloadPostInstall()) {\n            return\n        };\n        var ca = o.get(\"vcpwn\");\n        if (ca) {\n            o.clear(\"vcpwn\");\n            var da = o.get(\"vctid\");\n            if (da) {\n                o.clear(\"vctid\");\n                if (o.get(\"vctid\")) {\n                    return\n                };\n                if ((da && y.isInstalled())) {\n                    var ea = (\"/ajax/chat/video/outgoing_dialog.php?idTarget=\" + da);\n                    new q().setAllowCrossPageTransition(true).setAsync(new j(ea)).show();\n                }\n            ;\n            }\n        ;\n        }\n    ;\n    };\n    i.subscribe(n.getArbiterType(\"video\"), function(ca, da) {\n        y.onVideoMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"webrtc\"), function(ca, da) {\n        y.onRTCMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"chat_event\"), function(ca, da) {\n        if ((da.obj.event_name == \"missed-call\")) {\n            m.loadModules([\"VideoCallController\",], function(ea) {\n                ea.onMissedCallEvent(da.obj);\n            });\n        };\n    });\n    ba();\n    e.exports = y;\n});\n__d(\"ChatTabModel\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"ChatBehavior\",\"ChatConfig\",\"JSLogger\",\"MercuryAssert\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryTimestampTracker\",\"PresenceInitialData\",\"PresenceState\",\"PresenceUtil\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"JSLogger\"), l = b(\"MercuryAssert\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"MercuryTimestampTracker\").get(), p = b(\"PresenceInitialData\"), q = b(\"PresenceState\"), r = b(\"PresenceUtil\"), s = b(\"areObjectsEqual\"), t = b(\"copyProperties\"), u = [], v = null, w = null, x = null, y = null;\n    function z() {\n        return parseInt(p.serverTime, 10);\n    };\n    var aa = (j.get(\"tab_max_load_age\") || 3600000), ba = (z() - aa), ca = 0, da = 20, ea = k.create(\"chat_tab_model\"), fa = false;\n    function ga(xa) {\n        var ya = q.verifyNumber(xa.uct2);\n        if ((!ya || (typeof ya !== \"number\"))) {\n            ea.warn(\"bad_cookie_version\", xa.uct2);\n            return null;\n        }\n    ;\n        if (((ya < ca) || (ya < ba))) {\n            return null\n        };\n        return ya;\n    };\n    function ha(xa) {\n        var ya = ga(xa);\n        if (!ya) {\n            var za = {\n            };\n            za.old_tabs = ((xa && xa.t2) && JSON.stringify(xa.t2));\n            za.old_promoted = (xa && xa.lm2);\n            za.old_time = (xa && xa.uct2);\n            za.old_reason = (xa && xa.tr);\n            za.old_window = (xa && xa.tw);\n            var ab;\n            if ((w && xa.t2)) {\n                for (var bb = 0; (bb < xa.t2.length); bb++) {\n                    var cb = xa.t2[bb];\n                    if ((cb.i === w)) {\n                        ab = cb.r;\n                    };\n                }\n            };\n            var db = [];\n            u.forEach(function(eb) {\n                if (!eb.fragile) {\n                    var fb = {\n                        i: eb.id,\n                        si: eb.server_id\n                    };\n                    if ((eb.raised || (((eb.id === w) && ab)))) {\n                        fb.r = 1;\n                    };\n                    db.push(fb);\n                }\n            ;\n            });\n            xa.t2 = db;\n            xa.uct2 = ca;\n            xa.lm2 = v;\n            xa.tr = y;\n            xa.tw = r.getSessionID();\n            za.new_tabs = JSON.stringify(xa.t2);\n            za.new_promoted = xa.lm2;\n            za.new_time = xa.uct2;\n            za.new_reason = xa.tr;\n            za.new_window = xa.tw;\n            ea.debug(\"store\", za);\n        }\n    ;\n        return xa;\n    };\n    function ia(xa) {\n        if (xa) {\n            var ya = ga(xa);\n            if ((ya && (ya !== ca))) {\n                var za = {\n                };\n                za.old_tabs = JSON.stringify(u);\n                za.old_promoted = v;\n                za.old_time = ca;\n                za.old_reason = y;\n                za.window_id = r.getSessionID();\n                za.cookie_tabs = ((xa && xa.t2) && JSON.stringify(xa.t2));\n                za.cookie_promoted = (xa && xa.lm2);\n                za.cookie_time = (xa && xa.uct2);\n                za.cookie_reason = (xa && xa.tr);\n                za.cookie_window = (xa && xa.tw);\n                ca = ya;\n                y = \"load\";\n                var ab = ja(xa.t2, (xa.lm2 || null));\n                za.load_result = ab;\n                za.new_tabs = JSON.stringify(u);\n                za.new_promoted = v;\n                za.new_time = ca;\n                za.new_reason = y;\n                var event = \"load\";\n                if (!fa) {\n                    event += \"_init\";\n                };\n                ea.log(event, za);\n                return ab;\n            }\n        ;\n        }\n    ;\n        return false;\n    };\n    function ja(xa, ya) {\n        if (ka(xa, ya)) {\n            var za = u.filter(function(cb) {\n                return cb.fragile;\n            }), ab = {\n            };\n            v = null;\n            u = xa.map(function(cb) {\n                var db = {\n                    id: cb.i,\n                    server_id: cb.si\n                };\n                if ((db.id == ya)) {\n                    v = db.id;\n                };\n                if ((w == cb.i)) {\n                    var eb = pa(w);\n                    if ((eb != -1)) {\n                        db.raised = u[eb].raised;\n                        return db;\n                    }\n                     else return null\n                ;\n                }\n            ;\n                if (cb.r) {\n                    db.raised = true;\n                };\n                ab[db.id] = db;\n                return db;\n            });\n            u = u.filter(function(cb) {\n                return (cb != null);\n            });\n            if (x) {\n                for (var bb in x) {\n                    if ((!ab[bb] || !ab[bb].raised)) {\n                        delete x[bb];\n                    };\n                }\n            };\n            za = za.filter(function(cb) {\n                return !ab[cb.id];\n            });\n            u = u.concat(za);\n            oa();\n            return true;\n        }\n    ;\n        return false;\n    };\n    function ka(xa, ya) {\n        if ((ya != v)) {\n            return true\n        };\n        var za = u.filter(function(cb) {\n            return !cb.fragile;\n        });\n        if ((xa.length != za.length)) {\n            return true\n        };\n        for (var ab = 0, bb = xa.length; (ab < bb); ab++) {\n            if ((xa[ab].id === w)) {\n                continue;\n            };\n            if (!s(xa[ab], za[ab])) {\n                return true\n            };\n        };\n        return false;\n    };\n    function la(xa, ya, za) {\n        var ab = ia(q.get());\n        if (((ya === undefined) || (ya > ca))) {\n            if (xa()) {\n                ab = true;\n                y = (za || null);\n                na(ya);\n            }\n        ;\n        }\n         else ea.error(\"rejected\", {\n            change_time: ya,\n            state_time: ca\n        });\n    ;\n        (ab && ma());\n    };\n    function ma() {\n        if (fa) {\n            va.inform(\"chat/tabs-changed\", va.get());\n        };\n    };\n    function na(xa) {\n        if ((xa === undefined)) {\n            xa = Math.max((o.getLastUserMessageTimestamp() || 1), (ca + 1));\n        };\n        ca = xa;\n        q.doSync();\n    };\n    function oa() {\n        var xa = (u.length - da);\n        if ((xa > 0)) {\n            u = u.filter(function(ya) {\n                return (ya.raised || (xa-- <= 0));\n            });\n        };\n    };\n    function pa(xa) {\n        for (var ya = 0; (ya < u.length); ya++) {\n            if ((u[ya].id == xa)) {\n                return ya\n            };\n        };\n        return -1;\n    };\n    function qa(xa, ya) {\n        var za = n.getThreadMetaNow(xa);\n        if (!za) {\n            return false\n        };\n        if (za.is_canonical_user) {\n            return sa(xa, ya);\n        }\n         else {\n            var ab = ra(xa);\n            if (ab) {\n                m.getServerThreadID(xa, function(bb) {\n                    if (ta(xa, bb)) {\n                        na();\n                        ma();\n                    }\n                ;\n                });\n            };\n            return ab;\n        }\n    ;\n    };\n    function ra(xa) {\n        if ((pa(xa) === -1)) {\n            u.push({\n                id: xa,\n                fragile: true\n            });\n            ea.log(\"open_fragile_tab\", {\n                tabs: JSON.stringify(u),\n                opened: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    function sa(xa, ya) {\n        var za = pa(xa);\n        if ((za != -1)) {\n            if (u[za].fragile) {\n                u.splice(za, 1);\n            }\n             else {\n                u[za].signatureID = ya;\n                return true;\n            }\n        \n        };\n        for (var ab = 0; (ab <= u.length); ab++) {\n            if (((ab == u.length) || u[ab].fragile)) {\n                u.splice(ab, 0, {\n                    id: xa,\n                    signatureID: ya\n                });\n                oa();\n                ea.log(\"open_tab\", {\n                    tabs: JSON.stringify(u),\n                    opened: xa,\n                    window_id: r.getSessionID()\n                });\n                return true;\n            }\n        ;\n        };\n    };\n    function ta(xa, ya) {\n        var za = pa(xa);\n        if (((za != -1) && u[za].fragile)) {\n            var ab = u[za];\n            ab.fragile = false;\n            ab.server_id = ya;\n            var bb = [];\n            u.forEach(function(cb) {\n                if ((cb.id != xa)) {\n                    if ((ab && cb.fragile)) {\n                        bb.push(ab);\n                        ab = null;\n                    }\n                ;\n                    bb.push(cb);\n                }\n            ;\n            });\n            if (ab) {\n                bb.push(ab);\n            };\n            u = bb;\n            ea.log(\"make_permanent\", {\n                tabs: JSON.stringify(u),\n                tab_id: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    function ua(xa) {\n        var ya = pa(xa);\n        if ((xa == v)) {\n            v = null;\n        };\n        if ((ya != -1)) {\n            u.splice(ya, 1);\n            ea.log(\"close_tab\", {\n                tabs: JSON.stringify(u),\n                closed: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n        return false;\n    };\n    q.registerStateStorer(ha);\n    q.registerStateLoader(function(xa) {\n        if (ia(xa)) {\n            ma();\n        };\n    });\n    function va() {\n    \n    };\n    t(va, h, {\n        indexOf: function(xa) {\n            return pa(xa);\n        },\n        getTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = this.indexOf(xa);\n            if ((ya > -1)) {\n                var za = u[ya];\n                return t({\n                }, za);\n            }\n        ;\n            return null;\n        },\n        getEmptyTab: function() {\n            for (var xa = 0; (xa < u.length); xa++) {\n                var ya = u[xa].id;\n                if (n.isNewEmptyLocalThread(ya)) {\n                    return ya\n                };\n            };\n            return null;\n        },\n        getServerTime: function() {\n            return z();\n        },\n        closeAllTabs: function() {\n            if (u.length) {\n                ea.log(\"close_all_tabs\", {\n                    closed_tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n                u = [];\n                v = null;\n                if (x) {\n                    x = {\n                    };\n                };\n                na();\n                ma();\n            }\n        ;\n        },\n        closeFragileTabs: function() {\n            var xa = [];\n            for (var ya = 0; (ya < u.length); ya++) {\n                if ((u[ya].fragile && !n.isNewEmptyLocalThread(u[ya].id))) {\n                    xa.push(u[ya]);\n                    u.splice(ya);\n                    ma();\n                    break;\n                }\n            ;\n            };\n            ea.log(\"close_fragile_tabs\", {\n                tabs: JSON.stringify(u),\n                fragile_closed: xa,\n                window_id: r.getSessionID()\n            });\n        },\n        closeTab: function(xa, ya) {\n            l.isThreadID(xa);\n            var za = false;\n            if (x) {\n                delete x[xa];\n                za = true;\n            }\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    za = true;\n                };\n                return za;\n            }, undefined, ya);\n        },\n        closeTabAndDemote: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (x) {\n                delete x[xa];\n                ab = true;\n            }\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    if (v) {\n                        var bb = pa(v);\n                        if ((bb > ya)) {\n                            var cb = u.splice(bb, 1)[0];\n                            u.splice(ya, 0, cb);\n                            v = null;\n                        }\n                    ;\n                    }\n                ;\n                    ab = true;\n                }\n            ;\n                return ab;\n            }, undefined, za);\n        },\n        raiseTab: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if ((x && ya)) {\n                x[xa] = true;\n                ab = true;\n            }\n        ;\n            if ((!ya && (xa === w))) {\n                (ab && ma());\n                return;\n            }\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    ab = true;\n                };\n                var bb = pa(xa);\n                if (((bb != -1) && !u[bb].raised)) {\n                    u[bb].raised = true;\n                    ab = true;\n                    ea.log(\"raise_tab\", {\n                        tabs: JSON.stringify(u),\n                        raised: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n                return ab;\n            });\n        },\n        get: function() {\n            var xa = u.map(function(ya) {\n                var za = t({\n                }, ya);\n                delete za.fragile;\n                if (x) {\n                    za.raised = x[za.id];\n                };\n                return za;\n            });\n            return {\n                tabs: xa,\n                promoted: v\n            };\n        },\n        openFragileTab: function(xa) {\n            l.isThreadID(xa);\n            if (ra(xa)) {\n                ma();\n            };\n        },\n        openTab: function(xa) {\n            l.isThreadID(xa);\n            la(qa.curry(xa));\n        },\n        lowerTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = false;\n            if (x) {\n                delete x[xa];\n                ya = true;\n            }\n        ;\n            la(function() {\n                var za = pa(xa);\n                if (((za != -1) && u[za].raised)) {\n                    delete u[za].raised;\n                    ea.log(\"lower_tab\", {\n                        tabs: JSON.stringify(u),\n                        lowered: xa,\n                        window_id: r.getSessionID()\n                    });\n                    ya = true;\n                }\n            ;\n                return ya;\n            });\n        },\n        raiseAndPromoteTab: function(xa, ya, za, ab, bb) {\n            l.isThreadID(xa);\n            var cb = false;\n            if ((x && ya)) {\n                x[xa] = true;\n                cb = true;\n            }\n        ;\n            if ((!ya && (xa === w))) {\n                (cb && ma());\n                return;\n            }\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    cb = true;\n                };\n                var db = pa(xa);\n                if (((db != -1) && ((!u[db].raised || (v != xa))))) {\n                    u[db].raised = true;\n                    v = xa;\n                    cb = true;\n                    ea.log(\"raise_and_promote_tab\", {\n                        tabs: JSON.stringify(u),\n                        promoted: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n                return cb;\n            }, ab, bb);\n        },\n        promoteThreadInPlaceOfThread: function(xa, ya) {\n            l.isThreadID(xa);\n            l.isThreadID(ya);\n            la(function() {\n                var za = pa(xa), ab = pa(ya);\n                if ((v === ya)) {\n                    v = xa;\n                };\n                var bb = u[za];\n                u[za] = u[ab];\n                u[ab] = bb;\n                return true;\n            });\n        },\n        squelchTab: function(xa) {\n            l.isThreadID(xa);\n            w = xa;\n            this.lowerTab(xa);\n            ea.log(\"squelch_tab\", {\n                squelched: xa,\n                tabs: JSON.stringify(u),\n                window_id: r.getSessionID()\n            });\n        },\n        clearSquelchedTab: function() {\n            if (w) {\n                ea.log(\"unsquelch_tab\", {\n                    squelched: w,\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            };\n            w = null;\n        },\n        persistLocalRaised: function() {\n            if (x) {\n                la(function() {\n                    var xa = false;\n                    u.forEach(function(ya) {\n                        if ((ya.raised != x[ya.id])) {\n                            xa = true;\n                            if (x[ya.id]) {\n                                ya.raised = true;\n                            }\n                             else delete ya.raised;\n                        ;\n                        }\n                    ;\n                    });\n                    return xa;\n                });\n                ea.log(\"persist_local_raise\", {\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        }\n    });\n    g.subscribe(k.DUMP_EVENT, function(xa, ya) {\n        ya.chat_tabs = {\n            promoted: v,\n            tabs: u.map(function(za) {\n                return t({\n                }, za);\n            }),\n            time: ca,\n            max_load_age: aa\n        };\n    });\n    function wa() {\n        var xa = i.ignoresRemoteTabRaise();\n        if ((xa && !x)) {\n            ea.log(\"start_ignore_remote_raise\");\n            x = {\n            };\n            ma();\n        }\n         else if ((!xa && x)) {\n            ea.log(\"stop_ignore_remote_raise\");\n            x = null;\n            ma();\n        }\n        \n    ;\n    };\n    i.subscribe(i.ON_CHANGED, wa);\n    wa();\n    ia(q.getInitial(), true);\n    if ((ca === 0)) {\n        ca = (z() - 600000);\n    };\n    fa = true;\n    e.exports = va;\n});\n__d(\"LinkshimHandler\", [\"Event\",\"LinkshimAsyncLink\",\"LinkshimHandlerConfig\",\"URI\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"LinkshimAsyncLink\"), i = b(\"LinkshimHandlerConfig\"), j = b(\"URI\"), k = b(\"shield\"), l = {\n        setUpLinkshimHandling: function(r) {\n            try {\n                var t = j(r.getAttribute(\"href\")), u = m(t);\n                if ((u && n(t))) {\n                    g.listen(r, \"mouseover\", k(h.swap, null, r, u));\n                    var v = p(t);\n                    g.listen(r, \"click\", function() {\n                        if (i.supports_meta_referrer) {\n                            h.referrer_log(r, v, o(t).toString());\n                        }\n                         else h.swap(r, t);\n                    ;\n                    });\n                }\n            ;\n            } catch (s) {\n            \n            };\n        }\n    };\n    function m(r) {\n        return (r.getQueryData().u ? new j(r.getQueryData().u) : null);\n    };\n    function n(r) {\n        return r.getQueryData().hasOwnProperty(\"s\");\n    };\n    function o(r) {\n        return j(\"/si/ajax/l/render_linkshim_log/\").setSubdomain(\"www\").setQueryData(r.getQueryData());\n    };\n    function p(r) {\n        var s;\n        if (q()) {\n            s = j(r).addQueryData({\n                render_verification: true\n            });\n        }\n         else s = m(r);\n    ;\n        return s;\n    };\n    function q() {\n        var r = (i.render_verification_rate || 0);\n        return (Math.floor(((Math.random() * r) + 1)) === r);\n    };\n    e.exports = l;\n});");
// 16150
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s6c42554350258955c8b9ee2ffab9725ca8f6e1dc");
// 16151
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"WD1Wm\",]);\n}\n;\n;\n__d(\"BlackbirdUpsellConstants\", [], function(a, b, c, d, e, f) {\n    e.exports = {\n        ACTION_UPSELL: \"upsell\",\n        CLICK_TYPE_DISMISS_PROMO: \"dismiss_promo\",\n        ACTION_EDUCATE: \"educate\",\n        CLICK_TYPE_ENABLE_CHAT: \"enable_chat\",\n        CLICK_TYPE_OPEN_SETTINGS: \"open_settings\"\n    };\n});\n__d(\"AsyncLoader\", [\"copyProperties\",\"AsyncRequest\",\"BaseAsyncLoader\",], function(a, b, c, d, e, f) {\n    var g = b(\"copyProperties\"), h = b(\"AsyncRequest\"), i = b(\"BaseAsyncLoader\");\n    function j(k, l) {\n        this._endpoint = k;\n        this._type = l;\n    };\n;\n    g(j.prototype, i.prototype);\n    j.prototype.send = function(k, l, m, n, o) {\n        new h(k).setData({\n            ids: l\n        }).setHandler(n).setErrorHandler(o).setAllowCrossPageTransition(true).setMethod(\"GET\").setReadOnly(true).send();\n    };\n    e.exports = j;\n});\n__d(\"BlackbirdUpsell\", [\"JSBNG__Event\",\"Arbiter\",\"AsyncRequest\",\"LegacyContextualDialog\",\"DOM\",\"LayerDestroyOnHide\",\"LayerHideOnTransition\",\"PresencePrivacy\",\"copyProperties\",\"BlackbirdUpsellConfig\",\"BlackbirdUpsellConstants\",\"BlackbirdUpsellTemplates\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AsyncRequest\"), j = b(\"LegacyContextualDialog\"), k = b(\"DOM\"), l = b(\"LayerDestroyOnHide\"), m = b(\"LayerHideOnTransition\"), n = b(\"PresencePrivacy\"), o = b(\"copyProperties\"), p = b(\"BlackbirdUpsellConfig\"), q = b(\"BlackbirdUpsellConstants\"), r = b(\"BlackbirdUpsellTemplates\"), s = \"/ajax/chat/blackbird/update_clicks.php\", t = \"/ajax/chat/blackbird/update_impressions.php\", u = \"/ajax/chat/blackbird/dismiss.php\", v = 235, w = null, x = null, y = false, z = false;\n    function aa() {\n    \n    };\n;\n    o(aa, {\n        shouldShow: function() {\n            if (this._dialogDismissed) {\n                return false;\n            }\n        ;\n        ;\n            if (this.isEducation()) {\n                return ((((!!p.EducationGK && !p.EducationDismissed)) && ((p.EducationImpressions < p.EducationImpressionLimit))));\n            }\n             else return ((((((!!p.UpsellGK && !p.UpsellDismissed)) && ((p.UpsellImpressions < p.UpsellImpressionLimit)))) && ((p.FriendCount >= p.UpsellMinFriendCount))))\n        ;\n        },\n        isEducation: function() {\n            return ((p.TimeOffline <= p.EducationTimeOfflineThresdhold));\n        },\n        getOfflineContent: function() {\n            if (this.isEducation()) {\n                return this._getEducationContent();\n            }\n             else return this._getUpsellContent()\n        ;\n        },\n        _getEducationContent: function() {\n            ga();\n            var ka = r[\":fb:chat:blackbird:offline-educate\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ja(q.CLICK_TYPE_OPEN_SETTINGS);\n                da();\n            });\n            return ka.getRoot();\n        },\n        _getUpsellContent: function() {\n            fa();\n            var ka = r[\":fb:chat:blackbird:upsell\"].build(), la = ka.getNode(\"chatSettingsButton\");\n            g.listen(la, \"click\", function() {\n                h.inform(\"chat/advanced-settings-dialog-opened\");\n                ia(q.CLICK_TYPE_OPEN_SETTINGS);\n                ca();\n            });\n            var ma = ka.getNode(\"enableChatButton\");\n            g.listen(ma, \"click\", function() {\n                ia(q.CLICK_TYPE_ENABLE_CHAT);\n                ca();\n            });\n            return ka.getRoot();\n        },\n        getBlackbirdContent: function(ka) {\n            ga();\n            switch (ka) {\n              case n.ONLINE:\n                return r[\":fb:chat:blackbird:most-friends-educate\"].build().getRoot();\n              case n.OFFLINE:\n                return r[\":fb:chat:blackbird:some-friends-educate\"].build().getRoot();\n            };\n        ;\n        },\n        showOfflineDialog: function(ka) {\n            this.showDialog(ka, this.getOfflineContent.bind(this));\n        },\n        showBlackbirdDialog: function(ka, la) {\n            this.showDialog(ka, this.getBlackbirdContent.curry(la));\n        },\n        showDialog: function(ka, la) {\n            ((!w && this._constructDialog()));\n            k.setContent(x, la());\n            w.setContext(ka);\n            w.show();\n        },\n        hide: function() {\n            if (((w && w.isShown()))) {\n                w.hide();\n            }\n        ;\n        ;\n        },\n        dismiss: function() {\n            this.hide();\n            if (this.isEducation()) {\n                da();\n            }\n             else ca();\n        ;\n        ;\n        },\n        registerDismissClick: function() {\n            if (this.isEducation()) {\n                ja(q.CLICK_TYPE_DISMISS_PROMO);\n            }\n             else ia(q.CLICK_TYPE_DISMISS_PROMO);\n        ;\n        ;\n        },\n        isVisible: function() {\n            return ((z && !y));\n        },\n        _constructDialog: function() {\n            var ka = r[\":fb:chat:blackbird:dialog-frame\"].build();\n            x = ka.getNode(\"dialogContent\");\n            w = new j();\n            w.init(ka.getRoot());\n            w.setPosition(\"above\").setWidth(v).setFixed(true).disableBehavior(l).disableBehavior(m);\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.dismiss.bind(this));\n            g.listen(ka.getNode(\"dialogCloseButton\"), \"click\", this.registerDismissClick.bind(this));\n        }\n    });\n    function ba(ka, la) {\n        if (((!y && z))) {\n            y = true;\n            n.inform(\"privacy-user-presence-changed\");\n            var ma = new i(u);\n            ma.setData({\n                source: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                y = false;\n            });\n            ma.send();\n        }\n    ;\n    ;\n    };\n;\n    function ca() {\n        ba(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n;\n    function da() {\n        ba(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n;\n    function ea(ka, la) {\n        if (!z) {\n            z = true;\n            var ma = new i(t);\n            ma.setData({\n                action: ka,\n                impressions: la,\n                time_offline: p.TimeOffline\n            });\n            ma.setErrorHandler(function() {\n                z = false;\n            });\n            ma.send();\n        }\n    ;\n    ;\n    };\n;\n    function fa() {\n        ea(q.ACTION_UPSELL, p.UpsellImpressions);\n    };\n;\n    function ga() {\n        ea(q.ACTION_EDUCATE, p.EducationImpressions);\n    };\n;\n    function ha(ka, la, ma, na) {\n        var oa = new i(s);\n        oa.setData({\n            action: ka,\n            impressions: ma,\n            source: la,\n            time_offline: na\n        });\n        oa.send();\n    };\n;\n    function ia(ka) {\n        ha(ka, q.ACTION_UPSELL, p.UpsellImpressions, p.TimeOffline);\n    };\n;\n    function ja(ka) {\n        ha(ka, q.ACTION_EDUCATE, p.EducateImpressions, p.TimeOffline);\n    };\n;\n    h.subscribe(\"chat/advanced-settings-dialog-opened\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-online\", aa.dismiss.bind(aa));\n    h.subscribe(\"chat-visibility/go-offline\", aa.dismiss.bind(aa));\n    e.exports = aa;\n});\n__d(\"ChatFavoriteNux\", [\"AsyncRequest\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = null, i = false, j = {\n        tryShow: function(k) {\n            if (((h && !i))) {\n                h.setContext(k);\n                h.show();\n                i = true;\n            }\n        ;\n        ;\n        },\n        tryHide: function() {\n            if (((h && i))) {\n                h.hide();\n                h = null;\n            }\n        ;\n        ;\n        },\n        registerDialog: function(k) {\n            h = k;\n            if (k) {\n                k.subscribe(\"JSBNG__confirm\", this.dismissDialog);\n            }\n        ;\n        ;\n        },\n        dismissDialog: function() {\n            if (h) {\n                new g(\"/ajax/chat/dismiss_favorite_nux.php\").send();\n                h.hide();\n                h = null;\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = j;\n});\n__d(\"ChatGroupThreadsController\", [\"ArbiterMixin\",\"ChatConfig\",\"InitialMultichatList\",\"MercuryOrderedThreadlist\",\"MercuryServerRequests\",\"MercuryThreadInformer\",\"MercuryThreads\",\"MessagingTag\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatConfig\"), i = b(\"InitialMultichatList\"), j = b(\"MercuryOrderedThreadlist\").get(), k = b(\"MercuryServerRequests\").get(), l = b(\"MercuryThreadInformer\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MessagingTag\"), o = b(\"copyProperties\"), p, q = [], r = h.get(\"max_sidebar_multichats\", 3);\n    function s(x) {\n        var y = m.getThreadMetaNow(x);\n        return ((((y && !y.is_canonical)) && m.canReply(x)));\n    };\n;\n    var t = i.payload;\n    if (t) {\n        k.handleUpdate(t);\n        var u = ((t.threads || []));\n        q = u.map(function(x) {\n            return x.thread_id;\n        });\n    }\n;\n;\n    if (q.length) {\n        var v = m.getThreadMetaNow(q[((q.length - 1))]);\n        p = ((v && ((v.timestamp - 1))));\n    }\n;\n;\n    if (!p) {\n        p = JSBNG__Date.now();\n    }\n;\n;\n    var w = {\n    };\n    o(w, g, {\n        getThreadIDs: function() {\n            var x = 0;\n            return q.filter(function(y) {\n                return ((((((x < r)) && s(y))) && ++x));\n            });\n        }\n    });\n    l.subscribe(\"threadlist-updated\", function() {\n        q = j.getThreadlistUntilTimestamp(p, n.INBOX, n.GROUPS).filter(s);\n        w.inform(\"update\");\n    });\n    e.exports = w;\n});\n__d(\"ChatHovercard\", [\"Arbiter\",\"AsyncLoader\",\"Hovercard\",\"JSLogger\",\"debounce\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncLoader\"), i = b(\"Hovercard\"), j = b(\"JSLogger\"), k = b(\"debounce\"), l = 5, m = new h(\"/ajax/chat/hovercard/sidebar.php\", \"hover\"), n = j.create(\"chat_hovercard\");\n    g.subscribe(\"Hovercard/dirty\", m.reset.bind(m));\n    function o(s, t) {\n        m.get(s, function(u) {\n            (function() {\n                if (!u) {\n                    n.error(\"fetch_failure\", {\n                        id: s\n                    });\n                    return;\n                }\n            ;\n            ;\n                var v = i.getDialog(u);\n                if (!v) {\n                    n.error(\"no_hovercard\", {\n                        id: s,\n                        endpoint: u\n                    });\n                    return;\n                }\n            ;\n            ;\n                if (((s == t.getActiveID()))) {\n                    t.showHovercard(s, v);\n                }\n            ;\n            ;\n            }).defer();\n        });\n    };\n;\n    function p(s, t) {\n        var u = [];\n        function v(y) {\n            if (((((y >= 0)) && ((y < s.length))))) {\n                u.push(s[y]);\n            }\n        ;\n        ;\n        };\n    ;\n        var w = s.indexOf(t);\n        if (((w > -1))) {\n            v(w);\n            for (var x = 1; ((x < l)); x++) {\n                v(((w + x)));\n                v(((w - x)));\n            };\n        ;\n        }\n    ;\n    ;\n        return u.filter(function(y) {\n            return y;\n        });\n    };\n;\n    function q(s, t) {\n        var u = t.getActiveID();\n        if (u) {\n            var v = s.getShowingUsers(), w = p(v, u);\n            m.get(w, function() {\n            \n            });\n        }\n    ;\n    ;\n    };\n;\n    function r(s) {\n        var t = s.getHoverController();\n        t.registerDefault(o);\n        t.subscribe(\"hover\", k(q.curry(s, t), 100));\n    };\n;\n    e.exports = r;\n});\n__d(\"ChatOptions\", [\"Arbiter\",\"ChannelConstants\",\"JSLogger\",\"PresenceUtil\",\"copyProperties\",\"ChatOptionsInitialData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChannelConstants\"), i = b(\"JSLogger\"), j = b(\"PresenceUtil\"), k = b(\"copyProperties\"), l = i.create(\"chat_options\"), m = {\n    };\n    (function() {\n        var o = b(\"ChatOptionsInitialData\");\n        {\n            var fin313keys = ((window.top.JSBNG_Replay.forInKeys)((o))), fin313i = (0);\n            var p;\n            for (; (fin313i < fin313keys.length); (fin313i++)) {\n                ((p) = (fin313keys[fin313i]));\n                {\n                    var q = o[p];\n                    m[p] = !!q;\n                };\n            };\n        };\n    ;\n    })();\n    var n = k(new g(), {\n        getSetting: function(o) {\n            return m[o];\n        },\n        setSetting: function(o, p, q) {\n            if (((this.getSetting(o) == p))) {\n                return;\n            }\n        ;\n        ;\n            if (q) {\n                q = ((\"from_\" + q));\n                l.log(q, {\n                    JSBNG__name: o,\n                    new_value: p,\n                    old_value: this.getSetting(o)\n                });\n            }\n        ;\n        ;\n            m[o] = !!p;\n            g.inform(\"chat/option-changed\", {\n                JSBNG__name: o,\n                value: p\n            });\n        }\n    });\n    g.subscribe(h.getArbiterType(\"setting\"), function(o, p) {\n        var q = p.obj;\n        if (((q.window_id === j.getSessionID()))) {\n            return;\n        }\n    ;\n    ;\n        n.setSetting(q.setting, !!q.value, \"channel\");\n    });\n    g.subscribe(i.DUMP_EVENT, function(o, p) {\n        p.chat_options = m;\n    });\n    e.exports = n;\n});\n__d(\"ChatOrderedListHover\", [\"function-extensions\",\"ArbiterMixin\",\"ChatFavoriteList\",\"JSBNG__CSS\",\"ErrorUtils\",\"JSBNG__Event\",\"LayerHideOnBlur\",\"Parent\",\"copyProperties\",\"cx\",\"setTimeoutAcrossTransitions\",\"shield\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatFavoriteList\"), i = b(\"JSBNG__CSS\"), j = b(\"ErrorUtils\"), k = b(\"JSBNG__Event\"), l = b(\"LayerHideOnBlur\"), m = b(\"Parent\"), n = b(\"copyProperties\"), o = b(\"cx\"), p = b(\"setTimeoutAcrossTransitions\"), q = b(\"shield\");\n    function r(u) {\n        i.addClass(u, \"fetching\");\n    };\n;\n    function s(u) {\n        i.removeClass(u, \"fetching\");\n    };\n;\n    function t(u) {\n        this._orderedList = u;\n        this._root = u.getRoot();\n        k.listen(this._root, \"mouseover\", this._mouseOver.bind(this));\n        k.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        u.subscribe(\"click\", q(this._hide, this));\n    };\n;\n    n(t.prototype, g, {\n        _root: null,\n        _activeItem: null,\n        _hideTimeout: null,\n        _showTimeout: null,\n        _showingDialog: null,\n        _showingID: null,\n        _handlers: {\n        },\n        _defaultHandler: null,\n        _mouseOver: function(JSBNG__event) {\n            if (this._paused) {\n                return;\n            }\n        ;\n        ;\n            var u = JSBNG__event.getTarget(), v = ((m.byClass(u, \"-cx-PRIVATE-fbChatOrderedList__item\") || m.byClass(u, \"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\")));\n            ((v && this._setActiveItem(v)));\n        },\n        _mouseLeave: function(JSBNG__event) {\n            this._setActiveItem(null);\n        },\n        _clearTimeouts: function() {\n            ((this._showTimeout && JSBNG__clearTimeout(this._showTimeout)));\n            this._showTimeout = null;\n            ((this._hideTimeout && JSBNG__clearTimeout(this._hideTimeout)));\n            this._hideTimeout = null;\n        },\n        _hide: function() {\n            if (this._showingDialog) {\n                this._showingDialog.hide();\n                this._showingDialog = null;\n                this._showingID = null;\n            }\n        ;\n        ;\n        },\n        _show: function() {\n            var u = this.getActiveID(), v = false;\n            if (this._handlers[u]) {\n                v = true;\n                j.applyWithGuard(this._handlers[u], {\n                }, [u,this,]);\n            }\n             else if (this._defaultHandler) {\n                v = true;\n                j.applyWithGuard(this._defaultHandler, {\n                }, [u,this,]);\n            }\n            \n        ;\n        ;\n            if (((v && ((this._showingID != this.getActiveID()))))) {\n                r(this._activeItem);\n            }\n        ;\n        ;\n        },\n        _setActiveItem: function(u) {\n            if (h.isEditMode()) {\n                this._clearTimeouts();\n                this._hide();\n                return;\n            }\n        ;\n        ;\n            if (((u != this._activeItem))) {\n                this._clearTimeouts();\n                ((this._activeItem && s(this._activeItem)));\n                this._activeItem = null;\n                var v = ((u ? 0 : 100));\n                this._hideTimeout = p(function() {\n                    if (((this.getActiveID() != this._showingID))) {\n                        this._hide();\n                    }\n                ;\n                ;\n                }.bind(this), v);\n                if (u) {\n                    this._activeItem = u;\n                    var w = ((v + 500));\n                    this._showTimeout = p(function() {\n                        this._show();\n                    }.bind(this), w);\n                    this.inform(\"hover\");\n                }\n                 else this.inform(\"leave\");\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        register: function(u, v) {\n            if (!this._handlers[u]) {\n                this._handlers[u] = v;\n                return {\n                    unregister: function() {\n                        if (((u == this._showingID))) {\n                            this._hide();\n                        }\n                    ;\n                    ;\n                        delete this._handlers[u];\n                        var w = this._orderedList.getAllNodes(), x = w[u];\n                        ((x && s(x)));\n                    }.bind(this)\n                };\n            }\n        ;\n        ;\n        },\n        registerDefault: function(u) {\n            this._defaultHandler = u;\n        },\n        getActiveID: function() {\n            var u = ((this._activeItem && this._orderedList.getUserForNode(this._activeItem)));\n            return ((u || null));\n        },\n        showHovercard: function(u, v) {\n            if (((((u == this.getActiveID())) && ((u != this._showingID))))) {\n                this._clearTimeouts();\n                s(this._activeItem);\n                this._hide();\n                this._showingDialog = v;\n                this._showingID = u;\n                var w = v.subscribe(\"mouseenter\", this._setActiveItem.bind(this, this._activeItem)), x = v.subscribe(\"mouseleave\", function() {\n                    w.unsubscribe();\n                    this._setActiveItem(null);\n                }.bind(this)), y = v.subscribe(\"hide\", function() {\n                    this.inform(\"hovercard_hide\");\n                    w.unsubscribe();\n                    x.unsubscribe();\n                    y.unsubscribe();\n                }.bind(this));\n                v.enableBehavior(l).setContext(this._activeItem).setPosition(\"left\").show();\n                this.inform(\"hovercard_show\");\n            }\n        ;\n        ;\n        },\n        setPaused: function(u) {\n            this._paused = u;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatQuietLinks\", [\"JSBNG__Event\",\"DOM\",\"UserAgent\",\"DataStore\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"DOM\"), i = b(\"UserAgent\"), j = b(\"DataStore\"), k = b(\"Parent\"), l = {\n    }, m = {\n        silenceLinks: function(q) {\n            n(q, this.removeEmptyHrefs.bind(this));\n        },\n        nukeLinks: function(q) {\n            n(q, this.removeAllHrefs.bind(this));\n        },\n        removeEmptyHrefs: function(q) {\n            o(q, function(r) {\n                return ((!r || ((r === \"#\"))));\n            });\n        },\n        removeAllHrefs: function(q) {\n            o(q);\n        },\n        removeMessagesHrefs: function(q) {\n            o(q, function(r) {\n                return ((((!r || ((r === \"#\")))) || ((r.indexOf(\"/messages/\") != -1))));\n            });\n        }\n    };\n    function n(q, r) {\n        var s = !!i.chrome(), t = ((((!!i.chrome() || ((i.ie() >= 9)))) || ((i.firefox() >= 4))));\n        if (l[h.getID(q)]) {\n            return;\n        }\n    ;\n    ;\n        l[h.getID(q)] = true;\n        if (!t) {\n            return;\n        }\n    ;\n    ;\n        if (!s) {\n            ((r && r(q)));\n            return;\n        }\n    ;\n    ;\n        g.listen(q, \"mouseover\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\");\n            if (w) {\n                var x = w.getAttribute(\"href\");\n                if (p(x)) {\n                    j.set(w, \"stashedHref\", w.getAttribute(\"href\"));\n                    w.removeAttribute(\"href\");\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        });\n        g.listen(q, \"mouseout\", function u(v) {\n            var w = k.byTag(v.getTarget(), \"a\"), x = ((w && j.remove(w, \"stashedHref\")));\n            if (p(x)) {\n                w.setAttribute(\"href\", x);\n            }\n        ;\n        ;\n        });\n        g.listen(q, \"mousedown\", function(u) {\n            if (!u.isDefaultRequested()) {\n                return true;\n            }\n        ;\n        ;\n            var v = k.byTag(u.getTarget(), \"a\"), w = ((v && j.get(v, \"stashedHref\")));\n            if (p(w)) {\n                v.setAttribute(\"href\", w);\n            }\n        ;\n        ;\n        });\n    };\n;\n    function o(q, r) {\n        var s = h.scry(q, \"a\");\n        if (r) {\n            s = s.filter(function(t) {\n                return r(t.getAttribute(\"href\"));\n            });\n        }\n    ;\n    ;\n        s.forEach(function(t) {\n            t.removeAttribute(\"href\");\n            t.setAttribute(\"tabindex\", 0);\n        });\n    };\n;\n    function p(q) {\n        return ((q && ((q !== \"#\"))));\n    };\n;\n    e.exports = m;\n});\n__d(\"ChatSidebarThreadlist.react\", [\"ChatConfig\",\"ChatGroupThreadsController\",\"ChatSidebarConstants\",\"ChatSidebarItem.react\",\"ChatSidebarThread.react\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryParticipants\",\"PresenceStatus\",\"React\",\"copyProperties\",\"cx\",\"fbt\",\"ix\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatConfig\"), h = b(\"ChatGroupThreadsController\"), i = b(\"ChatSidebarConstants\"), j = b(\"ChatSidebarItem.react\"), k = b(\"ChatSidebarThread.react\"), l = b(\"MercuryServerRequests\").get(), m = b(\"MercuryThreads\").get(), n = b(\"MercuryParticipants\"), o = b(\"PresenceStatus\"), p = b(\"React\"), q = b(\"copyProperties\"), r = b(\"cx\"), s = b(\"fbt\"), t = b(\"ix\"), u = p.createClass({\n        displayName: \"ChatSidebarThreadlist\",\n        render: function() {\n            var v = this.state.threadData, w = this.state.participantData, x = i.IMAGE_SIZE, y = t(\"/images/chat/sidebar/newGroupChat.png\");\n            if (this.props.litestandSidebar) {\n                x = ((g.get(\"litestand_blended_sidebar\") ? i.LITESTAND_BLENDED_SIZE : i.LITESTAND_IMAGE_SIZE));\n                y = ((g.get(\"litestand_blended_sidebar\") ? t(\"/images/litestand/sidebar/blended/new_group_chat.png\") : t(\"/images/chat/sidebar/newGroupChatLitestand.png\")));\n            }\n        ;\n        ;\n            var z = \"New Group Chat...\";\n            z = g.get(\"divebar_group_new_button_name\", z);\n            var aa = [];\n            if (this.props.showNewGroupsButton) {\n                aa.push(p.DOM.li({\n                    className: (((((\"-cx-PRIVATE-fbChatGroupThreadlist__item\") + ((\" \" + \"-cx-PRIVATE-chatSidebarItem__noborder\")))) + ((this.props.offlineItems ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\")) : \"\")))),\n                    key: \"new\"\n                }, j({\n                    images: y,\n                    imageSize: x,\n                    litestandSidebar: this.props.litestandSidebar,\n                    JSBNG__name: z\n                })));\n            }\n        ;\n        ;\n            var ba = {\n            };\n            {\n                var fin314keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin314i = (0);\n                var ca;\n                for (; (fin314i < fin314keys.length); (fin314i++)) {\n                    ((ca) = (fin314keys[fin314i]));\n                    {\n                        var da = v[ca], ea = da.participants.map(function(ia) {\n                            return ((w || {\n                            }))[ia];\n                        }).filter(function(ia) {\n                            return ia;\n                        }), fa = da.participants.map(function(ia) {\n                            return n.getUserID(ia);\n                        }), ga = fa.sort().join(\"|\");\n                        if (((!ba[ga] && ea.length))) {\n                            ba[ga] = 1;\n                            var ha = l.getServerThreadIDNow(ca);\n                            aa.push(p.DOM.li({\n                                className: (((((\"-cx-PRIVATE-fbChatGroupThreadlist__groupchat\") + ((\" \" + \"-cx-PRIVATE-fbChatGroupThreadlist__item\")))) + ((this.props.offlineItems ? ((\" \" + \"-cx-PRIVATE-chatSidebarItem__offlineitem\")) : \"\")))),\n                                \"data-serverthreadid\": ha,\n                                \"data-threadid\": ca,\n                                key: ca\n                            }, k({\n                                image: da.image_src,\n                                imageSize: x,\n                                litestandSidebar: this.props.litestandSidebar,\n                                JSBNG__name: da.JSBNG__name,\n                                participants: ea,\n                                JSBNG__status: o.getGroup(fa),\n                                threadID: ca,\n                                unreadCount: da.unread_count\n                            })));\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n            return p.DOM.ul(null, aa);\n        },\n        getInitialState: function() {\n            return {\n            };\n        },\n        componentWillMount: function() {\n            var v = function() {\n                this.setState(this._calculateState());\n            }.bind(this);\n            this.token = h.subscribe(\"update\", v);\n            v();\n        },\n        componentWillUnmount: function() {\n            ((this.token && this.token.unsubscribe()));\n            this.token = null;\n        },\n        _calculateState: function() {\n            var v = false, w = {\n            }, x = {\n            }, y = h.getThreadIDs(), z = y.length;\n            y.forEach(function(ba) {\n                m.getThreadMeta(ba, function(ca) {\n                    x[ba] = ca;\n                    n.getMulti(ca.participants, function(da) {\n                        delete da[n.user];\n                        if (v) {\n                            this.setState(this._calculateState());\n                        }\n                         else q(w, da);\n                    ;\n                    ;\n                        z--;\n                    }.bind(this));\n                }.bind(this));\n            }.bind(this));\n            if (((z === 0))) {\n                return {\n                    threadData: x,\n                    participantData: w\n                };\n            }\n             else {\n                v = true;\n                var aa = ((this.state || {\n                }));\n                return {\n                    threadData: q(aa.threadData, x),\n                    participantData: q(aa.participantData, w)\n                };\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = u;\n});\n__d(\"runAfterScrollingStops\", [\"Arbiter\",\"JSBNG__Event\",\"Run\",\"debounceAcrossTransitions\",\"emptyFunction\",\"throttle\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"JSBNG__Event\"), i = b(\"Run\"), j = b(\"debounceAcrossTransitions\"), k = b(\"emptyFunction\"), l = b(\"throttle\");\n    function m(x, y, z) {\n        if (((y && p[y]))) {\n            return;\n        }\n    ;\n    ;\n        if (!o) {\n            g.subscribe(\"page_transition\", w);\n            o = true;\n        }\n    ;\n    ;\n        if (!n) {\n            x();\n            return;\n        }\n    ;\n    ;\n        ((y && (p[y] = 1)));\n        q.push(x);\n        if (!z) {\n            if (s) {\n                i.onLeave(w);\n                s = false;\n            }\n        ;\n        ;\n            r.push(((q.length - 1)));\n        }\n    ;\n    ;\n    };\n;\n    var n, o, p = {\n    }, q = [], r = [], s = true, t = 500, u = j(function() {\n        n = false;\n        var x = q;\n        q = [];\n        r = [];\n        p = {\n        };\n        for (var y = 0, z = x.length; ((y < z)); ++y) {\n            x[y]();\n        ;\n        };\n    ;\n    }, t);\n    function v() {\n        n = true;\n        u();\n    };\n;\n    function w() {\n        var x = r;\n        r = [];\n        s = true;\n        for (var y = 0, z = x.length; ((y < z)); ++y) {\n            q[x[y]] = k;\n        ;\n        };\n    ;\n    };\n;\n    h.listen(window, \"JSBNG__scroll\", l.acrossTransitions(v, 250));\n    e.exports = m;\n});\n__d(\"ChatOrderedList\", [\"Animation\",\"Arbiter\",\"ArbiterMixin\",\"AsyncDialog\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"JSBNG__CSS\",\"ChannelImplementation\",\"Chat\",\"ChatConfig\",\"ChatContexts\",\"ChatFavoriteList\",\"ChatFavoriteNux\",\"ChatGroupThreadsController\",\"ChatOrderedListHover\",\"ChatQuietLinks\",\"ChatSidebarThreadlist.react\",\"ChatTypeaheadConstants\",\"ChatVisibility\",\"DOM\",\"DataStore\",\"Ease\",\"JSBNG__Event\",\"ImageSourceRequest\",\"ImageSourceType\",\"JSLogger\",\"JSXDOM\",\"LastMobileActiveTimes\",\"MercuryParticipantTypes\",\"MercuryThreadInformer\",\"MercuryThreads\",\"OrderedFriendsList\",\"Parent\",\"PhotoResizeModeConst\",\"PresencePrivacy\",\"PresenceStatus\",\"React\",\"JSBNG__Rect\",\"ShortProfiles\",\"Style\",\"Tooltip\",\"TokenizeUtil\",\"URI\",\"Vector\",\"XHPTemplate\",\"copyProperties\",\"createObjectFrom\",\"csx\",\"cx\",\"debounceAcrossTransitions\",\"guid\",\"JSBNG__requestAnimationFrame\",\"runAfterScrollingStops\",\"shield\",\"throttle\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"Animation\"), h = b(\"Arbiter\"), i = b(\"ArbiterMixin\"), j = b(\"AsyncDialog\"), k = b(\"AsyncRequest\"), l = b(\"AvailableList\"), m = b(\"AvailableListConstants\"), n = b(\"Bootloader\"), o = b(\"JSBNG__CSS\"), p = b(\"ChannelImplementation\").instance, q = b(\"Chat\"), r = b(\"ChatConfig\"), s = b(\"ChatContexts\"), t = b(\"ChatFavoriteList\"), u = b(\"ChatFavoriteNux\"), v = b(\"ChatGroupThreadsController\"), w = b(\"ChatOrderedListHover\"), x = b(\"ChatQuietLinks\"), y = b(\"ChatSidebarThreadlist.react\"), z = b(\"ChatTypeaheadConstants\"), aa = b(\"ChatVisibility\"), ba = b(\"DOM\"), ca = b(\"DataStore\"), da = b(\"Ease\"), ea = b(\"JSBNG__Event\"), fa = b(\"ImageSourceRequest\"), ga = b(\"ImageSourceType\"), ha = b(\"JSLogger\"), ia = b(\"JSXDOM\"), ja = b(\"LastMobileActiveTimes\"), ka = b(\"MercuryParticipantTypes\"), la = b(\"MercuryThreadInformer\").get(), ma = b(\"MercuryThreads\").get(), na = b(\"OrderedFriendsList\"), oa = b(\"Parent\"), pa = b(\"PhotoResizeModeConst\"), qa = b(\"PresencePrivacy\"), ra = b(\"PresenceStatus\"), sa = b(\"React\"), ta = b(\"JSBNG__Rect\"), ua = b(\"ShortProfiles\"), va = b(\"Style\"), wa = b(\"Tooltip\"), xa = b(\"TokenizeUtil\"), ya = b(\"URI\"), za = b(\"Vector\"), ab = b(\"XHPTemplate\"), bb = b(\"copyProperties\"), cb = b(\"createObjectFrom\"), db = b(\"csx\"), eb = b(\"cx\"), fb = b(\"debounceAcrossTransitions\"), gb = b(\"guid\"), hb = b(\"JSBNG__requestAnimationFrame\"), ib = b(\"runAfterScrollingStops\"), jb = b(\"shield\"), kb = b(\"throttle\"), lb = b(\"tx\"), mb = r.get(\"chat_ranked_by_coefficient\", 0), nb = null, ob, pb, qb = 9;\n    function rb(yb, zb, ac, bc, cc, dc) {\n        this._isSidebar = yb;\n        this._isLitestand = ((r.get(\"litestand\", 0) || r.get(\"test_litestand_sidebar\", 0)));\n        this._isLitestandSidebar = ((this._isSidebar && this._isLitestand));\n        this._isLeftCollapsedSidebar = !!oa.byClass(zb, \"-cx-PUBLIC-litestandLeftSidebar__root\");\n        this._root = zb;\n        this._itemsMap = {\n        };\n        this._isVisible = false;\n        this._excludedIds = {\n        };\n        this._numTopFriends = 5;\n        this._hasRendered = false;\n        this._preventRendering = false;\n        this._hoverController = null;\n        this._template = ac;\n        this._messageTemplate = bc;\n        this._favoriteMode = r.get(\"divebar_favorite_list\", 0);\n        this._contextualDialog = cc;\n        this._cachedItemHeight = null;\n        this._cachedItemPadding = null;\n        if (((dc && ba.scry(dc, \".-cx-PRIVATE-litestandSidebarPYMK__unit\").length))) {\n            o.show(dc);\n            this._pymk = dc;\n        }\n    ;\n    ;\n        this._usePlaceholder = ((this._isLitestand && this._isSidebar));\n        if (r.get(\"groups_in_divebar\")) {\n            this._groupThreadsNode = ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__groupthreads\"\n            });\n            this._updateGroupThreads();\n            this._groupsList = ((this._favoriteMode && ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChat__groupslist\")));\n        }\n    ;\n    ;\n        if (this._favoriteMode) {\n            this._favoriteSidebar = ba.JSBNG__find(this._root, \".-cx-PUBLIC-fbChatOrderedList__favoritesidebar\");\n            this._editButton = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__friendsstickyarea .-cx-PRIVATE-fbChat__editbutton\")[0];\n            this._favoriteList = ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChat__favoritelist\");\n            this._activeNowList = ba.JSBNG__find(this._root, \".-cx-PRIVATE-fbChat__activenowlist\");\n            this._activeNowLabel = ba.scry(this._root, \".-cx-PRIVATE-fbChatOrderedList__activenowlabel\")[0];\n            if (this._activeNowLabel) {\n                this._activeNowArea = oa.byClass(this._activeNowLabel, \"-cx-PRIVATE-fbChatOrderedList__activenowlabelcontainer\");\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        this._orderedList = ba.JSBNG__find(this._root, \".fbChatOrderedList\");\n        this._scrollableOrderedList = oa.byClass(this._root, \"scrollableOrderedList\");\n        this._chatSidebar = oa.byClass(this._root, \"fbChatSidebar\");\n        this._scrollableArea = oa.byClass(this._root, \"scrollable\");\n        ea.listen(this._root, \"click\", this._onClick.bind(this));\n        ea.listen(this._root, \"mouseenter\", this._mouseEnter.bind(this));\n        ea.listen(this._root, \"mouseleave\", this._mouseLeave.bind(this));\n        if (this._editButton) {\n            ea.listen(this._editButton, \"click\", this.toggleEditMode.bind(this));\n            h.subscribe([\"LitestandSidebarBookmarks/close\",\"LitestandSidebar/collapse\",], this._onEditEnd.bind(this));\n        }\n    ;\n    ;\n        h.subscribe([\"LitestandSidebar/collapse\",\"LitestandSidebar/expand\",], function(JSBNG__event) {\n            if (this._isLitestandSidebar) {\n                this.getHoverController().setPaused(((JSBNG__event === \"LitestandSidebar/collapse\")));\n            }\n        ;\n        ;\n            this.render();\n        }.bind(this));\n        l.subscribe(m.ON_AVAILABILITY_CHANGED, jb(this.update, this));\n        qa.subscribe(\"privacy-changed\", jb(this.update, this));\n        p.subscribe([p.CONNECTED,p.RECONNECTING,p.SHUTDOWN,p.MUTE_WARNING,p.UNMUTE_WARNING,], jb(this.update, this));\n        this.inform(\"initialized\", this, h.BEHAVIOR_PERSISTENT);\n        this.render();\n        h.subscribe(ha.DUMP_EVENT, function(ec, fc) {\n            fc.chat_lists = ((fc.chat_lists || {\n                sorted_list: this.getCachedSortedList(),\n                ordered_list: na.getList(),\n                available_list: rb.getAvailableList(this._excludedIds),\n                excluded_list: this._excludedIds\n            }));\n        }.bind(this));\n        h.subscribe(\"ChatOrderedList/itemHeightChange\", function() {\n            this._cachedItemHeight = null;\n            this._cachedItemPadding = null;\n        }.bind(this));\n        this._renderUnreadCount = r.get(\"divebar_message_count\");\n        if (this._renderUnreadCount) {\n            la.subscribe(\"threads-updated\", function(ec, fc) {\n                {\n                    var fin315keys = ((window.top.JSBNG_Replay.forInKeys)((fc))), fin315i = (0);\n                    var gc;\n                    for (; (fin315i < fin315keys.length); (fin315i++)) {\n                        ((gc) = (fin315keys[fin315i]));\n                        {\n                            var hc = ma.getCanonicalUserInThread(gc);\n                            if (((((!this._renderedTopUsers || !((hc in this._renderedTopUsers)))) || !this._itemsMap[hc]))) {\n                                continue;\n                            }\n                        ;\n                        ;\n                            ma.getThreadMeta(gc, function(ic) {\n                                var jc = ((ic && ic.unread_count));\n                                this._updateUnreadCount(hc, jc);\n                            }.bind(this));\n                        };\n                    };\n                };\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n    };\n;\n    function sb(yb, zb) {\n        var ac = tb(yb, zb);\n        if (((ac !== 0))) {\n            return ac;\n        }\n    ;\n    ;\n        if (!mb) {\n            var bc = wb(yb, zb);\n            if (((bc !== 0))) {\n                return bc;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return na.compare(yb, zb);\n    };\n;\n    function tb(yb, zb) {\n        var ac = qa.allows(yb), bc = qa.allows(zb);\n        if (((ac !== bc))) {\n            return ((ac ? -1 : 1));\n        }\n    ;\n    ;\n        return 0;\n    };\n;\n    var ub = {\n    };\n    function vb(yb) {\n        return ((ub[yb] || (ub[yb] = xa.flatten(yb))));\n    };\n;\n    function wb(yb, zb) {\n        var ac = ua.getNowUnsafe(yb), bc = ua.getNowUnsafe(zb), cc = vb(((((ac || {\n        })).JSBNG__name || \"~\"))), dc = vb(((((bc || {\n        })).JSBNG__name || \"~\")));\n        if (((cc !== dc))) {\n            return ((((cc < dc)) ? -1 : 1));\n        }\n    ;\n    ;\n        return 0;\n    };\n;\n    function xb(yb, zb) {\n        var ac = ((l.get(yb) === m.MOBILE)), bc = ((l.get(zb) === m.MOBILE));\n        if (((ac !== bc))) {\n            return ((bc ? -1 : 1));\n        }\n    ;\n    ;\n        return wb(yb, zb);\n    };\n;\n    bb(rb, {\n        CONTEXT_CLASSES: {\n            nearby: \"-cx-PRIVATE-fbChatOrderedList__contextnearby\",\n            visiting: \"-cx-PRIVATE-fbChatOrderedList__contextvisiting\",\n            neighbourhood: \"-cx-PRIVATE-fbChatOrderedList__contextneighbourhood\",\n            listening: \"-cx-PRIVATE-fbChatOrderedList__contextlistening\"\n        },\n        getSortedList: function(yb, zb) {\n            var ac = na.getList().filter(function(dc) {\n                return ((!((dc in yb)) && ((qa.getFriendVisibility(dc) !== qa.BLACKLISTED))));\n            }), bc = [];\n            if (!aa.isOnline()) {\n                Array.prototype.push.apply(bc, ac);\n            }\n             else {\n                if (((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST))) {\n                    ac = this._filterByWhitelist(ac);\n                }\n            ;\n            ;\n                if (r.get(\"chat_web_ranking_with_presence\")) {\n                    Array.prototype.push.apply(bc, ac);\n                }\n                 else bc = this._splitOutTopFriends(ac, zb);\n            ;\n            ;\n            }\n        ;\n        ;\n            bc = bc.slice(0, zb);\n            if (((bc.length === zb))) {\n                var cc = rb.getAvailableList(bc.concat(yb)).length;\n                ((cc && bc.splice(-1)));\n            }\n        ;\n        ;\n            if (!r.get(\"chat_web_ranking_with_presence\")) {\n                bc.sort(sb);\n            }\n        ;\n        ;\n            nb = bc.slice();\n            return bc;\n        },\n        _filterByWhitelist: function(yb) {\n            var zb = yb, ac = {\n            }, bc, cc;\n            yb = [];\n            for (bc = 0; ((bc < zb.length)); ++bc) {\n                cc = zb[bc];\n                if (qa.allows(cc)) {\n                    ac[cc] = true;\n                    yb.push(cc);\n                }\n            ;\n            ;\n            };\n        ;\n            var dc = qa.getWhitelist();\n            for (bc = 0; ((bc < dc.length)); ++bc) {\n                cc = dc[bc];\n                if (!((cc in ac))) {\n                    yb.push(cc);\n                }\n            ;\n            ;\n            };\n        ;\n            for (bc = 0; ((bc < zb.length)); ++bc) {\n                cc = zb[bc];\n                if (!qa.allows(cc)) {\n                    yb.push(cc);\n                }\n            ;\n            ;\n            };\n        ;\n            return yb;\n        },\n        _splitOutTopFriends: function(yb, zb) {\n            var ac = [], bc = [], cc = r.get(\"ordered_list.top_friends\", 0), dc = r.get(\"ordered_list.top_mobile\", 0), ec = zb, fc = yb.length;\n            for (var gc = 0; ((((gc < fc)) && ((ec > 0)))); gc++) {\n                var hc = yb[gc], ic = l.get(hc), jc = ((ic === m.ACTIVE));\n                if (((((jc || ((((ic === m.MOBILE)) && ((gc < dc)))))) || ((gc < cc))))) {\n                    ac.push(hc);\n                    ((jc && ec--));\n                }\n                 else bc.push(hc);\n            ;\n            ;\n            };\n        ;\n            if (((gc < fc))) {\n                Array.prototype.push.apply(bc, yb.slice(gc));\n            }\n        ;\n        ;\n            if (((ac.length < zb))) {\n                Array.prototype.push.apply(ac, bc);\n            }\n        ;\n        ;\n            return ac;\n        },\n        getAvailableList: function(yb) {\n            var zb;\n            if (((r.get(\"divebar_show_mobile_more_friends\") || r.get(\"divebar_show_mobile_more_friends_alphabetical\")))) {\n                zb = l.getAvailableIDs();\n            }\n        ;\n        ;\n            if (!zb) {\n                zb = l.getOnlineIDs();\n            }\n        ;\n        ;\n            return zb.filter(function(ac) {\n                return !((ac in yb));\n            });\n        },\n        _pause: function() {\n            pb = true;\n        },\n        _unpause: function() {\n            pb = false;\n        },\n        _registerToggleRenderItem: function(yb) {\n            ea.listen(yb, \"click\", function() {\n                pb = !pb;\n                o.conditionClass(yb, \"checked\", pb);\n            });\n        }\n    });\n    bb(rb.prototype, i, {\n        getAllNodes: function() {\n            var yb = {\n            }, zb = ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\");\n            for (var ac = 0; ((ac < zb.length)); ac++) {\n                var bc = ca.get(zb[ac], \"id\");\n                if (bc) {\n                    yb[bc] = zb[ac];\n                }\n            ;\n            ;\n            };\n        ;\n            return yb;\n        },\n        getShowingUsers: function() {\n            return ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item,li.-cx-PRIVATE-fbChatGroupThreadlist__groupchat\").map(this.getUserForNode);\n        },\n        getUserForNode: function(yb) {\n            return ((ca.get(yb, \"id\") || ca.get(yb, \"serverthreadid\")));\n        },\n        getHoverController: function() {\n            if (!this._hoverController) {\n                this._hoverController = new w(this, this._contextualDialog);\n                if (((this._isLitestandSidebar && this._isLitestandSidebarCollapsed()))) {\n                    this._hoverController.setPaused(true);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._hoverController;\n        },\n        _isLitestandSidebarCollapsed: function() {\n            if (this._isLeftCollapsedSidebar) {\n                return true;\n            }\n        ;\n        ;\n            if (ob) {\n                return !ob.isExpanded();\n            }\n        ;\n        ;\n            n.loadModules([\"LitestandSidebar\",], function(yb) {\n                ob = yb;\n            });\n            return o.hasClass(JSBNG__document.documentElement, \"-cx-PUBLIC-hasLitestandBookmarksSidebar__collapsed\");\n        },\n        getPaddingOffset: function() {\n            return ((this._favoriteMode ? 24 : 8));\n        },\n        _calculateItemMeasurements: function() {\n            var yb = this._orderedList, zb = this._template.build(), ac = zb.getRoot();\n            ba.setContent(zb.getNode(\"JSBNG__name\"), \"test\");\n            if (this._favoriteSidebar) {\n                yb = this._favoriteList;\n                o.addClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            }\n        ;\n        ;\n            ac.style.visibility = \"hidden\";\n            ba.appendContent(yb, ac);\n            this._cachedItemHeight = za.getElementDimensions(ac).y;\n            this._cachedItemPadding = ((va.getFloat(zb.getNode(\"anchor\"), \"padding\") || 0));\n            ba.remove(ac);\n            if (this._favoriteSidebar) {\n                o.removeClass(this._favoriteSidebar, \"-cx-PRIVATE-fbChatOrderedList__measure\");\n            }\n        ;\n        ;\n        },\n        getItemHeight: function() {\n            if (((this._cachedItemHeight === null))) {\n                this._calculateItemMeasurements();\n            }\n        ;\n        ;\n            return this._cachedItemHeight;\n        },\n        getItemPadding: function() {\n            if (((this._cachedItemPadding === null))) {\n                this._calculateItemMeasurements();\n            }\n        ;\n        ;\n            return this._cachedItemPadding;\n        },\n        _updateGroupThreads: function() {\n            if (this._groupThreadsNode) {\n                var yb = qa.getVisibility(), zb = y({\n                    offlineItems: ((p.disconnected() || !yb)),\n                    litestandSidebar: ((((this._isSidebar && this._isLitestand)) && !r.get(\"test_old_divebar\"))),\n                    showNewGroupsButton: r.get(\"divebar_has_new_groups_button\", false)\n                });\n                sa.renderComponent(zb, this._groupThreadsNode);\n            }\n        ;\n        ;\n        },\n        _placeholderUpdate: function() {\n            if (((!this._usePlaceholder || !this._scrollContainer))) {\n                return;\n            }\n        ;\n        ;\n            var yb = ((this._root.offsetTop - this._scrollContainer.scrollTop));\n            this._scrollContainerHeight = ((this._scrollContainerHeight || this._scrollContainer.offsetHeight));\n            var zb = this.getItemHeight(), ac = Math.ceil(((this._scrollContainerHeight / zb))), bc = ((((yb < 0)) ? Math.max(((Math.floor(((-yb / zb))) - ac)), 0) : 0)), cc = ((((bc + ac)) + ac));\n            this._cachedItems = ((this._cachedItems || ba.scry(this._root, \"li.-cx-PRIVATE-fbChatOrderedList__item\")));\n            for (var dc = 0, ec = this._cachedItems.length; ((dc < ec)); dc++) {\n                o.conditionClass(this._cachedItems[dc], \"-cx-PRIVATE-fbChatOrderedList__hiddenitem\", ((((dc < bc)) || ((dc > cc)))));\n            ;\n            };\n        ;\n        },\n        _getListItem: function(yb, zb) {\n            var ac = this._itemsMap[yb];\n            if (!ac) {\n                return;\n            }\n        ;\n        ;\n            var bc = l.get(yb), cc = ra.isBirthday(yb), dc = ((qa.allows(yb) && !p.disconnected()));\n            if (((ac.buttonNode === undefined))) {\n                ac.buttonNode = ba.scry(ac.node, \".-cx-PRIVATE-fbChat__favoritebutton\")[0];\n                ac.contextNode = ba.JSBNG__find(ac.node, \".-cx-PRIVATE-fbChatOrderedList__context\");\n                ac.timeNode = ba.scry(ac.node, \".active_time\")[0];\n                ac.statusNodes = ba.scry(ac.node, \"img.JSBNG__status\");\n            }\n        ;\n        ;\n            o.conditionClass(ac.node, \"-cx-PRIVATE-fbChatOrderedList__isfavorite\", zb);\n            o.conditionClass(ac.node, \"-cx-PRIVATE-fbChat__isfavorite\", zb);\n            o.conditionClass(ac.node, \"-cx-PRIVATE-litestandSidebarFavorites__favorite\", ((this._isLitestand && zb)));\n            if (ac.buttonNode) {\n                if (!this._isLitestand) {\n                    o.conditionClass(ac.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__remove\", zb);\n                    o.conditionClass(ac.buttonNode, \"-cx-PRIVATE-fbChatOrderedList__add\", !zb);\n                }\n            ;\n            }\n        ;\n        ;\n            var ec = {\n                active: false,\n                mobile: false,\n                birthday: false\n            };\n            ec.active = ((bc === m.ACTIVE));\n            ec.mobile = ((bc === m.MOBILE));\n            ec.birthday = cc;\n            if (ec.mobile) {\n                var fc = ja.getShortDisplay(yb);\n                if (((ac.timeNode && ((ac.lastActiveTime !== fc))))) {\n                    ac.lastActiveTime = fc;\n                    ba.setContent(ac.timeNode, fc);\n                }\n            ;\n            ;\n            }\n             else if (ac.lastActiveTime) {\n                ac.lastActiveTime = null;\n                ba.empty(ac.timeNode);\n            }\n            \n        ;\n        ;\n            {\n                var fin316keys = ((window.top.JSBNG_Replay.forInKeys)((ec))), fin316i = (0);\n                var gc;\n                for (; (fin316i < fin316keys.length); (fin316i++)) {\n                    ((gc) = (fin316keys[fin316i]));\n                    {\n                        o.conditionClass(ac.node, gc, ((ec[gc] && dc)));\n                    ;\n                    };\n                };\n            };\n        ;\n            o.conditionClass(ac.node, \"invis\", !dc);\n            ac.statusNodes.forEach(function(hc) {\n                if (((((bc === m.ACTIVE)) && dc))) {\n                    hc.alt = \"Online\";\n                }\n                 else if (((((bc === m.MOBILE)) && dc))) {\n                    hc.alt = \"Mobile\";\n                }\n                 else hc.alt = \"\";\n                \n            ;\n            ;\n            });\n            this._applyContext(yb, ac);\n            return ac.node;\n        },\n        getRoot: function() {\n            return this._root;\n        },\n        getSortedList: function(yb) {\n            return rb.getSortedList(((yb || this._excludedIds)), this._numTopFriends);\n        },\n        getCachedSortedList: function(yb) {\n            if (((nb == null))) {\n                nb = this.getSortedList(yb);\n            }\n        ;\n        ;\n            return nb;\n        },\n        toggleFavoriteSidebar: function(yb, zb) {\n            function ac(dc, ec) {\n                o.conditionShow(ec, dc);\n                var fc = oa.byClass(ec, \"uiContextualLayerPositioner\");\n                ((fc && o.conditionShow(fc, dc)));\n            };\n        ;\n            o.conditionShow(this._orderedList, !yb);\n            if (this._favoriteSidebar) {\n                o.conditionShow(this._favoriteSidebar, yb);\n            }\n        ;\n        ;\n            var bc = ba.scry(((this._scrollableOrderedList || this._root)), \".-cx-PRIVATE-fbChatOrderedList__stickyarea\");\n            bc.forEach(ac.curry(yb));\n            var cc = ba.scry(((this._scrollableOrderedList || this._root)), \".-cx-PRIVATE-fbChatOrderedList__groupsstickyarea\");\n            ((cc.length && ac(zb, cc[0])));\n        },\n        hide: function() {\n            if (!this._isVisible) {\n                return;\n            }\n        ;\n        ;\n            this._isVisible = false;\n            u.tryHide();\n            o.hide(((this._scrollableOrderedList || this._root)));\n            this.inform(\"hide\");\n        },\n        _onFavoriteOrderChange: function() {\n            var yb = this.sortableGroup.getOrder();\n            t.updateList(yb);\n            t.save();\n        },\n        _getFavoriteItems: function() {\n            var yb = [], zb = t.get();\n            for (var ac = 0; ((ac < zb.length)); ac++) {\n                var bc = this._itemsMap[zb[ac]];\n                if (bc) {\n                    yb.push(bc.node);\n                }\n            ;\n            ;\n            };\n        ;\n            return yb;\n        },\n        _getChatTabOpenLogData: function(yb) {\n            var zb = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), ac = {\n                mode: ((zb ? \"JSBNG__sidebar\" : \"chatNub\")),\n                typehead: false\n            };\n            if (((this._scrollableArea && this._scrollContainer))) {\n                var bc = za.getElementPosition(this._scrollableArea, \"viewport\").y, cc = za.getElementPosition(yb, \"viewport\").y, dc = this._scrollContainer.scrollTop;\n                if (((cc > bc))) {\n                    ac.visible_slot = Math.round(((((cc - bc)) / 32)));\n                    var ec = Math.round(((dc / 32)));\n                    ac.global_slot = ((ac.visible_slot + ec));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (zb) {\n                ac.sidebar_height = ((this._chatSidebar && this._chatSidebar.clientHeight));\n                if (this._scrollContainer) {\n                    ac.buddylist_height = this._scrollContainer.clientHeight;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return ac;\n        },\n        _resetFavoriteBounds: function() {\n            var yb = t.get(), zb = yb.length;\n            if (zb) {\n                var ac = yb[0], bc = yb[((zb - 1))], cc = this._itemsMap[ac], dc = this._itemsMap[bc], ec = new ta(za.getElementPosition(cc.node).y, 0, ((za.getElementPosition(dc.node).y + za.getElementDimensions(dc.node).y)), 0);\n                this.sortableGroup.setBoundingBox(ec);\n            }\n        ;\n        ;\n        },\n        _createSortableGroup: function() {\n            if (this.sortableGroup) {\n                this.sortableGroup.destroy();\n            }\n        ;\n        ;\n            n.loadModules([\"SortableGroup\",], function(yb) {\n                this.sortableGroup = new yb().setBeforeGrabCallback(this._resetFavoriteBounds.bind(this)).setOrderChangeHandler(this._onFavoriteOrderChange.bind(this));\n                if (this._isLitestand) {\n                    this.sortableGroup.gutter = 1;\n                }\n            ;\n            ;\n                var zb = this._getFavoriteItems();\n                for (var ac = 0; ((ac < zb.length)); ac++) {\n                    var bc = zb[ac];\n                    this.sortableGroup.addSortable(ca.get(bc, \"id\"), bc);\n                };\n            ;\n            }.bind(this));\n        },\n        toggleEditMode: function() {\n            u.dismissDialog();\n            t.toggleEditMode();\n            if (t.isEditMode()) {\n                this._createSortableGroup();\n                ba.setContent(this._editButton, \"DONE\");\n                o.addClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n                this.inform(\"editStart\");\n            }\n             else this._onEditEnd();\n        ;\n        ;\n        },\n        _onEditEnd: function() {\n            if (t.isEditMode()) {\n                t.toggleEditMode();\n            }\n        ;\n        ;\n            ba.setContent(this._editButton, \"EDIT\");\n            o.removeClass(this._favoriteSidebar, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\");\n            this.inform(\"editEnd\");\n        },\n        _onClick: function(JSBNG__event) {\n            var yb = JSBNG__event.getTarget(), zb = oa.byTag(yb, \"li\");\n            if (t.isEditMode()) {\n                var ac = oa.byClass(yb, \"-cx-PRIVATE-fbChat__favoritebutton\");\n                if (((ac && zb))) {\n                    var bc = ca.get(zb, \"id\");\n                    if (bc) {\n                        t.toggleID(bc);\n                        t.save();\n                    }\n                ;\n                ;\n                    this.update();\n                }\n            ;\n            ;\n                JSBNG__event.prevent();\n                return false;\n            }\n        ;\n        ;\n            if (zb) {\n                if (o.hasClass(zb, \"blackbirdWhitelist\")) {\n                    var cc = new ya(\"/ajax/chat/privacy/settings_dialog.php\").addQueryData({\n                        ref: \"whitelist_separator\"\n                    });\n                    j.send(new k(cc));\n                    JSBNG__event.prevent();\n                    return false;\n                }\n            ;\n            ;\n                var dc = ca.get(zb, \"id\"), ec = o.hasClass(zb, \"-cx-PRIVATE-fbChatGroupThreadlist__item\");\n                if (((dc || ec))) {\n                    var fc = this._getChatTabOpenLogData(zb), gc = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), hc = ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)), ic = ((hc ? \"white_list\" : \"ordered_list\"));\n                    if (ec) {\n                        dc = zb.getAttribute(\"data-threadid\");\n                        ic = ((dc ? \"recent_threads_in_divebar\" : \"recent_threads_in_divebar_new\"));\n                    }\n                     else if (((((gc && this._favoriteMode)) && !hc))) {\n                        while (zb.parentNode) {\n                            zb = zb.parentNode;\n                            if (o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__activenowlist\")) {\n                                ic = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                        ;\n                            if (o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__favoritelist\")) {\n                                break;\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                     else while (zb.previousSibling) {\n                        zb = zb.previousSibling;\n                        if (o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\")) {\n                            if (o.hasClass(zb, \"moreOnlineFriends\")) {\n                                ic = \"more_online_friends\";\n                                break;\n                            }\n                        ;\n                        ;\n                            if (o.hasClass(zb, \"blackbirdWhitelist\")) {\n                                ic = \"blackbird_offline_section\";\n                                break;\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                    \n                ;\n                ;\n                    fc.source = ic;\n                    var jc = ((ec ? z.THREAD_TYPE : ka.FRIEND));\n                    q.openTab(dc, jc, fc);\n                    this.inform(\"click\", {\n                        id: dc\n                    });\n                }\n                 else if (((o.hasClass(zb, \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\") && oa.byClass(yb, \"-cx-PRIVATE-fbChatOrderedList__separatorinner\")))) {\n                    this.JSBNG__scrollTo(zb);\n                }\n                 else if (o.hasClass(zb, \"-cx-PRIVATE-litestandSidebarPYMK__root\")) {\n                    return;\n                }\n                \n                \n            ;\n            ;\n                return false;\n            }\n        ;\n        ;\n        },\n        _mouseEnter: function() {\n            this._preventRendering = true;\n        },\n        _mouseLeave: function() {\n            this._preventRendering = false;\n        },\n        setExcludedIds: function(yb) {\n            this._excludedIds = cb(((yb || [])));\n        },\n        setNumTopFriends: function(yb) {\n            if (((yb !== this._numTopFriends))) {\n                this._numTopFriends = yb;\n                this.render();\n            }\n        ;\n        ;\n        },\n        _getOfflineToSectionItems: function() {\n            var yb = ((\"subheader-text-\" + gb())), zb = ba.create(\"a\", {\n                href: \"#\",\n                \"aria-describedby\": yb\n            }, ba.tx._(\"Edit\")), ac = [], bc = ba.tx._(\"MORE FRIENDS\");\n            ac.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n            }, bc), ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n            }, ia.span({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n            }))))));\n            ac.push(ia.li({\n                className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator blackbirdWhitelist\"\n            }, ia.div({\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorInner\"\n            }, ia.div({\n                className: \"fbChatOrderedList/separatorSubheader\"\n            }, ia.span({\n                id: yb,\n                className: \"-cx-PRIVATE-fbChatOrderedList__separatorsubheadertext\"\n            }, lb._(\"These friends can't see you on chat. {=link}\", {\n                \"=link\": zb\n            })))))));\n            return ac;\n        },\n        _renderOrderedList: function() {\n            if (((((!this._isVisible || ((this._preventRendering && this._hasRendered)))) || pb))) {\n                return;\n            }\n        ;\n        ;\n            this._hasRendered = true;\n            this._cachedItems = null;\n            var yb = [], zb, ac, bc = false, cc = false, dc = r.get(\"divebar_has_new_groups_button\", false), ec = o.hasClass(JSBNG__document.documentElement, \"sidebarMode\"), fc = qa.getVisibility(), gc = ((qa.getOnlinePolicy() === qa.ONLINE_TO_WHITELIST)), hc = ((this._isLitestandSidebar && this._isLitestandSidebarCollapsed())), ic = r.get(\"groups_in_divebar\");\n            ((ic && this._updateGroupThreads()));\n            var jc = ((ic && v.getThreadIDs().length)), kc = ((((((ec && this._favoriteMode)) && fc)) && !gc));\n            if (((((((kc && ic)) && jc)) && this._groupThreadsNode))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                x.nukeLinks(this._groupThreadsNode);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n        ;\n        ;\n            var lc = ((((kc && this._groupThreadsNode)) && this._groupsList)), mc = ((lc && jc)), nc = ((this._isLitestand && !oa.byClass(this._root, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\")));\n            if (((lc && ((jc || ((nc && dc))))))) {\n                ba.setContent(this._groupsList, this._groupThreadsNode);\n                o.show(this._groupsList);\n                x.nukeLinks(this._favoriteList);\n                this.inform(\"render\");\n            }\n             else ((this._groupsList && o.hide(this._groupsList)));\n        ;\n        ;\n            var oc = ((jc || 0));\n            if (((dc && ((mc || !kc))))) {\n                oc++;\n            }\n        ;\n        ;\n            var pc = [], qc, rc;\n            if (kc) {\n                ((this._chatSidebar && o.addClass(this._chatSidebar, \"fbSidebarFavoriteList\")));\n                pc = t.get();\n                if (hc) {\n                    pc = pc.slice(0, Math.max(0, ((this._numTopFriends - oc))));\n                }\n            ;\n            ;\n                for (qc = 0, rc = pc.length; ((qc < rc)); qc++) {\n                    zb = pc[qc];\n                    ac = this._getListItem(zb, true);\n                    if (ac) {\n                        yb.push(ac);\n                    }\n                     else {\n                        cc = true;\n                        this._renderListItem(zb, this.update.bind(this));\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            this.toggleFavoriteSidebar(kc, mc);\n            var sc = ((hc ? 1 : 0)), tc = rb.getSortedList(cb(pc), Math.max(0, ((((((this._numTopFriends - pc.length)) - oc)) + sc))));\n            if (kc) {\n                if (((pc.length && tc.length))) {\n                    var uc = ba.create(\"li\", {\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separator\"\n                    });\n                    yb.push(uc);\n                }\n            ;\n            ;\n            }\n             else if (((jc || dc))) {\n                ((this._groupThreadsNode && yb.push(this._groupThreadsNode)));\n            }\n            \n        ;\n        ;\n            var vc = ((qa.getVisibility() && ((qa.getOnlinePolicy() == qa.ONLINE_TO_WHITELIST))));\n            for (var wc = 0, xc = tc.length; ((wc < xc)); wc++) {\n                zb = tc[wc];\n                if (vc) {\n                    if (!qa.allows(zb)) {\n                        if (((((wc + 2)) >= tc.length))) {\n                            break;\n                        }\n                    ;\n                    ;\n                        vc = false;\n                        var yc = this._getOfflineToSectionItems();\n                        yb.push(yc[0]);\n                        yb.push(yc[1]);\n                        xc -= 2;\n                    }\n                ;\n                }\n            ;\n            ;\n                ac = this._getListItem(zb);\n                if (ac) {\n                    yb.push(ac);\n                }\n                 else this._renderListItem(zb, this.render.bind(this));\n            ;\n            ;\n            };\n        ;\n            if (kc) {\n                ba.setContent(this._favoriteList, yb);\n                if (yb.length) {\n                    x.nukeLinks(this._favoriteList);\n                }\n            ;\n            ;\n                this.inform(\"render\");\n            }\n        ;\n        ;\n            var zc;\n            if (hc) {\n                zc = [];\n            }\n             else zc = rb.getAvailableList(this._excludedIds);\n        ;\n        ;\n            var ad = pc.concat(tc), bd = cb(ad);\n            zc = zc.filter(function(jd) {\n                return !((jd in bd));\n            });\n            if (this._renderUnreadCount) {\n                var cd = [];\n                if (this._renderedTopUsers) {\n                    var dd = Object.keys(this._renderedTopUsers).filter(function(jd) {\n                        return !((jd in bd));\n                    });\n                    dd.forEach(function(jd) {\n                        this._updateUnreadCount(jd, 0);\n                    }.bind(this));\n                    ad.forEach(function(jd) {\n                        if (!((jd in this._renderedTopUsers))) {\n                            cd.push(jd);\n                        }\n                    ;\n                    ;\n                    }.bind(this));\n                }\n                 else cd = ad;\n            ;\n            ;\n                cd.forEach(function(jd) {\n                    ma.getThreadMeta(ma.getThreadIdForUser(jd), function(kd) {\n                        this._updateUnreadCount(jd, ((kd && kd.unread_count)));\n                    }.bind(this));\n                }.bind(this));\n                this._renderedTopUsers = bd;\n            }\n        ;\n        ;\n            if (r.get(\"divebar_show_mobile_more_friends_alphabetical\")) {\n                zc.sort(wb);\n            }\n             else zc.sort(xb);\n        ;\n        ;\n            var ed = \"MORE FRIENDS\";\n            if (kc) {\n                yb = [];\n            }\n             else if (((zc.length && yb.length))) {\n                var fd;\n                if (this._isLitestand) {\n                    fd = ia.span(null, ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                    }, ed, \" \\u00b7 \", zc.length), ia.span({\n                        className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                    }, \" +\", zc.length));\n                }\n                 else fd = lb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                    \"MORE ONLINE FRIENDS\": ed,\n                    \"=count\": zc.length\n                });\n            ;\n            ;\n                if (this._pymk) {\n                    bc = true;\n                    yb.push(this._pymk);\n                }\n            ;\n            ;\n                yb.push(ia.li({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__friendsseparator moreOnlineFriends\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorouter\"\n                }, ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorinner\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatortext\"\n                }, fd), ia.div({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatordive\"\n                }, ia.span({\n                    className: \"-cx-PRIVATE-fbChatOrderedList__separatorbar\"\n                }))))));\n            }\n            \n        ;\n        ;\n            for (qc = 0, rc = zc.length; ((qc < rc)); qc++) {\n                zb = zc[qc];\n                ac = this._getListItem(zb);\n                if (ac) {\n                    yb.push(ac);\n                }\n                 else this._renderListItem(zb, this.render.bind(this));\n            ;\n            ;\n            };\n        ;\n            if (((((!tc.length && !zc.length)) && !oc))) {\n                var gd = this._messageTemplate.render(), hd = ab.getNode(gd, \"message\");\n                ba.setContent(hd, \"No one is available to chat.\");\n                yb.push(gd);\n            }\n        ;\n        ;\n            if (yb.length) {\n                if (kc) {\n                    o.show(this._activeNowList);\n                    if (this._activeNowLabel) {\n                        var id;\n                        o.show(this._activeNowArea);\n                        if (this._isLitestand) {\n                            id = ia.span(null, ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorfulltext\"\n                            }, ed, \" \\u00b7 \", zc.length), ia.span({\n                                className: \"-cx-PRIVATE-fbChatOrderedList__separatorcollapsedtext\"\n                            }, \" +\", zc.length));\n                        }\n                         else id = lb._(\"{MORE ONLINE FRIENDS} ({=count})\", {\n                            \"MORE ONLINE FRIENDS\": \"ACTIVE NOW\",\n                            \"=count\": zc.length\n                        });\n                    ;\n                    ;\n                        ba.setContent(this._activeNowLabel, id);\n                    }\n                ;\n                ;\n                    ba.setContent(this._activeNowList, yb);\n                    x.nukeLinks(this._activeNowList);\n                }\n                 else {\n                    if (((this._pymk && !bc))) {\n                        yb.push(this._pymk);\n                    }\n                ;\n                ;\n                    ba.setContent(this._orderedList, yb);\n                    if (this._pymk) {\n                        x.removeMessagesHrefs(this.getRoot());\n                    }\n                     else x.nukeLinks(this.getRoot());\n                ;\n                ;\n                }\n            ;\n            ;\n                this.inform(\"render\");\n                this._placeholderUpdate();\n                if (!this._renderingAfterScroll) {\n                    this._renderingAfterScroll = true;\n                    this.render = fb(ib.curry(this._renderOrderedList.bind(this), \"ChatOrderedList/render\", true), 300);\n                }\n            ;\n            ;\n            }\n             else if (kc) {\n                o.hide(this._activeNowList);\n                if (this._activeNowArea) {\n                    o.hide(this._activeNowArea);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n            if (kc) {\n                ((this._editButton && u.tryShow(this._editButton)));\n            }\n             else u.tryHide();\n        ;\n        ;\n            if (((kc && !cc))) {\n                if (((t.isEditMode() && t.hasChanged()))) {\n                    this._createSortableGroup();\n                }\n            ;\n            }\n        ;\n        ;\n        },\n        render: function() {\n            this.render = fb(this._renderOrderedList.bind(this), 300);\n            this.render();\n        },\n        _renderListItem: function(yb, zb) {\n            ua.get(yb, function(ac) {\n                var bc = this._template.render(), cc = ab.getNode(bc, \"profile-photo\");\n                if (r.get(\"chat_use_client_side_image_requests\", 0)) {\n                    var dc = ((this._isLitestand ? 24 : 28));\n                    new fa().setFBID(ac.id).setType(ga.PROFILE_PICTURE).setDimensions(dc, dc).setResizeMode(pa.COVER).setCallback(function(ic) {\n                        cc.setAttribute(\"src\", ic.uri);\n                    }).send();\n                }\n                 else cc.setAttribute(\"src\", ac.thumbSrc);\n            ;\n            ;\n                var ec = ab.getNode(bc, \"JSBNG__name\");\n                ba.setContent(ec, ac.JSBNG__name);\n                var fc = ab.getNode(bc, \"accessible-name\");\n                ba.setContent(fc, ac.JSBNG__name);\n                var gc = ab.getNode(bc, \"anchor\");\n                gc.setAttribute(\"href\", ((\"/messages/\" + yb)));\n                var hc = ab.getNode(bc, \"tooltip\");\n                ((hc && wa.set(hc, ac.JSBNG__name, \"right\")));\n                ca.set(bc, \"id\", yb);\n                this._itemsMap[yb] = {\n                    node: bc\n                };\n                ((zb && zb(bc)));\n            }.bind(this));\n        },\n        _updateUnreadCount: function(yb, zb) {\n            var ac = this._itemsMap[yb];\n            if (!ac) {\n                return;\n            }\n        ;\n        ;\n            if (this._isSidebar) {\n                this._unreadMessages = ((this._unreadMessages || {\n                }));\n                if (!!zb) {\n                    this._unreadMessages[yb] = true;\n                }\n                 else delete this._unreadMessages[yb];\n            ;\n            ;\n                h.inform(\"buddylist-nub/updateCount\", {\n                    count: Object.keys(this._unreadMessages).length\n                });\n            }\n        ;\n        ;\n            ac.unreadCount = ((ac.unreadCount || ba.JSBNG__find(ac.node, \".-cx-PRIVATE-fbChatOrderedList__unreadcount\")));\n            zb = ((zb ? zb : 0));\n            ba.setContent(ac.unreadCount, ((((zb > qb)) ? ((qb + \"+\")) : zb)));\n            o.conditionClass(ac.unreadCount, \"-cx-PRIVATE-fbChatOrderedList__largecount\", ((zb > qb)));\n            o.conditionClass(ac.node, \"-cx-PRIVATE-fbChatOrderedList__hasunreadcount\", zb);\n        },\n        show: function() {\n            if (this._isVisible) {\n                return;\n            }\n        ;\n        ;\n            this._isVisible = true;\n            o.show(((this._scrollableOrderedList || this._root)));\n            this.render();\n            this.inform(\"show\");\n        },\n        isVisible: function() {\n            return this._isVisible;\n        },\n        update: function() {\n            this._hasRendered = false;\n            if (!this._renderRequest) {\n                this._renderRequest = hb(function() {\n                    this.render();\n                    this._renderRequest = null;\n                }.bind(this));\n            }\n        ;\n        ;\n        },\n        setScrollContainer: function(yb) {\n            if (ba.contains(yb, this._root)) {\n                this._scrollContainer = yb;\n                if (this._usePlaceholder) {\n                    ea.listen(yb, \"JSBNG__scroll\", kb.acrossTransitions(this._placeholderUpdate.bind(this)));\n                    ea.listen(window, \"resize\", kb.acrossTransitions(function() {\n                        this._scrollContainerHeight = null;\n                        this._placeholderUpdate();\n                    }.bind(this), 250));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        JSBNG__scrollTo: function(yb) {\n            if (!this._scrollContainer) {\n                return;\n            }\n        ;\n        ;\n            var zb = this._scrollContainer.scrollHeight, ac = this._scrollContainer.clientHeight, bc = this._scrollContainer.scrollTop, cc = Math.min(yb.offsetTop, ((zb - ac)));\n            if (((bc !== cc))) {\n                var dc = ((this._isLitestand ? 600 : ((((Math.abs(((cc - bc))) / this._scrollContainer.clientHeight)) * 500)))), ec = ((this._isLitestand ? da.easeOutExpo : g.ease.end));\n                new g(this._scrollContainer).to(\"scrollTop\", cc).ease(ec).duration(dc).go();\n            }\n        ;\n        ;\n        },\n        _applyContext: function(yb, zb) {\n            var ac = ((s.getShortDisplay(yb) || \"\"));\n            if (zb.contextNode) {\n                ba.setContent(zb.contextNode, ac);\n                o.conditionClass(zb.node, \"-cx-PRIVATE-fbChatOrderedList__hascontext\", ac);\n                var bc = s.get(yb), cc = ((bc ? bc.type : null));\n                {\n                    var fin317keys = ((window.top.JSBNG_Replay.forInKeys)((rb.CONTEXT_CLASSES))), fin317i = (0);\n                    var dc;\n                    for (; (fin317i < fin317keys.length); (fin317i++)) {\n                        ((dc) = (fin317keys[fin317i]));\n                        {\n                            var ec = ((dc === cc)), fc = ((rb.CONTEXT_CLASSES[dc] || \"-cx-PRIVATE-fbChatOrderedList__contextother\"));\n                            o.conditionClass(zb.contextNode, fc, ec);\n                        };\n                    };\n                };\n            ;\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = rb;\n});\n__d(\"TypingDetectorController\", [\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"ChannelConnection\",\"ChatVisibility\",\"Keys\",\"PresencePrivacy\",\"ShortProfiles\",\"TypingDetector\",\"copyProperties\",\"emptyFunction\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChannelConnection\"), k = b(\"ChatVisibility\"), l = b(\"Keys\"), m = b(\"PresencePrivacy\"), n = b(\"ShortProfiles\"), o = b(\"TypingDetector\"), p = b(\"copyProperties\"), q = b(\"emptyFunction\"), r = b(\"shield\");\n    function s(u) {\n        if (!k.isOnline()) {\n            return false;\n        }\n    ;\n    ;\n        if (u) {\n            var v = n.getNow(u);\n            return ((((v && ((v.type == \"friend\")))) && m.allows(u)));\n        }\n    ;\n    ;\n        return true;\n    };\n;\n    function t(u, v, w, x, y) {\n        this.userID = u;\n        this.input = v;\n        this.source = w;\n        this.threadID = y;\n        this.remoteState = o.INACTIVE;\n        this.notifyTimer = null;\n        x = ((x || {\n        }));\n        this.notifyDelay = ((x.notifyDelay || this.notifyDelay));\n        this._typingDetector = new o(v);\n        this._typingDetector.init(x);\n        this._typingDetector.subscribe(\"change\", this._stateChange.bind(this));\n    };\n;\n    p(t.prototype, {\n        notifyDelay: 1000,\n        setUserAndThread: function(u, v) {\n            if (((((this.userID !== u)) || ((this.threadID !== v))))) {\n                this.resetState();\n                this.userID = u;\n                this.threadID = v;\n            }\n        ;\n        ;\n        },\n        setIgnoreEnter: function(u) {\n            var v = ((u ? [l.RETURN,] : []));\n            this._typingDetector.setIgnoreKeys(v);\n        },\n        resetState: function() {\n            this.remoteState = t.INACTIVE;\n            this._typingDetector.reset();\n            JSBNG__clearTimeout(this.notifyTimer);\n            this.notifyTimer = null;\n        },\n        _stateChange: function(u, v) {\n            if (((v != o.QUITTING))) {\n                JSBNG__clearTimeout(this.notifyTimer);\n                this.notifyTimer = r(this._notifyState, this, v).defer(this.notifyDelay, false);\n            }\n             else this._notifyState(v, true);\n        ;\n        ;\n        },\n        _notifyState: function(u, v) {\n            if (((!this.userID && !this.threadID))) {\n                return;\n            }\n        ;\n        ;\n            var w = this.userID, x = s(w);\n            if (((x && ((u != this.remoteState))))) {\n                this.remoteState = u;\n                if (j.disconnected()) {\n                    return;\n                }\n            ;\n            ;\n                var y = {\n                    typ: u,\n                    to: w,\n                    source: this.source,\n                    thread: this.threadID\n                };\n                new g().setHandler(this._onTypResponse.bind(this, w)).setErrorHandler(q).setData(y).setURI(\"/ajax/messaging/typ.php\").setAllowCrossPageTransition(true).setOption(\"asynchronous\", !v).send();\n            }\n        ;\n        ;\n        },\n        _onTypResponse: function(u, v) {\n            var w = ((v.getPayload() || {\n            }));\n            if (w.offline) {\n                h.set(u, i.OFFLINE, \"typing_response\");\n            }\n        ;\n        ;\n        }\n    });\n    e.exports = t;\n});\n__d(\"ChatBehavior\", [\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"ChatConfig\",\"copyProperties\",\"MercuryConstants\",\"ChatSidebarCalloutData\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AvailableList\"), i = b(\"AvailableListConstants\"), j = b(\"ChatConfig\"), k = b(\"copyProperties\"), l = b(\"MercuryConstants\").ChatNotificationConstants, m = b(\"ChatSidebarCalloutData\").isShown, n = h.getWebChatNotification(), o = m, p = true, q = k(new g(), {\n        ON_CHANGED: \"changed\",\n        notifiesUserMessages: function() {\n            return ((n !== l.NO_USER_MESSAGE_NOTIFICATION));\n        },\n        ignoresRemoteTabRaise: function() {\n            return o;\n        },\n        showsTabUnreadUI: function() {\n            if (j.get(\"web_messenger_suppress_tab_unread\")) {\n                return p;\n            }\n        ;\n        ;\n            return true;\n        }\n    });\n    function r() {\n        q.inform(q.ON_CHANGED);\n    };\n;\n    h.subscribe(i.ON_CHAT_NOTIFICATION_CHANGED, function() {\n        var s = n, t = h.getWebChatNotification();\n        n = t;\n        if (((s != t))) {\n            r();\n        }\n    ;\n    ;\n    });\n    g.subscribe(\"chat/set_does_page_occlude_tabs\", function(s, t) {\n        o = !!t;\n        r();\n    });\n    g.subscribe(\"chat/set_show_tab_unread_ui\", function(s, t) {\n        p = !!t;\n        r();\n    });\n    e.exports = q;\n});\n__d(\"ChatSidebarSheet\", [\"JSBNG__Event\",\"function-extensions\",\"ArbiterMixin\",\"BlackbirdUpsell\",\"ChannelConnection\",\"ChannelConstants\",\"ChatBehavior\",\"ChatConfig\",\"ChatVisibility\",\"JSBNG__CSS\",\"DOM\",\"JSLogger\",\"PresencePrivacy\",\"React\",\"XUIButton.react\",\"csx\",\"cx\",\"copyProperties\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\");\n    b(\"function-extensions\");\n    var h = b(\"ArbiterMixin\"), i = b(\"BlackbirdUpsell\"), j = b(\"ChannelConnection\"), k = b(\"ChannelConstants\"), l = b(\"ChatBehavior\"), m = b(\"ChatConfig\"), n = b(\"ChatVisibility\"), o = b(\"JSBNG__CSS\"), p = b(\"DOM\"), q = b(\"JSLogger\"), r = b(\"PresencePrivacy\"), s = b(\"React\"), t = b(\"XUIButton.react\"), u = b(\"csx\"), v = b(\"cx\"), w = b(\"copyProperties\"), x = b(\"tx\"), y = q.create(\"sidebar_sheet\");\n    function z(ca) {\n        switch (ca) {\n          case k.HINT_AUTH:\n            return \"Your session has timed out. Please log in.\";\n          case k.HINT_CONN:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n          case k.HINT_MAINT:\n            return x._(\"Facebook {Chat} is currently down for maintenance.\", {\n                Chat: \"Chat\"\n            });\n          default:\n            return x._(\"Facebook {Chat} is currently unavailable.\", {\n                Chat: \"Chat\"\n            });\n        };\n    ;\n    };\n;\n    function aa(ca) {\n        var da;\n        if (((ca === null))) {\n            da = \"Unable to connect to chat. Check your Internet connection.\";\n        }\n         else if (((ca > m.get(\"warning_countdown_threshold_msec\")))) {\n            var ea = p.create(\"a\", {\n                href: \"#\",\n                className: \"fbChatReconnectLink\"\n            }, \"Try again\");\n            da = p.tx._(\"Unable to connect to chat. {try-again-link}\", {\n                \"try-again-link\": ea\n            });\n        }\n         else if (((ca > 1000))) {\n            da = x._(\"Unable to connect to chat. Reconnecting in {seconds}...\", {\n                seconds: Math.floor(((ca / 1000)))\n            });\n        }\n         else da = \"Unable to connect to chat. Reconnecting...\";\n        \n        \n    ;\n    ;\n        return da;\n    };\n;\n    function ba(ca) {\n        this._root = ca;\n        this._litestandOffline = p.scry(ca, \".-cx-PRIVATE-fbChatSidebarOffline__placeholder\");\n        this._message = p.JSBNG__find(ca, \"div.fbChatSidebarMessage div.message\");\n        j.subscribe([j.CONNECTED,j.SHUTDOWN,j.RECONNECTING,], this._handleConnectionChange.bind(this));\n        j.subscribe([j.MUTE_WARNING,j.UNMUTE_WARNING,], this._render.bind(this));\n        r.subscribe(\"privacy-user-presence-changed\", this._render.bind(this));\n        l.subscribe(l.ON_CHANGED, this._render.bind(this));\n        this._render();\n    };\n;\n    w(ba.prototype, h, {\n        _channelStatus: null,\n        _channelData: null,\n        _handleConnectionChange: function(ca, da) {\n            this._channelStatus = ca;\n            this._channelData = da;\n            this._render();\n        },\n        _showWarningTimeout: null,\n        _warningMsgEventListener: null,\n        _renderChannelDisconnect: function() {\n            if (((this._channelStatus === j.SHUTDOWN))) {\n                return p.setContent(this._message, z(this._channelData));\n            }\n             else if (((this._channelStatus === j.RECONNECTING))) {\n                var ca = this._channelData;\n                p.setContent(this._message, aa(ca));\n                if (((ca > 1000))) {\n                    if (((ca > m.get(\"warning_countdown_threshold_msec\")))) {\n                        this._warningMsgEventListener = g.listen(this._message, \"click\", function(JSBNG__event) {\n                            if (o.hasClass(JSBNG__event.getTarget(), \"fbChatReconnectLink\")) {\n                                j.reconnect();\n                                return false;\n                            }\n                        ;\n                        ;\n                        });\n                    }\n                ;\n                ;\n                    this._showWarningTimeout = JSBNG__setTimeout(this._handleConnectionChange.bind(this, j.RECONNECTING, ((ca - 1000))), 1000, false);\n                }\n            ;\n            ;\n            }\n            \n        ;\n        ;\n        },\n        _goOnlineEventListener: null,\n        _renderOffline: function() {\n            if (this._isLitestand) {\n                return;\n            }\n        ;\n        ;\n            if (((this._litestandOffline && this._litestandOffline.length))) {\n                this._renderLitestandOffline();\n            }\n        ;\n        ;\n            var ca = \"fbChatGoOnlineLink\", da = \"Turn on chat\", ea = p.create(\"a\", {\n                href: \"#\",\n                className: ca\n            }, da), fa = p.tx._(\"{=Go online} to see who's available.\", {\n                \"=Go online\": ea\n            });\n            p.setContent(this._message, fa);\n            this._goOnlineEventListener = g.listen(this._message, \"click\", function(JSBNG__event) {\n                if (o.hasClass(JSBNG__event.getTarget(), ca)) {\n                    y.log(\"sidebar_go_online\");\n                    n.goOnline();\n                    return false;\n                }\n            ;\n            ;\n            });\n        },\n        _renderLitestandOffline: function() {\n            this._litestandOffline = this._litestandOffline[0];\n            this._isLitestand = true;\n            if (m.get(\"litestand_blended_sidebar\")) {\n                s.renderComponent(t({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__root -cx-PRIVATE-fbChatSidebarOffline__button\",\n                    href: {\n                        url: \"#\"\n                    },\n                    label: \"Turn on Chat\",\n                    onClick: function() {\n                        y.log(\"sidebar_go_online\");\n                        n.goOnline();\n                    }\n                }), this._litestandOffline);\n                this._litestandOffline = null;\n            }\n             else {\n                s.renderComponent(s.DOM.a({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__root -cx-PUBLIC-litestandLiquid__hover\",\n                    href: \"#\",\n                    onClick: function() {\n                        y.log(\"sidebar_go_online\");\n                        n.goOnline();\n                    }\n                }, s.DOM.i({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__leftborder\"\n                }), s.DOM.div({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__center\"\n                }, s.DOM.div({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__content\"\n                }, s.DOM.i({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__offlineicon\"\n                }), s.DOM.div({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__message\"\n                }, p.tx._(\"Turn on Chat\")))), s.DOM.i({\n                    className: \"-cx-PRIVATE-fbChatSidebarOffline__rightborder\"\n                }), s.DOM.div({\n                    className: \"-cx-PUBLIC-litestandSidebarBookmarks__tooltip\",\n                    \"data-hover\": \"tooltip\",\n                    \"data-tooltip-alignh\": \"center\",\n                    \"data-tooltip-position\": \"right\",\n                    \"aria-label\": \"Turn on Chat\"\n                })), this._litestandOffline);\n                this._litestandOffline = null;\n            }\n        ;\n        ;\n        },\n        _renderBlackbirdUpsell: function() {\n            p.setContent(this._message, i.getOfflineContent());\n        },\n        _renderBlackbird: function(ca) {\n            p.setContent(this._message, i.getBlackbirdContent(ca));\n        },\n        _clear: function() {\n            if (this._showWarningTimeout) {\n                JSBNG__clearTimeout(this._showWarningTimeout);\n                this._showWarningTimeout = null;\n            }\n        ;\n        ;\n            if (this._warningMsgEventListener) {\n                this._warningMsgEventListener.remove();\n                this._warningMsgEventListener = null;\n            }\n        ;\n        ;\n            if (this._goOnlineEventListener) {\n                this._goOnlineEventListener.remove();\n                this._goOnlineEventListener = null;\n            }\n        ;\n        ;\n            o.removeClass(this._root, \"upsell\");\n            o.removeClass(this._root, \"offline\");\n            o.removeClass(this._root, \"blackbird\");\n            o.removeClass(this._root, \"error\");\n            o.removeClass(this._root, \"notice\");\n            p.empty(this._message);\n        },\n        _render: function() {\n            this._clear();\n            if (i.shouldShow()) {\n                if (n.hasBlackbirdEnabled()) {\n                    var ca = ((n.isOnline() ? \"blackbird\" : \"upsell\"));\n                    o.addClass(this._root, ca);\n                    this._renderBlackbird(r.getVisibility());\n                }\n                 else if (!n.isOnline()) {\n                    o.addClass(this._root, \"upsell\");\n                    this._renderBlackbirdUpsell();\n                }\n                \n            ;\n            ;\n            }\n             else if (!n.isOnline()) {\n                o.addClass(this._root, \"offline\");\n                this._renderOffline();\n            }\n             else if (j.disconnected()) {\n                o.addClass(this._root, \"error\");\n                this._renderChannelDisconnect();\n            }\n             else if (!l.notifiesUserMessages()) {\n                o.addClass(this._root, \"notice\");\n                p.setContent(this._message, \"Alerts are off while you use another client to chat.\");\n            }\n            \n            \n            \n        ;\n        ;\n            this.inform(\"updated\");\n        }\n    });\n    e.exports = ba;\n});\n__d(\"FBDesktopPlugin\", [\"CacheStorage\",\"DOM\",\"Env\",\"FBDesktopDetect\",\"URI\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"CacheStorage\"), h = b(\"DOM\"), i = b(\"Env\"), j = b(\"FBDesktopDetect\"), k = b(\"URI\"), l = b(\"Style\"), m = new g(\"localstorage\", \"_socialfox_\"), n = {\n        _plugin: \"_not_checked\",\n        arbiterInform: function(o, p) {\n            var q = JSON.stringify({\n                JSBNG__name: o,\n                payload: p\n            });\n            this._transmitCommand(\"arbiterinform\", q);\n        },\n        bringToFront: function() {\n            this._transmitCommand(\"bringtofront\");\n        },\n        dock: function() {\n            this._transmitCommand(\"dock\");\n        },\n        getPlugin: function() {\n            if (((this._plugin === \"_not_checked\"))) {\n                this._plugin = null;\n                if (j.isPluginInstalled()) {\n                    var o = h.create(\"object\", {\n                        id: \"kiwi_plugin\",\n                        type: j.mimeType\n                    });\n                    l.set(o, \"width\", 0);\n                    l.set(o, \"height\", 0);\n                    var p = h.create(\"div\", {\n                    }, o);\n                    l.set(p, \"width\", 0);\n                    l.set(p, \"height\", 0);\n                    JSBNG__document.body.appendChild(p);\n                    this._plugin = o;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return this._plugin;\n        },\n        getUserID: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"getUserID\" in o)))) && o.getUserID()));\n        },\n        getVersion: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"getVersion\" in o)))) && o.getVersion()));\n        },\n        isAppRunning: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"isAppRunning\" in o)))) && o.isAppRunning()));\n        },\n        launchApp: function() {\n            var o = this.getPlugin();\n            return ((((o && ((\"launchApp\" in o)))) && o.launchApp()));\n        },\n        login: function(o, p) {\n            if (((((p && o)) && ((o.length > 0))))) {\n                var q = this.getPlugin();\n                if (q) {\n                    this._transmitCommand(((((((\"relogin\\u000a\" + o)) + \"\\u000a\")) + p)));\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        logout: function(o) {\n            o = ((o || \"0\"));\n            var p = this.getPlugin();\n            if (p) {\n                p.logout(o);\n            }\n        ;\n        ;\n        },\n        recheck: function() {\n            if (((this._plugin === null))) {\n                this._plugin = \"_not_checked\";\n            }\n        ;\n        ;\n        },\n        shouldSuppressBeeper: function() {\n            return this.isAppRunning();\n        },\n        shouldSuppressMessages: function() {\n            if (((m && m.get(\"connected\")))) {\n                return true;\n            }\n        ;\n        ;\n            var o = this.getUserID();\n            if (o) {\n                return ((o === i.user));\n            }\n             else return this.isAppRunning()\n        ;\n        },\n        shouldSuppressSidebar: function() {\n            var o = this.getPlugin(), p = ((((o && ((\"isAppDocked\" in o)))) && o.isAppDocked())), q = ((m && ((m.get(\"active\") === \"true\"))));\n            return ((p || q));\n        },\n        transferAuthToken: function(o, p) {\n            if (((o && ((o.length > 0))))) {\n                var q = this.getPlugin();\n                if (q) {\n                    q.setAccessToken(o, p);\n                    var r = JSBNG__setInterval(function() {\n                        q.setAccessToken(o, p);\n                    }, 500);\n                    JSBNG__setTimeout(function() {\n                        JSBNG__clearInterval(r);\n                    }, ((10 * 1000)));\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            if (this.redirectHome) {\n                window.JSBNG__location.href = k().setPath().toString();\n            }\n        ;\n        ;\n        },\n        _transmitCommand: function(o, p) {\n            p = ((p || \"\"));\n            var q = this.getPlugin();\n            if (((q && ((\"transmitCommand\" in q))))) {\n                q.transmitCommand(o, p);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = n;\n});\n__d(\"ChatSidebar\", [\"ChatOrderedList\",\"ChatTypeaheadBehavior\",\"ChatTypeaheadCore\",\"ChatTypeaheadDataSource\",\"ChatTypeaheadRenderer\",\"ChatTypeaheadView\",\"Typeahead\",\"Arbiter\",\"ArbiterMixin\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConnection\",\"Chat\",\"ChatConfig\",\"ChatHovercard\",\"ChatImpressionLogger\",\"ChatOptions\",\"ChatSidebarSheet\",\"ChatVisibility\",\"JSBNG__CSS\",\"DOM\",\"DOMDimensions\",\"JSBNG__Event\",\"FBDesktopPlugin\",\"JSLogger\",\"JSXDOM\",\"KeyEventController\",\"OrderedFriendsList\",\"Parent\",\"PresencePrivacy\",\"ScrollableArea\",\"Style\",\"UserAgent\",\"ViewportBounds\",\"copyProperties\",\"createArrayFrom\",\"csx\",\"cx\",\"debounce\",\"emptyFunction\",\"fbt\",\"ge\",\"tx\",], function(a, b, c, d, e, f) {\n    b(\"ChatOrderedList\");\n    b(\"ChatTypeaheadBehavior\");\n    b(\"ChatTypeaheadCore\");\n    b(\"ChatTypeaheadDataSource\");\n    b(\"ChatTypeaheadRenderer\");\n    b(\"ChatTypeaheadView\");\n    b(\"Typeahead\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"AsyncRequest\"), j = b(\"AvailableList\"), k = b(\"AvailableListConstants\"), l = b(\"Bootloader\"), m = b(\"ChannelConnection\"), n = b(\"Chat\"), o = b(\"ChatConfig\"), p = b(\"ChatHovercard\"), q = b(\"ChatImpressionLogger\"), r = b(\"ChatOptions\"), s = b(\"ChatSidebarSheet\"), t = b(\"ChatVisibility\"), u = b(\"JSBNG__CSS\"), v = b(\"DOM\"), w = b(\"DOMDimensions\"), x = b(\"JSBNG__Event\"), y = b(\"FBDesktopPlugin\"), z = b(\"JSLogger\"), aa = b(\"JSXDOM\"), ba = b(\"KeyEventController\"), ca = b(\"OrderedFriendsList\"), da = b(\"Parent\"), ea = b(\"PresencePrivacy\"), fa = b(\"ScrollableArea\"), ga = b(\"Style\"), ha = b(\"UserAgent\"), ia = b(\"ViewportBounds\"), ja = b(\"copyProperties\"), ka = b(\"createArrayFrom\"), la = b(\"csx\"), ma = b(\"cx\"), na = b(\"debounce\"), oa = b(\"emptyFunction\"), pa = b(\"fbt\"), qa = b(\"ge\"), ra = b(\"tx\"), sa, ta = false, ua = false, va = false, wa = false, xa = false, ya = false, za, ab, bb, cb, db, eb = null, fb, gb, hb, ib, jb, kb, lb = 28, mb = 38, nb = z.create(\"chat_sidebar\");\n    function ob() {\n        if (gb) {\n            return;\n        }\n    ;\n    ;\n        u.removeClass(JSBNG__document.documentElement, \"sidebarMode\");\n        if (((!wa || !yb.isVisible()))) {\n            g.inform(\"reflow\");\n            return;\n        }\n    ;\n    ;\n        va = false;\n        eb = null;\n        za.hide();\n        cb.getCore().reset();\n        u.hide(ab);\n        nb.rate(\"sidebar_hide\", wa);\n        yb.inform(\"sidebar/hide\", yb);\n        g.inform(\"sidebar/hide\", yb);\n        g.inform(\"reflow\");\n    };\n;\n    function pb() {\n        var zb = yb.shouldShowSidebar();\n        u.conditionClass(JSBNG__document.documentElement, \"sidebarCapable\", zb);\n        if (((yb.isEnabled() && zb))) {\n            sb();\n            var ac;\n            if (fb) {\n                var bc = u.hasClass(ab, \"-cx-PRIVATE-litestandSidebarBookmarks__expanded\");\n                if (bc) {\n                    return;\n                }\n            ;\n            ;\n                kb = ((kb || v.JSBNG__find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\")));\n                if (fb.has_favorites_editing) {\n                    jb = ((jb || v.scry(ab, \".-cx-PRIVATE-litestandSidebarFavorites__sectionheader\")[0]));\n                }\n            ;\n            ;\n                ac = [kb,];\n            }\n             else ac = ka(ab.childNodes);\n        ;\n        ;\n            var cc = rb(ac), dc = ((za.getItemHeight() || 32)), ec = ((za.getPaddingOffset() || 8)), fc;\n            if (gb) {\n                if (gb.isExpanded()) {\n                    ec = ((ec + lb));\n                    if (((fb && fb.always_show_one_see_more))) {\n                        ec += dc;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (!n.isOnline()) {\n                    ec += mb;\n                }\n            ;\n            ;\n                var gc = Math.floor(((za.getItemPadding() / 2)));\n                fc = Math.floor(((((((cc - ec)) + gc)) / dc)));\n                if (!za.isVisible()) {\n                    ga.set(sa, \"height\", ((cc + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                fc = Math.floor(((((cc - ec)) / ((dc + 1)))));\n                ga.set(sa, \"height\", ((cc + \"px\")));\n            }\n        ;\n        ;\n            za.setNumTopFriends(fc);\n            var hc = Math.floor(((((cc - ec)) / dc)));\n            if (ub()) {\n                hc = ((((((hc - 2)) > 0)) ? ((hc - 2)) : 0));\n            }\n        ;\n        ;\n            cb.getData().setMaxResults(hc);\n            yb.inform(\"sidebar/resized\", yb);\n            g.inform(\"sidebar/resized\", yb);\n            g.inform(\"reflow\");\n        }\n         else ob();\n    ;\n    ;\n        if (!wa) {\n            wb();\n            wa = true;\n        }\n    ;\n    ;\n        eb = null;\n    };\n;\n    function qb() {\n        if (((cb && yb.isVisible()))) {\n            cb.getCore().getElement().JSBNG__focus();\n        }\n    ;\n    ;\n    };\n;\n    function rb(zb) {\n        if (!zb) {\n            if (fb) {\n                kb = ((kb || v.JSBNG__find(ab, \".-cx-PRIVATE-hasLitestandBookmarksSidebar__chatfooter\")));\n                zb = [kb,];\n            }\n             else zb = ka(ab.childNodes);\n        ;\n        }\n    ;\n    ;\n        var ac = db.height;\n        if (((gb && hb))) {\n            ac -= hb.getFullHeight();\n        }\n    ;\n    ;\n        zb.forEach(function(bc) {\n            if (((bc && ((bc !== sa))))) {\n                ac -= w.getElementDimensions(bc).height;\n            }\n        ;\n        ;\n        });\n        return Math.max(0, ac);\n    };\n;\n    function sb() {\n        if (yb.isVisible()) {\n            return;\n        }\n    ;\n    ;\n        va = true;\n        eb = null;\n        u.show(ab);\n        u.addClass(JSBNG__document.documentElement, \"sidebarMode\");\n        za.show();\n        nb.rate(\"sidebar_show\", wa);\n        yb.inform(\"sidebar/show\", yb);\n        g.inform(\"sidebar/show\", yb);\n        ((ib && xb()));\n    };\n;\n    function tb() {\n        r.setSetting(\"sidebar_mode\", yb.isEnabled(), \"JSBNG__sidebar\");\n        new i(\"/ajax/chat/settings.php\").setHandler(oa).setErrorHandler(oa).setData({\n            sidebar_mode: yb.isEnabled()\n        }).setAllowCrossPageTransition(true).send();\n    };\n;\n    function ub() {\n        return o.get(\"divebar_typeahead_group_fof\", 0);\n    };\n;\n    function vb() {\n        return ((ca.getList().length <= o.get(\"JSBNG__sidebar.min_friends\")));\n    };\n;\n    function wb() {\n        var zb = true;\n        if (!yb.isEnabled()) {\n            nb.log(\"state_not_enabled\");\n            zb = false;\n        }\n    ;\n    ;\n        if (!yb.isViewportCapable()) {\n            nb.log(\"state_not_shown_viewport\");\n            zb = false;\n        }\n    ;\n    ;\n        if (ua) {\n            nb.log(\"state_not_shown_hidden\");\n            zb = false;\n        }\n    ;\n    ;\n        if (vb()) {\n            nb.log(\"state_not_shown_num_friends\");\n            zb = false;\n        }\n    ;\n    ;\n        if (y.shouldSuppressSidebar()) {\n            nb.log(\"state_not_shown_fbdesktop\");\n            zb = false;\n        }\n    ;\n    ;\n        nb.log(((zb ? \"state_shown\" : \"state_not_shown\")));\n    };\n;\n    function xb() {\n        if (!yb.isVisible()) {\n            return;\n        }\n    ;\n    ;\n        var zb;\n        if (!t.isOnline()) {\n            zb = \"Offline\";\n        }\n         else if (m.disconnected()) {\n            zb = \"Connection Lost\";\n        }\n         else zb = ra._(\"{Chat} {number-available}\", {\n            Chat: \"Chat\",\n            \"number-available\": ((((\"(\" + j.getOnlineCount())) + \")\"))\n        });\n        \n    ;\n    ;\n        v.setContent(ib, zb);\n    };\n;\n    var yb = {\n        init: function(zb, ac, bc, cc) {\n            yb.init = oa;\n            xa = true;\n            ab = zb;\n            za = ac;\n            cb = bc;\n            bb = cc;\n            sa = v.JSBNG__find(zb, \"div.fbChatSidebarBody\");\n            gb = ((cc && cc.ls_module));\n            fb = ((cc && cc.ls_config));\n            if (gb) {\n                g.subscribe(\"ViewportSizeChange\", function() {\n                    g.inform(\"ChatOrderedList/itemHeightChange\");\n                    pb();\n                });\n                g.subscribe(\"Sidebar/BookmarksHeightChange\", pb);\n                l.loadModules([\"LitestandSidebarBookmarksDisplay\",], function(ec) {\n                    hb = ec;\n                });\n            }\n             else x.listen(window, \"resize\", pb);\n        ;\n        ;\n            ba.registerKey(\"q\", function() {\n                var ec = null;\n                if (kb) {\n                    ec = v.scry(kb, \".inputsearch\")[0];\n                }\n                 else ec = v.scry(zb, \".inputsearch\")[0];\n            ;\n            ;\n                if (ec) {\n                    ec.JSBNG__focus();\n                    return false;\n                }\n            ;\n            ;\n            });\n            new p(ac);\n            var dc = new s(zb);\n            dc.subscribe(\"updated\", pb);\n            g.subscribe(\"sidebar/invalidate\", pb);\n            ac.setScrollContainer(da.byClass(ac.getRoot(), \"uiScrollableAreaWrap\"));\n            ac.subscribe([\"render\",\"show\",\"hide\",], na(function(ec) {\n                if (((((ec === \"render\")) && !ya))) {\n                    ya = true;\n                    yb.inform(\"sidebar/chatRendered\", null, g.BEHAVIOR_PERSISTENT);\n                }\n            ;\n            ;\n                var fc = ac.getRoot(), gc = fa.getInstance(fc);\n                ((gc && gc.adjustGripper()));\n            }));\n            ac.subscribe([\"editStart\",\"editEnd\",], function(ec) {\n                u.conditionClass(cb.getView().element, \"-cx-PUBLIC-fbChatOrderedList__editfavoritemode\", ((ec == \"editStart\")));\n            });\n            if (((ha.firefox() >= 17))) {\n                x.listen(window, \"storage\", function(ec) {\n                    if (((((ec.key == \"_socialfox_active\")) && ((ec.oldValue != ec.newValue))))) {\n                        pb();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            g.subscribe(\"chat/option-changed\", function(ec, fc) {\n                if (((fc.JSBNG__name == \"sidebar_mode\"))) {\n                    ta = !!r.getSetting(\"sidebar_mode\");\n                    pb();\n                }\n            ;\n            ;\n            });\n            bc.getCore().subscribe(\"sidebar/typeahead/active\", yb.updateOnActiveTypeahead);\n            bc.subscribe(\"reset\", function() {\n                if (((!bc.getCore().getValue() && !za.isVisible()))) {\n                    yb.updateOnActiveTypeahead(null, false);\n                }\n            ;\n            ;\n            });\n            if (gb) {\n                bc.getCore().subscribe(\"sidebar/typeahead/preActive\", function(ec, fc) {\n                    if (((ta && cb.getView().isVisible()))) {\n                        g.inform(ec, fc);\n                    }\n                     else pb();\n                ;\n                ;\n                });\n            }\n             else g.subscribe(\"buddylist-nub/initialized\", function(ec, fc) {\n                x.listen(fc.getButton(), \"click\", function(JSBNG__event) {\n                    yb.enable();\n                    return !yb.shouldShowSidebar();\n                });\n            });\n        ;\n        ;\n            ta = !!r.getSetting(\"sidebar_mode\");\n            ((ha.ie() && x.listen(zb, \"click\", function(ec) {\n                if (da.byClass(ec.getTarget(), \"-cx-PRIVATE-fbLitestandChatTypeahead__root\")) {\n                    qb();\n                }\n            ;\n            ;\n            })));\n            ea.subscribe(\"privacy-user-presence-changed\", pb);\n            pb();\n            q.init(za);\n            if (!gb) {\n                ia.addRight(yb.getVisibleWidth);\n            }\n        ;\n        ;\n            yb.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            g.inform(\"sidebar/initialized\", yb, g.BEHAVIOR_PERSISTENT);\n            if (o.get(\"litestand_blended_sidebar\")) {\n                ib = v.JSBNG__find(zb, \".-cx-PRIVATE-litestandBlendedSidebar__headertext\");\n                j.subscribe(k.ON_AVAILABILITY_CHANGED, na(xb, 2000));\n                m.subscribe([m.CONNECTED,m.RECONNECTING,m.SHUTDOWN,], xb);\n                ea.subscribe(\"privacy-changed\", xb);\n                xb();\n            }\n        ;\n        ;\n        },\n        updateOnActiveTypeahead: function(zb, ac) {\n            if (!va) {\n                return;\n            }\n        ;\n        ;\n            if (ac) {\n                za.hide();\n                if (gb) {\n                    u.addClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    var bc = rb();\n                    if (jb) {\n                        bc += w.getElementDimensions(jb).height;\n                    }\n                ;\n                ;\n                    ga.set(sa, \"height\", ((bc + \"px\")));\n                }\n            ;\n            ;\n            }\n             else {\n                za.show();\n                if (gb) {\n                    ga.set(sa, \"height\", \"auto\");\n                    u.removeClass(ab, \"-cx-PRIVATE-fbChatTypeahead__active\");\n                    g.inform(\"sidebar/typeahead/active\", false);\n                    pb();\n                }\n                 else pb();\n            ;\n            ;\n            }\n        ;\n        ;\n        },\n        isInitialized: function() {\n            return wa;\n        },\n        disable: function() {\n            if (!yb.isEnabled()) {\n                return;\n            }\n        ;\n        ;\n            ta = false;\n            tb();\n            ob();\n        },\n        enable: function() {\n            if (yb.isEnabled()) {\n                return;\n            }\n        ;\n        ;\n            ta = true;\n            tb();\n            pb();\n            qb.defer();\n        },\n        forceEnsureLoaded: function() {\n            if (xa) {\n                return;\n            }\n        ;\n        ;\n            if (qa(\"pagelet_sidebar\")) {\n                return;\n            }\n        ;\n        ;\n            d([\"UIPagelet\",], function(zb) {\n                var ac = aa.div({\n                    id: \"pagelet_sidebar\"\n                });\n                v.appendContent(JSBNG__document.body, ac);\n                zb.loadFromEndpoint(\"SidebarPagelet\", \"pagelet_sidebar\");\n            });\n            xa = true;\n        },\n        ensureLoaded: function() {\n            if (!ta) {\n                return;\n            }\n        ;\n        ;\n            yb.forceEnsureLoaded();\n        },\n        hide: function() {\n            if (ua) {\n                return;\n            }\n        ;\n        ;\n            ua = true;\n            ob();\n        },\n        unhide: function() {\n            if (!ua) {\n                return;\n            }\n        ;\n        ;\n            ua = false;\n            pb();\n        },\n        getBody: function() {\n            return sa;\n        },\n        getRoot: function() {\n            return ab;\n        },\n        getVisibleWidth: function() {\n            if (((!va || !ab))) {\n                return 0;\n            }\n        ;\n        ;\n            if (((eb === null))) {\n                eb = ab.offsetWidth;\n            }\n        ;\n        ;\n            return eb;\n        },\n        isEnabled: function() {\n            return ta;\n        },\n        isViewportCapable: function() {\n            db = w.getViewportWithoutScrollbarDimensions();\n            if (gb) {\n                return true;\n            }\n        ;\n        ;\n            var zb = o.get(\"JSBNG__sidebar.minimum_width\");\n            return ((db.width > zb));\n        },\n        shouldShowSidebar: function() {\n            var zb = yb.isViewportCapable();\n            return ((gb || ((((((zb && !ua)) && ((!vb() || o.get(\"litestand_blended_sidebar\", false))))) && !y.shouldSuppressSidebar()))));\n        },\n        isVisible: function() {\n            return va;\n        },\n        resize: pb,\n        toggle: function() {\n            if (gb) {\n                gb.toggle();\n            }\n             else ((yb.isEnabled() ? yb.disable() : yb.enable()));\n        ;\n        ;\n        },\n        isLitestandSidebar: function() {\n            return !!gb;\n        }\n    };\n    ja(yb, h);\n    e.exports = yb;\n});\n__d(\"DropdownContextualHelpLink\", [\"DOM\",\"ge\",], function(a, b, c, d, e, f) {\n    var g = b(\"DOM\"), h = b(\"ge\"), i = {\n        set: function(j) {\n            var k = h(\"navHelpCenter\");\n            if (((k !== null))) {\n                g.replace(k, j);\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"ChatActivity\", [\"JSBNG__Event\",\"Arbiter\",\"AvailableList\",\"AvailableListConstants\",\"JSLogger\",\"MercuryConfig\",\"PresenceState\",\"UserActivity\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"Arbiter\"), i = b(\"AvailableList\"), j = b(\"AvailableListConstants\"), k = b(\"JSLogger\"), l = b(\"MercuryConfig\"), m = b(\"PresenceState\"), n = b(\"UserActivity\"), o = b(\"copyProperties\"), p = ((l.activity_limit || 60000)), q = ((l.idle_limit || 1800000)), r = ((l.idle_poll_interval || 300000)), s = k.create(\"chat_activity\"), t = JSBNG__Date.now(), u = t, v = true;\n    function w() {\n        var aa = JSBNG__Date.now();\n        return !!((v && ((((aa - t)) < p))));\n    };\n;\n    var x = o(new h(), {\n        isActive: w\n    });\n    function y() {\n        var aa = t;\n        t = JSBNG__Date.now();\n        if (((((t - aa)) > q))) {\n            s.debug(\"idle_to_active\", aa);\n            m.doSync();\n        }\n    ;\n    ;\n        x.inform(\"activity\");\n    };\n;\n    i.subscribe(j.ON_AVAILABILITY_CHANGED, function() {\n        if (!i.isUserIdle()) {\n            u = JSBNG__Date.now();\n        }\n    ;\n    ;\n    });\n    g.listen(window, \"JSBNG__focus\", function() {\n        v = true;\n        y();\n    });\n    g.listen(window, \"JSBNG__blur\", function() {\n        v = false;\n    });\n    n.subscribe(function() {\n        y();\n    });\n    function z(aa) {\n        var ba = ((((aa && aa.at)) && m.verifyNumber(aa.at)));\n        if (((typeof ba !== \"number\"))) {\n            ba = null;\n        }\n    ;\n    ;\n        return ((ba || 0));\n    };\n;\n    JSBNG__setInterval(function() {\n        var aa = JSBNG__Date.now(), ba = z(m.get()), ca = Math.max(t, ba, u);\n        if (((((aa - ca)) > q))) {\n            s.debug(\"idle\", {\n                cookie: ba,\n                local: t,\n                presence: u\n            });\n            x.inform(\"idle\", ((aa - ca)));\n        }\n    ;\n    ;\n    }, r);\n    m.registerStateStorer(function(aa) {\n        var ba = z(aa);\n        if (((ba < t))) {\n            aa.at = t;\n        }\n    ;\n    ;\n        return aa;\n    });\n    h.subscribe(k.DUMP_EVENT, function(aa, ba) {\n        ba.chat_activity = {\n            activity_limit: p,\n            idle_limit: q,\n            idle_poll_interval: r,\n            last_active_time: t,\n            last_global_active_time: u\n        };\n    });\n    e.exports = x;\n});\n__d(\"MercuryNotificationRenderer\", [\"MercuryAssert\",\"MercuryMessages\",\"MercuryParticipants\",\"MercuryThreads\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryAssert\"), h = b(\"MercuryMessages\").get(), i = b(\"MercuryParticipants\"), j = b(\"MercuryThreads\").get(), k = b(\"tx\");\n    function l(m, n) {\n        g.isThreadID(m);\n        j.getThreadMeta(m, function(o) {\n            h.getThreadMessagesRange(m, 0, 1, function(p) {\n                var q = ((p.length && p[((p.length - 1))]));\n                if (((q && ((q.author != i.user))))) {\n                    i.get(q.author, function(r) {\n                        if (o.JSBNG__name) {\n                            n(k._(\"{senderName} messaged {groupName}\", {\n                                senderName: r.short_name,\n                                groupName: o.JSBNG__name\n                            }));\n                        }\n                         else n(k._(\"{name} messaged you\", {\n                            JSBNG__name: r.short_name\n                        }));\n                    ;\n                    ;\n                    });\n                }\n                 else n(\"New message!\");\n            ;\n            ;\n            });\n        });\n    };\n;\n    e.exports = {\n        renderDocumentTitle: l\n    };\n});\n__d(\"MercuryTimestampTracker\", [\"MercuryActionTypeConstants\",\"MercuryPayloadSource\",\"MercurySingletonMixin\",\"MercuryServerRequests\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryActionTypeConstants\"), h = b(\"MercuryPayloadSource\"), i = b(\"MercurySingletonMixin\"), j = b(\"MercuryServerRequests\"), k = b(\"copyProperties\");\n    function l(m) {\n        this._fbid = m;\n        this._serverRequests = j.getForFBID(this._fbid);\n        this._lastTimestamp = 0;\n        this._serverRequests.subscribe(\"update-messages\", function(n, o) {\n            if (((!o.actions || !o.actions.length))) {\n                return;\n            }\n        ;\n        ;\n            if (((((o.payload_source == h.CLIENT_SEND_MESSAGE)) || ((o.payload_source == h.UNKNOWN))))) {\n                return;\n            }\n        ;\n        ;\n            for (var p = 0; ((p < o.actions.length)); p++) {\n                var q = o.actions[p], r = q.action_type;\n                if (((((((r == g.USER_GENERATED_MESSAGE)) && q.thread_id)) && ((q.timestamp > this._lastTimestamp))))) {\n                    this._lastTimestamp = q.timestamp;\n                }\n            ;\n            ;\n            };\n        ;\n        }.bind(this));\n    };\n;\n    k(l.prototype, {\n        getLastUserMessageTimestamp: function() {\n            return this._lastTimestamp;\n        }\n    });\n    k(l, i);\n    e.exports = l;\n});\n__d(\"ChatTitleBarBlinker\", [\"ChatActivity\",\"DocumentTitle\",\"JSLogger\",\"MercuryThreadInformer\",\"MercuryNotificationRenderer\",\"PresenceState\",\"MercuryTimestampTracker\",], function(a, b, c, d, e, f) {\n    var g = b(\"ChatActivity\"), h = b(\"DocumentTitle\"), i = b(\"JSLogger\"), j = b(\"MercuryThreadInformer\").get(), k = b(\"MercuryNotificationRenderer\"), l = b(\"PresenceState\"), m = b(\"MercuryTimestampTracker\").get(), n = i.create(\"chat_title\"), o = null, p = 0, q = false;\n    function r() {\n        if (o) {\n            o.JSBNG__stop();\n            o = null;\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function s(x) {\n        var y = ((x || m.getLastUserMessageTimestamp()));\n        if (((p <= y))) {\n            p = y;\n            if (((r() || q))) {\n                l.doSync();\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var t = {\n        blink: function(x, y) {\n            if (((!o && ((p < y))))) {\n                k.renderDocumentTitle(x, function(z) {\n                    if (!o) {\n                        o = h.blink(z);\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n        },\n        stopBlinking: function() {\n            s();\n        },\n        blinkingElsewhere: function() {\n            q = true;\n        }\n    };\n    function u(x) {\n        var y = l.verifyNumber(x.sb2);\n        if (((!y || ((y <= p))))) {\n            return null;\n        }\n    ;\n    ;\n        return y;\n    };\n;\n    function v(x) {\n        var y = ((x && u(x)));\n        if (y) {\n            p = y;\n            n.debug(\"load\", p);\n            r();\n            q = false;\n        }\n    ;\n    ;\n    };\n;\n    function w(x) {\n        var y = u(x);\n        if (!y) {\n            n.debug(\"store\", p);\n            x.sb2 = p;\n            q = false;\n        }\n    ;\n    ;\n        return x;\n    };\n;\n    l.registerStateStorer(w);\n    l.registerStateLoader(v);\n    j.subscribe(\"thread-read-changed\", function(x, y) {\n        var z = m.getLastUserMessageTimestamp(), aa = 0;\n        {\n            var fin318keys = ((window.top.JSBNG_Replay.forInKeys)((y))), fin318i = (0);\n            var ba;\n            for (; (fin318i < fin318keys.length); (fin318i++)) {\n                ((ba) = (fin318keys[fin318i]));\n                {\n                    if (((((y[ba].mark_as_read && ((y[ba].timestamp >= z)))) && ((y[ba].timestamp > aa))))) {\n                        aa = y[ba].timestamp;\n                    }\n                ;\n                ;\n                };\n            };\n        };\n    ;\n        ((aa && s(aa)));\n    });\n    g.subscribe(\"activity\", function() {\n        s();\n    });\n    (function() {\n        var x = l.getInitial();\n        if (x) {\n            p = ((u(x) || 0));\n        }\n    ;\n    ;\n    })();\n    e.exports = t;\n});\n__d(\"swfobject\", [\"AsyncRequest\",\"Bootloader\",\"ControlledReferer\",\"copyProperties\",\"JSBNG__CSS\",\"DOM\",\"function-extensions\",\"ge\",\"htmlSpecialChars\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Bootloader\"), i = b(\"ControlledReferer\"), j = b(\"copyProperties\"), k = b(\"JSBNG__CSS\"), l = b(\"DOM\");\n    b(\"function-extensions\");\n    var m = b(\"ge\"), n = b(\"htmlSpecialChars\");\n    if (((typeof o == \"undefined\"))) {\n        var o = {\n        };\n    }\n;\n;\n    if (((typeof o.util == \"undefined\"))) {\n        o.util = {\n        };\n    }\n;\n;\n    if (((typeof o.SWFObjectUtil == \"undefined\"))) {\n        o.SWFObjectUtil = {\n        };\n    }\n;\n;\n    o.SWFObject = function(u, v, w, x, y, z, aa, ba, ca, da) {\n        if (!JSBNG__document.getElementById) {\n            return;\n        }\n    ;\n    ;\n        this.DETECT_KEY = ((da ? da : \"detectflash\"));\n        this.skipDetect = o.util.getRequestParameter(this.DETECT_KEY);\n        this.params = {\n        };\n        this.variables = {\n        };\n        this.attributes = [];\n        this.fallback_html = \"\";\n        this.fallback_js_fcn = function() {\n        \n        };\n        if (u) {\n            this.setAttribute(\"swf\", u);\n        }\n    ;\n    ;\n        if (v) {\n            this.setAttribute(\"id\", v);\n        }\n    ;\n    ;\n        if (w) {\n            this.setAttribute(\"width\", w);\n        }\n    ;\n    ;\n        if (x) {\n            this.setAttribute(\"height\", x);\n        }\n    ;\n    ;\n        this.installedVer = o.SWFObjectUtil.getPlayerVersion();\n        if (y) {\n            if (!((y instanceof Array))) {\n                y = [y,];\n            }\n        ;\n        ;\n            var ea;\n            y.forEach(function(ha) {\n                ea = new o.PlayerVersion(ha.toString().split(\".\"));\n                if (((ea.major == this.installedVer.major))) {\n                    this.setAttribute(\"version\", ea);\n                    return;\n                }\n                 else if (((!this.getAttribute(\"version\") || ((ea.major < this.getAttribute(\"version\").major))))) {\n                    this.setAttribute(\"version\", ea);\n                }\n                \n            ;\n            ;\n            }.bind(this));\n        }\n    ;\n    ;\n        if (((((!window.JSBNG__opera && JSBNG__document.all)) && ((this.installedVer.major > 7))))) {\n            if (!o.unloadSet) {\n                o.SWFObjectUtil.prepUnload = function() {\n                    var ha = function() {\n                    \n                    }, ia = function() {\n                    \n                    };\n                    window.JSBNG__attachEvent(\"JSBNG__onunload\", o.SWFObjectUtil.cleanupSWFs);\n                };\n                window.JSBNG__attachEvent(\"JSBNG__onbeforeunload\", o.SWFObjectUtil.prepUnload);\n                o.unloadSet = true;\n            }\n        ;\n        }\n    ;\n    ;\n        if (z) {\n            this.addParam(\"bgcolor\", z);\n        }\n    ;\n    ;\n        var fa = ((aa ? aa : \"high\"));\n        this.addParam(\"quality\", fa);\n        this.setAttribute(\"useExpressInstall\", false);\n        this.setAttribute(\"doExpressInstall\", false);\n        var ga = (((ba) ? ba : window.JSBNG__location));\n        this.setAttribute(\"xiRedirectUrl\", ga);\n        this.setAttribute(\"redirectUrl\", \"\");\n        if (ca) {\n            this.setAttribute(\"redirectUrl\", ca);\n        }\n    ;\n    ;\n        this.setAttribute(\"useIframe\", false);\n    };\n    o.SWFObject.ieWorkaroundApplied = false;\n    o.SWFObject.ensureIEWorkaroundAttached = function() {\n        if (((!o.SWFObject.ieWorkaroundApplied && JSBNG__document.JSBNG__attachEvent))) {\n            o.SWFObject.ieWorkaroundApplied = true;\n            JSBNG__document.JSBNG__attachEvent(\"onpropertychange\", o.SWFObject.onDocumentPropertyChange);\n        }\n    ;\n    ;\n    };\n    o.SWFObject.onDocumentPropertyChange = function(JSBNG__event) {\n        if (((JSBNG__event.propertyName == \"title\"))) {\n            var u = JSBNG__document.title;\n            if (((((u != null)) && ((u.indexOf(\"#!\") != -1))))) {\n                u = u.substring(0, u.indexOf(\"#!\"));\n                JSBNG__document.title = u;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n    j(o.SWFObject.prototype, {\n        useExpressInstall: function(u) {\n            this.xiSWFPath = ((!u ? \"/swf/expressinstall.swf\" : u));\n            this.setAttribute(\"useExpressInstall\", true);\n        },\n        setAttribute: function(u, v) {\n            this.attributes[u] = v;\n        },\n        getAttribute: function(u) {\n            return ((this.attributes[u] || \"\"));\n        },\n        addParam: function(u, v) {\n            this.params[u] = v;\n        },\n        getParams: function() {\n            return this.params;\n        },\n        addVariable: function(u, v) {\n            this.variables[u] = v;\n        },\n        getVariable: function(u) {\n            return ((this.variables[u] || \"\"));\n        },\n        getVariables: function() {\n            return this.variables;\n        },\n        getVariablePairs: function() {\n            var u = [], v, w = this.getVariables();\n            {\n                var fin319keys = ((window.top.JSBNG_Replay.forInKeys)((w))), fin319i = (0);\n                (0);\n                for (; (fin319i < fin319keys.length); (fin319i++)) {\n                    ((v) = (fin319keys[fin319i]));\n                    {\n                        u[u.length] = ((((v + \"=\")) + w[v]));\n                    ;\n                    };\n                };\n            };\n        ;\n            return u.join(\"&\");\n        },\n        getSWFHTML: function() {\n            var u, v, w;\n            if (((((JSBNG__navigator.plugins && JSBNG__navigator.mimeTypes)) && JSBNG__navigator.mimeTypes.length))) {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"PlugIn\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n            ;\n                v = {\n                    type: \"application/x-shockwave-flash\",\n                    src: this.getAttribute(\"swf\"),\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: ((this.getAttribute(\"style\") || \"display: block;\")),\n                    id: this.getAttribute(\"id\"),\n                    JSBNG__name: this.getAttribute(\"id\")\n                };\n                var x = this.getParams();\n                {\n                    var fin320keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin320i = (0);\n                    var y;\n                    for (; (fin320i < fin320keys.length); (fin320i++)) {\n                        ((y) = (fin320keys[fin320i]));\n                        {\n                            v[y] = x[y];\n                        ;\n                        };\n                    };\n                };\n            ;\n                w = this.getVariablePairs();\n                if (w) {\n                    v.flashvars = w;\n                }\n            ;\n            ;\n                u = t(\"embed\", v, null);\n            }\n             else {\n                if (this.getAttribute(\"doExpressInstall\")) {\n                    this.addVariable(\"MMplayerType\", \"ActiveX\");\n                    this.setAttribute(\"swf\", this.xiSWFPath);\n                }\n            ;\n            ;\n                v = {\n                    id: this.getAttribute(\"id\"),\n                    classid: \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n                    width: this.getAttribute(\"width\"),\n                    height: this.getAttribute(\"height\"),\n                    style: ((this.getAttribute(\"style\") || \"display: block;\"))\n                };\n                var z = t(\"param\", {\n                    JSBNG__name: \"movie\",\n                    value: this.getAttribute(\"swf\")\n                }, null), x = this.getParams();\n                {\n                    var fin321keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin321i = (0);\n                    var y;\n                    for (; (fin321i < fin321keys.length); (fin321i++)) {\n                        ((y) = (fin321keys[fin321i]));\n                        {\n                            z += t(\"param\", {\n                                JSBNG__name: y,\n                                value: x[y]\n                            }, null);\n                        ;\n                        };\n                    };\n                };\n            ;\n                w = this.getVariablePairs();\n                if (w) {\n                    z += t(\"param\", {\n                        JSBNG__name: \"flashvars\",\n                        value: w\n                    }, null);\n                }\n            ;\n            ;\n                u = t(\"object\", v, z);\n            }\n        ;\n        ;\n            return u;\n        },\n        write: function(u) {\n            if (this.getAttribute(\"useExpressInstall\")) {\n                var v = new o.PlayerVersion([6,0,65,]);\n                if (((this.installedVer.versionIsValid(v) && !this.installedVer.versionIsValid(this.getAttribute(\"version\"))))) {\n                    this.setAttribute(\"doExpressInstall\", true);\n                    this.addVariable(\"MMredirectURL\", escape(this.getAttribute(\"xiRedirectUrl\")));\n                    JSBNG__document.title = ((JSBNG__document.title.slice(0, 47) + \" - Flash Player Installation\"));\n                    this.addVariable(\"MMdoctitle\", JSBNG__document.title);\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var w = ((((typeof u == \"string\")) ? JSBNG__document.getElementById(u) : u));\n            if (!w) {\n                return false;\n            }\n        ;\n        ;\n            k.addClass(w, \"swfObject\");\n            w.setAttribute(\"data-swfid\", this.getAttribute(\"id\"));\n            if (((((this.skipDetect || this.getAttribute(\"doExpressInstall\"))) || this.installedVer.versionIsValid(this.getAttribute(\"version\"))))) {\n                if (!this.getAttribute(\"useIframe\")) {\n                    o.SWFObject.ensureIEWorkaroundAttached();\n                    w.innerHTML = this.getSWFHTML();\n                }\n                 else this._createIframe(w);\n            ;\n            ;\n                return true;\n            }\n             else {\n                if (((this.getAttribute(\"redirectUrl\") != \"\"))) {\n                    JSBNG__document.JSBNG__location.replace(this.getAttribute(\"redirectUrl\"));\n                }\n            ;\n            ;\n                var x = ((((((((((((this.getAttribute(\"version\").major + \".\")) + this.getAttribute(\"version\").minor)) + \".\")) + this.getAttribute(\"version\").release)) + \".\")) + this.getAttribute(\"version\").build)), y = ((((((((((((this.installedVer.major + \".\")) + this.installedVer.minor)) + \".\")) + this.installedVer.release)) + \".\")) + this.installedVer.build));\n                this.fallback_js_fcn(y, x);\n                w.innerHTML = this.fallback_html;\n            }\n        ;\n        ;\n            return false;\n        },\n        _createIframe: function(u) {\n            var v = l.create(\"div\", {\n                width: this.getAttribute(\"width\"),\n                height: this.getAttribute(\"height\"),\n                frameBorder: 0\n            });\n            l.empty(u);\n            u.appendChild(v);\n            i.useFacebookRefererHtml(v, this.getSWFHTML(), this.getAttribute(\"iframeSource\"));\n        }\n    });\n    o.SWFObjectUtil.getPlayerVersion = function() {\n        var u = new o.PlayerVersion([0,0,0,0,]), v;\n        if (((JSBNG__navigator.plugins && JSBNG__navigator.mimeTypes.length))) {\n            for (var w = 0; ((w < JSBNG__navigator.plugins.length)); w++) {\n                try {\n                    var y = JSBNG__navigator.plugins[w];\n                    if (((y.JSBNG__name == \"Shockwave Flash\"))) {\n                        v = new o.PlayerVersion(y.description.replace(/([a-zA-Z]|\\s)+/, \"\").replace(/(\\s+(r|d)|\\s+b[0-9]+)/, \".\").split(\".\"));\n                        if (((((((typeof u == \"undefined\")) || ((v.major > u.major)))) || ((((v.major == u.major)) && ((((v.minor > u.minor)) || ((((v.minor == u.minor)) && ((((v.release > u.release)) || ((((v.release == u.release)) && ((v.build > u.build))))))))))))))) {\n                            u = v;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (x) {\n                \n                };\n            ;\n            };\n        ;\n        }\n         else if (((JSBNG__navigator.userAgent && ((JSBNG__navigator.userAgent.indexOf(\"Windows CE\") >= 0))))) {\n            var z = 1, aa = 3;\n            while (z) {\n                try {\n                    aa++;\n                    z = new ActiveXObject(((\"ShockwaveFlash.ShockwaveFlash.\" + aa)));\n                    u = new o.PlayerVersion([aa,0,0,]);\n                } catch (ba) {\n                    z = null;\n                };\n            ;\n            };\n        ;\n        }\n         else {\n            try {\n                var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n            } catch (ca) {\n                try {\n                    var z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n                    u = new o.PlayerVersion([6,0,21,]);\n                    z.AllowScriptAccess = \"always\";\n                } catch (da) {\n                    if (((u.major == 6))) {\n                        return u;\n                    }\n                ;\n                ;\n                };\n            ;\n                try {\n                    z = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n                } catch (ea) {\n                \n                };\n            ;\n            };\n        ;\n            if (((z != null))) {\n                u = new o.PlayerVersion(z.GetVariable(\"$version\").split(\" \")[1].split(\",\"));\n            }\n        ;\n        ;\n        }\n        \n    ;\n    ;\n        return u;\n    };\n    o.PlayerVersion = function(u) {\n        this.major = ((((u[0] != null)) ? parseInt(u[0], 10) : 0));\n        this.minor = ((((u[1] != null)) ? parseInt(u[1], 10) : 0));\n        this.release = ((((u[2] != null)) ? parseInt(u[2], 10) : 0));\n        this.build = ((((u[3] != null)) ? parseInt(u[3], 10) : 0));\n    };\n    o.PlayerVersion.prototype.versionIsValid = function(u) {\n        if (((this.major < u.major))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.major > u.major))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.minor < u.minor))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.minor > u.minor))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.release < u.release))) {\n            return false;\n        }\n    ;\n    ;\n        if (((this.release > u.release))) {\n            return true;\n        }\n    ;\n    ;\n        if (((this.build < u.build))) {\n            return false;\n        }\n    ;\n    ;\n        return true;\n    };\n    o.util = {\n        getRequestParameter: function(u) {\n            var v = ((JSBNG__document.JSBNG__location.search || JSBNG__document.JSBNG__location.hash));\n            if (((u == null))) {\n                return v;\n            }\n        ;\n        ;\n            if (v) {\n                var w = v.substring(1).split(\"&\");\n                for (var x = 0; ((x < w.length)); x++) {\n                    if (((w[x].substring(0, w[x].indexOf(\"=\")) == u))) {\n                        return w[x].substring(((w[x].indexOf(\"=\") + 1)));\n                    }\n                ;\n                ;\n                };\n            ;\n            }\n        ;\n        ;\n            return \"\";\n        }\n    };\n    o.SWFObjectUtil.cleanupSWFs = function() {\n        var u = JSBNG__document.getElementsByTagName(\"OBJECT\");\n        for (var v = ((u.length - 1)); ((v >= 0)); v--) {\n            u[v].style.display = \"none\";\n            {\n                var fin322keys = ((window.top.JSBNG_Replay.forInKeys)((u[v]))), fin322i = (0);\n                var w;\n                for (; (fin322i < fin322keys.length); (fin322i++)) {\n                    ((w) = (fin322keys[fin322i]));\n                    {\n                        if (((typeof u[v][w] == \"function\"))) {\n                            u[v][w] = function() {\n                            \n                            };\n                        }\n                    ;\n                    ;\n                    };\n                };\n            };\n        ;\n        };\n    ;\n    };\n    if (((!JSBNG__document.getElementById && JSBNG__document.all))) {\n        JSBNG__document.getElementById = function(u) {\n            return JSBNG__document.all[u];\n        };\n    }\n;\n;\n    var p = o.util.getRequestParameter, q = o.SWFObject, r = o.SWFObject;\n    o.spawn_flash_update_dialog = function() {\n        new g().setURI(\"/ajax/flash_update_dialog.php\").setMethod(\"GET\").setReadOnly(true).send();\n    };\n    function s(u, v) {\n        var w = m(u), x = o.SWFObjectUtil.getPlayerVersion(), y;\n        v.forEach(function(ba) {\n            ba = new o.PlayerVersion(ba.toString().split(\".\"));\n            if (((ba.major == x.major))) {\n                y = ba;\n                return;\n            }\n             else if (((((typeof y == \"undefined\")) || ((ba.major < y.major))))) {\n                y = ba;\n            }\n            \n        ;\n        ;\n        }.bind(this));\n        if (((w && ((x.major > 0))))) {\n            var z = ((((((((((((x.major + \".\")) + x.minor)) + \".\")) + x.release)) + \".\")) + x.build)), aa = ((((((((((((y.major + \".\")) + y.minor)) + \".\")) + y.release)) + \".\")) + y.build));\n            l.setContent(w, l.tx._(\"Flash {required-version} is required to view this content. Your current version is {current-version}. Please download the latest Flash Player.\", {\n                \"required-version\": aa,\n                \"current-version\": z\n            }));\n        }\n    ;\n    ;\n    };\n;\n    o.showFlashErrorDialog = function(u, v) {\n        h.loadModules([\"ErrorDialog\",], function(w) {\n            w.show(u, v);\n        });\n    };\n    function t(u, v, w) {\n        var x = /^[A-Za-z0-9\\-]+$/;\n        if (!u.match(x)) {\n            throw new Error(((\"Invalid tag \" + u)));\n        }\n    ;\n    ;\n        var y = ((\"\\u003C\" + u));\n        {\n            var fin323keys = ((window.top.JSBNG_Replay.forInKeys)((v))), fin323i = (0);\n            var z;\n            for (; (fin323i < fin323keys.length); (fin323i++)) {\n                ((z) = (fin323keys[fin323i]));\n                {\n                    if (!z.match(x)) {\n                        throw new Error(((\"Invalid attr \" + z)));\n                    }\n                ;\n                ;\n                    y += ((((((((\" \" + z)) + \"=\\\"\")) + n(v[z]))) + \"\\\"\"));\n                };\n            };\n        };\n    ;\n        if (((w === null))) {\n            return ((y + \"/\\u003E\"));\n        }\n         else return ((((((((((y + \"\\u003E\")) + w)) + \"\\u003C/\")) + u)) + \"\\u003E\"))\n    ;\n    };\n;\n    e.exports = ((a.deconcept || o));\n});\n__d(\"swfobject2\", [], function(a, b, c, d, e, f) {\n    var g = function() {\n        var h = \"undefined\", i = \"object\", j = \"Shockwave Flash\", k = \"ShockwaveFlash.ShockwaveFlash\", l = \"application/x-shockwave-flash\", m = \"SWFObjectExprInst\", n = \"JSBNG__onreadystatechange\", o = window, p = JSBNG__document, q = JSBNG__navigator, r = false, s = [ka,], t = [], u = [], v = [], w, x, y, z, aa = false, ba = false, ca, da, ea = true, fa = function() {\n            var eb = ((((((typeof p.getElementById != h)) && ((typeof p.getElementsByTagName != h)))) && ((typeof p.createElement != h)))), fb = q.userAgent.toLowerCase(), gb = q.platform.toLowerCase(), hb = ((gb ? /win/.test(gb) : /win/.test(fb))), ib = ((gb ? /mac/.test(gb) : /mac/.test(fb))), jb = ((/webkit/.test(fb) ? parseFloat(fb.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false)), kb = !+\"\\u000b1\", lb = [0,0,0,], mb = null;\n            if (((((typeof q.plugins != h)) && ((typeof q.plugins[j] == i))))) {\n                mb = q.plugins[j].description;\n                if (((mb && !((((((typeof q.mimeTypes != h)) && q.mimeTypes[l])) && !q.mimeTypes[l].enabledPlugin))))) {\n                    r = true;\n                    kb = false;\n                    mb = mb.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n                    lb[0] = parseInt(mb.replace(/^(.*)\\..*$/, \"$1\"), 10);\n                    lb[1] = parseInt(mb.replace(/^.*\\.(.*)\\s.*$/, \"$1\"), 10);\n                    lb[2] = ((/[a-zA-Z]/.test(mb) ? parseInt(mb.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\"), 10) : 0));\n                }\n            ;\n            ;\n            }\n             else if (((typeof o.ActiveXObject != h))) {\n                try {\n                    var ob = new ActiveXObject(k);\n                    if (ob) {\n                        mb = ob.GetVariable(\"$version\");\n                        if (mb) {\n                            kb = true;\n                            mb = mb.split(\" \")[1].split(\",\");\n                            lb = [parseInt(mb[0], 10),parseInt(mb[1], 10),parseInt(mb[2], 10),];\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                } catch (nb) {\n                \n                };\n            }\n            \n        ;\n        ;\n            return {\n                w3: eb,\n                pv: lb,\n                wk: jb,\n                ie: kb,\n                win: hb,\n                mac: ib\n            };\n        }(), ga = function() {\n            if (!fa.w3) {\n                return;\n            }\n        ;\n        ;\n            if (((((((typeof p.readyState != h)) && ((p.readyState == \"complete\")))) || ((((typeof p.readyState == h)) && ((p.getElementsByTagName(\"body\")[0] || p.body))))))) {\n                ha();\n            }\n        ;\n        ;\n            if (!aa) {\n                if (((typeof p.JSBNG__addEventListener != h))) {\n                    p.JSBNG__addEventListener(\"DOMContentLoaded\", ha, false);\n                }\n            ;\n            ;\n                if (((fa.ie && fa.win))) {\n                    p.JSBNG__attachEvent(n, function() {\n                        if (((p.readyState == \"complete\"))) {\n                            p.JSBNG__detachEvent(n, arguments.callee);\n                            ha();\n                        }\n                    ;\n                    ;\n                    });\n                    if (((o == JSBNG__top))) {\n                        (function() {\n                            if (aa) {\n                                return;\n                            }\n                        ;\n                        ;\n                            try {\n                                p.documentElement.doScroll(\"left\");\n                            } catch (eb) {\n                                JSBNG__setTimeout(arguments.callee, 0);\n                                return;\n                            };\n                        ;\n                            ha();\n                        })();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n                if (fa.wk) {\n                    (function() {\n                        if (aa) {\n                            return;\n                        }\n                    ;\n                    ;\n                        if (!/loaded|complete/.test(p.readyState)) {\n                            JSBNG__setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                    ;\n                    ;\n                        ha();\n                    })();\n                }\n            ;\n            ;\n                ja(ha);\n            }\n        ;\n        ;\n        }();\n        function ha() {\n            if (aa) {\n                return;\n            }\n        ;\n        ;\n            try {\n                var fb = p.getElementsByTagName(\"body\")[0].appendChild(xa(\"span\"));\n                fb.parentNode.removeChild(fb);\n            } catch (eb) {\n                return;\n            };\n        ;\n            aa = true;\n            var gb = s.length;\n            for (var hb = 0; ((hb < gb)); hb++) {\n                s[hb]();\n            ;\n            };\n        ;\n        };\n    ;\n        function ia(eb) {\n            if (aa) {\n                eb();\n            }\n             else s[s.length] = eb;\n        ;\n        ;\n        };\n    ;\n        function ja(eb) {\n            if (((typeof o.JSBNG__addEventListener != h))) {\n                o.JSBNG__addEventListener(\"load\", eb, false);\n            }\n             else if (((typeof p.JSBNG__addEventListener != h))) {\n                p.JSBNG__addEventListener(\"load\", eb, false);\n            }\n             else if (((typeof o.JSBNG__attachEvent != h))) {\n                ya(o, \"JSBNG__onload\", eb);\n            }\n             else if (((typeof o.JSBNG__onload == \"function\"))) {\n                var fb = o.JSBNG__onload;\n                o.JSBNG__onload = function() {\n                    fb();\n                    eb();\n                };\n            }\n             else o.JSBNG__onload = eb;\n            \n            \n            \n        ;\n        ;\n        };\n    ;\n        function ka() {\n            if (r) {\n                la();\n            }\n             else ma();\n        ;\n        ;\n        };\n    ;\n        function la() {\n            var eb = p.getElementsByTagName(\"body\")[0], fb = xa(i);\n            fb.setAttribute(\"type\", l);\n            fb.setAttribute(\"style\", \"visibility: hidden; position: absolute; top: -1000px;\");\n            var gb = eb.appendChild(fb);\n            if (gb) {\n                var hb = 0;\n                (function() {\n                    if (((typeof gb.GetVariable != h))) {\n                        var ib = gb.GetVariable(\"$version\");\n                        if (ib) {\n                            ib = ib.split(\" \")[1].split(\",\");\n                            fa.pv = [parseInt(ib[0], 10),parseInt(ib[1], 10),parseInt(ib[2], 10),];\n                        }\n                    ;\n                    ;\n                    }\n                     else if (((hb < 10))) {\n                        hb++;\n                        JSBNG__setTimeout(arguments.callee, 10);\n                        return;\n                    }\n                    \n                ;\n                ;\n                    gb = null;\n                    ma();\n                })();\n            }\n             else ma();\n        ;\n        ;\n        };\n    ;\n        function ma() {\n            var eb = t.length;\n            if (((eb > 0))) {\n                for (var fb = 0; ((fb < eb)); fb++) {\n                    var gb = t[fb].id, hb = t[fb].callbackFn, ib = {\n                        success: false,\n                        id: gb\n                    };\n                    if (((fa.pv[0] > 0))) {\n                        var jb = wa(gb);\n                        if (jb) {\n                            if (((za(t[fb].swfVersion) && !((fa.wk && ((fa.wk < 312))))))) {\n                                bb(gb, true);\n                                if (hb) {\n                                    ib.success = true;\n                                    ib.ref = na(gb);\n                                    hb(ib);\n                                }\n                            ;\n                            ;\n                            }\n                             else if (((t[fb].expressInstall && oa()))) {\n                                var kb = {\n                                };\n                                kb.data = t[fb].expressInstall;\n                                kb.width = ((jb.getAttribute(\"width\") || \"0\"));\n                                kb.height = ((jb.getAttribute(\"height\") || \"0\"));\n                                if (jb.getAttribute(\"class\")) {\n                                    kb.styleclass = jb.getAttribute(\"class\");\n                                }\n                            ;\n                            ;\n                                if (jb.getAttribute(\"align\")) {\n                                    kb.align = jb.getAttribute(\"align\");\n                                }\n                            ;\n                            ;\n                                var lb = {\n                                }, mb = jb.getElementsByTagName(\"param\"), nb = mb.length;\n                                for (var ob = 0; ((ob < nb)); ob++) {\n                                    if (((mb[ob].getAttribute(\"JSBNG__name\").toLowerCase() != \"movie\"))) {\n                                        lb[mb[ob].getAttribute(\"JSBNG__name\")] = mb[ob].getAttribute(\"value\");\n                                    }\n                                ;\n                                ;\n                                };\n                            ;\n                                pa(kb, lb, gb, hb);\n                            }\n                             else {\n                                qa(jb);\n                                if (hb) {\n                                    hb(ib);\n                                }\n                            ;\n                            ;\n                            }\n                            \n                        ;\n                        }\n                    ;\n                    ;\n                    }\n                     else {\n                        bb(gb, true);\n                        if (hb) {\n                            var pb = na(gb);\n                            if (((pb && ((typeof pb.SetVariable != h))))) {\n                                ib.success = true;\n                                ib.ref = pb;\n                            }\n                        ;\n                        ;\n                            hb(ib);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n        };\n    ;\n        function na(eb) {\n            var fb = null, gb = wa(eb);\n            if (((gb && ((gb.nodeName == \"OBJECT\"))))) {\n                if (((typeof gb.SetVariable != h))) {\n                    fb = gb;\n                }\n                 else {\n                    var hb = gb.getElementsByTagName(i)[0];\n                    if (hb) {\n                        fb = hb;\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return fb;\n        };\n    ;\n        function oa() {\n            return ((((((!ba && za(\"6.0.65\"))) && ((fa.win || fa.mac)))) && !((fa.wk && ((fa.wk < 312))))));\n        };\n    ;\n        function pa(eb, fb, gb, hb) {\n            ba = true;\n            y = ((hb || null));\n            z = {\n                success: false,\n                id: gb\n            };\n            var ib = wa(gb);\n            if (ib) {\n                if (((ib.nodeName == \"OBJECT\"))) {\n                    w = ra(ib);\n                    x = null;\n                }\n                 else {\n                    w = ib;\n                    x = gb;\n                }\n            ;\n            ;\n                eb.id = m;\n                if (((((typeof eb.width == h)) || ((!/%$/.test(eb.width) && ((parseInt(eb.width, 10) < 310))))))) {\n                    eb.width = \"310\";\n                }\n            ;\n            ;\n                if (((((typeof eb.height == h)) || ((!/%$/.test(eb.height) && ((parseInt(eb.height, 10) < 137))))))) {\n                    eb.height = \"137\";\n                }\n            ;\n            ;\n                p.title = ((p.title.slice(0, 47) + \" - Flash Player Installation\"));\n                var jb = ((((fa.ie && fa.win)) ? \"ActiveX\" : \"PlugIn\")), kb = ((((((((((\"MMredirectURL=\" + o.JSBNG__location.toString().replace(/&/g, \"%26\"))) + \"&MMplayerType=\")) + jb)) + \"&MMdoctitle=\")) + p.title));\n                if (((typeof fb.flashvars != h))) {\n                    fb.flashvars += ((\"&\" + kb));\n                }\n                 else fb.flashvars = kb;\n            ;\n            ;\n                if (((((fa.ie && fa.win)) && ((ib.readyState != 4))))) {\n                    var lb = xa(\"div\");\n                    gb += \"SWFObjectNew\";\n                    lb.setAttribute(\"id\", gb);\n                    ib.parentNode.insertBefore(lb, ib);\n                    ib.style.display = \"none\";\n                    (function() {\n                        if (((ib.readyState == 4))) {\n                            ib.parentNode.removeChild(ib);\n                        }\n                         else JSBNG__setTimeout(arguments.callee, 10);\n                    ;\n                    ;\n                    })();\n                }\n            ;\n            ;\n                sa(eb, fb, gb);\n            }\n        ;\n        ;\n        };\n    ;\n        function qa(eb) {\n            if (((((fa.ie && fa.win)) && ((eb.readyState != 4))))) {\n                var fb = xa(\"div\");\n                eb.parentNode.insertBefore(fb, eb);\n                fb.parentNode.replaceChild(ra(eb), fb);\n                eb.style.display = \"none\";\n                (function() {\n                    if (((eb.readyState == 4))) {\n                        eb.parentNode.removeChild(eb);\n                    }\n                     else JSBNG__setTimeout(arguments.callee, 10);\n                ;\n                ;\n                })();\n            }\n             else eb.parentNode.replaceChild(ra(eb), eb);\n        ;\n        ;\n        };\n    ;\n        function ra(eb) {\n            var fb = xa(\"div\");\n            if (((fa.win && fa.ie))) {\n                fb.innerHTML = eb.innerHTML;\n            }\n             else {\n                var gb = eb.getElementsByTagName(i)[0];\n                if (gb) {\n                    var hb = gb.childNodes;\n                    if (hb) {\n                        var ib = hb.length;\n                        for (var jb = 0; ((jb < ib)); jb++) {\n                            if (((!((((hb[jb].nodeType == 1)) && ((hb[jb].nodeName == \"PARAM\")))) && !((hb[jb].nodeType == 8))))) {\n                                fb.appendChild(hb[jb].cloneNode(true));\n                            }\n                        ;\n                        ;\n                        };\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return fb;\n        };\n    ;\n        function sa(eb, fb, gb) {\n            var hb, ib = wa(gb);\n            if (((fa.wk && ((fa.wk < 312))))) {\n                return hb;\n            }\n        ;\n        ;\n            if (ib) {\n                if (((typeof eb.id == h))) {\n                    eb.id = gb;\n                }\n            ;\n            ;\n                if (((fa.ie && fa.win))) {\n                    var jb = \"\";\n                    {\n                        var fin324keys = ((window.top.JSBNG_Replay.forInKeys)((eb))), fin324i = (0);\n                        var kb;\n                        for (; (fin324i < fin324keys.length); (fin324i++)) {\n                            ((kb) = (fin324keys[fin324i]));\n                            {\n                                if (((eb[kb] != Object.prototype[kb]))) {\n                                    if (((kb.toLowerCase() == \"data\"))) {\n                                        fb.movie = eb[kb];\n                                    }\n                                     else if (((kb.toLowerCase() == \"styleclass\"))) {\n                                        jb += ((((\" class=\\\"\" + eb[kb])) + \"\\\"\"));\n                                    }\n                                     else if (((kb.toLowerCase() != \"classid\"))) {\n                                        jb += ((((((((\" \" + kb)) + \"=\\\"\")) + eb[kb])) + \"\\\"\"));\n                                    }\n                                    \n                                    \n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    var lb = \"\";\n                    {\n                        var fin325keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin325i = (0);\n                        var mb;\n                        for (; (fin325i < fin325keys.length); (fin325i++)) {\n                            ((mb) = (fin325keys[fin325i]));\n                            {\n                                if (((fb[mb] != Object.prototype[mb]))) {\n                                    lb += ((((((((\"\\u003Cparam name=\\\"\" + mb)) + \"\\\" value=\\\"\")) + fb[mb])) + \"\\\" /\\u003E\"));\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    ib.outerHTML = ((((((((\"\\u003Cobject classid=\\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\\"\" + jb)) + \"\\u003E\")) + lb)) + \"\\u003C/object\\u003E\"));\n                    u[u.length] = eb.id;\n                    hb = wa(eb.id);\n                }\n                 else {\n                    var nb = xa(i);\n                    nb.setAttribute(\"type\", l);\n                    {\n                        var fin326keys = ((window.top.JSBNG_Replay.forInKeys)((eb))), fin326i = (0);\n                        var ob;\n                        for (; (fin326i < fin326keys.length); (fin326i++)) {\n                            ((ob) = (fin326keys[fin326i]));\n                            {\n                                if (((eb[ob] != Object.prototype[ob]))) {\n                                    if (((ob.toLowerCase() == \"styleclass\"))) {\n                                        nb.setAttribute(\"class\", eb[ob]);\n                                    }\n                                     else if (((ob.toLowerCase() != \"classid\"))) {\n                                        nb.setAttribute(ob, eb[ob]);\n                                    }\n                                    \n                                ;\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    {\n                        var fin327keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin327i = (0);\n                        var pb;\n                        for (; (fin327i < fin327keys.length); (fin327i++)) {\n                            ((pb) = (fin327keys[fin327i]));\n                            {\n                                if (((((fb[pb] != Object.prototype[pb])) && ((pb.toLowerCase() != \"movie\"))))) {\n                                    ta(nb, pb, fb[pb]);\n                                }\n                            ;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    ib.parentNode.replaceChild(nb, ib);\n                    hb = nb;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            return hb;\n        };\n    ;\n        function ta(eb, fb, gb) {\n            var hb = xa(\"param\");\n            hb.setAttribute(\"JSBNG__name\", fb);\n            hb.setAttribute(\"value\", gb);\n            eb.appendChild(hb);\n        };\n    ;\n        function ua(eb) {\n            var fb = wa(eb);\n            if (((fb && ((fb.nodeName == \"OBJECT\"))))) {\n                if (((fa.ie && fa.win))) {\n                    fb.style.display = \"none\";\n                    (function() {\n                        if (((fb.readyState == 4))) {\n                            va(eb);\n                        }\n                         else JSBNG__setTimeout(arguments.callee, 10);\n                    ;\n                    ;\n                    })();\n                }\n                 else fb.parentNode.removeChild(fb);\n            ;\n            }\n        ;\n        ;\n        };\n    ;\n        function va(eb) {\n            var fb = wa(eb);\n            if (fb) {\n                {\n                    var fin328keys = ((window.top.JSBNG_Replay.forInKeys)((fb))), fin328i = (0);\n                    var gb;\n                    for (; (fin328i < fin328keys.length); (fin328i++)) {\n                        ((gb) = (fin328keys[fin328i]));\n                        {\n                            if (((typeof fb[gb] == \"function\"))) {\n                                fb[gb] = null;\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            ;\n                fb.parentNode.removeChild(fb);\n            }\n        ;\n        ;\n        };\n    ;\n        function wa(eb) {\n            var fb = null;\n            try {\n                fb = p.getElementById(eb);\n            } catch (gb) {\n            \n            };\n        ;\n            return fb;\n        };\n    ;\n        function xa(eb) {\n            return p.createElement(eb);\n        };\n    ;\n        function ya(eb, fb, gb) {\n            eb.JSBNG__attachEvent(fb, gb);\n            v[v.length] = [eb,fb,gb,];\n        };\n    ;\n        function za(eb) {\n            var fb = fa.pv, gb = eb.split(\".\");\n            gb[0] = parseInt(gb[0], 10);\n            gb[1] = ((parseInt(gb[1], 10) || 0));\n            gb[2] = ((parseInt(gb[2], 10) || 0));\n            return ((((((((fb[0] > gb[0])) || ((((fb[0] == gb[0])) && ((fb[1] > gb[1])))))) || ((((((fb[0] == gb[0])) && ((fb[1] == gb[1])))) && ((fb[2] >= gb[2])))))) ? true : false));\n        };\n    ;\n        function ab(eb, fb, gb, hb) {\n            if (((fa.ie && fa.mac))) {\n                return;\n            }\n        ;\n        ;\n            var ib = p.getElementsByTagName(\"head\")[0];\n            if (!ib) {\n                return;\n            }\n        ;\n        ;\n            var jb = ((((gb && ((typeof gb == \"string\")))) ? gb : \"JSBNG__screen\"));\n            if (hb) {\n                ca = null;\n                da = null;\n            }\n        ;\n        ;\n            if (((!ca || ((da != jb))))) {\n                var kb = xa(\"style\");\n                kb.setAttribute(\"type\", \"text/css\");\n                kb.setAttribute(\"media\", jb);\n                ca = ib.appendChild(kb);\n                if (((((((fa.ie && fa.win)) && ((typeof p.styleSheets != h)))) && ((p.styleSheets.length > 0))))) {\n                    ca = p.styleSheets[((p.styleSheets.length - 1))];\n                }\n            ;\n            ;\n                da = jb;\n            }\n        ;\n        ;\n            if (((fa.ie && fa.win))) {\n                if (((ca && ((typeof ca.addRule == i))))) {\n                    ca.addRule(eb, fb);\n                }\n            ;\n            ;\n            }\n             else if (((ca && ((typeof p.createTextNode != h))))) {\n                ca.appendChild(p.createTextNode(((((((eb + \" {\")) + fb)) + \"}\"))));\n            }\n            \n        ;\n        ;\n        };\n    ;\n        function bb(eb, fb) {\n            if (!ea) {\n                return;\n            }\n        ;\n        ;\n            var gb = ((fb ? \"visible\" : \"hidden\"));\n            if (((aa && wa(eb)))) {\n                wa(eb).style.visibility = gb;\n            }\n             else ab(((\"#\" + eb)), ((\"visibility:\" + gb)));\n        ;\n        ;\n        };\n    ;\n        function cb(eb) {\n            var fb = /[\\\\\\\"<>\\.;]/, gb = ((fb.exec(eb) != null));\n            return ((((gb && ((typeof encodeURIComponent != h)))) ? encodeURIComponent(eb) : eb));\n        };\n    ;\n        var db = function() {\n            if (((fa.ie && fa.win))) {\n                window.JSBNG__attachEvent(\"JSBNG__onunload\", function() {\n                    var eb = v.length;\n                    for (var fb = 0; ((fb < eb)); fb++) {\n                        v[fb][0].JSBNG__detachEvent(v[fb][1], v[fb][2]);\n                    ;\n                    };\n                ;\n                    var gb = u.length;\n                    for (var hb = 0; ((hb < gb)); hb++) {\n                        ua(u[hb]);\n                    ;\n                    };\n                ;\n                    {\n                        var fin329keys = ((window.top.JSBNG_Replay.forInKeys)((fa))), fin329i = (0);\n                        var ib;\n                        for (; (fin329i < fin329keys.length); (fin329i++)) {\n                            ((ib) = (fin329keys[fin329i]));\n                            {\n                                fa[ib] = null;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    fa = null;\n                    {\n                        var fin330keys = ((window.top.JSBNG_Replay.forInKeys)((g))), fin330i = (0);\n                        var jb;\n                        for (; (fin330i < fin330keys.length); (fin330i++)) {\n                            ((jb) = (fin330keys[fin330i]));\n                            {\n                                g[jb] = null;\n                            ;\n                            };\n                        };\n                    };\n                ;\n                    g = null;\n                });\n            }\n        ;\n        ;\n        }();\n        return {\n            registerObject: function(eb, fb, gb, hb) {\n                if (((((fa.w3 && eb)) && fb))) {\n                    var ib = {\n                    };\n                    ib.id = eb;\n                    ib.swfVersion = fb;\n                    ib.expressInstall = gb;\n                    ib.callbackFn = hb;\n                    t[t.length] = ib;\n                    bb(eb, false);\n                }\n                 else if (hb) {\n                    hb({\n                        success: false,\n                        id: eb\n                    });\n                }\n                \n            ;\n            ;\n            },\n            getObjectById: function(eb) {\n                if (fa.w3) {\n                    return na(eb);\n                }\n            ;\n            ;\n            },\n            embedSWF: function(eb, fb, gb, hb, ib, jb, kb, lb, mb, nb) {\n                var ob = {\n                    success: false,\n                    id: fb\n                };\n                if (((((((((((((fa.w3 && !((fa.wk && ((fa.wk < 312)))))) && eb)) && fb)) && gb)) && hb)) && ib))) {\n                    bb(fb, false);\n                    ia(function() {\n                        gb += \"\";\n                        hb += \"\";\n                        var pb = {\n                        };\n                        if (((mb && ((typeof mb === i))))) {\n                            {\n                                var fin331keys = ((window.top.JSBNG_Replay.forInKeys)((mb))), fin331i = (0);\n                                var qb;\n                                for (; (fin331i < fin331keys.length); (fin331i++)) {\n                                    ((qb) = (fin331keys[fin331i]));\n                                    {\n                                        pb[qb] = mb[qb];\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        pb.data = eb;\n                        pb.width = gb;\n                        pb.height = hb;\n                        var rb = {\n                        };\n                        if (((lb && ((typeof lb === i))))) {\n                            {\n                                var fin332keys = ((window.top.JSBNG_Replay.forInKeys)((lb))), fin332i = (0);\n                                var sb;\n                                for (; (fin332i < fin332keys.length); (fin332i++)) {\n                                    ((sb) = (fin332keys[fin332i]));\n                                    {\n                                        rb[sb] = lb[sb];\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        if (((kb && ((typeof kb === i))))) {\n                            {\n                                var fin333keys = ((window.top.JSBNG_Replay.forInKeys)((kb))), fin333i = (0);\n                                var tb;\n                                for (; (fin333i < fin333keys.length); (fin333i++)) {\n                                    ((tb) = (fin333keys[fin333i]));\n                                    {\n                                        if (((typeof rb.flashvars != h))) {\n                                            rb.flashvars += ((((((\"&\" + tb)) + \"=\")) + kb[tb]));\n                                        }\n                                         else rb.flashvars = ((((tb + \"=\")) + kb[tb]));\n                                    ;\n                                    ;\n                                    };\n                                };\n                            };\n                        }\n                    ;\n                    ;\n                        if (za(ib)) {\n                            var ub = sa(pb, rb, fb);\n                            if (((pb.id == fb))) {\n                                bb(fb, true);\n                            }\n                        ;\n                        ;\n                            ob.success = true;\n                            ob.ref = ub;\n                        }\n                         else if (((jb && oa()))) {\n                            pb.data = jb;\n                            pa(pb, rb, fb, nb);\n                            return;\n                        }\n                         else bb(fb, true);\n                        \n                    ;\n                    ;\n                        if (nb) {\n                            nb(ob);\n                        }\n                    ;\n                    ;\n                    });\n                }\n                 else if (nb) {\n                    nb(ob);\n                }\n                \n            ;\n            ;\n            },\n            switchOffAutoHideShow: function() {\n                ea = false;\n            },\n            ua: fa,\n            getFlashPlayerVersion: function() {\n                return {\n                    major: fa.pv[0],\n                    minor: fa.pv[1],\n                    release: fa.pv[2]\n                };\n            },\n            hasFlashPlayerVersion: za,\n            createSWF: function(eb, fb, gb) {\n                if (fa.w3) {\n                    return sa(eb, fb, gb);\n                }\n                 else return undefined\n            ;\n            },\n            showExpressInstall: function(eb, fb, gb, hb) {\n                if (((fa.w3 && oa()))) {\n                    pa(eb, fb, gb, hb);\n                }\n            ;\n            ;\n            },\n            removeSWF: function(eb) {\n                if (fa.w3) {\n                    ua(eb);\n                }\n            ;\n            ;\n            },\n            createCSS: function(eb, fb, gb, hb) {\n                if (fa.w3) {\n                    ab(eb, fb, gb, hb);\n                }\n            ;\n            ;\n            },\n            addDomLoadEvent: ia,\n            addLoadEvent: ja,\n            getQueryParamValue: function(eb) {\n                var fb = ((p.JSBNG__location.search || p.JSBNG__location.hash));\n                if (fb) {\n                    if (/\\?/.test(fb)) {\n                        fb = fb.split(\"?\")[1];\n                    }\n                ;\n                ;\n                    if (((eb == null))) {\n                        return cb(fb);\n                    }\n                ;\n                ;\n                    var gb = fb.split(\"&\");\n                    for (var hb = 0; ((hb < gb.length)); hb++) {\n                        if (((gb[hb].substring(0, gb[hb].indexOf(\"=\")) == eb))) {\n                            return cb(gb[hb].substring(((gb[hb].indexOf(\"=\") + 1))));\n                        }\n                    ;\n                    ;\n                    };\n                ;\n                }\n            ;\n            ;\n                return \"\";\n            },\n            expressInstallCallback: function() {\n                if (ba) {\n                    var eb = wa(m);\n                    if (((eb && w))) {\n                        eb.parentNode.replaceChild(w, eb);\n                        if (x) {\n                            bb(x, true);\n                            if (((fa.ie && fa.win))) {\n                                w.style.display = \"block\";\n                            }\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                        if (y) {\n                            y(z);\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ba = false;\n                }\n            ;\n            ;\n            }\n        };\n    }();\n    e.exports = g;\n});\n__d(\"SoundPlayer\", [\"Arbiter\",\"ChatConfig\",\"swfobject\",\"swfobject2\",\"URI\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"ChatConfig\"), i = b(\"swfobject\").SWFObject, j = b(\"swfobject2\"), k = b(\"URI\"), l = b(\"createArrayFrom\"), m = {\n    }, n = null, o = false, p = \"so_sound_player\", q = \"/swf/SoundPlayer.swf?v=1\", r = \"10.0.22.87\", s = null, t = h.get(\"sound.useswfobject_2\", false), u = h.get(\"sound.force_flash\", false);\n    function v(da) {\n        var ea = k(da);\n        if (!ea.getDomain()) {\n            return k().setPath(ea.getPath()).toString();\n        }\n    ;\n    ;\n        return da;\n    };\n;\n    function w(da) {\n        var ea = k(da).getPath();\n        if (/\\.mp3$/.test(ea)) {\n            return \"audio/mpeg\";\n        }\n    ;\n    ;\n        if (/\\.og[ga]$/.test(ea)) {\n            return \"audio/ogg\";\n        }\n    ;\n    ;\n        return \"\";\n    };\n;\n    function x() {\n        if (((!s && !u))) {\n            var da = JSBNG__document.createElement(\"audio\");\n            if (((!da || !da.canPlayType))) {\n                return null;\n            }\n        ;\n        ;\n            da.setAttribute(\"preload\", \"auto\");\n            JSBNG__document.body.appendChild(da);\n            s = da;\n        }\n    ;\n    ;\n        return s;\n    };\n;\n    function y() {\n        var da = ((JSBNG__document[p] || window[p]));\n        if (da) {\n            if (((!da.playSound && da.length))) {\n                da = da[0];\n            }\n        ;\n        }\n    ;\n    ;\n        return ((((((da && da.playSound)) && da.loopSound)) ? da : null));\n    };\n;\n    function z() {\n        return o;\n    };\n;\n    function aa(da, ea, fa) {\n        n = {\n            path: da,\n            sync: ea,\n            loop: fa\n        };\n    };\n;\n    function ba() {\n        o = true;\n        if (n) {\n            var da = y();\n            if (n.loop) {\n                da.loopSound(n.path, n.sync);\n            }\n             else da.playSound(n.path, n.sync);\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    var ca = {\n        init: function(da) {\n            da = l(da);\n            var ea;\n            for (var fa = 0; ((fa < da.length)); ++fa) {\n                ea = da[fa];\n                if (m[ea]) {\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            var ga = x();\n            for (fa = 0; ((ga && ((fa < da.length)))); ++fa) {\n                ea = da[fa];\n                if (ga.canPlayType(ea)) {\n                    m[ea] = true;\n                    return;\n                }\n            ;\n            ;\n            };\n        ;\n            m[\"audio/mpeg\"] = true;\n            if (y()) {\n                return;\n            }\n        ;\n        ;\n            try {\n                g.registerCallback(ba, [\"sound/player_ready\",\"sound/ready\",]);\n                var ia = JSBNG__document.createElement(\"div\");\n                ia.id = \"sound_player_holder\";\n                JSBNG__document.body.appendChild(ia);\n                if (t) {\n                    j.embedSWF(q, ia.id, \"1px\", \"1px\", r, null, {\n                        swf_id: p\n                    }, {\n                        allowscriptaccess: \"always\",\n                        wmode: \"transparent\"\n                    }, null, function(ka) {\n                        window[p] = ka.ref;\n                        g.inform(\"sound/player_ready\");\n                    });\n                }\n                 else {\n                    var ja = new i(q, p, \"1px\", \"1px\", [r,], \"#ffffff\");\n                    ja.addParam(\"allowscriptaccess\", \"always\");\n                    ja.addParam(\"wmode\", \"transparent\");\n                    ja.addVariable(\"swf_id\", p);\n                    ja.fallback_html = \" \";\n                    ja.write(ia.id);\n                    window[p] = ja;\n                    g.inform(\"sound/player_ready\");\n                }\n            ;\n            ;\n            } catch (ha) {\n            \n            };\n        ;\n        },\n        play: function(da, ea) {\n            da = l(da);\n            var fa = x(), ga, ha;\n            for (var ia = 0; ((fa && ((ia < da.length)))); ++ia) {\n                ga = da[ia];\n                ha = w(ga);\n                if (!fa.canPlayType(ha)) {\n                    continue;\n                }\n            ;\n            ;\n                ca.init([ha,]);\n                fa.src = v(ga);\n                if (ea) {\n                    fa.setAttribute(\"loop\", \"\");\n                }\n                 else fa.removeAttribute(\"loop\");\n            ;\n            ;\n                fa.play();\n                return;\n            };\n        ;\n            for (ia = 0; ((ia < da.length)); ++ia) {\n                ga = v(da[ia]);\n                ha = w(ga);\n                if (((ha != \"audio/mpeg\"))) {\n                    continue;\n                }\n            ;\n            ;\n                ca.init([ha,]);\n                var ja = y();\n                if (!z()) {\n                    aa(ga, true, ea);\n                    return;\n                }\n                 else if (ja) {\n                    if (ea) {\n                        ja.loopSound(ga, true);\n                    }\n                     else ja.playSound(ga, true);\n                ;\n                ;\n                    return;\n                }\n                \n            ;\n            ;\n            };\n        ;\n        },\n        JSBNG__stop: function(da) {\n            da = l(da);\n            for (var ea = 0; ((ea < da.length)); ++ea) {\n                var fa = v(da[ea]), ga = x(), ha = y();\n                if (((ga && ((ga.src == fa))))) {\n                    ga.pause();\n                    ga.src = undefined;\n                }\n                 else ((ha && ha.stopSound(fa)));\n            ;\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = ca;\n});\n__d(\"SoundSynchronizer\", [\"hasArrayNature\",\"SoundPlayer\",\"createArrayFrom\",], function(a, b, c, d, e, f) {\n    var g = b(\"hasArrayNature\"), h = b(\"SoundPlayer\"), i = b(\"createArrayFrom\"), j = \"fb_sounds_playing3\";\n    function k() {\n        if (window.JSBNG__localStorage) {\n            try {\n                var p = window.JSBNG__localStorage[j];\n                if (p) {\n                    p = JSON.parse(p);\n                    if (g(p)) {\n                        return p;\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            } catch (o) {\n            \n            };\n        }\n    ;\n    ;\n        return [];\n    };\n;\n    function l(o) {\n        if (window.JSBNG__localStorage) {\n            var p = k();\n            p.push(o);\n            while (((p.length > 5))) {\n                p.shift();\n            ;\n            };\n        ;\n            try {\n                window.JSBNG__localStorage[j] = JSON.stringify(p);\n            } catch (q) {\n            \n            };\n        ;\n        }\n    ;\n    ;\n    };\n;\n    function m(o) {\n        return k().some(function(p) {\n            return ((p === o));\n        });\n    };\n;\n    var n = {\n        play: function(o, p, q) {\n            o = i(o);\n            p = ((p || ((o[0] + Math.floor(((JSBNG__Date.now() / 1000)))))));\n            if (m(p)) {\n                return;\n            }\n        ;\n        ;\n            h.play(o, q);\n            l(p);\n        },\n        isSupported: function() {\n            return !!window.JSBNG__localStorage;\n        }\n    };\n    e.exports = n;\n});\n__d(\"Sound\", [\"SoundPlayer\",\"SoundRPC\",\"SoundSynchronizer\",\"URI\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"SoundPlayer\"), h = b(\"SoundRPC\"), i = b(\"SoundSynchronizer\"), j = b(\"URI\"), k = b(\"UserAgent\"), l = null, m = {\n        init: function(q) {\n            if (!l) {\n                g.init(q);\n            }\n        ;\n        ;\n        },\n        play: function(q, r, s) {\n            if (l) {\n                h.playRemote(l.contentWindow, q, r, false);\n            }\n             else h.playLocal(q, r, s);\n        ;\n        ;\n        },\n        JSBNG__stop: function(q) {\n            if (!l) {\n                g.JSBNG__stop(q);\n            }\n        ;\n        ;\n        }\n    }, n = new j(JSBNG__location.href);\n    if (((n.getSubdomain() && ((n.getSubdomain() !== \"www\"))))) {\n        n.setSubdomain(\"www\");\n    }\n;\n;\n    var o = n.getDomain();\n    function p() {\n        if (((k.ie() < 9))) {\n            return false;\n        }\n    ;\n    ;\n        return ((i.isSupported() && h.supportsRPC()));\n    };\n;\n    if (((((n.isFacebookURI() && ((JSBNG__location.host !== o)))) && p()))) {\n        l = JSBNG__document.createElement(\"div\");\n        l.setAttribute(\"src\", ((((\"//\" + o)) + \"/sound_iframe.php\")));\n        l.style.display = \"none\";\n        JSBNG__document.body.appendChild(l);\n    }\n;\n;\n    e.exports = m;\n});\n__d(\"MercuryBrowserAlerts\", [\"ArbiterMixin\",\"ChatActivity\",\"ChatConfig\",\"ChatOptions\",\"ChatTitleBarBlinker\",\"MercuryParticipants\",\"MercuryThreadMuter\",\"MercuryThreads\",\"MessagingTag\",\"Sound\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"ArbiterMixin\"), h = b(\"ChatActivity\"), i = b(\"ChatConfig\"), j = b(\"ChatOptions\"), k = b(\"ChatTitleBarBlinker\"), l = b(\"MercuryParticipants\"), m = b(\"MercuryThreadMuter\"), n = b(\"MercuryThreads\").get(), o = b(\"MessagingTag\"), p = b(\"Sound\"), q = b(\"copyProperties\");\n    p.init([\"audio/ogg\",\"audio/mpeg\",]);\n    function r(t) {\n        if (j.getSetting(\"sound\")) {\n            p.play([i.get(\"sound.notif_ogg_url\"),i.get(\"sound.notif_mp3_url\"),], t, false);\n        }\n    ;\n    ;\n    };\n;\n    var s = {\n        messageReceived: function(t) {\n            if (((((((t.author == l.user)) || !t.is_unread)) || ((((t.folder != o.INBOX)) && ((t.folder != o.ARCHIVED))))))) {\n                return;\n            }\n        ;\n        ;\n            var u = t.thread_id, v = h.isActive();\n            if (v) {\n                var w = false;\n                s.inform(\"before-alert\", {\n                    threadID: u,\n                    cancelAlert: function() {\n                        w = true;\n                    }\n                });\n            }\n        ;\n        ;\n            n.getThreadMeta(u, function(x) {\n                var y = m.isThreadMuted(x);\n                if (y) {\n                    return;\n                }\n            ;\n            ;\n                var z = t.timestamp;\n                if (v) {\n                    ((!w && r(z)));\n                }\n                 else {\n                    k.blink(u, z);\n                    r(z);\n                }\n            ;\n            ;\n                k.blinkingElsewhere();\n            }.bind(this));\n        }\n    };\n    e.exports = q(s, g);\n});\n__d(\"ActiveXSupport\", [], function(a, b, c, d, e, f) {\n    var g = null, h = {\n        isSupported: function() {\n            if (((g !== null))) {\n                return g;\n            }\n        ;\n        ;\n            try {\n                g = ((!!window.ActiveXObject && !!new ActiveXObject(\"htmlfile\")));\n            } catch (i) {\n                g = false;\n            };\n        ;\n            return g;\n        }\n    };\n    e.exports = h;\n});\n__d(\"VideoCallSupport\", [\"MercuryConfig\",\"UserAgent\",], function(a, b, c, d, e, f) {\n    var g = b(\"MercuryConfig\"), h = b(\"UserAgent\"), i = {\n        newVCIsSupported: function() {\n            return ((g.NewVCGK && ((((h.chrome() >= 24)) || ((h.firefox() >= 22))))));\n        }\n    };\n    e.exports = i;\n});\n__d(\"VideoCallRecordMessageDialog\", [\"AsyncDialog\",\"AsyncRequest\",\"Dialog\",\"URI\",\"tx\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDialog\"), h = b(\"AsyncRequest\"), i = b(\"Dialog\"), j = b(\"URI\"), k = b(\"tx\"), l = {\n        get: function(m, n) {\n            var o = \"Would you like to leave a message?\", p = \"New Message\";\n            return new i().setTitle(k._(\"{firstname} is Unavailable\", {\n                firstname: n\n            })).setBody(o).setButtons([{\n                JSBNG__name: \"record-message\",\n                label: p\n            },i.CANCEL,]).setHandler(function() {\n                var q = j(\"/ajax/messaging/composer.php\").setQueryData({\n                    ids: [m,],\n                    autoloadvideo: true\n                }).toString();\n                g.send(new h(q));\n            });\n        }\n    };\n    e.exports = l;\n});\n__d(\"VideoCallCore\", [\"JSBNG__Event\",\"ActiveXSupport\",\"Arbiter\",\"AsyncRequest\",\"AvailableList\",\"AvailableListConstants\",\"Bootloader\",\"ChannelConstants\",\"Cookie\",\"JSBNG__CSS\",\"Dialog\",\"MercuryConfig\",\"UserAgent\",\"VideoCallSupport\",\"emptyFunction\",\"ge\",\"VideoCallTemplates\",\"ShortProfiles\",\"VideoCallRecordMessageDialog\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ActiveXSupport\"), i = b(\"Arbiter\"), j = b(\"AsyncRequest\"), k = b(\"AvailableList\"), l = b(\"AvailableListConstants\"), m = b(\"Bootloader\"), n = b(\"ChannelConstants\"), o = b(\"Cookie\"), p = b(\"JSBNG__CSS\"), q = b(\"Dialog\"), r = b(\"MercuryConfig\"), s = b(\"UserAgent\"), t = b(\"VideoCallSupport\"), u = b(\"emptyFunction\"), v = b(\"ge\");\n    b(\"VideoCallTemplates\");\n    var w = [], x = [], y = {\n        isSupported: function() {\n            if (t.newVCIsSupported()) {\n                return true;\n            }\n        ;\n        ;\n            if (s.windows()) {\n                if (((((s.ie() >= 9)) && !s.ie64()))) {\n                    return h.isSupported();\n                }\n                 else return ((((((((((s.ie() >= 7)) && !s.ie64())) || ((s.firefox() >= 3.6)))) || ((s.chrome() >= 5)))) || ((s.JSBNG__opera() >= 12))))\n            ;\n            }\n             else if (((s.osx() > 10.4))) {\n                return ((((((((s.firefox() >= 3.6)) || ((s.chrome() >= 5)))) || ((s.webkit() >= 500)))) || ((s.JSBNG__opera() >= 12))));\n            }\n            \n        ;\n        ;\n            return false;\n        },\n        isInstalled: function() {\n            var ca = false;\n            if (this.isSupported()) {\n                if (z()) {\n                    var da = null;\n                    try {\n                        da = new ActiveXObject(\"SkypeLimited.SkypeWebPlugin\");\n                        ca = !!da;\n                    } catch (ea) {\n                    \n                    };\n                ;\n                    da = null;\n                }\n                 else {\n                    ca = aa();\n                    if (r.VideoCallingNoJavaGK) {\n                        if (((ca && ((s.osx() >= 10.8))))) {\n                            if (((ca.description && ((ca.description.charAt(0) != \"v\"))))) {\n                                ca = false;\n                            }\n                        ;\n                        }\n                    ;\n                    }\n                ;\n                ;\n                }\n            ;\n            }\n        ;\n        ;\n            return ca;\n        },\n        mightReloadPostInstall: function() {\n            return s.windows();\n        },\n        onVideoMessage: function(ca) {\n            w.push(ca);\n            m.loadModules([\"VideoCallController\",], u);\n        },\n        onRTCMessage: function(ca) {\n            if (t.newVCIsSupported()) {\n                x.push(ca);\n                m.loadModules([\"FBRTCCallController\",], u);\n            }\n        ;\n        ;\n        },\n        setMessageHandler: function(ca) {\n            this.onVideoMessage = ca;\n            if (ca) {\n                while (w.length) {\n                    ca(w.shift());\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        setRTCMessageHandler: function(ca) {\n            this.onRTCMessage = ca;\n            if (ca) {\n                while (x.length) {\n                    ca(x.shift());\n                ;\n                };\n            }\n        ;\n        ;\n        },\n        availableForCall: function(ca) {\n            var da = k.get(ca);\n            return ((((da == l.ACTIVE)) || ((da == l.IDLE))));\n        },\n        onProfileButtonClick: function(ca) {\n            y.startCallOrLeaveMessage(ca, \"profile_button_click\");\n        },\n        attachListenerToProfileButton: function(ca) {\n            var da = v(\"videoCallProfileButton\");\n            if (da) {\n                if (!y.isSupported()) {\n                    p.hide(da);\n                    return;\n                }\n            ;\n            ;\n                g.listen(da, \"click\", function(JSBNG__event) {\n                    y.startCallOrLeaveMessage(ca, \"profile_button_click_timeline\");\n                });\n            }\n        ;\n        ;\n        },\n        startCallOrLeaveMessage: function(ca, da) {\n            if (this.availableForCall(ca)) {\n                y.showOutgoingCallDialog(ca, da);\n            }\n             else b(\"ShortProfiles\").get(ca, function(ea) {\n                b(\"VideoCallRecordMessageDialog\").get(ca, ea.firstName).show();\n            });\n        ;\n        ;\n        },\n        showOutgoingCallDialog: function(ca, da) {\n            var ea = ((da || \"unknown\"));\n            y.logClick(ca, ea);\n            var fa = ((((y.isInstalled() || r.NewVCGK)) ? \"outgoing_dialog.php\" : \"intro.php\")), ga = ((((((\"/ajax/chat/video/\" + fa)) + \"?idTarget=\")) + ca));\n            new q().setAllowCrossPageTransition(true).setAsync(new j(ga)).show();\n        },\n        logClick: function(ca, da) {\n            new j().setURI(\"/ajax/chat/video/log_click.php\").setData({\n                targetUserID: ca,\n                clickSource: da\n            }).setAllowCrossPageTransition(true).setErrorHandler(u).send();\n        }\n    };\n    function z() {\n        return ((((s.ie() && s.windows())) && !s.JSBNG__opera()));\n    };\n;\n    function aa() {\n        if (!JSBNG__navigator) {\n            return null;\n        }\n    ;\n    ;\n        JSBNG__navigator.plugins.refresh(false);\n        var ca = JSBNG__navigator.mimeTypes[\"application/skypesdk-plugin\"];\n        return ((ca && ca.enabledPlugin));\n    };\n;\n    function ba() {\n        if (!y.mightReloadPostInstall()) {\n            return;\n        }\n    ;\n    ;\n        var ca = o.get(\"vcpwn\");\n        if (ca) {\n            o.clear(\"vcpwn\");\n            var da = o.get(\"vctid\");\n            if (da) {\n                o.clear(\"vctid\");\n                if (o.get(\"vctid\")) {\n                    return;\n                }\n            ;\n            ;\n                if (((da && y.isInstalled()))) {\n                    var ea = ((\"/ajax/chat/video/outgoing_dialog.php?idTarget=\" + da));\n                    new q().setAllowCrossPageTransition(true).setAsync(new j(ea)).show();\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n    };\n;\n    i.subscribe(n.getArbiterType(\"video\"), function(ca, da) {\n        y.onVideoMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"webrtc\"), function(ca, da) {\n        y.onRTCMessage(da.obj);\n    });\n    i.subscribe(n.getArbiterType(\"chat_event\"), function(ca, da) {\n        if (((da.obj.event_name == \"missed-call\"))) {\n            m.loadModules([\"VideoCallController\",], function(ea) {\n                ea.onMissedCallEvent(da.obj);\n            });\n        }\n    ;\n    ;\n    });\n    ba();\n    e.exports = y;\n});\n__d(\"ChatTabModel\", [\"function-extensions\",\"Arbiter\",\"ArbiterMixin\",\"ChatBehavior\",\"ChatConfig\",\"JSLogger\",\"MercuryAssert\",\"MercuryServerRequests\",\"MercuryThreads\",\"MercuryTimestampTracker\",\"PresenceInitialData\",\"PresenceState\",\"PresenceUtil\",\"areObjectsEqual\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    b(\"function-extensions\");\n    var g = b(\"Arbiter\"), h = b(\"ArbiterMixin\"), i = b(\"ChatBehavior\"), j = b(\"ChatConfig\"), k = b(\"JSLogger\"), l = b(\"MercuryAssert\"), m = b(\"MercuryServerRequests\").get(), n = b(\"MercuryThreads\").get(), o = b(\"MercuryTimestampTracker\").get(), p = b(\"PresenceInitialData\"), q = b(\"PresenceState\"), r = b(\"PresenceUtil\"), s = b(\"areObjectsEqual\"), t = b(\"copyProperties\"), u = [], v = null, w = null, x = null, y = null;\n    function z() {\n        return parseInt(p.serverTime, 10);\n    };\n;\n    var aa = ((j.get(\"tab_max_load_age\") || 3600000)), ba = ((z() - aa)), ca = 0, da = 20, ea = k.create(\"chat_tab_model\"), fa = false;\n    function ga(xa) {\n        var ya = q.verifyNumber(xa.uct2);\n        if (((!ya || ((typeof ya !== \"number\"))))) {\n            ea.warn(\"bad_cookie_version\", xa.uct2);\n            return null;\n        }\n    ;\n    ;\n        if (((((ya < ca)) || ((ya < ba))))) {\n            return null;\n        }\n    ;\n    ;\n        return ya;\n    };\n;\n    function ha(xa) {\n        var ya = ga(xa);\n        if (!ya) {\n            var za = {\n            };\n            za.old_tabs = ((((xa && xa.t2)) && JSON.stringify(xa.t2)));\n            za.old_promoted = ((xa && xa.lm2));\n            za.old_time = ((xa && xa.uct2));\n            za.old_reason = ((xa && xa.tr));\n            za.old_window = ((xa && xa.tw));\n            var ab;\n            if (((w && xa.t2))) {\n                for (var bb = 0; ((bb < xa.t2.length)); bb++) {\n                    var cb = xa.t2[bb];\n                    if (((cb.i === w))) {\n                        ab = cb.r;\n                    }\n                ;\n                ;\n                };\n            }\n        ;\n        ;\n            var db = [];\n            u.forEach(function(eb) {\n                if (!eb.fragile) {\n                    var fb = {\n                        i: eb.id,\n                        si: eb.server_id\n                    };\n                    if (((eb.raised || ((((eb.id === w)) && ab))))) {\n                        fb.r = 1;\n                    }\n                ;\n                ;\n                    db.push(fb);\n                }\n            ;\n            ;\n            });\n            xa.t2 = db;\n            xa.uct2 = ca;\n            xa.lm2 = v;\n            xa.tr = y;\n            xa.tw = r.getSessionID();\n            za.new_tabs = JSON.stringify(xa.t2);\n            za.new_promoted = xa.lm2;\n            za.new_time = xa.uct2;\n            za.new_reason = xa.tr;\n            za.new_window = xa.tw;\n            ea.debug(\"store\", za);\n        }\n    ;\n    ;\n        return xa;\n    };\n;\n    function ia(xa) {\n        if (xa) {\n            var ya = ga(xa);\n            if (((ya && ((ya !== ca))))) {\n                var za = {\n                };\n                za.old_tabs = JSON.stringify(u);\n                za.old_promoted = v;\n                za.old_time = ca;\n                za.old_reason = y;\n                za.window_id = r.getSessionID();\n                za.cookie_tabs = ((((xa && xa.t2)) && JSON.stringify(xa.t2)));\n                za.cookie_promoted = ((xa && xa.lm2));\n                za.cookie_time = ((xa && xa.uct2));\n                za.cookie_reason = ((xa && xa.tr));\n                za.cookie_window = ((xa && xa.tw));\n                ca = ya;\n                y = \"load\";\n                var ab = ja(xa.t2, ((xa.lm2 || null)));\n                za.load_result = ab;\n                za.new_tabs = JSON.stringify(u);\n                za.new_promoted = v;\n                za.new_time = ca;\n                za.new_reason = y;\n                var JSBNG__event = \"load\";\n                if (!fa) {\n                    JSBNG__event += \"_init\";\n                }\n            ;\n            ;\n                ea.log(JSBNG__event, za);\n                return ab;\n            }\n        ;\n        ;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ja(xa, ya) {\n        if (ka(xa, ya)) {\n            var za = u.filter(function(cb) {\n                return cb.fragile;\n            }), ab = {\n            };\n            v = null;\n            u = xa.map(function(cb) {\n                var db = {\n                    id: cb.i,\n                    server_id: cb.si\n                };\n                if (((db.id == ya))) {\n                    v = db.id;\n                }\n            ;\n            ;\n                if (((w == cb.i))) {\n                    var eb = pa(w);\n                    if (((eb != -1))) {\n                        db.raised = u[eb].raised;\n                        return db;\n                    }\n                     else return null\n                ;\n                }\n            ;\n            ;\n                if (cb.r) {\n                    db.raised = true;\n                }\n            ;\n            ;\n                ab[db.id] = db;\n                return db;\n            });\n            u = u.filter(function(cb) {\n                return ((cb != null));\n            });\n            if (x) {\n                {\n                    var fin334keys = ((window.top.JSBNG_Replay.forInKeys)((x))), fin334i = (0);\n                    var bb;\n                    for (; (fin334i < fin334keys.length); (fin334i++)) {\n                        ((bb) = (fin334keys[fin334i]));\n                        {\n                            if (((!ab[bb] || !ab[bb].raised))) {\n                                delete x[bb];\n                            }\n                        ;\n                        ;\n                        };\n                    };\n                };\n            }\n        ;\n        ;\n            za = za.filter(function(cb) {\n                return !ab[cb.id];\n            });\n            u = u.concat(za);\n            oa();\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ka(xa, ya) {\n        if (((ya != v))) {\n            return true;\n        }\n    ;\n    ;\n        var za = u.filter(function(cb) {\n            return !cb.fragile;\n        });\n        if (((xa.length != za.length))) {\n            return true;\n        }\n    ;\n    ;\n        for (var ab = 0, bb = xa.length; ((ab < bb)); ab++) {\n            if (((xa[ab].id === w))) {\n                continue;\n            }\n        ;\n        ;\n            if (!s(xa[ab], za[ab])) {\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n        return false;\n    };\n;\n    function la(xa, ya, za) {\n        var ab = ia(q.get());\n        if (((((ya === undefined)) || ((ya > ca))))) {\n            if (xa()) {\n                ab = true;\n                y = ((za || null));\n                na(ya);\n            }\n        ;\n        ;\n        }\n         else ea.error(\"rejected\", {\n            change_time: ya,\n            state_time: ca\n        });\n    ;\n    ;\n        ((ab && ma()));\n    };\n;\n    function ma() {\n        if (fa) {\n            va.inform(\"chat/tabs-changed\", va.get());\n        }\n    ;\n    ;\n    };\n;\n    function na(xa) {\n        if (((xa === undefined))) {\n            xa = Math.max(((o.getLastUserMessageTimestamp() || 1)), ((ca + 1)));\n        }\n    ;\n    ;\n        ca = xa;\n        q.doSync();\n    };\n;\n    function oa() {\n        var xa = ((u.length - da));\n        if (((xa > 0))) {\n            u = u.filter(function(ya) {\n                return ((ya.raised || ((xa-- <= 0))));\n            });\n        }\n    ;\n    ;\n    };\n;\n    function pa(xa) {\n        for (var ya = 0; ((ya < u.length)); ya++) {\n            if (((u[ya].id == xa))) {\n                return ya;\n            }\n        ;\n        ;\n        };\n    ;\n        return -1;\n    };\n;\n    function qa(xa, ya) {\n        var za = n.getThreadMetaNow(xa);\n        if (!za) {\n            return false;\n        }\n    ;\n    ;\n        if (za.is_canonical_user) {\n            return sa(xa, ya);\n        }\n         else {\n            var ab = ra(xa);\n            if (ab) {\n                m.getServerThreadID(xa, function(bb) {\n                    if (ta(xa, bb)) {\n                        na();\n                        ma();\n                    }\n                ;\n                ;\n                });\n            }\n        ;\n        ;\n            return ab;\n        }\n    ;\n    ;\n    };\n;\n    function ra(xa) {\n        if (((pa(xa) === -1))) {\n            u.push({\n                id: xa,\n                fragile: true\n            });\n            ea.log(\"open_fragile_tab\", {\n                tabs: JSON.stringify(u),\n                opened: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function sa(xa, ya) {\n        var za = pa(xa);\n        if (((za != -1))) {\n            if (u[za].fragile) {\n                u.splice(za, 1);\n            }\n             else {\n                u[za].signatureID = ya;\n                return true;\n            }\n        ;\n        }\n    ;\n    ;\n        for (var ab = 0; ((ab <= u.length)); ab++) {\n            if (((((ab == u.length)) || u[ab].fragile))) {\n                u.splice(ab, 0, {\n                    id: xa,\n                    signatureID: ya\n                });\n                oa();\n                ea.log(\"open_tab\", {\n                    tabs: JSON.stringify(u),\n                    opened: xa,\n                    window_id: r.getSessionID()\n                });\n                return true;\n            }\n        ;\n        ;\n        };\n    ;\n    };\n;\n    function ta(xa, ya) {\n        var za = pa(xa);\n        if (((((za != -1)) && u[za].fragile))) {\n            var ab = u[za];\n            ab.fragile = false;\n            ab.server_id = ya;\n            var bb = [];\n            u.forEach(function(cb) {\n                if (((cb.id != xa))) {\n                    if (((ab && cb.fragile))) {\n                        bb.push(ab);\n                        ab = null;\n                    }\n                ;\n                ;\n                    bb.push(cb);\n                }\n            ;\n            ;\n            });\n            if (ab) {\n                bb.push(ab);\n            }\n        ;\n        ;\n            u = bb;\n            ea.log(\"make_permanent\", {\n                tabs: JSON.stringify(u),\n                tab_id: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    function ua(xa) {\n        var ya = pa(xa);\n        if (((xa == v))) {\n            v = null;\n        }\n    ;\n    ;\n        if (((ya != -1))) {\n            u.splice(ya, 1);\n            ea.log(\"close_tab\", {\n                tabs: JSON.stringify(u),\n                JSBNG__closed: xa,\n                window_id: r.getSessionID()\n            });\n            return true;\n        }\n    ;\n    ;\n        return false;\n    };\n;\n    q.registerStateStorer(ha);\n    q.registerStateLoader(function(xa) {\n        if (ia(xa)) {\n            ma();\n        }\n    ;\n    ;\n    });\n    function va() {\n    \n    };\n;\n    t(va, h, {\n        indexOf: function(xa) {\n            return pa(xa);\n        },\n        getTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = this.indexOf(xa);\n            if (((ya > -1))) {\n                var za = u[ya];\n                return t({\n                }, za);\n            }\n        ;\n        ;\n            return null;\n        },\n        getEmptyTab: function() {\n            for (var xa = 0; ((xa < u.length)); xa++) {\n                var ya = u[xa].id;\n                if (n.isNewEmptyLocalThread(ya)) {\n                    return ya;\n                }\n            ;\n            ;\n            };\n        ;\n            return null;\n        },\n        getServerTime: function() {\n            return z();\n        },\n        closeAllTabs: function() {\n            if (u.length) {\n                ea.log(\"close_all_tabs\", {\n                    closed_tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n                u = [];\n                v = null;\n                if (x) {\n                    x = {\n                    };\n                }\n            ;\n            ;\n                na();\n                ma();\n            }\n        ;\n        ;\n        },\n        closeFragileTabs: function() {\n            var xa = [];\n            for (var ya = 0; ((ya < u.length)); ya++) {\n                if (((u[ya].fragile && !n.isNewEmptyLocalThread(u[ya].id)))) {\n                    xa.push(u[ya]);\n                    u.splice(ya);\n                    ma();\n                    break;\n                }\n            ;\n            ;\n            };\n        ;\n            ea.log(\"close_fragile_tabs\", {\n                tabs: JSON.stringify(u),\n                fragile_closed: xa,\n                window_id: r.getSessionID()\n            });\n        },\n        closeTab: function(xa, ya) {\n            l.isThreadID(xa);\n            var za = false;\n            if (x) {\n                delete x[xa];\n                za = true;\n            }\n        ;\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    za = true;\n                }\n            ;\n            ;\n                return za;\n            }, undefined, ya);\n        },\n        closeTabAndDemote: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (x) {\n                delete x[xa];\n                ab = true;\n            }\n        ;\n        ;\n            la(function() {\n                if (ua(xa)) {\n                    if (v) {\n                        var bb = pa(v);\n                        if (((bb > ya))) {\n                            var cb = u.splice(bb, 1)[0];\n                            u.splice(ya, 0, cb);\n                            v = null;\n                        }\n                    ;\n                    ;\n                    }\n                ;\n                ;\n                    ab = true;\n                }\n            ;\n            ;\n                return ab;\n            }, undefined, za);\n        },\n        raiseTab: function(xa, ya, za) {\n            l.isThreadID(xa);\n            var ab = false;\n            if (((x && ya))) {\n                x[xa] = true;\n                ab = true;\n            }\n        ;\n        ;\n            if (((!ya && ((xa === w))))) {\n                ((ab && ma()));\n                return;\n            }\n        ;\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    ab = true;\n                }\n            ;\n            ;\n                var bb = pa(xa);\n                if (((((bb != -1)) && !u[bb].raised))) {\n                    u[bb].raised = true;\n                    ab = true;\n                    ea.log(\"raise_tab\", {\n                        tabs: JSON.stringify(u),\n                        raised: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n            ;\n                return ab;\n            });\n        },\n        get: function() {\n            var xa = u.map(function(ya) {\n                var za = t({\n                }, ya);\n                delete za.fragile;\n                if (x) {\n                    za.raised = x[za.id];\n                }\n            ;\n            ;\n                return za;\n            });\n            return {\n                tabs: xa,\n                promoted: v\n            };\n        },\n        openFragileTab: function(xa) {\n            l.isThreadID(xa);\n            if (ra(xa)) {\n                ma();\n            }\n        ;\n        ;\n        },\n        openTab: function(xa) {\n            l.isThreadID(xa);\n            la(qa.curry(xa));\n        },\n        lowerTab: function(xa) {\n            l.isThreadID(xa);\n            var ya = false;\n            if (x) {\n                delete x[xa];\n                ya = true;\n            }\n        ;\n        ;\n            la(function() {\n                var za = pa(xa);\n                if (((((za != -1)) && u[za].raised))) {\n                    delete u[za].raised;\n                    ea.log(\"lower_tab\", {\n                        tabs: JSON.stringify(u),\n                        lowered: xa,\n                        window_id: r.getSessionID()\n                    });\n                    ya = true;\n                }\n            ;\n            ;\n                return ya;\n            });\n        },\n        raiseAndPromoteTab: function(xa, ya, za, ab, bb) {\n            l.isThreadID(xa);\n            var cb = false;\n            if (((x && ya))) {\n                x[xa] = true;\n                cb = true;\n            }\n        ;\n        ;\n            if (((!ya && ((xa === w))))) {\n                ((cb && ma()));\n                return;\n            }\n        ;\n        ;\n            la(function() {\n                if (qa(xa, za)) {\n                    cb = true;\n                }\n            ;\n            ;\n                var db = pa(xa);\n                if (((((db != -1)) && ((!u[db].raised || ((v != xa))))))) {\n                    u[db].raised = true;\n                    v = xa;\n                    cb = true;\n                    ea.log(\"raise_and_promote_tab\", {\n                        tabs: JSON.stringify(u),\n                        promoted: xa,\n                        window_id: r.getSessionID()\n                    });\n                }\n            ;\n            ;\n                return cb;\n            }, ab, bb);\n        },\n        promoteThreadInPlaceOfThread: function(xa, ya) {\n            l.isThreadID(xa);\n            l.isThreadID(ya);\n            la(function() {\n                var za = pa(xa), ab = pa(ya);\n                if (((v === ya))) {\n                    v = xa;\n                }\n            ;\n            ;\n                var bb = u[za];\n                u[za] = u[ab];\n                u[ab] = bb;\n                return true;\n            });\n        },\n        squelchTab: function(xa) {\n            l.isThreadID(xa);\n            w = xa;\n            this.lowerTab(xa);\n            ea.log(\"squelch_tab\", {\n                squelched: xa,\n                tabs: JSON.stringify(u),\n                window_id: r.getSessionID()\n            });\n        },\n        clearSquelchedTab: function() {\n            if (w) {\n                ea.log(\"unsquelch_tab\", {\n                    squelched: w,\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        ;\n            w = null;\n        },\n        persistLocalRaised: function() {\n            if (x) {\n                la(function() {\n                    var xa = false;\n                    u.forEach(function(ya) {\n                        if (((ya.raised != x[ya.id]))) {\n                            xa = true;\n                            if (x[ya.id]) {\n                                ya.raised = true;\n                            }\n                             else delete ya.raised;\n                        ;\n                        ;\n                        }\n                    ;\n                    ;\n                    });\n                    return xa;\n                });\n                ea.log(\"persist_local_raise\", {\n                    tabs: JSON.stringify(u),\n                    window_id: r.getSessionID()\n                });\n            }\n        ;\n        ;\n        }\n    });\n    g.subscribe(k.DUMP_EVENT, function(xa, ya) {\n        ya.chat_tabs = {\n            promoted: v,\n            tabs: u.map(function(za) {\n                return t({\n                }, za);\n            }),\n            time: ca,\n            max_load_age: aa\n        };\n    });\n    function wa() {\n        var xa = i.ignoresRemoteTabRaise();\n        if (((xa && !x))) {\n            ea.log(\"start_ignore_remote_raise\");\n            x = {\n            };\n            ma();\n        }\n         else if (((!xa && x))) {\n            ea.log(\"stop_ignore_remote_raise\");\n            x = null;\n            ma();\n        }\n        \n    ;\n    ;\n    };\n;\n    i.subscribe(i.ON_CHANGED, wa);\n    wa();\n    ia(q.getInitial(), true);\n    if (((ca === 0))) {\n        ca = ((z() - 600000));\n    }\n;\n;\n    fa = true;\n    e.exports = va;\n});\n__d(\"LinkshimHandler\", [\"JSBNG__Event\",\"LinkshimAsyncLink\",\"LinkshimHandlerConfig\",\"URI\",\"shield\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"LinkshimAsyncLink\"), i = b(\"LinkshimHandlerConfig\"), j = b(\"URI\"), k = b(\"shield\"), l = {\n        setUpLinkshimHandling: function(r) {\n            try {\n                var t = j(r.getAttribute(\"href\")), u = m(t);\n                if (((u && n(t)))) {\n                    g.listen(r, \"mouseover\", k(h.swap, null, r, u));\n                    var v = p(t);\n                    g.listen(r, \"click\", function() {\n                        if (i.supports_meta_referrer) {\n                            h.referrer_log(r, v, o(t).toString());\n                        }\n                         else h.swap(r, t);\n                    ;\n                    ;\n                    });\n                }\n            ;\n            ;\n            } catch (s) {\n            \n            };\n        ;\n        }\n    };\n    function m(r) {\n        return ((r.getQueryData().u ? new j(r.getQueryData().u) : null));\n    };\n;\n    function n(r) {\n        return r.getQueryData().hasOwnProperty(\"s\");\n    };\n;\n    function o(r) {\n        return j(\"/si/ajax/l/render_linkshim_log/\").setSubdomain(\"www\").setQueryData(r.getQueryData());\n    };\n;\n    function p(r) {\n        var s;\n        if (q()) {\n            s = j(r).addQueryData({\n                render_verification: true\n            });\n        }\n         else s = m(r);\n    ;\n    ;\n        return s;\n    };\n;\n    function q() {\n        var r = ((i.render_verification_rate || 0));\n        return ((Math.floor(((((Math.JSBNG__random() * r)) + 1))) === r));\n    };\n;\n    e.exports = l;\n});");
// 17938
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o3,o5);
// undefined
o5 = null;
// 17962
o6["0"] = o49;
// undefined
o49 = null;
// 17969
o6["1"] = o50;
// undefined
o50 = null;
// 17976
o6["2"] = o64;
// undefined
o64 = null;
// 17983
o6["3"] = o65;
// undefined
o65 = null;
// 17990
o6["4"] = o66;
// undefined
o6 = null;
// undefined
o66 = null;
// 17943
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o46,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yN/r/Mt8gx_sQz92.js",o48);
// undefined
o46 = null;
// undefined
o48 = null;
// 18163
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"NMNM4\",]);\n}\n;\n__d(\"AppUseTracker\", [\"AsyncRequest\",\"PageTransitions\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"PageTransitions\"), i = b(\"Run\"), j = b(\"copyProperties\");\n    function k() {\n        if (!k.instance) {\n            k.instance = this;\n        };\n        return k.instance;\n    };\n    j(k.prototype, {\n        instance: null,\n        endpoint: \"/ajax/apps/usage_update.php\",\n        INITIAL_PING: 0,\n        ONGOING_PING: 1,\n        DISCOVERY_PING: 2,\n        ENDING_PING: 3,\n        _application_id: 0,\n        _is_game: 0,\n        _createRequest: function(l) {\n            return new g().setURI(this.endpoint).setMethod(\"POST\").setData({\n                app: this._application_id,\n                is_game: this._is_game,\n                type: l,\n                condition: this._signal_on_page_transition\n            });\n        },\n        init: function(l, m, n, o, p) {\n            if ((window != window.top)) {\n                return\n            };\n            this.cleanup();\n            h.registerHandler(this.catchPageTransition.bind(this));\n            this._application_id = l;\n            this._is_game = m;\n            this._timers.push(setTimeout(function() {\n                this._createRequest(this.INITIAL_PING).send();\n                var q = this._createRequest(this.ONGOING_PING);\n                this._timers.push(setInterval(q.send.bind(q), o));\n            }.bind(this), n));\n            if (p) {\n                this._timers.push(setTimeout(function() {\n                    this._createRequest(this.DISCOVERY_PING).send();\n                }.bind(this), p));\n            };\n            i.onBeforeUnload(this.onBeforeUnload.bind(this));\n        },\n        catchPageTransition: function(l) {\n            this._createRequest(this.ENDING_PING).send();\n            this.cleanup();\n        },\n        onBeforeUnload: function() {\n            this._createRequest(this.ENDING_PING).setOption(\"asynchronous\", false).send();\n            this.cleanup();\n        },\n        cleanup: function() {\n            if (this._timers) {\n                for (var l = 0; (l < this._timers.length); l++) {\n                    clearInterval(this._timers[l]);;\n                }\n            };\n            this._timers = [];\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:app-tracker\", [\"AppUseTracker\",], function(a, b, c, d) {\n    a.AppUseTracker = b(\"AppUseTracker\");\n}, 3);\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"detect_broken_proxy_cache\", [\"AsyncSignal\",\"Cookie\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"URI\");\n    function j(k, l) {\n        var m = h.get(l);\n        if (((((m != k)) && ((m != null))) && ((k != \"0\")))) {\n            var n = {\n                c: \"si_detect_broken_proxy_cache\",\n                m: ((((l + \" \") + k) + \" \") + m)\n            }, o = new i(\"/common/scribe_endpoint.php\").getQualifiedURI().toString();\n            new g(o, n).send();\n        }\n    ;\n    };\n    e.exports = j;\n});\n__d(\"legacy:detect-broken-proxy-cache\", [\"detect_broken_proxy_cache\",], function(a, b, c, d) {\n    a.detect_broken_proxy_cache = b(\"detect_broken_proxy_cache\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                document.location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            };\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    document.location.reload();\n                }\n                 else i(m);\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((7 * 24) * 3600000));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"link_rel_preload\", [\"Bootloader\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Parent\");\n    function i() {\n        var j = /async(?:-post)?|dialog(?:-pipe|-post)?|theater|toggle/;\n        document.documentElement.onmousedown = function(k) {\n            k = (k || window.event);\n            var l = (k.target || k.srcElement), m = h.byTag(l, \"A\");\n            if (!m) {\n                return\n            };\n            var n = m.getAttribute(\"ajaxify\"), o = m.href, p = (n || o);\n            if (((n && o) && !(/#$/).test(o))) {\n                var q = (k.which && (k.which != 1)), r = (((k.altKey || k.ctrlKey) || k.metaKey) || k.shiftKey);\n                if ((q || r)) {\n                    return\n                };\n            }\n        ;\n            var s = (m.rel && m.rel.match(j));\n            s = (s && s[0]);\n            switch (s) {\n              case \"dialog\":\n            \n              case \"dialog-post\":\n                g.loadModules([\"Dialog\",]);\n                break;\n              case \"dialog-pipe\":\n                g.loadModules([\"AjaxPipeRequest\",\"Dialog\",]);\n                break;\n              case \"async\":\n            \n              case \"async-post\":\n                g.loadModules([\"AsyncRequest\",]);\n                break;\n              case \"theater\":\n                g.loadModules([\"PhotoSnowlift\",], function(t) {\n                    t.preload(p, m);\n                });\n                break;\n              case \"toggle\":\n                g.loadModules([\"Toggler\",]);\n                break;\n            };\n            return;\n        };\n    };\n    e.exports = i;\n});\n__d(\"legacy:link-rel-preload\", [\"link_rel_preload\",], function(a, b, c, d) {\n    a.link_rel_preload = b(\"link_rel_preload\");\n}, 3);\n__d(\"legacy:async\", [\"AsyncRequest\",\"AsyncResponse\",], function(a, b, c, d) {\n    a.AsyncRequest = b(\"AsyncRequest\");\n    a.AsyncResponse = b(\"AsyncResponse\");\n}, 3);\n__d(\"LoginFormController\", [\"Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt((Date.now() / 1000), 10);\n        };\n    };\n});\n__d(\"BanzaiNectar\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\");\n    function h(j) {\n        return {\n            log: function(k, l, m) {\n                var n = {\n                    e: l,\n                    a: m\n                };\n                g.post((\"nectar:\" + k), n, j);\n            }\n        };\n    };\n    var i = h();\n    i.create = h;\n    e.exports = i;\n});\n__d(\"DimensionLogging\", [\"BanzaiNectar\",\"DOMDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiNectar\"), h = b(\"DOMDimensions\"), i = h.getViewportDimensions();\n    g.log(\"browser_dimension\", \"homeload\", {\n        x: i.width,\n        y: i.height,\n        sw: window.screen.width,\n        sh: window.screen.height,\n        aw: window.screen.availWidth,\n        ah: window.screen.availHeight,\n        at: window.screen.availTop,\n        al: window.screen.availLeft\n    });\n});\n__d(\"DimensionTracking\", [\"Cookie\",\"DOMDimensions\",\"Event\",\"debounce\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"DOMDimensions\"), i = b(\"Event\"), j = b(\"debounce\"), k = b(\"isInIframe\");\n    function l() {\n        var m = h.getViewportDimensions();\n        g.set(\"wd\", ((m.width + \"x\") + m.height));\n    };\n    if (!k()) {\n        l.defer(100);\n        i.listen(window, \"resize\", j(l, 250));\n        i.listen(window, \"focus\", l);\n    }\n;\n});\n__d(\"HighContrastMode\", [\"AsyncSignal\",\"Cookie\",\"CSS\",\"DOM\",\"Env\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"CSS\"), j = b(\"DOM\"), k = b(\"Env\"), l = b(\"Style\"), m = null, n = {\n        init: function(o) {\n            if (((m !== null) && (o.currentState !== m))) {\n                return\n            };\n            var p = j.create(\"div\");\n            j.appendContent(document.body, p);\n            p.style.cssText = (((((((\"border: 1px solid;\" + \"border-color: red green;\") + \"position: fixed;\") + \"height: 5px;\") + \"top: -999px;\") + \"background-image: url(\") + o.spacerImage) + \");\");\n            var q = l.get(p, \"background-image\"), r = l.get(p, \"border-top-color\"), s = l.get(p, \"border-right-color\"), t = ((r == s) || ((q && (((q == \"none\") || (q == \"url(invalid-url:)\")))))), u = (t ? \"1\" : \"0\");\n            if ((u !== o.currentState)) {\n                i.conditionClass(document.documentElement, \"highContrast\", t);\n                if (k.user) {\n                    h.set(\"highContrastMode\", u);\n                    if (t) {\n                        new g(\"/ajax/highcontrast\").send();\n                    };\n                }\n            ;\n            }\n        ;\n            j.remove(p);\n            m = u;\n        }\n    };\n    e.exports = n;\n});\nfunction tz_calculate(a) {\n    var b = new Date(), c = (b.getTimezoneOffset() / 30), d = (b.getTime() / 1000), e = Math.round((((a - d)) / 1800)), f = (Math.round((c + e)) % 48);\n    if ((f == 0)) {\n        return 0;\n    }\n     else if ((f > 24)) {\n        f -= (Math.ceil((f / 48)) * 48);\n    }\n     else if ((f < -28)) {\n        f += (Math.ceil((f / -48)) * 48);\n    }\n    \n;\n    return (f * 30);\n};\nfunction tz_autoset(a, b, c) {\n    if ((!a || (undefined == b))) {\n        return\n    };\n    if (window.tz_autoset.calculated) {\n        return\n    };\n    window.tz_autoset.calculated = true;\n    var d = -tz_calculate(a);\n    if ((c || (d != b))) {\n        var e = \"/ajax/timezone/update.php\";\n        new AsyncRequest().setURI(e).setData({\n            gmt_off: d,\n            is_forced: c\n        }).setErrorHandler(emptyFunction).setTransportErrorHandler(emptyFunction).setOption(\"suppressErrorAlerts\", true).send();\n    }\n;\n};");
// 18164
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s51fb00cac7bf7fde48b2ec1010e68d67259d8472");
// 18165
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"NMNM4\",]);\n}\n;\n;\n__d(\"AppUseTracker\", [\"AsyncRequest\",\"PageTransitions\",\"Run\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"PageTransitions\"), i = b(\"Run\"), j = b(\"copyProperties\");\n    function k() {\n        if (!k.instance) {\n            k.instance = this;\n        }\n    ;\n    ;\n        return k.instance;\n    };\n;\n    j(k.prototype, {\n        instance: null,\n        endpoint: \"/ajax/apps/usage_update.php\",\n        INITIAL_PING: 0,\n        ONGOING_PING: 1,\n        DISCOVERY_PING: 2,\n        ENDING_PING: 3,\n        _application_id: 0,\n        _is_game: 0,\n        _createRequest: function(l) {\n            return new g().setURI(this.endpoint).setMethod(\"POST\").setData({\n                app: this._application_id,\n                is_game: this._is_game,\n                type: l,\n                condition: this._signal_on_page_transition\n            });\n        },\n        init: function(l, m, n, o, p) {\n            if (((window != window.JSBNG__top))) {\n                return;\n            }\n        ;\n        ;\n            this.cleanup();\n            h.registerHandler(this.catchPageTransition.bind(this));\n            this._application_id = l;\n            this._is_game = m;\n            this._timers.push(JSBNG__setTimeout(function() {\n                this._createRequest(this.INITIAL_PING).send();\n                var q = this._createRequest(this.ONGOING_PING);\n                this._timers.push(JSBNG__setInterval(q.send.bind(q), o));\n            }.bind(this), n));\n            if (p) {\n                this._timers.push(JSBNG__setTimeout(function() {\n                    this._createRequest(this.DISCOVERY_PING).send();\n                }.bind(this), p));\n            }\n        ;\n        ;\n            i.onBeforeUnload(this.onBeforeUnload.bind(this));\n        },\n        catchPageTransition: function(l) {\n            this._createRequest(this.ENDING_PING).send();\n            this.cleanup();\n        },\n        onBeforeUnload: function() {\n            this._createRequest(this.ENDING_PING).setOption(\"asynchronous\", false).send();\n            this.cleanup();\n        },\n        cleanup: function() {\n            if (this._timers) {\n                for (var l = 0; ((l < this._timers.length)); l++) {\n                    JSBNG__clearInterval(this._timers[l]);\n                ;\n                };\n            }\n        ;\n        ;\n            this._timers = [];\n        }\n    });\n    e.exports = k;\n});\n__d(\"legacy:app-tracker\", [\"AppUseTracker\",], function(a, b, c, d) {\n    a.AppUseTracker = b(\"AppUseTracker\");\n}, 3);\n__d(\"legacy:fbdesktop-detect\", [\"FBDesktopDetect\",], function(a, b, c, d) {\n    a.FbDesktopDetect = b(\"FBDesktopDetect\");\n}, 3);\n__d(\"detect_broken_proxy_cache\", [\"AsyncSignal\",\"Cookie\",\"URI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"URI\");\n    function j(k, l) {\n        var m = h.get(l);\n        if (((((((m != k)) && ((m != null)))) && ((k != \"0\"))))) {\n            var n = {\n                c: \"si_detect_broken_proxy_cache\",\n                m: ((((((((l + \" \")) + k)) + \" \")) + m))\n            }, o = new i(\"/common/scribe_endpoint.php\").getQualifiedURI().toString();\n            new g(o, n).send();\n        }\n    ;\n    ;\n    };\n;\n    e.exports = j;\n});\n__d(\"legacy:detect-broken-proxy-cache\", [\"detect_broken_proxy_cache\",], function(a, b, c, d) {\n    a.detect_broken_proxy_cache = b(\"detect_broken_proxy_cache\");\n}, 3);\n__d(\"IntlUtils\", [\"AsyncRequest\",\"Cookie\",\"goURI\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncRequest\"), h = b(\"Cookie\"), i = b(\"goURI\"), j = {\n        setXmode: function(k) {\n            (new g()).setURI(\"/ajax/intl/save_xmode.php\").setData({\n                xmode: k\n            }).setHandler(function() {\n                JSBNG__document.JSBNG__location.reload();\n            }).send();\n        },\n        setAmode: function(k) {\n            new g().setURI(\"/ajax/intl/save_xmode.php\").setData({\n                amode: k,\n                app: false\n            }).setHandler(function() {\n                JSBNG__document.JSBNG__location.reload();\n            }).send();\n        },\n        setLocale: function(k, l, m, n) {\n            if (!m) {\n                m = k.options[k.selectedIndex].value;\n            }\n        ;\n        ;\n            j.saveLocale(m, true, null, l, n);\n        },\n        saveLocale: function(k, l, m, n, o) {\n            new g().setURI(\"/ajax/intl/save_locale.php\").setData({\n                aloc: k,\n                source: n,\n                app_only: o\n            }).setHandler(function(p) {\n                if (l) {\n                    JSBNG__document.JSBNG__location.reload();\n                }\n                 else i(m);\n            ;\n            ;\n            }).send();\n        },\n        setLocaleCookie: function(k, l) {\n            h.set(\"locale\", k, ((((7 * 24)) * 3600000)));\n            i(l);\n        }\n    };\n    e.exports = j;\n});\n__d(\"legacy:intl-base\", [\"IntlUtils\",], function(a, b, c, d) {\n    var e = b(\"IntlUtils\");\n    a.intl_set_xmode = e.setXmode;\n    a.intl_set_amode = e.setAmode;\n    a.intl_set_locale = e.setLocale;\n    a.intl_save_locale = e.saveLocale;\n    a.intl_set_cookie_locale = e.setLocaleCookie;\n}, 3);\n__d(\"link_rel_preload\", [\"Bootloader\",\"Parent\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\"), h = b(\"Parent\");\n    function i() {\n        var j = /async(?:-post)?|dialog(?:-pipe|-post)?|theater|toggle/;\n        JSBNG__document.documentElement.JSBNG__onmousedown = function(k) {\n            k = ((k || window.JSBNG__event));\n            var l = ((k.target || k.srcElement)), m = h.byTag(l, \"A\");\n            if (!m) {\n                return;\n            }\n        ;\n        ;\n            var n = m.getAttribute(\"ajaxify\"), o = m.href, p = ((n || o));\n            if (((((n && o)) && !(/#$/).test(o)))) {\n                var q = ((k.which && ((k.which != 1)))), r = ((((((k.altKey || k.ctrlKey)) || k.metaKey)) || k.shiftKey));\n                if (((q || r))) {\n                    return;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            var s = ((m.rel && m.rel.match(j)));\n            s = ((s && s[0]));\n            switch (s) {\n              case \"dialog\":\n            \n              case \"dialog-post\":\n                g.loadModules([\"Dialog\",]);\n                break;\n              case \"dialog-pipe\":\n                g.loadModules([\"AjaxPipeRequest\",\"Dialog\",]);\n                break;\n              case \"async\":\n            \n              case \"async-post\":\n                g.loadModules([\"AsyncRequest\",]);\n                break;\n              case \"theater\":\n                g.loadModules([\"PhotoSnowlift\",], function(t) {\n                    t.preload(p, m);\n                });\n                break;\n              case \"toggle\":\n                g.loadModules([\"Toggler\",]);\n                break;\n            };\n        ;\n            return;\n        };\n    };\n;\n    e.exports = i;\n});\n__d(\"legacy:link-rel-preload\", [\"link_rel_preload\",], function(a, b, c, d) {\n    a.link_rel_preload = b(\"link_rel_preload\");\n}, 3);\n__d(\"legacy:async\", [\"AsyncRequest\",\"AsyncResponse\",], function(a, b, c, d) {\n    a.AsyncRequest = b(\"AsyncRequest\");\n    a.AsyncResponse = b(\"AsyncResponse\");\n}, 3);\n__d(\"LoginFormController\", [\"JSBNG__Event\",\"ge\",\"Button\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__Event\"), h = b(\"ge\"), i = b(\"Button\");\n    f.init = function(j, k) {\n        g.listen(j, \"submit\", function() {\n            i.setEnabled(k, false);\n            i.setEnabled.curry(k, true).defer(15000);\n        });\n        var l = h(\"lgnjs\");\n        if (l) {\n            l.value = parseInt(((JSBNG__Date.now() / 1000)), 10);\n        }\n    ;\n    ;\n    };\n});\n__d(\"BanzaiNectar\", [\"Banzai\",], function(a, b, c, d, e, f) {\n    var g = b(\"Banzai\");\n    function h(j) {\n        return {\n            log: function(k, l, m) {\n                var n = {\n                    e: l,\n                    a: m\n                };\n                g.post(((\"nectar:\" + k)), n, j);\n            }\n        };\n    };\n;\n    var i = h();\n    i.create = h;\n    e.exports = i;\n});\n__d(\"DimensionLogging\", [\"BanzaiNectar\",\"DOMDimensions\",], function(a, b, c, d, e, f) {\n    var g = b(\"BanzaiNectar\"), h = b(\"DOMDimensions\"), i = h.getViewportDimensions();\n    g.log(\"browser_dimension\", \"homeload\", {\n        x: i.width,\n        y: i.height,\n        sw: window.JSBNG__screen.width,\n        sh: window.JSBNG__screen.height,\n        aw: window.JSBNG__screen.availWidth,\n        ah: window.JSBNG__screen.availHeight,\n        at: window.JSBNG__screen.availTop,\n        al: window.JSBNG__screen.availLeft\n    });\n});\n__d(\"DimensionTracking\", [\"Cookie\",\"DOMDimensions\",\"JSBNG__Event\",\"debounce\",\"isInIframe\",], function(a, b, c, d, e, f) {\n    var g = b(\"Cookie\"), h = b(\"DOMDimensions\"), i = b(\"JSBNG__Event\"), j = b(\"debounce\"), k = b(\"isInIframe\");\n    function l() {\n        var m = h.getViewportDimensions();\n        g.set(\"wd\", ((((m.width + \"x\")) + m.height)));\n    };\n;\n    if (!k()) {\n        l.defer(100);\n        i.listen(window, \"resize\", j(l, 250));\n        i.listen(window, \"JSBNG__focus\", l);\n    }\n;\n;\n});\n__d(\"HighContrastMode\", [\"AsyncSignal\",\"Cookie\",\"JSBNG__CSS\",\"DOM\",\"Env\",\"Style\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncSignal\"), h = b(\"Cookie\"), i = b(\"JSBNG__CSS\"), j = b(\"DOM\"), k = b(\"Env\"), l = b(\"Style\"), m = null, n = {\n        init: function(o) {\n            if (((((m !== null)) && ((o.currentState !== m))))) {\n                return;\n            }\n        ;\n        ;\n            var p = j.create(\"div\");\n            j.appendContent(JSBNG__document.body, p);\n            p.style.cssText = ((((((((((((((\"border: 1px solid;\" + \"border-color: red green;\")) + \"position: fixed;\")) + \"height: 5px;\")) + \"top: -999px;\")) + \"background-image: url(\")) + o.spacerImage)) + \");\"));\n            var q = l.get(p, \"background-image\"), r = l.get(p, \"border-top-color\"), s = l.get(p, \"border-right-color\"), t = ((((r == s)) || ((q && ((((q == \"none\")) || ((q == \"url(invalid-url:)\")))))))), u = ((t ? \"1\" : \"0\"));\n            if (((u !== o.currentState))) {\n                i.conditionClass(JSBNG__document.documentElement, \"highContrast\", t);\n                if (k.user) {\n                    h.set(\"highContrastMode\", u);\n                    if (t) {\n                        new g(\"/ajax/highcontrast\").send();\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            }\n        ;\n        ;\n            j.remove(p);\n            m = u;\n        }\n    };\n    e.exports = n;\n});\nfunction tz_calculate(a) {\n    var b = new JSBNG__Date(), c = ((b.getTimezoneOffset() / 30)), d = ((b.getTime() / 1000)), e = Math.round(((((a - d)) / 1800))), f = ((Math.round(((c + e))) % 48));\n    if (((f == 0))) {\n        return 0;\n    }\n     else if (((f > 24))) {\n        f -= ((Math.ceil(((f / 48))) * 48));\n    }\n     else if (((f < -28))) {\n        f += ((Math.ceil(((f / -48))) * 48));\n    }\n    \n    \n;\n;\n    return ((f * 30));\n};\n;\nfunction tz_autoset(a, b, c) {\n    if (((!a || ((undefined == b))))) {\n        return;\n    }\n;\n;\n    if (window.tz_autoset.calculated) {\n        return;\n    }\n;\n;\n    window.tz_autoset.calculated = true;\n    var d = -tz_calculate(a);\n    if (((c || ((d != b))))) {\n        var e = \"/ajax/timezone/update.php\";\n        new AsyncRequest().setURI(e).setData({\n            gmt_off: d,\n            is_forced: c\n        }).setErrorHandler(emptyFunction).setTransportErrorHandler(emptyFunction).setOption(\"suppressErrorAlerts\", true).send();\n    }\n;\n;\n};\n;");
// 18174
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o67,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/yl/r/-vSG_5pzFFr.js",o68);
// undefined
o67 = null;
// undefined
o68 = null;
// 18225
o2.readyState = 2;
// 18223
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o3,o71);
// undefined
o71 = null;
// 18229
o2.readyState = 3;
// 18227
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o3,o79);
// undefined
o79 = null;
// 18233
o2.readyState = 4;
// undefined
o2 = null;
// 18275
o196.toString = f81632121_1344;
// undefined
o196 = null;
// 18231
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o3,o83);
// undefined
o3 = null;
// undefined
o83 = null;
// 18357
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 18361
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"if (self.CavalryLogger) {\n    CavalryLogger.start_js([\"WLpRY\",]);\n}\n;\n__d(\"AsyncDOM\", [\"CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"CSS\"), h = b(\"DOM\"), i = {\n        invoke: function(j, k) {\n            for (var l = 0; (l < j.length); ++l) {\n                var m = j[l], n = m[0], o = m[1], p = m[2], q = m[3], r = (((p && k)) || null);\n                if (o) {\n                    r = h.scry((r || document.documentElement), o)[0];\n                };\n                switch (n) {\n                  case \"eval\":\n                    (new Function(q)).apply(r);\n                    break;\n                  case \"hide\":\n                    g.hide(r);\n                    break;\n                  case \"show\":\n                    g.show(r);\n                    break;\n                  case \"setContent\":\n                    h.setContent(r, q);\n                    break;\n                  case \"appendContent\":\n                    h.appendContent(r, q);\n                    break;\n                  case \"prependContent\":\n                    h.prependContent(r, q);\n                    break;\n                  case \"insertAfter\":\n                    h.insertAfter(r, q);\n                    break;\n                  case \"insertBefore\":\n                    h.insertBefore(r, q);\n                    break;\n                  case \"remove\":\n                    h.remove(r);\n                    break;\n                  case \"replace\":\n                    h.replace(r, q);\n                    break;\n                  default:\n                \n                };\n            };\n        }\n    };\n    e.exports = i;\n});\n__d(\"Live\", [\"Arbiter\",\"AsyncDOM\",\"AsyncSignal\",\"ChannelConstants\",\"DataStore\",\"DOM\",\"ServerJS\",\"createArrayFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDOM\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"ServerJS\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\");\n    function p(r, s) {\n        s = JSON.parse(JSON.stringify(s));\n        new m().setRelativeTo(r).handle(s);\n    };\n    var q = {\n        logAll: false,\n        startup: function() {\n            q.startup = o;\n            g.subscribe(j.getArbiterType(\"live\"), q.handleMessage.bind(q));\n        },\n        lookupLiveNode: function(r, s) {\n            var t = l.scry(document.body, (((\".live_\" + r) + \"_\") + s));\n            t.forEach(function(u) {\n                if ((k.get(u, \"seqnum\") === undefined)) {\n                    var v = JSON.parse(u.getAttribute(\"data-live\"));\n                    k.set(u, \"seqnum\", v.seq);\n                }\n            ;\n            });\n            return t;\n        },\n        handleMessage: function(r, s) {\n            var t = s.obj, u = t.fbid, v = t.assoc, w = this.lookupLiveNode(u, v);\n            if (!w) {\n                return false\n            };\n            w.forEach(function(x) {\n                if (t.expseq) {\n                    var y = k.get(x, \"seqnum\"), z = k.get(x, \"message_buffer\");\n                    if ((z === undefined)) {\n                        z = {\n                        };\n                        k.set(x, \"message_buffer\", z);\n                    }\n                ;\n                    var aa = {\n                        obj: t\n                    };\n                    z[t.expseq] = aa;\n                    if ((t.expseq != y)) {\n                        q.log(\"mismatch\", t.fbid, t.expseq, y);\n                        return false;\n                    }\n                ;\n                    while (true) {\n                        y = k.get(x, \"seqnum\");\n                        var ba = z[y];\n                        if (ba) {\n                            h.invoke(ba.obj.updates, x);\n                            if (ba.obj.js) {\n                                p(x, ba.obj.js);\n                            };\n                            q.log(\"seqmatch\", t.fbid, \"exp\", t.expseq, \"cur\", y);\n                            delete z[y];\n                        }\n                         else break;\n                    ;\n                    };\n                }\n                 else {\n                    h.invoke(t.updates, x);\n                    if (t.js) {\n                        p(x, t.js);\n                    };\n                }\n            ;\n            });\n        },\n        log: function() {\n            if (q.logAll) {\n                var r = n(arguments).join(\":\");\n                new i(\"/common/scribe_endpoint.php\", {\n                    c: \"live_sequence\",\n                    m: r\n                }).send();\n            }\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"legacy:live-js\", [\"Live\",], function(a, b, c, d) {\n    a.Live = b(\"Live\");\n}, 3);\n__d(\"PluginLikebox\", [\"AsyncDOM\",\"AsyncRequest\",\"CSS\",\"DOMEvent\",\"DOMEventListener\",\"DOMQuery\",\"PluginLinkshim\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDOM\"), h = b(\"AsyncRequest\"), i = b(\"CSS\"), j = b(\"DOMEvent\"), k = b(\"DOMEventListener\"), l = b(\"DOMQuery\"), m = b(\"PluginLinkshim\"), n = b(\"copyProperties\");\n    function o(p, q) {\n        this.stream_id = p;\n        this.force_wall = q;\n        this.load();\n        m.globalizeLegacySymbol();\n        k.add(l.find(document.body, \".pluginLikeboxStream\"), \"click\", function(r) {\n            var s = new j(r), t = s.target.parentNode;\n            if (i.hasClass(t, \"text_exposed_link\")) {\n                s.kill();\n                i.addClass(l.find(t, \"^.text_exposed_root\"), \"text_exposed\");\n            }\n        ;\n        });\n    };\n    n(o.prototype, {\n        load: function(p) {\n            new h().setMethod(\"GET\").setURI(\"/plugins/likebox/stream\").setData({\n                id: this.stream_id,\n                dom: (p ? \"pluginLikeboxMoreStories\" : \"pluginLikeboxStream\"),\n                force_wall: this.force_wall,\n                nobootload: 1,\n                inlinecss: 1,\n                max_timestamp: p\n            }).setReadOnly(true).setErrorHandler(function() {\n            \n            }).setHandler(this.handleResponse.bind(this)).send();\n        },\n        handleResponse: function(p) {\n            if (p.inlinecss) {\n                var q = document.createElement(\"style\");\n                q.setAttribute(\"type\", \"text/css\");\n                document.getElementsByTagName(\"head\")[0].appendChild(q);\n                if (q.styleSheet) {\n                    q.styleSheet.cssText = p.inlinecss;\n                }\n                 else q.appendChild(document.createTextNode(p.inlinecss));\n            ;\n            }\n        ;\n            g.invoke(p.domops);\n            var r = l.scry(document.body, \"#pluginLikeboxMoreStories a\");\n            if (!r.length) {\n                return\n            };\n            r = r[0];\n            var s = this;\n            k.add(r, \"click\", function(t) {\n                new j(t).kill();\n                s.load(parseInt(r.getAttribute(\"data-timestamp\"), 10));\n                var u = l.find(r.parentNode, \".uiMorePagerLoader\");\n                i.addClass(u, \"uiMorePagerPrimary\");\n                i.removeClass(u, \"uiMorePagerLoader\");\n                i.hide(r);\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFITracking\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\");\n    function h(j) {\n        g.loadModules([\"DOM\",\"collectDataAttributes\",], function(k, l) {\n            j.forEach(function(m) {\n                var n = k.scry(document.body, m);\n                if ((!n || n.link_data)) {\n                    return\n                };\n                var o = l(n, [\"ft\",]).ft;\n                if (Object.keys(o).length) {\n                    var p = k.create(\"input\", {\n                        type: \"hidden\",\n                        name: \"link_data\",\n                        value: JSON.stringify(o)\n                    });\n                    n.appendChild(p);\n                }\n            ;\n            });\n        });\n    };\n    var i = {\n        addAllLinkData: function() {\n            h([\"form.commentable_item\",]);\n        },\n        addAllLinkDataForQuestion: function() {\n            h([\"form.fbEigenpollForm\",\"form.fbQuestionPollForm\",]);\n        }\n    };\n    e.exports = i;\n});\n__d(\"legacy:ufi-tracking-js\", [\"UFITracking\",], function(a, b, c, d) {\n    var e = b(\"UFITracking\");\n    a.ufi_add_all_link_data = e.addAllLinkData;\n    a.question_add_all_link_data = e.addAllLinkDataForQuestion;\n}, 3);");
// 18362
fpc.call(JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_1[0], o7,"s37c4222111f4c78f605ba919a787a2547370b021");
// undefined
o7 = null;
// 18363
geval("if (JSBNG__self.CavalryLogger) {\n    CavalryLogger.start_js([\"WLpRY\",]);\n}\n;\n;\n__d(\"AsyncDOM\", [\"JSBNG__CSS\",\"DOM\",], function(a, b, c, d, e, f) {\n    var g = b(\"JSBNG__CSS\"), h = b(\"DOM\"), i = {\n        invoke: function(j, k) {\n            for (var l = 0; ((l < j.length)); ++l) {\n                var m = j[l], n = m[0], o = m[1], p = m[2], q = m[3], r = ((((p && k)) || null));\n                if (o) {\n                    r = h.scry(((r || JSBNG__document.documentElement)), o)[0];\n                }\n            ;\n            ;\n                switch (n) {\n                  case \"eval\":\n                    (new Function(q)).apply(r);\n                    break;\n                  case \"hide\":\n                    g.hide(r);\n                    break;\n                  case \"show\":\n                    g.show(r);\n                    break;\n                  case \"setContent\":\n                    h.setContent(r, q);\n                    break;\n                  case \"appendContent\":\n                    h.appendContent(r, q);\n                    break;\n                  case \"prependContent\":\n                    h.prependContent(r, q);\n                    break;\n                  case \"insertAfter\":\n                    h.insertAfter(r, q);\n                    break;\n                  case \"insertBefore\":\n                    h.insertBefore(r, q);\n                    break;\n                  case \"remove\":\n                    h.remove(r);\n                    break;\n                  case \"replace\":\n                    h.replace(r, q);\n                    break;\n                  default:\n                \n                };\n            ;\n            };\n        ;\n        }\n    };\n    e.exports = i;\n});\n__d(\"Live\", [\"Arbiter\",\"AsyncDOM\",\"AsyncSignal\",\"ChannelConstants\",\"DataStore\",\"DOM\",\"ServerJS\",\"createArrayFrom\",\"emptyFunction\",], function(a, b, c, d, e, f) {\n    var g = b(\"Arbiter\"), h = b(\"AsyncDOM\"), i = b(\"AsyncSignal\"), j = b(\"ChannelConstants\"), k = b(\"DataStore\"), l = b(\"DOM\"), m = b(\"ServerJS\"), n = b(\"createArrayFrom\"), o = b(\"emptyFunction\");\n    function p(r, s) {\n        s = JSON.parse(JSON.stringify(s));\n        new m().setRelativeTo(r).handle(s);\n    };\n;\n    var q = {\n        logAll: false,\n        startup: function() {\n            q.startup = o;\n            g.subscribe(j.getArbiterType(\"live\"), q.handleMessage.bind(q));\n        },\n        lookupLiveNode: function(r, s) {\n            var t = l.scry(JSBNG__document.body, ((((((\".live_\" + r)) + \"_\")) + s)));\n            t.forEach(function(u) {\n                if (((k.get(u, \"seqnum\") === undefined))) {\n                    var v = JSON.parse(u.getAttribute(\"data-live\"));\n                    k.set(u, \"seqnum\", v.seq);\n                }\n            ;\n            ;\n            });\n            return t;\n        },\n        handleMessage: function(r, s) {\n            var t = s.obj, u = t.fbid, v = t.assoc, w = this.lookupLiveNode(u, v);\n            if (!w) {\n                return false;\n            }\n        ;\n        ;\n            w.forEach(function(x) {\n                if (t.expseq) {\n                    var y = k.get(x, \"seqnum\"), z = k.get(x, \"message_buffer\");\n                    if (((z === undefined))) {\n                        z = {\n                        };\n                        k.set(x, \"message_buffer\", z);\n                    }\n                ;\n                ;\n                    var aa = {\n                        obj: t\n                    };\n                    z[t.expseq] = aa;\n                    if (((t.expseq != y))) {\n                        q.log(\"mismatch\", t.fbid, t.expseq, y);\n                        return false;\n                    }\n                ;\n                ;\n                    while (true) {\n                        y = k.get(x, \"seqnum\");\n                        var ba = z[y];\n                        if (ba) {\n                            h.invoke(ba.obj.updates, x);\n                            if (ba.obj.js) {\n                                p(x, ba.obj.js);\n                            }\n                        ;\n                        ;\n                            q.log(\"seqmatch\", t.fbid, \"exp\", t.expseq, \"cur\", y);\n                            delete z[y];\n                        }\n                         else break;\n                    ;\n                    ;\n                    };\n                ;\n                }\n                 else {\n                    h.invoke(t.updates, x);\n                    if (t.js) {\n                        p(x, t.js);\n                    }\n                ;\n                ;\n                }\n            ;\n            ;\n            });\n        },\n        log: function() {\n            if (q.logAll) {\n                var r = n(arguments).join(\":\");\n                new i(\"/common/scribe_endpoint.php\", {\n                    c: \"live_sequence\",\n                    m: r\n                }).send();\n            }\n        ;\n        ;\n        }\n    };\n    e.exports = q;\n});\n__d(\"legacy:live-js\", [\"Live\",], function(a, b, c, d) {\n    a.Live = b(\"Live\");\n}, 3);\n__d(\"PluginLikebox\", [\"AsyncDOM\",\"AsyncRequest\",\"JSBNG__CSS\",\"DOMEvent\",\"DOMEventListener\",\"DOMQuery\",\"PluginLinkshim\",\"copyProperties\",], function(a, b, c, d, e, f) {\n    var g = b(\"AsyncDOM\"), h = b(\"AsyncRequest\"), i = b(\"JSBNG__CSS\"), j = b(\"DOMEvent\"), k = b(\"DOMEventListener\"), l = b(\"DOMQuery\"), m = b(\"PluginLinkshim\"), n = b(\"copyProperties\");\n    function o(p, q) {\n        this.stream_id = p;\n        this.force_wall = q;\n        this.load();\n        m.globalizeLegacySymbol();\n        k.add(l.JSBNG__find(JSBNG__document.body, \".pluginLikeboxStream\"), \"click\", function(r) {\n            var s = new j(r), t = s.target.parentNode;\n            if (i.hasClass(t, \"text_exposed_link\")) {\n                s.kill();\n                i.addClass(l.JSBNG__find(t, \"^.text_exposed_root\"), \"text_exposed\");\n            }\n        ;\n        ;\n        });\n    };\n;\n    n(o.prototype, {\n        load: function(p) {\n            new h().setMethod(\"GET\").setURI(\"/plugins/likebox/stream\").setData({\n                id: this.stream_id,\n                dom: ((p ? \"pluginLikeboxMoreStories\" : \"pluginLikeboxStream\")),\n                force_wall: this.force_wall,\n                nobootload: 1,\n                inlinecss: 1,\n                max_timestamp: p\n            }).setReadOnly(true).setErrorHandler(function() {\n            \n            }).setHandler(this.handleResponse.bind(this)).send();\n        },\n        handleResponse: function(p) {\n            if (p.inlinecss) {\n                var q = JSBNG__document.createElement(\"style\");\n                q.setAttribute(\"type\", \"text/css\");\n                JSBNG__document.getElementsByTagName(\"head\")[0].appendChild(q);\n                if (q.styleSheet) {\n                    q.styleSheet.cssText = p.inlinecss;\n                }\n                 else q.appendChild(JSBNG__document.createTextNode(p.inlinecss));\n            ;\n            ;\n            }\n        ;\n        ;\n            g.invoke(p.domops);\n            var r = l.scry(JSBNG__document.body, \"#pluginLikeboxMoreStories a\");\n            if (!r.length) {\n                return;\n            }\n        ;\n        ;\n            r = r[0];\n            var s = this;\n            k.add(r, \"click\", function(t) {\n                new j(t).kill();\n                s.load(parseInt(r.getAttribute(\"data-timestamp\"), 10));\n                var u = l.JSBNG__find(r.parentNode, \".uiMorePagerLoader\");\n                i.addClass(u, \"uiMorePagerPrimary\");\n                i.removeClass(u, \"uiMorePagerLoader\");\n                i.hide(r);\n            });\n        }\n    });\n    e.exports = o;\n});\n__d(\"UFITracking\", [\"Bootloader\",], function(a, b, c, d, e, f) {\n    var g = b(\"Bootloader\");\n    function h(j) {\n        g.loadModules([\"DOM\",\"collectDataAttributes\",], function(k, l) {\n            j.forEach(function(m) {\n                var n = k.scry(JSBNG__document.body, m);\n                if (((!n || n.link_data))) {\n                    return;\n                }\n            ;\n            ;\n                var o = l(n, [\"ft\",]).ft;\n                if (Object.keys(o).length) {\n                    var p = k.create(\"input\", {\n                        type: \"hidden\",\n                        JSBNG__name: \"link_data\",\n                        value: JSON.stringify(o)\n                    });\n                    n.appendChild(p);\n                }\n            ;\n            ;\n            });\n        });\n    };\n;\n    var i = {\n        addAllLinkData: function() {\n            h([\"form.commentable_item\",]);\n        },\n        addAllLinkDataForQuestion: function() {\n            h([\"form.fbEigenpollForm\",\"form.fbQuestionPollForm\",]);\n        }\n    };\n    e.exports = i;\n});\n__d(\"legacy:ufi-tracking-js\", [\"UFITracking\",], function(a, b, c, d) {\n    var e = b(\"UFITracking\");\n    a.ufi_add_all_link_data = e.addAllLinkData;\n    a.question_add_all_link_data = e.addAllLinkDataForQuestion;\n}, 3);");
// 18368
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_199[0](o137,false,"http://jsbngssl.static.xx.fbcdn.net/rsrc.php/v2/y_/r/gen4xnT_5g3.js",o197);
// undefined
o137 = null;
// undefined
o197 = null;
// 18402
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 18439
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 18705
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 18710
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_404[0](false);
// 18736
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 19726
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 30138
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 31139
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 31706
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 31724
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 32400
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 32409
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 33351
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 33964
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 37874
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o8,o24);
// undefined
o24 = null;
// 37877
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 41768
o1.readyState = 2;
// 41766
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o8,o26);
// undefined
o26 = null;
// 41772
o1.readyState = 3;
// 41770
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o8,o29);
// undefined
o29 = null;
// 41774
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o8,o31);
// undefined
o31 = null;
// 41780
o1.readyState = 4;
// undefined
o1 = null;
// 41823
o34.toString = f81632121_1344;
// undefined
o34 = null;
// 41831
o35.hasOwnProperty = f81632121_1662;
// undefined
o35 = null;
// 43290
o16.scrollTop = 386;
// undefined
o16 = null;
// 41778
fpc.call(JSBNG_Replay.s0a1060a4e309eb327794aa50fb03bc4e8e002205_286[0], o8,o32);
// undefined
o8 = null;
// undefined
o32 = null;
// 43307
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 46767
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 48389
fpc.call(JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148[0], o21,"JSBNG__onkeydown",o20);
// undefined
o20 = null;
// 48400
JSBNG_Replay.s1406cdb8f82a4497c9e210b291001f76845e62bf_379[0](false);
// 48476
fpc.call(JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148[0], o21,"JSBNG__onkeydown",o28);
// undefined
o28 = null;
// 48564
fpc.call(JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148[0], o21,"JSBNG__onkeydown",o33);
// undefined
o33 = null;
// 48642
fpc.call(JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148[0], o21,"JSBNG__onkeydown",o36);
// undefined
o36 = null;
// 48720
fpc.call(JSBNG_Replay.s745724cb144ffb0314d39065d8a453b0cfbd0f73_148[0], o21,"JSBNG__onkeydown",o39);
// undefined
o21 = null;
// undefined
o39 = null;
// 48728
JSBNG_Replay.s823dd4ac9f5a8b88b4949da5f69e231f14b053b0_235[0](o42);
// undefined
o42 = null;
// 48747
cb(); return null; }
finalize(); })();
