!function e(t, n, r) {
    function i(a, s) {
        if (!n[a]) {
            if (!t[a]) {
                var u = "function" == typeof require && require;
                if (!s && u)
                    return u(a, !0);
                if (o)
                    return o(a, !0);
                var c = new Error("Cannot find module '" + a + "'");
                throw c.code = "MODULE_NOT_FOUND",
                c
            }
            var l = n[a] = {
                exports: {}
            };
            t[a][0].call(l.exports, function(e) {
                var n = t[a][1][e];
                return i(n ? n : e)
            }, l, l.exports, e, t, n, r)
        }
        return n[a].exports
    }
    for (var o = "function" == typeof require && require, a = 0; a < r.length; a++)
        i(r[a]);
    return i
}({
    1: [function(e, t, n) {
        (function(n) {
            "use strict";
            function r() {
                return 100 * Math.random()
            }
            var i = e("./util/logger")
              , o = e("./util/browser")
              , a = new i(n)
              , s = window.MP_AB_TESTS = window.MP_AB_TESTS || {
                initialized: !1,
                init: function(e, t) {
                    if (t = t || {},
                    !this.initialized) {
                        this.initialized = !0,
                        o.valueFromHash("tilegen") && (t.tilegen = 1 === o.valueFromHash("tilegen", 0)),
                        o.valueFromHash("imgopt") && (t.imgopt = 1 === o.valueFromHash("imgopt", 0));
                        for (var n in e) {
                            var i = n.match("^sc_tilegen_([0-9]+)$");
                            i && (s.tilegen = r() < parseInt(i[1]));
                            var u = n.match("^sc_imgopt_([0-9]+)$");
                            u && (s.imgopt = r() < parseInt(u[1]))
                        }
                        for (var c in t)
                            s[c] = t[c],
                            a.debug("A/B override:", c, s[c])
                    }
                },
                changeIfTileGenerating: function(e) {
                    return s.tilegen && (e += e.indexOf("?") === -1 ? "?" : "&",
                    e += "imgopt=1"),
                    e
                },
                changeIfImageOptimzing: function(e) {
                    return s.imgopt && e.indexOf("imgopt=1") === -1 && (e += e.indexOf("?") === -1 ? "?" : "&",
                    e += "imgopt=1"),
                    e
                },
                tilegen: !1,
                imgopt: !1
            };
            t.exports = s
        }
        ).call(this, "/js/ab.js")
    }
    , {
        "./util/browser": 13,
        "./util/logger": 15
    }],
    2: [function(e, t, n) {
        "use strict";
        t.exports = {
            signedUrlDefaultExpireTime: 24e4,
            signedUrlCheckInterval: 1e4,
            signedUrlRefreshBuffer: 15e3,
            dollhouseFOV: 70,
            dollhouseNear: 1,
            dollhouseFar: 5e3,
            insideFOV: 70,
            insideFOVMax: 120,
            insideNear: .1,
            insideFar: 5e3,
            insideLookSpeed: .12,
            insideLookLimitUp: 40,
            insideLookLimitDown: -40,
            orthoNear: 1,
            orthoFar: 5e3,
            orthoBase: 10,
            narrowLandscapeHeight: 290,
            reallyNarrowLandscapeHeight: 250,
            visionTilingStartDate: new Date("8/26/2016"),
            visionTilingStartVersion: "1.1.407.13667",
            windowHeightHighQualityThreshold: 900,
            tourStepDelayDefault: 3500,
            tourStepDelaySlideShow: 5e3,
            workshopApsect: 9 / 16,
            highQualityMaxZoom: 2,
            ultraHighQualityMaxZoom: 3
        }
    }
    , {}],
    3: [function(e, t, n) {
        "use strict";
        t.exports = {
            GL_TEXTURE_CUBE_MAP_POSITIVE_X: 0,
            GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1,
            GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 2,
            GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 3,
            GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 4,
            GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 5
        }
    }
    , {}],
    4: [function(e, t, n) {
        "use strict";
        function r(e) {
            this.message = e
        }
        t.exports = r
    }
    , {}],
    5: [function(e, t, n) {
        "use strict";
        function r(e) {
            i.call(this, e)
        }
        var i = e("./BasicException");
        r.prototype = Object.create(i.prototype),
        t.exports = r
    }
    , {
        "./BasicException": 4
    }],
    6: [function(e, t, n) {
        (function(n) {
            "use strict";
            function r(e) {
                var t = {};
                if (e) {
                    var n = e.flags;
                    if (n)
                        for (var r in n)
                            n.hasOwnProperty(r) && (t[n[r]] = !0);
                    return t
                }
                return u.debug("Feature flags -> parseFeatureFlags: rawData is null."),
                null
            }
            var i = e("./util/ajax")
              , o = e("./util/showcase")
              , a = e("./util/logger")
              //, s = "/api/v1/user/"
			  , s = "/data/"
              , u = new a(n)
              , c = {};
            t.exports = {
                loadFeatureFlags: function(e) {
                    var t = $.Deferred();
                    return i.get(e.urlBase + s, {
                        responseType: "json",
                        prefetchFrom: "user",
                        auth: o.getAuthorizationHeader()
                    }).done(function(e) {
                        c = r(e),
                        c ? t.resolve(c) : t.reject("loading-failed")
                    }).fail(function() {
                        u.debug("Retrieval of feature flags failed."),
                        t.reject("loading-failed")
                    }),
                    t.promise()
                },
                getFlags: function() {
                    return c
                },
                updateDependentSettings: function(e, t) {
                    e = e || c,
                    e.labels && (t.labels.enabled = !0),
                    e.zooming && !t.zoom.forceOff && (t.zoom.enabled = !0),
                    e.showcase_sdk && (t.sdkInit = !0),
                    e.mobile_highq_override && (t.tiling.mobileHighQualityOverride = !0),
                    e.showcase_webvr && (t.vr.allowWebVR = !0),
                    e.uhql && (t.tiling.allowUltraHighResolution = !0),
                    e.hide_sc_sharing && (t.share.enabled = !1)
                }
            }
        }
        ).call(this, "/js/featureflags.js")
    }
    , {
        "./util/ajax": 12,
        "./util/logger": 15,
        "./util/showcase": 17
    }],
    7: [function(e, t, n) {
        (function(t) {
            "use strict";
            function n() {
                if (window.location.hash) {
                    var e = window.location.href.replace(/#model/i, "?m");
                    return e = e.replace(/#m/i, "?m"),
                    window.location.href = e,
                    !0
                }
                return !1
            }
            function r(e) {
                this.sid = e.sid,
                this.urlConfig = e.urlConfig,
                this.urls = new o(this.urlConfig.urlFiles),
                this.urls.init()
            }
            function i(e) {
                var t = a.parseSidUrl(e);
                v.loadFeatureFlags(t).then(function() {
                    w.init(v.getFlags()),
                    new r({
                        sid: e,
                        urlConfig: t
                    }).init()
                })
            }
            var o = e("./util/ModelUrls")
              , a = e("./util/showcase")
              , s = e("./util/ajax")
              , u = e("./util/showcase")
              , c = e("./util/panorama")
              , l = e("./util/browser")
              , h = e("./util/logger")
              , f = e("./tile/TileUtils")
              , p = e("./tile/TileModeValidator")
              , d = e("./util/cameraLight")
              , m = e("./constants")
              , g = e("./util/MathLight")
              , v = e("./featureflags")
              , w = e("./ab")
              , _ = new h(t)
              , E = l.valueFromHash("usetiles", null) || l.valueFromHash("tiles", null)
              , y = {
                quickstart: 1 === l.valueFromHash("qust", 0) || 1 === l.valueFromHash("qs", 0),
                tiles: null !== E ? "1" === E : null
            };
            if (r.prototype.init = function() {
                _.warn("Preheating");
                var e;
                return this.loadModelData().then(function(t) {
                    e = a.normalizeModeldata(t, g)
                }).then(this.urls.init.bind(this.urls)).then(function() {
                    var t, n, r = e.startPano, i = y.tiles === !0 || null === y.tiles && u.modelDataPromisesTiles(e);
                    if (r && r.pano)
                        t = i ? this.loadTiledPanoTextures(r, "high") : this.loadPanoTextures(r.pano.uuid, "high");
                    else if (i) {
                        var o = Object.keys(e.sweeps)[0];
                        this.testSingleTile(o)
                    }
                    return n = s.get(this.urls.get("vision.modeldata"), {
                        responseType: "arraybuffer"
                    }),
                    $.when(n, t)
                }
                .bind(this)).then(function() {
                    _.warn("Done preheating")
                })
            }
            ,
            r.prototype.loadModelData = function() {
                return s.get(this.urlConfig.urlModel, {
                    responseType: "json",
                    prefetchFrom: "model",
                    auth: u.getAuthorizationHeader()
                })
            }
            ,
            r.prototype.loadPanoTextures = function(e, t) {
                var n = c.getCubemapUrls(this.urls, e, t)
                  , r = n.map(function(e) {
                    return s.getImage(e)
                });
                return $.when(r[0], r[1], r[2], r[3], r[4], r[5])
            }
            ,
            r.prototype.loadTiledPanoTextures = function(e) {
                var t = []
                  , n = 1024
                  , r = new g.Matrix4
                  , i = new g.Vector3(0,0,-1);
                r.makeRotationFromQuaternion(e.camera.quaternion),
                r.applyToVector3(i);
                var o = d.getHFOVFromVFOV(m.insideFOV, window.innerWidth, window.innerHeight)
                  , a = m.insideFOV;
                f.matchingTilesInDirection(e.pano, n, i, o, a, t);
                var u = t.map(function(t) {
                    var n = this.urls.get("tiles/" + e.pano.uuid + "/1k_face" + t.face + "_" + t.tileX + "_" + t.tileY + ".jpg");
                    return n = w.changeIfTileGenerating(n),
                    s.getImage(n, 0).fail(function() {
                        p.redirectToNonTiledMode()
                    })
                }
                .bind(this));
                return $.when.apply($, u).done(function() {
                    [0, 1, 2, 3, 4, 5].forEach(function(t) {
                        var n = this.urls.get("tiles/" + e.pano.uuid + "/512_face" + t + "_0_0.jpg");
                        return n = w.changeIfTileGenerating(n),
                        s.getImage(n)
                    }
                    .bind(this))
                }
                .bind(this))
            }
            ,
            r.prototype.testSingleTile = function(e) {
                if (!w.tilegen) {
                    var t = this.urls.get("tiles/" + e + "/1k_face0_0_0.jpg");
                    s.getImage(t, 0).fail(function() {
                        p.redirectToNonTiledMode()
                    })
                }
            }
            ,
            !n()) {
                var b = a.getModelIDFromQueryString();
                b ? i(b) : _.warn("No sid, cannot preheat.")
            }
        }
        ).call(this, "/js/preheater.js")
    }
    , {
        "./ab": 1,
        "./constants": 2,
        "./featureflags": 6,
        "./tile/TileModeValidator": 8,
        "./tile/TileUtils": 9,
        "./util/MathLight": 10,
        "./util/ModelUrls": 11,
        "./util/ajax": 12,
        "./util/browser": 13,
        "./util/cameraLight": 14,
        "./util/logger": 15,
        "./util/panorama": 16,
        "./util/showcase": 17
    }],
    8: [function(e, t, n) {
        "use strict";
        var r = {};
        r.allTilingParameterNames = ["usetiles", "tiles", "maxtileq", "tileoverlay", "tileupdelay", "itiledelay", "maxtpf", "tilecustcomp", "tileprerender"],
        r.redirectToNonTiledMode = function() {
            var e = window.location.href;
            r.allTilingParameterNames.forEach(function(t) {
                e = r.removeURLParameter(e, t)
            }),
            window.location.href = e
        }
        ,
        r.removeURLParameter = function(e, t) {
            var n = new RegExp(t + "=[^$&]*&?");
            return e.replace(n, "")
        }
        ,
        t.exports = r
    }
    , {}],
    9: [function(e, t, n) {
        "use strict";
        var r = e("../enum/GLCubeFaces")
          , i = e("../util/MathLight")
          , o = {};
        o.TILE_SIZE = 512,
        o.FACES_PER_PANO = 6,
        o.LocationOnTile = {
            Center: 0,
            UpperLeft: 1,
            UpperRight: 2,
            LowerRight: 3,
            LowerLeft: 4
        },
        o.getTileVector = function() {
            return function(e, t, n, a, s, u, c, l) {
                u = u || o.LocationOnTile.Center;
                var h = e / t
                  , f = a / h;
                s = -s + (h - 1);
                var p = s / h
                  , d = t / e
                  , m = 2 * d
                  , g = m / 2
                  , v = 2 * f - 1 + g
                  , w = 2 * p - 1 + g;
                switch (u) {
                case o.LocationOnTile.UpperLeft:
                    v -= g,
                    w += g,
                    v += c * m;
                    break;
                case o.LocationOnTile.UpperRight:
                    v += g,
                    w += g,
                    w -= c * m;
                    break;
                case o.LocationOnTile.LowerRight:
                    v += g,
                    w -= g,
                    v -= c * m;
                    break;
                case o.LocationOnTile.LowerLeft:
                    v -= g,
                    w -= g,
                    w += c * m;
                    break;
                case o.LocationOnTile.Center:
                }
                switch (n) {
                case r.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
                    i.setVector(l, -1, w, -v);
                    break;
                case r.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
                    i.setVector(l, 1, w, v);
                    break;
                case r.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
                    i.setVector(l, -v, 1, -w);
                    break;
                case r.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
                    i.setVector(l, -v, -1, w);
                    break;
                case r.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
                    i.setVector(l, -v, w, 1);
                    break;
                case r.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
                    i.setVector(l, v, w, -1)
                }
                i.normalize(l)
            }
        }(),
        o.getFaceForTile = function(e, t) {
            var n = o.TILE_SIZE;
            e < o.TILE_SIZE && (n = e);
            var r = Math.floor(e / n)
              , i = r * r;
            return Math.floor(t / i)
        }
        ,
        o.getTileLocation = function(e, t, n) {
            var r = o.TILE_SIZE;
            e < o.TILE_SIZE && (r = e);
            var i = o.getFaceForTile(e, t)
              , a = Math.floor(e / r)
              , s = a * a
              , u = t - i * s;
            n.tileX = u % a,
            n.tileY = Math.floor(u / a),
            n.face = i,
            n.faceTileIndex = u
        }
        ,
        o.getTileCountForSize = function(e) {
            if (e <= o.TILE_SIZE)
                return o.FACES_PER_PANO;
            var t = Math.floor(e / o.TILE_SIZE)
              , n = t * t
              , r = n * o.FACES_PER_PANO;
            return r
        }
        ,
        o.getRelativeDirection = function() {
            var e = new i.Matrix4
              , t = new i.Quaternion;
            return function(n, r) {
                t.copy(n),
                t.inverse(),
                e.makeRotationFromQuaternion(t),
                e.applyToVector3(r),
                i.normalize(r)
            }
        }(),
        o.matchingTilesInDirection = function() {
            var e = new i.Vector3
              , t = new i.Vector3(0,0,-1)
              , n = new i.Quaternion
              , r = function(e, t) {
                e.push({
                    face: t.face,
                    faceTileIndex: t.faceTileIndex,
                    tileX: t.tileX,
                    tileY: t.tileY
                })
            }
              , a = function() {
                var e = {
                    face: -1,
                    faceTileIndex: -1,
                    tileX: -1,
                    tileY: -1
                };
                return function(t, n, i) {
                    for (var a = o.getTileCountForSize(t), s = 0, u = 0; u < a; u++)
                        o.getTileLocation(t, u, e),
                        n && !n(e) || (s++,
                        i && r(i, e));
                    return s
                }
            }();
            return function(r, s, u, c, l, h) {
                var f = s < o.TILE_SIZE ? s : o.TILE_SIZE;
                o.getTileCountForSize(s);
                if (!c && !l)
                    return a(s, null, h);
                var p = !!l;
                if (l = l || c,
                l = Math.max(0, Math.min(l, 360)),
                c = Math.max(0, Math.min(c, 360)),
                i.copyVector(u, e),
                o.getRelativeDirection(r.quaternion, e),
                p) {
                    n.setFromUnitVectors(e, t);
                    var d = function(e) {
                        return o.isTileWithinFrustum(s, f, e.face, e.tileX, e.tileY, n, c, l)
                    };
                    return a(s, d, h)
                }
                var m = function(t) {
                    return o.isTileWithinFOV(s, f, t.face, t.tileX, t.tileY, e, c)
                };
                return a(s, m, h)
            }
        }(),
        o.isTileWithinFrustum = function() {
            var e = new i.Vector3
              , t = 1e-5;
            return function(n, r, a, s, u, c, l, h) {
                for (var f = Math.tan(.5 * h * i.RADIANS_PER_DEGREE), p = -f, d = Math.tan(.5 * l * i.RADIANS_PER_DEGREE), m = -d, g = o.mapFaceToCubemapFace(a), v = 0, w = 0, _ = 0, E = 0, y = 0, b = 0, T = o.LocationOnTile.Center; T <= o.LocationOnTile.LowerLeft; T++)
                    if (o.getTileVector(n, r, g, s, u, T, 0, e),
                    i.applyQuaternionToVector(c, e),
                    e.z >= -t)
                        y++;
                    else {
                        var x = -1 / e.z
                          , A = e.x * x
                          , R = e.y * x;
                        R > f ? v++ : R < p && w++,
                        A > d ? _++ : A < m && E++,
                        b++
                    }
                return w !== b && v !== b && _ !== b && E !== b
            }
        }(),
        o.isTileWithinFOV = function() {
            var e = new i.Vector3
              , t = new i.Vector3(0,1,0)
              , n = new i.Vector3(1,0,0);
            return function(r, a, s, u, c, l, h) {
                var f = o.mapFaceToCubemapFace(s);
                if (i.cross(l, t, n),
                o.getTileVector(r, a, f, u, c, o.LocationOnTile.Center, 0, e),
                o.isWithinFOV(e, l, h, null))
                    return !0;
                for (var p = h / 360, d = Math.floor(1 / p), m = 0, g = 0; g < d; g++) {
                    for (var v = o.LocationOnTile.UpperLeft; v <= o.LocationOnTile.LowerLeft; v++)
                        if (o.getTileVector(r, a, f, u, c, v, m, e),
                        o.isWithinFOV(e, l, h, null))
                            return !0;
                    m += p
                }
                return !1
            }
        }(),
        o.isWithinFOV = function() {
            var e = new i.Vector3
              , t = new i.Vector3;
            return function(n, r, o, a) {
                if (i.copyVector(n, t),
                a) {
                    i.copyVector(a, e),
                    i.normalize(e);
                    var s = i.dot(e, n);
                    e.x *= s,
                    e.y *= s,
                    e.z *= s,
                    i.subVector(t, e)
                }
                var u = o / 2 * i.RADIANS_PER_DEGREE
                  , c = Math.cos(u)
                  , l = i.dot(t, r);
                return l >= c
            }
        }(),
        o.mapFaceToCubemapFace = function() {
            var e = {
                0: r.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
                1: r.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
                2: r.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
                3: r.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
                4: r.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
                5: r.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
            };
            return function(t) {
                return e[t]
            }
        }(),
        t.exports = o
    }
    , {
        "../enum/GLCubeFaces": 3,
        "../util/MathLight": 10
    }],
    10: [function(e, t, n) {
        "use strict";
        var r = e("../constants")
          , i = {};
        i.RADIANS_PER_DEGREE = Math.PI / 180,
        i.DEGREES_PER_RADIAN = 180 / Math.PI,
        i.Vector3 = function(e, t, n) {
            this.x = e || 0,
            this.y = t || 0,
            this.z = n || 0
        }
        ,
        i.Matrix4 = function() {
            this.elements = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
            arguments.length > 0 && console.error("MathLight.Matrix4: the constructor no longer reads arguments. use .set() instead.")
        }
        ,
        i.Matrix4.prototype = {
            identity: function() {
                return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
                this
            },
            copy: function(e) {
                return this.elements.set(e.elements),
                this
            },
            applyToVector3: function(e) {
                var t = e.x
                  , n = e.y
                  , r = e.z
                  , i = this.elements;
                return e.x = i[0] * t + i[4] * n + i[8] * r + i[12],
                e.y = i[1] * t + i[5] * n + i[9] * r + i[13],
                e.z = i[2] * t + i[6] * n + i[10] * r + i[14],
                this
            },
            getInverse: function(e, t) {
                var n = this.elements
                  , r = e.elements
                  , i = r[0]
                  , o = r[1]
                  , a = r[2]
                  , s = r[3]
                  , u = r[4]
                  , c = r[5]
                  , l = r[6]
                  , h = r[7]
                  , f = r[8]
                  , p = r[9]
                  , d = r[10]
                  , m = r[11]
                  , g = r[12]
                  , v = r[13]
                  , w = r[14]
                  , _ = r[15]
                  , E = p * w * h - v * d * h + v * l * m - c * w * m - p * l * _ + c * d * _
                  , y = g * d * h - f * w * h - g * l * m + u * w * m + f * l * _ - u * d * _
                  , b = f * v * h - g * p * h + g * c * m - u * v * m - f * c * _ + u * p * _
                  , T = g * p * l - f * v * l - g * c * d + u * v * d + f * c * w - u * p * w
                  , x = i * E + o * y + a * b + s * T;
                if (0 === x) {
                    var A = "MathLight.Matrix4.getInverse(): can't invert matrix, determinant is 0";
                    if (t)
                        throw new Error(A);
                    return console.warn(A),
                    this.identity()
                }
                var R = 1 / x;
                return n[0] = E * R,
                n[1] = (v * d * s - p * w * s - v * a * m + o * w * m + p * a * _ - o * d * _) * R,
                n[2] = (c * w * s - v * l * s + v * a * h - o * w * h - c * a * _ + o * l * _) * R,
                n[3] = (p * l * s - c * d * s - p * a * h + o * d * h + c * a * m - o * l * m) * R,
                n[4] = y * R,
                n[5] = (f * w * s - g * d * s + g * a * m - i * w * m - f * a * _ + i * d * _) * R,
                n[6] = (g * l * s - u * w * s - g * a * h + i * w * h + u * a * _ - i * l * _) * R,
                n[7] = (u * d * s - f * l * s + f * a * h - i * d * h - u * a * m + i * l * m) * R,
                n[8] = b * R,
                n[9] = (g * p * s - f * v * s - g * o * m + i * v * m + f * o * _ - i * p * _) * R,
                n[10] = (u * v * s - g * c * s + g * o * h - i * v * h - u * o * _ + i * c * _) * R,
                n[11] = (f * c * s - u * p * s - f * o * h + i * p * h + u * o * m - i * c * m) * R,
                n[12] = T * R,
                n[13] = (f * v * a - g * p * a + g * o * d - i * v * d - f * o * w + i * p * w) * R,
                n[14] = (g * c * a - u * v * a - g * o * l + i * v * l + u * o * w - i * c * w) * R,
                n[15] = (u * p * a - f * c * a + f * o * l - i * p * l - u * o * d + i * c * d) * R,
                this
            },
            makeRotationFromQuaternion: function(e) {
                var t = this.elements
                  , n = e.x
                  , r = e.y
                  , i = e.z
                  , o = e.w
                  , a = n + n
                  , s = r + r
                  , u = i + i
                  , c = n * a
                  , l = n * s
                  , h = n * u
                  , f = r * s
                  , p = r * u
                  , d = i * u
                  , m = o * a
                  , g = o * s
                  , v = o * u;
                return t[0] = 1 - (f + d),
                t[4] = l - v,
                t[8] = h + g,
                t[1] = l + v,
                t[5] = 1 - (c + d),
                t[9] = p - m,
                t[2] = h - g,
                t[6] = p + m,
                t[10] = 1 - (c + f),
                t[3] = 0,
                t[7] = 0,
                t[11] = 0,
                t[12] = 0,
                t[13] = 0,
                t[14] = 0,
                t[15] = 1,
                this
            }
        },
        i.Quaternion = function(e, t, n, r) {
            this._x = e || 0,
            this._y = t || 0,
            this._z = n || 0,
            this._w = void 0 !== r ? r : 1
        }
        ,
        i.Quaternion.prototype = {
            get x() {
                return this._x
            },
            set x(e) {
                this._x = e
            },
            get y() {
                return this._y
            },
            set y(e) {
                this._y = e
            },
            get z() {
                return this._z
            },
            set z(e) {
                this._z = e
            },
            get w() {
                return this._w
            },
            set w(e) {
                this._w = e
            },
            copy: function(e) {
                this._x = e.x,
                this._y = e.y,
                this._z = e.z,
                this._w = e.w
            },
            inverse: function() {
                return this.conjugate().normalize()
            },
            conjugate: function() {
                return this._x *= -1,
                this._y *= -1,
                this._z *= -1,
                this
            },
            length: function() {
                return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w)
            },
            normalize: function() {
                var e = this.length();
                return 0 === e ? (this._x = 0,
                this._y = 0,
                this._z = 0,
                this._w = 1) : (e = 1 / e,
                this._x = this._x * e,
                this._y = this._y * e,
                this._z = this._z * e,
                this._w = this._w * e),
                this
            },
            setFromAxisAngle: function(e, t) {
                var n = t / 2
                  , r = Math.sin(n);
                return this._x = e.x * r,
                this._y = e.y * r,
                this._z = e.z * r,
                this._w = Math.cos(n),
                this
            },
            setFromUnitVectors: function() {
                var e, t, n = 1e-6;
                return function(r, o) {
                    return void 0 === e && (e = new i.Vector3),
                    t = i.dot(r, o) + 1,
                    t < n ? (t = 0,
                    Math.abs(r.x) > Math.abs(r.z) ? i.setVector(e, -r.y, r.x, 0) : i.setVector(e, 0, -r.z, r.y)) : i.cross(r, o, e),
                    this._x = e.x,
                    this._y = e.y,
                    this._z = e.z,
                    this._w = t,
                    this.normalize()
                }
            }(),
            multiply: function(e) {
                return this.multiplyQuaternions(this, e)
            },
            premultiply: function(e) {
                return this.multiplyQuaternions(e, this)
            },
            multiplyQuaternions: function(e, t) {
                var n = e._x
                  , r = e._y
                  , i = e._z
                  , o = e._w
                  , a = t._x
                  , s = t._y
                  , u = t._z
                  , c = t._w;
                return this._x = n * c + o * a + r * u - i * s,
                this._y = r * c + o * s + i * a - n * u,
                this._z = i * c + o * u + n * s - r * a,
                this._w = o * c - n * a - r * s - i * u,
                this
            }
        },
        i.convertWorkshopVector = function(e) {
            return new i.Vector3(-e.x,e.y,e.z)
        }
        ,
        i.convertWorkshopQuaternion = function(e) {
            return new i.Quaternion(-e.x,e.y,e.z,-e.w).multiply(new i.Quaternion(Math.sqrt(2) / 2,Math.sqrt(2) / 2,0,0))
        }
        ;
        i.convertWorkshopOrthoZoom = function(e) {
            return e === -1 ? -1 : e / 16 * (window.innerWidth / window.innerHeight) / r.workshopApsect
        }
        ,
        i.convertWorkshopPanoramaQuaternion = function(e) {
            return new i.Quaternion(e.x,-e.y,-e.z,e.w).normalize().multiply((new i.Quaternion).setFromAxisAngle(new i.Vector3(0,1,0), 270 * i.RADIANS_PER_DEGREE))
        }
        ,
        i.normalize = function(e) {
            var t = e.x * e.x + e.y * e.y + e.z * e.z
              , n = Math.sqrt(t);
            e.x /= n,
            e.y /= n,
            e.z /= n
        }
        ,
        i.dot = function(e, t) {
            return e.x * t.x + e.y * t.y + e.z * t.z
        }
        ,
        i.cross = function(e, t, n) {
            var r = e.x
              , i = e.y
              , o = e.z;
            n.x = i * t.z - o * t.y,
            n.y = o * t.x - r * t.z,
            n.z = r * t.y - i * t.x
        }
        ,
        i.setVector = function(e, t, n, r) {
            e.x = t,
            e.y = n,
            e.z = r
        }
        ,
        i.copyVector = function(e, t) {
            t.x = e.x,
            t.y = e.y,
            t.z = e.z
        }
        ,
        i.addVector = function(e, t) {
            e.x += t.x,
            e.y += t.y,
            e.z += t.z
        }
        ,
        i.subVector = function(e, t) {
            e.x -= t.x,
            e.y -= t.y,
            e.z -= t.z
        }
        ,
        i.applyQuaternionToVector = function(e, t) {
            var n = t.x
              , r = t.y
              , i = t.z
              , o = e.x
              , a = e.y
              , s = e.z
              , u = e.w
              , c = u * n + a * i - s * r
              , l = u * r + s * n - o * i
              , h = u * i + o * r - a * n
              , f = -o * n - a * r - s * i;
            t.x = c * u + f * -o + l * -s - h * -a,
            t.y = l * u + f * -a + h * -o - c * -s,
            t.z = h * u + f * -s + c * -a - l * -o
        }
        ,
        i.angleBetweenVectors = function(e, t) {
            return Math.acos(i.dot(e, t))
        }
        ,
        t.exports = i
    }
    , {
        "../constants": 2
    }],
    11: [function(e, t, n) {
        (function(n) {
            "use strict";
            function r(e) {
                this.cache = null,
                this.expires = 0
            }
            function i() {
                this.baseUrl = null,
                this.cache = null,
                this.expires = 0
            }
            function o() {
                this.baseUrl = null,
                this.expires = 0
            }
            function a(e) {
                this.initialLoadingPromise = null,
                this.endpoint = e + "?type=3",
                this.urlContainer = null,
                this.authorizationHeader = l.getAuthorizationHeader(),
                this.containerClasses = [o, i, r]
            }
            var s = e("./ajax")
              , u = e("./logger")
              , c = e("../constants")
              , l = e("./showcase")
              , h = (e("../ab"),
            new u(n));
            r.prototype = {
                version: 1,
                validate: function(e) {
                    return "catalog.json"in e && Object.keys(e).length > 0
                },
                update: function(e) {
                    return this.cache = e,
                    this.expires = Date.now() + c.signedUrlDefaultExpireTime,
                    $.when()
                },
                get: function(e) {
                    return this.cache[e]
                }
            },
            i.prototype = {
                version: 2,
                validate: function(e) {
                    return "catalog.json"in e && "base.url"in e && Object.keys(e).length > 1
                },
                update: function(e) {
                    return this.baseUrl = e["base.url"],
                    this.cache = e,
                    this.expires = Date.now() + c.signedUrlDefaultExpireTime,
                    $.when()
                },
                get: function(e) {
                    var t = this.cache[e];
                    return t ? this.baseUrl.replace("{{filename}}", e) + t : null
                }
            },
            o.prototype = {
                version: 3,
                validate: function(e) {
                    return e.templates && e.catalog_file && (!e.expires || 1e3 * e.expires > Date.now())
                },
                update: function(e) {
					e.templates[0] = e.templates[0].replace("{{number}}",window.number);
                    return this.baseUrl = e.templates[0],
                    e.expires ? this.expires = 1e3 * e.expires : this.expires = Date.now() + c.signedUrlDefaultExpireTime,
                    $.when()
                },
                get: function(e) {
                    return this.baseUrl.replace("{{filename}}", e)
                }
            },
            a.prototype = {
                init: function() {
                    return this.initialLoadingPromise ? this.initialLoadingPromise : (setInterval(function() {
                        var e = this.urlContainer ? this.urlContainer.expires : Date.now();
                        Date.now() + c.signedUrlRefreshBuffer > e && (h.debug("Refreshing urls..."),
                        this.refresh().done(function() {
                            h.debug("Refreshed")
                        }).fail(function() {
                            h.error("Failed url refresh, urls might go stale soon")
                        }))
                    }
                    .bind(this), c.signedUrlCheckInterval),
                    this.initialLoadingPromise = this.refresh(),
                    this.initialLoadingPromise)
                },
                refresh: function(e) {
                    e = e || {};
                    var t = void 0 === e.cache || e.cache;
                    return s.get(this.endpoint, {
                        responseType: "json",
                        prefetchFrom: t ? "files" : null,
                        cache: t,
                        auth: this.authorizationHeader
                    }).then(function(e) {
                        if (this.urlContainer && this.urlContainer.validate(e))
                            return this.urlContainer.update(e);
                        for (var n = 0; n < this.containerClasses.length; n++) {
                            var r = this.containerClasses[n]
                              , i = new r;
                            if (i.validate(e))
                                return h.info("Using urls version " + i.version),
                                this.urlContainer = i,
                                this.urlContainer.update(e)
                        }
                        return t ? this.refresh({
                            cache: !1
                        }) : $.Deferred().reject("missing-urls")
                    }
                    .bind(this), function(e) {
                        return "loading-failed"
                    })
                },
                get: function(e) {
                    return this.urlContainer.get(e)
                }
            },
            t.exports = a
        }
        ).call(this, "/js/util/ModelUrls.js")
    }
    , {
        "../ab": 1,
        "../constants": 2,
        "./ajax": 12,
        "./logger": 15,
        "./showcase": 17
    }],
    12: [function(e, t, n) {
        (function(n) {
            "use strict";
            function r(e, t, n) {
                var r = new XMLHttpRequest;
                if (n && "withCredentials"in r)
                    r.open(e, t, n);
                else if ("undefined" != typeof XDomainRequest)
                    r = new XDomainRequest,
                    r.open(e, t);
                else {
                    if (n)
                        throw "Browser does not support CORS!";
                    r.open(e, t)
                }
                return r
            }
            function i(e, t, n) {
                function o() {
                    h.warn("Retrying ", t),
                    i(e, t, n).done(c.resolve.bind(c)).progress(c.notify.bind(c)).fail(c.reject.bind(c))
                }
                function a(e, t) {
                    var n = e.response;
                    if ("json" === t && "object" != typeof n)
                        try {
                            n = JSON.parse(e.responseText)
                        } catch (e) {
                            return void c.reject({
                                error: "Failed parsing JSON"
                            })
                        }
                    else if ("image/jpeg" === t) {
                        var r = new Uint8Array(e.response)
                          , i = new Blob([r],{
                            type: "image/jpeg"
                        })
                          , o = URL.createObjectURL(i);
                        n = new Image,
                        n.src = o,
                        n.crossOrigin = "Anonymous",
                        n.onload = function() {
                            URL.revokeObjectURL(o)
                        }
                    }
                    return n
                }
                var s = r(e, t, !1);
                if (n = n || {},
                n.retries = void 0 !== n.retries ? n.retries : 0,
                n.retry = void 0 !== n.retry ? n.retry : "get" === e.toLowerCase(),
                n.responseType)
                    if (["arraybuffer", "text", "json"].indexOf(n.responseType) > -1)
                        s.responseType = n.responseType;
                    else {
                        if ("image/jpeg" !== n.responseType)
                            throw new Error('reponseType can only be one of "arraybuffer", "text" or "json", "image/jpeg"');
                        s.responseType = "arraybuffer"
                    }
                if ("json" === n.responseType && s.setRequestHeader("Accept", "application/json"),
                n.auth && s.setRequestHeader("Authorization", n.auth),
                "object" == typeof n.data && (n.data = JSON.stringify(n.data),
                s.setRequestHeader("Content-Type", "application/json")),
                "object" == typeof n.headers)
                    for (var u in n.headers)
                        s.setRequestHeader(u, n.headers[u]);
                var c = $.Deferred();
                return s.onreadystatechange = function(e) {
                    if (4 === this.readyState)
                        if (this.status >= 500 && this.status <= 600 && n.retry && n.retries < 3)
                            n.retries++,
                            setTimeout(o, 1e3);
                        else if (200 === this.status) {
                            var t = a(this, n.responseType);
                            c.resolve(t)
                        } else
                            c.reject(this)
                }
                ,
                s.onprogress = function(e) {
                    c.notify(e)
                }
                ,
                s.send(n.data),
                c.promise()
            }
            function o(e) {
                return Object.keys(e).sort().map(function(t) {
                    return {
                        key: t,
                        value: e[t]
                    }
                })
            }
            function a(e, t) {
                var n = t.responseType || null
                  , r = t.auth || null
                  , i = t.prefetchFrom || null
                  , a = e + "__" + n + "__" + r + "__" + i;
                return t.headers && o(t.headers).forEach(function(e) {
                    a += "__" + e.key + ":" + e.value
                }),
                a
            }
            function s(e, t) {
                return window.MP_REQUEST_CACHE ? window.MP_REQUEST_CACHE[a(e, t)] : null
            }
            function u(e, t, n) {
                window.MP_REQUEST_CACHE && (window.MP_REQUEST_CACHE[a(e, t)] = n)
            }
            var c = e("./logger")
              , l = e("../ab")
              , h = new c(n);
            window.URL = window.URL || window.webkitURL,
            window.MP_REQUEST_CACHE = window.MP_REQUEST_CACHE || {},
            window.MP_PREFETCHED_MODELDATA = window.MP_PREFETCHED_MODELDATA || {},
            setTimeout(function() {
                window.MP_REQUEST_CACHE = null,
                window.MP_PREFETCHED_MODELDATA = {}
            }, 6e4),
            window.onpageshow = function(e) {
                e.persisted && (window.MP_REQUEST_CACHE = null,
                window.MP_PREFETCHED_MODELDATA = {})
            }
            ,
            t.exports = {
                get: function(e, t) {
                    t = t || {};
                    var n = void 0 === t.cache || t.cache;
                    if (n) {
                        var r = s(e, t);
                        if (r)
                            return r
                    }
                    var o;
                    return o = t.prefetchFrom && window.MP_PREFETCHED_MODELDATA[t.prefetchFrom] ? $.when(window.MP_PREFETCHED_MODELDATA[t.prefetchFrom]) : i("GET", e, t),
                    n && u(e, t, o),
                    o
                },
                post: function(e, t) {
                    return i("POST", e, t)
                },
                patch: function(e, t) {
                    return i("PATCH", e, t)
                },
                getImage: function(e, t) {
                    function n() {
                        h.warn("Retrying ", e),
                        o.getImage(e, t - 1).done(r.resolve.bind(r)).progress(r.notify.bind(r)).fail(r.reject.bind(r))
                    }
                    var r = $.Deferred()
                      , i = new Image
                      , o = this;
                    return e = l.changeIfImageOptimzing(e),
                    null !== t && void 0 !== t || (t = 3),
                    i.onerror = function() {
                        t > 0 ? setTimeout(n, 1e3) : r.reject()
                    }
                    ,
                    i.onload = function() {
                        r.resolve(i)
                    }
                    ,
                    i.crossOrigin = "anonymous",
                    i.src = e,
                    r
                }
            }
        }
        ).call(this, "/js/util/ajax.js")
    }
    , {
        "../ab": 1,
        "./logger": 15
    }],
    13: [function(e, t, n) {
        "use strict";
        function r(e, t) {
            var n = window.navigator.userAgent
              , r = n.match(e);
            return r = r ? r[1].split(t) : [],
            {
                major: parseInt(r[0]) || 0,
                minor: parseInt(r[1]) || 0,
                patch: parseInt(r[2]) || 0
            }
        }
        var i = e("../exception/DeviceMismatchException");
        t.exports = {
            isFullscreen: function() {
                return document.fullscreenElement || document.mozFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement
            },
            supportsFullscreen: function() {
                return document.fullscreenEnabled || document.mozFullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled
            },
            isPointerLocked: function() {
                return document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement
            },
            requestFullscreen: function(e, t) {
                e.requestFullscreen ? e.requestFullscreen() : e.mozRequestFullScreen ? e.mozRequestFullScreen() : e.webkitRequestFullscreen ? e.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) : e.msRequestFullscreen && e.msRequestFullscreen(),
                t && $(document).on("fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange", browser.requestPointerLock)
            },
            requestPointerLock: function() {
                var e;
                if (document.fullscreenElement)
                    e = document.fullscreenElement();
                else if (document.mozFullscreenElement)
                    e = document.mozFullscreenElement();
                else if (document.mozFullScreenElement)
                    e = document.mozFullScreenElement();
                else {
                    if (!document.webkitFullscreenElement)
                        return;
                    e = document.webkitFullscreenElement()
                }
                e.requestPointerLock = e.requestPointerLock || e.mozRequestPointerLock || e.webkitRequestPointerLock,
                e.requestPointerLock(),
                $(document).off("fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange", this)
            },
            exitPointerLock: function() {
                document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock,
                document.exitPointerLock()
            },
            exitFullscreen: function() {
                document.exitFullscreen ? document.exitFullscreen() : document.msExitFullscreen ? document.msExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.webkitExitFullscreen && document.webkitExitFullscreen()
            },
            details: function() {
                var e = navigator.userAgent.match("(Firefox|Chrome|Safari)/([\\d]+)");
                return e ? {
                    name: e[1],
                    version: parseInt(e[2]),
                    platform: navigator.platform
                } : {}
            },
            is: function(e) {
                return this.details() && this.details().name === e
            },
            inIframe: function() {
                return window.parent !== window
            },
            aspectRatio: function() {
                var e = window.innerWidth / window.innerHeight;
                return isFinite(e) ? e : 0
            },
            userAgent: function() {
                return window.navigator.userAgent
            },
            isMobile: function() {
                var e = navigator.userAgent || navigator.vendor || window.opera;
                return /(android|bb\d+|meego).+mobile|android|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0, 4))
            },
            isLandscape: function() {
                return this.isMobile && this.aspectRatio() > 1
            },
            isSmallScreen: function() {
                var e = screen.width / window.devicePixelRatio;
                return e < 240
            },
            detectIE: function() {
                var e = window.navigator.userAgent
                  , t = e.indexOf("MSIE ");
                return t !== -1 || !!navigator.userAgent.match(/Trident.*rv\:11\./)
            },
            detectSafari: function() {
                var e = window.navigator.userAgent
                  , t = e.indexOf("Safari");
                return t !== -1 && !this.detectChrome()
            },
            detectFirefox: function() {
                var e = window.navigator.userAgent;
                return e.indexOf("Firefox") !== -1
            },
            detectChrome: function() {
                var e = window.navigator.userAgent;
                return e.indexOf("Chrome") !== -1 && !this.detectOpera()
            },
            detectOpera: function() {
                var e = window.navigator.userAgent;
                return e.indexOf("OPR") !== -1
            },
            detectIOS: function() {
                return this.detectIPhone() || this.detectIPad() || this.detectIPod()
            },
            detectIPad: function() {
                var e = window.navigator.userAgent
                  , t = /iPad/;
                return t.test(e)
            },
            detectIPod: function() {
                var e = window.navigator.userAgent
                  , t = /iPod/;
                return t.test(e)
            },
            detectIPhone: function() {
                var e = window.navigator.userAgent
                  , t = /iPhone/;
                return t.test(e)
            },
            detectAndroid: function() {
                var e = window.navigator.userAgent;
                return e.indexOf("Android") !== -1
            },
            detectAndroidMobile: function() {
                var e = window.navigator.userAgent;
                return this.detectAndroid() && e.indexOf("Mobile") !== -1
            },
            detectSamsungNative: function() {
                var e = window.navigator.userAgent;
                return e.indexOf("SM-G900H") !== -1 || e.indexOf("GT-I9500") !== -1 || e.indexOf("SM-N900") !== -1
            },
            detectSamsungS6: function() {
                var e = window.navigator.userAgent;
                return e.indexOf("SM-G92") !== -1
            },
            detectWebVR: function() {
                return !(!window.navigator.getVRDisplays || !window.VRDisplay)
            },
            getVRDisplay: function() {
                var e = $.Deferred();
                return this.detectWebVR() ? (navigator.getVRDisplays().then(function(t) {
                    t.length >= 1 && e.resolve(t[0]),
                    e.reject(null)
                }),
                e) : e.reject(null)
            },
            iosVersion: function() {
                if (!this.detectIOS())
                    throw new i("Did not detect an iDevice");
                var e = /((?:\d+\_?){1,3}) like Mac OS/
                  , t = "_";
                return r(e, t)
            },
            androidVersion: function() {
                if (!this.detectAndroid())
                    throw new i("Did not detect an Android based device");
                var e = /Android ((?:\d+\.?){1,3})/
                  , t = ".";
                return r(e, t)
            },
            valueFromCookie: function(e, t) {
                var n = new RegExp(e + "=([0-9a-f]+)(; ?|$)").exec(document.cookie);
                if (!n)
                    return t;
                var r = n[1];
                return "boolean" == typeof t ? "true" === r || "1" === r : "number" == typeof t ? parseFloat(r) : r
            },
            valueFromHash: function(e, t) {
                var n = new RegExp("[#&?]" + e + "=([^#&?]*)")
                  , r = n.exec(window.location.href);
                if (!r)
                    return t;
                var i = r[1];
                return "boolean" == typeof t ? "true" === i || "1" === i : "number" == typeof t ? parseFloat(i) : window.decodeURIComponent(i)
            }
        }
    }
    , {
        "../exception/DeviceMismatchException": 5
    }],
    14: [function(e, t, n) {
        "use strict";
        function r(e, t, n) {
            return o(e.fov, t, n)
        }
        var i = e("./MathLight")
          , o = function(e, t, n) {
            var r = t
              , o = n
              , a = 2 * Math.atan(Math.tan(e * i.RADIANS_PER_DEGREE / 2) * (r / o)) * i.DEGREES_PER_RADIAN;
            return a
        }
          , a = function(e, t, n) {
            var r = t
              , o = n
              , a = 2 * Math.atan(Math.tan(e * i.RADIANS_PER_DEGREE / 2) * (o / r)) * i.DEGREES_PER_RADIAN;
            return a
        }
          , s = function(e, t, n, r) {
            var i = o(e, n, r);
            return i > t ? a(t, n, r) : e
        };
        t.exports = {
            clampVFOV: s,
            getHFOVForCamera: r,
            getHFOVFromVFOV: o,
            getVFOVFromHFOV: a
        }
    }
    , {
        "./MathLight": 10
    }],
    15: [function(e, t, n) {
        "use strict";
        function r(e) {
            var t, n, o, a, s = e.split("/"), u = "[" + s[s.length - 1].replace(".js", "") + "]", c = {};
            if (r.consoleEnabled) {
                var l = function(e) {
                    $("#debug-console").append("<p>" + e + "</p>"),
                    $("#debug-console")[0].scrollTop = $("#debug-console")[0].scrollHeight
                };
                t = function(e) {
                    l(Array.prototype.slice.call(arguments).join(" "))
                }
                ,
                n = function(e) {
                    l(Array.prototype.slice.call(arguments).join(" "))
                }
                ,
                o = function(e) {
                    l("WARN: " + Array.prototype.slice.call(arguments).join(" "))
                }
                ,
                a = function(e) {
                    l("ERROR: " + Array.prototype.slice.call(arguments).join(" "))
                }
            } else
                console.log ? (t = console.log,
                n = console.info ? console.info : console.log,
                o = console.warn ? console.warn : console.log,
                a = console.error ? console.error : console.log) : t = n = o = a = function() {}
                ;
            var h = function(e) {
                return [u, r.timestamp()].concat(Array.prototype.slice.call(e))
            }
              , f = function(t, n) {
                if (i) {
                    var o = Array.prototype.slice.call(t).join(" ");
                    i.captureMessage(o, {
                        level: n,
                        path: e,
                        timestamp: r.timestamp()
                    })
                }
            }
              , p = function(t, n) {
                if (i) {
                    var o = Array.prototype.slice.call(t).join(" ");
                    i.captureException(new Error(o), {
                        level: n,
                        path: e,
                        timestamp: r.timestamp()
                    })
                }
            };
            return {
                debug: function() {
                    r.level >= r.levels.debug && t.apply(console, h(arguments))
                },
                info: function() {
                    r.level >= r.levels.info && n.apply(console, h(arguments))
                },
                warn: function() {
                    f(arguments, "warn"),
                    r.level >= r.levels.warn && o.apply(console, h(arguments))
                },
                error: function() {
                    p(arguments, "error"),
                    r.level >= r.levels.error && a.apply(console, h(arguments))
                },
                v3str: function(e, t) {
                    var n = void 0 === t ? 2 : t;
                    return "(" + e.x.toPrecision(n) + ", " + e.y.toPrecision(n) + ", " + e.z.toPrecision(n) + ")"
                },
                eulstr: function(e, t) {
                    var n = void 0 === t ? 2 : t;
                    return "(" + THREE.Math.radToDeg(e.x).toPrecision(n) + ", " + THREE.Math.radToDeg(e.y).toPrecision(n) + ", " + THREE.Math.radToDeg(e.z).toPrecision(n) + ' "' + e.order + '")'
                },
                time: function(e) {
                    r.level >= r.levels.debug && (c[e] = Date.now())
                },
                timeEnd: function(e) {
                    if (r.level >= r.levels.debug) {
                        var t = c[e];
                        if (!t)
                            return;
                        var n = (Date.now() - t) / 1e3;
                        this.debug(e, n + "s");
                    }
                }
            }
        }
        var i = window.Raven;
        r.timestamp = function() {
            return (Date.now() - window.navigationStart) / 1e3 + "s"
        }
        ,
        r.levels = {
            debug: 3,
            info: 2,
            warn: 1,
            error: 0
        },
        r.level = r.levels.info,
        t.exports = r
    }
    , {}],
    16: [function(e, t, n) {
        "use strict";
        function r(e, t, n) {
            return a.map(function(r, o) {
                return e.get("pan/" + n + "/" + t + "_skybox" + i(r) + ".jpg")
            }
            .bind(this))
        }
        function i(e) {
            return s[e]
        }
        var o = e("../enum/GLCubeFaces")
          , a = [0, 1, 2, 3, 4, 5]
          , s = {
            0: o.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
            1: o.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
            2: o.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
            3: o.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
            4: o.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
            5: o.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
        };
        t.exports = {
            mapFaceToCubemapFace: i,
            getCubemapUrls: r
        }
    }
    , {
        "../enum/GLCubeFaces": 3
    }],
    17: [function(e, t, n) {
        (function(n) {
            "use strict";
            var r = e("./browser")
              , i = e("../constants")
              , o = e("url")
              , a = e("./logger")
              , s = new a(n)
              , u = {
                getAuthorizationHeader: function() {
                    var e = r.valueFromHash("auth");
                    if (e)
                        return e.replace(",", " ");
                    var t = r.valueFromCookie("token");
                    return t ? "Token " + t : null
                },
                parseSidUrl: function(e) {
                    var t, n;
                    if (e = e || "",
                    e.match(/^https?/)) {
                        var r = o.parse(e);
                        t = r.protocol + "//" + r.host,
                        n = e
                    } else
                       // t = window.location.protocol + "//" + window.location.host,
				        t = ""
                        //n = t + "/api/player/models/" + e;
						n = t + "/data/";
                    return {
                        urlBase: t,
                        urlModel: n,
                        urlFiles: n + (n.match(/\/$/) ? "files" : "/files"),
                        urlThumb: n + (n.match(/\/$/) ? "thumb" : "/thumb")
                    }
                },
                getModelIDFromQueryString: function() {
                    return r.valueFromHash("model") || r.valueFromHash("m")
                },
                normalizeModeldata: function(e, t) {
                    e = JSON.parse(JSON.stringify(e));
                    var n = null;
                    if (e.images.forEach(function(r) {
                        if (r.metadata && "string" == typeof r.metadata)
                            try {
                                r.metadata = JSON.parse(r.metadata)
                            } catch (e) {
                                s.warn("Unable to parse image metadata"),
                                r.metadata = null
                            }
                        else
                            "object" == typeof r.metadata && s.debug("image.metadata already a JSON object");
                        r.metadata && (r.metadata.camera_quaternion && (r.metadata.camera_quaternion = t.convertWorkshopQuaternion(r.metadata.camera_quaternion)),
                        r.metadata.camera_position && (r.metadata.camera_position = t.convertWorkshopVector(r.metadata.camera_position)),
                        !n && e.icon && e.icon === r.sid && (n = r.metadata))
                    }),
                    n && n.camera_quaternion && n.camera_position && n.scan_position && n.scan_quaternion) {
                        var r = {};
                        r.pano = {
                            quaternion: t.convertWorkshopPanoramaQuaternion(n.scan_quaternion),
                            position: t.convertWorkshopVector(n.scan_position),
                            uuid: n.scan_id
                        },
                        r.camera = {
                            quaternion: n.camera_quaternion,
                            position: n.camera_position
                        },
                        e.startPano = r
                    }
                    return e
                },
                visionVersionToInt: function() {
                    var e = new RegExp(["(?:[0-9.]+\\.){1,4}", "([0-9]+)", "[^\\.]*$"].join(""));
                    return function(t) {
                        if (!t)
                            throw new Error("Vision version is required");
                        var n = e.exec(t);
                        if (null === n)
                            throw new Error("String is not a vision version: " + t);
                        return parseInt(n[1])
                    }
                }(),
                modelDataPromisesTiles: function(e) {
                    if (e.vision_version)
                        try {
                            return u.visionVersionToInt(e.vision_version) >= u.visionVersionToInt(i.visionTilingStartVersion)
                        } catch (t) {
                            s.warn("Invalid vision version: " + e.vision_version)
                        }
                    var t = e.created ? new Date(e.created) : null;
                    return t && t >= i.visionTilingStartDate
                }
            };
            t.exports = u
        }
        ).call(this, "/js/util/showcase.js")
    }
    , {
        "../constants": 2,
        "./browser": 13,
        "./logger": 15,
        url: 22
    }],
    18: [function(e, t, n) {
        (function(e) {
            !function(r) {
                function i(e) {
                    throw new RangeError(M[e])
                }
                function o(e, t) {
                    for (var n = e.length, r = []; n--; )
                        r[n] = t(e[n]);
                    return r
                }
                function a(e, t) {
                    var n = e.split("@")
                      , r = "";
                    n.length > 1 && (r = n[0] + "@",
                    e = n[1]),
                    e = e.replace(C, ".");
                    var i = e.split(".")
                      , a = o(i, t).join(".");
                    return r + a
                }
                function s(e) {
                    for (var t, n, r = [], i = 0, o = e.length; i < o; )
                        t = e.charCodeAt(i++),
                        t >= 55296 && t <= 56319 && i < o ? (n = e.charCodeAt(i++),
                        56320 == (64512 & n) ? r.push(((1023 & t) << 10) + (1023 & n) + 65536) : (r.push(t),
                        i--)) : r.push(t);
                    return r
                }
                function u(e) {
                    return o(e, function(e) {
                        var t = "";
                        return e > 65535 && (e -= 65536,
                        t += S(e >>> 10 & 1023 | 55296),
                        e = 56320 | 1023 & e),
                        t += S(e)
                    }).join("")
                }
                function c(e) {
                    return e - 48 < 10 ? e - 22 : e - 65 < 26 ? e - 65 : e - 97 < 26 ? e - 97 : b
                }
                function l(e, t) {
                    return e + 22 + 75 * (e < 26) - ((0 != t) << 5)
                }
                function h(e, t, n) {
                    var r = 0;
                    for (e = n ? U(e / R) : e >> 1,
                    e += U(e / t); e > L * x >> 1; r += b)
                        e = U(e / L);
                    return U(r + (L + 1) * e / (e + A))
                }
                function f(e) {
                    var t, n, r, o, a, s, l, f, p, d, m = [], g = e.length, v = 0, w = O, _ = F;
                    for (n = e.lastIndexOf(I),
                    n < 0 && (n = 0),
                    r = 0; r < n; ++r)
                        e.charCodeAt(r) >= 128 && i("not-basic"),
                        m.push(e.charCodeAt(r));
                    for (o = n > 0 ? n + 1 : 0; o < g; ) {
                        for (a = v,
                        s = 1,
                        l = b; o >= g && i("invalid-input"),
                        f = c(e.charCodeAt(o++)),
                        (f >= b || f > U((y - v) / s)) && i("overflow"),
                        v += f * s,
                        p = l <= _ ? T : l >= _ + x ? x : l - _,
                        !(f < p); l += b)
                            d = b - p,
                            s > U(y / d) && i("overflow"),
                            s *= d;
                        t = m.length + 1,
                        _ = h(v - a, t, 0 == a),
                        U(v / t) > y - w && i("overflow"),
                        w += U(v / t),
                        v %= t,
                        m.splice(v++, 0, w)
                    }
                    return u(m)
                }
                function p(e) {
                    var t, n, r, o, a, u, c, f, p, d, m, g, v, w, _, E = [];
                    for (e = s(e),
                    g = e.length,
                    t = O,
                    n = 0,
                    a = F,
                    u = 0; u < g; ++u)
                        m = e[u],
                        m < 128 && E.push(S(m));
                    for (r = o = E.length,
                    o && E.push(I); r < g; ) {
                        for (c = y,
                        u = 0; u < g; ++u)
                            m = e[u],
                            m >= t && m < c && (c = m);
                        for (v = r + 1,
                        c - t > U((y - n) / v) && i("overflow"),
                        n += (c - t) * v,
                        t = c,
                        u = 0; u < g; ++u)
                            if (m = e[u],
                            m < t && ++n > y && i("overflow"),
                            m == t) {
                                for (f = n,
                                p = b; d = p <= a ? T : p >= a + x ? x : p - a,
                                !(f < d); p += b)
                                    _ = f - d,
                                    w = b - d,
                                    E.push(S(l(d + _ % w, 0))),
                                    f = U(_ / w);
                                E.push(S(l(f, 0))),
                                a = h(n, v, r == o),
                                n = 0,
                                ++r
                            }
                        ++n,
                        ++t
                    }
                    return E.join("")
                }
                function d(e) {
                    return a(e, function(e) {
                        return P.test(e) ? f(e.slice(4).toLowerCase()) : e
                    })
                }
                function m(e) {
                    return a(e, function(e) {
                        return j.test(e) ? "xn--" + p(e) : e
                    })
                }
                var g = "object" == typeof n && n && !n.nodeType && n
                  , v = "object" == typeof t && t && !t.nodeType && t
                  , w = "object" == typeof e && e;
                w.global !== w && w.window !== w && w.self !== w || (r = w);
                var _, E, y = 2147483647, b = 36, T = 1, x = 26, A = 38, R = 700, F = 72, O = 128, I = "-", P = /^xn--/, j = /[^\x20-\x7E]/, C = /[\x2E\u3002\uFF0E\uFF61]/g, M = {
                    overflow: "Overflow: input needs wider integers to process",
                    "not-basic": "Illegal input >= 0x80 (not a basic code point)",
                    "invalid-input": "Invalid input"
                }, L = b - T, U = Math.floor, S = String.fromCharCode;
                if (_ = {
                    version: "1.4.1",
                    ucs2: {
                        decode: s,
                        encode: u
                    },
                    decode: f,
                    encode: p,
                    toASCII: m,
                    toUnicode: d
                },
                "function" == typeof define && "object" == typeof define.amd && define.amd)
                    define("punycode", function() {
                        return _
                    });
                else if (g && v)
                    if (t.exports == g)
                        v.exports = _;
                    else
                        for (E in _)
                            _.hasOwnProperty(E) && (g[E] = _[E]);
                else
                    r.punycode = _
            }(this)
        }
        ).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
    }
    , {}],
    19: [function(e, t, n) {
        "use strict";
        function r(e, t) {
            return Object.prototype.hasOwnProperty.call(e, t)
        }
        t.exports = function(e, t, n, o) {
            t = t || "&",
            n = n || "=";
            var a = {};
            if ("string" != typeof e || 0 === e.length)
                return a;
            var s = /\+/g;
            e = e.split(t);
            var u = 1e3;
            o && "number" == typeof o.maxKeys && (u = o.maxKeys);
            var c = e.length;
            u > 0 && c > u && (c = u);
            for (var l = 0; l < c; ++l) {
                var h, f, p, d, m = e[l].replace(s, "%20"), g = m.indexOf(n);
                g >= 0 ? (h = m.substr(0, g),
                f = m.substr(g + 1)) : (h = m,
                f = ""),
                p = decodeURIComponent(h),
                d = decodeURIComponent(f),
                r(a, p) ? i(a[p]) ? a[p].push(d) : a[p] = [a[p], d] : a[p] = d
            }
            return a
        }
        ;
        var i = Array.isArray || function(e) {
            return "[object Array]" === Object.prototype.toString.call(e)
        }
    }
    , {}],
    20: [function(e, t, n) {
        "use strict";
        function r(e, t) {
            if (e.map)
                return e.map(t);
            for (var n = [], r = 0; r < e.length; r++)
                n.push(t(e[r], r));
            return n
        }
        var i = function(e) {
            switch (typeof e) {
            case "string":
                return e;
            case "boolean":
                return e ? "true" : "false";
            case "number":
                return isFinite(e) ? e : "";
            default:
                return ""
            }
        };
        t.exports = function(e, t, n, s) {
            return t = t || "&",
            n = n || "=",
            null === e && (e = void 0),
            "object" == typeof e ? r(a(e), function(a) {
                var s = encodeURIComponent(i(a)) + n;
                return o(e[a]) ? r(e[a], function(e) {
                    return s + encodeURIComponent(i(e))
                }).join(t) : s + encodeURIComponent(i(e[a]))
            }).join(t) : s ? encodeURIComponent(i(s)) + n + encodeURIComponent(i(e)) : ""
        }
        ;
        var o = Array.isArray || function(e) {
            return "[object Array]" === Object.prototype.toString.call(e)
        }
          , a = Object.keys || function(e) {
            var t = [];
            for (var n in e)
                Object.prototype.hasOwnProperty.call(e, n) && t.push(n);
            return t
        }
    }
    , {}],
    21: [function(e, t, n) {
        "use strict";
        n.decode = n.parse = e("./decode"),
        n.encode = n.stringify = e("./encode")
    }
    , {
        "./decode": 19,
        "./encode": 20
    }],
    22: [function(e, t, n) {
        "use strict";
        function r() {
            this.protocol = null,
            this.slashes = null,
            this.auth = null,
            this.host = null,
            this.port = null,
            this.hostname = null,
            this.hash = null,
            this.search = null,
            this.query = null,
            this.pathname = null,
            this.path = null,
            this.href = null
        }
        function i(e, t, n) {
            if (e && c.isObject(e) && e instanceof r)
                return e;
            var i = new r;
            return i.parse(e, t, n),
            i
        }
        function o(e) {
            return c.isString(e) && (e = i(e)),
            e instanceof r ? e.format() : r.prototype.format.call(e)
        }
        function a(e, t) {
            return i(e, !1, !0).resolve(t)
        }
        function s(e, t) {
            return e ? i(e, !1, !0).resolveObject(t) : t
        }
        var u = e("punycode")
          , c = e("./util");
        n.parse = i,
        n.resolve = a,
        n.resolveObject = s,
        n.format = o,
        n.Url = r;
        var l = /^([a-z0-9.+-]+:)/i
          , h = /:[0-9]*$/
          , f = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/
          , p = ["<", ">", '"', "`", " ", "\r", "\n", "\t"]
          , d = ["{", "}", "|", "\\", "^", "`"].concat(p)
          , m = ["'"].concat(d)
          , g = ["%", "/", "?", ";", "#"].concat(m)
          , v = ["/", "?", "#"]
          , w = 255
          , _ = /^[+a-z0-9A-Z_-]{0,63}$/
          , E = /^([+a-z0-9A-Z_-]{0,63})(.*)$/
          , y = {
            javascript: !0,
            "javascript:": !0
        }
          , b = {
            javascript: !0,
            "javascript:": !0
        }
          , T = {
            http: !0,
            https: !0,
            ftp: !0,
            gopher: !0,
            file: !0,
            "http:": !0,
            "https:": !0,
            "ftp:": !0,
            "gopher:": !0,
            "file:": !0
        }
          , x = e("querystring");
        r.prototype.parse = function(e, t, n) {
            if (!c.isString(e))
                throw new TypeError("Parameter 'url' must be a string, not " + typeof e);
            var r = e.indexOf("?")
              , i = r !== -1 && r < e.indexOf("#") ? "?" : "#"
              , o = e.split(i)
              , a = /\\/g;
            o[0] = o[0].replace(a, "/"),
            e = o.join(i);
            var s = e;
            if (s = s.trim(),
            !n && 1 === e.split("#").length) {
                var h = f.exec(s);
                if (h)
                    return this.path = s,
                    this.href = s,
                    this.pathname = h[1],
                    h[2] ? (this.search = h[2],
                    t ? this.query = x.parse(this.search.substr(1)) : this.query = this.search.substr(1)) : t && (this.search = "",
                    this.query = {}),
                    this
            }
            var p = l.exec(s);
            if (p) {
                p = p[0];
                var d = p.toLowerCase();
                this.protocol = d,
                s = s.substr(p.length)
            }
            if (n || p || s.match(/^\/\/[^@\/]+@[^@\/]+/)) {
                var A = "//" === s.substr(0, 2);
                !A || p && b[p] || (s = s.substr(2),
                this.slashes = !0)
            }
            if (!b[p] && (A || p && !T[p])) {
                for (var R = -1, F = 0; F < v.length; F++) {
                    var O = s.indexOf(v[F]);
                    O !== -1 && (R === -1 || O < R) && (R = O)
                }
                var I, P;
                P = R === -1 ? s.lastIndexOf("@") : s.lastIndexOf("@", R),
                P !== -1 && (I = s.slice(0, P),
                s = s.slice(P + 1),
                this.auth = decodeURIComponent(I)),
                R = -1;
                for (var F = 0; F < g.length; F++) {
                    var O = s.indexOf(g[F]);
                    O !== -1 && (R === -1 || O < R) && (R = O)
                }
                R === -1 && (R = s.length),
                this.host = s.slice(0, R),
                s = s.slice(R),
                this.parseHost(),
                this.hostname = this.hostname || "";
                var j = "[" === this.hostname[0] && "]" === this.hostname[this.hostname.length - 1];
                if (!j)
                    for (var C = this.hostname.split(/\./), F = 0, M = C.length; F < M; F++) {
                        var L = C[F];
                        if (L && !L.match(_)) {
                            for (var U = "", S = 0, k = L.length; S < k; S++)
                                U += L.charCodeAt(S) > 127 ? "x" : L[S];
                            if (!U.match(_)) {
                                var z = C.slice(0, F)
                                  , V = C.slice(F + 1)
                                  , D = L.match(E);
                                D && (z.push(D[1]),
                                V.unshift(D[2])),
                                V.length && (s = "/" + V.join(".") + s),
                                this.hostname = z.join(".");
                                break
                            }
                        }
                    }
                this.hostname.length > w ? this.hostname = "" : this.hostname = this.hostname.toLowerCase(),
                j || (this.hostname = u.toASCII(this.hostname));
                var q = this.port ? ":" + this.port : ""
                  , H = this.hostname || "";
                this.host = H + q,
                this.href += this.host,
                j && (this.hostname = this.hostname.substr(1, this.hostname.length - 2),
                "/" !== s[0] && (s = "/" + s))
            }
            if (!y[d])
                for (var F = 0, M = m.length; F < M; F++) {
                    var G = m[F];
                    if (s.indexOf(G) !== -1) {
                        var N = encodeURIComponent(G);
                        N === G && (N = escape(G)),
                        s = s.split(G).join(N)
                    }
                }
            var X = s.indexOf("#");
            X !== -1 && (this.hash = s.substr(X),
            s = s.slice(0, X));
            var B = s.indexOf("?");
            if (B !== -1 ? (this.search = s.substr(B),
            this.query = s.substr(B + 1),
            t && (this.query = x.parse(this.query)),
            s = s.slice(0, B)) : t && (this.search = "",
            this.query = {}),
            s && (this.pathname = s),
            T[d] && this.hostname && !this.pathname && (this.pathname = "/"),
            this.pathname || this.search) {
                var q = this.pathname || ""
                  , Q = this.search || "";
                this.path = q + Q
            }
            return this.href = this.format(),
            this
        }
        ,
        r.prototype.format = function() {
            var e = this.auth || "";
            e && (e = encodeURIComponent(e),
            e = e.replace(/%3A/i, ":"),
            e += "@");
            var t = this.protocol || ""
              , n = this.pathname || ""
              , r = this.hash || ""
              , i = !1
              , o = "";
            this.host ? i = e + this.host : this.hostname && (i = e + (this.hostname.indexOf(":") === -1 ? this.hostname : "[" + this.hostname + "]"),
            this.port && (i += ":" + this.port)),
            this.query && c.isObject(this.query) && Object.keys(this.query).length && (o = x.stringify(this.query));
            var a = this.search || o && "?" + o || "";
            return t && ":" !== t.substr(-1) && (t += ":"),
            this.slashes || (!t || T[t]) && i !== !1 ? (i = "//" + (i || ""),
            n && "/" !== n.charAt(0) && (n = "/" + n)) : i || (i = ""),
            r && "#" !== r.charAt(0) && (r = "#" + r),
            a && "?" !== a.charAt(0) && (a = "?" + a),
            n = n.replace(/[?#]/g, function(e) {
                return encodeURIComponent(e)
            }),
            a = a.replace("#", "%23"),
            t + i + n + a + r
        }
        ,
        r.prototype.resolve = function(e) {
            return this.resolveObject(i(e, !1, !0)).format()
        }
        ,
        r.prototype.resolveObject = function(e) {
            if (c.isString(e)) {
                var t = new r;
                t.parse(e, !1, !0),
                e = t
            }
            for (var n = new r, i = Object.keys(this), o = 0; o < i.length; o++) {
                var a = i[o];
                n[a] = this[a]
            }
            if (n.hash = e.hash,
            "" === e.href)
                return n.href = n.format(),
                n;
            if (e.slashes && !e.protocol) {
                for (var s = Object.keys(e), u = 0; u < s.length; u++) {
                    var l = s[u];
                    "protocol" !== l && (n[l] = e[l])
                }
                return T[n.protocol] && n.hostname && !n.pathname && (n.path = n.pathname = "/"),
                n.href = n.format(),
                n
            }
            if (e.protocol && e.protocol !== n.protocol) {
                if (!T[e.protocol]) {
                    for (var h = Object.keys(e), f = 0; f < h.length; f++) {
                        var p = h[f];
                        n[p] = e[p]
                    }
                    return n.href = n.format(),
                    n
                }
                if (n.protocol = e.protocol,
                e.host || b[e.protocol])
                    n.pathname = e.pathname;
                else {
                    for (var d = (e.pathname || "").split("/"); d.length && !(e.host = d.shift()); )
                        ;
                    e.host || (e.host = ""),
                    e.hostname || (e.hostname = ""),
                    "" !== d[0] && d.unshift(""),
                    d.length < 2 && d.unshift(""),
                    n.pathname = d.join("/")
                }
                if (n.search = e.search,
                n.query = e.query,
                n.host = e.host || "",
                n.auth = e.auth,
                n.hostname = e.hostname || e.host,
                n.port = e.port,
                n.pathname || n.search) {
                    var m = n.pathname || ""
                      , g = n.search || "";
                    n.path = m + g
                }
                return n.slashes = n.slashes || e.slashes,
                n.href = n.format(),
                n
            }
            var v = n.pathname && "/" === n.pathname.charAt(0)
              , w = e.host || e.pathname && "/" === e.pathname.charAt(0)
              , _ = w || v || n.host && e.pathname
              , E = _
              , y = n.pathname && n.pathname.split("/") || []
              , d = e.pathname && e.pathname.split("/") || []
              , x = n.protocol && !T[n.protocol];
            if (x && (n.hostname = "",
            n.port = null,
            n.host && ("" === y[0] ? y[0] = n.host : y.unshift(n.host)),
            n.host = "",
            e.protocol && (e.hostname = null,
            e.port = null,
            e.host && ("" === d[0] ? d[0] = e.host : d.unshift(e.host)),
            e.host = null),
            _ = _ && ("" === d[0] || "" === y[0])),
            w)
                n.host = e.host || "" === e.host ? e.host : n.host,
                n.hostname = e.hostname || "" === e.hostname ? e.hostname : n.hostname,
                n.search = e.search,
                n.query = e.query,
                y = d;
            else if (d.length)
                y || (y = []),
                y.pop(),
                y = y.concat(d),
                n.search = e.search,
                n.query = e.query;
            else if (!c.isNullOrUndefined(e.search)) {
                if (x) {
                    n.hostname = n.host = y.shift();
                    var A = !!(n.host && n.host.indexOf("@") > 0) && n.host.split("@");
                    A && (n.auth = A.shift(),
                    n.host = n.hostname = A.shift())
                }
                return n.search = e.search,
                n.query = e.query,
                c.isNull(n.pathname) && c.isNull(n.search) || (n.path = (n.pathname ? n.pathname : "") + (n.search ? n.search : "")),
                n.href = n.format(),
                n
            }
            if (!y.length)
                return n.pathname = null,
                n.search ? n.path = "/" + n.search : n.path = null,
                n.href = n.format(),
                n;
            for (var R = y.slice(-1)[0], F = (n.host || e.host || y.length > 1) && ("." === R || ".." === R) || "" === R, O = 0, I = y.length; I >= 0; I--)
                R = y[I],
                "." === R ? y.splice(I, 1) : ".." === R ? (y.splice(I, 1),
                O++) : O && (y.splice(I, 1),
                O--);
            if (!_ && !E)
                for (; O--; O)
                    y.unshift("..");
            !_ || "" === y[0] || y[0] && "/" === y[0].charAt(0) || y.unshift(""),
            F && "/" !== y.join("/").substr(-1) && y.push("");
            var P = "" === y[0] || y[0] && "/" === y[0].charAt(0);
            if (x) {
                n.hostname = n.host = P ? "" : y.length ? y.shift() : "";
                var A = !!(n.host && n.host.indexOf("@") > 0) && n.host.split("@");
                A && (n.auth = A.shift(),
                n.host = n.hostname = A.shift())
            }
            return _ = _ || n.host && y.length,
            _ && !P && y.unshift(""),
            y.length ? n.pathname = y.join("/") : (n.pathname = null,
            n.path = null),
            c.isNull(n.pathname) && c.isNull(n.search) || (n.path = (n.pathname ? n.pathname : "") + (n.search ? n.search : "")),
            n.auth = e.auth || n.auth,
            n.slashes = n.slashes || e.slashes,
            n.href = n.format(),
            n
        }
        ,
        r.prototype.parseHost = function() {
            var e = this.host
              , t = h.exec(e);
            t && (t = t[0],
            ":" !== t && (this.port = t.substr(1)),
            e = e.substr(0, e.length - t.length)),
            e && (this.hostname = e)
        }
    }
    , {
        "./util": 23,
        punycode: 18,
        querystring: 21
    }],
    23: [function(e, t, n) {
        "use strict";
        t.exports = {
            isString: function(e) {
                return "string" == typeof e
            },
            isObject: function(e) {
                return "object" == typeof e && null !== e
            },
            isNull: function(e) {
                return null === e
            },
            isNullOrUndefined: function(e) {
                return null == e
            }
        }
    }
    , {}]
}, {}, [7]);
